This commit is contained in:
Ben Vanik 2013-12-08 13:58:15 -08:00
parent 28ff739449
commit dc0848f7ba
1 changed files with 88 additions and 120 deletions

View File

@ -853,125 +853,93 @@ XEEMITTER(xoris, 0x6C000000, D )(PPCFunctionBuilder& f, InstrData& i) {
// Integer rotate (A-6) // Integer rotate (A-6)
//XEEMITTER(rld, 0x78000000, MDS)(PPCFunctionBuilder& f, InstrData& i) { XEEMITTER(rld, 0x78000000, MDS)(PPCFunctionBuilder& f, InstrData& i) {
// if (i.MD.idx == 0) { if (i.MD.idx == 0) {
// // XEEMITTER(rldiclx, 0x78000000, MD ) // XEEMITTER(rldiclx, 0x78000000, MD )
// // n <- sh[5] || sh[0:4] // n <- sh[5] || sh[0:4]
// // r <- ROTL64((RS), n) // r <- ROTL64((RS), n)
// // b <- mb[5] || mb[0:4] // b <- mb[5] || mb[0:4]
// // m <- MASK(b, 63) // m <- MASK(b, 63)
// // RA <- r & m // RA <- r & m
// uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH;
// uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH; uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB;
// uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB; uint64_t m = XEMASK(mb, 63);
// uint64_t m = XEMASK(mb, 63); Value* v = f.LoadGPR(i.MD.RT);
// if (sh) {
// GpVar v(c.newGpVar()); v = f.RotateLeft(v, f.LoadConstant((int8_t)sh));
// c.mov(v, f.LoadGPR(i.MD.RT)); }
// if (sh) { if (m != 0xFFFFFFFFFFFFFFFF) {
// c.rol(v, imm(sh)); v = f.And(v, f.LoadConstant(m));
// } }
// if (m != 0xFFFFFFFFFFFFFFFF) { if (i.MD.Rc) {
// GpVar mask(c.newGpVar()); f.UpdateCR(0, v);
// c.mov(mask, imm(m)); }
// c.and_(v, mask); f.StoreGPR(i.MD.RA, v);
// } return 0;
// f.StoreGPR(i.MD.RA, v); } else if (i.MD.idx == 1) {
// // XEEMITTER(rldicrx, 0x78000004, MD )
// if (i.MD.Rc) { // n <- sh[5] || sh[0:4]
// // With cr0 update. // r <- ROTL64((RS), n)
// f.UpdateCR(0, v); // e <- me[5] || me[0:4]
// } // m <- MASK(0, e)
// // RA <- r & m
// e.clear_constant_gpr_value(i.MD.RA); uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH;
// uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB;
// return 0; uint64_t m = XEMASK(0, mb);
// } else if (i.MD.idx == 1) { Value* v = f.LoadGPR(i.MD.RT);
// // XEEMITTER(rldicrx, 0x78000004, MD ) if (sh) {
// // n <- sh[5] || sh[0:4] v = f.RotateLeft(v, f.LoadConstant((int8_t)sh));
// // r <- ROTL64((RS), n) }
// // e <- me[5] || me[0:4] if (m != 0xFFFFFFFFFFFFFFFF) {
// // m <- MASK(0, e) v = f.And(v, f.LoadConstant(m));
// // RA <- r & m }
// if (i.MD.Rc) {
// uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH; f.UpdateCR(0, v);
// uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB; }
// uint64_t m = XEMASK(0, mb); f.StoreGPR(i.MD.RA, v);
// return 0;
// GpVar v(c.newGpVar()); } else if (i.MD.idx == 2) {
// c.mov(v, f.LoadGPR(i.MD.RT)); // XEEMITTER(rldicx, 0x78000008, MD )
// if (sh) { XEINSTRNOTIMPLEMENTED();
// c.rol(v, imm(sh)); return 1;
// } } else if (i.MDS.idx == 8) {
// if (m != 0xFFFFFFFFFFFFFFFF) { // XEEMITTER(rldclx, 0x78000010, MDS)
// GpVar mask(c.newGpVar()); XEINSTRNOTIMPLEMENTED();
// c.mov(mask, imm(m)); return 1;
// c.and_(v, mask); } else if (i.MDS.idx == 9) {
// } // XEEMITTER(rldcrx, 0x78000012, MDS)
// f.StoreGPR(i.MD.RA, v); XEINSTRNOTIMPLEMENTED();
// return 1;
// if (i.MD.Rc) { } else if (i.MD.idx == 3) {
// // With cr0 update. // XEEMITTER(rldimix, 0x7800000C, MD )
// f.UpdateCR(0, v); // n <- sh[5] || sh[0:4]
// } // r <- ROTL64((RS), n)
// // b <- me[5] || me[0:4]
// e.clear_constant_gpr_value(i.MD.RA); // m <- MASK(b, ¬n)
// // RA <- (r & m) | ((RA)&¬m)
// return 0; uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH;
// } else if (i.MD.idx == 2) { uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB;
// // XEEMITTER(rldicx, 0x78000008, MD ) uint64_t m = XEMASK(mb, ~sh);
// XEINSTRNOTIMPLEMENTED(); Value* v = f.LoadGPR(i.MD.RT);
// return 1; if (sh) {
// } else if (i.MDS.idx == 8) { v = f.RotateLeft(v, f.LoadConstant((int8_t)sh));
// // XEEMITTER(rldclx, 0x78000010, MDS) }
// XEINSTRNOTIMPLEMENTED(); if (m != 0xFFFFFFFFFFFFFFFF) {
// return 1; Value* ra = f.LoadGPR(i.MD.RA);
// } else if (i.MDS.idx == 9) { v = f.Or(
// // XEEMITTER(rldcrx, 0x78000012, MDS) f.And(v, f.LoadConstant(m)),
// XEINSTRNOTIMPLEMENTED(); f.And(ra, f.LoadConstant(~m)));
// return 1; }
// } else if (i.MD.idx == 3) { if (i.MD.Rc) {
// // XEEMITTER(rldimix, 0x7800000C, MD ) f.UpdateCR(0, v);
// // n <- sh[5] || sh[0:4] }
// // r <- ROTL64((RS), n) f.StoreGPR(i.MD.RA, v);
// // b <- me[5] || me[0:4] return 0;
// // m <- MASK(b, ¬n) } else {
// // RA <- (r & m) | ((RA)&¬m) XEINSTRNOTIMPLEMENTED();
// return 1;
// uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH; }
// uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB; }
// uint64_t m = XEMASK(mb, ~sh);
//
// GpVar v(c.newGpVar());
// c.mov(v, f.LoadGPR(i.MD.RT));
// if (sh) {
// c.rol(v, imm(sh));
// }
// if (m != 0xFFFFFFFFFFFFFFFF) {
// GpVar mask(c.newGpVar());
// c.mov(mask, e.get_uint64(m));
// c.and_(v, mask);
// GpVar ra(c.newGpVar());
// c.mov(ra, f.LoadGPR(i.MD.RA));
// c.not_(mask);
// c.and_(ra, mask);
// c.or_(v, ra);
// }
// f.StoreGPR(i.MD.RA, v);
//
// if (i.MD.Rc) {
// // With cr0 update.
// f.UpdateCR(0, v);
// }
//
// e.clear_constant_gpr_value(i.MD.RA);
//
// return 0;
// } else {
// XEINSTRNOTIMPLEMENTED();
// return 1;
// }
//}
XEEMITTER(rlwimix, 0x50000000, M )(PPCFunctionBuilder& f, InstrData& i) { XEEMITTER(rlwimix, 0x50000000, M )(PPCFunctionBuilder& f, InstrData& i) {
// n <- SH // n <- SH
@ -1372,7 +1340,7 @@ void RegisterEmitCategoryALU() {
XEREGISTERINSTR(xorx, 0x7C000278); XEREGISTERINSTR(xorx, 0x7C000278);
XEREGISTERINSTR(xori, 0x68000000); XEREGISTERINSTR(xori, 0x68000000);
XEREGISTERINSTR(xoris, 0x6C000000); XEREGISTERINSTR(xoris, 0x6C000000);
// XEREGISTERINSTR(rld, 0x78000000); XEREGISTERINSTR(rld, 0x78000000);
// -- // XEREGISTERINSTR(rldclx, 0x78000010); // -- // XEREGISTERINSTR(rldclx, 0x78000010);
// -- // XEREGISTERINSTR(rldcrx, 0x78000012); // -- // XEREGISTERINSTR(rldcrx, 0x78000012);
// -- // XEREGISTERINSTR(rldicx, 0x78000008); // -- // XEREGISTERINSTR(rldicx, 0x78000008);