X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fjava%2FJavaModule.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fjava%2FJavaModule.java;h=39c2dbec6ce87f2187eee6fabbfa70f24457c74d;hp=0000000000000000000000000000000000000000;hb=969bd23cab98a79ca9101af33334000879fb60c5;hpb=866dba5cd5a3929bbeae85991796acb212338a08 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 index 000000000..39c2dbec6 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/JavaModule.java @@ -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; + } + +} +