From c0af43433829021e1702fb401291791afdc18dd3 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Mon, 2 Feb 2009 23:32:58 +0000 Subject: [PATCH] 2009-02-02 Mark Probst Contributed under the terms of the MIT/X11 license by Steven Munroe . * ppc/ppc-codegen.h: Make operand order and case consistent (assembler order) for ppc_load_reg_update, ppc_load_multiple_regs, ppc_store_multiple_regs, ppc_lwz, ppc_lhz, ppc_lbz, ppc_stw,ppc_sth, ppc_stb, ppc_stwu, ppc_lbzu, ppc_lfdu, ppc_lfsu, ppc_lfsux, ppc_lfsx, ppc_lha, ppc_lhau, ppc_lhzu, ppc_lmw, ppc_lwzu, ppc_stbu, ppc_stfdu, ppc_stfsu, ppc_sthu, ppc_stmw. Use "i" or "ui" instead of "d" for immediated operands to immediate arthimetic and logical instructions in macros ppc_addi, ppc_addis, ppc_ori, ppc_addic, ppc_addicd, ppc_andid, ppc_andisd. [__mono_ppc64__]: Make operand order and case consistent (assembler order) for ppc_load_multiple_regs, ppc_store_multiple_regs. Simplify the DS form and make them consistent with D forms for ppc_load_reg, ppc_load_reg_update, ppc_store_reg, ppc_store_reg_update. ppc_ld, ppc_lwa, ppc_ldu, ppc_std, ppc_stdu. Define ppc_lwax and ppc_lwaux. 2009-02-02 Mark Probst Contributed under the terms of the MIT/X11 license by Steven Munroe . * exceptions-ppc.c (restore_regs_from_context): Correct operand order (offset then base reg) for ppc_load_multiple_regs. (emit_save_saved_regs) Correct operand order for ppc_store_multiple_regs. (mono_arch_get_call_filter): Correct operand order for ppc_load_multiple_regs. * mini-ppc.c (emit_memcpy): Fix operand order for ppc_load_reg_update and ppc_store_reg_update. (mono_arch_output_basic_block): Correct operand order for ppc_lha. (mono_arch_emit_epilog): Correct operand order for ppc_load_multiple_regs. * tramp-ppc.c (mono_arch_create_trampoline_code): Correct operand order for ppc_store_multiple_regs and ppc_load_multiple_regs. svn path=/trunk/mono/; revision=125443 --- mono/arch/ChangeLog | 21 +++++++++ mono/arch/ppc/ppc-codegen.h | 103 +++++++++++++++++++++++++------------------- mono/mini/ChangeLog | 21 +++++++++ mono/mini/exceptions-ppc.c | 6 +-- mono/mini/mini-ppc.c | 8 ++-- mono/mini/tramp-ppc.c | 4 +- 6 files changed, 109 insertions(+), 54 deletions(-) diff --git a/mono/arch/ChangeLog b/mono/arch/ChangeLog index f76c0b5b678..ceef7ffde0c 100644 --- a/mono/arch/ChangeLog +++ b/mono/arch/ChangeLog @@ -1,3 +1,24 @@ +2009-02-02 Mark Probst + + Contributed under the terms of the MIT/X11 license by Steven + Munroe . + + * ppc/ppc-codegen.h: Make operand order and case consistent + (assembler order) for ppc_load_reg_update, ppc_load_multiple_regs, + ppc_store_multiple_regs, ppc_lwz, ppc_lhz, ppc_lbz, + ppc_stw,ppc_sth, ppc_stb, ppc_stwu, ppc_lbzu, ppc_lfdu, ppc_lfsu, + ppc_lfsux, ppc_lfsx, ppc_lha, ppc_lhau, ppc_lhzu, ppc_lmw, + ppc_lwzu, ppc_stbu, ppc_stfdu, ppc_stfsu, ppc_sthu, ppc_stmw. Use + "i" or "ui" instead of "d" for immediated operands to immediate + arthimetic and logical instructions in macros ppc_addi, ppc_addis, + ppc_ori, ppc_addic, ppc_addicd, ppc_andid, ppc_andisd. + [__mono_ppc64__]: Make operand order and case consistent + (assembler order) for ppc_load_multiple_regs, + ppc_store_multiple_regs. Simplify the DS form and make them + consistent with D forms for ppc_load_reg, ppc_load_reg_update, + ppc_store_reg, ppc_store_reg_update. ppc_ld, ppc_lwa, ppc_ldu, + ppc_std, ppc_stdu. Define ppc_lwax and ppc_lwaux. + 2009-01-19 Rodrigo Kumpera * x86/x86-codegen.h: Add x86_movd_xreg_membase. diff --git a/mono/arch/ppc/ppc-codegen.h b/mono/arch/ppc/ppc-codegen.h index f1552a448c0..08bb9e43b2f 100644 --- a/mono/arch/ppc/ppc-codegen.h +++ b/mono/arch/ppc/ppc-codegen.h @@ -125,7 +125,7 @@ enum { #define ppc_emit32(c,x) do { *((guint32 *) (c)) = x; (c) = (gpointer)((guint8 *)(c) + sizeof (guint32));} while (0) -#define ppc_is_imm16(val) ((glong)(val) >= (glong)-(1L<<15) && (glong)(val) <= (glong)((1L<<15)-1L)) +#define ppc_is_imm16(val) ((((val)>> 15) == 0) || (((val)>> 15) == -1)) #define ppc_is_uimm16(val) ((glong)(val) >= 0L && (glong)(val) <= 65535L) #define ppc_load32(c,D,v) G_STMT_START { \ @@ -150,16 +150,16 @@ enum { #define ppc_load_func(c,D,V) ppc_load_sequence ((c), (D), (V)) #define ppc_load_reg(c,D,d,A) ppc_lwz ((c), (D), (d), (A)) -#define ppc_load_reg_update(c,D,d,A) ppc_lwzu ((c), (D), (A), (d)) +#define ppc_load_reg_update(c,D,d,A) ppc_lwzu ((c), (D), (d), (A)) #define ppc_load_reg_indexed(c,D,A,B) ppc_lwzx ((c), (D), (A), (B)) #define ppc_load_reg_update_indexed(c,D,A,B) ppc_lwzux ((c), (D), (A), (B)) -#define ppc_load_multiple_regs(c,D,A,d) ppc_lmw ((c), (D), (A), (d)) +#define ppc_load_multiple_regs(c,D,d,A) ppc_lmw ((c), (D), (d), (A)) #define ppc_store_reg(c,S,d,A) ppc_stw ((c), (S), (d), (A)) #define ppc_store_reg_update(c,S,d,A) ppc_stwu ((c), (S), (d), (A)) #define ppc_store_reg_indexed(c,S,A,B) ppc_stwx ((c), (S), (A), (B)) #define ppc_store_reg_update_indexed(c,S,A,B) ppc_stwux ((c), (S), (A), (B)) -#define ppc_store_multiple_regs(c,S,A,D) ppc_stmw ((c), (S), (A), (D)) +#define ppc_store_multiple_regs(c,S,d,A) ppc_stmw ((c), (S), (d), (A)) #define ppc_compare(c,cfrD,A,B) ppc_cmp((c), (cfrD), 0, (A), (B)) #define ppc_compare_reg_imm(c,cfrD,A,B) ppc_cmpi((c), (cfrD), 0, (A), (B)) @@ -183,20 +183,20 @@ enum { #define ppc_split_5_1(x) ((ppc_split_5_1_5(x) << 1) | ppc_split_5_1_1(x)) #define ppc_break(c) ppc_tw((c),31,0,0) -#define ppc_addi(c,D,A,d) ppc_emit32 (c, (14 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) -#define ppc_addis(c,D,A,d) ppc_emit32 (c, (15 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) +#define ppc_addi(c,D,A,i) ppc_emit32 (c, (14 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(i)) +#define ppc_addis(c,D,A,i) ppc_emit32 (c, (15 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(i)) #define ppc_li(c,D,v) ppc_addi (c, D, 0, (guint16)(v)) #define ppc_lis(c,D,v) ppc_addis (c, D, 0, (guint16)(v)) -#define ppc_lwz(c,D,d,a) ppc_emit32 (c, (32 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d)) -#define ppc_lhz(c,D,d,a) ppc_emit32 (c, (40 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d)) -#define ppc_lbz(c,D,d,a) ppc_emit32 (c, (34 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d)) -#define ppc_stw(c,S,d,a) ppc_emit32 (c, (36 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d)) -#define ppc_sth(c,S,d,a) ppc_emit32 (c, (44 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d)) -#define ppc_stb(c,S,d,a) ppc_emit32 (c, (38 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d)) -#define ppc_stwu(c,s,d,a) ppc_emit32 (c, (37 << 26) | ((s) << 21) | ((a) << 16) | (guint16)(d)) +#define ppc_lwz(c,D,d,A) ppc_emit32 (c, (32 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) +#define ppc_lhz(c,D,d,A) ppc_emit32 (c, (40 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) +#define ppc_lbz(c,D,d,A) ppc_emit32 (c, (34 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) +#define ppc_stw(c,S,d,A) ppc_emit32 (c, (36 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(d)) +#define ppc_sth(c,S,d,A) ppc_emit32 (c, (44 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(d)) +#define ppc_stb(c,S,d,A) ppc_emit32 (c, (38 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(d)) +#define ppc_stwu(c,s,d,A) ppc_emit32 (c, (37 << 26) | ((s) << 21) | ((A) << 16) | (guint16)(d)) #define ppc_or(c,a,s,b) ppc_emit32 (c, (31 << 26) | ((s) << 21) | ((a) << 16) | ((b) << 11) | 888) #define ppc_mr(c,a,s) ppc_or (c, a, s, s) -#define ppc_ori(c,S,A,u) ppc_emit32 (c, (24 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(u)) +#define ppc_ori(c,S,A,ui) ppc_emit32 (c, (24 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(ui)) #define ppc_nop(c) ppc_ori (c, 0, 0, 0) #define ppc_mfspr(c,D,spr) ppc_emit32 (c, (31 << 26) | ((D) << 21) | ((spr) << 11) | (339 << 1)) #define ppc_mflr(c,D) ppc_mfspr (c, D, ppc_lr) @@ -257,8 +257,8 @@ my and Ximian's copyright to this code. ;) #define ppc_addeo(c,D,A,B) ppc_addex(c,D,A,B,1,0) #define ppc_addeod(c,D,A,B) ppc_addex(c,D,A,B,1,1) -#define ppc_addic(c,D,A,d) ppc_emit32(c, (12 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) -#define ppc_addicd(c,D,A,d) ppc_emit32(c, (13 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) +#define ppc_addic(c,D,A,i) ppc_emit32(c, (12 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(i)) +#define ppc_addicd(c,D,A,i) ppc_emit32(c, (13 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(i)) #define ppc_addmex(c,D,A,OE,RC) ppc_emit32(c, (31 << 26) | ((D) << 21 ) | ((A) << 16) | (0 << 11) | ((OE) << 10) | (234 << 1) | RC) #define ppc_addme(c,D,A) ppc_addmex(c,D,A,0,0) @@ -280,8 +280,8 @@ my and Ximian's copyright to this code. ;) #define ppc_andc(c,S,A,B) ppc_andcx(c,S,A,B,0) #define ppc_andcd(c,S,A,B) ppc_andcx(c,S,A,B,1) -#define ppc_andid(c,S,A,d) ppc_emit32(c, (28 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(d))) -#define ppc_andisd(c,S,A,d) ppc_emit32(c, (29 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(d))) +#define ppc_andid(c,S,A,ui) ppc_emit32(c, (28 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(ui))) +#define ppc_andisd(c,S,A,ui) ppc_emit32(c, (29 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(ui))) #define ppc_bcx(c,BO,BI,BD,AA,LK) ppc_emit32(c, (16 << 26) | (BO << 21 )| (BI << 16) | (BD << 2) | ((AA) << 1) | LK) #define ppc_bc(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,0,0) @@ -477,36 +477,36 @@ my and Ximian's copyright to this code. ;) #define ppc_isync(c) ppc_emit32(c, (19 << 26) | (0 << 11) | (150 << 1) | 0) -#define ppc_lbzu(c,D,A,d) ppc_emit32(c, (35 << 26) | (D << 21) | (A << 16) | (guint16)d) +#define ppc_lbzu(c,D,d,A) ppc_emit32(c, (35 << 26) | (D << 21) | (A << 16) | (guint16)d) #define ppc_lbzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (119 << 1) | 0) #define ppc_lbzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (87 << 1) | 0) -#define ppc_lfdu(c,D,A,d) ppc_emit32(c, (51 << 26) | (D << 21) | (A << 16) | (guint16)d) +#define ppc_lfdu(c,D,d,A) ppc_emit32(c, (51 << 26) | (D << 21) | (A << 16) | (guint16)d) #define ppc_lfdux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (631 << 1) | 0) #define ppc_lfdx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (599 << 1) | 0) -#define ppc_lfsu(c,D,A,d) ppc_emit32(c, (49 << 26) | (D << 21) | (A << 16) | (guint16)d) -#define ppc_lfsux(c,D,A,d) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (567 << 1) | 0) -#define ppc_lfsx(c,D,A,d) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (535 << 1) | 0) +#define ppc_lfsu(c,D,d,A) ppc_emit32(c, (49 << 26) | (D << 21) | (A << 16) | (guint16)d) +#define ppc_lfsux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (567 << 1) | 0) +#define ppc_lfsx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (535 << 1) | 0) -#define ppc_lha(c,D,A,d) ppc_emit32(c, (42 << 26) | (D << 21) | (A << 16) | (guint16)d) -#define ppc_lhau(c,D,A,d) ppc_emit32(c, (43 << 26) | (D << 21) | (A << 16) | (guint16)d) +#define ppc_lha(c,D,d,A) ppc_emit32(c, (42 << 26) | (D << 21) | (A << 16) | (guint16)d) +#define ppc_lhau(c,D,d,A) ppc_emit32(c, (43 << 26) | (D << 21) | (A << 16) | (guint16)d) #define ppc_lhaux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (375 << 1) | 0) #define ppc_lhax(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (343 << 1) | 0) #define ppc_lhbrx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (790 << 1) | 0) -#define ppc_lhzu(c,D,A,d) ppc_emit32(c, (41 << 26) | (D << 21) | (A << 16) | (guint16)d) +#define ppc_lhzu(c,D,d,A) ppc_emit32(c, (41 << 26) | (D << 21) | (A << 16) | (guint16)d) #define ppc_lhzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (311 << 1) | 0) #define ppc_lhzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (279 << 1) | 0) -#define ppc_lmw(c,D,A,d) ppc_emit32(c, (46 << 26) | (D << 21) | (A << 16) | (guint16)d) +#define ppc_lmw(c,D,d,A) ppc_emit32(c, (46 << 26) | (D << 21) | (A << 16) | (guint16)d) #define ppc_lswi(c,D,A,NB) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (NB << 11) | (597 << 1) | 0) #define ppc_lswx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (533 << 1) | 0) #define ppc_lwarx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (20 << 1) | 0) #define ppc_lwbrx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (534 << 1) | 0) -#define ppc_lwzu(c,D,A,d) ppc_emit32(c, (33 << 26) | (D << 21) | (A << 16) | (guint16)d) +#define ppc_lwzu(c,D,d,A) ppc_emit32(c, (33 << 26) | (D << 21) | (A << 16) | (guint16)d) #define ppc_lwzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (55 << 1) | 0) #define ppc_lwzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (23 << 1) | 0) @@ -628,24 +628,24 @@ my and Ximian's copyright to this code. ;) #define ppc_srw(c,A,S,B) ppc_srwx(c,A,S,B,0) #define ppc_srwd(c,A,S,B) ppc_srwx(c,A,S,B,1) -#define ppc_stbu(c,S,A,D) ppc_emit32(c, (39 << 26) | (S << 21) | (A << 16) | (guint16)(D)) +#define ppc_stbu(c,S,d,A) ppc_emit32(c, (39 << 26) | (S << 21) | (A << 16) | (guint16)(d)) #define ppc_stbux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (247 << 1) | 0) #define ppc_stbx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (215 << 1) | 0) -#define ppc_stfdu(c,S,A,D) ppc_emit32(c, (55 << 26) | (S << 21) | (A << 16) | (guint16)(D)) +#define ppc_stfdu(c,S,d,A) ppc_emit32(c, (55 << 26) | (S << 21) | (A << 16) | (guint16)(d)) #define ppc_stfdx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (727 << 1) | 0) #define ppc_stfiwx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (983 << 1) | 0) -#define ppc_stfsu(c,S,A,D) ppc_emit32(c, (53 << 26) | (S << 21) | (A << 16) | (guint16)(D)) +#define ppc_stfsu(c,S,d,A) ppc_emit32(c, (53 << 26) | (S << 21) | (A << 16) | (guint16)(d)) #define ppc_stfsux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (695 << 1) | 0) #define ppc_stfsx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (663 << 1) | 0) #define ppc_sthbrx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (918 << 1) | 0) -#define ppc_sthu(c,S,A,D) ppc_emit32(c, (45 << 26) | (S << 21) | (A << 16) | (guint16)(D)) +#define ppc_sthu(c,S,d,A) ppc_emit32(c, (45 << 26) | (S << 21) | (A << 16) | (guint16)(d)) #define ppc_sthux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (439 << 1) | 0) #define ppc_sthx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (407 << 1) | 0) -#define ppc_stmw(c,S,A,D) ppc_emit32(c, (47 << 26) | (S << 21) | (A << 16) | (guint16)D) +#define ppc_stmw(c,S,d,A) ppc_emit32(c, (47 << 26) | (S << 21) | (A << 16) | (guint16)d) #define ppc_stswi(c,S,A,NB) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (NB << 11) | (725 << 1) | 0) #define ppc_stswx(c,S,A,NB) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (NB << 11) | (661 << 1) | 0) #define ppc_stwbrx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (662 << 1) | 0) @@ -718,13 +718,23 @@ my and Ximian's copyright to this code. ;) #define PPC_LOAD_SEQUENCE_LENGTH 20 -#define ppc_is_imm32(val) ((glong)(val) >= (glong)-(1L<<31) && (glong)(val) <= (glong)((1L<<31)-1)) +#define ppc_is_imm32(val) (((((long)val)>> 31) == 0) || ((((long)val)>> 31) == -1)) +#define ppc_is_imm48(val) (((((long)val)>> 47) == 0) || ((((long)val)>> 47) == -1)) + +#define ppc_load48(c,D,v) G_STMT_START { \ + ppc_li ((c), (D), ((gint64)(v) >> 32) & 0xffff); \ + ppc_sldi ((c), (D), (D), 32); \ + ppc_oris ((c), (D), (D), ((guint64)(v) >> 16) & 0xffff); \ + ppc_ori ((c), (D), (D), (guint64)(v) & 0xffff); \ + } G_STMT_END #define ppc_load(c,D,v) G_STMT_START { \ if (ppc_is_imm16 ((gulong)(v))) { \ ppc_li ((c), (D), (guint16)(guint64)(v)); \ } else if (ppc_is_imm32 ((gulong)(v))) { \ ppc_load32 ((c), (D), (guint32)(guint64)(v)); \ + } else if (ppc_is_imm48 ((gulong)(v))) { \ + ppc_load48 ((c), (D), (guint64)(v)); \ } else { \ ppc_load_sequence ((c), (D), (guint64)(v)); \ } \ @@ -736,11 +746,11 @@ my and Ximian's copyright to this code. ;) ppc_load_reg ((c), (D), 0, ppc_r11); \ } G_STMT_END -#define ppc_load_reg(c,D,d,A) ppc_ld ((c), (D), (d) >> 2, (A)) -#define ppc_load_reg_update(c,D,d,A) ppc_ldu ((c), (D), (d) >> 2, (A)) +#define ppc_load_reg(c,D,d,A) ppc_ld ((c), (D), (d), (A)) +#define ppc_load_reg_update(c,D,d,A) ppc_ldu ((c), (D), (d), (A)) #define ppc_load_reg_indexed(c,D,A,B) ppc_ldx ((c), (D), (A), (B)) #define ppc_load_reg_update_indexed(c,D,A,B) ppc_ldux ((c), (D), (A), (B)) -#define ppc_load_multiple_regs(c,D,A,d) G_STMT_START { \ +#define ppc_load_multiple_regs(c,D,d,A) G_STMT_START { \ int __i, __o = (d); \ for (__i = (D); __i <= 31; ++__i) { \ ppc_load_reg ((c), __i, __o, (A)); \ @@ -748,12 +758,12 @@ my and Ximian's copyright to this code. ;) } \ } G_STMT_END -#define ppc_store_reg(c,S,d,A) ppc_std ((c), (S), (d) >> 2, (A)) -#define ppc_store_reg_update(c,S,d,A) ppc_stdu ((c), (S), (d) >> 2, (A)) +#define ppc_store_reg(c,S,d,A) ppc_std ((c), (S), (d), (A)) +#define ppc_store_reg_update(c,S,d,A) ppc_stdu ((c), (S), (d), (A)) #define ppc_store_reg_indexed(c,S,A,B) ppc_stdx ((c), (S), (A), (B)) #define ppc_store_reg_update_indexed(c,S,A,B) ppc_stdux ((c), (S), (A), (B)) -#define ppc_store_multiple_regs(c,S,A,D) G_STMT_START { \ - int __i, __o = (D); \ +#define ppc_store_multiple_regs(c,S,d,A) G_STMT_START { \ + int __i, __o = (d); \ for (__i = (S); __i <= 31; ++__i) { \ ppc_store_reg ((c), __i, __o, (A)); \ __o += sizeof (gulong); \ @@ -802,11 +812,14 @@ my and Ximian's copyright to this code. ;) #define ppc_fctidz(c,D,B) ppc_fctidzx(c,D,B,0) #define ppc_fctidzd(c,D,B) ppc_fctidzx(c,D,B,1) -#define ppc_ld(c,D,ds,A) ppc_emit32(c, (58 << 26) | ((D) << 21) | ((A) << 16) | (guint16)((ds) << 2) | 0) +#define ppc_ld(c,D,ds,A) ppc_emit32(c, (58 << 26) | ((D) << 21) | ((A) << 16) | ((guint32)(ds) & 0xfffc) | 0) +#define ppc_lwa(c,D,ds,A) ppc_emit32(c, (58 << 26) | ((D) << 21) | ((A) << 16) | ((ds) & 0xfffc) | 2) #define ppc_ldarx(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (84 << 1) | 0) -#define ppc_ldu(c,D,ds,A) ppc_emit32(c, (58 << 26) | ((D) << 21) | ((A) << 16) | (guint16)((ds) << 2) | 1) +#define ppc_ldu(c,D,ds,A) ppc_emit32(c, (58 << 26) | ((D) << 21) | ((A) << 16) | ((guint32)(ds) & 0xfffc) | 1) #define ppc_ldux(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (53 << 1) | 0) +#define ppc_lwaux(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (373 << 1) | 0) #define ppc_ldx(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (21 << 1) | 0) +#define ppc_lwax(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (341 << 1) | 0) #define ppc_mulhdx(c,D,A,B,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (0 << 10) | (73 << 1) | (Rc)) #define ppc_mulhd(c,D,A,B) ppc_mulhdx(c,D,A,B,0) @@ -871,9 +884,9 @@ my and Ximian's copyright to this code. ;) #define ppc_srd(c,A,S,B) ppc_srdx(c,S,A,B,0) #define ppc_srdd(c,A,S,B) ppc_srdx(c,S,A,B,1) -#define ppc_std(c,S,ds,A) ppc_emit32(c, (62 << 26) | ((S) << 21) | ((A) << 16) | (guint16)((ds) << 2) | 0) +#define ppc_std(c,S,ds,A) ppc_emit32(c, (62 << 26) | ((S) << 21) | ((A) << 16) | ((guint32)(ds) & 0xfffc) | 0) #define ppc_stdcxd(c,S,A,B) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (214 << 1) | 1) -#define ppc_stdu(c,S,ds,A) ppc_emit32(c, (62 << 26) | ((S) << 21) | ((A) << 16) | (guint16)((ds) << 2) | 1) +#define ppc_stdu(c,S,ds,A) ppc_emit32(c, (62 << 26) | ((S) << 21) | ((A) << 16) | ((guint32)(ds) & 0xfffc) | 1) #define ppc_stdux(c,S,A,B) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (181 << 1) | 0) #define ppc_stdx(c,S,A,B) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (149 << 1) | 0) diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index c7ca7005dc0..89730ebd266 100644 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,5 +1,26 @@ 2009-02-02 Mark Probst + Contributed under the terms of the MIT/X11 license by Steven + Munroe . + + * exceptions-ppc.c (restore_regs_from_context): Correct operand + order (offset then base reg) for ppc_load_multiple_regs. + (emit_save_saved_regs) Correct operand order for + ppc_store_multiple_regs. + (mono_arch_get_call_filter): Correct operand order for + ppc_load_multiple_regs. + + * mini-ppc.c (emit_memcpy): Fix operand order for + ppc_load_reg_update and ppc_store_reg_update. + (mono_arch_output_basic_block): Correct operand order for ppc_lha. + (mono_arch_emit_epilog): Correct operand order for + ppc_load_multiple_regs. + + * tramp-ppc.c (mono_arch_create_trampoline_code): Correct operand + order for ppc_store_multiple_regs and ppc_load_multiple_regs. + +2009-02-02 Mark Probst + * cpu-ppc64.md: Fixed storer4_memindex length. 2009-02-02 Zoltan Varga diff --git a/mono/mini/exceptions-ppc.c b/mono/mini/exceptions-ppc.c index 6cb794d3b0b..9e3286837fe 100644 --- a/mono/mini/exceptions-ppc.c +++ b/mono/mini/exceptions-ppc.c @@ -164,7 +164,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; #define restore_regs_from_context(ctx_reg,ip_reg,tmp_reg) do { \ int reg; \ ppc_load_reg (code, ip_reg, G_STRUCT_OFFSET (MonoContext, sc_ir), ctx_reg); \ - ppc_load_multiple_regs (code, ppc_r13, ctx_reg, G_STRUCT_OFFSET (MonoContext, regs)); \ + ppc_load_multiple_regs (code, ppc_r13, G_STRUCT_OFFSET (MonoContext, regs), ctx_reg); \ for (reg = 0; reg < MONO_SAVED_FREGS; ++reg) { \ ppc_lfd (code, (14 + reg), \ G_STRUCT_OFFSET(MonoContext, fregs) + reg * sizeof (gdouble), ctx_reg); \ @@ -239,7 +239,7 @@ emit_save_saved_regs (guint8 *code, int pos) ppc_stfd (code, i, pos, ppc_sp); } pos -= sizeof (gpointer) * MONO_SAVED_GREGS; - ppc_store_multiple_regs (code, ppc_r13, ppc_sp, pos); + ppc_store_multiple_regs (code, ppc_r13, pos, ppc_sp); return code; } @@ -299,7 +299,7 @@ mono_arch_get_call_filter (void) ppc_lfd (code, i, pos, ppc_sp); } pos -= sizeof (gpointer) * MONO_SAVED_GREGS; - ppc_load_multiple_regs (code, ppc_r13, ppc_sp, pos); + ppc_load_multiple_regs (code, ppc_r13, pos, ppc_sp); ppc_addic (code, ppc_sp, ppc_sp, alloc_size); ppc_blr (code); diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c index de5070441e5..e7c65a73926 100644 --- a/mono/mini/mini-ppc.c +++ b/mono/mini/mini-ppc.c @@ -146,8 +146,8 @@ emit_memcpy (guint8 *code, int size, int dreg, int doffset, int sreg, int soffse ppc_addi (code, ppc_r12, dreg, (doffset - sizeof (gpointer))); ppc_addi (code, ppc_r11, sreg, (soffset - sizeof (gpointer))); copy_loop_start = code; - ppc_load_reg_update (code, ppc_r0, sizeof (gpointer), ppc_r11); - ppc_store_reg_update (code, ppc_r0, sizeof (gpointer), ppc_r12); + ppc_load_reg_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r11); + ppc_store_reg_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r12); copy_loop_jump = code; ppc_bc (code, PPC_BR_DEC_CTR_NONZERO, 0, 0); ppc_patch (copy_loop_jump, copy_loop_start); @@ -3144,7 +3144,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_LOADI2_MEMBASE: if (ppc_is_imm16 (ins->inst_offset)) { - ppc_lha (code, ins->dreg, ins->inst_basereg, ins->inst_offset); + ppc_lha (code, ins->dreg, ins->inst_offset, ins->inst_basereg); } else { ppc_load (code, ppc_r0, ins->inst_offset); ppc_lhax (code, ins->dreg, ins->inst_basereg, ppc_r0); @@ -4782,7 +4782,7 @@ mono_arch_emit_epilog (MonoCompile *cfg) * we didn't actually change them (idea from Zoltan). */ /* restore iregs */ - ppc_load_multiple_regs (code, ppc_r13, ppc_r11, G_STRUCT_OFFSET(MonoLMF, iregs)); + ppc_load_multiple_regs (code, ppc_r13, G_STRUCT_OFFSET(MonoLMF, iregs), ppc_r11); /* restore fregs */ /*for (i = 14; i < 32; i++) { ppc_lfd (code, i, G_STRUCT_OFFSET(MonoLMF, fregs) + ((i-14) * sizeof (gdouble)), ppc_r11); diff --git a/mono/mini/tramp-ppc.c b/mono/mini/tramp-ppc.c index 94708f4c1e4..6a86ceea3ca 100644 --- a/mono/mini/tramp-ppc.c +++ b/mono/mini/tramp-ppc.c @@ -193,7 +193,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) * now the integer registers. */ offset = STACK - sizeof (MonoLMF) + G_STRUCT_OFFSET (MonoLMF, iregs); - ppc_store_multiple_regs (buf, ppc_r13, ppc_r1, offset); + ppc_store_multiple_regs (buf, ppc_r13, offset, ppc_r1); /* Now save the rest of the registers below the MonoLMF struct, first 14 * fp regs and then the 13 gregs. @@ -296,7 +296,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) /* *(lmf_addr) = previous_lmf */ ppc_store_reg (buf, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r6); /* restore iregs */ - ppc_load_multiple_regs (buf, ppc_r13, ppc_r11, G_STRUCT_OFFSET(MonoLMF, iregs)); + ppc_load_multiple_regs (buf, ppc_r13, G_STRUCT_OFFSET(MonoLMF, iregs), ppc_r11); /* restore fregs */ for (i = 14; i < 32; i++) ppc_lfd (buf, i, G_STRUCT_OFFSET(MonoLMF, fregs) + ((i-14) * sizeof (gdouble)), ppc_r11); -- 2.11.4.GIT