]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/JavaModule.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / java / JavaModule.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/JavaModule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/JavaModule.java
new file mode 100755 (executable)
index 0000000..39c2dbe
--- /dev/null
@@ -0,0 +1,134 @@
+package org.simantics.scl.compiler.elaboration.java;
+
+
+import org.simantics.scl.compiler.constants.DoubleConstant;
+import org.simantics.scl.compiler.constants.FloatConstant;
+import org.simantics.scl.compiler.constants.FunctionValue;
+import org.simantics.scl.compiler.constants.IntegerConstant;
+import org.simantics.scl.compiler.constants.JavaComparisonOperation;
+import org.simantics.scl.compiler.constants.JavaComparisonToZeroOperation;
+import org.simantics.scl.compiler.constants.JavaConversionOperation;
+import org.simantics.scl.compiler.constants.JavaMathOperation;
+import org.simantics.scl.compiler.constants.JavaMethod;
+import org.simantics.scl.compiler.constants.LongConstant;
+import org.simantics.scl.compiler.constants.ShortConstant;
+import org.simantics.scl.compiler.constants.singletons.UnsafeCoerce;
+import org.simantics.scl.compiler.elaboration.expressions.EApplyType;
+import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
+import org.simantics.scl.compiler.elaboration.expressions.Expression;
+import org.simantics.scl.compiler.module.ConcreteModule;
+import org.simantics.scl.compiler.types.TVar;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.kinds.Kinds;
+
+public class JavaModule extends ConcreteModule {
+
+    public static final JavaModule INSTANCE = new JavaModule();
+    
+    public static final String MODULE_NAME = "JavaBuiltin";
+
+    private JavaModule() {
+        super(MODULE_NAME);
+        addValue("dconst_0", new DoubleConstant(0.0));
+        addValue("dconst_1", new DoubleConstant(1.0));
+        addValue("fconst_0", new FloatConstant(0.0f));
+        addValue("fconst_1", new FloatConstant(1.0f));
+        addValue("iconst_0", IntegerConstant.ZERO);
+        addValue("iconst_1", IntegerConstant.ONE);
+        addValue("sconst_0", ShortConstant.ZERO);
+        addValue("sconst_1", ShortConstant.ONE);
+        addValue("lconst_0", new LongConstant(0L));
+        addValue("lconst_1", new LongConstant(1L));
+        
+        // Mathematical operations
+        for(JavaMathOperation operation : JavaMathOperation.OPCODES)
+            addValue(operation.getMnemonic(), operation);
+        addValue("cadd", JavaMathOperation.CADD);
+        addValue("csub", JavaMathOperation.CSUB);
+        
+        addValue("sadd", JavaMathOperation.SADD);
+        addValue("ssub", JavaMathOperation.SSUB);
+        addValue("smul", JavaMathOperation.SMUL);
+        addValue("sdiv", JavaMathOperation.SDIV);
+        addValue("srem", JavaMathOperation.SREM);
+        addValue("sneg", JavaMathOperation.SNEG);
+        addValue("sand", JavaMathOperation.SAND);
+        addValue("sor", JavaMathOperation.SOR);
+        addValue("sxor", JavaMathOperation.SXOR);
+        
+        // Conversions
+        for(JavaConversionOperation operation : JavaConversionOperation.OPCODES)
+            addValue(operation.getMnemonic(), operation);
+        
+        // Comparison operations
+        addValue("icmpeq", new JavaComparisonOperation("==", Types.INTEGER));
+        addValue("icmpne", new JavaComparisonOperation("!=", Types.INTEGER));
+        addValue("icmplt", new JavaComparisonOperation("<", Types.INTEGER));
+        addValue("icmple", new JavaComparisonOperation("<=", Types.INTEGER));
+        addValue("icmpgt", new JavaComparisonOperation(">", Types.INTEGER));
+        addValue("icmpge", new JavaComparisonOperation(">=", Types.INTEGER));
+        
+        addValue("lcmpeq", new JavaComparisonOperation("==", Types.LONG));
+        addValue("lcmpne", new JavaComparisonOperation("!=", Types.LONG));
+        addValue("lcmplt", new JavaComparisonOperation("<", Types.LONG));
+        addValue("lcmple", new JavaComparisonOperation("<=", Types.LONG));
+        addValue("lcmpgt", new JavaComparisonOperation(">", Types.LONG));
+        addValue("lcmpge", new JavaComparisonOperation(">=", Types.LONG));     
+        
+        addValue("scmpeq", new JavaComparisonOperation("==", Types.SHORT));
+        addValue("scmpne", new JavaComparisonOperation("!=", Types.SHORT));
+        addValue("scmplt", new JavaComparisonOperation("<", Types.SHORT));
+        addValue("scmple", new JavaComparisonOperation("<=", Types.SHORT));
+        addValue("scmpgt", new JavaComparisonOperation(">", Types.SHORT));
+        addValue("scmpge", new JavaComparisonOperation(">=", Types.SHORT));
+        
+        addValue("fcmpeq", new JavaComparisonOperation("==", Types.FLOAT));
+        addValue("fcmpne", new JavaComparisonOperation("!=", Types.FLOAT));
+        addValue("fcmplt", new JavaComparisonOperation("<", Types.FLOAT));
+        addValue("fcmple", new JavaComparisonOperation("<=", Types.FLOAT));
+        addValue("fcmpgt", new JavaComparisonOperation(">", Types.FLOAT));
+        addValue("fcmpge", new JavaComparisonOperation(">=", Types.FLOAT));    
+        
+        addValue("dcmpeq", new JavaComparisonOperation("==", Types.DOUBLE));
+        addValue("dcmpne", new JavaComparisonOperation("!=", Types.DOUBLE));
+        addValue("dcmplt", new JavaComparisonOperation("<", Types.DOUBLE));
+        addValue("dcmple", new JavaComparisonOperation("<=", Types.DOUBLE));
+        addValue("dcmpgt", new JavaComparisonOperation(">", Types.DOUBLE));
+        addValue("dcmpge", new JavaComparisonOperation(">=", Types.DOUBLE));        
+
+        addValue("ccmpeq", new JavaComparisonOperation("==", Types.CHARACTER));
+        addValue("ccmpne", new JavaComparisonOperation("!=", Types.CHARACTER));
+        addValue("ccmplt", new JavaComparisonOperation("<", Types.CHARACTER));
+        addValue("ccmple", new JavaComparisonOperation("<=", Types.CHARACTER));
+        addValue("ccmpgt", new JavaComparisonOperation(">", Types.CHARACTER));
+        addValue("ccmpge", new JavaComparisonOperation(">=", Types.CHARACTER));
+        
+        // Comparison to zero operations
+        addValue("ifeq", new JavaComparisonToZeroOperation("=="));
+        addValue("ifne", new JavaComparisonToZeroOperation("!="));
+        addValue("iflt", new JavaComparisonToZeroOperation("<"));
+        addValue("ifle", new JavaComparisonToZeroOperation("<="));
+        addValue("ifgt", new JavaComparisonToZeroOperation(">"));
+        addValue("ifge", new JavaComparisonToZeroOperation(">="));
+        
+        TVar A = Types.var(Kinds.STAR);
+        TVar B = Types.var(Kinds.STAR);
+        
+        addValue("unsafeCoerce", UnsafeCoerce.INSTANCE);
+        addValue("equals", new JavaMethod(true, 
+                "java/lang/Object", "equals", Types.NO_EFFECTS, Types.BOOLEAN, A, A));
+        addValue("hashCode", new JavaMethod(true, 
+                "java/lang/Object", "hashCode", Types.NO_EFFECTS, Types.INTEGER, A));
+        addValue("toString", new JavaMethod(true, 
+                "java/lang/Object", "toString", Types.NO_EFFECTS, Types.STRING, A));
+    }
+    
+    static Expression createLiteral(FunctionValue value) {
+        Expression result = new ELiteral(value);
+        for(TVar var : value.getTypeParameters())
+            result = new EApplyType(result, var);
+        return result;
+    }
+    
+}
+