prep work for NaN tagging of values

pull/81/head
Dibyendu Majumdar 9 years ago
parent 9be16d1cac
commit c989eac5be

@ -69,6 +69,27 @@ extern "C" {
namespace ravi {
enum LuaTypeCode {
LUA__TNIL = LUA_TNIL,
LUA__TBOOLEAN = LUA_TBOOLEAN,
LUA__TLIGHTUSERDATA = LUA_TLIGHTUSERDATA,
LUA__TNUMBER = LUA_TNUMBER,
LUA__TSTRING = ctb(LUA_TSTRING),
LUA__TTABLE = ctb(LUA_TTABLE),
LUA__TFUNCTION = ctb(LUA_TFUNCTION),
LUA__TUSERDATA = ctb(LUA_TUSERDATA),
LUA__TTHREAD = ctb(LUA_TTHREAD),
LUA__TLCL = ctb(LUA_TLCL),
LUA__TLCF = LUA_TLCF,
LUA__TCCL = ctb(LUA_TCCL),
LUA__TSHRSTR = ctb(LUA_TSHRSTR),
LUA__TLNGSTR = ctb(LUA_TLNGSTR),
LUA__TNUMFLT = LUA_TNUMFLT,
LUA__TNUMINT = LUA_TNUMINT
};
// All Lua types are gathered here
struct LuaLLVMTypes {
@ -586,6 +607,23 @@ public:
llvm::Instruction *emit_load_local_int(RaviFunctionDef *def,
llvm::Value *src);
// Test if value type is of specific Lua type
// Value_type should have been obtained by emit_load_type()
// The Lua typecode to check must be in lua_typecode
// The return value is a boolean type as a result of
// integer comparison result which is i1 in LLVM
llvm::Value *emit_is_value_of_type(RaviFunctionDef *def, llvm::Value *value_type,
LuaTypeCode lua_typecode, const char *varname = "value.typeof");
// Test if value type is NOT of specific Lua type
// Value_type should have been obtained by emit_load_type()
// The Lua typecode to check must be in lua_typecode
// The return value is a boolean type as a result of
// integer comparison result which is i1 in LLVM
llvm::Value *emit_is_not_value_of_type(RaviFunctionDef *def, llvm::Value *value_type,
LuaTypeCode lua_typecode, const char *varname = "value.not.typeof");
// emit code for (LClosure *)ci->func->value_.gc
llvm::Value *emit_gep_ci_func_value_gc_asLClosure(RaviFunctionDef *def,
llvm::Value *ci);

@ -63,10 +63,10 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::BasicBlock::Create(def->jitState->context(), "done");
if (op != OP_DIV) {
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
rb_type, def->types->kInt[LUA_TNUMINT], "rb.is.integer");
llvm::Value *cmp2 = def->builder->CreateICmpEQ(
rc_type, def->types->kInt[LUA_TNUMINT], "rc.is.integer");
llvm::Value *cmp1 =
emit_is_value_of_type(def, rb_type, LUA__TNUMINT, "rb.is.integer");
llvm::Value *cmp2 =
emit_is_value_of_type(def, rc_type, LUA__TNUMINT, "rc.is.integer");
llvm::Value *andvalue = def->builder->CreateAnd(cmp1, cmp2);
@ -108,8 +108,8 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, llvm::Value *L_ci,
}
// Is RB a float?
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
rb_type, def->types->kInt[LUA_TNUMFLT], "rb.is.float");
llvm::Value *cmp1 =
emit_is_value_of_type(def, rb_type, LUA__TNUMFLT, "rb.is.float");
llvm::BasicBlock *convert_rb =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rb");
@ -148,8 +148,7 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(test_rc);
// Is RC a float?
cmp1 = def->builder->CreateICmpEQ(rc_type, def->types->kInt[LUA_TNUMFLT],
"rc.is.float");
cmp1 = emit_is_value_of_type(def, rc_type, LUA__TNUMFLT, "rc.is.float");
llvm::BasicBlock *convert_rc =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rc");
@ -261,10 +260,10 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::BasicBlock *done_block =
llvm::BasicBlock::Create(def->jitState->context(), "done");
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
rb_type, def->types->kInt[LUA_TNUMINT], "rb.is.integer");
llvm::Value *cmp2 = def->builder->CreateICmpEQ(
rc_type, def->types->kInt[LUA_TNUMINT], "rc.is.integer");
llvm::Value *cmp1 =
emit_is_value_of_type(def, rb_type, LUA__TNUMINT, "rb.is.integer");
llvm::Value *cmp2 =
emit_is_value_of_type(def, rc_type, LUA__TNUMINT, "rc.is.integer");
llvm::Value *andvalue = def->builder->CreateAnd(cmp1, cmp2);
@ -292,8 +291,7 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(else_block);
// Is RB a float?
cmp1 = def->builder->CreateICmpEQ(rb_type, def->types->kInt[LUA_TNUMFLT],
"rb.is.float");
cmp1 = emit_is_value_of_type(def, rb_type, LUA__TNUMFLT, "rb.is.float");
llvm::BasicBlock *convert_rb =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rb");
@ -332,8 +330,7 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(test_rc);
// Is RC a float?
cmp1 = def->builder->CreateICmpEQ(rc_type, def->types->kInt[LUA_TNUMFLT],
"rc.is.float");
cmp1 = emit_is_value_of_type(def, rc_type, LUA__TNUMFLT, "rc.is.float");
llvm::BasicBlock *convert_rc =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rc");
@ -457,10 +454,10 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::BasicBlock *done_block =
llvm::BasicBlock::Create(def->jitState->context(), "done");
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
rb_type, def->types->kInt[LUA_TNUMINT], "rb.is.integer");
llvm::Value *cmp2 = def->builder->CreateICmpEQ(
rc_type, def->types->kInt[LUA_TNUMINT], "rc.is.integer");
llvm::Value *cmp1 =
emit_is_value_of_type(def, rb_type, LUA__TNUMINT, "rb.is.integer");
llvm::Value *cmp2 =
emit_is_value_of_type(def, rc_type, LUA__TNUMINT, "rc.is.integer");
llvm::Value *andvalue = def->builder->CreateAnd(cmp1, cmp2);
@ -488,8 +485,7 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(else_block);
// Is RB a float?
cmp1 = def->builder->CreateICmpEQ(rb_type, def->types->kInt[LUA_TNUMFLT],
"rb.is.float");
cmp1 = emit_is_value_of_type(def, rb_type, LUA__TNUMFLT, "rb.is.float");
llvm::BasicBlock *convert_rb =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rb");
@ -528,8 +524,7 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(test_rc);
// Is RC a float?
cmp1 = def->builder->CreateICmpEQ(rc_type, def->types->kInt[LUA_TNUMFLT],
"rc.is.float");
cmp1 = emit_is_value_of_type(def, rc_type, LUA__TNUMFLT, "rc.is.float");
llvm::BasicBlock *convert_rc =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rc");
@ -620,8 +615,8 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::BasicBlock::Create(def->jitState->context(), "done");
// Is RB a float?
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
rb_type, def->types->kInt[LUA_TNUMFLT], "rb.is.float");
llvm::Value *cmp1 =
emit_is_value_of_type(def, rb_type, LUA__TNUMFLT, "rb.is.float");
llvm::BasicBlock *convert_rb =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rb");
@ -660,8 +655,7 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(test_rc);
// Is RC a float?
cmp1 = def->builder->CreateICmpEQ(rc_type, def->types->kInt[LUA_TNUMFLT],
"rc.is.float");
cmp1 = emit_is_value_of_type(def, rc_type, LUA__TNUMFLT, "rc.is.float");
llvm::BasicBlock *convert_rc =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rc");
@ -751,8 +745,8 @@ void RaviCodeGenerator::emit_UNM(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::BasicBlock *done_block =
llvm::BasicBlock::Create(def->jitState->context(), "done");
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
rb_type, def->types->kInt[LUA_TNUMINT], "rb.is.integer");
llvm::Value *cmp1 =
emit_is_value_of_type(def, rb_type, LUA__TNUMINT, "rb.is.integer");
// Check if both RB and RC are integers
llvm::BasicBlock *then_block =
@ -776,8 +770,7 @@ void RaviCodeGenerator::emit_UNM(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(else_block);
// Is RB a float?
cmp1 = def->builder->CreateICmpEQ(rb_type, def->types->kInt[LUA_TNUMFLT],
"rb.is.float");
cmp1 = emit_is_value_of_type(def, rb_type, LUA__TNUMFLT, "rb.is.float");
llvm::BasicBlock *convert_rb =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rb");

@ -262,6 +262,21 @@ llvm::Instruction *RaviCodeGenerator::emit_load_type(RaviFunctionDef *def,
return tt;
}
llvm::Value *RaviCodeGenerator::emit_is_value_of_type(RaviFunctionDef *def,
llvm::Value *value_type,
LuaTypeCode lua_type,
const char *varname) {
return def->builder->CreateICmpEQ(value_type, def->types->kInt[int(lua_type)],
varname);
}
llvm::Value *RaviCodeGenerator::emit_is_not_value_of_type(
RaviFunctionDef *def, llvm::Value *value_type, LuaTypeCode lua_type,
const char *varname) {
return def->builder->CreateICmpNE(value_type, def->types->kInt[int(lua_type)],
varname);
}
llvm::Instruction *
RaviCodeGenerator::emit_load_ravi_arraytype(RaviFunctionDef *def,
llvm::Value *value) {

@ -98,7 +98,7 @@ llvm::Value *RaviCodeGenerator::emit_boolean_testfalse(RaviFunctionDef *def,
llvm::Value *type = emit_load_type(def, reg);
// Test if type == LUA_TNIL (0)
llvm::Value *isnil = def->builder->CreateICmpEQ(type, def->types->kInt[0]);
llvm::Value *isnil = emit_is_value_of_type(def, type, LUA__TNIL, "is.nil");
llvm::BasicBlock *then_block =
llvm::BasicBlock::Create(def->jitState->context(), "if.nil", def->f);
llvm::BasicBlock *else_block =
@ -117,7 +117,8 @@ llvm::Value *RaviCodeGenerator::emit_boolean_testfalse(RaviFunctionDef *def,
// so check if bool and b == 0
// Test if type == LUA_TBOOLEAN
llvm::Value *isbool = def->builder->CreateICmpEQ(type, def->types->kInt[1]);
llvm::Value *isbool =
emit_is_value_of_type(def, type, LUA__TBOOLEAN, "is.boolean");
// Test if bool value == 0
llvm::Value *bool_value = emit_load_reg_b(def, reg);
llvm::Value *boolzero =

@ -250,8 +250,7 @@ void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
// Is index an integer?
llvm::Instruction *rinit_tt = emit_load_type(def, rinit);
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
rinit_tt, def->types->kInt[LUA_TNUMINT], "is.integer");
llvm::Value *cmp1 = emit_is_value_of_type(def, rinit_tt, LUA__TNUMINT, "init.is.integer");
// Setup if then else branch for integer
llvm::BasicBlock *if_integer =

@ -100,15 +100,15 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *pinit_tt = emit_load_type(def, init);
// Compare init->tt == LUA_TNUMINT
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
pinit_tt, def->types->kInt[LUA_TNUMINT], "init.is.integer");
llvm::Value *cmp1 =
emit_is_value_of_type(def, pinit_tt, LUA__TNUMINT, "init.is.integer");
// Get pstep->tt
llvm::Instruction *pstep_tt = emit_load_type(def, pstep);
// Compare pstep->tt == LUA_TNUMINT
llvm::Value *icmp2 = def->builder->CreateICmpEQ(
pstep_tt, def->types->kInt[LUA_TNUMINT], "step.is.integer");
llvm::Value *icmp2 =
emit_is_value_of_type(def, pstep_tt, LUA__TNUMINT, "step.is.integer");
// Get ivalue(pstep)
llvm::Instruction *pstep_ivalue = emit_load_reg_i(def, pstep);
@ -229,8 +229,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *plimit_tt = emit_load_type(def, plimit);
// Test if already a float
cmp1 = def->builder->CreateICmpEQ(plimit_tt, def->types->kInt[LUA_TNUMFLT],
"limit.is.float");
cmp1 = emit_is_value_of_type(def, plimit_tt, LUA__TNUMFLT, "limit.is.float");
llvm::BasicBlock *else1_plimit_ifnum = llvm::BasicBlock::Create(
def->jitState->context(), "if.limit.isfloat", def->f);
llvm::BasicBlock *else1_plimit_elsenum =
@ -275,8 +274,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// *********** PSTEP - convert pstep to float
// Test if already a float
pstep_tt = emit_load_type(def, pstep);
cmp1 = def->builder->CreateICmpEQ(pstep_tt, def->types->kInt[LUA_TNUMFLT],
"step.is.float");
cmp1 = emit_is_value_of_type(def, pstep_tt, LUA__TNUMFLT, "step.is.float");
llvm::BasicBlock *else1_pstep_ifnum = llvm::BasicBlock::Create(
def->jitState->context(), "if.step.isfloat", def->f);
llvm::BasicBlock *else1_pstep_elsenum =
@ -320,8 +318,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// Check if it is already a float
pinit_tt = emit_load_type(def, init);
cmp1 = def->builder->CreateICmpEQ(pinit_tt, def->types->kInt[LUA_TNUMFLT],
"init.is.float");
cmp1 = emit_is_value_of_type(def, pinit_tt, LUA__TNUMFLT, "init.is.float");
llvm::BasicBlock *else1_pinit_ifnum = llvm::BasicBlock::Create(
def->jitState->context(), "if.init.is.float", def->f);
llvm::BasicBlock *else1_pinit_elsenum =
@ -459,15 +456,15 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *pinit_tt = emit_load_type(def, init);
// Compare init->tt_ == LUA_TNUMINT
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
pinit_tt, def->types->kInt[LUA_TNUMINT], "init.is.integer");
llvm::Value *cmp1 =
emit_is_value_of_type(def, pinit_tt, LUA__TNUMINT, "init.is.integer");
// Get pstep->tt_
llvm::Instruction *pstep_tt = emit_load_type(def, pstep);
// Compare pstep->tt_ == LUA_TNUMINT
llvm::Value *icmp2 = def->builder->CreateICmpEQ(
pstep_tt, def->types->kInt[LUA_TNUMINT], "step.is.integer");
llvm::Value *icmp2 =
emit_is_value_of_type(def, pstep_tt, LUA__TNUMINT, "step.is.integer");
// Get ivalue(pstep)
llvm::Instruction *pstep_ivalue = emit_load_reg_i(def, pstep);
@ -554,8 +551,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *plimit_tt = emit_load_type(def, plimit);
// Test if already a float
cmp1 = def->builder->CreateICmpEQ(plimit_tt, def->types->kInt[LUA_TNUMFLT],
"limit.is.float");
cmp1 = emit_is_value_of_type(def, plimit_tt, LUA__TNUMFLT, "limit.is.float");
llvm::BasicBlock *else1_plimit_ifnum = llvm::BasicBlock::Create(
def->jitState->context(), "if.limit.isfloat", def->f);
llvm::BasicBlock *else1_plimit_elsenum =
@ -604,8 +600,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// *********** PSTEP - convert pstep to float
// Test if already a float
pstep_tt = emit_load_type(def, pstep);
cmp1 = def->builder->CreateICmpEQ(pstep_tt, def->types->kInt[LUA_TNUMFLT],
"step.is.float");
cmp1 = emit_is_value_of_type(def, pstep_tt, LUA__TNUMFLT, "step.is.float");
llvm::BasicBlock *else1_pstep_ifnum = llvm::BasicBlock::Create(
def->jitState->context(), "if.step.isfloat", def->f);
llvm::BasicBlock *else1_pstep_elsenum =
@ -654,8 +649,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// Check if it is already a float
pinit_tt = emit_load_type(def, init);
cmp1 = def->builder->CreateICmpEQ(pinit_tt, def->types->kInt[LUA_TNUMFLT],
"init.is.float");
cmp1 = emit_is_value_of_type(def, pinit_tt, LUA__TNUMFLT, "init.is.float");
llvm::BasicBlock *else1_pinit_ifnum = llvm::BasicBlock::Create(
def->jitState->context(), "if.init.is.float", def->f);
llvm::BasicBlock *else1_pinit_elsenum =

@ -117,8 +117,8 @@ void RaviCodeGenerator::emit_MOVEI(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *src_type = emit_load_type(def, src);
// Compare src->tt == LUA_TNUMINT
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
src_type, def->types->kInt[LUA_TNUMINT], "is.integer");
llvm::Value *cmp1 =
emit_is_value_of_type(def, src_type, LUA__TNUMINT, "is.src.integer");
llvm::BasicBlock *then1 =
llvm::BasicBlock::Create(def->jitState->context(), "if.integer", def->f);
@ -189,8 +189,8 @@ void RaviCodeGenerator::emit_MOVEF(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *src_type = emit_load_type(def, src);
// Compare src->tt == LUA_TNUMFLT
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
src_type, def->types->kInt[LUA_TNUMFLT], "is.float");
llvm::Value *cmp1 =
emit_is_value_of_type(def, src_type, LUA__TNUMFLT, "is.src.float");
llvm::BasicBlock *then1 =
llvm::BasicBlock::Create(def->jitState->context(), "if.float", def->f);
@ -260,9 +260,9 @@ void RaviCodeGenerator::emit_TOINT(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *src_type = emit_load_type(def, src);
// Compare src->tt == LUA_TNUMINT
llvm::Value *cmp1 = def->builder->CreateICmpNE(
src_type, def->types->kInt[LUA_TNUMINT], "is.not.integer");
// Is src->tt != LUA_TNUMINT?
llvm::Value *cmp1 =
emit_is_not_value_of_type(def, src_type, LUA__TNUMINT, "is.not.integer");
llvm::BasicBlock *then1 = llvm::BasicBlock::Create(def->jitState->context(),
"if.not.integer", def->f);
@ -325,9 +325,9 @@ void RaviCodeGenerator::emit_TOFLT(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *src_type = emit_load_type(def, src);
// Compare src->tt == LUA_TNUMFLT
llvm::Value *cmp1 = def->builder->CreateICmpNE(
src_type, def->types->kInt[LUA_TNUMFLT], "is.not.float");
// Is src->tt != LUA_TNUMFLT?
llvm::Value *cmp1 =
emit_is_not_value_of_type(def, src_type, LUA__TNUMFLT, "is.not.float");
llvm::BasicBlock *then1 = llvm::BasicBlock::Create(def->jitState->context(),
"if.not.float", def->f);

@ -277,8 +277,8 @@ void RaviCodeGenerator::emit_SETTABLE_AF(RaviFunctionDef *def,
llvm::Instruction *rc_type = emit_load_type(def, rc);
// Is RC a float?
llvm::Value *cmp = def->builder->CreateICmpEQ(
rc_type, def->types->kInt[LUA_TNUMFLT], "rc.is.float");
llvm::Value *cmp =
emit_is_value_of_type(def, rc_type, LUA__TNUMFLT, "rc.is.float");
llvm::BasicBlock *convert_rc =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rc");
@ -489,8 +489,8 @@ llvm::Instruction *RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def,
llvm::Instruction *type = emit_load_type(def, ra);
// type != LUA_TTABLE ?
llvm::Value *cmp1 = def->builder->CreateICmpNE(
type, def->types->kInt[LUA_TTABLE | BIT_ISCOLLECTABLE], "is.not.table");
llvm::Value *cmp1 =
emit_is_not_value_of_type(def, type, LUA__TTABLE, "is.not.table");
llvm::BasicBlock *raise_error = llvm::BasicBlock::Create(
def->jitState->context(), "if.not.table", def->f);

@ -79,7 +79,8 @@ void RaviCodeGenerator::emit_TFORCALL(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *type = emit_load_type(def, ra1);
// Test if type != LUA_TNIL (0)
llvm::Value *isnotnil = def->builder->CreateICmpNE(type, def->types->kInt[0]);
llvm::Value *isnotnil =
emit_is_not_value_of_type(def, type, LUA__TNIL, "is.not.nil");
llvm::BasicBlock *then_block =
llvm::BasicBlock::Create(def->jitState->context(), "if.not.nil", def->f);
llvm::BasicBlock *else_block =
@ -116,7 +117,8 @@ void RaviCodeGenerator::emit_TFORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *type = emit_load_type(def, ra1);
// Test if type != LUA_TNIL (0)
llvm::Value *isnotnil = def->builder->CreateICmpNE(type, def->types->kInt[0]);
llvm::Value *isnotnil =
emit_is_not_value_of_type(def, type, LUA__TNIL, "is.not.nil");
llvm::BasicBlock *then_block =
llvm::BasicBlock::Create(def->jitState->context(), "if.not.nil", def->f);
llvm::BasicBlock *else_block =

Loading…
Cancel
Save