|
|
|
@ -40,7 +40,7 @@ void RaviCodeGenerator::emit_SELF(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
|
|
|
|
|
void RaviCodeGenerator::emit_LEN(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B) {
|
|
|
|
|
//Protect(luaV_objlen(L, ra, RB(i)));
|
|
|
|
|
// Protect(luaV_objlen(L, ra, RB(i)));
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
|
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rb = emit_gep_ra(def, base_ptr, B);
|
|
|
|
@ -50,7 +50,7 @@ void RaviCodeGenerator::emit_LEN(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
// R(A)[RK(B)] := RK(C)
|
|
|
|
|
void RaviCodeGenerator::emit_SETTABLE(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
//Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
|
|
|
|
|
// Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
|
|
|
|
|
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);
|
|
|
|
@ -61,7 +61,7 @@ void RaviCodeGenerator::emit_SETTABLE(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
// R(A) := R(B)[RK(C)]
|
|
|
|
|
void RaviCodeGenerator::emit_GETTABLE(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
//Protect(luaV_gettable(L, RB(i), RKC(i), ra));
|
|
|
|
|
// Protect(luaV_gettable(L, RB(i), RKC(i), ra));
|
|
|
|
|
llvm::Instruction *base_ptr = emit_load_base(def);
|
|
|
|
|
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rb = emit_gep_ra(def, base_ptr, B);
|
|
|
|
@ -69,11 +69,136 @@ void RaviCodeGenerator::emit_GETTABLE(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
def->builder->CreateCall4(def->luaV_gettableF, def->L, rb, rc, ra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RaviCodeGenerator::emit_GETTABLE_AF(RaviFunctionDef *def,
|
|
|
|
|
llvm::Value *L_ci, llvm::Value *proto,
|
|
|
|
|
int A, int B, int C) {
|
|
|
|
|
//#define raviH_get_float_inline(L, t, key, v) \
|
|
|
|
|
//{ unsigned ukey = (unsigned)((key)-1); \
|
|
|
|
|
// lua_Number *data = (lua_Number *)t->ravi_array.data; \
|
|
|
|
|
// if (ukey < t->ravi_array.len) {\
|
|
|
|
|
// setfltvalue(v, data[ukey]); \
|
|
|
|
|
// }else \
|
|
|
|
|
// luaG_runerror(L, "array out of bounds"); \
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//TValue *rb = RB(i);
|
|
|
|
|
//TValue *rc = RKC(i);
|
|
|
|
|
//lua_Integer idx = ivalue(rc);
|
|
|
|
|
//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_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rb = emit_gep_ra(def, base_ptr, B);
|
|
|
|
|
llvm::Value *rc = emit_gep_rkb(def, base_ptr, 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);
|
|
|
|
|
llvm::Instruction *len = emit_load_ravi_arraylength(def, t);
|
|
|
|
|
llvm::Value *key_minus_1 =
|
|
|
|
|
def->builder->CreateSub(key, def->types->kluaInteger[1]);
|
|
|
|
|
llvm::Value *ukey =
|
|
|
|
|
def->builder->CreateTrunc(key_minus_1, def->types->C_intT);
|
|
|
|
|
|
|
|
|
|
llvm::Value *cmp = def->builder->CreateICmpULT(ukey, len);
|
|
|
|
|
llvm::BasicBlock *then_block =
|
|
|
|
|
llvm::BasicBlock::Create(def->jitState->context(), "if.in.range", def->f);
|
|
|
|
|
llvm::BasicBlock *else_block =
|
|
|
|
|
llvm::BasicBlock::Create(def->jitState->context(), "if.not.in.range");
|
|
|
|
|
llvm::BasicBlock *end_block =
|
|
|
|
|
llvm::BasicBlock::Create(def->jitState->context(), "if.end");
|
|
|
|
|
def->builder->CreateCondBr(cmp, then_block, else_block);
|
|
|
|
|
def->builder->SetInsertPoint(then_block);
|
|
|
|
|
|
|
|
|
|
llvm::Value *ptr = def->builder->CreateGEP(data, ukey);
|
|
|
|
|
llvm::Instruction *value = def->builder->CreateLoad(ptr);
|
|
|
|
|
// TODO tbaa
|
|
|
|
|
|
|
|
|
|
emit_store_reg_n(def, value, ra);
|
|
|
|
|
emit_store_type(def, ra, LUA_TNUMFLT);
|
|
|
|
|
def->builder->CreateBr(end_block);
|
|
|
|
|
|
|
|
|
|
def->f->getBasicBlockList().push_back(else_block);
|
|
|
|
|
def->builder->SetInsertPoint(else_block);
|
|
|
|
|
|
|
|
|
|
llvm::Value *errmsg1 =
|
|
|
|
|
def->builder->CreateGlobalString("array out of bounds");
|
|
|
|
|
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
|
|
|
|
|
emit_gep(def, "out_of_bounds_msg", errmsg1, 0, 0));
|
|
|
|
|
def->builder->CreateBr(end_block);
|
|
|
|
|
|
|
|
|
|
def->f->getBasicBlockList().push_back(end_block);
|
|
|
|
|
def->builder->SetInsertPoint(end_block);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RaviCodeGenerator::emit_GETTABLE_AI(RaviFunctionDef *def,
|
|
|
|
|
llvm::Value *L_ci, llvm::Value *proto,
|
|
|
|
|
int A, int B, int C) {
|
|
|
|
|
|
|
|
|
|
//#define raviH_get_int_inline(L, t, key, v) \
|
|
|
|
|
//{ unsigned ukey = (unsigned)((key)-1); \
|
|
|
|
|
// lua_Integer *data = (lua_Integer *)t->ravi_array.data; \
|
|
|
|
|
// if (ukey < t->ravi_array.len) {\
|
|
|
|
|
// setivalue(v, data[ukey]); \
|
|
|
|
|
// } else \
|
|
|
|
|
// luaG_runerror(L, "array out of bounds"); \
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
// TValue *rb = RB(i);
|
|
|
|
|
// TValue *rc = RKC(i);
|
|
|
|
|
// lua_Integer idx = ivalue(rc);
|
|
|
|
|
// 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_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rb = emit_gep_ra(def, base_ptr, B);
|
|
|
|
|
llvm::Value *rc = emit_gep_rkb(def, base_ptr, 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);
|
|
|
|
|
llvm::Instruction *len = emit_load_ravi_arraylength(def, t);
|
|
|
|
|
llvm::Value *key_minus_1 =
|
|
|
|
|
def->builder->CreateSub(key, def->types->kluaInteger[1]);
|
|
|
|
|
llvm::Value *ukey =
|
|
|
|
|
def->builder->CreateTrunc(key_minus_1, def->types->C_intT);
|
|
|
|
|
|
|
|
|
|
llvm::Value *cmp = def->builder->CreateICmpULT(ukey, len);
|
|
|
|
|
llvm::BasicBlock *then_block =
|
|
|
|
|
llvm::BasicBlock::Create(def->jitState->context(), "if.in.range", def->f);
|
|
|
|
|
llvm::BasicBlock *else_block =
|
|
|
|
|
llvm::BasicBlock::Create(def->jitState->context(), "if.not.in.range");
|
|
|
|
|
llvm::BasicBlock *end_block =
|
|
|
|
|
llvm::BasicBlock::Create(def->jitState->context(), "if.end");
|
|
|
|
|
def->builder->CreateCondBr(cmp, then_block, else_block);
|
|
|
|
|
def->builder->SetInsertPoint(then_block);
|
|
|
|
|
|
|
|
|
|
llvm::Value *ptr = def->builder->CreateGEP(data, ukey);
|
|
|
|
|
llvm::Instruction *value = def->builder->CreateLoad(ptr);
|
|
|
|
|
// TODO tbaa
|
|
|
|
|
|
|
|
|
|
emit_store_reg_i(def, value, ra);
|
|
|
|
|
emit_store_type(def, ra, LUA_TNUMINT);
|
|
|
|
|
def->builder->CreateBr(end_block);
|
|
|
|
|
|
|
|
|
|
def->f->getBasicBlockList().push_back(else_block);
|
|
|
|
|
def->builder->SetInsertPoint(else_block);
|
|
|
|
|
|
|
|
|
|
llvm::Value *errmsg1 =
|
|
|
|
|
def->builder->CreateGlobalString("array out of bounds");
|
|
|
|
|
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
|
|
|
|
|
emit_gep(def, "out_of_bounds_msg", errmsg1, 0, 0));
|
|
|
|
|
def->builder->CreateBr(end_block);
|
|
|
|
|
|
|
|
|
|
def->f->getBasicBlockList().push_back(end_block);
|
|
|
|
|
def->builder->SetInsertPoint(end_block);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// R(A) := UpValue[B]
|
|
|
|
|
void RaviCodeGenerator::emit_GETUPVAL(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B) {
|
|
|
|
|
//int b = GETARG_B(i);
|
|
|
|
|
//setobj2s(L, ra, cl->upvals[b]->v);
|
|
|
|
|
// 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_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *upval_ptr = emit_gep_upvals(def, def->p_LClosure, B);
|
|
|
|
@ -126,8 +251,8 @@ void RaviCodeGenerator::emit_SETUPVAL(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
// R(A) := UpValue[B][RK(C)]
|
|
|
|
|
void RaviCodeGenerator::emit_GETTABUP(RaviFunctionDef *def, llvm::Value *L_ci,
|
|
|
|
|
llvm::Value *proto, int A, int B, int C) {
|
|
|
|
|
//int b = GETARG_B(i);
|
|
|
|
|
//Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra));
|
|
|
|
|
// 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_ra(def, base_ptr, A);
|
|
|
|
|
llvm::Value *rc = emit_gep_rkb(def, base_ptr, C);
|
|
|
|
|