]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaMathOperation.java
Merge "InputStream returns -1 on EOF instead of throwing IOException"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / JavaMathOperation.java
1 package org.simantics.scl.compiler.constants;
2
3 import org.objectweb.asm.Opcodes;
4 import org.simantics.scl.compiler.internal.codegen.references.Val;
5 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
6 import org.simantics.scl.compiler.internal.codegen.utils.OpcodeMnemonics;
7 import org.simantics.scl.compiler.types.TVar;
8 import org.simantics.scl.compiler.types.Type;
9 import org.simantics.scl.compiler.types.Types;
10
11 public class JavaMathOperation extends FunctionValue {
12     public static final JavaMathOperation IADD = new JavaMathOperation(Opcodes.IADD, Types.INTEGER, Types.INTEGER, Types.INTEGER);
13     public static final JavaMathOperation ISUB = new JavaMathOperation(Opcodes.ISUB, Types.INTEGER, Types.INTEGER, Types.INTEGER);
14     public static final JavaMathOperation IMUL = new JavaMathOperation(Opcodes.IMUL, Types.INTEGER, Types.INTEGER, Types.INTEGER);
15     public static final JavaMathOperation IDIV = new JavaMathOperation(Opcodes.IDIV, Types.INTEGER, Types.INTEGER, Types.INTEGER);
16     public static final JavaMathOperation IREM = new JavaMathOperation(Opcodes.IREM, Types.INTEGER, Types.INTEGER, Types.INTEGER);
17     public static final JavaMathOperation INEG = new JavaMathOperation(Opcodes.INEG, Types.INTEGER, Types.INTEGER);
18     public static final JavaMathOperation IAND = new JavaMathOperation(Opcodes.IAND, Types.INTEGER, Types.INTEGER, Types.INTEGER);
19     public static final JavaMathOperation IOR = new JavaMathOperation(Opcodes.IOR, Types.INTEGER, Types.INTEGER, Types.INTEGER);
20     public static final JavaMathOperation IXOR = new JavaMathOperation(Opcodes.IXOR, Types.INTEGER, Types.INTEGER, Types.INTEGER);
21     public static final JavaMathOperation ISHL = new JavaMathOperation(Opcodes.ISHL, Types.INTEGER, Types.INTEGER, Types.INTEGER);
22     public static final JavaMathOperation ISHR = new JavaMathOperation(Opcodes.ISHR, Types.INTEGER, Types.INTEGER, Types.INTEGER);
23     public static final JavaMathOperation IUSHR = new JavaMathOperation(Opcodes.IUSHR, Types.INTEGER, Types.INTEGER, Types.INTEGER);
24     public static final JavaMathOperation LADD = new JavaMathOperation(Opcodes.LADD, Types.LONG, Types.LONG, Types.LONG);
25     public static final JavaMathOperation LSUB = new JavaMathOperation(Opcodes.LSUB, Types.LONG, Types.LONG, Types.LONG);
26     public static final JavaMathOperation LMUL = new JavaMathOperation(Opcodes.LMUL, Types.LONG, Types.LONG, Types.LONG);
27     public static final JavaMathOperation LDIV = new JavaMathOperation(Opcodes.LDIV, Types.LONG, Types.LONG, Types.LONG);
28     public static final JavaMathOperation LREM = new JavaMathOperation(Opcodes.LREM, Types.LONG, Types.LONG, Types.LONG);
29     public static final JavaMathOperation LNEG = new JavaMathOperation(Opcodes.LNEG, Types.LONG, Types.LONG);
30     public static final JavaMathOperation LAND = new JavaMathOperation(Opcodes.LAND, Types.LONG, Types.LONG, Types.LONG);
31     public static final JavaMathOperation LOR = new JavaMathOperation(Opcodes.LOR, Types.LONG, Types.LONG, Types.LONG);
32     public static final JavaMathOperation LXOR = new JavaMathOperation(Opcodes.LXOR, Types.LONG, Types.LONG, Types.LONG);
33     public static final JavaMathOperation LSHL = new JavaMathOperation(Opcodes.LSHL, Types.LONG, Types.LONG, Types.INTEGER);
34     public static final JavaMathOperation LSHR = new JavaMathOperation(Opcodes.LSHR, Types.LONG, Types.LONG, Types.INTEGER);
35     public static final JavaMathOperation LUSHR = new JavaMathOperation(Opcodes.LUSHR, Types.LONG, Types.LONG, Types.INTEGER);
36     public static final JavaMathOperation FADD = new JavaMathOperation(Opcodes.FADD, Types.FLOAT, Types.FLOAT, Types.FLOAT);
37     public static final JavaMathOperation FSUB = new JavaMathOperation(Opcodes.FSUB, Types.FLOAT, Types.FLOAT, Types.FLOAT);
38     public static final JavaMathOperation FMUL = new JavaMathOperation(Opcodes.FMUL, Types.FLOAT, Types.FLOAT, Types.FLOAT);
39     public static final JavaMathOperation FDIV = new JavaMathOperation(Opcodes.FDIV, Types.FLOAT, Types.FLOAT, Types.FLOAT);
40     public static final JavaMathOperation FREM = new JavaMathOperation(Opcodes.FREM, Types.FLOAT, Types.FLOAT, Types.FLOAT);
41     public static final JavaMathOperation FNEG = new JavaMathOperation(Opcodes.FNEG, Types.FLOAT, Types.FLOAT);
42     public static final JavaMathOperation DADD = new JavaMathOperation(Opcodes.DADD, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE);
43     public static final JavaMathOperation DSUB = new JavaMathOperation(Opcodes.DSUB, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE);
44     public static final JavaMathOperation DMUL = new JavaMathOperation(Opcodes.DMUL, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE);
45     public static final JavaMathOperation DDIV = new JavaMathOperation(Opcodes.DDIV, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE);
46     public static final JavaMathOperation DREM = new JavaMathOperation(Opcodes.DREM, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE);
47     public static final JavaMathOperation DNEG = new JavaMathOperation(Opcodes.DNEG, Types.DOUBLE, Types.DOUBLE);
48     public static final JavaMathOperation LCMP = new JavaMathOperation(Opcodes.LCMP, Types.LONG, Types.LONG, Types.INTEGER);
49     public static final JavaMathOperation FCMPG = new JavaMathOperation(Opcodes.FCMPG, Types.FLOAT, Types.FLOAT, Types.INTEGER);
50     public static final JavaMathOperation FCMPL = new JavaMathOperation(Opcodes.FCMPL, Types.FLOAT, Types.FLOAT, Types.INTEGER);
51     public static final JavaMathOperation DCMPG = new JavaMathOperation(Opcodes.DCMPG, Types.DOUBLE, Types.DOUBLE, Types.INTEGER);
52     public static final JavaMathOperation DCMPL = new JavaMathOperation(Opcodes.DCMPL, Types.DOUBLE, Types.DOUBLE, Types.INTEGER);
53     
54     public static final JavaMathOperation SADD = new JavaMathOperation(Opcodes.IADD, Types.SHORT, Types.SHORT, Types.SHORT);
55     public static final JavaMathOperation SSUB = new JavaMathOperation(Opcodes.ISUB, Types.SHORT, Types.SHORT, Types.SHORT);
56     public static final JavaMathOperation SMUL = new JavaMathOperation(Opcodes.IMUL, Types.SHORT, Types.SHORT, Types.SHORT);
57     public static final JavaMathOperation SDIV = new JavaMathOperation(Opcodes.IDIV, Types.SHORT, Types.SHORT, Types.SHORT);
58     public static final JavaMathOperation SREM = new JavaMathOperation(Opcodes.IREM, Types.SHORT, Types.SHORT, Types.SHORT);
59     public static final JavaMathOperation SNEG = new JavaMathOperation(Opcodes.INEG, Types.SHORT, Types.SHORT);
60     public static final JavaMathOperation SAND = new JavaMathOperation(Opcodes.IAND, Types.SHORT, Types.SHORT, Types.SHORT);
61     public static final JavaMathOperation SOR = new JavaMathOperation(Opcodes.IOR, Types.SHORT, Types.SHORT, Types.SHORT);
62     public static final JavaMathOperation SXOR = new JavaMathOperation(Opcodes.IXOR, Types.SHORT, Types.SHORT, Types.SHORT);
63     
64     public static final JavaMathOperation BADD = new JavaMathOperation(Opcodes.IADD, Types.BYTE, Types.BYTE, Types.BYTE);
65     public static final JavaMathOperation BSUB = new JavaMathOperation(Opcodes.ISUB, Types.BYTE, Types.BYTE, Types.BYTE);
66     public static final JavaMathOperation BMUL = new JavaMathOperation(Opcodes.IMUL, Types.BYTE, Types.BYTE, Types.BYTE);
67     public static final JavaMathOperation BDIV = new JavaMathOperation(Opcodes.IDIV, Types.BYTE, Types.BYTE, Types.BYTE);
68     public static final JavaMathOperation BREM = new JavaMathOperation(Opcodes.IREM, Types.BYTE, Types.BYTE, Types.BYTE);
69     public static final JavaMathOperation BNEG = new JavaMathOperation(Opcodes.INEG, Types.BYTE, Types.BYTE);
70     public static final JavaMathOperation BAND = new JavaMathOperation(Opcodes.IAND, Types.BYTE, Types.BYTE, Types.BYTE);
71     public static final JavaMathOperation BOR = new JavaMathOperation(Opcodes.IOR, Types.BYTE, Types.BYTE, Types.BYTE);
72     public static final JavaMathOperation BXOR = new JavaMathOperation(Opcodes.IXOR, Types.BYTE, Types.BYTE, Types.BYTE);
73
74     public static final JavaMathOperation CADD = new JavaMathOperation(Opcodes.IADD, Types.CHARACTER, Types.CHARACTER, Types.INTEGER);
75     public static final JavaMathOperation CSUB = new JavaMathOperation(Opcodes.ISUB, Types.INTEGER, Types.CHARACTER, Types.CHARACTER);
76     
77     public static final JavaMathOperation[] OPCODES = new JavaMathOperation[] {
78         IADD, ISUB, IMUL, IDIV, IREM, INEG, IAND, IOR, IXOR, ISHL, ISHR, IUSHR,
79         LADD, LSUB, LMUL, LDIV, LREM, LNEG, LAND, LOR, LXOR, LSHL, LSHR, LUSHR,
80         FADD, FSUB, FMUL, FDIV, FREM, FNEG,
81         DADD, DSUB, DMUL, DDIV, DREM, DNEG,
82         LCMP,
83         FCMPG, FCMPL,
84         DCMPG, DCMPL
85     };
86     
87     int opcode;
88     
89     private JavaMathOperation(int opcode, Type returnType, Type ... parameterTypes) {
90         super(TVar.EMPTY_ARRAY, Types.NO_EFFECTS, returnType, parameterTypes);
91         this.opcode = opcode;
92     }
93
94     @Override
95     public Type applyExact(MethodBuilder mb, Val[] parameters) {
96         mb.push(parameters, parameterTypes);
97         mb.math(opcode);
98         
99         return getReturnType();
100     }
101     
102     public String getMnemonic() {
103         return OpcodeMnemonics.MNEMONICS[opcode&0xff];
104     }
105     
106     @Override
107     public String toString() {
108         return getMnemonic();
109     }
110 }