refactoring

pull/81/head
Dibyendu Majumdar 9 years ago
parent c8380d3525
commit fcb22d1da2

@ -648,15 +648,13 @@ public:
int offset);
// emit code to load pointer L->ci->u.l.base
llvm::Instruction *emit_load_base(RaviFunctionDef *def);
void emit_load_base(RaviFunctionDef *def);
// emit code to obtain address of register at location A
llvm::Value *emit_gep_register(RaviFunctionDef *def, llvm::Instruction *base,
int A);
llvm::Value *emit_gep_register(RaviFunctionDef *def, int A);
// emit code to obtain address of register or constant at location B
llvm::Value *emit_gep_register_or_constant(RaviFunctionDef *def, llvm::Instruction *base,
int B);
llvm::Value *emit_gep_register_or_constant(RaviFunctionDef *def, int B);
// obtain address of L->top
llvm::Value *emit_gep_L_top(RaviFunctionDef *def);
@ -746,8 +744,7 @@ public:
void emit_refresh_L_top(RaviFunctionDef *def);
// L->top = R(B)
void emit_set_L_top_toreg(RaviFunctionDef *def, llvm::Instruction *base_ptr,
int B);
void emit_set_L_top_toreg(RaviFunctionDef *def, int B);
// Look for Lua bytecodes that are jump targets and allocate
// a BasicBlock for each such target in def->jump_targets.
@ -929,8 +926,7 @@ public:
void emit_MOVEAF(RaviFunctionDef *def, int A, int B);
// Return the base pointer
llvm::Instruction *emit_TOARRAY(RaviFunctionDef *def, int A,
void emit_TOARRAY(RaviFunctionDef *def, int A,
int array_type_expected, const char *errmsg);
private:

@ -30,9 +30,9 @@ namespace ravi {
// R(A) := -R(B), floating point
void RaviCodeGenerator::emit_UNMF(RaviFunctionDef *def, int A, int B) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Value *result = def->builder->CreateFNeg(lhs);
emit_store_reg_n(def, result, ra);
@ -41,9 +41,9 @@ void RaviCodeGenerator::emit_UNMF(RaviFunctionDef *def, int A, int B) {
// R(A) := -R(B), integer
void RaviCodeGenerator::emit_UNMI(RaviFunctionDef *def, int A, int B) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Value *result = def->builder->CreateNeg(lhs, "", false, true);
emit_store_reg_i(def, result, ra);
@ -52,9 +52,9 @@ void RaviCodeGenerator::emit_UNMI(RaviFunctionDef *def, int A, int B) {
// R(A) := RK(B) + C, result is floating
void RaviCodeGenerator::emit_ADDFN(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Value *result = def->builder->CreateFAdd(
lhs,
@ -66,10 +66,10 @@ void RaviCodeGenerator::emit_ADDFN(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) + RK(C), all floating
void RaviCodeGenerator::emit_ADDFF(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Instruction *rhs = emit_load_reg_n(def, rc);
llvm::Value *result = def->builder->CreateFAdd(lhs, rhs);
@ -79,10 +79,10 @@ void RaviCodeGenerator::emit_ADDFF(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) + RK(C), float+int
void RaviCodeGenerator::emit_ADDFI(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateFAdd(
@ -94,10 +94,10 @@ void RaviCodeGenerator::emit_ADDFI(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) + RK(C), int+int
void RaviCodeGenerator::emit_ADDII(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateAdd(lhs, rhs, "", false, true);
@ -107,9 +107,9 @@ void RaviCodeGenerator::emit_ADDII(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) + C, int+c
void RaviCodeGenerator::emit_ADDIN(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Value *result = def->builder->CreateAdd(
lhs, llvm::ConstantInt::get(def->types->lua_IntegerT, C), "", false,
@ -120,10 +120,10 @@ void RaviCodeGenerator::emit_ADDIN(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) - RK(C), float-float
void RaviCodeGenerator::emit_SUBFF(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Instruction *rhs = emit_load_reg_n(def, rc);
llvm::Value *result = def->builder->CreateFSub(lhs, rhs);
@ -133,10 +133,10 @@ void RaviCodeGenerator::emit_SUBFF(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) - RK(C), float-int
void RaviCodeGenerator::emit_SUBFI(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateFSub(
@ -147,10 +147,10 @@ void RaviCodeGenerator::emit_SUBFI(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) - RK(C), int-float
void RaviCodeGenerator::emit_SUBIF(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Instruction *rhs = emit_load_reg_n(def, rc);
llvm::Value *result = def->builder->CreateFSub(
@ -161,10 +161,10 @@ void RaviCodeGenerator::emit_SUBIF(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) - RK(C), int-int
void RaviCodeGenerator::emit_SUBII(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateSub(lhs, rhs, "", false, true);
@ -174,9 +174,9 @@ void RaviCodeGenerator::emit_SUBII(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) - C, float - c
void RaviCodeGenerator::emit_SUBFN(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Value *result = def->builder->CreateFSub(
lhs,
@ -188,9 +188,9 @@ void RaviCodeGenerator::emit_SUBFN(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := B - RK(C), b - float
void RaviCodeGenerator::emit_SUBNF(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *rhs = emit_load_reg_n(def, rc);
llvm::Value *result = def->builder->CreateFSub(
def->builder->CreateSIToFP(llvm::ConstantInt::get(def->types->C_intT, B),
@ -202,9 +202,9 @@ void RaviCodeGenerator::emit_SUBNF(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := B - RK(C), b - int
void RaviCodeGenerator::emit_SUBIN(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Value *result = def->builder->CreateSub(
lhs, llvm::ConstantInt::get(def->types->lua_IntegerT, C), "", false,
@ -215,9 +215,9 @@ void RaviCodeGenerator::emit_SUBIN(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) - C, int - c
void RaviCodeGenerator::emit_SUBNI(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateSub(
llvm::ConstantInt::get(def->types->lua_IntegerT, C), rhs, "", false,
@ -228,9 +228,9 @@ void RaviCodeGenerator::emit_SUBNI(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) * C, float*c
void RaviCodeGenerator::emit_MULFN(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Value *result = def->builder->CreateFMul(
lhs,
@ -242,10 +242,10 @@ void RaviCodeGenerator::emit_MULFN(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) * RK(C), float*float
void RaviCodeGenerator::emit_MULFF(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Instruction *rhs = emit_load_reg_n(def, rc);
llvm::Value *result = def->builder->CreateFMul(lhs, rhs);
@ -255,10 +255,10 @@ void RaviCodeGenerator::emit_MULFF(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) * RK(C), float*int
void RaviCodeGenerator::emit_MULFI(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateFMul(
@ -270,10 +270,10 @@ void RaviCodeGenerator::emit_MULFI(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) * RK(C), int*int
void RaviCodeGenerator::emit_MULII(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateMul(lhs, rhs, "", false, true);
@ -283,9 +283,9 @@ void RaviCodeGenerator::emit_MULII(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) * C, int*c
void RaviCodeGenerator::emit_MULIN(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Value *result = def->builder->CreateMul(
lhs, llvm::ConstantInt::get(def->types->lua_IntegerT, C), "", false,
@ -296,10 +296,10 @@ void RaviCodeGenerator::emit_MULIN(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) / RK(C), float/float
void RaviCodeGenerator::emit_DIVFF(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Instruction *rhs = emit_load_reg_n(def, rc);
llvm::Value *result = def->builder->CreateFDiv(lhs, rhs);
@ -309,10 +309,10 @@ void RaviCodeGenerator::emit_DIVFF(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) / RK(C), float/int
void RaviCodeGenerator::emit_DIVFI(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateFDiv(
@ -323,10 +323,10 @@ void RaviCodeGenerator::emit_DIVFI(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) / RK(C), int/float
void RaviCodeGenerator::emit_DIVIF(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Instruction *rhs = emit_load_reg_n(def, rc);
llvm::Value *result = def->builder->CreateFDiv(
@ -337,10 +337,10 @@ void RaviCodeGenerator::emit_DIVIF(RaviFunctionDef *def, int A, int B, int C) {
// R(A) := RK(B) / RK(C), int/int but result is float
void RaviCodeGenerator::emit_DIVII(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *lhs = emit_load_reg_i(def, rb);
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result = def->builder->CreateFDiv(

@ -46,10 +46,10 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, int A, int B, int C,
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Value *nc = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nc");
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Value *rb_type = emit_load_type(def, rb);
llvm::Value *rc_type = emit_load_type(def, rc);
@ -243,10 +243,10 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, int A, int B, int C) {
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Value *nc = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nc");
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Value *rb_type = emit_load_type(def, rb);
llvm::Value *rc_type = emit_load_type(def, rc);
@ -436,10 +436,10 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, int A, int B, int C) {
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Value *nc = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nc");
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Value *rb_type = emit_load_type(def, rb);
llvm::Value *rc_type = emit_load_type(def, rc);
@ -595,10 +595,10 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, int A, int B, int C) {
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Value *nc = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nc");
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Value *rb_type = emit_load_type(def, rb);
llvm::Value *rc_type = emit_load_type(def, rc);
@ -727,9 +727,9 @@ void RaviCodeGenerator::emit_UNM(RaviFunctionDef *def, int A, int B) {
llvm::IRBuilder<> TmpB(def->entry, def->entry->begin());
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rb_type = emit_load_type(def, rb);

@ -43,9 +43,9 @@ void RaviCodeGenerator::emit_JMP(RaviFunctionDef *def, int A, int j) {
// if (a > 0) luaF_close(L, ci->u.l.base + a - 1);
if (A > 0) {
llvm::Instruction *base = emit_load_base(def);
emit_load_base(def);
// base + a - 1
llvm::Value *val = emit_gep_register(def, base, A - 1);
llvm::Value *val = emit_gep_register(def, A - 1);
// Call luaF_close
CreateCall2(def->builder, def->luaF_closeF, def->L, val);
}
@ -71,14 +71,14 @@ void RaviCodeGenerator::emit_CALL(RaviFunctionDef *def, int A, int B, int C) {
// luaV_execute(L);
// }
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// int nresults = c - 1;
int nresults = C - 1;
// if (b != 0)
if (B != 0) {
emit_set_L_top_toreg(def, base_ptr, A + B);
emit_set_L_top_toreg(def, A + B);
}
// luaD_precall() returns following
@ -87,7 +87,7 @@ void RaviCodeGenerator::emit_CALL(RaviFunctionDef *def, int A, int B, int C) {
// 0 - Run interpreter on Lua function
// int c = luaD_precall(L, ra, nresults); /* C or JITed function? */
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *precall_result =
CreateCall3(def->builder, def->luaD_precallF, def->L, ra,
llvm::ConstantInt::get(def->types->C_intT, nresults));

@ -135,26 +135,24 @@ llvm::Value *RaviCodeGenerator::emit_array_get(RaviFunctionDef *def,
ptr, llvm::ConstantInt::get(def->types->C_intT, offset));
}
llvm::Instruction *RaviCodeGenerator::emit_load_base(RaviFunctionDef *def) {
void RaviCodeGenerator::emit_load_base(RaviFunctionDef *def) {
// Load pointer to base
llvm::Instruction *base_ptr = def->builder->CreateLoad(def->Ci_base);
base_ptr->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_luaState_ci_baseT);
def->base_ptr = base_ptr;
return base_ptr;
}
// emit code to obtain address of register at location A
llvm::Value *RaviCodeGenerator::emit_gep_register(RaviFunctionDef *def,
llvm::Instruction *base_ptr,
int A) {
llvm::Value *dest;
if (A == 0) {
// If A is 0 we can use the base pointer which is &base[0]
dest = base_ptr;
dest = def->base_ptr;
} else {
// emit &base[A]
dest = emit_array_get(def, base_ptr, A);
dest = emit_array_get(def, def->base_ptr, A);
}
return dest;
}
@ -399,12 +397,12 @@ llvm::Instruction *RaviCodeGenerator::emit_load_local_int(RaviFunctionDef *def,
// emit code to obtain address of register or constant at location B
llvm::Value *RaviCodeGenerator::emit_gep_register_or_constant(
RaviFunctionDef *def, llvm::Instruction *base_ptr, int B) {
RaviFunctionDef *def, int B) {
// Load pointer to k
llvm::Value *k_ptr = def->k_ptr;
llvm::Value *rb;
// Get pointer to register B
llvm::Value *base_or_k = ISK(B) ? k_ptr : base_ptr;
llvm::Value *base_or_k = ISK(B) ? k_ptr : def->base_ptr;
int b = ISK(B) ? INDEXK(B) : B;
if (b == 0) {
rb = base_or_k;
@ -439,10 +437,9 @@ llvm::Value *RaviCodeGenerator::emit_gep_L_top(RaviFunctionDef *def) {
// L->top = R(B)
void RaviCodeGenerator::emit_set_L_top_toreg(RaviFunctionDef *def,
llvm::Instruction *base_ptr,
int B) {
// Get pointer to register at R(B)
llvm::Value *ptr = emit_gep_register(def, base_ptr, B);
llvm::Value *ptr = emit_gep_register(def, B);
// Get pointer to L->top
llvm::Value *top = emit_gep_L_top(def);
// Assign to L->top
@ -982,7 +979,7 @@ void RaviCodeGenerator::compile(lua_State *L, Proto *p, bool doDump,
// and is a value of type LClosure*
// fortunately as func is at the beginning of the ci
// structure we can just cast ci to LClosure*
llvm::Value *L_cl = emit_gep_ci_func_value_gc_asLClosure(def, def->ci_val);
llvm::Value *L_cl = emit_gep_ci_func_value_gc_asLClosure(def);
// Load pointer to LClosure
llvm::Instruction *cl_ptr = builder.CreateLoad(L_cl);

@ -40,12 +40,12 @@ void RaviCodeGenerator::emit_EQ(RaviFunctionDef *def, int A, int B, int C, int j
// } break;
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// Get pointer to register B
llvm::Value *lhs_ptr = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *lhs_ptr = emit_gep_register_or_constant(def, B);
// Get pointer to register C
llvm::Value *rhs_ptr = emit_gep_register_or_constant(def, base_ptr, C);
llvm::Value *rhs_ptr = emit_gep_register_or_constant(def, C);
// Call luaV_equalobj with register B and C
llvm::Value *result =
@ -68,11 +68,10 @@ void RaviCodeGenerator::emit_EQ(RaviFunctionDef *def, int A, int B, int C, int j
// Reload pointer to base as the call to luaV_equalobj() may
// have invoked a Lua function and as a result the stack may have
// been reallocated - so the previous base pointer could be stale
base_ptr = emit_load_base(def);
emit_load_base(def);
// base + a - 1
llvm::Value *val =
jA == 1 ? base_ptr : emit_array_get(def, base_ptr, jA - 1);
llvm::Value *val = emit_gep_register(def, jA-1);
// Call luaF_close
CreateCall2(def->builder, def->luaF_closeF, def->L, val);
@ -154,10 +153,10 @@ void RaviCodeGenerator::emit_TEST(RaviFunctionDef *def, int A, int B, int C,
// } break;
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// Get pointer to register A
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *ra = emit_gep_register(def, A);
// v = C ? is_false(ra) : !is_false(ra)
llvm::Value *v = C ? emit_boolean_testfalse(def, ra, false)
: emit_boolean_testfalse(def, ra, true);
@ -177,8 +176,7 @@ void RaviCodeGenerator::emit_TEST(RaviFunctionDef *def, int A, int B, int C,
// jA is the A operand of the Jump instruction
// base + a - 1
llvm::Value *val =
jA == 1 ? base_ptr : emit_array_get(def, base_ptr, jA - 1);
llvm::Value *val = emit_gep_register(def, jA - 1);
// Call luaF_close
CreateCall2(def->builder, def->luaF_closeF, def->L, val);
@ -198,12 +196,12 @@ void RaviCodeGenerator::emit_NOT(RaviFunctionDef *def, int A, int B) {
// int res = l_isfalse(rb); /* next assignment may change this value */
// setbvalue(ra, res);
// } break;
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// Get pointer to register B
llvm::Value *rb = emit_gep_register(def, base_ptr, B);
llvm::Value *rb = emit_gep_register(def, B);
llvm::Value *v = emit_boolean_testfalse(def, rb, false);
llvm::Value *result = def->builder->CreateZExt(v, def->types->C_intT, "i");
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *ra = emit_gep_register(def, A);
emit_store_reg_b(def, result, ra);
emit_store_type(def, ra, LUA_TBOOLEAN);
}
@ -222,10 +220,10 @@ void RaviCodeGenerator::emit_TESTSET(RaviFunctionDef *def, int A, int B, int C,
// } break;
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// Get pointer to register B
llvm::Value *rb = emit_gep_register(def, base_ptr, B);
llvm::Value *rb = emit_gep_register(def, B);
// v = C ? is_false(ra) : !is_false(ra)
llvm::Value *v = C ? emit_boolean_testfalse(def, rb, false)
: emit_boolean_testfalse(def, rb, true);
@ -241,7 +239,7 @@ void RaviCodeGenerator::emit_TESTSET(RaviFunctionDef *def, int A, int B, int C,
def->builder->SetInsertPoint(then_block);
// Get pointer to register A
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *ra = emit_gep_register(def, A);
emit_assign(def, ra, rb);
// if (a > 0) luaF_close(L, ci->u.l.base + a - 1);
@ -249,8 +247,7 @@ void RaviCodeGenerator::emit_TESTSET(RaviFunctionDef *def, int A, int B, int C,
// jA is the A operand of the Jump instruction
// base + a - 1
llvm::Value *val =
jA == 1 ? base_ptr : emit_array_get(def, base_ptr, jA - 1);
llvm::Value *val = emit_gep_register(def, jA - 1);
// Call luaF_close
CreateCall2(def->builder, def->luaF_closeF, def->L, val);

@ -119,9 +119,9 @@ void RaviCodeGenerator::emit_FORLOOP2(RaviFunctionDef *def, int A, int pc,
def->f->getBasicBlockList().push_back(update_block);
def->builder->SetInsertPoint(update_block);
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
llvm::Value *rvar = emit_gep_register(def, base_ptr, A + 3);
llvm::Value *rvar = emit_gep_register(def, A + 3);
// setivalue(ra + 3, idx); /* ...and external index */
idx_int_value = emit_load_local_n(def, idx_int_ptr);
@ -187,8 +187,8 @@ void RaviCodeGenerator::emit_FORLOOP2(RaviFunctionDef *def, int A, int pc,
def->f->getBasicBlockList().push_back(update_block);
def->builder->SetInsertPoint(update_block);
base_ptr = emit_load_base(def);
rvar = emit_gep_register(def, base_ptr, A + 3);
emit_load_base(def);
rvar = emit_gep_register(def, A + 3);
// setfltvalue(ra + 3, idx); /* ...and external index */
idx_double_value = emit_load_local_n(def, idx_double_ptr);
@ -230,16 +230,16 @@ void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, int A, int pc) {
//}
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// TValue *rinit = ra;
// TValue *rlimit = ra + 1;
// TValue *rstep = ra + 2;
// TValue *rvar = ra + 3
llvm::Value *rinit = emit_gep_register(def, base_ptr, A);
llvm::Value *rlimit = emit_gep_register(def, base_ptr, A + 1);
llvm::Value *rstep = emit_gep_register(def, base_ptr, A + 2);
llvm::Value *rvar = emit_gep_register(def, base_ptr, A + 3);
llvm::Value *rinit = emit_gep_register(def, A);
llvm::Value *rlimit = emit_gep_register(def, A + 1);
llvm::Value *rstep = emit_gep_register(def, A + 2);
llvm::Value *rvar = emit_gep_register(def, A + 3);
// Create the done block
llvm::BasicBlock *exit_block =
@ -441,9 +441,9 @@ void RaviCodeGenerator::emit_iFORLOOP(RaviFunctionDef *def, int A, int pc, RaviB
def->builder->SetInsertPoint(update_block);
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
llvm::Value *rvar = emit_gep_register(def, base_ptr, A + 3);
llvm::Value *rvar = emit_gep_register(def, A + 3);
// setivalue(ra + 3, idx); /* ...and external index */
idx_int_value = emit_load_local_n(def, idx_int_ptr);

@ -53,7 +53,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, int A, int pc) {
//} break;
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// lua_Integer ilimit;
// int stopnow;
@ -88,9 +88,9 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, int A, int pc) {
// TValue *init = ra;
// TValue *plimit = ra + 1;
// TValue *pstep = ra + 2;
llvm::Value *init = emit_gep_register(def, base_ptr, A);
llvm::Value *plimit = emit_gep_register(def, base_ptr, A + 1);
llvm::Value *pstep = emit_gep_register(def, base_ptr, A + 2);
llvm::Value *init = emit_gep_register(def, A);
llvm::Value *plimit = emit_gep_register(def, A + 1);
llvm::Value *pstep = emit_gep_register(def, A + 2);
// if (ttisinteger(init) && ttisinteger(pstep) &&
// forlimit(plimit, &ilimit, ivalue(pstep), &stopnow)) {
@ -422,7 +422,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, int A, int pc) {
//} break;
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// lua_Integer ilimit;
// int stopnow;
@ -443,9 +443,9 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, int A, int pc) {
// TValue *init = ra;
// TValue *plimit = ra + 1;
// TValue *pstep = ra + 2;
llvm::Value *init = emit_gep_register(def, base_ptr, A);
llvm::Value *plimit = emit_gep_register(def, base_ptr, A + 1);
llvm::Value *pstep = emit_gep_register(def, base_ptr, A + 2);
llvm::Value *init = emit_gep_register(def, A);
llvm::Value *plimit = emit_gep_register(def, A + 1);
llvm::Value *pstep = emit_gep_register(def, A + 2);
// if (ttisinteger(init) && ttisinteger(pstep) &&
// forlimit(plimit, &ilimit, ivalue(pstep), &stopnow)) {
@ -720,15 +720,15 @@ void RaviCodeGenerator::emit_iFORPREP(RaviFunctionDef *def, int A, int pc,
// setivalue(init, initv - ivalue(pstep));
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// TValue *init = ra;
// TValue *pstep = ra + 2;
llvm::Value *init = emit_gep_register(def, base_ptr, A);
llvm::Value *plimit = emit_gep_register(def, base_ptr, A + 1);
llvm::Value *init = emit_gep_register(def, A);
llvm::Value *plimit = emit_gep_register(def, A + 1);
llvm::Value *pstep = nullptr;
if (!step_one)
pstep = emit_gep_register(def, base_ptr, A + 2);
pstep = emit_gep_register(def, A + 2);
// Get ivalue(pstep)
llvm::Instruction *limit_ivalue = emit_load_reg_i(def, plimit);

@ -33,8 +33,8 @@ void RaviCodeGenerator::emit_LOADNIL(RaviFunctionDef *def, int A, int B) {
// R(A) := tonumber(0)
void RaviCodeGenerator::emit_LOADFZ(RaviFunctionDef *def, int A) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, A);
// destvalue->n = 0.0
emit_store_reg_n(def, llvm::ConstantFP::get(def->types->lua_NumberT, 0.0),
dest);
@ -44,8 +44,8 @@ void RaviCodeGenerator::emit_LOADFZ(RaviFunctionDef *def, int A) {
// R(A) := tointeger(0)
void RaviCodeGenerator::emit_LOADIZ(RaviFunctionDef *def, int A) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, A);
// dest->i = 0
emit_store_reg_i(def, def->types->kluaInteger[0], dest);
// dest->type = LUA_TNUMINT
@ -59,8 +59,8 @@ void RaviCodeGenerator::emit_LOADBOOL(RaviFunctionDef *def, int A, int B, int C,
// setbvalue(ra, GETARG_B(i));
// if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, A);
// dest->i = 0
emit_store_reg_b(def, llvm::ConstantInt::get(def->types->C_intT, B), dest);
// dest->type = LUA_TBOOLEAN
@ -79,12 +79,12 @@ void RaviCodeGenerator::emit_MOVE(RaviFunctionDef *def, int A, int B) {
// setobjs2s(L, ra, RB(i));
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
lua_assert(A != B);
llvm::Value *src = emit_gep_register(def, base_ptr, B);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
llvm::Value *src = emit_gep_register(def, B);
llvm::Value *dest = emit_gep_register(def, A);
emit_assign(def, dest, src);
}
@ -103,10 +103,10 @@ void RaviCodeGenerator::emit_MOVEI(RaviFunctionDef *def, int A, int B) {
llvm::Value *var = TmpB.CreateAlloca(def->types->lua_IntegerT, nullptr, "i");
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
llvm::Value *src = emit_gep_register(def, base_ptr, B);
llvm::Value *dest = emit_gep_register(def, A);
llvm::Value *src = emit_gep_register(def, B);
llvm::Value *src_type = emit_load_type(def, src);
@ -174,10 +174,10 @@ void RaviCodeGenerator::emit_MOVEF(RaviFunctionDef *def, int A, int B) {
llvm::Value *var = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "n");
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
llvm::Value *src = emit_gep_register(def, base_ptr, B);
llvm::Value *dest = emit_gep_register(def, A);
llvm::Value *src = emit_gep_register(def, B);
llvm::Value *src_type = emit_load_type(def, src);
@ -245,9 +245,9 @@ void RaviCodeGenerator::emit_TOINT(RaviFunctionDef *def, int A) {
llvm::Value *var = TmpB.CreateAlloca(def->types->lua_IntegerT, nullptr, "i");
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
llvm::Value *dest = emit_gep_register(def, A);
llvm::Value *src = dest;
llvm::Value *src_type = emit_load_type(def, src);
@ -309,9 +309,9 @@ void RaviCodeGenerator::emit_TOFLT(RaviFunctionDef *def, int A) {
llvm::Value *var = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "n");
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
llvm::Value *dest = emit_gep_register(def, A);
llvm::Value *src = dest;
llvm::Value *src_type = emit_load_type(def, src);
@ -363,7 +363,7 @@ void RaviCodeGenerator::emit_LOADK(RaviFunctionDef *def, int A, int Bx) {
// setobj2s(L, ra, rb);
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// Load pointer to k
llvm::Value *k_ptr = def->k_ptr;
@ -371,7 +371,7 @@ void RaviCodeGenerator::emit_LOADK(RaviFunctionDef *def, int A, int Bx) {
// LOADK requires a structure assignment
// in LLVM as far as I can tell this requires a call to
// an intrinsic memcpy
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
llvm::Value *dest = emit_gep_register(def, A);
llvm::Value *src;
if (Bx == 0) {

@ -55,14 +55,14 @@ void RaviCodeGenerator::emit_RETURN(RaviFunctionDef *def, int A, int B) {
}
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// Get pointer to register A
llvm::Value *ra_ptr = emit_gep_register(def, base_ptr, A);
llvm::Value *ra_ptr = emit_gep_register(def, A);
//* if (b != 0) L->top = ra + b - 1;
if (B != 0) {
emit_set_L_top_toreg(def, base_ptr, A + B - 1);
emit_set_L_top_toreg(def, A + B - 1);
}
// if (cl->p->sizep > 0) luaF_close(L, base);
@ -80,7 +80,7 @@ void RaviCodeGenerator::emit_RETURN(RaviFunctionDef *def, int A, int B) {
def->builder->SetInsertPoint(then_block);
// Call luaF_close
CreateCall2(def->builder, def->luaF_closeF, def->L, base_ptr);
CreateCall2(def->builder, def->luaF_closeF, def->L, def->base_ptr);
def->builder->CreateBr(else_block);
def->f->getBasicBlockList().push_back(else_block);

@ -29,41 +29,41 @@ void RaviCodeGenerator::emit_SELF(RaviFunctionDef *def, int A, int B, int C) {
// StkId rb = RB(i);
// setobjs2s(L, ra + 1, rb);
// Protect(luaV_gettable(L, rb, RKC(i), ra));
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *rb = emit_gep_register(def, base_ptr, B);
llvm::Value *ra1 = emit_gep_register(def, base_ptr, A + 1);
emit_load_base(def);
llvm::Value *rb = emit_gep_register(def, B);
llvm::Value *ra1 = emit_gep_register(def, A + 1);
emit_assign(def, ra1, rb);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
CreateCall4(def->builder, def->luaV_gettableF, def->L, rb, rc, ra);
}
// R(A) := length of R(B)
void RaviCodeGenerator::emit_LEN(RaviFunctionDef *def, int A, int B) {
// Protect(luaV_objlen(L, ra, RB(i)));
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register(def, base_ptr, B);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register(def, B);
CreateCall3(def->builder, def->luaV_objlenF, def->L, ra, rb);
}
// R(A)[RK(B)] := RK(C)
void RaviCodeGenerator::emit_SETTABLE(RaviFunctionDef *def, int A, int B, int C) {
// Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
CreateCall4(def->builder, def->luaV_settableF, def->L, ra, rb, rc);
}
// R(A) := R(B)[RK(C)]
void RaviCodeGenerator::emit_GETTABLE(RaviFunctionDef *def, int A, int B, int C) {
// Protect(luaV_gettable(L, RB(i), RKC(i), ra));
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
CreateCall4(def->builder, def->luaV_gettableF, def->L, rb, rc, ra);
}
@ -83,10 +83,10 @@ void RaviCodeGenerator::emit_GETTABLE_AF(RaviFunctionDef *def,int A, int B, int
// Table *t = hvalue(rb);
// raviH_get_float_inline(L, t, idx, ra);
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *key = emit_load_reg_i(def, rc);
llvm::Instruction *t = emit_load_reg_h(def, rb);
llvm::Instruction *data = emit_load_reg_h_floatarray(def, t);
@ -138,10 +138,10 @@ void RaviCodeGenerator::emit_GETTABLE_AI(RaviFunctionDef *def, int A, int B, int
// Table *t = hvalue(rb);
// raviH_get_int_inline(L, t, idx, ra);
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *key = emit_load_reg_i(def, rc);
llvm::Instruction *t = emit_load_reg_h(def, rb);
llvm::Instruction *data = emit_load_reg_h_intarray(def, t);
@ -194,10 +194,10 @@ void RaviCodeGenerator::emit_SETTABLE_AI(RaviFunctionDef *def, int A, int B, int
// lua_Integer value = ivalue(rc);
// raviH_set_int_inline(L, t, idx, value);
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *key = emit_load_reg_i(def, rb);
llvm::Instruction *value = known_int ? emit_load_reg_i(def, rc) : emit_tointeger(def, rc);
llvm::Instruction *t = emit_load_reg_h(def, ra);
@ -253,10 +253,10 @@ void RaviCodeGenerator::emit_SETTABLE_AF(RaviFunctionDef *def, int A, int B, int
// raviH_set_float_inline(L, t, idx, ((lua_Number)ivalue(rc)));
//}
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *key = emit_load_reg_i(def, rb);
llvm::Instruction *value = known_float ? emit_load_reg_n(def, rc) : emit_tofloat(def, rc);
llvm::Instruction *t = emit_load_reg_h(def, ra);
@ -294,8 +294,8 @@ void RaviCodeGenerator::emit_SETTABLE_AF(RaviFunctionDef *def, int A, int B, int
void RaviCodeGenerator::emit_GETUPVAL(RaviFunctionDef *def, int A, int B) {
// int b = GETARG_B(i);
// setobj2s(L, ra, cl->upvals[b]->v);
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *upval_ptr = emit_gep_upvals(def, def->p_LClosure, B);
llvm::Instruction *upval = emit_load_pupval(def, upval_ptr);
llvm::Value *v = emit_load_upval_v(def, upval);
@ -309,8 +309,8 @@ void RaviCodeGenerator::emit_SETUPVAL(RaviFunctionDef *def, int A, int B) {
// setobj(L, uv->v, ra);
// luaC_upvalbarrier(L, uv);
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *upval_ptr = emit_gep_upvals(def, def->p_LClosure, B);
llvm::Instruction *upval = emit_load_pupval(def, upval_ptr);
llvm::Value *v = emit_load_upval_v(def, upval);
@ -346,9 +346,9 @@ void RaviCodeGenerator::emit_SETUPVAL(RaviFunctionDef *def, int A, int B) {
void RaviCodeGenerator::emit_GETTABUP(RaviFunctionDef *def, int A, int B, int C) {
// int b = GETARG_B(i);
// Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra));
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Value *upval_ptr = emit_gep_upvals(def, def->p_LClosure, B);
llvm::Instruction *upval = emit_load_pupval(def, upval_ptr);
@ -362,9 +362,9 @@ void RaviCodeGenerator::emit_SETTABUP(RaviFunctionDef *def, int A, int B, int C)
// int a = GETARG_A(i);
// Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i)));
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *rb = emit_gep_register_or_constant(def, base_ptr, B);
llvm::Value *rc = emit_gep_register_or_constant(def, base_ptr, C);
emit_load_base(def);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Value *upval_ptr = emit_gep_upvals(def, def->p_LClosure, A);
llvm::Instruction *upval = emit_load_pupval(def, upval_ptr);
@ -373,15 +373,15 @@ void RaviCodeGenerator::emit_SETTABUP(RaviFunctionDef *def, int A, int B, int C)
}
void RaviCodeGenerator::emit_NEWARRAYINT(RaviFunctionDef *def, int A) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
CreateCall3(def->builder, def->raviV_op_newarrayintF, def->L, def->ci_val,
ra);
}
void RaviCodeGenerator::emit_NEWARRAYFLOAT(RaviFunctionDef *def, int A) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
CreateCall3(def->builder, def->raviV_op_newarrayfloatF, def->L, def->ci_val,
ra);
}
@ -397,28 +397,28 @@ void RaviCodeGenerator::emit_NEWTABLE(RaviFunctionDef *def, int A, int B, int C)
// checkGC(L, ra + 1);
// } break;
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
CreateCall5(def->builder, def->raviV_op_newtableF, def->L, def->ci_val, ra,
def->types->kInt[B], def->types->kInt[C]);
}
void RaviCodeGenerator::emit_SETLIST(RaviFunctionDef *def, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
CreateCall5(def->builder, def->raviV_op_setlistF, def->L, def->ci_val, ra,
def->types->kInt[B], def->types->kInt[C]);
}
llvm::Instruction *RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def, int A,
void RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def, int A,
int array_type_expected,
const char *errmsg) {
// if (!ttistable(ra) || hvalue(ra)->ravi_array.type != RAVI_TARRAYINT)
// luaG_runerror(L, "integer[] expected");
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Instruction *type = emit_load_type(def, ra);
// type != LUA_TTABLE ?
@ -455,23 +455,19 @@ llvm::Instruction *RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def, int A,
def->f->getBasicBlockList().push_back(done);
def->builder->SetInsertPoint(done);
return base_ptr;
}
void RaviCodeGenerator::emit_MOVEAI(RaviFunctionDef *def, int A, int B) {
llvm::Instruction *base_ptr =
emit_TOARRAY(def, B, RAVI_TARRAYINT, "integer[] expected");
llvm::Value *src = emit_gep_register(def, base_ptr, B);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
emit_TOARRAY(def, B, RAVI_TARRAYINT, "integer[] expected");
llvm::Value *src = emit_gep_register(def, B);
llvm::Value *dest = emit_gep_register(def, A);
emit_assign(def, dest, src);
}
void RaviCodeGenerator::emit_MOVEAF(RaviFunctionDef *def, int A, int B) {
llvm::Instruction *base_ptr =
emit_TOARRAY(def, B, RAVI_TARRAYFLT, "number[] expected");
llvm::Value *src = emit_gep_register(def, base_ptr, B);
llvm::Value *dest = emit_gep_register(def, base_ptr, A);
emit_TOARRAY(def, B, RAVI_TARRAYFLT, "number[] expected");
llvm::Value *src = emit_gep_register(def, B);
llvm::Value *dest = emit_gep_register(def, A);
emit_assign(def, dest, src);
}
}

@ -49,32 +49,32 @@ void RaviCodeGenerator::emit_TFORCALL(RaviFunctionDef *def, int A, int B, int C,
// } break;
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// Get pointer to register A
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *ra1 = emit_gep_register(def, base_ptr, A + 1);
llvm::Value *ra2 = emit_gep_register(def, base_ptr, A + 2);
llvm::Value *cb = emit_gep_register(def, base_ptr, A + 3);
llvm::Value *cb1 = emit_gep_register(def, base_ptr, A + 4);
llvm::Value *cb2 = emit_gep_register(def, base_ptr, A + 5);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *ra1 = emit_gep_register(def, A + 1);
llvm::Value *ra2 = emit_gep_register(def, A + 2);
llvm::Value *cb = emit_gep_register(def, A + 3);
llvm::Value *cb1 = emit_gep_register(def, A + 4);
llvm::Value *cb2 = emit_gep_register(def, A + 5);
emit_assign(def, cb2, ra2);
emit_assign(def, cb1, ra1);
emit_assign(def, cb, ra);
// L->top = cb + 3; /* func. + 2 args (state and index) */
emit_set_L_top_toreg(def, base_ptr, A + 6);
emit_set_L_top_toreg(def, A + 6);
// Protect(luaD_call(L, cb, GETARG_C(i), 1));
CreateCall4(def->builder, def->luaD_callF, def->L, cb, def->types->kInt[C],
def->types->kInt[1]);
// reload base
base_ptr = emit_load_base(def);
emit_load_base(def);
// L->top = ci->top;
emit_refresh_L_top(def);
ra = emit_gep_register(def, base_ptr, jA);
ra1 = emit_gep_register(def, base_ptr, jA + 1);
ra = emit_gep_register(def, jA);
ra1 = emit_gep_register(def, jA + 1);
llvm::Value *type = emit_load_type(def, ra1);
// Test if type != LUA_TNIL (0)
@ -107,11 +107,11 @@ void RaviCodeGenerator::emit_TFORLOOP(RaviFunctionDef *def, int A, int j) {
// } break;
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
emit_load_base(def);
// Get pointer to register A
llvm::Value *ra = emit_gep_register(def, base_ptr, A);
llvm::Value *ra1 = emit_gep_register(def, base_ptr, A + 1);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *ra1 = emit_gep_register(def, A + 1);
llvm::Value *type = emit_load_type(def, ra1);
// Test if type != LUA_TNIL (0)

Loading…
Cancel
Save