issue #128 more on array set ops

gccjit-ravi534
Dibyendu Majumdar 7 years ago
parent 1caeca2700
commit d8f07e091a

@ -44,9 +44,9 @@ end
--ravi.dumplua(matgen)
if ravi and ravi.jit() then
ravi.compile(matrix.T)
ravi.compile(matrix.mul, {omitArrayGetRangeCheck=1})
ravi.compile(matgen)
assert(ravi.compile(matrix.T))
assert(ravi.compile(matrix.mul, {omitArrayGetRangeCheck=1}))
assert(ravi.compile(matgen))
end
local n = arg[1] or 1000;

@ -819,6 +819,27 @@ static void emit_settable_aii(struct function *fn, int A, int B,
membuff_add_string(&fn->body, "}\n");
}
static void emit_settable_ai(struct function *fn, int A, int B,
int C, bool known_int, int pc)
{
emit_reg(fn, "ra", A);
emit_reg_or_k(fn, "rb", B);
emit_reg_or_k(fn, "rc", C);
membuff_add_string(&fn->body, "t = hvalue(ra);\n");
membuff_add_string(&fn->body, "ukey = (lua_Unsigned)(ivalue(rb));\n");
membuff_add_string(&fn->body, "iptr = (lua_Integer *)t->ravi_array.data;\n");
membuff_add_string(&fn->body, "if (!tointeger(rc, &i)) {\n");
membuff_add_fstring(&fn->body, " error_code = %d;\n",
Error_integer_expected);
membuff_add_string(&fn->body, " goto Lraise_error;\n");
membuff_add_string(&fn->body, "}\n");
membuff_add_string(&fn->body, "if (ukey < (lua_Unsigned)(t->ravi_array.len)) {\n");
membuff_add_string(&fn->body, " iptr[ukey] = i;\n");
membuff_add_string(&fn->body, "} else {\n");
membuff_add_fstring(&fn->body, " raviH_set_int(L, t, ukey, i);\n");
membuff_add_string(&fn->body, "}\n");
}
static void emit_settable_aff(struct function *fn, int A, int B,
int C, bool known_int, int pc)
{
@ -835,6 +856,26 @@ static void emit_settable_aff(struct function *fn, int A, int B,
membuff_add_string(&fn->body, "}\n");
}
static void emit_settable_af(struct function *fn, int A, int B,
int C, bool known_int, int pc)
{
emit_reg(fn, "ra", A);
emit_reg_or_k(fn, "rb", B);
emit_reg_or_k(fn, "rc", C);
membuff_add_string(&fn->body, "t = hvalue(ra);\n");
membuff_add_string(&fn->body, "ukey = (lua_Unsigned)(ivalue(rb));\n");
membuff_add_string(&fn->body, "nptr = (lua_Number *)t->ravi_array.data;\n");
membuff_add_string(&fn->body, "if (!tonumber(rc, &n)) {\n");
membuff_add_fstring(&fn->body, " error_code = %d;\n",
Error_integer_expected);
membuff_add_string(&fn->body, " goto Lraise_error;\n");
membuff_add_string(&fn->body, "}\n");
membuff_add_string(&fn->body, "if (ukey < (lua_Unsigned)(t->ravi_array.len)) {\n");
membuff_add_string(&fn->body, " nptr[ukey] = n;\n");
membuff_add_string(&fn->body, "} else {\n");
membuff_add_fstring(&fn->body, " raviH_set_float(L, t, ukey, n);\n");
membuff_add_string(&fn->body, "}\n");
}
static void emit_comparison(struct function *fn, int A, int B, int C, int j,
int jA, const char *compfunc, OpCode opCode,
@ -1677,8 +1718,6 @@ bool raviJ_codegen(struct lua_State *L, struct Proto *p,
case OP_RAVI_SETTABLE_SK:
case OP_RAVI_SETTABLE_S:
case OP_RAVI_SETTABLE_I:
case OP_RAVI_SETTABLE_AI:
case OP_RAVI_SETTABLE_AF:
case OP_SETTABLE: {
int B = GETARG_B(i);
int C = GETARG_C(i);
@ -1689,11 +1728,21 @@ bool raviJ_codegen(struct lua_State *L, struct Proto *p,
int C = GETARG_C(i);
emit_settable_aii(&fn, A, B, C, true, pc);
} break;
case OP_RAVI_SETTABLE_AI: {
int B = GETARG_B(i);
int C = GETARG_C(i);
emit_settable_ai(&fn, A, B, C, true, pc);
} break;
case OP_RAVI_SETTABLE_AFF: {
int B = GETARG_B(i);
int C = GETARG_C(i);
emit_settable_aff(&fn, A, B, C, true, pc);
} break;
case OP_RAVI_SETTABLE_AF: {
int B = GETARG_B(i);
int C = GETARG_C(i);
emit_settable_af(&fn, A, B, C, true, pc);
} break;
case OP_RAVI_GETTABUP_SK:
case OP_GETTABUP: {
int B = GETARG_B(i);

Loading…
Cancel
Save