prep work for ravi array opcodes

pull/81/head
Dibyendu Majumdar 9 years ago
parent eb218bbabe
commit 41e3426314

@ -512,10 +512,10 @@ typedef struct Node {
} Node;
typedef struct RaviArray {
char *data;
ravitype_t type; /* RAVI specialization */
unsigned int len; /* RAVI len specialization */
unsigned int size; /* amount of memory allocated */
char *data;
} RaviArray;
typedef struct Table {

@ -82,10 +82,12 @@ struct LuaLLVMTypes {
llvm::Type *C_int64_t;
llvm::Type *lua_NumberT;
llvm::Type *plua_NumberT;
llvm::PointerType *plua_NumberT;
llvm::PointerType *pplua_NumberT;
llvm::Type *lua_IntegerT;
llvm::PointerType *plua_IntegerT;
llvm::PointerType *pplua_IntegerT;
llvm::Type *lua_UnsignedT;
llvm::Type *lua_KContextT;
@ -135,8 +137,10 @@ struct LuaLLVMTypes {
llvm::PointerType *ppTStringT;
llvm::StructType *UdataT;
llvm::StructType *RaviArrayT;
llvm::StructType *TableT;
llvm::PointerType *pTableT;
llvm::PointerType *ppTableT;
llvm::StructType *UpvaldescT;
llvm::PointerType *pUpvaldescT;
@ -253,6 +257,11 @@ struct LuaLLVMTypes {
llvm::MDNode *tbaa_UpValT;
llvm::MDNode *tbaa_UpVal_vT;
llvm::MDNode *tbaa_UpVal_valueT;
llvm::MDNode *tbaa_RaviArrayT;
llvm::MDNode *tbaa_TableT;
llvm::MDNode *tbaa_RaviArray_typeT;
llvm::MDNode *tbaa_RaviArray_dataT;
llvm::MDNode *tbaa_RaviArray_lenT;
};
class RAVI_API RaviJITStateImpl;
@ -522,6 +531,15 @@ public:
// emit code to load the boolean value from register
llvm::Instruction *emit_load_reg_b(RaviFunctionDef *def, llvm::Value *ra);
// emit code to load the table value from register
llvm::Instruction *emit_load_reg_h(RaviFunctionDef *def, llvm::Value *ra);
// emit code to load pointer to int array
llvm::Instruction *emit_load_reg_h_intarray(RaviFunctionDef *def, llvm::Instruction *ra);
// emit code to load pointer to double array
llvm::Instruction *emit_load_reg_h_floatarray(RaviFunctionDef *def, llvm::Instruction *ra);
// emit code to store lua_Number value into register
void emit_store_reg_n(RaviFunctionDef *def, llvm::Value *value,
llvm::Value *dest_ptr);
@ -540,6 +558,9 @@ public:
// emit code to load the type from a register
llvm::Instruction *emit_load_type(RaviFunctionDef *def, llvm::Value *value);
// emit code to load the type from a register
llvm::Instruction *emit_load_ravi_arraytype(RaviFunctionDef *def, llvm::Value *value);
// TValue assign
void emit_assign(RaviFunctionDef *def, llvm::Value *ra, llvm::Value *rb);

@ -1597,22 +1597,15 @@ newframe: /* reentry point when frame changes (call/return) */
if (tonumber(ra, &j)) {
setfltvalue(ra, j);
} else
luaG_runerror(L, "float expected");
} break;
case OP_RAVI_TOARRAYI: {
if (!ttistable(ra) || hvalue(ra)->ravi_array.type != RAVI_TARRAYINT)
luaG_runerror(L, "int[] expected");
} break;
case OP_RAVI_TOARRAYF: {
if (!ttistable(ra) || hvalue(ra)->ravi_array.type != RAVI_TARRAYFLT)
luaG_runerror(L, "double[] expected");
luaG_runerror(L, "number expected");
} break;
case OP_RAVI_MOVEI: {
TValue *rb = RB(i);
lua_Integer j;
if (tointeger(rb, &j)) {
setivalue(ra, j);
} else
}
else
luaG_runerror(L, "integer expected");
} break;
case OP_RAVI_MOVEF: {
@ -1620,22 +1613,32 @@ newframe: /* reentry point when frame changes (call/return) */
lua_Number j;
if (tonumber(rb, &j)) {
setfltvalue(ra, j);
} else
luaG_runerror(L, "float expected");
}
else
luaG_runerror(L, "number expected");
} break;
case OP_RAVI_TOARRAYI: {
if (!ttistable(ra) || hvalue(ra)->ravi_array.type != RAVI_TARRAYINT)
luaG_runerror(L, "integer[] expected");
} break;
case OP_RAVI_TOARRAYF: {
if (!ttistable(ra) || hvalue(ra)->ravi_array.type != RAVI_TARRAYFLT)
luaG_runerror(L, "number[] expected");
} break;
case OP_RAVI_MOVEAI: {
TValue *rb = RB(i);
if (ttistable(rb) && hvalue(rb)->ravi_array.type == RAVI_TARRAYINT) {
setobjs2s(L, ra, rb);
} else
luaG_runerror(L, "int[] expected");
luaG_runerror(L, "integer[] expected");
} break;
case OP_RAVI_MOVEAF: {
TValue *rb = RB(i);
if (ttistable(rb) && hvalue(rb)->ravi_array.type == RAVI_TARRAYFLT) {
setobjs2s(L, ra, rb);
} else
luaG_runerror(L, "double[] expected");
luaG_runerror(L, "number[] expected");
} break;
case OP_RAVI_GETTABLE_AI: {
TValue *rb = RB(i);

@ -125,6 +125,32 @@ llvm::Instruction *RaviCodeGenerator::emit_load_reg_b(RaviFunctionDef *def,
return lhs;
}
llvm::Instruction *RaviCodeGenerator::emit_load_reg_h(RaviFunctionDef *def,
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::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::Instruction *darray = def->builder->CreateLoad(darray_ptr);
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::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::Instruction *darray = def->builder->CreateLoad(darray_ptr);
darray->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_RaviArray_dataT);
return darray;
}
void RaviCodeGenerator::emit_store_reg_n(RaviFunctionDef *def,
llvm::Value *result,
llvm::Value *dest_ptr) {
@ -170,6 +196,14 @@ llvm::Instruction *RaviCodeGenerator::emit_load_type(RaviFunctionDef *def,
return tt;
}
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::Value *RaviCodeGenerator::emit_gep_rkb(RaviFunctionDef *def,
llvm::Instruction *base_ptr,
int B) {

@ -32,6 +32,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
C_doubleT = llvm::Type::getDoubleTy(context);
lua_NumberT = C_doubleT;
plua_NumberT = llvm::PointerType::get(lua_NumberT, 0);
pplua_NumberT = llvm::PointerType::get(plua_NumberT, 0);
static_assert(sizeof(lua_Integer) == sizeof(lua_Number) &&
sizeof(lua_Integer) == sizeof(int64_t),
@ -40,6 +41,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
"lua_Integer is not an integer type");
lua_IntegerT = llvm::Type::getIntNTy(context, sizeof(lua_Integer) * 8);
plua_IntegerT = llvm::PointerType::get(lua_IntegerT, 0);
pplua_IntegerT = llvm::PointerType::get(plua_IntegerT, 0);
static_assert(sizeof(lua_Integer) == sizeof(lua_Unsigned),
"lua_Integer and lua_Unsigned are of different size");
@ -194,6 +196,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
// Table
TableT = llvm::StructType::create(context, "ravi.Table");
pTableT = llvm::PointerType::get(TableT, 0);
ppTableT = llvm::PointerType::get(pTableT, 0);
///*
//** Header for userdata; memory area follows the end of this structure
@ -401,6 +404,21 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
NodeT->setBody(elements);
pNodeT = llvm::PointerType::get(NodeT, 0);
//typedef struct RaviArray {
// char *data;
// ravitype_t type; /* RAVI specialization */
// unsigned int len; /* RAVI len specialization */
// unsigned int size; /* amount of memory allocated */
//} RaviArray;
RaviArrayT = llvm::StructType::create(context, "ravi.RaviArray");
elements.clear();
elements.push_back(C_pcharT);
elements.push_back(ravitype_tT);
elements.push_back(C_intT);
elements.push_back(C_intT);
RaviArrayT->setBody(elements);
// typedef struct Table {
// CommonHeader;
// lu_byte flags; /* 1<<p means tagmethod(p) is not present */
@ -426,8 +444,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(pNodeT); /* lastfree */
elements.push_back(pTableT); /* metatable */
elements.push_back(pGCObjectT); /* gclist */
elements.push_back(ravitype_tT); /* ravi_array_type */
elements.push_back(C_intT); /* ravi_array_len */
elements.push_back(RaviArrayT); /* RaviArray */
TableT->setBody(elements);
// struct lua_longjmp; /* defined in ldo.c */
@ -981,6 +998,35 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
mdbuilder.createTBAAStructTagNode(tbaa_UpValT, tbaa_pointerT, 0);
tbaa_UpVal_valueT =
mdbuilder.createTBAAStructTagNode(tbaa_UpValT, tbaa_TValueT, 16);
// RaviArray
nodes.clear();
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 4));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 8));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 12));
tbaa_RaviArrayT = mdbuilder.createTBAAStructTypeNode("RaviArray", nodes);
// Table
nodes.clear();
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 4));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 5));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 6));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 7));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 8));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 12));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 16));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 20));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 24));
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 28));
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);
}
void LuaLLVMTypes::dump() {

Loading…
Cancel
Save