reg: LDELEMA (reg, CONST_I4) {
int ind;
- x86_alu_membase_imm (s->code, X86_CMP, tree->left->reg1, G_STRUCT_OFFSET (MonoArray, max_length), tree->right->data.i);
- EMIT_COND_SYSTEM_EXCEPTION (X86_CC_GT, FALSE, "IndexOutOfRangeException");
+ if (mono_jit_boundcheck){
+ x86_alu_membase_imm (s->code, X86_CMP, tree->left->reg1, G_STRUCT_OFFSET (MonoArray, max_length), tree->right->data.i);
+ EMIT_COND_SYSTEM_EXCEPTION (X86_CC_GT, FALSE, "IndexOutOfRangeException");
+ }
ind = tree->data.i * tree->right->data.i + G_STRUCT_OFFSET (MonoArray, vector);
- x86_alu_reg_imm (s->code, X86_ADD, tree->left->reg1, ind);
-
- if (tree->reg1 != tree->left->reg1)
- x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
-
+ x86_lea_membase (s->code, tree->reg1, tree->left->reg1, ind);
}
reg: LDELEMA (reg, reg) {
- x86_alu_reg_membase (s->code, X86_CMP, tree->right->reg1, tree->left->reg1, G_STRUCT_OFFSET (MonoArray, max_length));
- EMIT_COND_SYSTEM_EXCEPTION (X86_CC_LT, FALSE, "IndexOutOfRangeException");
+ if (mono_jit_boundcheck){
+ x86_alu_reg_membase (s->code, X86_CMP, tree->right->reg1, tree->left->reg1, G_STRUCT_OFFSET (MonoArray, max_length));
+ EMIT_COND_SYSTEM_EXCEPTION (X86_CC_LT, FALSE, "IndexOutOfRangeException");
+ }
if (tree->data.i == 1 || tree->data.i == 2 ||
tree->data.i == 4 || tree->data.i == 8) {
if (size) {
mono_emit_stack_alloc_const (s, tree, size);
+ if (tree->reg1 != X86_EDI && tree->left->reg1 != X86_EDI) {
+ x86_push_reg (s->code, X86_EDI);
+ offset += 4;
+ }
if (tree->reg1 != X86_EAX && tree->left->reg1 != X86_EAX) {
x86_push_reg (s->code, X86_EAX);
offset += 4;
x86_push_reg (s->code, X86_ECX);
offset += 4;
}
- if (tree->reg1 != X86_EDI && tree->left->reg1 != X86_EDI) {
- x86_push_reg (s->code, X86_EDI);
- offset += 4;
- }
x86_mov_reg_imm (s->code, X86_ECX, size >> 2);
x86_alu_reg_reg (s->code, X86_SUB, X86_EAX, X86_EAX);
x86_alu_membase_imm (s->code, X86_CMP, lreg, G_STRUCT_OFFSET (MonoClass, rank), klass->rank);
EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, FALSE, "InvalidCastException");
- x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, element_class), 4);
+ x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, cast_class), 4);
x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, baseval), 4);
- x86_alu_reg_mem (s->code, X86_SUB, lreg, &klass->element_class->baseval);
- x86_alu_reg_mem (s->code, X86_CMP, lreg, &klass->element_class->diffval);
+ x86_alu_reg_mem (s->code, X86_SUB, lreg, &klass->cast_class->baseval);
+ x86_alu_reg_mem (s->code, X86_CMP, lreg, &klass->cast_class->diffval);
EMIT_COND_SYSTEM_EXCEPTION (X86_CC_LE, FALSE, "InvalidCastException");
} else {
x86_alu_membase_imm (s->code, X86_CMP, lreg, G_STRUCT_OFFSET (MonoClass, rank), klass->rank);
br [1] = s->code; x86_branch8 (s->code, X86_CC_NE, 0, FALSE);
- x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, element_class), 4);
+ x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, cast_class), 4);
x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, baseval), 4);
- x86_alu_reg_mem (s->code, X86_SUB, lreg, &klass->element_class->baseval);
- x86_alu_reg_mem (s->code, X86_CMP, lreg, &klass->element_class->diffval);
+ x86_alu_reg_mem (s->code, X86_SUB, lreg, &klass->cast_class->baseval);
+ x86_alu_reg_mem (s->code, X86_CMP, lreg, &klass->cast_class->diffval);
br [2] = s->code; x86_branch8 (s->code, X86_CC_LE, 0, FALSE);
x86_patch (br [1], s->code);
x86_mov_membase_imm (s->code, X86_ESP, 0, 0, 4);
/* this requires a loop, because fprem1 somtimes
* returns a partial remainder */
l1 = s->code;
- x86_fprem1 (s->code);
+ x86_fprem (s->code);
x86_fnstsw (s->code);
x86_alu_reg_imm (s->code, X86_AND, X86_EAX, 0x0400);
l2 = s->code + 2;
x86_fchs (s->code);
}
-stmt: POP (freg)
+stmt: POP (freg) {
+ x86_fstp (s->code, 0);
+}
stmt: STIND_R4 (addr, freg) {