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;
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;
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);
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_);
+ }
+
}