index feace6fe30e44ea9568b6c9f39ef7846a5286cde..c131f7f750080b2ce9f3ace65639063f0617d548 100644 (file)
}
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);
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);
}
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);