1 package org.simantics.scl.compiler.constants;
4 import org.objectweb.asm.Label;
5 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
6 import org.simantics.scl.compiler.internal.codegen.references.Val;
7 import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;
8 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
9 import org.simantics.scl.compiler.types.TVar;
10 import org.simantics.scl.compiler.types.Type;
11 import org.simantics.scl.compiler.types.Types;
13 public class JavaComparisonOperation extends FunctionValue implements ComparisonFunction {
14 public static final JavaComparisonOperation IEQUAL = new JavaComparisonOperation("==", Types.INTEGER);
15 public static final JavaComparisonOperation INOT_EQUAL = new JavaComparisonOperation("!=", Types.INTEGER);
16 public static final JavaComparisonOperation ILESS = new JavaComparisonOperation("<", Types.INTEGER);
17 public static final JavaComparisonOperation ILESS_OR_EQUAL = new JavaComparisonOperation("<=", Types.INTEGER);
18 public static final JavaComparisonOperation IGREATER = new JavaComparisonOperation(">", Types.INTEGER);
19 public static final JavaComparisonOperation IGREATER_OR_EQUAL = new JavaComparisonOperation(">=", Types.INTEGER);
23 public JavaComparisonOperation(String op, Type type) {
24 super(TVar.EMPTY_ARRAY, Types.NO_EFFECTS, Types.BOOLEAN, type, type);
29 public Type applyExact(MethodBuilder mb, Val[] parameters) {
30 JavaTypeTranslator tt = mb.getJavaTypeTranslator();
31 Label thenBranch = mb.createLabel();
32 Label joinPoint = mb.createLabel();
33 Type type = parameterTypes[0];
35 mb.push(parameters[0], type);
36 mb.push(parameters[1], type);
37 mb.ifComparisonBranch(thenBranch, op, tt.toTypeDesc(type));
39 mb.loadConstant(false);
42 mb.setLocation(thenBranch);
43 mb.loadConstant(true);
44 mb.setLocation(joinPoint);
46 return getReturnType();
50 public String toString() {
51 return "(" + op + ")";
55 public void generateCondition(MethodBuilder mb, Val[] parameters, Cont then_, Cont else_) {
56 JavaTypeTranslator tt = mb.getJavaTypeTranslator();
57 Type type = parameterTypes[0];
58 mb.push(parameters[0], type);
59 mb.push(parameters[1], type);
60 mb.ifComparisonBranch(mb.getLabel(then_), op, tt.toTypeDesc(type));
62 mb.ensureExists(then_);