From e07ced0f00a0802a9c4d7ddfd429bc0096fae7df Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Wed, 25 Dec 2013 21:33:15 -0800 Subject: [PATCH] Making address calculation shared and (maybe) fixing it. --- src/alloy/frontend/ppc/ppc_emit_altivec.cc | 28 +- src/alloy/frontend/ppc/ppc_emit_memory.cc | 484 +++++---------------- src/alloy/frontend/ppc/ppc_scanner.cc | 8 +- 3 files changed, 118 insertions(+), 402 deletions(-) diff --git a/src/alloy/frontend/ppc/ppc_emit_altivec.cc b/src/alloy/frontend/ppc/ppc_emit_altivec.cc index 181ba4378..37d2cdf24 100644 --- a/src/alloy/frontend/ppc/ppc_emit_altivec.cc +++ b/src/alloy/frontend/ppc/ppc_emit_altivec.cc @@ -23,6 +23,12 @@ namespace frontend { namespace ppc { +Value* CalculateEA(PPCFunctionBuilder& f, uint32_t ra, uint32_t rb); +Value* CalculateEA_0(PPCFunctionBuilder& f, uint32_t ra, uint32_t rb); +Value* CalculateEA_i(PPCFunctionBuilder& f, uint32_t ra, uint64_t imm); +Value* CalculateEA_0_i(PPCFunctionBuilder& f, uint32_t ra, uint64_t imm); + + #define SHUFPS_SWAP_DWORDS 0x1B @@ -140,7 +146,7 @@ XEEMITTER(lvewx128, VX128_1(4, 131), VX128_1)(PPCFunctionBuilder& f, Inst } int InstrEmit_lvsl_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); Value* sh = f.Truncate(f.And(ea, f.LoadConstant((int64_t)0xF)), INT8_TYPE); Value* v = f.LoadVectorShl(sh); f.StoreVR(vd, v); @@ -154,7 +160,7 @@ XEEMITTER(lvsl128, VX128_1(4, 3), VX128_1)(PPCFunctionBuilder& f, Inst } int InstrEmit_lvsr_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); Value* sh = f.Truncate(f.And(ea, f.LoadConstant((int64_t)0xF)), INT8_TYPE); Value* v = f.LoadVectorShr(sh); f.StoreVR(vd, v); @@ -168,7 +174,7 @@ XEEMITTER(lvsr128, VX128_1(4, 67), VX128_1)(PPCFunctionBuilder& f, Inst } int InstrEmit_lvx_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); f.StoreVR(vd, f.ByteSwap(f.Load(ea, VEC128_TYPE))); return 0; } @@ -186,7 +192,7 @@ XEEMITTER(lvxl128, VX128_1(4, 707), VX128_1)(PPCFunctionBuilder& f, Inst } XEEMITTER(stvebx, 0x7C00010E, X )(PPCFunctionBuilder& f, InstrData& i) { - Value* ea = i.X.RA ? f.Add(f.LoadGPR(i.X.RA), f.LoadGPR(i.X.RB)) : f.LoadGPR(i.X.RB); + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* el = f.And(ea, f.LoadConstant(0xFull)); Value* v = f.Extract(f.LoadVR(i.X.RT), el, INT8_TYPE); f.Store(ea, v); @@ -194,7 +200,7 @@ XEEMITTER(stvebx, 0x7C00010E, X )(PPCFunctionBuilder& f, InstrData& i) } XEEMITTER(stvehx, 0x7C00014E, X )(PPCFunctionBuilder& f, InstrData& i) { - Value* ea = i.X.RA ? f.Add(f.LoadGPR(i.X.RA), f.LoadGPR(i.X.RB)) : f.LoadGPR(i.X.RB); + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); ea = f.And(ea, f.LoadConstant(~0x1ull)); Value* el = f.Shr(f.And(ea, f.LoadConstant(0xFull)), 1); Value* v = f.Extract(f.LoadVR(i.X.RT), el, INT16_TYPE); @@ -203,7 +209,7 @@ XEEMITTER(stvehx, 0x7C00014E, X )(PPCFunctionBuilder& f, InstrData& i) } int InstrEmit_stvewx_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); ea = f.And(ea, f.LoadConstant(~0x3ull)); Value* el = f.Shr(f.And(ea, f.LoadConstant(0xFull)), 2); Value* v = f.Extract(f.LoadVR(vd), el, INT32_TYPE); @@ -218,7 +224,7 @@ XEEMITTER(stvewx128, VX128_1(4, 387), VX128_1)(PPCFunctionBuilder& f, Inst } int InstrEmit_stvx_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); f.Store(ea, f.ByteSwap(f.LoadVR(vd))); return 0; } @@ -238,7 +244,7 @@ XEEMITTER(stvxl128, VX128_1(4, 963), VX128_1)(PPCFunctionBuilder& f, Inst // The lvlx/lvrx/etc instructions are in Cell docs only: // https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/C40E4C6133B31EE8872570B500791108/$file/vector_simd_pem_v_2.07c_26Oct2006_cell.pdf int InstrEmit_lvlx_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); Value* eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstant((int8_t)0xF)); // ea &= ~0xF (load takes care of this) // v = (new << eb) @@ -264,7 +270,7 @@ XEEMITTER(lvlxl128, VX128_1(4, 1539), VX128_1)(PPCFunctionBuilder& f, Inst } int InstrEmit_lvrx_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); Value* eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstant((int8_t)0xF)); // ea &= ~0xF (load takes care of this) // v = (new >> (16 - eb)) @@ -292,7 +298,7 @@ XEEMITTER(lvrxl128, VX128_1(4, 1603), VX128_1)(PPCFunctionBuilder& f, Inst int InstrEmit_stvlx_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { // NOTE: if eb == 0 (so 16b aligned) this equals new_value // we could optimize this to prevent the other load/mask, in that case. - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); Value* eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstant((int8_t)0xF)); Value* new_value = f.LoadVR(vd); // ea &= ~0xF (load takes care of this) @@ -332,7 +338,7 @@ XEEMITTER(stvlxl128, VX128_1(4, 1795), VX128_1)(PPCFunctionBuilder& f, Inst int InstrEmit_stvrx_(PPCFunctionBuilder& f, InstrData& i, uint32_t vd, uint32_t ra, uint32_t rb) { // NOTE: if eb == 0 (so 16b aligned) this equals new_value // we could optimize this to prevent the other load/mask, in that case. - Value* ea = ra ? f.Add(f.LoadGPR(ra), f.LoadGPR(rb)) : f.LoadGPR(rb); + Value* ea = CalculateEA_0(f, ra, rb); Value* eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstant((int8_t)0xF)); Value* new_value = f.LoadVR(vd); // ea &= ~0xF (load takes care of this) diff --git a/src/alloy/frontend/ppc/ppc_emit_memory.cc b/src/alloy/frontend/ppc/ppc_emit_memory.cc index cae80c772..be3ee65c3 100644 --- a/src/alloy/frontend/ppc/ppc_emit_memory.cc +++ b/src/alloy/frontend/ppc/ppc_emit_memory.cc @@ -23,6 +23,39 @@ namespace frontend { namespace ppc { +Value* CalculateEA(PPCFunctionBuilder& f, uint32_t ra, uint32_t rb) { + return f.ZeroExtend(f.Add( + f.Truncate(f.LoadGPR(ra), INT32_TYPE), + f.Truncate(f.LoadGPR(rb), INT32_TYPE)), INT64_TYPE); +} + +Value* CalculateEA_0(PPCFunctionBuilder& f, uint32_t ra, uint32_t rb) { + if (ra) { + return f.ZeroExtend(f.Add( + f.Truncate(f.LoadGPR(ra), INT32_TYPE), + f.Truncate(f.LoadGPR(rb), INT32_TYPE)), INT64_TYPE); + } else { + return f.ZeroExtend(f.Truncate(f.LoadGPR(rb), INT32_TYPE), INT64_TYPE); + } +} + +Value* CalculateEA_i(PPCFunctionBuilder& f, uint32_t ra, uint64_t imm) { + return f.ZeroExtend(f.Add( + f.Truncate(f.LoadGPR(ra), INT32_TYPE), + f.LoadConstant((int32_t)imm)), INT64_TYPE); +} + +Value* CalculateEA_0_i(PPCFunctionBuilder& f, uint32_t ra, uint64_t imm) { + if (ra) { + return f.ZeroExtend(f.Add( + f.Truncate(f.LoadGPR(ra), INT32_TYPE), + f.LoadConstant((int32_t)imm)), INT64_TYPE); + } else { + return f.ZeroExtend(f.LoadConstant((int32_t)imm), INT64_TYPE); + } +} + + // Integer load (A-13) XEEMITTER(lbz, 0x88000000, D )(PPCFunctionBuilder& f, InstrData& i) { @@ -32,14 +65,7 @@ XEEMITTER(lbz, 0x88000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // RT <- i56.0 || MEM(EA, 1) - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.ZeroExtend(f.Load(ea, INT8_TYPE), INT64_TYPE); f.StoreGPR(i.D.RT, rt); return 0; @@ -49,9 +75,7 @@ XEEMITTER(lbzu, 0x8C000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // RT <- i56.0 || MEM(EA, 1) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.ZeroExtend(f.Load(ea, INT8_TYPE), INT64_TYPE); f.StoreGPR(i.D.RT, rt); f.StoreGPR(i.D.RA, ea); @@ -62,9 +86,7 @@ XEEMITTER(lbzux, 0x7C0000EE, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // RT <- i56.0 || MEM(EA, 1) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.Load(ea, INT8_TYPE), INT64_TYPE); f.StoreGPR(i.X.RT, rt); f.StoreGPR(i.X.RA, ea); @@ -78,14 +100,7 @@ XEEMITTER(lbzx, 0x7C0000AE, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- i56.0 || MEM(EA, 1) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.Load(ea, INT8_TYPE), INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -98,14 +113,7 @@ XEEMITTER(lha, 0xA8000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // RT <- EXTS(MEM(EA, 2)) - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE); f.StoreGPR(i.D.RT, rt); return 0; @@ -128,14 +136,7 @@ XEEMITTER(lhax, 0x7C0002AE, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- EXTS(MEM(EA, 2)) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -148,14 +149,7 @@ XEEMITTER(lhz, 0xA0000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // RT <- i48.0 || MEM(EA, 2) - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE); f.StoreGPR(i.D.RT, rt); return 0; @@ -165,9 +159,7 @@ XEEMITTER(lhzu, 0xA4000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // RT <- i48.0 || MEM(EA, 2) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE); f.StoreGPR(i.D.RT, rt); f.StoreGPR(i.D.RA, ea); @@ -178,9 +170,7 @@ XEEMITTER(lhzux, 0x7C00026E, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // RT <- i48.0 || MEM(EA, 2) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE); f.StoreGPR(i.X.RT, rt); f.StoreGPR(i.X.RA, ea); @@ -194,14 +184,7 @@ XEEMITTER(lhzx, 0x7C00022E, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- i48.0 || MEM(EA, 2) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -214,14 +197,7 @@ XEEMITTER(lwa, 0xE8000002, DS )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D || 00) // RT <- EXTS(MEM(EA, 4)) - Value* ea; - if (i.DS.RA) { - ea = f.Add( - f.LoadGPR(i.DS.RA), - f.LoadConstant(XEEXTS16(i.DS.DS << 2))); - } else { - ea = f.LoadConstant(XEEXTS16(i.DS.DS << 2)); - } + Value* ea = CalculateEA_0_i(f, i.DS.RA, XEEXTS16(i.DS.DS << 2)); Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE); f.StoreGPR(i.DS.RT, rt); return 0; @@ -231,9 +207,7 @@ XEEMITTER(lwaux, 0x7C0002EA, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // RT <- EXTS(MEM(EA, 4)) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE); f.StoreGPR(i.X.RT, rt); f.StoreGPR(i.X.RA, ea); @@ -247,14 +221,7 @@ XEEMITTER(lwax, 0x7C0002AA, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- EXTS(MEM(EA, 4)) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -267,14 +234,7 @@ XEEMITTER(lwz, 0x80000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // RT <- i32.0 || MEM(EA, 4) - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE); f.StoreGPR(i.D.RT, rt); return 0; @@ -284,9 +244,7 @@ XEEMITTER(lwzu, 0x84000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // RT <- i32.0 || MEM(EA, 4) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE); f.StoreGPR(i.D.RT, rt); f.StoreGPR(i.D.RA, ea); @@ -297,9 +255,7 @@ XEEMITTER(lwzux, 0x7C00006E, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // RT <- i32.0 || MEM(EA, 4) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE); f.StoreGPR(i.X.RT, rt); f.StoreGPR(i.X.RA, ea); @@ -313,14 +269,7 @@ XEEMITTER(lwzx, 0x7C00002E, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- i32.0 || MEM(EA, 4) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -334,14 +283,7 @@ XEEMITTER(ld, 0xE8000000, DS )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(DS || 0b00) // RT <- MEM(EA, 8) - Value* ea; - if (i.DS.RA) { - ea = f.Add( - f.LoadGPR(i.DS.RA), - f.LoadConstant(XEEXTS16(i.DS.DS << 2))); - } else { - ea = f.LoadConstant(XEEXTS16(i.DS.DS << 2)); - } + Value* ea = CalculateEA_0_i(f, i.DS.RA, XEEXTS16(i.DS.DS << 2)); Value* rt = f.ByteSwap(f.Load(ea, INT64_TYPE)); f.StoreGPR(i.DS.RT, rt); return 0; @@ -351,9 +293,7 @@ XEEMITTER(ldu, 0xE8000001, DS )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(DS || 0b00) // RT <- MEM(EA, 8) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.DS.RA), - f.LoadConstant(XEEXTS16(i.DS.DS << 2))); + Value* ea = CalculateEA_i(f, i.DS.RA, XEEXTS16(i.DS.DS << 2)); Value* rt = f.ByteSwap(f.Load(ea, INT64_TYPE)); f.StoreGPR(i.DS.RT, rt); f.StoreGPR(i.DS.RA, ea); @@ -364,9 +304,7 @@ XEEMITTER(ldux, 0x7C00006A, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // RT <- MEM(EA, 8) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); Value* rt = f.ByteSwap(f.Load(ea, INT64_TYPE)); f.StoreGPR(i.X.RT, rt); f.StoreGPR(i.X.RA, ea); @@ -380,14 +318,7 @@ XEEMITTER(ldx, 0x7C00002A, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- MEM(EA, 8) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ByteSwap(f.Load(ea, INT64_TYPE)); f.StoreGPR(i.X.RT, rt); return 0; @@ -403,14 +334,7 @@ XEEMITTER(stb, 0x98000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // MEM(EA, 1) <- (RS)[56:63] - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.Truncate(f.LoadGPR(i.D.RT), INT8_TYPE)); return 0; } @@ -419,9 +343,7 @@ XEEMITTER(stbu, 0x9C000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // MEM(EA, 1) <- (RS)[56:63] // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.Truncate(f.LoadGPR(i.D.RT), INT8_TYPE)); f.StoreGPR(i.D.RA, ea); return 0; @@ -431,9 +353,7 @@ XEEMITTER(stbux, 0x7C0001EE, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // MEM(EA, 1) <- (RS)[56:63] // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); f.Store(ea, f.Truncate(f.LoadGPR(i.X.RT), INT8_TYPE)); f.StoreGPR(i.X.RA, ea); return 0; @@ -446,14 +366,7 @@ XEEMITTER(stbx, 0x7C0001AE, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 1) <- (RS)[56:63] - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.Truncate(f.LoadGPR(i.X.RT), INT8_TYPE)); return 0; } @@ -465,14 +378,7 @@ XEEMITTER(sth, 0xB0000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // MEM(EA, 2) <- (RS)[48:63] - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT), INT16_TYPE))); return 0; } @@ -481,9 +387,7 @@ XEEMITTER(sthu, 0xB4000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // MEM(EA, 2) <- (RS)[48:63] // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT), INT16_TYPE))); f.StoreGPR(i.D.RA, ea); return 0; @@ -493,9 +397,7 @@ XEEMITTER(sthux, 0x7C00036E, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // MEM(EA, 2) <- (RS)[48:63] // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT16_TYPE))); f.StoreGPR(i.X.RA, ea); return 0; @@ -508,14 +410,7 @@ XEEMITTER(sthx, 0x7C00032E, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 2) <- (RS)[48:63] - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT16_TYPE))); return 0; } @@ -527,14 +422,7 @@ XEEMITTER(stw, 0x90000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // MEM(EA, 4) <- (RS)[32:63] - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT), INT32_TYPE))); return 0; } @@ -543,9 +431,7 @@ XEEMITTER(stwu, 0x94000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // MEM(EA, 4) <- (RS)[32:63] // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT), INT32_TYPE))); f.StoreGPR(i.D.RA, ea); return 0; @@ -555,9 +441,7 @@ XEEMITTER(stwux, 0x7C00016E, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // MEM(EA, 4) <- (RS)[32:63] // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE))); f.StoreGPR(i.X.RA, ea); return 0; @@ -570,14 +454,7 @@ XEEMITTER(stwx, 0x7C00012E, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 4) <- (RS)[32:63] - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE))); return 0; } @@ -589,14 +466,7 @@ XEEMITTER(std, 0xF8000000, DS )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(DS || 0b00) // MEM(EA, 8) <- (RS) - Value* ea; - if (i.DS.RA) { - ea = f.Add( - f.LoadGPR(i.DS.RA), - f.LoadConstant(XEEXTS16(i.DS.DS << 2))); - } else { - ea = f.LoadConstant(XEEXTS16(i.DS.DS << 2)); - } + Value* ea = CalculateEA_0_i(f, i.DS.RA, XEEXTS16(i.DS.DS << 2)); f.Store(ea, f.ByteSwap(f.LoadGPR(i.DS.RT))); return 0; } @@ -605,9 +475,7 @@ XEEMITTER(stdu, 0xF8000001, DS )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(DS || 0b00) // MEM(EA, 8) <- (RS) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.DS.RA), - f.LoadConstant(XEEXTS16(i.DS.DS << 2))); + Value* ea = CalculateEA_i(f, i.DS.RA, XEEXTS16(i.DS.DS << 2)); f.Store(ea, f.ByteSwap(f.LoadGPR(i.DS.RT))); f.StoreGPR(i.DS.RA, ea); return 0; @@ -617,9 +485,7 @@ XEEMITTER(stdux, 0x7C00016A, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // MEM(EA, 8) <- (RS) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.LoadGPR(i.X.RT))); f.StoreGPR(i.X.RA, ea); return 0; @@ -632,14 +498,7 @@ XEEMITTER(stdx, 0x7C00012A, X)(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 8) <- (RS) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.LoadGPR(i.X.RT))); return 0; } @@ -654,14 +513,7 @@ XEEMITTER(lhbrx, 0x7C00062C, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- i48.0 || bswap(MEM(EA, 2)) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.Load(ea, INT16_TYPE), INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -674,14 +526,7 @@ XEEMITTER(lwbrx, 0x7C00042C, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- i32.0 || bswap(MEM(EA, 4)) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.Load(ea, INT32_TYPE), INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -694,14 +539,7 @@ XEEMITTER(ldbrx, 0x7C000428, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // RT <- bswap(MEM(EA, 8)) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.Load(ea, INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -714,14 +552,7 @@ XEEMITTER(sthbrx, 0x7C00072C, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 2) <- bswap((RS)[48:63]) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.Truncate(f.LoadGPR(i.X.RT), INT16_TYPE)); return 0; } @@ -733,14 +564,7 @@ XEEMITTER(stwbrx, 0x7C00052C, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 4) <- bswap((RS)[32:63]) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE)); return 0; } @@ -752,14 +576,7 @@ XEEMITTER(stdbrx, 0x7C000528, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 8) <- bswap(RS) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.LoadGPR(i.X.RT)); return 0; } @@ -831,14 +648,7 @@ XEEMITTER(ldarx, 0x7C0000A8, X )(PPCFunctionBuilder& f, InstrData& i) { // RESERVE_LENGTH <- 8 // RESERVE_ADDR <- real_addr(EA) // RT <- MEM(EA, 8) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ByteSwap(f.LoadAcquire(ea, INT64_TYPE)); f.StoreGPR(i.X.RT, rt); return 0; @@ -854,14 +664,7 @@ XEEMITTER(lwarx, 0x7C000028, X )(PPCFunctionBuilder& f, InstrData& i) { // RESERVE_LENGTH <- 4 // RESERVE_ADDR <- real_addr(EA) // RT <- i32.0 || MEM(EA, 4) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ZeroExtend(f.ByteSwap(f.LoadAcquire(ea, INT32_TYPE)), INT64_TYPE); f.StoreGPR(i.X.RT, rt); return 0; @@ -877,14 +680,7 @@ XEEMITTER(stdcx, 0x7C0001AD, X )(PPCFunctionBuilder& f, InstrData& i) { // MEM(EA, 8) <- (RS) // n <- 1 if store performed // CR0[LT GT EQ SO] = 0b00 || n || XER[SO] - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ByteSwap(f.LoadGPR(i.X.RT)); Value* stored = f.StoreRelease(ea, rt); f.StoreContext(offsetof(PPCContext, cr0.cr0_eq), stored); @@ -901,14 +697,7 @@ XEEMITTER(stwcx, 0x7C00012D, X )(PPCFunctionBuilder& f, InstrData& i) { // MEM(EA, 4) <- (RS)[32:63] // n <- 1 if store performed // CR0[LT GT EQ SO] = 0b00 || n || XER[SO] - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE)); Value* stored = f.StoreRelease(ea, rt); f.StoreContext(offsetof(PPCContext, cr0.cr0_eq), stored); @@ -925,14 +714,7 @@ XEEMITTER(lfd, 0xC8000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // FRT <- MEM(EA, 8) - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.Cast(f.ByteSwap(f.Load(ea, INT64_TYPE)), FLOAT64_TYPE); f.StoreFPR(i.D.RT, rt); return 0; @@ -942,9 +724,7 @@ XEEMITTER(lfdu, 0xCC000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // FRT <- MEM(EA, 8) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.Cast(f.ByteSwap(f.Load(ea, INT64_TYPE)), FLOAT64_TYPE); f.StoreFPR(i.D.RT, rt); f.StoreGPR(i.D.RA, ea); @@ -955,9 +735,7 @@ XEEMITTER(lfdux, 0x7C0004EE, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // FRT <- MEM(EA, 8) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); Value* rt = f.Cast(f.ByteSwap(f.Load(ea, INT64_TYPE)), FLOAT64_TYPE); f.StoreFPR(i.X.RT, rt); f.StoreGPR(i.X.RA, ea); @@ -971,14 +749,7 @@ XEEMITTER(lfdx, 0x7C0004AE, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // FRT <- MEM(EA, 8) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.Cast(f.ByteSwap(f.Load(ea, INT64_TYPE)), FLOAT64_TYPE); f.StoreFPR(i.X.RT, rt); return 0; @@ -991,14 +762,7 @@ XEEMITTER(lfs, 0xC0000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // FRT <- DOUBLE(MEM(EA, 4)) - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.Convert( f.Cast(f.ByteSwap(f.Load(ea, INT32_TYPE)), FLOAT32_TYPE), FLOAT64_TYPE); @@ -1010,9 +774,7 @@ XEEMITTER(lfsu, 0xC4000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // FRT <- DOUBLE(MEM(EA, 4)) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); Value* rt = f.Convert( f.Cast(f.ByteSwap(f.Load(ea, INT32_TYPE)), FLOAT32_TYPE), FLOAT64_TYPE); @@ -1025,9 +787,7 @@ XEEMITTER(lfsux, 0x7C00046E, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // FRT <- DOUBLE(MEM(EA, 4)) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); Value* rt = f.Convert( f.Cast(f.ByteSwap(f.Load(ea, INT32_TYPE)), FLOAT32_TYPE), FLOAT64_TYPE); @@ -1043,14 +803,7 @@ XEEMITTER(lfsx, 0x7C00042E, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // FRT <- DOUBLE(MEM(EA, 4)) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); Value* rt = f.Convert( f.Cast(f.ByteSwap(f.Load(ea, INT32_TYPE)), FLOAT32_TYPE), FLOAT64_TYPE); @@ -1068,14 +821,7 @@ XEEMITTER(stfd, 0xD8000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // MEM(EA, 8) <- (FRS) - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.D.RT), INT64_TYPE))); return 0; } @@ -1084,9 +830,7 @@ XEEMITTER(stfdu, 0xDC000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // MEM(EA, 8) <- (FRS) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.D.RT), INT64_TYPE))); f.StoreGPR(i.D.RA, ea); return 0; @@ -1096,9 +840,7 @@ XEEMITTER(stfdux, 0x7C0005EE, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // MEM(EA, 8) <- (FRS) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.X.RT), INT64_TYPE))); f.StoreGPR(i.X.RA, ea); return 0; @@ -1111,14 +853,7 @@ XEEMITTER(stfdx, 0x7C0005AE, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 8) <- (FRS) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.X.RT), INT64_TYPE))); return 0; } @@ -1130,14 +865,7 @@ XEEMITTER(stfiwx, 0x7C0007AE, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 4) <- (FRS)[32:63] - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.X.RT), INT32_TYPE))); return 0; } @@ -1149,14 +877,7 @@ XEEMITTER(stfs, 0xD0000000, D )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + EXTS(D) // MEM(EA, 4) <- SINGLE(FRS) - Value* ea; - if (i.D.RA) { - ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); - } else { - ea = f.LoadConstant(XEEXTS16(i.D.DS)); - } + Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.ByteSwap(f.Cast( f.Convert(f.LoadFPR(i.D.RT), FLOAT32_TYPE), INT32_TYPE))); return 0; @@ -1166,9 +887,7 @@ XEEMITTER(stfsu, 0xD4000000, D )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + EXTS(D) // MEM(EA, 4) <- SINGLE(FRS) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.D.RA), - f.LoadConstant(XEEXTS16(i.D.DS))); + Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS)); f.Store(ea, f.ByteSwap(f.Cast( f.Convert(f.LoadFPR(i.D.RT), FLOAT32_TYPE), INT32_TYPE))); f.StoreGPR(i.D.RA, ea); @@ -1179,9 +898,7 @@ XEEMITTER(stfsux, 0x7C00056E, X )(PPCFunctionBuilder& f, InstrData& i) { // EA <- (RA) + (RB) // MEM(EA, 4) <- SINGLE(FRS) // RA <- EA - Value* ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); + Value* ea = CalculateEA(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Cast( f.Convert(f.LoadFPR(i.X.RT), FLOAT32_TYPE), INT32_TYPE))); f.StoreGPR(i.X.RA, ea); @@ -1195,14 +912,7 @@ XEEMITTER(stfsx, 0x7C00052E, X )(PPCFunctionBuilder& f, InstrData& i) { // b <- (RA) // EA <- b + (RB) // MEM(EA, 4) <- SINGLE(FRS) - Value* ea; - if (i.X.RA) { - ea = f.Add( - f.LoadGPR(i.X.RA), - f.LoadGPR(i.X.RB)); - } else { - ea = f.LoadGPR(i.X.RB); - } + Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB); f.Store(ea, f.ByteSwap(f.Cast( f.Convert(f.LoadFPR(i.X.RT), FLOAT32_TYPE), INT32_TYPE))); return 0; diff --git a/src/alloy/frontend/ppc/ppc_scanner.cc b/src/alloy/frontend/ppc/ppc_scanner.cc index cab6894e9..d9f636263 100644 --- a/src/alloy/frontend/ppc/ppc_scanner.cc +++ b/src/alloy/frontend/ppc/ppc_scanner.cc @@ -320,13 +320,13 @@ std::vector PPCScanner::FindBlocks(FunctionInfo* symbol_info) { ends_block = true; } else if (i.type->opcode == 0x48000000) { // b/ba/bl/bla - uint32_t target = - (uint32_t)XEEXTS26(i.I.LI << 2) + (i.I.AA ? 0 : (int32_t)address); + //uint32_t target = + // (uint32_t)XEEXTS26(i.I.LI << 2) + (i.I.AA ? 0 : (int32_t)address); ends_block = true; } else if (i.type->opcode == 0x40000000) { // bc/bca/bcl/bcla - uint32_t target = - (uint32_t)XEEXTS16(i.B.BD << 2) + (i.B.AA ? 0 : (int32_t)address); + //uint32_t target = + // (uint32_t)XEEXTS16(i.B.BD << 2) + (i.B.AA ? 0 : (int32_t)address); ends_block = true; } else if (i.type->opcode == 0x4C000020) { // bclr/bclrl