Cleaning up instruction decoding names to match the docs better.

This commit is contained in:
Ben Vanik 2013-01-25 23:45:13 -08:00
parent ffdc1e5d4b
commit 9b3d96a8ae
4 changed files with 160 additions and 168 deletions

View File

@ -73,82 +73,74 @@ typedef struct {
// kXEPPCInstrFormatI
struct {
// TODO(benvanik): doc format update
uint32_t LK : 1;
uint32_t AA : 1;
uint32_t LI : 24;
uint32_t OPCD : 6;
uint32_t : 6;
} I;
// kXEPPCInstrFormatB
struct {
// TODO(benvanik): doc format update
uint32_t LK : 1;
uint32_t AA : 1;
uint32_t BD : 14;
uint32_t BI : 5;
uint32_t BO : 5;
uint32_t OPCD : 6;
uint32_t : 6;
} B;
// kXEPPCInstrFormatSC
// kXEPPCInstrFormatD
struct {
// TODO(benvanik): doc format update
uint32_t SIMM : 16;
uint32_t A : 5;
uint32_t D : 5;
uint32_t OPCD : 6;
uint32_t DS : 16;
uint32_t RA : 5;
uint32_t RT : 5;
uint32_t : 6;
} D;
// kXEPPCInstrFormatDS
struct {
// TODO(benvanik): doc format update
uint32_t : 2;
uint32_t ds : 14;
uint32_t A : 5;
uint32_t S : 5;
uint32_t OPCD : 6;
uint32_t DS : 14;
uint32_t RA : 5;
uint32_t RT : 5;
uint32_t : 6;
} DS;
// kXEPPCInstrFormatX
struct {
// TODO(benvanik): doc format update
uint32_t Rc : 1;
uint32_t : 10;
uint32_t B : 5;
uint32_t A : 5;
uint32_t D : 5;
uint32_t OPCD : 6;
uint32_t RB : 5;
uint32_t RA : 5;
uint32_t RT : 5;
uint32_t : 6;
} X;
// kXEPPCInstrFormatXL
struct {
// TODO(benvanik): doc format update
uint32_t LK : 1;
uint32_t : 10;
uint32_t BB : 5;
uint32_t BI : 5;
uint32_t BO : 5;
uint32_t OPCD : 6;
uint32_t : 6;
} XL;
// kXEPPCInstrFormatXFX
struct {
// TODO(benvanik): doc format update
uint32_t : 1;
uint32_t : 10;
uint32_t spr : 10;
uint32_t D : 5;
uint32_t OPCD : 6;
uint32_t RT : 5;
uint32_t : 6;
} XFX;
// kXEPPCInstrFormatXFL
// kXEPPCInstrFormatXS
// kXEPPCInstrFormatXO
struct {
// TODO(benvanik): doc format update
uint32_t Rc : 1;
uint32_t : 8;
uint32_t OE : 1;
uint32_t B : 5;
uint32_t A : 5;
uint32_t D : 5;
uint32_t OPCD : 6;
uint32_t RB : 5;
uint32_t RA : 5;
uint32_t RT : 5;
uint32_t : 6;
} XO;
// kXEPPCInstrFormatA
// kXEPPCInstrFormatM
@ -159,7 +151,7 @@ typedef struct {
uint32_t SH : 5;
uint32_t RA : 5;
uint32_t RS : 5;
uint32_t OPCD : 6;
uint32_t : 6;
} M;
// kXEPPCInstrFormatMD
// kXEPPCInstrFormatMDS

View File

@ -40,8 +40,8 @@ XEEMITTER(addx, 0x7C000214, XO )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = b.CreateAdd(g.gpr_value(i.XO.A), g.gpr_value(i.XO.B));
g.update_gpr_value(i.XO.D, v);
Value* v = b.CreateAdd(g.gpr_value(i.XO.RA), g.gpr_value(i.XO.RB));
g.update_gpr_value(i.XO.RT, v);
return 0;
}
@ -60,11 +60,11 @@ XEEMITTER(addi, 0x38000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// if RA = 0 then RT <- EXTS(SI)
// else RT <- (RA) + EXTS(SI)
Value* v = b.getInt64(XEEXTS16(i.D.SIMM));
if (i.D.A) {
v = b.CreateAdd(g.gpr_value(i.D.A), v);
Value* v = b.getInt64(XEEXTS16(i.D.DS));
if (i.D.RA) {
v = b.CreateAdd(g.gpr_value(i.D.RA), v);
}
g.update_gpr_value(i.D.D, v);
g.update_gpr_value(i.D.RT, v);
return 0;
}
@ -83,11 +83,11 @@ XEEMITTER(addis, 0x3C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// if RA = 0 then RT <- EXTS(SI) || i16.0
// else RT <- (RA) + EXTS(SI) || i16.0
Value* v = b.getInt64(XEEXTS16(i.D.SIMM) << 16);
if (i.D.A) {
v = b.CreateAdd(g.gpr_value(i.D.A), v);
Value* v = b.getInt64(XEEXTS16(i.D.DS) << 16);
if (i.D.RA) {
v = b.CreateAdd(g.gpr_value(i.D.RA), v);
}
g.update_gpr_value(i.D.D, v);
g.update_gpr_value(i.D.RT, v);
return 0;
}
@ -134,8 +134,8 @@ XEEMITTER(divwux, 0x7C000396, XO )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* dividend = b.CreateTrunc(g.gpr_value(i.XO.A), b.getInt32Ty());
Value* divisor = b.CreateTrunc(g.gpr_value(i.XO.B), b.getInt32Ty());
Value* dividend = b.CreateTrunc(g.gpr_value(i.XO.RA), b.getInt32Ty());
Value* divisor = b.CreateTrunc(g.gpr_value(i.XO.RB), b.getInt32Ty());
Value* v = b.CreateUDiv(dividend, divisor);
v = b.CreateZExt(v, b.getInt64Ty());
@ -175,8 +175,8 @@ XEEMITTER(mulli, 0x1C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// overflows. It should be truncating the result, but I'm not sure what LLVM
// does.
Value* v = b.CreateMul(g.gpr_value(i.D.A), b.getInt64(XEEXTS16(i.D.SIMM)));
g.update_gpr_value(i.D.D, b.CreateTrunc(v, b.getInt64Ty()));
Value* v = b.CreateMul(g.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
g.update_gpr_value(i.D.RT, b.CreateTrunc(v, b.getInt64Ty()));
return 0;
}
@ -195,9 +195,9 @@ XEEMITTER(mullwx, 0x7C0001D6, XO )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = b.CreateMul(b.CreateSExt(g.gpr_value(i.XO.A), b.getInt64Ty()),
b.CreateSExt(g.gpr_value(i.XO.B), b.getInt64Ty()));
g.update_gpr_value(i.XO.D, v);
Value* v = b.CreateMul(b.CreateSExt(g.gpr_value(i.XO.RA), b.getInt64Ty()),
b.CreateSExt(g.gpr_value(i.XO.RB), b.getInt64Ty()));
g.update_gpr_value(i.XO.RT, v);
return 0;
}
@ -276,11 +276,11 @@ XEEMITTER(cmp, 0x7C000000, X )(FunctionGenerator& g, IRBuilder<>& b, I
// c <- 0b001
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
uint32_t BF = i.X.D >> 2;
uint32_t L = i.X.D & 1;
uint32_t BF = i.X.RT >> 2;
uint32_t L = i.X.RT & 1;
Value* lhs = g.gpr_value(i.X.A);
Value* rhs = g.gpr_value(i.X.B);
Value* lhs = g.gpr_value(i.X.RA);
Value* rhs = g.gpr_value(i.X.RB);
if (!L) {
// 32-bit - truncate and sign extend.
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
@ -307,17 +307,17 @@ XEEMITTER(cmpi, 0x2C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// c <- 0b001
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
uint32_t BF = i.D.D >> 2;
uint32_t L = i.D.D & 1;
uint32_t BF = i.D.RT >> 2;
uint32_t L = i.D.RT & 1;
Value* lhs = g.gpr_value(i.D.A);
Value* lhs = g.gpr_value(i.D.RA);
if (!L) {
// 32-bit - truncate and sign extend.
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
lhs = b.CreateSExt(lhs, b.getInt64Ty());
}
Value* rhs = b.getInt64(XEEXTS16(i.D.SIMM));
Value* rhs = b.getInt64(XEEXTS16(i.D.DS));
XeEmitCompareCore(g, b, lhs, rhs, BF, true);
return 0;
@ -338,11 +338,11 @@ XEEMITTER(cmpl, 0x7C000040, X )(FunctionGenerator& g, IRBuilder<>& b, I
// c <- 0b001
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
uint32_t BF = i.X.D >> 2;
uint32_t L = i.X.D & 1;
uint32_t BF = i.X.RT >> 2;
uint32_t L = i.X.RT & 1;
Value* lhs = g.gpr_value(i.X.A);
Value* rhs = g.gpr_value(i.X.B);
Value* lhs = g.gpr_value(i.X.RA);
Value* rhs = g.gpr_value(i.X.RB);
if (!L) {
// 32-bit - truncate and zero extend.
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
@ -369,17 +369,17 @@ XEEMITTER(cmpli, 0x28000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// c <- 0b001
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
uint32_t BF = i.D.D >> 2;
uint32_t L = i.D.D & 1;
uint32_t BF = i.D.RT >> 2;
uint32_t L = i.D.RT & 1;
Value* lhs = g.gpr_value(i.D.A);
Value* lhs = g.gpr_value(i.D.RA);
if (!L) {
// 32-bit - truncate and zero extend.
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
lhs = b.CreateZExt(lhs, b.getInt64Ty());
}
Value* rhs = b.getInt64(i.D.SIMM);
Value* rhs = b.getInt64(i.D.DS);
XeEmitCompareCore(g, b, lhs, rhs, BF, false);
return 0;
@ -397,8 +397,8 @@ XEEMITTER(andx, 0x7C000038, X )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = b.CreateAnd(g.gpr_value(i.X.D), g.gpr_value(i.X.B));
g.update_gpr_value(i.X.A, v);
Value* v = b.CreateAnd(g.gpr_value(i.X.RT), g.gpr_value(i.X.RB));
g.update_gpr_value(i.X.RA, v);
return 0;
}
@ -412,9 +412,9 @@ XEEMITTER(andcx, 0x7C000078, X )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = b.CreateXor(g.gpr_value(i.X.B), -1);
v = b.CreateAnd(g.gpr_value(i.X.D), v);
g.update_gpr_value(i.X.A, v);
Value* v = b.CreateXor(g.gpr_value(i.X.RB), -1);
v = b.CreateAnd(g.gpr_value(i.X.RT), v);
g.update_gpr_value(i.X.RA, v);
return 0;
}
@ -422,8 +422,8 @@ XEEMITTER(andcx, 0x7C000078, X )(FunctionGenerator& g, IRBuilder<>& b, I
XEEMITTER(andix, 0x70000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
// RA <- (RS) & (i48.0 || UI)
Value* v = b.CreateAnd(g.gpr_value(i.D.D), (uint64_t)i.D.SIMM);
g.update_gpr_value(i.D.A, v);
Value* v = b.CreateAnd(g.gpr_value(i.D.RT), (uint64_t)i.D.DS);
g.update_gpr_value(i.D.RA, v);
// TODO(benvanik): update cr0
XEINSTRNOTIMPLEMENTED();
@ -434,8 +434,8 @@ XEEMITTER(andix, 0x70000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
XEEMITTER(andisx, 0x74000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
// RA <- (RS) & (i32.0 || UI || i16.0)
Value* v = b.CreateAnd(g.gpr_value(i.D.D), ((uint64_t)i.D.SIMM) << 16);
g.update_gpr_value(i.D.A, v);
Value* v = b.CreateAnd(g.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
g.update_gpr_value(i.D.RA, v);
// TODO(benvanik): update cr0
XEINSTRNOTIMPLEMENTED();
@ -460,7 +460,7 @@ XEEMITTER(cntlzwx, 0x7C000034, X )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = g.gpr_value(i.X.D);
Value* v = g.gpr_value(i.X.RT);
v = b.CreateTrunc(v, b.getInt32Ty());
std::vector<Type*> arg_types;
@ -470,7 +470,7 @@ XEEMITTER(cntlzwx, 0x7C000034, X )(FunctionGenerator& g, IRBuilder<>& b, I
Value* count = b.CreateCall2(ctlz, v, b.getInt1(1));
count = b.CreateZExt(count, b.getInt64Ty());
g.update_gpr_value(i.X.A, count);
g.update_gpr_value(i.X.RA, count);
return 0;
}
@ -490,10 +490,10 @@ XEEMITTER(extsbx, 0x7C000774, X )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = g.gpr_value(i.X.D);
Value* v = g.gpr_value(i.X.RT);
v = b.CreateTrunc(v, b.getInt8Ty());
v = b.CreateSExt(v, b.getInt64Ty());
g.update_gpr_value(i.X.A, v);
g.update_gpr_value(i.X.RA, v);
return 0;
}
@ -522,9 +522,9 @@ XEEMITTER(norx, 0x7C0000F8, X )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = b.CreateOr(g.gpr_value(i.X.D), g.gpr_value(i.X.B));
Value* v = b.CreateOr(g.gpr_value(i.X.RT), g.gpr_value(i.X.RB));
v = b.CreateXor(v, -1);
g.update_gpr_value(i.X.A, v);
g.update_gpr_value(i.X.RA, v);
return 0;
}
@ -538,8 +538,8 @@ XEEMITTER(orx, 0x7C000378, X )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = b.CreateOr(g.gpr_value(i.X.D), g.gpr_value(i.X.B));
g.update_gpr_value(i.X.A, v);
Value* v = b.CreateOr(g.gpr_value(i.X.RT), g.gpr_value(i.X.RB));
g.update_gpr_value(i.X.RA, v);
return 0;
}
@ -552,8 +552,8 @@ XEEMITTER(orcx, 0x7C000338, X )(FunctionGenerator& g, IRBuilder<>& b, I
XEEMITTER(ori, 0x60000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
// RA <- (RS) | (i48.0 || UI)
Value* v = b.CreateOr(g.gpr_value(i.D.D), (uint64_t)i.D.SIMM);
g.update_gpr_value(i.D.A, v);
Value* v = b.CreateOr(g.gpr_value(i.D.RT), (uint64_t)i.D.DS);
g.update_gpr_value(i.D.RA, v);
return 0;
}
@ -561,8 +561,8 @@ XEEMITTER(ori, 0x60000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
XEEMITTER(oris, 0x64000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
// RA <- (RS) | (i32.0 || UI || i16.0)
Value* v = b.CreateOr(g.gpr_value(i.D.D), ((uint64_t)i.D.SIMM) << 16);
g.update_gpr_value(i.D.A, v);
Value* v = b.CreateOr(g.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
g.update_gpr_value(i.D.RA, v);
return 0;
}
@ -576,8 +576,8 @@ XEEMITTER(xorx, 0x7C000278, X )(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
Value* v = b.CreateXor(g.gpr_value(i.X.D), g.gpr_value(i.X.B));
g.update_gpr_value(i.X.A, v);
Value* v = b.CreateXor(g.gpr_value(i.X.RT), g.gpr_value(i.X.RB));
g.update_gpr_value(i.X.RA, v);
return 0;
}
@ -585,8 +585,8 @@ XEEMITTER(xorx, 0x7C000278, X )(FunctionGenerator& g, IRBuilder<>& b, I
XEEMITTER(xori, 0x68000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
// RA <- (RS) XOR (i48.0 || UI)
Value* v = b.CreateXor(g.gpr_value(i.D.D), (uint64_t)i.D.SIMM);
g.update_gpr_value(i.D.A, v);
Value* v = b.CreateXor(g.gpr_value(i.D.RT), (uint64_t)i.D.DS);
g.update_gpr_value(i.D.RA, v);
return 0;
}
@ -594,8 +594,8 @@ XEEMITTER(xori, 0x68000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
XEEMITTER(xoris, 0x6C000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
// RA <- (RS) XOR (i32.0 || UI || i16.0)
Value* v = b.CreateXor(g.gpr_value(i.D.D), ((uint64_t)i.D.SIMM) << 16);
g.update_gpr_value(i.D.A, v);
Value* v = b.CreateXor(g.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
g.update_gpr_value(i.D.RA, v);
return 0;
}

View File

@ -493,7 +493,7 @@ XEEMITTER(mfspr, 0x7C0002A6, XFX)(FunctionGenerator& g, IRBuilder<>& b, I
return 1;
}
g.update_gpr_value(i.XFX.D, v);
g.update_gpr_value(i.XFX.RT, v);
return 0;
}
@ -515,7 +515,7 @@ XEEMITTER(mtspr, 0x7C0003A6, XFX)(FunctionGenerator& g, IRBuilder<>& b, I
// else
// SPR(n) <- (RS)[32:63]
Value* v = g.gpr_value(i.XFX.D);
Value* v = g.gpr_value(i.XFX.RT);
const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);
switch (n) {

View File

@ -32,12 +32,12 @@ XEEMITTER(lbz, 0x88000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + EXTS(D)
// RT <- i56.0 || MEM(EA, 1)
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
if (i.D.A) {
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
if (i.D.RA) {
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
}
Value* v = g.ReadMemory(ea, 1, false);
g.update_gpr_value(i.D.D, v);
g.update_gpr_value(i.D.RT, v);
return 0;
}
@ -47,10 +47,10 @@ XEEMITTER(lbzu, 0x8C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// RT <- i56.0 || MEM(EA, 1)
// RA <- EA
Value* ea = b.CreateAdd(g.gpr_value(i.D.A), b.getInt64(XEEXTS16(i.D.SIMM)));
Value* ea = b.CreateAdd(g.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
Value* v = g.ReadMemory(ea, 1, false);
g.update_gpr_value(i.D.D, v);
g.update_gpr_value(i.D.A, ea);
g.update_gpr_value(i.D.RT, v);
g.update_gpr_value(i.D.RA, ea);
return 0;
}
@ -60,10 +60,10 @@ XEEMITTER(lbzux, 0x7C0000EE, X )(FunctionGenerator& g, IRBuilder<>& b, I
// RT <- i56.0 || MEM(EA, 1)
// RA <- EA
Value* ea = b.CreateAdd(g.gpr_value(i.X.A), g.gpr_value(i.X.B));
Value* ea = b.CreateAdd(g.gpr_value(i.X.RA), g.gpr_value(i.X.RB));
Value* v = g.ReadMemory(ea, 1, false);
g.update_gpr_value(i.X.D, v);
g.update_gpr_value(i.X.A, ea);
g.update_gpr_value(i.X.RT, v);
g.update_gpr_value(i.X.RA, ea);
return 0;
}
@ -76,12 +76,12 @@ XEEMITTER(lbzx, 0x7C0000AE, X )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + (RB)
// RT <- i56.0 || MEM(EA, 1)
Value* ea = g.gpr_value(i.X.B);
if (i.X.A) {
ea = b.CreateAdd(g.gpr_value(i.X.A), ea);
Value* ea = g.gpr_value(i.X.RB);
if (i.X.RA) {
ea = b.CreateAdd(g.gpr_value(i.X.RA), ea);
}
Value* v = g.ReadMemory(ea, 1, false);
g.update_gpr_value(i.X.D, v);
g.update_gpr_value(i.X.RT, v);
return 0;
}
@ -94,12 +94,12 @@ XEEMITTER(ld, 0xE8000000, DS )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + EXTS(DS || 0b00)
// RT <- MEM(EA, 8)
Value* ea = b.getInt64(XEEXTS16(i.DS.ds << 2));
if (i.DS.A) {
ea = b.CreateAdd(g.gpr_value(i.DS.A), ea);
Value* ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
if (i.DS.RA) {
ea = b.CreateAdd(g.gpr_value(i.DS.RA), ea);
}
Value* v = g.ReadMemory(ea, 8, false);
g.update_gpr_value(i.DS.S, v);
g.update_gpr_value(i.DS.RT, v);
return 0;
}
@ -109,11 +109,11 @@ XEEMITTER(ldu, 0xE8000001, DS )(FunctionGenerator& g, IRBuilder<>& b, I
// RT <- MEM(EA, 8)
// RA <- EA
Value* ea = b.CreateAdd(g.gpr_value(i.DS.A),
b.getInt64(XEEXTS16(i.DS.ds << 2)));
Value* ea = b.CreateAdd(g.gpr_value(i.DS.RA),
b.getInt64(XEEXTS16(i.DS.DS << 2)));
Value* v = g.ReadMemory(ea, 8, false);
g.update_gpr_value(i.DS.S, v);
g.update_gpr_value(i.DS.A, ea);
g.update_gpr_value(i.DS.RT, v);
g.update_gpr_value(i.DS.RA, ea);
return 0;
}
@ -156,12 +156,12 @@ XEEMITTER(lhz, 0xA0000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + EXTS(D)
// RT <- i48.0 || MEM(EA, 2)
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
if (i.D.A) {
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
if (i.D.RA) {
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
}
Value* v = g.ReadMemory(ea, 2, false);
g.update_gpr_value(i.D.D, v);
g.update_gpr_value(i.D.RT, v);
return 0;
}
@ -204,12 +204,12 @@ XEEMITTER(lwz, 0x80000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + EXTS(D)
// RT <- i32.0 || MEM(EA, 4)
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
if (i.D.A) {
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
if (i.D.RA) {
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
}
Value* v = g.ReadMemory(ea, 4, false);
g.update_gpr_value(i.D.D, v);
g.update_gpr_value(i.D.RT, v);
return 0;
}
@ -219,10 +219,10 @@ XEEMITTER(lwzu, 0x84000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// RT <- i32.0 || MEM(EA, 4)
// RA <- EA
Value* ea = b.CreateAdd(g.gpr_value(i.D.A), b.getInt64(XEEXTS16(i.D.SIMM)));
Value* ea = b.CreateAdd(g.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
Value* v = g.ReadMemory(ea, 4, false);
g.update_gpr_value(i.D.D, v);
g.update_gpr_value(i.D.A, ea);
g.update_gpr_value(i.D.RT, v);
g.update_gpr_value(i.D.RA, ea);
return 0;
}
@ -240,12 +240,12 @@ XEEMITTER(lwzx, 0x7C00002E, X )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + (RB)
// RT <- i32.0 || MEM(EA, 4)
Value* ea = g.gpr_value(i.X.B);
if (i.X.A) {
ea = b.CreateAdd(g.gpr_value(i.X.A), ea);
Value* ea = g.gpr_value(i.X.RB);
if (i.X.RA) {
ea = b.CreateAdd(g.gpr_value(i.X.RA), ea);
}
Value* v = g.ReadMemory(ea, 4, false);
g.update_gpr_value(i.X.D, v);
g.update_gpr_value(i.X.RT, v);
return 0;
}
@ -261,11 +261,11 @@ XEEMITTER(stb, 0x98000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + EXTS(D)
// MEM(EA, 1) <- (RS)[56:63]
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
if (i.D.A) {
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
if (i.D.RA) {
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
}
Value* v = g.gpr_value(i.D.D);
Value* v = g.gpr_value(i.D.RT);
g.WriteMemory(ea, 1, v);
return 0;
@ -276,10 +276,10 @@ XEEMITTER(stbu, 0x9C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// MEM(EA, 1) <- (RS)[56:63]
// RA <- EA
Value* ea = b.CreateAdd(g.gpr_value(i.D.A), b.getInt64(XEEXTS16(i.D.SIMM)));
Value* v = g.gpr_value(i.D.D);
Value* ea = b.CreateAdd(g.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
Value* v = g.gpr_value(i.D.RT);
g.WriteMemory(ea, 1, v);
g.update_gpr_value(i.D.A, ea);
g.update_gpr_value(i.D.RA, ea);
return 0;
}
@ -302,11 +302,11 @@ XEEMITTER(std, 0xF8000000, DS )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + EXTS(DS || 0b00)
// MEM(EA, 8) <- (RS)
Value* ea = b.getInt64(XEEXTS16(i.DS.ds << 2));
if (i.DS.A) {
ea = b.CreateAdd(g.gpr_value(i.DS.A), ea);
Value* ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
if (i.DS.RA) {
ea = b.CreateAdd(g.gpr_value(i.DS.RA), ea);
}
Value* v = g.gpr_value(i.DS.S);
Value* v = g.gpr_value(i.DS.RT);
g.WriteMemory(ea, 8, v);
return 0;
@ -317,11 +317,11 @@ XEEMITTER(stdu, 0xF8000001, DS )(FunctionGenerator& g, IRBuilder<>& b, I
// MEM(EA, 8) <- (RS)
// RA <- EA
Value* ea = b.CreateAdd(g.gpr_value(i.DS.A),
b.getInt64(XEEXTS16(i.DS.ds << 2)));
Value* v = g.gpr_value(i.DS.S);
Value* ea = b.CreateAdd(g.gpr_value(i.DS.RA),
b.getInt64(XEEXTS16(i.DS.DS << 2)));
Value* v = g.gpr_value(i.DS.RT);
g.WriteMemory(ea, 8, v);
g.update_gpr_value(i.DS.A, ea);
g.update_gpr_value(i.DS.RA, ea);
return 0;
}
@ -344,11 +344,11 @@ XEEMITTER(sth, 0xB0000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + EXTS(D)
// MEM(EA, 2) <- (RS)[48:63]
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
if (i.D.A) {
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
if (i.D.RA) {
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
}
Value* v = g.gpr_value(i.D.D);
Value* v = g.gpr_value(i.D.RT);
g.WriteMemory(ea, 2, v);
return 0;
@ -359,11 +359,11 @@ XEEMITTER(sthu, 0xB4000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// MEM(EA, 2) <- (RS)[48:63]
// RA <- EA
Value* ea = b.CreateAdd(g.gpr_value(i.D.A),
b.getInt64(XEEXTS16(i.D.SIMM)));
Value* v = g.gpr_value(i.D.D);
Value* ea = b.CreateAdd(g.gpr_value(i.D.RA),
b.getInt64(XEEXTS16(i.D.DS)));
Value* v = g.gpr_value(i.D.RT);
g.WriteMemory(ea, 2, v);
g.update_gpr_value(i.D.A, ea);
g.update_gpr_value(i.D.RA, ea);
return 0;
}
@ -381,11 +381,11 @@ XEEMITTER(sthx, 0x7C00032E, X )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + (RB)
// MEM(EA, 2) <- (RS)[48:63]
Value* ea = g.gpr_value(i.X.B);
if (i.D.A) {
ea = b.CreateAdd(g.gpr_value(i.X.A), ea);
Value* ea = g.gpr_value(i.X.RB);
if (i.D.RA) {
ea = b.CreateAdd(g.gpr_value(i.X.RA), ea);
}
Value* v = g.gpr_value(i.X.D);
Value* v = g.gpr_value(i.X.RT);
g.WriteMemory(ea, 2, v);
return 0;
@ -399,11 +399,11 @@ XEEMITTER(stw, 0x90000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + EXTS(D)
// MEM(EA, 4) <- (RS)[32:63]
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
if (i.D.A) {
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
if (i.D.RA) {
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
}
Value* v = g.gpr_value(i.D.D);
Value* v = g.gpr_value(i.D.RT);
g.WriteMemory(ea, 4, v);
return 0;
@ -414,11 +414,11 @@ XEEMITTER(stwu, 0x94000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
// MEM(EA, 4) <- (RS)[32:63]
// RA <- EA
Value* ea = b.CreateAdd(g.gpr_value(i.D.A),
b.getInt64(XEEXTS16(i.D.SIMM)));
Value* v = g.gpr_value(i.D.D);
Value* ea = b.CreateAdd(g.gpr_value(i.D.RA),
b.getInt64(XEEXTS16(i.D.DS)));
Value* v = g.gpr_value(i.D.RT);
g.WriteMemory(ea, 4, v);
g.update_gpr_value(i.D.A, ea);
g.update_gpr_value(i.D.RA, ea);
return 0;
}
@ -436,11 +436,11 @@ XEEMITTER(stwx, 0x7C00012E, X )(FunctionGenerator& g, IRBuilder<>& b, I
// EA <- b + (RB)
// MEM(EA, 4) <- (RS)[32:63]
Value* ea = g.gpr_value(i.X.B);
if (i.X.A) {
ea = b.CreateAdd(g.gpr_value(i.X.A), ea);
Value* ea = g.gpr_value(i.X.RB);
if (i.X.RA) {
ea = b.CreateAdd(g.gpr_value(i.X.RA), ea);
}
Value* v = g.gpr_value(i.X.D);
Value* v = g.gpr_value(i.X.RT);
g.WriteMemory(ea, 4, v);
return 0;