X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fconstants%2FJavaMathOperation.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fconstants%2FJavaMathOperation.java;h=e13c18563dc9fe67e3446f6e65c1836f83ade973;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaMathOperation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaMathOperation.java new file mode 100644 index 000000000..e13c18563 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaMathOperation.java @@ -0,0 +1,100 @@ +package org.simantics.scl.compiler.constants; + +import org.objectweb.asm.Opcodes; +import org.simantics.scl.compiler.internal.codegen.references.Val; +import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; +import org.simantics.scl.compiler.internal.codegen.utils.OpcodeMnemonics; +import org.simantics.scl.compiler.types.TVar; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.compiler.types.Types; + +public class JavaMathOperation extends FunctionValue { + public static final JavaMathOperation IADD = new JavaMathOperation(Opcodes.IADD, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation ISUB = new JavaMathOperation(Opcodes.ISUB, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation IMUL = new JavaMathOperation(Opcodes.IMUL, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation IDIV = new JavaMathOperation(Opcodes.IDIV, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation IREM = new JavaMathOperation(Opcodes.IREM, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation INEG = new JavaMathOperation(Opcodes.INEG, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation IAND = new JavaMathOperation(Opcodes.IAND, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation IOR = new JavaMathOperation(Opcodes.IOR, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation IXOR = new JavaMathOperation(Opcodes.IXOR, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation ISHL = new JavaMathOperation(Opcodes.ISHL, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation ISHR = new JavaMathOperation(Opcodes.ISHR, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation IUSHR = new JavaMathOperation(Opcodes.IUSHR, Types.INTEGER, Types.INTEGER, Types.INTEGER); + public static final JavaMathOperation LADD = new JavaMathOperation(Opcodes.LADD, Types.LONG, Types.LONG, Types.LONG); + public static final JavaMathOperation LSUB = new JavaMathOperation(Opcodes.LSUB, Types.LONG, Types.LONG, Types.LONG); + public static final JavaMathOperation LMUL = new JavaMathOperation(Opcodes.LMUL, Types.LONG, Types.LONG, Types.LONG); + public static final JavaMathOperation LDIV = new JavaMathOperation(Opcodes.LDIV, Types.LONG, Types.LONG, Types.LONG); + public static final JavaMathOperation LREM = new JavaMathOperation(Opcodes.LREM, Types.LONG, Types.LONG, Types.LONG); + public static final JavaMathOperation LNEG = new JavaMathOperation(Opcodes.LNEG, Types.LONG, Types.LONG); + public static final JavaMathOperation LAND = new JavaMathOperation(Opcodes.LAND, Types.LONG, Types.LONG, Types.LONG); + public static final JavaMathOperation LOR = new JavaMathOperation(Opcodes.LOR, Types.LONG, Types.LONG, Types.LONG); + public static final JavaMathOperation LXOR = new JavaMathOperation(Opcodes.LXOR, Types.LONG, Types.LONG, Types.LONG); + public static final JavaMathOperation LSHL = new JavaMathOperation(Opcodes.LSHL, Types.LONG, Types.LONG, Types.INTEGER); + public static final JavaMathOperation LSHR = new JavaMathOperation(Opcodes.LSHR, Types.LONG, Types.LONG, Types.INTEGER); + public static final JavaMathOperation LUSHR = new JavaMathOperation(Opcodes.LUSHR, Types.LONG, Types.LONG, Types.INTEGER); + public static final JavaMathOperation FADD = new JavaMathOperation(Opcodes.FADD, Types.FLOAT, Types.FLOAT, Types.FLOAT); + public static final JavaMathOperation FSUB = new JavaMathOperation(Opcodes.FSUB, Types.FLOAT, Types.FLOAT, Types.FLOAT); + public static final JavaMathOperation FMUL = new JavaMathOperation(Opcodes.FMUL, Types.FLOAT, Types.FLOAT, Types.FLOAT); + public static final JavaMathOperation FDIV = new JavaMathOperation(Opcodes.FDIV, Types.FLOAT, Types.FLOAT, Types.FLOAT); + public static final JavaMathOperation FREM = new JavaMathOperation(Opcodes.FREM, Types.FLOAT, Types.FLOAT, Types.FLOAT); + public static final JavaMathOperation FNEG = new JavaMathOperation(Opcodes.FNEG, Types.FLOAT, Types.FLOAT); + public static final JavaMathOperation DADD = new JavaMathOperation(Opcodes.DADD, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE); + public static final JavaMathOperation DSUB = new JavaMathOperation(Opcodes.DSUB, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE); + public static final JavaMathOperation DMUL = new JavaMathOperation(Opcodes.DMUL, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE); + public static final JavaMathOperation DDIV = new JavaMathOperation(Opcodes.DDIV, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE); + public static final JavaMathOperation DREM = new JavaMathOperation(Opcodes.DREM, Types.DOUBLE, Types.DOUBLE, Types.DOUBLE); + public static final JavaMathOperation DNEG = new JavaMathOperation(Opcodes.DNEG, Types.DOUBLE, Types.DOUBLE); + public static final JavaMathOperation LCMP = new JavaMathOperation(Opcodes.LCMP, Types.LONG, Types.LONG, Types.INTEGER); + public static final JavaMathOperation FCMPG = new JavaMathOperation(Opcodes.FCMPG, Types.FLOAT, Types.FLOAT, Types.INTEGER); + public static final JavaMathOperation FCMPL = new JavaMathOperation(Opcodes.FCMPL, Types.FLOAT, Types.FLOAT, Types.INTEGER); + public static final JavaMathOperation DCMPG = new JavaMathOperation(Opcodes.DCMPG, Types.DOUBLE, Types.DOUBLE, Types.INTEGER); + public static final JavaMathOperation DCMPL = new JavaMathOperation(Opcodes.DCMPL, Types.DOUBLE, Types.DOUBLE, Types.INTEGER); + + public static final JavaMathOperation SADD = new JavaMathOperation(Opcodes.IADD, Types.SHORT, Types.SHORT, Types.SHORT); + public static final JavaMathOperation SSUB = new JavaMathOperation(Opcodes.ISUB, Types.SHORT, Types.SHORT, Types.SHORT); + public static final JavaMathOperation SMUL = new JavaMathOperation(Opcodes.IMUL, Types.SHORT, Types.SHORT, Types.SHORT); + public static final JavaMathOperation SDIV = new JavaMathOperation(Opcodes.IDIV, Types.SHORT, Types.SHORT, Types.SHORT); + public static final JavaMathOperation SREM = new JavaMathOperation(Opcodes.IREM, Types.SHORT, Types.SHORT, Types.SHORT); + public static final JavaMathOperation SNEG = new JavaMathOperation(Opcodes.INEG, Types.SHORT, Types.SHORT); + public static final JavaMathOperation SAND = new JavaMathOperation(Opcodes.IAND, Types.SHORT, Types.SHORT, Types.SHORT); + public static final JavaMathOperation SOR = new JavaMathOperation(Opcodes.IOR, Types.SHORT, Types.SHORT, Types.SHORT); + public static final JavaMathOperation SXOR = new JavaMathOperation(Opcodes.IXOR, Types.SHORT, Types.SHORT, Types.SHORT); + + public static final JavaMathOperation CADD = new JavaMathOperation(Opcodes.IADD, Types.CHARACTER, Types.CHARACTER, Types.INTEGER); + public static final JavaMathOperation CSUB = new JavaMathOperation(Opcodes.ISUB, Types.INTEGER, Types.CHARACTER, Types.CHARACTER); + + public static final JavaMathOperation[] OPCODES = new JavaMathOperation[] { + IADD, ISUB, IMUL, IDIV, IREM, INEG, IAND, IOR, IXOR, ISHL, ISHR, IUSHR, + LADD, LSUB, LMUL, LDIV, LREM, LNEG, LAND, LOR, LXOR, LSHL, LSHR, LUSHR, + FADD, FSUB, FMUL, FDIV, FREM, FNEG, + DADD, DSUB, DMUL, DDIV, DREM, DNEG, + LCMP, + FCMPG, FCMPL, + DCMPG, DCMPL + }; + + int opcode; + + private JavaMathOperation(int opcode, Type returnType, Type ... parameterTypes) { + super(TVar.EMPTY_ARRAY, Types.NO_EFFECTS, returnType, parameterTypes); + this.opcode = opcode; + } + + @Override + public Type applyExact(MethodBuilder mb, Val[] parameters) { + mb.push(parameters, parameterTypes); + mb.math(opcode); + + return getReturnType(); + } + + public String getMnemonic() { + return OpcodeMnemonics.MNEMONICS[opcode&0xff]; + } + + @Override + public String toString() { + return getMnemonic(); + } +} \ No newline at end of file