implement OP_RAVI_SETTABLE_AI

pull/81/head
Dibyendu Majumdar 9 years ago
parent 57c735e63f
commit 7ea8f658f2

@ -222,6 +222,9 @@ struct LuaLLVMTypes {
llvm::FunctionType *luaV_opclosureT;
llvm::FunctionType *luaV_opvarargT;
llvm::FunctionType *raviH_set_intT;
llvm::FunctionType *raviH_set_floatT;
std::array<llvm::Constant *, 256> kInt;
std::array<llvm::Constant *, 21> kluaInteger;
@ -439,6 +442,9 @@ struct RaviFunctionDef {
llvm::Constant *luaV_opclosureF;
llvm::Constant *luaV_opvarargF;
llvm::Constant *raviH_set_intF;
llvm::Constant *raviH_set_floatF;
// standard C functions
llvm::Constant *printfFunc;
llvm::Constant *fmodFunc;
@ -838,6 +844,12 @@ public:
void emit_GETTABLE_AI(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int B, int C);
void emit_SETTABLE_AF(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int B, int C);
void emit_SETTABLE_AI(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int B, int C);
private:
RaviJITStateImpl *jitState_;
char temp_[31]; // for name

@ -112,7 +112,9 @@ do
end
end
-- FIXME - this causes a fault
dummy(10)
print('+')
function deep (n)
if n>0 then deep(n-1) end

@ -66,8 +66,11 @@ local function fannkuch(n)
end
local n = tonumber(arg and arg[1]) or 1
local t1 = os.time()
if ravi then
ravi.compile(fannkuch)
end
local t1 = os.clock()
local sum, flips = fannkuch(n)
local t2 = os.time()
local t2 = os.clock()
io.write(sum, "\nPfannkuchen(", n, ") = ", flips, "\n")
io.write("elapsed time in secs ", os.difftime(t2,t1))
io.write("elapsed time in secs ", (t2-t1))

@ -67,8 +67,9 @@ local function fannkuch(n1)
end
local n = tonumber(arg and arg[1]) or 1
local t1 = os.time()
assert(ravi.compile(fannkuch))
local t1 = os.clock()
local sum, flips = fannkuch(n)
local t2 = os.time()
local t2 = os.clock()
io.write(sum, "\nPfannkuchen(", n, ") = ", flips, "\n")
io.write("elapsed time in secs ", os.difftime(t2,t1))
io.write("elapsed time in secs ", (t2-t1))

@ -504,3 +504,19 @@ assert(t[2]() == 10)
assert(t[1]() == 20)
assert(t[2]() == 20)
print("test 37 OK")
-- test 38
-- test ravi integer array
function f()
local x: integer[] = { 1, 5 }
local y: integer
x[3] = x[1] + x[2]
y = x[3]
return y
end
assert(ravi.compile(f))
assert(f() == 6)
print("test 38 OK")

@ -126,28 +126,34 @@ llvm::Instruction *RaviCodeGenerator::emit_load_reg_b(RaviFunctionDef *def,
}
llvm::Instruction *RaviCodeGenerator::emit_load_reg_h(RaviFunctionDef *def,
llvm::Value *rb) {
llvm::Value *rb) {
llvm::Value *rb_h = def->builder->CreateBitCast(rb, def->types->ppTableT);
llvm::Instruction *h = def->builder->CreateLoad(rb_h);
h->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_ppointerT);
return h;
}
llvm::Instruction *RaviCodeGenerator::emit_load_reg_h_floatarray(RaviFunctionDef *def,
llvm::Instruction *h) {
llvm::Instruction *
RaviCodeGenerator::emit_load_reg_h_floatarray(RaviFunctionDef *def,
llvm::Instruction *h) {
llvm::Value *data_ptr = emit_gep(def, "data_ptr", h, 0, 11, 0);
llvm::Value *darray_ptr = def->builder->CreateBitCast(data_ptr, def->types->pplua_NumberT);
llvm::Value *darray_ptr =
def->builder->CreateBitCast(data_ptr, def->types->pplua_NumberT);
llvm::Instruction *darray = def->builder->CreateLoad(darray_ptr);
darray->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_RaviArray_dataT);
darray->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_RaviArray_dataT);
return darray;
}
llvm::Instruction *RaviCodeGenerator::emit_load_reg_h_intarray(RaviFunctionDef *def,
llvm::Instruction *h) {
llvm::Instruction *
RaviCodeGenerator::emit_load_reg_h_intarray(RaviFunctionDef *def,
llvm::Instruction *h) {
llvm::Value *data_ptr = emit_gep(def, "data_ptr", h, 0, 11, 0);
llvm::Value *darray_ptr = def->builder->CreateBitCast(data_ptr, def->types->pplua_IntegerT);
llvm::Value *darray_ptr =
def->builder->CreateBitCast(data_ptr, def->types->pplua_IntegerT);
llvm::Instruction *darray = def->builder->CreateLoad(darray_ptr);
darray->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_RaviArray_dataT);
darray->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_RaviArray_dataT);
return darray;
}
@ -196,16 +202,18 @@ llvm::Instruction *RaviCodeGenerator::emit_load_type(RaviFunctionDef *def,
return tt;
}
llvm::Instruction *RaviCodeGenerator::emit_load_ravi_arraytype(RaviFunctionDef *def,
llvm::Value *value) {
llvm::Instruction *
RaviCodeGenerator::emit_load_ravi_arraytype(RaviFunctionDef *def,
llvm::Value *value) {
llvm::Value *tt_ptr = emit_gep(def, "raviarray.type_ptr", value, 0, 11, 1);
llvm::Instruction *tt = def->builder->CreateLoad(tt_ptr, "raviarray.type");
tt->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_RaviArray_typeT);
return tt;
}
llvm::Instruction *RaviCodeGenerator::emit_load_ravi_arraylength(RaviFunctionDef *def,
llvm::Value *value) {
llvm::Instruction *
RaviCodeGenerator::emit_load_ravi_arraylength(RaviFunctionDef *def,
llvm::Value *value) {
llvm::Value *tt_ptr = emit_gep(def, "raviarray.len_ptr", value, 0, 11, 2);
llvm::Instruction *tt = def->builder->CreateLoad(tt_ptr, "raviarray.len");
tt->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_RaviArray_lenT);
@ -351,6 +359,7 @@ bool RaviCodeGenerator::canCompile(Proto *p) {
case OP_RAVI_DIVII:
case OP_RAVI_GETTABLE_AI:
case OP_RAVI_GETTABLE_AF:
case OP_RAVI_SETTABLE_AI:
break;
default:
return false;
@ -474,6 +483,12 @@ void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
def->luaV_opvarargF = def->raviF->addExternFunction(
def->types->luaV_opvarargT, reinterpret_cast<void *>(&luaV_opvararg),
"luaV_opvararg");
def->raviH_set_intF = def->raviF->addExternFunction(
def->types->raviH_set_intT, reinterpret_cast<void *>(&raviH_set_int),
"raviH_set_int");
def->raviH_set_floatF = def->raviF->addExternFunction(
def->types->raviH_set_floatT, reinterpret_cast<void *>(&raviH_set_float),
"raviH_set_float");
// Create printf declaration
std::vector<llvm::Type *> args;
@ -875,6 +890,11 @@ void RaviCodeGenerator::compile(lua_State *L, Proto *p) {
int C = GETARG_C(i);
emit_GETTABLE_AI(&def, L_ci, proto, A, B, C);
} break;
case OP_RAVI_SETTABLE_AI: {
int B = GETARG_B(i);
int C = GETARG_C(i);
emit_SETTABLE_AI(&def, L_ci, proto, A, B, C);
} break;
case OP_RAVI_GETTABLE_AF: {
int B = GETARG_B(i);
int C = GETARG_C(i);

@ -81,11 +81,11 @@ void RaviCodeGenerator::emit_GETTABLE_AF(RaviFunctionDef *def,
// 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);
// 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);
@ -96,17 +96,17 @@ void RaviCodeGenerator::emit_GETTABLE_AF(RaviFunctionDef *def,
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]);
def->builder->CreateSub(key, def->types->kluaInteger[1]);
llvm::Value *ukey =
def->builder->CreateTrunc(key_minus_1, def->types->C_intT);
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::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::Create(def->jitState->context(), "if.not.in.range");
llvm::BasicBlock *end_block =
llvm::BasicBlock::Create(def->jitState->context(), "if.end");
llvm::BasicBlock::Create(def->jitState->context(), "if.end");
def->builder->CreateCondBr(cmp, then_block, else_block);
def->builder->SetInsertPoint(then_block);
@ -122,9 +122,9 @@ void RaviCodeGenerator::emit_GETTABLE_AF(RaviFunctionDef *def,
def->builder->SetInsertPoint(else_block);
llvm::Value *errmsg1 =
def->builder->CreateGlobalString("array out of bounds");
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));
emit_gep(def, "out_of_bounds_msg", errmsg1, 0, 0));
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(end_block);
@ -194,6 +194,67 @@ void RaviCodeGenerator::emit_GETTABLE_AI(RaviFunctionDef *def,
def->builder->SetInsertPoint(end_block);
}
void RaviCodeGenerator::emit_SETTABLE_AI(RaviFunctionDef *def,
llvm::Value *L_ci, llvm::Value *proto,
int A, int B, int C) {
//#define raviH_set_int_inline(L, t, key, value) \
//{ unsigned ukey = (unsigned)((key)-1); \
// lua_Integer *data = (lua_Integer *)t->ravi_array.data; \
// if (ukey < t->ravi_array.len) { \
// data[ukey] = value; \
// } else \
// raviH_set_int(L, t, ukey, value); \
//}
// Table *t = hvalue(ra);
// TValue *rb = RKB(i);
// TValue *rc = RKC(i);
// lua_Integer idx = ivalue(rb);
// lua_Integer value = ivalue(rc);
// raviH_set_int_inline(L, t, idx, value);
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 *key = emit_load_reg_i(def, rb);
llvm::Instruction *value = emit_load_reg_i(def, rc);
llvm::Instruction *t = emit_load_reg_h(def, ra);
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 *ins = def->builder->CreateStore(value, ptr);
// TODO tbaa
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(else_block);
def->builder->SetInsertPoint(else_block);
llvm::Value *uukey = def->builder->CreateZExt(ukey, def->types->lua_UnsignedT);
def->builder->CreateCall4(def->raviH_set_intF, def->L, t, uukey, value);
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) {

@ -404,7 +404,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
NodeT->setBody(elements);
pNodeT = llvm::PointerType::get(NodeT, 0);
//typedef struct RaviArray {
// typedef struct RaviArray {
// char *data;
// ravitype_t type; /* RAVI specialization */
// unsigned int len; /* RAVI len specialization */
@ -436,15 +436,15 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(pGCObjectT);
elements.push_back(lu_byteT);
elements.push_back(lu_byteT);
elements.push_back(lu_byteT); /* flags */
elements.push_back(lu_byteT); /* lsizenode */
elements.push_back(C_intT); /* sizearray */
elements.push_back(pTValueT); /* array part */
elements.push_back(pNodeT); /* node */
elements.push_back(pNodeT); /* lastfree */
elements.push_back(pTableT); /* metatable */
elements.push_back(pGCObjectT); /* gclist */
elements.push_back(RaviArrayT); /* RaviArray */
elements.push_back(lu_byteT); /* flags */
elements.push_back(lu_byteT); /* lsizenode */
elements.push_back(C_intT); /* sizearray */
elements.push_back(pTValueT); /* array part */
elements.push_back(pNodeT); /* node */
elements.push_back(pNodeT); /* lastfree */
elements.push_back(pTableT); /* metatable */
elements.push_back(pGCObjectT); /* gclist */
elements.push_back(RaviArrayT); /* RaviArray */
TableT->setBody(elements);
// struct lua_longjmp; /* defined in ldo.c */
@ -811,6 +811,26 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
luaV_opvarargT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
// void raviH_set_int(lua_State *L, Table *t, lua_Unsigned key, lua_Integer
// value);
elements.clear();
elements.push_back(plua_StateT);
elements.push_back(pTableT);
elements.push_back(lua_UnsignedT);
elements.push_back(lua_IntegerT);
raviH_set_intT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
// void raviH_set_float(lua_State *L, Table *t, lua_Unsigned key, lua_Number
// value);
elements.clear();
elements.push_back(plua_StateT);
elements.push_back(pTableT);
elements.push_back(lua_UnsignedT);
elements.push_back(lua_NumberT);
raviH_set_floatT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
for (int j = 0; j < kInt.size(); j++)
kInt[j] = llvm::ConstantInt::get(C_intT, j);
for (int j = 0; j < kluaInteger.size(); j++)
@ -1023,10 +1043,12 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_RaviArrayT, 32));
tbaa_TableT = mdbuilder.createTBAAStructTypeNode("Table", nodes);
tbaa_RaviArray_dataT = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 32);
tbaa_RaviArray_typeT = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 36);
tbaa_RaviArray_lenT = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_intT, 40);
tbaa_RaviArray_dataT =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 32);
tbaa_RaviArray_typeT =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 36);
tbaa_RaviArray_lenT =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_intT, 40);
}
void LuaLLVMTypes::dump() {

Loading…
Cancel
Save