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%2Fconstants%2FJavaComparisonOperation.java;h=53cbfd7aa53edf57f71ce324bdd7b3294ad716cf;hp=684e7ed5d8454646a6e61da67e4abd179bd057b6;hb=a8758de5bc19e5adb3f618d3038743a164f09912;hpb=12d9af17384d960b75d58c3935d2b7b46d93e87b diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaComparisonOperation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaComparisonOperation.java index 684e7ed5d..53cbfd7aa 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaComparisonOperation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaComparisonOperation.java @@ -2,6 +2,7 @@ package org.simantics.scl.compiler.constants; import org.objectweb.asm.Label; +import org.simantics.scl.compiler.internal.codegen.continuations.Cont; import org.simantics.scl.compiler.internal.codegen.references.Val; import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; @@ -9,7 +10,13 @@ import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; -public class JavaComparisonOperation extends FunctionValue { +public class JavaComparisonOperation extends FunctionValue implements ComparisonFunction { + public static final JavaComparisonOperation IEQUAL = new JavaComparisonOperation("==", Types.INTEGER); + public static final JavaComparisonOperation INOT_EQUAL = new JavaComparisonOperation("!=", Types.INTEGER); + public static final JavaComparisonOperation ILESS = new JavaComparisonOperation("<", Types.INTEGER); + public static final JavaComparisonOperation ILESS_OR_EQUAL = new JavaComparisonOperation("<=", Types.INTEGER); + public static final JavaComparisonOperation IGREATER = new JavaComparisonOperation(">", Types.INTEGER); + public static final JavaComparisonOperation IGREATER_OR_EQUAL = new JavaComparisonOperation(">=", Types.INTEGER); String op; @@ -23,10 +30,11 @@ public class JavaComparisonOperation extends FunctionValue { JavaTypeTranslator tt = mb.getJavaTypeTranslator(); Label thenBranch = mb.createLabel(); Label joinPoint = mb.createLabel(); + Type type = parameterTypes[0]; mb.push(parameters[0], type); mb.push(parameters[1], type); - mb.ifComparisonBranch(thenBranch, op, tt.toTypeDesc(parameterTypes[0])); + mb.ifComparisonBranch(thenBranch, op, tt.toTypeDesc(type)); mb.loadConstant(false); mb.branch(joinPoint); @@ -43,4 +51,15 @@ public class JavaComparisonOperation extends FunctionValue { return "(" + op + ")"; } + @Override + public void generateCondition(MethodBuilder mb, Val[] parameters, Cont then_, Cont else_) { + JavaTypeTranslator tt = mb.getJavaTypeTranslator(); + Type type = parameterTypes[0]; + mb.push(parameters[0], type); + mb.push(parameters[1], type); + mb.ifComparisonBranch(mb.getLabel(then_), op, tt.toTypeDesc(type)); + mb.jump(else_); + mb.ensureExists(then_); + } + }