X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Finssel-long32.brg;h=d12c34c08996fba6fa5a5ae68d9e04ffd53041e7;hb=49065425ce3128e78cc6191c940320af20b584dc;hp=b5909257bf9cb1e6f37662be892684d7b26f5fb6;hpb=f99ce750ee781a2584e849a0264300fa4d99aaaa;p=mono.git diff --git a/mono/mini/inssel-long32.brg b/mono/mini/inssel-long32.brg index b5909257bf9..d12c34c0899 100644 --- a/mono/mini/inssel-long32.brg +++ b/mono/mini/inssel-long32.brg @@ -101,6 +101,28 @@ reg: CEE_SUB_OVF_UN (reg, reg) { MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException"); } +reg: CEE_DIV (reg, OP_ICONST) { + int p2 = mono_is_power_of_two (state->right->tree->inst_c0); + int r = mono_regstate_next_int (s->rs); + if (p2 <= 0) { + MONO_EMIT_NEW_ICONST (s, r, state->right->tree->inst_c0); + MONO_EMIT_BIALU (s, tree, CEE_DIV, state->reg1, state->left->reg1, r); + } else if (p2 == 1) { + int r2 = mono_regstate_next_int (s->rs); + MONO_EMIT_NEW_BIALU_IMM (s, OP_SHR_UN_IMM, r, state->left->reg1, 31); + MONO_EMIT_NEW_BIALU (s, CEE_ADD, r2, r, state->left->reg1); + MONO_EMIT_NEW_BIALU_IMM (s, OP_SHR_IMM, state->reg1, r2, 1); + } else { + int r2 = mono_regstate_next_int (s->rs); + int r3 = mono_regstate_next_int (s->rs); + int r4 = mono_regstate_next_int (s->rs); + MONO_EMIT_NEW_BIALU_IMM (s, OP_SHR_IMM, r2, state->left->reg1, 31); + MONO_EMIT_NEW_BIALU_IMM (s, OP_SHR_UN_IMM, r3, r2, (32 - p2)); + MONO_EMIT_NEW_BIALU (s, CEE_ADD, r4, r3, state->left->reg1); + MONO_EMIT_NEW_BIALU_IMM (s, OP_SHR_IMM, state->reg1, r4, p2); + } +} + cflags: OP_COMPARE (reg, reg) { tree->sreg1 = state->left->reg1; tree->sreg2 = state->right->reg1;