issue #60 add optimized versions of table access with integer keys

pull/81/head
Dibyendu Majumdar 9 years ago
parent 62e892e6aa
commit 2b7a450baf

@ -346,20 +346,24 @@ llvm::Value *RaviCodeGenerator::emit_table_get_strkey(RaviFunctionDef *def,
return keyvalue;
}
llvm::Value *RaviCodeGenerator::emit_table_get_value(RaviFunctionDef *def, llvm::Value *node, llvm::Value *index) {
return emit_gep(def, "nodeval", node, index, 0);
llvm::Value *RaviCodeGenerator::emit_table_get_value(RaviFunctionDef *def,
llvm::Value *node,
llvm::Value *index) {
return emit_gep(def, "nodeval", node, index, 0);
}
llvm::Value *RaviCodeGenerator::emit_table_get_arraysize(RaviFunctionDef *def, llvm::Value *table) {
llvm::Value *RaviCodeGenerator::emit_table_get_arraysize(RaviFunctionDef *def,
llvm::Value *table) {
// Obtain the lsizenode of the hash table
llvm::Value *sizearray_ptr = emit_gep(def, "sizearray", table, 0, 5);
llvm::Instruction *sizearray = def->builder->CreateLoad(sizearray_ptr);
sizearray->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_Table_sizearray);
def->types->tbaa_Table_sizearray);
return sizearray;
}
llvm::Value *RaviCodeGenerator::emit_table_get_array(RaviFunctionDef *def, llvm::Value *table) {
llvm::Value *RaviCodeGenerator::emit_table_get_array(RaviFunctionDef *def,
llvm::Value *table) {
// Get access to the node array
llvm::Value *array_ptr = emit_gep(def, "array", table, 0, 6);
llvm::Instruction *arry = def->builder->CreateLoad(array_ptr);
@ -1530,7 +1534,11 @@ void RaviCodeGenerator::compile(lua_State *L, Proto *p,
emit_CALL(def, A, B, C, pc);
} break;
case OP_RAVI_SETTABLE_I:
case OP_RAVI_SETTABLE_I: {
int B = GETARG_B(i);
int C = GETARG_C(i);
emit_SETTABLE_I(def, A, B, C, pc);
} break;
case OP_RAVI_SETTABLE_S:
case OP_SETTABLE: {
int B = GETARG_B(i);
@ -1552,7 +1560,11 @@ void RaviCodeGenerator::compile(lua_State *L, Proto *p,
emit_GETTABLE(def, A, B, C, pc);
}
} break;
case OP_RAVI_GETTABLE_I:
case OP_RAVI_GETTABLE_I: {
int B = GETARG_B(i);
int C = GETARG_C(i);
emit_GETTABLE_I(def, A, B, C, pc);
} break;
case OP_GETTABLE: {
int B = GETARG_B(i);
int C = GETARG_C(i);

@ -71,7 +71,7 @@ void RaviCodeGenerator::emit_SETTABLE_I(RaviFunctionDef *def, int A, int B, int
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Instruction *t = emit_load_reg_h(def, ra);
llvm::Instruction *key = emit_load_reg_i(def, rb);
CreateCall3(def->builder, def->luaH_setintF, t, key, rc);
CreateCall4(def->builder, def->luaH_setintF, def->L, t, key, rc);
}
// R(A)[RK(B)] := RK(C)
@ -121,11 +121,13 @@ void RaviCodeGenerator::emit_GETTABLE_I(RaviFunctionDef *def, int A, int B, int
llvm::Instruction *t = emit_load_reg_h(def, rb);
llvm::Value *data = emit_table_get_array(def, t);
llvm::Value *len = emit_table_get_arraysize(def, t);
// As Lua arrays are 1 based we need to subtract by 1
llvm::Value *key_minus_1 =
def->builder->CreateSub(key, def->types->kluaInteger[1]);
// As len is unsigned int we need to truncate
llvm::Value *ukey =
def->builder->CreateTrunc(key_minus_1, def->types->C_intT);
// Do an unsigned comparison with length
llvm::Value *cmp = def->builder->CreateICmpULT(ukey, len);
llvm::BasicBlock *then_block =
llvm::BasicBlock::Create(def->jitState->context(), "if.in.range", def->f);

Loading…
Cancel
Save