DEADSOFTWARE

Добавлена функция SYSTEM.LSH
[dsw-obn.git] / src / backends / jvm / generator-jvm.c
index feace6fe30e44ea9568b6c9f39ef7846a5286cde..c131f7f750080b2ce9f3ace65639063f0617d548 100644 (file)
@@ -1570,7 +1570,7 @@ jvm_generate_in(gen_proc_t * p, oberon_expr_t * a, oberon_expr_t * b)
 }
 
 static void
-jvm_generate_ash(gen_proc_t * p, oberon_expr_t * a, oberon_expr_t * b)
+jvm_generate_ash(gen_proc_t * p, oberon_expr_t * a, oberon_expr_t * b, bool logical)
 {
        oberon_type_t * t = a -> result;
        int cell_size = jvm_cell_size_for_type(t);
@@ -1597,8 +1597,15 @@ jvm_generate_ash(gen_proc_t * p, oberon_expr_t * a, oberon_expr_t * b)
        jvm_generate(p, 2 * cell_size, cell_size, "%cshl", prefix);
        jvm_generate(p, 0, 0, "goto L%i", label_end);
        jvm_generate_label(p, label_else);
-       jvm_generate_abs(p, prefix);    
-       jvm_generate(p, 2 * cell_size, cell_size, "%cshr", prefix);
+       jvm_generate_abs(p, prefix);
+       if(logical)
+       {
+               jvm_generate(p, 2 * cell_size, cell_size, "%cushr", prefix);
+       }
+       else
+       {
+               jvm_generate(p, 2 * cell_size, cell_size, "%cshr", prefix);
+       }
        jvm_generate_label(p, label_end);
 }
 
@@ -1680,7 +1687,10 @@ push_operator(gen_proc_t * p, oberon_oper_t * oper)
                        break;
 
                case OP_ASH:
-                       jvm_generate_ash(p, oper -> left, oper -> right);
+                       jvm_generate_ash(p, oper -> left, oper -> right, false);
+                       break;
+               case OP_LSH:
+                       jvm_generate_ash(p, oper -> left, oper -> right, true);
                        break;
                default:
                        gen_error("push_oper: unk op %i", op);