bitwise ops wip

pull/81/head
Dibyendu Majumdar 9 years ago
parent e1835ddd6a
commit 7ed12db6de

@ -0,0 +1,7 @@
extern void donot(int *value);
void donot(int *value) {
int i = *value;
int j = ~i;
*value = j;
}

@ -667,6 +667,9 @@ public:
llvm::Value *emit_num_stack_elements(RaviFunctionDef *def, llvm::Value *L_top,
llvm::Value *ra);
// Load a register or constant - if constant is int then return a direct LLVM constant
llvm::Value *emit_load_register_or_constant_i(RaviFunctionDef *def, int K);
// emit code to load the lua_Number value from register
llvm::Instruction *emit_load_reg_n(RaviFunctionDef *def, llvm::Value *ra);
@ -943,6 +946,10 @@ public:
void emit_TOARRAY(RaviFunctionDef *def, int A, int array_type_expected,
const char *errmsg);
void emit_BITWISE_BINARY_OP(RaviFunctionDef *def, OpCode op, int A, int B, int C);
void emit_BNOT_I(RaviFunctionDef *def, int A, int B);
private:
RaviJITStateImpl *jitState_;
char temp_[31]; // for name

@ -325,4 +325,51 @@ void RaviCodeGenerator::emit_DIVII(RaviFunctionDef *def, int A, int B, int C) {
def->builder->CreateSIToFP(rhs, def->types->lua_NumberT));
emit_store_reg_n_withtype(def, result, ra);
}
// R(A) := RK(B) + RK(C), int+int
void RaviCodeGenerator::emit_BITWISE_BINARY_OP(RaviFunctionDef *def, OpCode op, int A, int B, int 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 *lhs = emit_load_register_or_constant_i(def, B);
llvm::Value *rhs = emit_load_register_or_constant_i(def, C);
llvm::Value *result = NULL;
switch (op) {
case OP_RAVI_BAND_II:
result = def->builder->CreateAnd(lhs, rhs, "");
break;
case OP_RAVI_BOR_II:
result = def->builder->CreateOr(lhs, rhs, "");
break;
case OP_RAVI_BXOR_II:
result = def->builder->CreateXor(lhs, rhs, "");
break;
case OP_RAVI_SHL_II:
result = def->builder->CreateShl(lhs, rhs, "");
break;
case OP_RAVI_SHR_II:
result = def->builder->CreateLShr(lhs, rhs, "");
break;
default:
fprintf(stderr, "unexpected value of opcode %d\n", (int)op);
lua_assert(false);
abort();
}
emit_store_reg_i_withtype(def, result, ra);
}
void RaviCodeGenerator::emit_BNOT_I(RaviFunctionDef *def, int A, int 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 *lhs = emit_load_register_or_constant_i(def, B);
llvm::Value *rhs = llvm::ConstantInt::get(def->types->lua_IntegerT, -1);
llvm::Value *result = def->builder->CreateXor(lhs, rhs, "");
emit_store_reg_i_withtype(def, result, ra);
}
}

@ -171,6 +171,18 @@ llvm::Value *RaviCodeGenerator::emit_gep_constant(RaviFunctionDef *def,
return src;
}
llvm::Value *RaviCodeGenerator::emit_load_register_or_constant_i(RaviFunctionDef *def, int B) {
if (ISK(B) && def->p->k[INDEXK(B)].tt_ == LUA_TNUMINT) {
TValue *Konst = &def->p->k[INDEXK(B)];
return llvm::ConstantInt::get(def->types->lua_IntegerT, Konst->value_.i);
}
else {
llvm::Value *rb = emit_gep_register_or_constant(def, B);
return emit_load_reg_i(def, rb);
}
}
llvm::Instruction *RaviCodeGenerator::emit_load_reg_n(RaviFunctionDef *def,
llvm::Value *rb) {
#if RAVI_NAN_TAGGING
@ -707,6 +719,12 @@ bool RaviCodeGenerator::canCompile(Proto *p) {
case OP_RAVI_FORLOOP_I1:
case OP_RAVI_FORPREP_IP:
case OP_RAVI_FORPREP_I1:
case OP_RAVI_BAND_II:
case OP_RAVI_BOR_II:
case OP_RAVI_BXOR_II:
case OP_RAVI_SHL_II:
case OP_RAVI_SHR_II:
case OP_RAVI_BNOT_I:
break;
default:
return false;
@ -1172,6 +1190,10 @@ void RaviCodeGenerator::compile(lua_State *L, Proto *p, bool doDump,
int B = GETARG_B(i);
emit_NOT(def, A, B);
} break;
case OP_RAVI_BNOT_I: {
int B = GETARG_B(i);
emit_BNOT_I(def, A, B);
} break;
case OP_TEST: {
int B = GETARG_B(i);
int C = GETARG_C(i);
@ -1321,6 +1343,16 @@ void RaviCodeGenerator::compile(lua_State *L, Proto *p, bool doDump,
emit_SETUPVAL(def, A, B);
} break;
case OP_RAVI_SHR_II:
case OP_RAVI_SHL_II:
case OP_RAVI_BXOR_II:
case OP_RAVI_BOR_II:
case OP_RAVI_BAND_II: {
int B = GETARG_B(i);
int C = GETARG_C(i);
emit_BITWISE_BINARY_OP(def, op, A, B, C);
} break;
case OP_ADD: {
int B = GETARG_B(i);
int C = GETARG_C(i);

Loading…
Cancel
Save