|
|
|
@ -194,6 +194,72 @@ void RaviCodeGenerator::emit_SUBNI(RaviFunctionDef *def, llvm::Value *L_ci, llvm
|
|
|
|
|
emit_store_reg_i(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// float+c
|
|
|
|
|
void RaviCodeGenerator::emit_MULFN(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
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->CreateFMul(
|
|
|
|
|
lhs,
|
|
|
|
|
def->builder->CreateSIToFP(llvm::ConstantInt::get(def->types->C_intT, C),
|
|
|
|
|
def->types->lua_NumberT));
|
|
|
|
|
emit_store_reg_n(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// float+float
|
|
|
|
|
void RaviCodeGenerator::emit_MULFF(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
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->CreateFMul(lhs, rhs);
|
|
|
|
|
emit_store_reg_n(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// float+int
|
|
|
|
|
void RaviCodeGenerator::emit_MULFI(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
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->CreateFMul(
|
|
|
|
|
lhs, def->builder->CreateSIToFP(rhs, def->types->lua_NumberT));
|
|
|
|
|
emit_store_reg_n(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// int+int
|
|
|
|
|
void RaviCodeGenerator::emit_MULII(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
|
|
|
|
|
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->CreateMul(lhs, rhs, "", false, true);
|
|
|
|
|
emit_store_reg_i(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// int+c
|
|
|
|
|
void RaviCodeGenerator::emit_MULIN(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
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_i(def, rb);
|
|
|
|
|
llvm::Value *result = def->builder->CreateMul(
|
|
|
|
|
lhs, llvm::ConstantInt::get(def->types->lua_IntegerT, C), "", false,
|
|
|
|
|
true);
|
|
|
|
|
emit_store_reg_i(def, result, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|