|
|
|
@ -2,6 +2,7 @@
|
|
|
|
|
|
|
|
|
|
namespace ravi {
|
|
|
|
|
|
|
|
|
|
// -float
|
|
|
|
|
void RaviCodeGenerator::emit_UNMF(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B) {
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
@ -12,6 +13,7 @@ void RaviCodeGenerator::emit_UNMF(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
emit_store_reg_n(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// -int
|
|
|
|
|
void RaviCodeGenerator::emit_UNMI(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B) {
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
@ -22,52 +24,70 @@ void RaviCodeGenerator::emit_UNMI(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
emit_store_reg_i(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// float+c
|
|
|
|
|
void RaviCodeGenerator::emit_ADDFN(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
|
|
|
|
|
// Load pointer to k
|
|
|
|
|
llvm::Value *k_ptr = def->k_ptr;
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
|
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rb = emit_gep_rkb(def, base_ptr, B);
|
|
|
|
|
llvm::Instruction *lhs = emit_load_reg_n(def, rb);
|
|
|
|
|
llvm::Value *result = def->builder->CreateFAdd(
|
|
|
|
|
lhs,
|
|
|
|
|
def->builder->CreateSIToFP(llvm::ConstantInt::get(def->types->C_intT, C),
|
|
|
|
|
def->types->lua_NumberT));
|
|
|
|
|
emit_store_reg_n(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llvm::Value *ra;
|
|
|
|
|
// float+float
|
|
|
|
|
void RaviCodeGenerator::emit_ADDFF(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
|
|
|
|
|
if (A == 0) {
|
|
|
|
|
// If A is 0 we can use the base pointer which is &base[0]
|
|
|
|
|
ra = base_ptr;
|
|
|
|
|
} else {
|
|
|
|
|
// emit &base[A]
|
|
|
|
|
ra = emit_array_get(def, base_ptr, A);
|
|
|
|
|
}
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
|
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rb = emit_gep_rkb(def, base_ptr, B);
|
|
|
|
|
llvm::Value *rc = emit_gep_rkb(def, base_ptr, 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);
|
|
|
|
|
emit_store_reg_n(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llvm::Value *rb;
|
|
|
|
|
// float+int
|
|
|
|
|
void RaviCodeGenerator::emit_ADDFI(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
|
|
|
|
|
// Get pointer to register B
|
|
|
|
|
llvm::Value *base_or_k = ISK(B) ? k_ptr : base_ptr;
|
|
|
|
|
int b = ISK(B) ? INDEXK(B) : B;
|
|
|
|
|
if (b == 0) {
|
|
|
|
|
rb = base_or_k;
|
|
|
|
|
} else {
|
|
|
|
|
rb = emit_array_get(def, base_or_k, b);
|
|
|
|
|
}
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
|
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rb = emit_gep_rkb(def, base_ptr, B);
|
|
|
|
|
llvm::Value *rc = emit_gep_rkb(def, base_ptr, 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(
|
|
|
|
|
lhs,
|
|
|
|
|
def->builder->CreateSIToFP(rhs, def->types->lua_NumberT));
|
|
|
|
|
emit_store_reg_n(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llvm::Value *rb_n = def->builder->CreateBitCast(rb, def->types->plua_NumberT);
|
|
|
|
|
llvm::Instruction *lhs = def->builder->CreateLoad(rb_n);
|
|
|
|
|
lhs->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
|
|
|
|
|
// int+int
|
|
|
|
|
void RaviCodeGenerator::emit_ADDII(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
|
|
|
|
|
// Call luaV_equalobj with register B and C
|
|
|
|
|
llvm::Value *result = def->builder->CreateFAdd(
|
|
|
|
|
lhs,
|
|
|
|
|
def->builder->CreateSIToFP(llvm::ConstantInt::get(def->types->C_intT, C),
|
|
|
|
|
def->types->lua_NumberT));
|
|
|
|
|
llvm::Value *ra_n = def->builder->CreateBitCast(ra, def->types->plua_NumberT);
|
|
|
|
|
llvm::Instruction *store = def->builder->CreateStore(result, ra_n);
|
|
|
|
|
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
|
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rb = emit_gep_rkb(def, base_ptr, B);
|
|
|
|
|
llvm::Value *rc = emit_gep_rkb(def, base_ptr, 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);
|
|
|
|
|
emit_store_reg_i(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// int+c
|
|
|
|
|
void RaviCodeGenerator::emit_ADDIN(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
|