|
|
|
@ -27,36 +27,35 @@
|
|
|
|
|
namespace ravi {
|
|
|
|
|
|
|
|
|
|
// OP_ADD, OP_SUB, OP_MUL and OP_DIV
|
|
|
|
|
void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, int A, int B, int C,
|
|
|
|
|
OpCode op, TMS tms, int pc) {
|
|
|
|
|
#if 0
|
|
|
|
|
// Code size priority so go via function calls
|
|
|
|
|
void RaviCodeGenerator::emit_ARITH_calls(RaviFunctionDef *def, int A, int B,
|
|
|
|
|
int C, OpCode op, TMS tms, int pc) {
|
|
|
|
|
bool traced = emit_debug_trace(def, op, pc);
|
|
|
|
|
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);
|
|
|
|
|
switch (op) {
|
|
|
|
|
case OP_ADD:
|
|
|
|
|
CreateCall4(def->builder, def->raviV_op_addF,
|
|
|
|
|
def->L, ra, rb, rc);
|
|
|
|
|
break;
|
|
|
|
|
case OP_SUB:
|
|
|
|
|
CreateCall4(def->builder, def->raviV_op_subF,
|
|
|
|
|
def->L, ra, rb, rc);
|
|
|
|
|
break;
|
|
|
|
|
case OP_MUL:
|
|
|
|
|
CreateCall4(def->builder, def->raviV_op_mulF,
|
|
|
|
|
def->L, ra, rb, rc);
|
|
|
|
|
break;
|
|
|
|
|
case OP_DIV:
|
|
|
|
|
CreateCall4(def->builder, def->raviV_op_divF,
|
|
|
|
|
def->L, ra, rb, rc);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
lua_assert(0);
|
|
|
|
|
case OP_ADD:
|
|
|
|
|
CreateCall4(def->builder, def->raviV_op_addF, def->L, ra, rb, rc);
|
|
|
|
|
break;
|
|
|
|
|
case OP_SUB:
|
|
|
|
|
CreateCall4(def->builder, def->raviV_op_subF, def->L, ra, rb, rc);
|
|
|
|
|
break;
|
|
|
|
|
case OP_MUL:
|
|
|
|
|
CreateCall4(def->builder, def->raviV_op_mulF, def->L, ra, rb, rc);
|
|
|
|
|
break;
|
|
|
|
|
case OP_DIV:
|
|
|
|
|
CreateCall4(def->builder, def->raviV_op_divF, def->L, ra, rb, rc);
|
|
|
|
|
break;
|
|
|
|
|
default: lua_assert(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
// OP_ADD, OP_SUB, OP_MUL and OP_DIV
|
|
|
|
|
void RaviCodeGenerator::emit_ARITH_intpriority(RaviFunctionDef *def, int A,
|
|
|
|
|
int B, int C, OpCode op, TMS tms,
|
|
|
|
|
int pc) {
|
|
|
|
|
// TValue *rb = RKB(i);
|
|
|
|
|
// TValue *rc = RKC(i);
|
|
|
|
|
// lua_Number nb; lua_Number nc;
|
|
|
|
@ -240,12 +239,14 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, int A, int B, int C,
|
|
|
|
|
|
|
|
|
|
def->f->getBasicBlockList().push_back(done_block);
|
|
|
|
|
def->builder->SetInsertPoint(done_block);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// OP_ADD, OP_SUB, OP_MUL and OP_DIV
|
|
|
|
|
void RaviCodeGenerator::emit_ARITH_new(RaviFunctionDef *def, int A, int B,
|
|
|
|
|
int C, OpCode op, TMS tms, int pc) {
|
|
|
|
|
// This version prioritizes floating point arith over integer arith
|
|
|
|
|
// Also slow path is slower as it goes via function calls
|
|
|
|
|
void RaviCodeGenerator::emit_ARITH_floatpriority(RaviFunctionDef *def, int A,
|
|
|
|
|
int B, int C, OpCode op,
|
|
|
|
|
TMS tms, int pc) {
|
|
|
|
|
// TValue *rb = RKB(i);
|
|
|
|
|
// TValue *rc = RKC(i);
|
|
|
|
|
// lua_Number nb; lua_Number nc;
|
|
|
|
@ -443,7 +444,7 @@ void RaviCodeGenerator::emit_ARITH_new(RaviFunctionDef *def, int A, int B,
|
|
|
|
|
result = def->builder->CreateFDiv(
|
|
|
|
|
def->builder->CreateSIToFP(lhs, def->types->lua_NumberT),
|
|
|
|
|
def->builder->CreateSIToFP(rhs, def->types->lua_NumberT));
|
|
|
|
|
break;
|
|
|
|
|
break;
|
|
|
|
|
default: lua_assert(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|