Skip to content

Commit 40009f9

Browse files
committed
Add Truffle intrinsics for unsigned integer from/to float conversion methods.
1 parent 31d6a70 commit 40009f9

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/substitutions/TruffleInvocationPlugins.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import jdk.graal.compiler.core.common.Stride;
3737
import jdk.graal.compiler.core.common.StrideUtil;
3838
import jdk.graal.compiler.core.common.calc.CanonicalCondition;
39+
import jdk.graal.compiler.core.common.calc.FloatConvert;
3940
import jdk.graal.compiler.core.common.spi.ConstantFieldProvider;
4041
import jdk.graal.compiler.core.common.type.Stamp;
4142
import jdk.graal.compiler.core.common.type.StampFactory;
@@ -53,11 +54,13 @@
5354
import jdk.graal.compiler.nodes.ValueNode;
5455
import jdk.graal.compiler.nodes.calc.AddNode;
5556
import jdk.graal.compiler.nodes.calc.CompareNode;
57+
import jdk.graal.compiler.nodes.calc.FloatConvertNode;
5658
import jdk.graal.compiler.nodes.calc.LeftShiftNode;
5759
import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderContext;
5860
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin;
5961
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin.InlineOnlyInvocationPlugin;
6062
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin.OptionalInlineOnlyInvocationPlugin;
63+
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin.OptionalInvocationPlugin;
6164
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver;
6265
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugins;
6366
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugins.OptionalLazySymbol;
@@ -95,6 +98,7 @@ public static void register(Architecture architecture, InvocationPlugins plugins
9598
if (architecture instanceof AMD64 || architecture instanceof AArch64) {
9699
registerTStringPlugins(plugins, replacements, architecture);
97100
registerArrayUtilsPlugins(plugins, replacements);
101+
registerExactMathPlugins(plugins, replacements);
98102
}
99103
registerFramePlugins(plugins, replacements);
100104
registerBytecodePlugins(plugins, replacements);
@@ -667,4 +671,44 @@ public static boolean applyIndexOf(GraphBuilderContext b, ResolvedJavaMethod tar
667671
}
668672
return true;
669673
}
674+
675+
public static void registerExactMathPlugins(InvocationPlugins plugins, Replacements replacements) {
676+
plugins.registerIntrinsificationPredicate(t -> t.getName().equals("Lcom/oracle/truffle/api/ExactMath;"));
677+
var r = new InvocationPlugins.Registration(plugins, "com.oracle.truffle.api.ExactMath", replacements);
678+
var lowerer = replacements.getProviders().getLowerer();
679+
680+
for (JavaKind floatKind : new JavaKind[]{JavaKind.Float, JavaKind.Double}) {
681+
for (JavaKind integerKind : new JavaKind[]{JavaKind.Int, JavaKind.Long}) {
682+
r.registerConditional(lowerer.supportsUnsignedFloatConvert(), new OptionalInvocationPlugin(
683+
integerKind == JavaKind.Long ? "truncateToUnsignedLong" : "truncateToUnsignedInt",
684+
floatKind.toJavaClass()) {
685+
@Override
686+
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode x) {
687+
FloatConvert op = floatKind == JavaKind.Double
688+
? (integerKind == JavaKind.Long
689+
? FloatConvert.D2UL
690+
: FloatConvert.D2UI)
691+
: (integerKind == JavaKind.Long
692+
? FloatConvert.F2UL
693+
: FloatConvert.F2UI);
694+
b.addPush(integerKind, FloatConvertNode.create(op, x, NodeView.DEFAULT));
695+
return true;
696+
}
697+
});
698+
}
699+
700+
r.registerConditional(lowerer.supportsUnsignedFloatConvert(), new OptionalInvocationPlugin(
701+
floatKind == JavaKind.Double ? "unsignedToDouble" : "unsignedToFloat",
702+
long.class) {
703+
@Override
704+
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode x) {
705+
FloatConvert op = floatKind == JavaKind.Double
706+
? FloatConvert.UL2D
707+
: FloatConvert.UL2F;
708+
b.addPush(floatKind, FloatConvertNode.create(op, x, NodeView.DEFAULT));
709+
return true;
710+
}
711+
});
712+
}
713+
}
670714
}

0 commit comments

Comments
 (0)