conversion and implement LADD/LSUB.
* exceptions-s390.c: Standardize mono_arch_find_jit_info to match other
architectures.
svn path=/trunk/mono/; revision=55125
+2006-01-05 Neale Ferguson <neale@sinenomine.net>
+
+ * mini-s390.c, mini-s390.h, inssel-s390.brg, cpu-s390.md: Fix r8 to unsigned int
+ conversion and implement LADD/LSUB.
+
+ * exceptions-s390.c: Standardize mono_arch_find_jit_info to match other
+ architectures.
+
2006-01-05 Neale Ferguson <neale@sinenomine.net>
* mini-s390x.c, mini-s390x.h: Fix r8 to unsigned int conversion.
loadu4_membase: dest:i src1:b len:18
local:
localloc: dest:i src1:i len:62
-long_add:
+long_add: len: 18 dest:l src1:l src2:i clob:1
long_add_imm:
long_add_ovf_un: len:22 dest:l src1:l src2:i clob:1
long_add_ovf: len:28 dest:l src1:l src2:i clob:1
long_shr_imm:
long_shr_un:
long_shr_un_imm:
-long_sub:
+long_sub: len: 18 dest:l src1:l src2:i clob:1
long_sub_imm:
long_sub_ovf_un: len:22 dest:l src1:l src2:i clob:1
long_sub_ovf: len:36 dest:l src1:l src2:i clob:1
*managed = FALSE;
if (ji != NULL) {
- char *source_location, *tmpaddr, *fname;
- gint32 address, iloffset;
+ gint32 address;
*new_ctx = *ctx;
if (!ji->method->wrapper_type)
*managed = TRUE;
- if (trace) {
- source_location = mono_debug_source_location_from_address (ji->method, address, NULL, domain);
- iloffset = mono_debug_il_offset_from_address (ji->method, address, domain);
-
- if (iloffset < 0)
- tmpaddr = g_strdup_printf ("<0x%08x>", address);
- else
- tmpaddr = g_strdup_printf ("[0x%08x]", iloffset);
-
- fname = mono_method_full_name (ji->method, TRUE);
-
- if (source_location)
- *trace = g_strdup_printf ("in %s (at %s) %s", tmpaddr, source_location, fname);
- else
- *trace = g_strdup_printf ("in %s %s", tmpaddr, fname);
-
- g_free (fname);
- g_free (source_location);
- g_free (tmpaddr);
- }
sframe = (MonoS390StackFrame *) MONO_CONTEXT_GET_SP (ctx);
MONO_CONTEXT_SET_BP (new_ctx, sframe->prev);
sframe = (MonoS390StackFrame *) sframe->prev;
if (!(*lmf)->method)
return (gpointer)-1;
- if (trace)
- *trace = g_strdup_printf ("in (unmanaged) %s", mono_method_full_name ((*lmf)->method, TRUE));
-
if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
memset (res, 0, sizeof (MonoJitInfo));
mono_bblock_add_inst (s->cbb, tree);
}
+lreg: OP_LADD (lreg, lreg),
lreg: OP_LADD_OVF (lreg, lreg),
lreg: OP_LADD_OVF_UN (lreg, lreg),
+lreg: OP_LSUB (lreg, lreg),
lreg: OP_LSUB_OVF (lreg, lreg),
lreg: OP_LSUB_OVF_UN (lreg, lreg) "0" {
MONO_EMIT_NEW_UNALU (s, OP_SETREG, s390_r0, state->left->reg1);
mono_bblock_add_inst (s->cbb, tree);
}
+lreg: OP_LADD (lreg, i8con) "0" {
+ MONO_EMIT_NEW_ICONST (s, s390_r0, state->right->tree->inst_ls_word);
+ MONO_EMIT_NEW_ICONST (s, s390_r1, state->right->tree->inst_ms_word);
+ tree->dreg = state->reg1;
+ tree->sreg1 = state->left->reg1;
+ tree->sreg2 = state->left->reg2;
+ mono_bblock_add_inst (s->cbb, tree);
+}
+
+lreg: OP_LSUB (lreg, i8con) "0" {
+ int rh,rl;
+
+ MONO_EMIT_NEW_UNALU (s, OP_SETREG, s390_r0, state->left->reg1);
+ MONO_EMIT_NEW_UNALU (s, OP_SETREG, s390_r1, state->left->reg2);
+ rh = mono_regstate_next_int (s->rs);
+ MONO_EMIT_NEW_ICONST (s, rh, state->right->tree->inst_ls_word);
+ rl = mono_regstate_next_int (s->rs);
+ MONO_EMIT_NEW_ICONST (s, rl, state->right->tree->inst_ms_word);
+ tree->dreg = state->reg1;
+ tree->sreg1 = rh;
+ tree->sreg2 = rl;
+ mono_bblock_add_inst (s->cbb, tree);
+}
+
reg: CEE_ADD_OVF (reg, reg) "0" {
MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
}
if (start_reg != STK_BASE) {
MONO_OUTPUT_VTR (s, size, start_reg, STK_BASE, soffset);
} else {
+ treg = mono_regstate_next_int (s->rs);
MONO_OUTPUT_VTS (s, size, STK_BASE, soffset, treg,
state->left->tree->inst_offset);
- treg = mono_regstate_next_int (s->rs);
MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, treg, STK_BASE,
s->stack_offset);
}
break;
}
} else {
+ short *o[1];
s390_basr (code, s390_r13, 0);
s390_j (code, 10);
s390_llong (code, 0x41e0000000000000);
s390_llong (code, 0x41f0000000000000);
s390_ldr (code, s390_f15, sreg);
- s390_cdb (code, s390_f15, 0, s390_r13, 0);
- s390_jl (code, 10);
- s390_sdb (code, s390_f15, 0, s390_r13, 8);
+ s390_cdb (code, s390_f15, 0, s390_r13, 4);
+ s390_jl (code, 0); CODEPTR(code, o[0]);
+ s390_sdb (code, s390_f15, 0, s390_r13, 12);
s390_cfdbr (code, dreg, 7, s390_f15);
s390_j (code, 4);
+ PTRSLOT(code, o[0]);
s390_cfdbr (code, dreg, 5, sreg);
switch (size) {
case 1:
EMIT_COND_SYSTEM_EXCEPTION (S390_CC_CY, "OverflowException");
}
break;
+ case OP_LADD: {
+ short int *o[1];
+ s390_alr (code, s390_r0, ins->sreg1);
+ s390_jnc (code, 4);
+ s390_ahi (code, s390_r1, 1);
+ s390_ar (code, s390_r1, ins->sreg2);
+ s390_lr (code, ins->dreg, s390_r0);
+ s390_lr (code, ins->dreg+1, s390_r1);
+ }
+ break;
case OP_LADD_OVF: {
short int *o[1];
s390_alr (code, s390_r0, ins->sreg1);
EMIT_COND_SYSTEM_EXCEPTION (S390_CC_NC, "OverflowException");
}
break;
+ case OP_LSUB: {
+ s390_lr (code, s390_r14, ins->sreg2);
+ s390_slr (code, s390_r0, ins->sreg1);
+ s390_jnl (code, 4);
+ s390_ahi (code, s390_r14, 1);
+ s390_sr (code, s390_r1, s390_r14);
+ s390_lr (code, ins->dreg, s390_r0);
+ s390_lr (code, ins->dreg+1, s390_r1);
+ }
+ break;
case OP_LSUB_OVF: {
- short int *o[3];
+ short int *o[1];
s390_lr (code, s390_r14, ins->sreg2);
s390_slr (code, s390_r0, ins->sreg1);
s390_jnl (code, 0); CODEPTR(code, o[0]);
#define MONO_ARCH_USE_SIGACTION 1
// #define CUSTOM_STACK_WALK 1
// #define CUSTOM_EXCEPTION_HANDLING 1
-#define mono_find_jit_info mono_arch_find_jit_info
+// #define mono_find_jit_info mono_arch_find_jit_info
#define S390_STACK_ALIGNMENT 8
#define S390_FIRST_ARG_REG s390_r2