Main codegen loop now running through instructions.

This commit is contained in:
Ben Vanik 2013-05-22 13:10:07 -07:00
parent dad99769cb
commit 16d2b73a73
6 changed files with 749 additions and 777 deletions

View File

@ -29,10 +29,10 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // This is a different codepath as we need to use llvm.sadd.with.overflow.
//
// Function* sadd_with_overflow = Intrinsic::getDeclaration(
// e.gen_module(), Intrinsic::sadd_with_overflow, b.getInt64Ty());
// Value* v = b.CreateCall2(sadd_with_overflow,
// e.gen_module(), Intrinsic::sadd_with_overflow, jit_type_nint);
// jit_value_t v = b.CreateCall2(sadd_with_overflow,
// e.gpr_value(i.XO.RA), e.gpr_value(i.XO.RB));
// Value* v0 = b.CreateExtractValue(v, 0);
// jit_value_t v0 = b.CreateExtractValue(v, 0);
// e.update_gpr_value(i.XO.RT, v0);
// e.update_xer_with_overflow(b.CreateExtractValue(v, 1));
//
@ -44,7 +44,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// return 0;
// } else {
// // No OE bit setting.
// Value* v = b.CreateAdd(e.gpr_value(i.XO.RA), e.gpr_value(i.XO.RB));
// jit_value_t v = b.CreateAdd(e.gpr_value(i.XO.RA), e.gpr_value(i.XO.RB));
// e.update_gpr_value(i.XO.RT, v);
//
// if (i.XO.Rc) {
@ -73,7 +73,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // else
// // RT <- (RA) + EXTS(SI)
//
// Value* v = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t v = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// v = b.CreateAdd(e.gpr_value(i.D.RA), v);
// }
@ -86,8 +86,8 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // RT <- (RA) + EXTS(SI)
//
// Function* sadd_with_overflow = Intrinsic::getDeclaration(
// e.gen_module(), Intrinsic::sadd_with_overflow, b.getInt64Ty());
// Value* v = b.CreateCall2(sadd_with_overflow,
// e.gen_module(), Intrinsic::sadd_with_overflow, jit_type_nint);
// jit_value_t v = b.CreateCall2(sadd_with_overflow,
// e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// e.update_gpr_value(i.D.RT, b.CreateExtractValue(v, 0));
// e.update_xer_with_carry(b.CreateExtractValue(v, 1));
@ -106,7 +106,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // else
// // RT <- (RA) + EXTS(SI) || i16.0
//
// Value* v = b.getInt64(XEEXTS16(i.D.DS) << 16);
// jit_value_t v = b.getInt64(XEEXTS16(i.D.DS) << 16);
// if (i.D.RA) {
// v = b.CreateAdd(e.gpr_value(i.D.RA), v);
// }
@ -124,11 +124,11 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // RT <- (RA) + CA
//
// Function* sadd_with_overflow = Intrinsic::getDeclaration(
// e.gen_module(), Intrinsic::sadd_with_overflow, b.getInt64Ty());
// Value* ca = b.CreateAnd(b.CreateLShr(e.xer_value(), 29), 0x1);
// Value* v = b.CreateCall2(sadd_with_overflow,
// e.gen_module(), Intrinsic::sadd_with_overflow, jit_type_nint);
// jit_value_t ca = b.CreateAnd(b.CreateLShr(e.xer_value(), 29), 0x1);
// jit_value_t v = b.CreateCall2(sadd_with_overflow,
// e.gpr_value(i.XO.RA), ca);
// Value* add_value = b.CreateExtractValue(v, 0);
// jit_value_t add_value = b.CreateExtractValue(v, 0);
// e.update_gpr_value(i.XO.RT, add_value);
// if (i.XO.OE) {
// // With XER[SO] update too.
@ -166,8 +166,8 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // RT[32:63] <- dividend ÷ divisor
// // RT[0:31] <- undefined
//
// Value* dividend = b.CreateTrunc(e.gpr_value(i.XO.RA), b.getInt32Ty());
// Value* divisor = b.CreateTrunc(e.gpr_value(i.XO.RB), b.getInt32Ty());
// jit_value_t dividend = b.CreateTrunc(e.gpr_value(i.XO.RA), b.getInt32Ty());
// jit_value_t divisor = b.CreateTrunc(e.gpr_value(i.XO.RB), b.getInt32Ty());
//
// // Note that we skip the zero handling block and just avoid the divide if
// // we are OE=0.
@ -187,8 +187,8 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//
// // Divide.
// b.SetInsertPoint(nonzero_bb);
// Value* v = b.CreateSDiv(dividend, divisor);
// v = b.CreateSExt(v, b.getInt64Ty());
// jit_value_t v = b.CreateSDiv(dividend, divisor);
// v = b.CreateSExt(v, jit_type_nint);
// e.update_gpr_value(i.XO.RT, v);
//
// // If we are OE=1 we need to clear the overflow bit.
@ -219,8 +219,8 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // RT[32:63] <- dividend ÷ divisor
// // RT[0:31] <- undefined
//
// Value* dividend = b.CreateTrunc(e.gpr_value(i.XO.RA), b.getInt32Ty());
// Value* divisor = b.CreateTrunc(e.gpr_value(i.XO.RB), b.getInt32Ty());
// jit_value_t dividend = b.CreateTrunc(e.gpr_value(i.XO.RA), b.getInt32Ty());
// jit_value_t divisor = b.CreateTrunc(e.gpr_value(i.XO.RB), b.getInt32Ty());
//
// // Note that we skip the zero handling block and just avoid the divide if
// // we are OE=0.
@ -240,8 +240,8 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//
// // Divide.
// b.SetInsertPoint(nonzero_bb);
// Value* v = b.CreateUDiv(dividend, divisor);
// v = b.CreateZExt(v, b.getInt64Ty());
// jit_value_t v = b.CreateUDiv(dividend, divisor);
// v = b.CreateZExt(v, jit_type_nint);
// e.update_gpr_value(i.XO.RT, v);
//
// // If we are OE=1 we need to clear the overflow bit.
@ -295,8 +295,8 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // overflows. It should be truncating the result, but I'm not sure what LLVM
// // does.
//
// Value* v = b.CreateMul(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// e.update_gpr_value(i.D.RT, b.CreateTrunc(v, b.getInt64Ty()));
// jit_value_t v = b.CreateMul(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// e.update_gpr_value(i.D.RT, b.CreateTrunc(v, jit_type_nint));
//
// return 0;
//}
@ -310,8 +310,8 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// return 1;
// }
//
// Value* v = b.CreateMul(b.CreateSExt(e.gpr_value(i.XO.RA), b.getInt64Ty()),
// b.CreateSExt(e.gpr_value(i.XO.RB), b.getInt64Ty()));
// jit_value_t v = b.CreateMul(b.CreateSExt(e.gpr_value(i.XO.RA), jit_type_nint),
// b.CreateSExt(e.gpr_value(i.XO.RB), jit_type_nint));
// e.update_gpr_value(i.XO.RT, v);
//
// if (i.XO.Rc) {
@ -333,10 +333,10 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // This may just magically do that...
//
// Function* ssub_with_overflow = Intrinsic::getDeclaration(
// e.gen_module(), Intrinsic::ssub_with_overflow, b.getInt64Ty());
// Value* v = b.CreateCall2(ssub_with_overflow,
// e.gen_module(), Intrinsic::ssub_with_overflow, jit_type_nint);
// jit_value_t v = b.CreateCall2(ssub_with_overflow,
// b.getInt64(0), e.gpr_value(i.XO.RA));
// Value* v0 = b.CreateExtractValue(v, 0);
// jit_value_t v0 = b.CreateExtractValue(v, 0);
// e.update_gpr_value(i.XO.RT, v0);
// e.update_xer_with_overflow(b.CreateExtractValue(v, 1));
//
@ -348,7 +348,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// return 0;
// } else {
// // No OE bit setting.
// Value* v = b.CreateSub(b.getInt64(0), e.gpr_value(i.XO.RA));
// jit_value_t v = b.CreateSub(b.getInt64(0), e.gpr_value(i.XO.RA));
// e.update_gpr_value(i.XO.RT, v);
//
// if (i.XO.Rc) {
@ -368,10 +368,10 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // This is a different codepath as we need to use llvm.ssub.with.overflow.
//
// Function* ssub_with_overflow = Intrinsic::getDeclaration(
// e.gen_module(), Intrinsic::ssub_with_overflow, b.getInt64Ty());
// Value* v = b.CreateCall2(ssub_with_overflow,
// e.gen_module(), Intrinsic::ssub_with_overflow, jit_type_nint);
// jit_value_t v = b.CreateCall2(ssub_with_overflow,
// e.gpr_value(i.XO.RB), e.gpr_value(i.XO.RA));
// Value* v0 = b.CreateExtractValue(v, 0);
// jit_value_t v0 = b.CreateExtractValue(v, 0);
// e.update_gpr_value(i.XO.RT, v0);
// e.update_xer_with_overflow(b.CreateExtractValue(v, 1));
//
@ -383,7 +383,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// return 0;
// } else {
// // No OE bit setting.
// Value* v = b.CreateSub(e.gpr_value(i.XO.RB), e.gpr_value(i.XO.RA));
// jit_value_t v = b.CreateSub(e.gpr_value(i.XO.RB), e.gpr_value(i.XO.RA));
// e.update_gpr_value(i.XO.RT, v);
//
// if (i.XO.Rc) {
@ -404,8 +404,8 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // RT <- ¬(RA) + EXTS(SI) + 1
//
// Function* ssub_with_overflow = Intrinsic::getDeclaration(
// e.gen_module(), Intrinsic::ssub_with_overflow, b.getInt64Ty());
// Value* v = b.CreateCall2(ssub_with_overflow,
// e.gen_module(), Intrinsic::ssub_with_overflow, jit_type_nint);
// jit_value_t v = b.CreateCall2(ssub_with_overflow,
// b.getInt64(XEEXTS16(i.D.DS)), e.gpr_value(i.D.RA));
// e.update_gpr_value(i.D.RT, b.CreateExtractValue(v, 0));
// e.update_xer_with_carry(b.CreateExtractValue(v, 1));
@ -419,13 +419,13 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // TODO(benvanik): possible that the add of rb+ca needs to also check for
// // overflow!
//
// Value* ca = b.CreateAnd(b.CreateLShr(e.xer_value(), 29), 0x1);
// jit_value_t ca = b.CreateAnd(b.CreateLShr(e.xer_value(), 29), 0x1);
// Function* uadd_with_overflow = Intrinsic::getDeclaration(
// e.gen_module(), Intrinsic::uadd_with_overflow, b.getInt64Ty());
// Value* v = b.CreateCall2(uadd_with_overflow,
// e.gen_module(), Intrinsic::uadd_with_overflow, jit_type_nint);
// jit_value_t v = b.CreateCall2(uadd_with_overflow,
// b.CreateNeg(e.gpr_value(i.XO.RA)),
// b.CreateAdd(e.gpr_value(i.XO.RB), ca));
// Value* v0 = b.CreateExtractValue(v, 0);
// jit_value_t v0 = b.CreateExtractValue(v, 0);
// e.update_gpr_value(i.XO.RT, v0);
//
// if (i.XO.OE) {
@ -474,14 +474,14 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// uint32_t BF = i.X.RT >> 2;
// uint32_t L = i.X.RT & 1;
//
// Value* lhs = e.gpr_value(i.X.RA);
// Value* rhs = e.gpr_value(i.X.RB);
// jit_value_t lhs = e.gpr_value(i.X.RA);
// jit_value_t rhs = e.gpr_value(i.X.RB);
// if (!L) {
// // 32-bit - truncate and sign extend.
// lhs = b.CreateTrunc(lhs, b.getInt32Ty());
// lhs = b.CreateSExt(lhs, b.getInt64Ty());
// lhs = b.CreateSExt(lhs, jit_type_nint);
// rhs = b.CreateTrunc(rhs, b.getInt32Ty());
// rhs = b.CreateSExt(rhs, b.getInt64Ty());
// rhs = b.CreateSExt(rhs, jit_type_nint);
// }
//
// e.update_cr_with_cond(BF, lhs, rhs, true);
@ -505,14 +505,14 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// uint32_t BF = i.D.RT >> 2;
// uint32_t L = i.D.RT & 1;
//
// Value* lhs = e.gpr_value(i.D.RA);
// jit_value_t lhs = e.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());
// lhs = b.CreateSExt(lhs, jit_type_nint);
// }
//
// Value* rhs = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t rhs = b.getInt64(XEEXTS16(i.D.DS));
// e.update_cr_with_cond(BF, lhs, rhs, true);
//
// return 0;
@ -536,14 +536,14 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// uint32_t BF = i.X.RT >> 2;
// uint32_t L = i.X.RT & 1;
//
// Value* lhs = e.gpr_value(i.X.RA);
// Value* rhs = e.gpr_value(i.X.RB);
// jit_value_t lhs = e.gpr_value(i.X.RA);
// jit_value_t rhs = e.gpr_value(i.X.RB);
// if (!L) {
// // 32-bit - truncate and zero extend.
// lhs = b.CreateTrunc(lhs, b.getInt32Ty());
// lhs = b.CreateZExt(lhs, b.getInt64Ty());
// lhs = b.CreateZExt(lhs, jit_type_nint);
// rhs = b.CreateTrunc(rhs, b.getInt32Ty());
// rhs = b.CreateZExt(rhs, b.getInt64Ty());
// rhs = b.CreateZExt(rhs, jit_type_nint);
// }
//
// e.update_cr_with_cond(BF, lhs, rhs, false);
@ -567,14 +567,14 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// uint32_t BF = i.D.RT >> 2;
// uint32_t L = i.D.RT & 1;
//
// Value* lhs = e.gpr_value(i.D.RA);
// jit_value_t lhs = e.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());
// lhs = b.CreateZExt(lhs, jit_type_nint);
// }
//
// Value* rhs = b.getInt64(i.D.DS);
// jit_value_t rhs = b.getInt64(i.D.DS);
// e.update_cr_with_cond(BF, lhs, rhs, false);
//
// return 0;
@ -586,7 +586,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(andx, 0x7C000038, X )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) & (RB)
//
// Value* v = b.CreateAnd(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// jit_value_t v = b.CreateAnd(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// e.update_gpr_value(i.X.RA, v);
//
// if (i.X.Rc) {
@ -600,7 +600,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(andcx, 0x7C000078, X )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) & ¬(RB)
//
// Value* v = b.CreateXor(e.gpr_value(i.X.RB), -1);
// jit_value_t v = b.CreateXor(e.gpr_value(i.X.RB), -1);
// v = b.CreateAnd(e.gpr_value(i.X.RT), v);
// e.update_gpr_value(i.X.RA, v);
//
@ -615,7 +615,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(andix, 0x70000000, D )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) & (i48.0 || UI)
//
// Value* v = b.CreateAnd(e.gpr_value(i.D.RT), (uint64_t)i.D.DS);
// jit_value_t v = b.CreateAnd(e.gpr_value(i.D.RT), (uint64_t)i.D.DS);
// e.update_gpr_value(i.D.RA, v);
//
// // With cr0 update.
@ -627,7 +627,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(andisx, 0x74000000, D )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) & (i32.0 || UI || i16.0)
//
// Value* v = b.CreateAnd(e.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
// jit_value_t v = b.CreateAnd(e.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
// e.update_gpr_value(i.D.RA, v);
//
// // With cr0 update.
@ -648,16 +648,16 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // n <- n + 1
// // RA <- n - 32
//
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t v = e.gpr_value(i.X.RT);
// v = b.CreateTrunc(v, b.getInt32Ty());
//
// std::vector<Type*> arg_types;
// arg_types.push_back(b.getInt32Ty());
// Function* ctlz = Intrinsic::getDeclaration(
// e.fn()->getParent(), Intrinsic::ctlz, arg_types);
// Value* count = b.CreateCall2(ctlz, v, b.getInt1(1));
// jit_value_t count = b.CreateCall2(ctlz, v, b.getInt1(1));
//
// count = b.CreateZExt(count, b.getInt64Ty());
// count = b.CreateZExt(count, jit_type_nint);
// e.update_gpr_value(i.X.RA, count);
//
// if (i.X.Rc) {
@ -678,9 +678,9 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // RA[56:63] <- (RS)[56:63]
// // RA[0:55] <- i56.s
//
// Value* v = e.gpr_value(i.X.RT);
// v = b.CreateTrunc(v, b.getInt8Ty());
// v = b.CreateSExt(v, b.getInt64Ty());
// jit_value_t v = e.gpr_value(i.X.RT);
// v = b.CreateTrunc(v, jit_type_ubyte);
// v = b.CreateSExt(v, jit_type_nint);
// e.update_gpr_value(i.X.RA, v);
//
// if (i.X.Rc) {
@ -709,7 +709,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(norx, 0x7C0000F8, X )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- ¬((RS) | (RB))
//
// Value* v = b.CreateOr(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// jit_value_t v = b.CreateOr(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// v = b.CreateXor(v, -1);
// e.update_gpr_value(i.X.RA, v);
//
@ -724,7 +724,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(orx, 0x7C000378, X )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) | (RB)
//
// Value* v = b.CreateOr(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// jit_value_t v = b.CreateOr(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// e.update_gpr_value(i.X.RA, v);
//
// if (i.X.Rc) {
@ -743,7 +743,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(ori, 0x60000000, D )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) | (i48.0 || UI)
//
// Value* v = b.CreateOr(e.gpr_value(i.D.RT), (uint64_t)i.D.DS);
// jit_value_t v = b.CreateOr(e.gpr_value(i.D.RT), (uint64_t)i.D.DS);
// e.update_gpr_value(i.D.RA, v);
//
// return 0;
@ -752,7 +752,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(oris, 0x64000000, D )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) | (i32.0 || UI || i16.0)
//
// Value* v = b.CreateOr(e.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
// jit_value_t v = b.CreateOr(e.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
// e.update_gpr_value(i.D.RA, v);
//
// return 0;
@ -761,7 +761,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(xorx, 0x7C000278, X )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) XOR (RB)
//
// Value* v = b.CreateXor(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// jit_value_t v = b.CreateXor(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// e.update_gpr_value(i.X.RA, v);
//
// if (i.X.Rc) {
@ -775,7 +775,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(xori, 0x68000000, D )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) XOR (i48.0 || UI)
//
// Value* v = b.CreateXor(e.gpr_value(i.D.RT), (uint64_t)i.D.DS);
// jit_value_t v = b.CreateXor(e.gpr_value(i.D.RT), (uint64_t)i.D.DS);
// e.update_gpr_value(i.D.RA, v);
//
// return 0;
@ -784,7 +784,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
//XEEMITTER(xoris, 0x6C000000, D )(LibjitEmitter& e, jit_function_t f, InstrData& i) {
// // RA <- (RS) XOR (i32.0 || UI || i16.0)
//
// Value* v = b.CreateXor(e.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
// jit_value_t v = b.CreateXor(e.gpr_value(i.D.RT), ((uint64_t)i.D.DS) << 16);
// e.update_gpr_value(i.D.RA, v);
//
// return 0;
@ -818,7 +818,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH;
// // uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB;
//
// // Value* v = e.gpr_value(i.MD.RS);
// // jit_value_t v = e.gpr_value(i.MD.RS);
// // if (sh) {
// // v = // rotate by sh
// // }
@ -853,7 +853,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // RA <- r&m | (RA)&¬m
//
// // ROTL32(x, y) = rotl(i64.(x||x), y)
// Value* v = b.CreateAnd(e.gpr_value(i.M.RT), UINT32_MAX);
// jit_value_t v = b.CreateAnd(e.gpr_value(i.M.RT), UINT32_MAX);
// v = b.CreateOr(b.CreateShl(v, 32), v);
// // (v << shift) | (v >> (32 - shift));
// v = b.CreateOr(b.CreateShl(v, i.M.SH), b.CreateLShr(v, 32 - i.M.SH));
@ -880,10 +880,10 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // Which seems to just select some bits and set cr0 for use with a branch.
// // We can detect this and do less work.
// if (!i.M.SH) {
// Value* v = b.CreateAnd(
// jit_value_t v = b.CreateAnd(
// b.CreateTrunc(e.gpr_value(i.M.RT), b.getInt32Ty()),
// b.getInt32((uint32_t)XEMASK(i.M.MB + 32, i.M.ME + 32)));
// v = b.CreateZExt(v, b.getInt64Ty());
// v = b.CreateZExt(v, jit_type_nint);
// e.update_gpr_value(i.M.RA, v);
// if (i.M.Rc) {
// // With cr0 update.
@ -893,7 +893,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// }
//
// // ROTL32(x, y) = rotl(i64.(x||x), y)
// Value* v = b.CreateAnd(e.gpr_value(i.M.RT), UINT32_MAX);
// jit_value_t v = b.CreateAnd(e.gpr_value(i.M.RT), UINT32_MAX);
// v = b.CreateOr(b.CreateShl(v, 32), v);
// // (v << shift) | (v >> (32 - shift));
// v = b.CreateOr(b.CreateShl(v, i.M.SH), b.CreateLShr(v, 32 - i.M.SH));
@ -930,7 +930,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // m <- i64.0
// // RA <- r & m
//
// Value* v = b.CreateShl(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// jit_value_t v = b.CreateShl(e.gpr_value(i.X.RT), e.gpr_value(i.X.RB));
// v = b.CreateAnd(v, UINT32_MAX);
// e.update_gpr_value(i.X.RA, v);
//
@ -965,11 +965,11 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// // RA <- r&m | (i64.s)&¬m
// // CA <- s & ((r&¬m)[32:63]≠0)
//
// Value* rs64 = e.gpr_value(i.X.RT);
// Value* rs32 = b.CreateTrunc(rs64, b.getInt32Ty());
// jit_value_t rs64 = e.gpr_value(i.X.RT);
// jit_value_t rs32 = b.CreateTrunc(rs64, b.getInt32Ty());
//
// Value* v;
// Value* ca;
// jit_value_t v;
// jit_value_t ca;
// if (!i.X.RB) {
// // No shift, just a fancy sign extend and CA clearer.
// v = rs32;
@ -982,7 +982,7 @@ XEEMITTER(addx, 0x7C000214, XO )(LibjitEmitter& e, jit_function_t f, Ins
// ca = b.CreateAnd(b.CreateICmpSLT(v, b.getInt32(0)),
// b.CreateICmpSLT(rs64, b.getInt64(0)));
// }
// v = b.CreateSExt(v, b.getInt64Ty());
// v = b.CreateSExt(v, jit_type_nint);
// e.update_gpr_value(i.X.RA, v);
// e.update_xer_with_carry(ca);
//

View File

@ -30,7 +30,7 @@ namespace libjit {
// // NOTE: we avoid spilling registers until we know that the target is not
// // a basic block within this function.
// Value* target;
// jit_value_t target;
// switch (reg) {
// case kXEPPCRegLR:
// target = e.lr_value();
@ -51,7 +51,7 @@ namespace libjit {
// BasicBlock* next_block = e.GetNextBasicBlock();
// BasicBlock* mismatch_bb = BasicBlock::Create(*e.context(), "lr_mismatch",
// e.fn(), next_block);
// Value* lr_cmp = b.CreateICmpEQ(target, ++(e.fn()->arg_begin()));
// jit_value_t lr_cmp = b.CreateICmpEQ(target, ++(e.fn()->arg_begin()));
// // The return block will spill registers for us.
// b.CreateCondBr(lr_cmp, e.GetReturnBasicBlock(), mismatch_bb);
// b.SetInsertPoint(mismatch_bb);
@ -86,7 +86,7 @@ namespace libjit {
// XEASSERTNOTNULL(fn_block->outgoing_function);
// Function* target_fn = e.GetFunction(fn_block->outgoing_function);
// Function::arg_iterator args = e.fn()->arg_begin();
// Value* state_ptr = args;
// jit_value_t state_ptr = args;
// BasicBlock* next_bb = e.GetNextBasicBlock();
// if (!lk || !next_bb) {
// // Tail. No need to refill the local register values, just return.
@ -169,12 +169,12 @@ namespace libjit {
// e.update_lr_value(b.getInt32(i.address + 4));
// }
// Value* ctr_ok = NULL;
// jit_value_t ctr_ok = NULL;
// if (XESELECTBITS(i.B.BO, 2, 2)) {
// // Ignore ctr.
// } else {
// // Decrement counter.
// Value* ctr = e.ctr_value();
// jit_value_t ctr = e.ctr_value();
// ctr = b.CreateSub(ctr, b.getInt64(1));
// e.update_ctr_value(ctr);
@ -186,11 +186,11 @@ namespace libjit {
// }
// }
// Value* cond_ok = NULL;
// jit_value_t cond_ok = NULL;
// if (XESELECTBITS(i.B.BO, 4, 4)) {
// // Ignore cond.
// } else {
// Value* cr = e.cr_value(i.B.BI >> 2);
// jit_value_t cr = e.cr_value(i.B.BI >> 2);
// cr = b.CreateAnd(cr, 1 << (i.B.BI & 3));
// if (XESELECTBITS(i.B.BO, 3, 3)) {
// cond_ok = b.CreateICmpNE(cr, b.getInt64(0));
@ -200,7 +200,7 @@ namespace libjit {
// }
// // We do a bit of optimization here to make the llvm assembly easier to read.
// Value* ok = NULL;
// jit_value_t ok = NULL;
// if (ctr_ok && cond_ok) {
// ok = b.CreateAnd(ctr_ok, cond_ok);
// } else if (ctr_ok) {
@ -255,11 +255,11 @@ namespace libjit {
// e.update_lr_value(b.getInt32(i.address + 4));
// }
// Value* cond_ok = NULL;
// jit_value_t cond_ok = NULL;
// if (XESELECTBITS(i.XL.BO, 4, 4)) {
// // Ignore cond.
// } else {
// Value* cr = e.cr_value(i.XL.BI >> 2);
// jit_value_t cr = e.cr_value(i.XL.BI >> 2);
// cr = b.CreateAnd(cr, 1 << (i.XL.BI & 3));
// if (XESELECTBITS(i.XL.BO, 3, 3)) {
// cond_ok = b.CreateICmpNE(cr, b.getInt64(0));
@ -269,7 +269,7 @@ namespace libjit {
// }
// // We do a bit of optimization here to make the llvm assembly easier to read.
// Value* ok = NULL;
// jit_value_t ok = NULL;
// if (cond_ok) {
// ok = cond_ok;
// }
@ -318,12 +318,12 @@ namespace libjit {
// e.update_lr_value(b.getInt32(i.address + 4));
// }
// Value* ctr_ok = NULL;
// jit_value_t ctr_ok = NULL;
// if (XESELECTBITS(i.XL.BO, 2, 2)) {
// // Ignore ctr.
// } else {
// // Decrement counter.
// Value* ctr = e.ctr_value();
// jit_value_t ctr = e.ctr_value();
// ctr = b.CreateSub(ctr, b.getInt64(1));
// // Ctr check.
@ -334,11 +334,11 @@ namespace libjit {
// }
// }
// Value* cond_ok = NULL;
// jit_value_t cond_ok = NULL;
// if (XESELECTBITS(i.XL.BO, 4, 4)) {
// // Ignore cond.
// } else {
// Value* cr = e.cr_value(i.XL.BI >> 2);
// jit_value_t cr = e.cr_value(i.XL.BI >> 2);
// cr = b.CreateAnd(cr, 1 << (i.XL.BI & 3));
// if (XESELECTBITS(i.XL.BO, 3, 3)) {
// cond_ok = b.CreateICmpNE(cr, b.getInt64(0));
@ -348,7 +348,7 @@ namespace libjit {
// }
// // We do a bit of optimization here to make the llvm assembly easier to read.
// Value* ok = NULL;
// jit_value_t ok = NULL;
// if (ctr_ok && cond_ok) {
// ok = b.CreateAnd(ctr_ok, cond_ok);
// } else if (ctr_ok) {
@ -441,7 +441,7 @@ namespace libjit {
// // Trap (A-25)
// int XeEmitTrap(LibjitEmitter& e, jit_function_t f, InstrData& i,
// Value* va, Value* vb, uint32_t TO) {
// jit_value_t va, jit_value_t vb, uint32_t TO) {
// // if (a < b) & TO[0] then TRAP
// // if (a > b) & TO[1] then TRAP
// // if (a = b) & TO[2] then TRAP
@ -488,35 +488,35 @@ namespace libjit {
// // a < b
// BasicBlock* bb = *(it++);
// b.SetInsertPoint(bb);
// Value* cmp = b.CreateICmpSLT(va, vb);
// jit_value_t cmp = b.CreateICmpSLT(va, vb);
// b.CreateCondBr(cmp, trap_bb, *it);
// }
// if (TO & (1 << 3)) {
// // a > b
// BasicBlock* bb = *(it++);
// b.SetInsertPoint(bb);
// Value* cmp = b.CreateICmpSGT(va, vb);
// jit_value_t cmp = b.CreateICmpSGT(va, vb);
// b.CreateCondBr(cmp, trap_bb, *it);
// }
// if (TO & (1 << 2)) {
// // a = b
// BasicBlock* bb = *(it++);
// b.SetInsertPoint(bb);
// Value* cmp = b.CreateICmpEQ(va, vb);
// jit_value_t cmp = b.CreateICmpEQ(va, vb);
// b.CreateCondBr(cmp, trap_bb, *it);
// }
// if (TO & (1 << 1)) {
// // a <u b
// BasicBlock* bb = *(it++);
// b.SetInsertPoint(bb);
// Value* cmp = b.CreateICmpULT(va, vb);
// jit_value_t cmp = b.CreateICmpULT(va, vb);
// b.CreateCondBr(cmp, trap_bb, *it);
// }
// if (TO & (1 << 0)) {
// // a >u b
// BasicBlock* bb = *(it++);
// b.SetInsertPoint(bb);
// Value* cmp = b.CreateICmpUGT(va, vb);
// jit_value_t cmp = b.CreateICmpUGT(va, vb);
// b.CreateCondBr(cmp, trap_bb, *it);
// }
@ -573,10 +573,10 @@ namespace libjit {
// return XeEmitTrap(e, b, i,
// b.CreateSExt(b.CreateTrunc(e.gpr_value(i.X.RA),
// b.getInt32Ty()),
// b.getInt64Ty()),
// jit_type_nint),
// b.CreateSExt(b.CreateTrunc(e.gpr_value(i.X.RB),
// b.getInt32Ty()),
// b.getInt64Ty()),
// jit_type_nint),
// i.X.RT);
// }
@ -590,7 +590,7 @@ namespace libjit {
// return XeEmitTrap(e, b, i,
// b.CreateSExt(b.CreateTrunc(e.gpr_value(i.D.RA),
// b.getInt32Ty()),
// b.getInt64Ty()),
// jit_type_nint),
// b.getInt64(XEEXTS16(i.D.DS)),
// i.D.RT);
// }
@ -611,7 +611,7 @@ namespace libjit {
// // RT <- i32.0 || SPR(n)
// const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);
// Value* v = NULL;
// jit_value_t v = NULL;
// switch (n) {
// case 1:
// // XER
@ -652,7 +652,7 @@ namespace libjit {
// // else
// // SPR(n) <- (RS)[32:63]
// Value* v = e.gpr_value(i.XFX.RT);
// jit_value_t v = e.gpr_value(i.XFX.RT);
// const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);
// switch (n) {

View File

@ -29,11 +29,11 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // RT <- i56.0 || MEM(EA, 1)
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 1, false);
// jit_value_t v = e.ReadMemory(i.address, ea, 1, false);
// e.update_gpr_value(i.D.RT, v);
// return 0;
@ -44,8 +44,8 @@ namespace libjit {
// // RT <- i56.0 || MEM(EA, 1)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.ReadMemory(i.address, ea, 1, false);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// jit_value_t v = e.ReadMemory(i.address, ea, 1, false);
// e.update_gpr_value(i.D.RT, v);
// e.update_gpr_value(i.D.RA, ea);
@ -57,8 +57,8 @@ namespace libjit {
// // RT <- i56.0 || MEM(EA, 1)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.ReadMemory(i.address, ea, 1, false);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.ReadMemory(i.address, ea, 1, false);
// e.update_gpr_value(i.X.RT, v);
// e.update_gpr_value(i.X.RA, ea);
@ -73,11 +73,11 @@ namespace libjit {
// // EA <- b + (RB)
// // RT <- i56.0 || MEM(EA, 1)
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 1, false);
// jit_value_t v = e.ReadMemory(i.address, ea, 1, false);
// e.update_gpr_value(i.X.RT, v);
// return 0;
@ -91,11 +91,11 @@ namespace libjit {
// // EA <- b + EXTS(DS || 0b00)
// // RT <- MEM(EA, 8)
// Value* ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
// jit_value_t ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
// if (i.DS.RA) {
// ea = b.CreateAdd(e.gpr_value(i.DS.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 8, false);
// jit_value_t v = e.ReadMemory(i.address, ea, 8, false);
// e.update_gpr_value(i.DS.RT, v);
// return 0;
@ -106,9 +106,9 @@ namespace libjit {
// // RT <- MEM(EA, 8)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.DS.RA),
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.DS.RA),
// b.getInt64(XEEXTS16(i.DS.DS << 2)));
// Value* v = e.ReadMemory(i.address, ea, 8, false);
// jit_value_t v = e.ReadMemory(i.address, ea, 8, false);
// e.update_gpr_value(i.DS.RT, v);
// e.update_gpr_value(i.DS.RA, ea);
@ -133,12 +133,12 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // RT <- EXTS(MEM(EA, 2))
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = b.CreateSExt(e.ReadMemory(i.address, ea, 2, false),
// b.getInt64Ty());
// jit_value_t v = b.CreateSExt(e.ReadMemory(i.address, ea, 2, false),
// jit_type_nint);
// e.update_gpr_value(i.D.RT, v);
// return 0;
@ -162,12 +162,12 @@ namespace libjit {
// // EA <- b + (RB)
// // RT <- EXTS(MEM(EA, 2))
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = b.CreateSExt(e.ReadMemory(i.address, ea, 2, false),
// b.getInt64Ty());
// jit_value_t v = b.CreateSExt(e.ReadMemory(i.address, ea, 2, false),
// jit_type_nint);
// e.update_gpr_value(i.X.RT, v);
// return 0;
@ -181,11 +181,11 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // RT <- i48.0 || MEM(EA, 2)
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 2, false);
// jit_value_t v = e.ReadMemory(i.address, ea, 2, false);
// e.update_gpr_value(i.D.RT, v);
// return 0;
@ -196,8 +196,8 @@ namespace libjit {
// // RT <- i48.0 || MEM(EA, 2)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.ReadMemory(i.address, ea, 2, false);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// jit_value_t v = e.ReadMemory(i.address, ea, 2, false);
// e.update_gpr_value(i.D.RT, v);
// e.update_gpr_value(i.D.RA, ea);
@ -209,8 +209,8 @@ namespace libjit {
// // RT <- i48.0 || MEM(EA, 2)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.ReadMemory(i.address, ea, 2, false);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.ReadMemory(i.address, ea, 2, false);
// e.update_gpr_value(i.X.RT, v);
// e.update_gpr_value(i.X.RA, ea);
@ -225,11 +225,11 @@ namespace libjit {
// // EA <- b + (RB)
// // RT <- i48.0 || MEM(EA, 2)
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 2, false);
// jit_value_t v = e.ReadMemory(i.address, ea, 2, false);
// e.update_gpr_value(i.X.RT, v);
// return 0;
@ -243,12 +243,12 @@ namespace libjit {
// // EA <- b + EXTS(D || 00)
// // RT <- EXTS(MEM(EA, 4))
// Value* ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
// jit_value_t ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
// if (i.DS.RA) {
// ea = b.CreateAdd(e.gpr_value(i.DS.RA), ea);
// }
// Value* v = b.CreateSExt(e.ReadMemory(i.address, ea, 4, false),
// b.getInt64Ty());
// jit_value_t v = b.CreateSExt(e.ReadMemory(i.address, ea, 4, false),
// jit_type_nint);
// e.update_gpr_value(i.DS.RT, v);
// return 0;
@ -259,9 +259,9 @@ namespace libjit {
// // RT <- EXTS(MEM(EA, 4))
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = b.CreateSExt(e.ReadMemory(i.address, ea, 4, false),
// b.getInt64Ty());
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = b.CreateSExt(e.ReadMemory(i.address, ea, 4, false),
// jit_type_nint);
// e.update_gpr_value(i.X.RT, v);
// e.update_gpr_value(i.X.RA, ea);
@ -276,12 +276,12 @@ namespace libjit {
// // EA <- b + (RB)
// // RT <- EXTS(MEM(EA, 4))
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = b.CreateSExt(e.ReadMemory(i.address, ea, 4, false),
// b.getInt64Ty());
// jit_value_t v = b.CreateSExt(e.ReadMemory(i.address, ea, 4, false),
// jit_type_nint);
// e.update_gpr_value(i.X.RT, v);
// return 0;
@ -295,11 +295,11 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // RT <- i32.0 || MEM(EA, 4)
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 4, false);
// jit_value_t v = e.ReadMemory(i.address, ea, 4, false);
// e.update_gpr_value(i.D.RT, v);
// return 0;
@ -310,8 +310,8 @@ namespace libjit {
// // RT <- i32.0 || MEM(EA, 4)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.ReadMemory(i.address, ea, 4, false);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// jit_value_t v = e.ReadMemory(i.address, ea, 4, false);
// e.update_gpr_value(i.D.RT, v);
// e.update_gpr_value(i.D.RA, ea);
@ -323,8 +323,8 @@ namespace libjit {
// // RT <- i32.0 || MEM(EA, 4)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.ReadMemory(i.address, ea, 4, false);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.ReadMemory(i.address, ea, 4, false);
// e.update_gpr_value(i.X.RT, v);
// e.update_gpr_value(i.X.RA, ea);
@ -339,11 +339,11 @@ namespace libjit {
// // EA <- b + (RB)
// // RT <- i32.0 || MEM(EA, 4)
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 4, false);
// jit_value_t v = e.ReadMemory(i.address, ea, 4, false);
// e.update_gpr_value(i.X.RT, v);
// return 0;
@ -360,11 +360,11 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // MEM(EA, 1) <- (RS)[56:63]
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.gpr_value(i.D.RT);
// jit_value_t v = e.gpr_value(i.D.RT);
// e.WriteMemory(i.address, ea, 1, v);
// return 0;
@ -375,8 +375,8 @@ namespace libjit {
// // MEM(EA, 1) <- (RS)[56:63]
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.gpr_value(i.D.RT);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// jit_value_t v = e.gpr_value(i.D.RT);
// e.WriteMemory(i.address, ea, 1, v);
// e.update_gpr_value(i.D.RA, ea);
@ -388,8 +388,8 @@ namespace libjit {
// // MEM(EA, 1) <- (RS)[56:63]
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.gpr_value(i.X.RT);
// e.WriteMemory(i.address, ea, 1, v);
// e.update_gpr_value(i.X.RA, ea);
@ -404,11 +404,11 @@ namespace libjit {
// // EA <- b + (RB)
// // MEM(EA, 1) <- (RS)[56:63]
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t v = e.gpr_value(i.X.RT);
// e.WriteMemory(i.address, ea, 1, v);
// return 0;
@ -422,11 +422,11 @@ namespace libjit {
// // EA <- b + EXTS(DS || 0b00)
// // MEM(EA, 8) <- (RS)
// Value* ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
// jit_value_t ea = b.getInt64(XEEXTS16(i.DS.DS << 2));
// if (i.DS.RA) {
// ea = b.CreateAdd(e.gpr_value(i.DS.RA), ea);
// }
// Value* v = e.gpr_value(i.DS.RT);
// jit_value_t v = e.gpr_value(i.DS.RT);
// e.WriteMemory(i.address, ea, 8, v);
// return 0;
@ -437,9 +437,9 @@ namespace libjit {
// // MEM(EA, 8) <- (RS)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.DS.RA),
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.DS.RA),
// b.getInt64(XEEXTS16(i.DS.DS << 2)));
// Value* v = e.gpr_value(i.DS.RT);
// jit_value_t v = e.gpr_value(i.DS.RT);
// e.WriteMemory(i.address, ea, 8, v);
// e.update_gpr_value(i.DS.RA, ea);
@ -454,11 +454,11 @@ namespace libjit {
// // EA <- b + (RB)
// // MEM(EA, 8) <- (RS)
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t v = e.gpr_value(i.X.RT);
// e.WriteMemory(i.address, ea, 8, v);
// return 0;
@ -469,8 +469,8 @@ namespace libjit {
// // MEM(EA, 8) <- (RS)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.gpr_value(i.X.RT);
// e.WriteMemory(i.address, ea, 8, v);
// e.update_gpr_value(i.X.RA, ea);
@ -485,11 +485,11 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // MEM(EA, 2) <- (RS)[48:63]
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.gpr_value(i.D.RT);
// jit_value_t v = e.gpr_value(i.D.RT);
// e.WriteMemory(i.address, ea, 2, v);
// return 0;
@ -500,9 +500,9 @@ namespace libjit {
// // MEM(EA, 2) <- (RS)[48:63]
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA),
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA),
// b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.gpr_value(i.D.RT);
// jit_value_t v = e.gpr_value(i.D.RT);
// e.WriteMemory(i.address, ea, 2, v);
// e.update_gpr_value(i.D.RA, ea);
@ -514,8 +514,8 @@ namespace libjit {
// // MEM(EA, 2) <- (RS)[48:63]
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.gpr_value(i.X.RT);
// e.WriteMemory(i.address, ea, 2, v);
// e.update_gpr_value(i.X.RA, ea);
@ -530,11 +530,11 @@ namespace libjit {
// // EA <- b + (RB)
// // MEM(EA, 2) <- (RS)[48:63]
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t v = e.gpr_value(i.X.RT);
// e.WriteMemory(i.address, ea, 2, v);
// return 0;
@ -548,11 +548,11 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // MEM(EA, 4) <- (RS)[32:63]
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.gpr_value(i.D.RT);
// jit_value_t v = e.gpr_value(i.D.RT);
// e.WriteMemory(i.address, ea, 4, v);
// return 0;
@ -563,9 +563,9 @@ namespace libjit {
// // MEM(EA, 4) <- (RS)[32:63]
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA),
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA),
// b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.gpr_value(i.D.RT);
// jit_value_t v = e.gpr_value(i.D.RT);
// e.WriteMemory(i.address, ea, 4, v);
// e.update_gpr_value(i.D.RA, ea);
@ -577,8 +577,8 @@ namespace libjit {
// // MEM(EA, 4) <- (RS)[32:63]
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.gpr_value(i.X.RT);
// e.WriteMemory(i.address, ea, 4, v);
// e.update_gpr_value(i.X.RA, ea);
@ -593,11 +593,11 @@ namespace libjit {
// // EA <- b + (RB)
// // MEM(EA, 4) <- (RS)[32:63]
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.gpr_value(i.X.RT);
// jit_value_t v = e.gpr_value(i.X.RT);
// e.WriteMemory(i.address, ea, 4, v);
// return 0;
@ -703,11 +703,11 @@ namespace libjit {
// // TODO(benvanik): make this right
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 4, /* acquire */ true);
// jit_value_t v = e.ReadMemory(i.address, ea, 4, /* acquire */ true);
// e.update_gpr_value(i.X.RT, v);
// return 0;
@ -731,11 +731,11 @@ namespace libjit {
// // TODO(benvanik): make this right
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.gpr_value(i.D.RT);
// jit_value_t v = e.gpr_value(i.D.RT);
// e.WriteMemory(i.address, ea, 4, v, /* release */ true);
// // We always succeed.
@ -760,12 +760,12 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // FRT <- MEM(EA, 8)
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 8, false);
// v = b.CreateBitCast(v, b.getDoubleTy());
// jit_value_t v = e.ReadMemory(i.address, ea, 8, false);
// v = b.CreateBitCast(v, jit_type_float64);
// e.update_fpr_value(i.D.RT, v);
// return 0;
@ -776,9 +776,9 @@ namespace libjit {
// // FRT <- MEM(EA, 8)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.ReadMemory(i.address, ea, 8, false);
// v = b.CreateBitCast(v, b.getDoubleTy());
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// jit_value_t v = e.ReadMemory(i.address, ea, 8, false);
// v = b.CreateBitCast(v, jit_type_float64);
// e.update_fpr_value(i.D.RT, v);
// e.update_gpr_value(i.D.RA, ea);
@ -790,9 +790,9 @@ namespace libjit {
// // FRT <- MEM(EA, 8)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.ReadMemory(i.address, ea, 8, false);
// v = b.CreateBitCast(v, b.getDoubleTy());
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.ReadMemory(i.address, ea, 8, false);
// v = b.CreateBitCast(v, jit_type_float64);
// e.update_fpr_value(i.X.RT, v);
// e.update_gpr_value(i.X.RA, ea);
@ -807,12 +807,12 @@ namespace libjit {
// // EA <- b + (RB)
// // FRT <- MEM(EA, 8)
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 8, false);
// v = b.CreateBitCast(v, b.getDoubleTy());
// jit_value_t v = e.ReadMemory(i.address, ea, 8, false);
// v = b.CreateBitCast(v, jit_type_float64);
// e.update_fpr_value(i.X.RT, v);
// return 0;
@ -826,12 +826,12 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // FRT <- DOUBLE(MEM(EA, 4))
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 4, false);
// v = b.CreateFPExt(b.CreateBitCast(v, b.getFloatTy()), b.getDoubleTy());
// jit_value_t v = e.ReadMemory(i.address, ea, 4, false);
// v = b.CreateFPExt(b.CreateBitCast(v, b.getFloatTy()), jit_type_float64);
// e.update_fpr_value(i.D.RT, v);
// return 0;
@ -842,9 +842,9 @@ namespace libjit {
// // FRT <- DOUBLE(MEM(EA, 4))
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.ReadMemory(i.address, ea, 4, false);
// v = b.CreateFPExt(b.CreateBitCast(v, b.getFloatTy()), b.getDoubleTy());
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA), b.getInt64(XEEXTS16(i.D.DS)));
// jit_value_t v = e.ReadMemory(i.address, ea, 4, false);
// v = b.CreateFPExt(b.CreateBitCast(v, b.getFloatTy()), jit_type_float64);
// e.update_fpr_value(i.D.RT, v);
// e.update_gpr_value(i.D.RA, ea);
@ -856,9 +856,9 @@ namespace libjit {
// // FRT <- DOUBLE(MEM(EA, 4))
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.ReadMemory(i.address, ea, 4, false);
// v = b.CreateFPExt(b.CreateBitCast(v, b.getFloatTy()), b.getDoubleTy());
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.ReadMemory(i.address, ea, 4, false);
// v = b.CreateFPExt(b.CreateBitCast(v, b.getFloatTy()), jit_type_float64);
// e.update_fpr_value(i.X.RT, v);
// e.update_gpr_value(i.X.RA, ea);
@ -873,12 +873,12 @@ namespace libjit {
// // EA <- b + (RB)
// // FRT <- DOUBLE(MEM(EA, 4))
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.ReadMemory(i.address, ea, 4, false);
// v = b.CreateFPExt(b.CreateBitCast(v, b.getFloatTy()), b.getDoubleTy());
// jit_value_t v = e.ReadMemory(i.address, ea, 4, false);
// v = b.CreateFPExt(b.CreateBitCast(v, b.getFloatTy()), jit_type_float64);
// e.update_fpr_value(i.X.RT, v);
// return 0;
@ -895,12 +895,12 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // MEM(EA, 8) <- (FRS)
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.fpr_value(i.D.RT);
// v = b.CreateBitCast(v, b.getInt64Ty());
// jit_value_t v = e.fpr_value(i.D.RT);
// v = b.CreateBitCast(v, jit_type_nint);
// e.WriteMemory(i.address, ea, 8, v);
// return 0;
@ -911,10 +911,10 @@ namespace libjit {
// // MEM(EA, 8) <- (FRS)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA),
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA),
// b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.fpr_value(i.D.RT);
// v = b.CreateBitCast(v, b.getInt64Ty());
// jit_value_t v = e.fpr_value(i.D.RT);
// v = b.CreateBitCast(v, jit_type_nint);
// e.WriteMemory(i.address, ea, 8, v);
// e.update_gpr_value(i.D.RA, ea);
@ -926,9 +926,9 @@ namespace libjit {
// // MEM(EA, 8) <- (FRS)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.fpr_value(i.X.RT);
// v = b.CreateBitCast(v, b.getInt64Ty());
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.fpr_value(i.X.RT);
// v = b.CreateBitCast(v, jit_type_nint);
// e.WriteMemory(i.address, ea, 8, v);
// e.update_gpr_value(i.X.RA, ea);
@ -943,12 +943,12 @@ namespace libjit {
// // EA <- b + (RB)
// // MEM(EA, 8) <- (FRS)
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.fpr_value(i.X.RT);
// v = b.CreateBitCast(v, b.getInt64Ty());
// jit_value_t v = e.fpr_value(i.X.RT);
// v = b.CreateBitCast(v, jit_type_nint);
// e.WriteMemory(i.address, ea, 8, v);
// return 0;
@ -962,12 +962,12 @@ namespace libjit {
// // EA <- b + (RB)
// // MEM(EA, 4) <- (FRS)[32:63]
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.fpr_value(i.X.RT);
// v = b.CreateBitCast(v, b.getInt64Ty());
// jit_value_t v = e.fpr_value(i.X.RT);
// v = b.CreateBitCast(v, jit_type_nint);
// e.WriteMemory(i.address, ea, 4, v);
// return 0;
@ -981,11 +981,11 @@ namespace libjit {
// // EA <- b + EXTS(D)
// // MEM(EA, 4) <- SINGLE(FRS)
// Value* ea = b.getInt64(XEEXTS16(i.D.DS));
// jit_value_t ea = b.getInt64(XEEXTS16(i.D.DS));
// if (i.D.RA) {
// ea = b.CreateAdd(e.gpr_value(i.D.RA), ea);
// }
// Value* v = e.fpr_value(i.D.RT);
// jit_value_t v = e.fpr_value(i.D.RT);
// v = b.CreateBitCast(b.CreateFPTrunc(v, b.getFloatTy()), b.getInt32Ty());
// e.WriteMemory(i.address, ea, 4, v);
@ -997,9 +997,9 @@ namespace libjit {
// // MEM(EA, 4) <- SINGLE(FRS)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.D.RA),
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.D.RA),
// b.getInt64(XEEXTS16(i.D.DS)));
// Value* v = e.fpr_value(i.D.RT);
// jit_value_t v = e.fpr_value(i.D.RT);
// v = b.CreateBitCast(b.CreateFPTrunc(v, b.getFloatTy()), b.getInt32Ty());
// e.WriteMemory(i.address, ea, 4, v);
// e.update_gpr_value(i.D.RA, ea);
@ -1012,8 +1012,8 @@ namespace libjit {
// // MEM(EA, 4) <- SINGLE(FRS)
// // RA <- EA
// Value* ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// Value* v = e.fpr_value(i.X.RT);
// jit_value_t ea = b.CreateAdd(e.gpr_value(i.X.RA), e.gpr_value(i.X.RB));
// jit_value_t v = e.fpr_value(i.X.RT);
// v = b.CreateBitCast(b.CreateFPTrunc(v, b.getFloatTy()), b.getInt32Ty());
// e.WriteMemory(i.address, ea, 4, v);
// e.update_gpr_value(i.X.RA, ea);
@ -1029,11 +1029,11 @@ namespace libjit {
// // EA <- b + (RB)
// // MEM(EA, 4) <- SINGLE(FRS)
// Value* ea = e.gpr_value(i.X.RB);
// jit_value_t ea = e.gpr_value(i.X.RB);
// if (i.X.RA) {
// ea = b.CreateAdd(e.gpr_value(i.X.RA), ea);
// }
// Value* v = e.fpr_value(i.X.RT);
// jit_value_t v = e.fpr_value(i.X.RT);
// v = b.CreateBitCast(b.CreateFPTrunc(v, b.getFloatTy()), b.getInt32Ty());
// e.WriteMemory(i.address, ea, 4, v);

File diff suppressed because it is too large Load Diff

View File

@ -36,13 +36,12 @@ public:
jit_function_t fn();
sdb::FunctionBlock* fn_block();
void PushInsertPoint();
void PopInsertPoint();
void GenerateBasicBlocks();
// llvm::BasicBlock* GetBasicBlock(uint32_t address);
// llvm::BasicBlock* GetNextBasicBlock();
// llvm::BasicBlock* GetReturnBasicBlock();
int branch_to_block(uint32_t address);
int branch_to_block_if(uint32_t address, jit_value_t value);
int branch_to_block_if_not(uint32_t address, jit_value_t value);
int branch_to_return();
int branch_to_return_if(jit_value_t value);
int branch_to_return_if_not(jit_value_t value);
int GenerateIndirectionBranch(uint32_t cia, jit_value_t target,
bool lk, bool likely_local);
@ -92,6 +91,7 @@ private:
int MakePresentImportFunction();
int MakeMissingImportFunction();
void GenerateBasicBlocks();
void GenerateSharedBlocks();
int PrepareBasicBlock(sdb::FunctionBlock* block);
void GenerateBasicBlock(sdb::FunctionBlock* block);
@ -109,15 +109,11 @@ private:
sdb::FunctionSymbol* symbol_;
jit_function_t fn_;
sdb::FunctionBlock* fn_block_;
// llvm::BasicBlock* return_block_;
// llvm::BasicBlock* internal_indirection_block_;
// llvm::BasicBlock* external_indirection_block_;
// llvm::BasicBlock* bb_;
jit_label_t return_block_;
jit_label_t internal_indirection_block_;
jit_label_t external_indirection_block_;
// std::vector<std::pair<llvm::BasicBlock*, llvm::BasicBlock::iterator> >
// insert_points_;
//std::map<uint32_t, llvm::BasicBlock*> bbs_;
std::map<uint32_t, jit_label_t> bbs_;
// Address of the instruction being generated.
uint32_t cia_;

View File

@ -292,7 +292,7 @@ void InstrDisasm::AddSImmOperand(uint64_t value, size_t width,
o.type = InstrOperand::kImmediate;
o.imm.is_signed = true;
o.imm.value = value;
o.imm.width = value;
o.imm.width = width;
o.display = display;
operands.push_back(o);
}
@ -303,7 +303,7 @@ void InstrDisasm::AddUImmOperand(uint64_t value, size_t width,
o.type = InstrOperand::kImmediate;
o.imm.is_signed = false;
o.imm.value = value;
o.imm.width = value;
o.imm.width = width;
o.display = display;
operands.push_back(o);
}