1 package org.simantics.scl.compiler.elaboration.java;
4 import org.simantics.scl.compiler.constants.DoubleConstant;
5 import org.simantics.scl.compiler.constants.FloatConstant;
6 import org.simantics.scl.compiler.constants.FunctionValue;
7 import org.simantics.scl.compiler.constants.IntegerConstant;
8 import org.simantics.scl.compiler.constants.JavaComparisonOperation;
9 import org.simantics.scl.compiler.constants.JavaComparisonToZeroOperation;
10 import org.simantics.scl.compiler.constants.JavaConversionOperation;
11 import org.simantics.scl.compiler.constants.JavaMathOperation;
12 import org.simantics.scl.compiler.constants.JavaMethod;
13 import org.simantics.scl.compiler.constants.LongConstant;
14 import org.simantics.scl.compiler.constants.ShortConstant;
15 import org.simantics.scl.compiler.constants.singletons.UnsafeCoerce;
16 import org.simantics.scl.compiler.elaboration.expressions.EApplyType;
17 import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
18 import org.simantics.scl.compiler.elaboration.expressions.Expression;
19 import org.simantics.scl.compiler.module.ConcreteModule;
20 import org.simantics.scl.compiler.types.TVar;
21 import org.simantics.scl.compiler.types.Types;
22 import org.simantics.scl.compiler.types.kinds.Kinds;
24 public class JavaModule extends ConcreteModule {
26 public static final JavaModule INSTANCE = new JavaModule();
28 public static final String MODULE_NAME = "JavaBuiltin";
30 private JavaModule() {
32 addValue("dconst_0", new DoubleConstant(0.0));
33 addValue("dconst_1", new DoubleConstant(1.0));
34 addValue("fconst_0", new FloatConstant(0.0f));
35 addValue("fconst_1", new FloatConstant(1.0f));
36 addValue("iconst_0", IntegerConstant.ZERO);
37 addValue("iconst_1", IntegerConstant.ONE);
38 addValue("sconst_0", ShortConstant.ZERO);
39 addValue("sconst_1", ShortConstant.ONE);
40 addValue("lconst_0", new LongConstant(0L));
41 addValue("lconst_1", new LongConstant(1L));
43 // Mathematical operations
44 for(JavaMathOperation operation : JavaMathOperation.OPCODES)
45 addValue(operation.getMnemonic(), operation);
46 addValue("cadd", JavaMathOperation.CADD);
47 addValue("csub", JavaMathOperation.CSUB);
49 addValue("sadd", JavaMathOperation.SADD);
50 addValue("ssub", JavaMathOperation.SSUB);
51 addValue("smul", JavaMathOperation.SMUL);
52 addValue("sdiv", JavaMathOperation.SDIV);
53 addValue("srem", JavaMathOperation.SREM);
54 addValue("sneg", JavaMathOperation.SNEG);
55 addValue("sand", JavaMathOperation.SAND);
56 addValue("sor", JavaMathOperation.SOR);
57 addValue("sxor", JavaMathOperation.SXOR);
60 for(JavaConversionOperation operation : JavaConversionOperation.OPCODES)
61 addValue(operation.getMnemonic(), operation);
63 // Comparison operations
64 addValue("icmpeq", new JavaComparisonOperation("==", Types.INTEGER));
65 addValue("icmpne", new JavaComparisonOperation("!=", Types.INTEGER));
66 addValue("icmplt", new JavaComparisonOperation("<", Types.INTEGER));
67 addValue("icmple", new JavaComparisonOperation("<=", Types.INTEGER));
68 addValue("icmpgt", new JavaComparisonOperation(">", Types.INTEGER));
69 addValue("icmpge", new JavaComparisonOperation(">=", Types.INTEGER));
71 addValue("lcmpeq", new JavaComparisonOperation("==", Types.LONG));
72 addValue("lcmpne", new JavaComparisonOperation("!=", Types.LONG));
73 addValue("lcmplt", new JavaComparisonOperation("<", Types.LONG));
74 addValue("lcmple", new JavaComparisonOperation("<=", Types.LONG));
75 addValue("lcmpgt", new JavaComparisonOperation(">", Types.LONG));
76 addValue("lcmpge", new JavaComparisonOperation(">=", Types.LONG));
78 addValue("scmpeq", new JavaComparisonOperation("==", Types.SHORT));
79 addValue("scmpne", new JavaComparisonOperation("!=", Types.SHORT));
80 addValue("scmplt", new JavaComparisonOperation("<", Types.SHORT));
81 addValue("scmple", new JavaComparisonOperation("<=", Types.SHORT));
82 addValue("scmpgt", new JavaComparisonOperation(">", Types.SHORT));
83 addValue("scmpge", new JavaComparisonOperation(">=", Types.SHORT));
85 addValue("fcmpeq", new JavaComparisonOperation("==", Types.FLOAT));
86 addValue("fcmpne", new JavaComparisonOperation("!=", Types.FLOAT));
87 addValue("fcmplt", new JavaComparisonOperation("<", Types.FLOAT));
88 addValue("fcmple", new JavaComparisonOperation("<=", Types.FLOAT));
89 addValue("fcmpgt", new JavaComparisonOperation(">", Types.FLOAT));
90 addValue("fcmpge", new JavaComparisonOperation(">=", Types.FLOAT));
92 addValue("dcmpeq", new JavaComparisonOperation("==", Types.DOUBLE));
93 addValue("dcmpne", new JavaComparisonOperation("!=", Types.DOUBLE));
94 addValue("dcmplt", new JavaComparisonOperation("<", Types.DOUBLE));
95 addValue("dcmple", new JavaComparisonOperation("<=", Types.DOUBLE));
96 addValue("dcmpgt", new JavaComparisonOperation(">", Types.DOUBLE));
97 addValue("dcmpge", new JavaComparisonOperation(">=", Types.DOUBLE));
99 addValue("ccmpeq", new JavaComparisonOperation("==", Types.CHARACTER));
100 addValue("ccmpne", new JavaComparisonOperation("!=", Types.CHARACTER));
101 addValue("ccmplt", new JavaComparisonOperation("<", Types.CHARACTER));
102 addValue("ccmple", new JavaComparisonOperation("<=", Types.CHARACTER));
103 addValue("ccmpgt", new JavaComparisonOperation(">", Types.CHARACTER));
104 addValue("ccmpge", new JavaComparisonOperation(">=", Types.CHARACTER));
106 // Comparison to zero operations
107 addValue("ifeq", new JavaComparisonToZeroOperation("=="));
108 addValue("ifne", new JavaComparisonToZeroOperation("!="));
109 addValue("iflt", new JavaComparisonToZeroOperation("<"));
110 addValue("ifle", new JavaComparisonToZeroOperation("<="));
111 addValue("ifgt", new JavaComparisonToZeroOperation(">"));
112 addValue("ifge", new JavaComparisonToZeroOperation(">="));
114 TVar A = Types.var(Kinds.STAR);
115 TVar B = Types.var(Kinds.STAR);
117 addValue("unsafeCoerce", UnsafeCoerce.INSTANCE);
118 addValue("equals", new JavaMethod(true,
119 "java/lang/Object", "equals", Types.NO_EFFECTS, Types.BOOLEAN, A, A));
120 addValue("hashCode", new JavaMethod(true,
121 "java/lang/Object", "hashCode", Types.NO_EFFECTS, Types.INTEGER, A));
122 addValue("toString", new JavaMethod(true,
123 "java/lang/Object", "toString", Types.NO_EFFECTS, Types.STRING, A));
126 static Expression createLiteral(FunctionValue value) {
127 Expression result = new ELiteral(value);
128 for(TVar var : value.getTypeParameters())
129 result = new EApplyType(result, var);