]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.compiler.elaboration.java;
2
3
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;
23
24 public class JavaModule extends ConcreteModule {
25
26     public static final JavaModule INSTANCE = new JavaModule();
27     
28     public static final String MODULE_NAME = "JavaBuiltin";
29
30     private JavaModule() {
31         super(MODULE_NAME);
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));
42         
43         // Mathematical operations
44         for(JavaMathOperation operation : JavaMathOperation.OPCODES)
45             addValue(operation.getMnemonic(), operation);
46         addValue("cadd", JavaMathOperation.CADD);
47         addValue("csub", JavaMathOperation.CSUB);
48         
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);
58         
59         // Conversions
60         for(JavaConversionOperation operation : JavaConversionOperation.OPCODES)
61             addValue(operation.getMnemonic(), operation);
62         
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));
70         
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));     
77         
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));
84         
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));    
91         
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));        
98
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));
105         
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(">="));
113         
114         TVar A = Types.var(Kinds.STAR);
115         TVar B = Types.var(Kinds.STAR);
116         
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));
124     }
125     
126     static Expression createLiteral(FunctionValue value) {
127         Expression result = new ELiteral(value);
128         for(TVar var : value.getTypeParameters())
129             result = new EApplyType(result, var);
130         return result;
131     }
132     
133 }
134