Making address calculation shared and (maybe) fixing it.
This commit is contained in:
parent
abc5aac7ee
commit
e07ced0f00
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -320,13 +320,13 @@ std::vector<BlockInfo> 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
|
||||
|
|
Loading…
Reference in New Issue