Adding srd/srw. Fixing shamts in other shifts.
This commit is contained in:
parent
778efdb276
commit
1d0ec64d40
|
@ -418,8 +418,20 @@ XEEMITTER(subfx, 0x7C000050, XO )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
}
|
}
|
||||||
|
|
||||||
XEEMITTER(subfcx, 0x7C000010, XO )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
XEEMITTER(subfcx, 0x7C000010, XO )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
||||||
XEINSTRNOTIMPLEMENTED();
|
// RT <- ¬(RA) + (RB) + 1
|
||||||
return 1;
|
|
||||||
|
GpVar v(c.newGpVar());
|
||||||
|
c.mov(v, e.gpr_value(i.XO.RA));
|
||||||
|
c.not_(v);
|
||||||
|
c.stc(); // Always carrying.
|
||||||
|
c.adc(v, e.gpr_value(i.XO.RB));
|
||||||
|
GpVar cc(c.newGpVar());
|
||||||
|
c.setc(cc.r8());
|
||||||
|
|
||||||
|
e.update_gpr_value(i.XO.RT, v);
|
||||||
|
e.update_xer_with_carry(cc);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
XEEMITTER(subficx, 0x20000000, D )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
XEEMITTER(subficx, 0x20000000, D )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
||||||
|
@ -723,8 +735,24 @@ XEEMITTER(cntlzwx, 0x7C000034, X )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
}
|
}
|
||||||
|
|
||||||
XEEMITTER(eqvx, 0x7C000238, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
XEEMITTER(eqvx, 0x7C000238, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
||||||
XEINSTRNOTIMPLEMENTED();
|
// RA <- (RS) == (RB)
|
||||||
return 1;
|
|
||||||
|
// UNTESTED: ensure this is correct.
|
||||||
|
//XEASSERTALWAYS();
|
||||||
|
//c.int3();
|
||||||
|
|
||||||
|
GpVar v(c.newGpVar());
|
||||||
|
c.mov(v, e.gpr_value(i.X.RT));
|
||||||
|
c.xor_(v, e.gpr_value(i.X.RB));
|
||||||
|
c.not_(v);
|
||||||
|
e.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
|
if (i.X.Rc) {
|
||||||
|
// With cr0 update.
|
||||||
|
e.update_cr_with_cond(0, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
XEEMITTER(extsbx, 0x7C000774, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
XEEMITTER(extsbx, 0x7C000774, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
||||||
|
@ -1025,9 +1053,12 @@ XEEMITTER(sldx, 0x7C000036, X )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
// m <- i64.0
|
// m <- i64.0
|
||||||
// RA <- r & m
|
// RA <- r & m
|
||||||
|
|
||||||
|
GpVar sh(c.newGpVar());
|
||||||
|
c.mov(sh, e.gpr_value(i.X.RB));
|
||||||
|
c.and_(sh, imm(0x3F));
|
||||||
GpVar v(c.newGpVar());
|
GpVar v(c.newGpVar());
|
||||||
c.mov(v, e.gpr_value(i.X.RT));
|
c.mov(v, e.gpr_value(i.X.RT));
|
||||||
c.shl(v, e.gpr_value(i.X.RB));
|
c.shl(v, sh);
|
||||||
e.update_gpr_value(i.X.RA, v);
|
e.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
if (i.X.Rc) {
|
if (i.X.Rc) {
|
||||||
|
@ -1047,9 +1078,12 @@ XEEMITTER(slwx, 0x7C000030, X )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
// m <- i64.0
|
// m <- i64.0
|
||||||
// RA <- r & m
|
// RA <- r & m
|
||||||
|
|
||||||
|
GpVar sh(c.newGpVar());
|
||||||
|
c.mov(sh, e.gpr_value(i.X.RB));
|
||||||
|
c.and_(sh, imm(0x1F));
|
||||||
GpVar v(c.newGpVar());
|
GpVar v(c.newGpVar());
|
||||||
c.mov(v, e.gpr_value(i.X.RT));
|
c.mov(v, e.gpr_value(i.X.RT));
|
||||||
c.shl(v, e.gpr_value(i.X.RB));
|
c.shl(v, sh);
|
||||||
c.mov(v.r32(), v.r32());
|
c.mov(v.r32(), v.r32());
|
||||||
e.update_gpr_value(i.X.RA, v);
|
e.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
|
@ -1123,13 +1157,54 @@ XEEMITTER(srawix, 0x7C000670, X )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
}
|
}
|
||||||
|
|
||||||
XEEMITTER(srdx, 0x7C000436, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
XEEMITTER(srdx, 0x7C000436, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
||||||
XEINSTRNOTIMPLEMENTED();
|
// n <- (RB)[59:63]
|
||||||
return 1;
|
// r <- ROTL64((RS), 64-n)
|
||||||
|
// if (RB)[58] = 0 then
|
||||||
|
// m <- MASK(n, 63)
|
||||||
|
// else
|
||||||
|
// m <- i64.0
|
||||||
|
// RA <- r & m
|
||||||
|
|
||||||
|
GpVar sh(c.newGpVar());
|
||||||
|
c.mov(sh, e.gpr_value(i.X.RB));
|
||||||
|
c.and_(sh, imm(0x3F));
|
||||||
|
GpVar v(c.newGpVar());
|
||||||
|
c.mov(v, e.gpr_value(i.X.RT));
|
||||||
|
c.shr(v, sh);
|
||||||
|
e.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
|
if (i.X.Rc) {
|
||||||
|
// With cr0 update.
|
||||||
|
e.update_cr_with_cond(0, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
XEEMITTER(srwx, 0x7C000430, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
XEEMITTER(srwx, 0x7C000430, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
||||||
XEINSTRNOTIMPLEMENTED();
|
// n <- (RB)[59:63]
|
||||||
return 1;
|
// r <- ROTL32((RS)[32:63], 64-n)
|
||||||
|
// if (RB)[58] = 0 then
|
||||||
|
// m <- MASK(n+32, 63)
|
||||||
|
// else
|
||||||
|
// m <- i64.0
|
||||||
|
// RA <- r & m
|
||||||
|
|
||||||
|
GpVar sh(c.newGpVar());
|
||||||
|
c.mov(sh, e.gpr_value(i.X.RB));
|
||||||
|
c.and_(sh, imm(0x1F));
|
||||||
|
GpVar v(c.newGpVar());
|
||||||
|
c.mov(v, e.gpr_value(i.X.RT));
|
||||||
|
c.shr(v, sh);
|
||||||
|
c.mov(v.r32(), v.r32());
|
||||||
|
e.update_gpr_value(i.X.RA, v);
|
||||||
|
|
||||||
|
if (i.X.Rc) {
|
||||||
|
// With cr0 update.
|
||||||
|
e.update_cr_with_cond(0, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -406,6 +406,10 @@ XEEMITTER(fcfidx, 0xFC00069C, X )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
XEEMITTER(fctidx, 0xFC00065C, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
XEEMITTER(fctidx, 0xFC00065C, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
||||||
// frD <- double_to_signed_int64( frB )
|
// frD <- double_to_signed_int64( frB )
|
||||||
|
|
||||||
|
// UNTESTED: ensure this is correct.
|
||||||
|
//XEASSERTALWAYS();
|
||||||
|
//c.int3();
|
||||||
|
|
||||||
Label over_max(c.newLabel());
|
Label over_max(c.newLabel());
|
||||||
Label under_min(c.newLabel());
|
Label under_min(c.newLabel());
|
||||||
Label done(c.newLabel());
|
Label done(c.newLabel());
|
||||||
|
@ -459,6 +463,10 @@ XEEMITTER(fctidzx, 0xFC00065E, X )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
XEEMITTER(fctiwx, 0xFC00001C, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
XEEMITTER(fctiwx, 0xFC00001C, X )(X64Emitter& e, X86Compiler& c, InstrData& i) {
|
||||||
// frD <- double_to_signed_int32( frB )
|
// frD <- double_to_signed_int32( frB )
|
||||||
|
|
||||||
|
// UNTESTED: ensure this is correct.
|
||||||
|
//XEASSERTALWAYS();
|
||||||
|
//c.int3();
|
||||||
|
|
||||||
Label over_max(c.newLabel());
|
Label over_max(c.newLabel());
|
||||||
Label under_min(c.newLabel());
|
Label under_min(c.newLabel());
|
||||||
Label done(c.newLabel());
|
Label done(c.newLabel());
|
||||||
|
|
Loading…
Reference in New Issue