DEADSOFTWARE

Добавлен оператор IN
[dsw-obn.git] / src / backends / jvm / generator-jvm.c
index fe8bc003d149bb4640fef9bad7792572aa500c11..03b29f8ae7fed461f5fa3f452b0bdd986b5a5b93 100644 (file)
@@ -1778,6 +1778,34 @@ jvm_generate_range(gen_proc_t * p, oberon_expr_t * a, oberon_expr_t * b)
        /* TODO free registers */
 }
 
+static void
+jvm_generate_in(gen_proc_t * p, oberon_expr_t * a, oberon_expr_t * b)
+{
+       oberon_type_t * t = a -> result;
+       int cell_size = jvm_cell_size_for_type(t);
+       char prefix = jvm_get_prefix(t);
+       int label_else = jvm_new_label_id(p);
+       int label_end = jvm_new_label_id(p);
+
+       jvm_generate_push_int_size(p, 1, t -> size);
+       push_expr(p, a);
+       jvm_generate(p, 2 * cell_size, cell_size, "%cshl", prefix);
+       push_expr(p, b);        
+       jvm_generate(p, 2 * cell_size, cell_size, "%cand", prefix);
+
+       if(cell_size > 1)
+       {
+               jvm_generate(p, cell_size, 0, "lcmp");
+       }
+
+       jvm_generate(p, 1, 0, "ifeq L%i", label_else);
+       jvm_generate(p, 0, 1, "iconst_1");
+       jvm_generate(p, 0, 0, "goto L%i", label_end);
+       jvm_generate_label(p, label_else);
+       jvm_generate(p, 0, 1, "iconst_0");      
+       jvm_generate_label(p, label_end);
+}
+
 static void
 push_operator(gen_proc_t * p, oberon_oper_t * oper)
 {
@@ -1835,6 +1863,9 @@ push_operator(gen_proc_t * p, oberon_oper_t * oper)
                case OP_RANGE:
                        jvm_generate_range(p, oper -> left, oper -> right);
                        break;
+               case OP_IN:
+                       jvm_generate_in(p, oper -> left, oper -> right);
+                       break;
                default:
                        gen_error("push_oper: unk op %i", op);
                        break;