Cleaning up instruction decoding names to match the docs better.
This commit is contained in:
parent
ffdc1e5d4b
commit
9b3d96a8ae
|
@ -73,82 +73,74 @@ typedef struct {
|
||||||
|
|
||||||
// kXEPPCInstrFormatI
|
// kXEPPCInstrFormatI
|
||||||
struct {
|
struct {
|
||||||
// TODO(benvanik): doc format update
|
|
||||||
uint32_t LK : 1;
|
uint32_t LK : 1;
|
||||||
uint32_t AA : 1;
|
uint32_t AA : 1;
|
||||||
uint32_t LI : 24;
|
uint32_t LI : 24;
|
||||||
uint32_t OPCD : 6;
|
uint32_t : 6;
|
||||||
} I;
|
} I;
|
||||||
// kXEPPCInstrFormatB
|
// kXEPPCInstrFormatB
|
||||||
struct {
|
struct {
|
||||||
// TODO(benvanik): doc format update
|
|
||||||
uint32_t LK : 1;
|
uint32_t LK : 1;
|
||||||
uint32_t AA : 1;
|
uint32_t AA : 1;
|
||||||
uint32_t BD : 14;
|
uint32_t BD : 14;
|
||||||
uint32_t BI : 5;
|
uint32_t BI : 5;
|
||||||
uint32_t BO : 5;
|
uint32_t BO : 5;
|
||||||
uint32_t OPCD : 6;
|
uint32_t : 6;
|
||||||
} B;
|
} B;
|
||||||
|
|
||||||
// kXEPPCInstrFormatSC
|
// kXEPPCInstrFormatSC
|
||||||
// kXEPPCInstrFormatD
|
// kXEPPCInstrFormatD
|
||||||
struct {
|
struct {
|
||||||
// TODO(benvanik): doc format update
|
uint32_t DS : 16;
|
||||||
uint32_t SIMM : 16;
|
uint32_t RA : 5;
|
||||||
uint32_t A : 5;
|
uint32_t RT : 5;
|
||||||
uint32_t D : 5;
|
uint32_t : 6;
|
||||||
uint32_t OPCD : 6;
|
|
||||||
} D;
|
} D;
|
||||||
// kXEPPCInstrFormatDS
|
// kXEPPCInstrFormatDS
|
||||||
struct {
|
struct {
|
||||||
// TODO(benvanik): doc format update
|
|
||||||
uint32_t : 2;
|
uint32_t : 2;
|
||||||
uint32_t ds : 14;
|
uint32_t DS : 14;
|
||||||
uint32_t A : 5;
|
uint32_t RA : 5;
|
||||||
uint32_t S : 5;
|
uint32_t RT : 5;
|
||||||
uint32_t OPCD : 6;
|
uint32_t : 6;
|
||||||
} DS;
|
} DS;
|
||||||
// kXEPPCInstrFormatX
|
// kXEPPCInstrFormatX
|
||||||
struct {
|
struct {
|
||||||
// TODO(benvanik): doc format update
|
|
||||||
uint32_t Rc : 1;
|
uint32_t Rc : 1;
|
||||||
uint32_t : 10;
|
uint32_t : 10;
|
||||||
uint32_t B : 5;
|
uint32_t RB : 5;
|
||||||
uint32_t A : 5;
|
uint32_t RA : 5;
|
||||||
uint32_t D : 5;
|
uint32_t RT : 5;
|
||||||
uint32_t OPCD : 6;
|
uint32_t : 6;
|
||||||
} X;
|
} X;
|
||||||
// kXEPPCInstrFormatXL
|
// kXEPPCInstrFormatXL
|
||||||
struct {
|
struct {
|
||||||
// TODO(benvanik): doc format update
|
|
||||||
uint32_t LK : 1;
|
uint32_t LK : 1;
|
||||||
uint32_t : 10;
|
uint32_t : 10;
|
||||||
uint32_t BB : 5;
|
uint32_t BB : 5;
|
||||||
uint32_t BI : 5;
|
uint32_t BI : 5;
|
||||||
uint32_t BO : 5;
|
uint32_t BO : 5;
|
||||||
uint32_t OPCD : 6;
|
uint32_t : 6;
|
||||||
} XL;
|
} XL;
|
||||||
// kXEPPCInstrFormatXFX
|
// kXEPPCInstrFormatXFX
|
||||||
struct {
|
struct {
|
||||||
// TODO(benvanik): doc format update
|
|
||||||
uint32_t : 1;
|
uint32_t : 1;
|
||||||
uint32_t : 10;
|
uint32_t : 10;
|
||||||
uint32_t spr : 10;
|
uint32_t spr : 10;
|
||||||
uint32_t D : 5;
|
uint32_t RT : 5;
|
||||||
uint32_t OPCD : 6;
|
uint32_t : 6;
|
||||||
} XFX;
|
} XFX;
|
||||||
// kXEPPCInstrFormatXFL
|
// kXEPPCInstrFormatXFL
|
||||||
// kXEPPCInstrFormatXS
|
// kXEPPCInstrFormatXS
|
||||||
// kXEPPCInstrFormatXO
|
// kXEPPCInstrFormatXO
|
||||||
struct {
|
struct {
|
||||||
// TODO(benvanik): doc format update
|
|
||||||
uint32_t Rc : 1;
|
uint32_t Rc : 1;
|
||||||
uint32_t : 8;
|
uint32_t : 8;
|
||||||
uint32_t OE : 1;
|
uint32_t OE : 1;
|
||||||
uint32_t B : 5;
|
uint32_t RB : 5;
|
||||||
uint32_t A : 5;
|
uint32_t RA : 5;
|
||||||
uint32_t D : 5;
|
uint32_t RT : 5;
|
||||||
uint32_t OPCD : 6;
|
uint32_t : 6;
|
||||||
} XO;
|
} XO;
|
||||||
// kXEPPCInstrFormatA
|
// kXEPPCInstrFormatA
|
||||||
// kXEPPCInstrFormatM
|
// kXEPPCInstrFormatM
|
||||||
|
@ -159,7 +151,7 @@ typedef struct {
|
||||||
uint32_t SH : 5;
|
uint32_t SH : 5;
|
||||||
uint32_t RA : 5;
|
uint32_t RA : 5;
|
||||||
uint32_t RS : 5;
|
uint32_t RS : 5;
|
||||||
uint32_t OPCD : 6;
|
uint32_t : 6;
|
||||||
} M;
|
} M;
|
||||||
// kXEPPCInstrFormatMD
|
// kXEPPCInstrFormatMD
|
||||||
// kXEPPCInstrFormatMDS
|
// kXEPPCInstrFormatMDS
|
||||||
|
|
|
@ -40,8 +40,8 @@ XEEMITTER(addx, 0x7C000214, XO )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value* v = b.CreateAdd(g.gpr_value(i.XO.A), g.gpr_value(i.XO.B));
|
Value* v = b.CreateAdd(g.gpr_value(i.XO.RA), g.gpr_value(i.XO.RB));
|
||||||
g.update_gpr_value(i.XO.D, v);
|
g.update_gpr_value(i.XO.RT, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -60,11 +60,11 @@ XEEMITTER(addi, 0x38000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// if RA = 0 then RT <- EXTS(SI)
|
// if RA = 0 then RT <- EXTS(SI)
|
||||||
// else RT <- (RA) + EXTS(SI)
|
// else RT <- (RA) + EXTS(SI)
|
||||||
|
|
||||||
Value* v = b.getInt64(XEEXTS16(i.D.SIMM));
|
Value* v = b.getInt64(XEEXTS16(i.D.DS));
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
v = b.CreateAdd(g.gpr_value(i.D.A), v);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -83,11 +83,11 @@ XEEMITTER(addis, 0x3C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// if RA = 0 then RT <- EXTS(SI) || i16.0
|
// if RA = 0 then RT <- EXTS(SI) || i16.0
|
||||||
// else RT <- (RA) + EXTS(SI) || i16.0
|
// else RT <- (RA) + EXTS(SI) || i16.0
|
||||||
|
|
||||||
Value* v = b.getInt64(XEEXTS16(i.D.SIMM) << 16);
|
Value* v = b.getInt64(XEEXTS16(i.D.DS) << 16);
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
v = b.CreateAdd(g.gpr_value(i.D.A), v);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -134,8 +134,8 @@ XEEMITTER(divwux, 0x7C000396, XO )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value* dividend = b.CreateTrunc(g.gpr_value(i.XO.A), b.getInt32Ty());
|
Value* dividend = b.CreateTrunc(g.gpr_value(i.XO.RA), b.getInt32Ty());
|
||||||
Value* divisor = b.CreateTrunc(g.gpr_value(i.XO.B), b.getInt32Ty());
|
Value* divisor = b.CreateTrunc(g.gpr_value(i.XO.RB), b.getInt32Ty());
|
||||||
Value* v = b.CreateUDiv(dividend, divisor);
|
Value* v = b.CreateUDiv(dividend, divisor);
|
||||||
v = b.CreateZExt(v, b.getInt64Ty());
|
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
|
// overflows. It should be truncating the result, but I'm not sure what LLVM
|
||||||
// does.
|
// does.
|
||||||
|
|
||||||
Value* v = b.CreateMul(g.gpr_value(i.D.A), b.getInt64(XEEXTS16(i.D.SIMM)));
|
Value* v = b.CreateMul(g.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
|
||||||
g.update_gpr_value(i.D.D, b.CreateTrunc(v, b.getInt64Ty()));
|
g.update_gpr_value(i.D.RT, b.CreateTrunc(v, b.getInt64Ty()));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -195,9 +195,9 @@ XEEMITTER(mullwx, 0x7C0001D6, XO )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value* v = b.CreateMul(b.CreateSExt(g.gpr_value(i.XO.A), b.getInt64Ty()),
|
Value* v = b.CreateMul(b.CreateSExt(g.gpr_value(i.XO.RA), b.getInt64Ty()),
|
||||||
b.CreateSExt(g.gpr_value(i.XO.B), b.getInt64Ty()));
|
b.CreateSExt(g.gpr_value(i.XO.RB), b.getInt64Ty()));
|
||||||
g.update_gpr_value(i.XO.D, v);
|
g.update_gpr_value(i.XO.RT, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -276,11 +276,11 @@ XEEMITTER(cmp, 0x7C000000, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// c <- 0b001
|
// c <- 0b001
|
||||||
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
|
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
|
||||||
|
|
||||||
uint32_t BF = i.X.D >> 2;
|
uint32_t BF = i.X.RT >> 2;
|
||||||
uint32_t L = i.X.D & 1;
|
uint32_t L = i.X.RT & 1;
|
||||||
|
|
||||||
Value* lhs = g.gpr_value(i.X.A);
|
Value* lhs = g.gpr_value(i.X.RA);
|
||||||
Value* rhs = g.gpr_value(i.X.B);
|
Value* rhs = g.gpr_value(i.X.RB);
|
||||||
if (!L) {
|
if (!L) {
|
||||||
// 32-bit - truncate and sign extend.
|
// 32-bit - truncate and sign extend.
|
||||||
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
|
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
|
||||||
|
@ -307,17 +307,17 @@ XEEMITTER(cmpi, 0x2C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// c <- 0b001
|
// c <- 0b001
|
||||||
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
|
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
|
||||||
|
|
||||||
uint32_t BF = i.D.D >> 2;
|
uint32_t BF = i.D.RT >> 2;
|
||||||
uint32_t L = i.D.D & 1;
|
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) {
|
if (!L) {
|
||||||
// 32-bit - truncate and sign extend.
|
// 32-bit - truncate and sign extend.
|
||||||
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
|
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
|
||||||
lhs = b.CreateSExt(lhs, b.getInt64Ty());
|
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);
|
XeEmitCompareCore(g, b, lhs, rhs, BF, true);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -338,11 +338,11 @@ XEEMITTER(cmpl, 0x7C000040, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// c <- 0b001
|
// c <- 0b001
|
||||||
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
|
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
|
||||||
|
|
||||||
uint32_t BF = i.X.D >> 2;
|
uint32_t BF = i.X.RT >> 2;
|
||||||
uint32_t L = i.X.D & 1;
|
uint32_t L = i.X.RT & 1;
|
||||||
|
|
||||||
Value* lhs = g.gpr_value(i.X.A);
|
Value* lhs = g.gpr_value(i.X.RA);
|
||||||
Value* rhs = g.gpr_value(i.X.B);
|
Value* rhs = g.gpr_value(i.X.RB);
|
||||||
if (!L) {
|
if (!L) {
|
||||||
// 32-bit - truncate and zero extend.
|
// 32-bit - truncate and zero extend.
|
||||||
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
|
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
|
||||||
|
@ -369,17 +369,17 @@ XEEMITTER(cmpli, 0x28000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// c <- 0b001
|
// c <- 0b001
|
||||||
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
|
// CR[4×BF+32:4×BF+35] <- c || XER[SO]
|
||||||
|
|
||||||
uint32_t BF = i.D.D >> 2;
|
uint32_t BF = i.D.RT >> 2;
|
||||||
uint32_t L = i.D.D & 1;
|
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) {
|
if (!L) {
|
||||||
// 32-bit - truncate and zero extend.
|
// 32-bit - truncate and zero extend.
|
||||||
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
|
lhs = b.CreateTrunc(lhs, b.getInt32Ty());
|
||||||
lhs = b.CreateZExt(lhs, b.getInt64Ty());
|
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);
|
XeEmitCompareCore(g, b, lhs, rhs, BF, false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -397,8 +397,8 @@ XEEMITTER(andx, 0x7C000038, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value* v = b.CreateAnd(g.gpr_value(i.X.D), g.gpr_value(i.X.B));
|
Value* v = b.CreateAnd(g.gpr_value(i.X.RT), g.gpr_value(i.X.RB));
|
||||||
g.update_gpr_value(i.X.A, v);
|
g.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -412,9 +412,9 @@ XEEMITTER(andcx, 0x7C000078, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value* v = b.CreateXor(g.gpr_value(i.X.B), -1);
|
Value* v = b.CreateXor(g.gpr_value(i.X.RB), -1);
|
||||||
v = b.CreateAnd(g.gpr_value(i.X.D), v);
|
v = b.CreateAnd(g.gpr_value(i.X.RT), v);
|
||||||
g.update_gpr_value(i.X.A, v);
|
g.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
return 0;
|
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) {
|
XEEMITTER(andix, 0x70000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
|
||||||
// RA <- (RS) & (i48.0 || UI)
|
// RA <- (RS) & (i48.0 || UI)
|
||||||
|
|
||||||
Value* v = b.CreateAnd(g.gpr_value(i.D.D), (uint64_t)i.D.SIMM);
|
Value* v = b.CreateAnd(g.gpr_value(i.D.RT), (uint64_t)i.D.DS);
|
||||||
g.update_gpr_value(i.D.A, v);
|
g.update_gpr_value(i.D.RA, v);
|
||||||
|
|
||||||
// TODO(benvanik): update cr0
|
// TODO(benvanik): update cr0
|
||||||
XEINSTRNOTIMPLEMENTED();
|
XEINSTRNOTIMPLEMENTED();
|
||||||
|
@ -434,8 +434,8 @@ XEEMITTER(andix, 0x70000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
XEEMITTER(andisx, 0x74000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
|
XEEMITTER(andisx, 0x74000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
|
||||||
// RA <- (RS) & (i32.0 || UI || i16.0)
|
// RA <- (RS) & (i32.0 || UI || i16.0)
|
||||||
|
|
||||||
Value* v = b.CreateAnd(g.gpr_value(i.D.D), ((uint64_t)i.D.SIMM) << 16);
|
Value* v = b.CreateAnd(g.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
|
||||||
g.update_gpr_value(i.D.A, v);
|
g.update_gpr_value(i.D.RA, v);
|
||||||
|
|
||||||
// TODO(benvanik): update cr0
|
// TODO(benvanik): update cr0
|
||||||
XEINSTRNOTIMPLEMENTED();
|
XEINSTRNOTIMPLEMENTED();
|
||||||
|
@ -460,7 +460,7 @@ XEEMITTER(cntlzwx, 0x7C000034, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value* v = g.gpr_value(i.X.D);
|
Value* v = g.gpr_value(i.X.RT);
|
||||||
v = b.CreateTrunc(v, b.getInt32Ty());
|
v = b.CreateTrunc(v, b.getInt32Ty());
|
||||||
|
|
||||||
std::vector<Type*> arg_types;
|
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));
|
Value* count = b.CreateCall2(ctlz, v, b.getInt1(1));
|
||||||
|
|
||||||
count = b.CreateZExt(count, b.getInt64Ty());
|
count = b.CreateZExt(count, b.getInt64Ty());
|
||||||
g.update_gpr_value(i.X.A, count);
|
g.update_gpr_value(i.X.RA, count);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -490,10 +490,10 @@ XEEMITTER(extsbx, 0x7C000774, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
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.CreateTrunc(v, b.getInt8Ty());
|
||||||
v = b.CreateSExt(v, b.getInt64Ty());
|
v = b.CreateSExt(v, b.getInt64Ty());
|
||||||
g.update_gpr_value(i.X.A, v);
|
g.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -522,9 +522,9 @@ XEEMITTER(norx, 0x7C0000F8, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
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);
|
v = b.CreateXor(v, -1);
|
||||||
g.update_gpr_value(i.X.A, v);
|
g.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -538,8 +538,8 @@ XEEMITTER(orx, 0x7C000378, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
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));
|
||||||
g.update_gpr_value(i.X.A, v);
|
g.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
return 0;
|
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) {
|
XEEMITTER(ori, 0x60000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
|
||||||
// RA <- (RS) | (i48.0 || UI)
|
// RA <- (RS) | (i48.0 || UI)
|
||||||
|
|
||||||
Value* v = b.CreateOr(g.gpr_value(i.D.D), (uint64_t)i.D.SIMM);
|
Value* v = b.CreateOr(g.gpr_value(i.D.RT), (uint64_t)i.D.DS);
|
||||||
g.update_gpr_value(i.D.A, v);
|
g.update_gpr_value(i.D.RA, v);
|
||||||
|
|
||||||
return 0;
|
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) {
|
XEEMITTER(oris, 0x64000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
|
||||||
// RA <- (RS) | (i32.0 || UI || i16.0)
|
// RA <- (RS) | (i32.0 || UI || i16.0)
|
||||||
|
|
||||||
Value* v = b.CreateOr(g.gpr_value(i.D.D), ((uint64_t)i.D.SIMM) << 16);
|
Value* v = b.CreateOr(g.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
|
||||||
g.update_gpr_value(i.D.A, v);
|
g.update_gpr_value(i.D.RA, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -576,8 +576,8 @@ XEEMITTER(xorx, 0x7C000278, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value* v = b.CreateXor(g.gpr_value(i.X.D), g.gpr_value(i.X.B));
|
Value* v = b.CreateXor(g.gpr_value(i.X.RT), g.gpr_value(i.X.RB));
|
||||||
g.update_gpr_value(i.X.A, v);
|
g.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
return 0;
|
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) {
|
XEEMITTER(xori, 0x68000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
|
||||||
// RA <- (RS) XOR (i48.0 || UI)
|
// RA <- (RS) XOR (i48.0 || UI)
|
||||||
|
|
||||||
Value* v = b.CreateXor(g.gpr_value(i.D.D), (uint64_t)i.D.SIMM);
|
Value* v = b.CreateXor(g.gpr_value(i.D.RT), (uint64_t)i.D.DS);
|
||||||
g.update_gpr_value(i.D.A, v);
|
g.update_gpr_value(i.D.RA, v);
|
||||||
|
|
||||||
return 0;
|
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) {
|
XEEMITTER(xoris, 0x6C000000, D )(FunctionGenerator& g, IRBuilder<>& b, InstrData& i) {
|
||||||
// RA <- (RS) XOR (i32.0 || UI || i16.0)
|
// RA <- (RS) XOR (i32.0 || UI || i16.0)
|
||||||
|
|
||||||
Value* v = b.CreateXor(g.gpr_value(i.D.D), ((uint64_t)i.D.SIMM) << 16);
|
Value* v = b.CreateXor(g.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
|
||||||
g.update_gpr_value(i.D.A, v);
|
g.update_gpr_value(i.D.RA, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -493,7 +493,7 @@ XEEMITTER(mfspr, 0x7C0002A6, XFX)(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
g.update_gpr_value(i.XFX.D, v);
|
g.update_gpr_value(i.XFX.RT, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -515,7 +515,7 @@ XEEMITTER(mtspr, 0x7C0003A6, XFX)(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// else
|
// else
|
||||||
// SPR(n) <- (RS)[32:63]
|
// 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);
|
const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);
|
||||||
switch (n) {
|
switch (n) {
|
||||||
|
|
|
@ -32,12 +32,12 @@ XEEMITTER(lbz, 0x88000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + EXTS(D)
|
// EA <- b + EXTS(D)
|
||||||
// RT <- i56.0 || MEM(EA, 1)
|
// RT <- i56.0 || MEM(EA, 1)
|
||||||
|
|
||||||
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
|
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
|
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
|
||||||
}
|
}
|
||||||
Value* v = g.ReadMemory(ea, 1, false);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -47,10 +47,10 @@ XEEMITTER(lbzu, 0x8C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// RT <- i56.0 || MEM(EA, 1)
|
// RT <- i56.0 || MEM(EA, 1)
|
||||||
// RA <- EA
|
// 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);
|
Value* v = g.ReadMemory(ea, 1, false);
|
||||||
g.update_gpr_value(i.D.D, v);
|
g.update_gpr_value(i.D.RT, v);
|
||||||
g.update_gpr_value(i.D.A, ea);
|
g.update_gpr_value(i.D.RA, ea);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -60,10 +60,10 @@ XEEMITTER(lbzux, 0x7C0000EE, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// RT <- i56.0 || MEM(EA, 1)
|
// RT <- i56.0 || MEM(EA, 1)
|
||||||
// RA <- EA
|
// 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);
|
Value* v = g.ReadMemory(ea, 1, false);
|
||||||
g.update_gpr_value(i.X.D, v);
|
g.update_gpr_value(i.X.RT, v);
|
||||||
g.update_gpr_value(i.X.A, ea);
|
g.update_gpr_value(i.X.RA, ea);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -76,12 +76,12 @@ XEEMITTER(lbzx, 0x7C0000AE, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + (RB)
|
// EA <- b + (RB)
|
||||||
// RT <- i56.0 || MEM(EA, 1)
|
// RT <- i56.0 || MEM(EA, 1)
|
||||||
|
|
||||||
Value* ea = g.gpr_value(i.X.B);
|
Value* ea = g.gpr_value(i.X.RB);
|
||||||
if (i.X.A) {
|
if (i.X.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.X.A), ea);
|
ea = b.CreateAdd(g.gpr_value(i.X.RA), ea);
|
||||||
}
|
}
|
||||||
Value* v = g.ReadMemory(ea, 1, false);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -94,12 +94,12 @@ XEEMITTER(ld, 0xE8000000, DS )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + EXTS(DS || 0b00)
|
// EA <- b + EXTS(DS || 0b00)
|
||||||
// RT <- MEM(EA, 8)
|
// RT <- MEM(EA, 8)
|
||||||
|
|
||||||
Value* ea = b.getInt64(XEEXTS16(i.DS.ds << 2));
|
Value* ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
|
||||||
if (i.DS.A) {
|
if (i.DS.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.DS.A), ea);
|
ea = b.CreateAdd(g.gpr_value(i.DS.RA), ea);
|
||||||
}
|
}
|
||||||
Value* v = g.ReadMemory(ea, 8, false);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -109,11 +109,11 @@ XEEMITTER(ldu, 0xE8000001, DS )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// RT <- MEM(EA, 8)
|
// RT <- MEM(EA, 8)
|
||||||
// RA <- EA
|
// RA <- EA
|
||||||
|
|
||||||
Value* ea = b.CreateAdd(g.gpr_value(i.DS.A),
|
Value* ea = b.CreateAdd(g.gpr_value(i.DS.RA),
|
||||||
b.getInt64(XEEXTS16(i.DS.ds << 2)));
|
b.getInt64(XEEXTS16(i.DS.DS << 2)));
|
||||||
Value* v = g.ReadMemory(ea, 8, false);
|
Value* v = g.ReadMemory(ea, 8, false);
|
||||||
g.update_gpr_value(i.DS.S, v);
|
g.update_gpr_value(i.DS.RT, v);
|
||||||
g.update_gpr_value(i.DS.A, ea);
|
g.update_gpr_value(i.DS.RA, ea);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -156,12 +156,12 @@ XEEMITTER(lhz, 0xA0000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + EXTS(D)
|
// EA <- b + EXTS(D)
|
||||||
// RT <- i48.0 || MEM(EA, 2)
|
// RT <- i48.0 || MEM(EA, 2)
|
||||||
|
|
||||||
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
|
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
|
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
|
||||||
}
|
}
|
||||||
Value* v = g.ReadMemory(ea, 2, false);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -204,12 +204,12 @@ XEEMITTER(lwz, 0x80000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + EXTS(D)
|
// EA <- b + EXTS(D)
|
||||||
// RT <- i32.0 || MEM(EA, 4)
|
// RT <- i32.0 || MEM(EA, 4)
|
||||||
|
|
||||||
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
|
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
|
ea = b.CreateAdd(g.gpr_value(i.D.RA), ea);
|
||||||
}
|
}
|
||||||
Value* v = g.ReadMemory(ea, 4, false);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -219,10 +219,10 @@ XEEMITTER(lwzu, 0x84000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// RT <- i32.0 || MEM(EA, 4)
|
// RT <- i32.0 || MEM(EA, 4)
|
||||||
// RA <- EA
|
// 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);
|
Value* v = g.ReadMemory(ea, 4, false);
|
||||||
g.update_gpr_value(i.D.D, v);
|
g.update_gpr_value(i.D.RT, v);
|
||||||
g.update_gpr_value(i.D.A, ea);
|
g.update_gpr_value(i.D.RA, ea);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -240,12 +240,12 @@ XEEMITTER(lwzx, 0x7C00002E, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + (RB)
|
// EA <- b + (RB)
|
||||||
// RT <- i32.0 || MEM(EA, 4)
|
// RT <- i32.0 || MEM(EA, 4)
|
||||||
|
|
||||||
Value* ea = g.gpr_value(i.X.B);
|
Value* ea = g.gpr_value(i.X.RB);
|
||||||
if (i.X.A) {
|
if (i.X.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.X.A), ea);
|
ea = b.CreateAdd(g.gpr_value(i.X.RA), ea);
|
||||||
}
|
}
|
||||||
Value* v = g.ReadMemory(ea, 4, false);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -261,11 +261,11 @@ XEEMITTER(stb, 0x98000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + EXTS(D)
|
// EA <- b + EXTS(D)
|
||||||
// MEM(EA, 1) <- (RS)[56:63]
|
// MEM(EA, 1) <- (RS)[56:63]
|
||||||
|
|
||||||
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
|
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
|
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);
|
g.WriteMemory(ea, 1, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -276,10 +276,10 @@ XEEMITTER(stbu, 0x9C000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// MEM(EA, 1) <- (RS)[56:63]
|
// MEM(EA, 1) <- (RS)[56:63]
|
||||||
// RA <- EA
|
// 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.gpr_value(i.D.D);
|
Value* v = g.gpr_value(i.D.RT);
|
||||||
g.WriteMemory(ea, 1, v);
|
g.WriteMemory(ea, 1, v);
|
||||||
g.update_gpr_value(i.D.A, ea);
|
g.update_gpr_value(i.D.RA, ea);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -302,11 +302,11 @@ XEEMITTER(std, 0xF8000000, DS )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + EXTS(DS || 0b00)
|
// EA <- b + EXTS(DS || 0b00)
|
||||||
// MEM(EA, 8) <- (RS)
|
// MEM(EA, 8) <- (RS)
|
||||||
|
|
||||||
Value* ea = b.getInt64(XEEXTS16(i.DS.ds << 2));
|
Value* ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
|
||||||
if (i.DS.A) {
|
if (i.DS.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.DS.A), ea);
|
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);
|
g.WriteMemory(ea, 8, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -317,11 +317,11 @@ XEEMITTER(stdu, 0xF8000001, DS )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// MEM(EA, 8) <- (RS)
|
// MEM(EA, 8) <- (RS)
|
||||||
// RA <- EA
|
// RA <- EA
|
||||||
|
|
||||||
Value* ea = b.CreateAdd(g.gpr_value(i.DS.A),
|
Value* ea = b.CreateAdd(g.gpr_value(i.DS.RA),
|
||||||
b.getInt64(XEEXTS16(i.DS.ds << 2)));
|
b.getInt64(XEEXTS16(i.DS.DS << 2)));
|
||||||
Value* v = g.gpr_value(i.DS.S);
|
Value* v = g.gpr_value(i.DS.RT);
|
||||||
g.WriteMemory(ea, 8, v);
|
g.WriteMemory(ea, 8, v);
|
||||||
g.update_gpr_value(i.DS.A, ea);
|
g.update_gpr_value(i.DS.RA, ea);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -344,11 +344,11 @@ XEEMITTER(sth, 0xB0000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + EXTS(D)
|
// EA <- b + EXTS(D)
|
||||||
// MEM(EA, 2) <- (RS)[48:63]
|
// MEM(EA, 2) <- (RS)[48:63]
|
||||||
|
|
||||||
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
|
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
|
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);
|
g.WriteMemory(ea, 2, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -359,11 +359,11 @@ XEEMITTER(sthu, 0xB4000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// MEM(EA, 2) <- (RS)[48:63]
|
// MEM(EA, 2) <- (RS)[48:63]
|
||||||
// RA <- EA
|
// RA <- EA
|
||||||
|
|
||||||
Value* ea = b.CreateAdd(g.gpr_value(i.D.A),
|
Value* ea = b.CreateAdd(g.gpr_value(i.D.RA),
|
||||||
b.getInt64(XEEXTS16(i.D.SIMM)));
|
b.getInt64(XEEXTS16(i.D.DS)));
|
||||||
Value* v = g.gpr_value(i.D.D);
|
Value* v = g.gpr_value(i.D.RT);
|
||||||
g.WriteMemory(ea, 2, v);
|
g.WriteMemory(ea, 2, v);
|
||||||
g.update_gpr_value(i.D.A, ea);
|
g.update_gpr_value(i.D.RA, ea);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -381,11 +381,11 @@ XEEMITTER(sthx, 0x7C00032E, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + (RB)
|
// EA <- b + (RB)
|
||||||
// MEM(EA, 2) <- (RS)[48:63]
|
// MEM(EA, 2) <- (RS)[48:63]
|
||||||
|
|
||||||
Value* ea = g.gpr_value(i.X.B);
|
Value* ea = g.gpr_value(i.X.RB);
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.X.A), ea);
|
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);
|
g.WriteMemory(ea, 2, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -399,11 +399,11 @@ XEEMITTER(stw, 0x90000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + EXTS(D)
|
// EA <- b + EXTS(D)
|
||||||
// MEM(EA, 4) <- (RS)[32:63]
|
// MEM(EA, 4) <- (RS)[32:63]
|
||||||
|
|
||||||
Value* ea = b.getInt64(XEEXTS16(i.D.SIMM));
|
Value* ea = b.getInt64(XEEXTS16(i.D.DS));
|
||||||
if (i.D.A) {
|
if (i.D.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.D.A), ea);
|
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);
|
g.WriteMemory(ea, 4, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -414,11 +414,11 @@ XEEMITTER(stwu, 0x94000000, D )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// MEM(EA, 4) <- (RS)[32:63]
|
// MEM(EA, 4) <- (RS)[32:63]
|
||||||
// RA <- EA
|
// RA <- EA
|
||||||
|
|
||||||
Value* ea = b.CreateAdd(g.gpr_value(i.D.A),
|
Value* ea = b.CreateAdd(g.gpr_value(i.D.RA),
|
||||||
b.getInt64(XEEXTS16(i.D.SIMM)));
|
b.getInt64(XEEXTS16(i.D.DS)));
|
||||||
Value* v = g.gpr_value(i.D.D);
|
Value* v = g.gpr_value(i.D.RT);
|
||||||
g.WriteMemory(ea, 4, v);
|
g.WriteMemory(ea, 4, v);
|
||||||
g.update_gpr_value(i.D.A, ea);
|
g.update_gpr_value(i.D.RA, ea);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -436,11 +436,11 @@ XEEMITTER(stwx, 0x7C00012E, X )(FunctionGenerator& g, IRBuilder<>& b, I
|
||||||
// EA <- b + (RB)
|
// EA <- b + (RB)
|
||||||
// MEM(EA, 4) <- (RS)[32:63]
|
// MEM(EA, 4) <- (RS)[32:63]
|
||||||
|
|
||||||
Value* ea = g.gpr_value(i.X.B);
|
Value* ea = g.gpr_value(i.X.RB);
|
||||||
if (i.X.A) {
|
if (i.X.RA) {
|
||||||
ea = b.CreateAdd(g.gpr_value(i.X.A), ea);
|
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);
|
g.WriteMemory(ea, 4, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue