forked from smarr/TruffleSOM
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This supports the basic multiplication of a variable with itself for local and non-local variables, i.e.: - `local * local` - `| l | [ l * l ]` It also supports multiplication and assigning result to local/non-local variables: - `b := l * l` Signed-off-by: Stefan Marr <git@stefan-marr.de>
- Loading branch information
Showing
10 changed files
with
499 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
84 changes: 84 additions & 0 deletions
84
src/trufflesom/src/trufflesom/interpreter/supernodes/LocalVariableReadSquareWriteNode.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
package trufflesom.interpreter.supernodes; | ||
|
||
import com.oracle.truffle.api.dsl.Specialization; | ||
import com.oracle.truffle.api.frame.FrameDescriptor; | ||
import com.oracle.truffle.api.frame.FrameSlotKind; | ||
import com.oracle.truffle.api.frame.FrameSlotTypeException; | ||
import com.oracle.truffle.api.frame.VirtualFrame; | ||
import trufflesom.bdt.inlining.ScopeAdaptationVisitor; | ||
import trufflesom.bdt.inlining.ScopeAdaptationVisitor.ScopeElement; | ||
import trufflesom.compiler.Variable.Local; | ||
import trufflesom.interpreter.nodes.LocalVariableNode; | ||
|
||
|
||
public abstract class LocalVariableReadSquareWriteNode extends LocalVariableNode { | ||
|
||
protected final Local readLocal; | ||
protected final int readIndex; | ||
|
||
public LocalVariableReadSquareWriteNode(final Local writeLocal, final Local readLocal) { | ||
super(writeLocal); | ||
this.readLocal = readLocal; | ||
this.readIndex = readLocal.getIndex(); | ||
} | ||
|
||
@Specialization(guards = {"isLongKind(frame)", "frame.isLong(readIndex)"}, | ||
rewriteOn = {FrameSlotTypeException.class}) | ||
public final long writeLong(final VirtualFrame frame) throws FrameSlotTypeException { | ||
long current = frame.getLong(readIndex); | ||
long result = Math.multiplyExact(current, current); | ||
frame.setLong(slotIndex, result); | ||
return result; | ||
} | ||
|
||
@Specialization(guards = {"isDoubleKind(frame)", "frame.isDouble(readIndex)"}, | ||
rewriteOn = {FrameSlotTypeException.class}) | ||
public final double writeDouble(final VirtualFrame frame) throws FrameSlotTypeException { | ||
double current = frame.getDouble(readIndex); | ||
double result = current * current; | ||
frame.setDouble(slotIndex, result); | ||
return result; | ||
} | ||
|
||
// uses frame to make sure guard is not converted to assertion | ||
protected final boolean isLongKind(final VirtualFrame frame) { | ||
FrameDescriptor descriptor = local.getFrameDescriptor(); | ||
if (descriptor.getSlotKind(slotIndex) == FrameSlotKind.Long) { | ||
return true; | ||
} | ||
if (descriptor.getSlotKind(slotIndex) == FrameSlotKind.Illegal) { | ||
descriptor.setSlotKind(slotIndex, FrameSlotKind.Long); | ||
return true; | ||
} | ||
return false; | ||
} | ||
|
||
// uses frame to make sure guard is not converted to assertion | ||
protected final boolean isDoubleKind(final VirtualFrame frame) { | ||
FrameDescriptor descriptor = local.getFrameDescriptor(); | ||
if (descriptor.getSlotKind(slotIndex) == FrameSlotKind.Double) { | ||
return true; | ||
} | ||
if (descriptor.getSlotKind(slotIndex) == FrameSlotKind.Illegal) { | ||
descriptor.setSlotKind(slotIndex, FrameSlotKind.Double); | ||
return true; | ||
} | ||
return false; | ||
} | ||
|
||
@Override | ||
public void replaceAfterScopeChange(final ScopeAdaptationVisitor inliner) { | ||
ScopeElement seWrite = inliner.getAdaptedVar(local); | ||
ScopeElement seRead = inliner.getAdaptedVar(readLocal); | ||
|
||
assert seWrite.contextLevel == seRead.contextLevel; | ||
|
||
if (seWrite.var != local || seWrite.contextLevel < 0) { | ||
assert seRead.var != readLocal || seRead.contextLevel < 0; | ||
replace(seWrite.var.getReadSquareWriteNode(seWrite.contextLevel, sourceCoord, | ||
(Local) seRead.var, seRead.contextLevel)); | ||
} else { | ||
assert 0 == seWrite.contextLevel; | ||
} | ||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
src/trufflesom/src/trufflesom/interpreter/supernodes/LocalVariableSquareNode.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package trufflesom.interpreter.supernodes; | ||
|
||
import com.oracle.truffle.api.dsl.Specialization; | ||
import com.oracle.truffle.api.frame.FrameSlotTypeException; | ||
import com.oracle.truffle.api.frame.VirtualFrame; | ||
import trufflesom.bdt.inlining.ScopeAdaptationVisitor; | ||
import trufflesom.bdt.inlining.ScopeAdaptationVisitor.ScopeElement; | ||
import trufflesom.compiler.Variable.Local; | ||
import trufflesom.interpreter.nodes.LocalVariableNode; | ||
|
||
|
||
public abstract class LocalVariableSquareNode extends LocalVariableNode { | ||
|
||
public LocalVariableSquareNode(final Local variable) { | ||
super(variable); | ||
} | ||
|
||
@Specialization(guards = {"frame.isLong(slotIndex)"}, | ||
rewriteOn = {FrameSlotTypeException.class}) | ||
public final long doLong(final VirtualFrame frame) throws FrameSlotTypeException { | ||
long value = frame.getLong(slotIndex); | ||
return Math.multiplyExact(value, value); | ||
} | ||
|
||
@Specialization(guards = {"frame.isDouble(slotIndex)"}, | ||
rewriteOn = {FrameSlotTypeException.class}) | ||
public final double doDouble(final VirtualFrame frame) throws FrameSlotTypeException { | ||
double value = frame.getDouble(slotIndex); | ||
return value * value; | ||
} | ||
|
||
@Override | ||
public void replaceAfterScopeChange(final ScopeAdaptationVisitor inliner) { | ||
ScopeElement se = inliner.getAdaptedVar(local); | ||
if (se.var != local || se.contextLevel < 0) { | ||
replace(se.var.getSquareNode(se.contextLevel, sourceCoord)); | ||
} else { | ||
assert 0 == se.contextLevel; | ||
} | ||
} | ||
} |
Oops, something went wrong.