diff options
Diffstat (limited to 'src/lj_opt_split.c')
| -rw-r--r-- | src/lj_opt_split.c | 213 |
1 files changed, 162 insertions, 51 deletions
diff --git a/src/lj_opt_split.c b/src/lj_opt_split.c index c8439cb8..32160c9a 100644 --- a/src/lj_opt_split.c +++ b/src/lj_opt_split.c | |||
| @@ -8,14 +8,15 @@ | |||
| 8 | 8 | ||
| 9 | #include "lj_obj.h" | 9 | #include "lj_obj.h" |
| 10 | 10 | ||
| 11 | #if LJ_HASJIT && (LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) | 11 | #if LJ_HASJIT && (LJ_SOFTFP32 || (LJ_32 && LJ_HASFFI)) |
| 12 | 12 | ||
| 13 | #include "lj_err.h" | 13 | #include "lj_err.h" |
| 14 | #include "lj_str.h" | 14 | #include "lj_buf.h" |
| 15 | #include "lj_ir.h" | 15 | #include "lj_ir.h" |
| 16 | #include "lj_jit.h" | 16 | #include "lj_jit.h" |
| 17 | #include "lj_ircall.h" | 17 | #include "lj_ircall.h" |
| 18 | #include "lj_iropt.h" | 18 | #include "lj_iropt.h" |
| 19 | #include "lj_dispatch.h" | ||
| 19 | #include "lj_vm.h" | 20 | #include "lj_vm.h" |
| 20 | 21 | ||
| 21 | /* SPLIT pass: | 22 | /* SPLIT pass: |
| @@ -139,6 +140,7 @@ static IRRef split_call_l(jit_State *J, IRRef1 *hisubst, IRIns *oir, | |||
| 139 | ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id); | 140 | ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id); |
| 140 | return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); | 141 | return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); |
| 141 | } | 142 | } |
| 143 | #endif | ||
| 142 | 144 | ||
| 143 | /* Emit a CALLN with one split 64 bit argument and a 32 bit argument. */ | 145 | /* Emit a CALLN with one split 64 bit argument and a 32 bit argument. */ |
| 144 | static IRRef split_call_li(jit_State *J, IRRef1 *hisubst, IRIns *oir, | 146 | static IRRef split_call_li(jit_State *J, IRRef1 *hisubst, IRIns *oir, |
| @@ -155,7 +157,6 @@ static IRRef split_call_li(jit_State *J, IRRef1 *hisubst, IRIns *oir, | |||
| 155 | ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id); | 157 | ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id); |
| 156 | return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); | 158 | return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); |
| 157 | } | 159 | } |
| 158 | #endif | ||
| 159 | 160 | ||
| 160 | /* Emit a CALLN with two split 64 bit arguments. */ | 161 | /* Emit a CALLN with two split 64 bit arguments. */ |
| 161 | static IRRef split_call_ll(jit_State *J, IRRef1 *hisubst, IRIns *oir, | 162 | static IRRef split_call_ll(jit_State *J, IRRef1 *hisubst, IRIns *oir, |
| @@ -192,9 +193,121 @@ static IRRef split_ptr(jit_State *J, IRIns *oir, IRRef ref) | |||
| 192 | nref = ir->op1; | 193 | nref = ir->op1; |
| 193 | if (ofs == 0) return nref; | 194 | if (ofs == 0) return nref; |
| 194 | } | 195 | } |
| 195 | return split_emit(J, IRTI(IR_ADD), nref, lj_ir_kint(J, ofs)); | 196 | return split_emit(J, IRT(IR_ADD, IRT_PTR), nref, lj_ir_kint(J, ofs)); |
| 197 | } | ||
| 198 | |||
| 199 | #if LJ_HASFFI | ||
| 200 | static IRRef split_bitshift(jit_State *J, IRRef1 *hisubst, | ||
| 201 | IRIns *oir, IRIns *nir, IRIns *ir) | ||
| 202 | { | ||
| 203 | IROp op = ir->o; | ||
| 204 | IRRef kref = nir->op2; | ||
| 205 | if (irref_isk(kref)) { /* Optimize constant shifts. */ | ||
| 206 | int32_t k = (IR(kref)->i & 63); | ||
| 207 | IRRef lo = nir->op1, hi = hisubst[ir->op1]; | ||
| 208 | if (op == IR_BROL || op == IR_BROR) { | ||
| 209 | if (op == IR_BROR) k = (-k & 63); | ||
| 210 | if (k >= 32) { IRRef t = lo; lo = hi; hi = t; k -= 32; } | ||
| 211 | if (k == 0) { | ||
| 212 | passthrough: | ||
| 213 | J->cur.nins--; | ||
| 214 | ir->prev = lo; | ||
| 215 | return hi; | ||
| 216 | } else { | ||
| 217 | TRef k1, k2; | ||
| 218 | IRRef t1, t2, t3, t4; | ||
| 219 | J->cur.nins--; | ||
| 220 | k1 = lj_ir_kint(J, k); | ||
| 221 | k2 = lj_ir_kint(J, (-k & 31)); | ||
| 222 | t1 = split_emit(J, IRTI(IR_BSHL), lo, k1); | ||
| 223 | t2 = split_emit(J, IRTI(IR_BSHL), hi, k1); | ||
| 224 | t3 = split_emit(J, IRTI(IR_BSHR), lo, k2); | ||
| 225 | t4 = split_emit(J, IRTI(IR_BSHR), hi, k2); | ||
| 226 | ir->prev = split_emit(J, IRTI(IR_BOR), t1, t4); | ||
| 227 | return split_emit(J, IRTI(IR_BOR), t2, t3); | ||
| 228 | } | ||
| 229 | } else if (k == 0) { | ||
| 230 | goto passthrough; | ||
| 231 | } else if (k < 32) { | ||
| 232 | if (op == IR_BSHL) { | ||
| 233 | IRRef t1 = split_emit(J, IRTI(IR_BSHL), hi, kref); | ||
| 234 | IRRef t2 = split_emit(J, IRTI(IR_BSHR), lo, lj_ir_kint(J, (-k&31))); | ||
| 235 | return split_emit(J, IRTI(IR_BOR), t1, t2); | ||
| 236 | } else { | ||
| 237 | IRRef t1 = ir->prev, t2; | ||
| 238 | lj_assertJ(op == IR_BSHR || op == IR_BSAR, "bad usage"); | ||
| 239 | nir->o = IR_BSHR; | ||
| 240 | t2 = split_emit(J, IRTI(IR_BSHL), hi, lj_ir_kint(J, (-k&31))); | ||
| 241 | ir->prev = split_emit(J, IRTI(IR_BOR), t1, t2); | ||
| 242 | return split_emit(J, IRTI(op), hi, kref); | ||
| 243 | } | ||
| 244 | } else { | ||
| 245 | if (op == IR_BSHL) { | ||
| 246 | if (k == 32) | ||
| 247 | J->cur.nins--; | ||
| 248 | else | ||
| 249 | lo = ir->prev; | ||
| 250 | ir->prev = lj_ir_kint(J, 0); | ||
| 251 | return lo; | ||
| 252 | } else { | ||
| 253 | lj_assertJ(op == IR_BSHR || op == IR_BSAR, "bad usage"); | ||
| 254 | if (k == 32) { | ||
| 255 | J->cur.nins--; | ||
| 256 | ir->prev = hi; | ||
| 257 | } else { | ||
| 258 | nir->op1 = hi; | ||
| 259 | } | ||
| 260 | if (op == IR_BSHR) | ||
| 261 | return lj_ir_kint(J, 0); | ||
| 262 | else | ||
| 263 | return split_emit(J, IRTI(IR_BSAR), hi, lj_ir_kint(J, 31)); | ||
| 264 | } | ||
| 265 | } | ||
| 266 | } | ||
| 267 | return split_call_li(J, hisubst, oir, ir, | ||
| 268 | op - IR_BSHL + IRCALL_lj_carith_shl64); | ||
| 196 | } | 269 | } |
| 197 | 270 | ||
| 271 | static IRRef split_bitop(jit_State *J, IRRef1 *hisubst, | ||
| 272 | IRIns *nir, IRIns *ir) | ||
| 273 | { | ||
| 274 | IROp op = ir->o; | ||
| 275 | IRRef hi, kref = nir->op2; | ||
| 276 | if (irref_isk(kref)) { /* Optimize bit operations with lo constant. */ | ||
| 277 | int32_t k = IR(kref)->i; | ||
| 278 | if (k == 0 || k == -1) { | ||
| 279 | if (op == IR_BAND) k = ~k; | ||
| 280 | if (k == 0) { | ||
| 281 | J->cur.nins--; | ||
| 282 | ir->prev = nir->op1; | ||
| 283 | } else if (op == IR_BXOR) { | ||
| 284 | nir->o = IR_BNOT; | ||
| 285 | nir->op2 = 0; | ||
| 286 | } else { | ||
| 287 | J->cur.nins--; | ||
| 288 | ir->prev = kref; | ||
| 289 | } | ||
| 290 | } | ||
| 291 | } | ||
| 292 | hi = hisubst[ir->op1]; | ||
| 293 | kref = hisubst[ir->op2]; | ||
| 294 | if (irref_isk(kref)) { /* Optimize bit operations with hi constant. */ | ||
| 295 | int32_t k = IR(kref)->i; | ||
| 296 | if (k == 0 || k == -1) { | ||
| 297 | if (op == IR_BAND) k = ~k; | ||
| 298 | if (k == 0) { | ||
| 299 | return hi; | ||
| 300 | } else if (op == IR_BXOR) { | ||
| 301 | return split_emit(J, IRTI(IR_BNOT), hi, 0); | ||
| 302 | } else { | ||
| 303 | return kref; | ||
| 304 | } | ||
| 305 | } | ||
| 306 | } | ||
| 307 | return split_emit(J, IRTI(op), hi, kref); | ||
| 308 | } | ||
| 309 | #endif | ||
| 310 | |||
| 198 | /* Substitute references of a snapshot. */ | 311 | /* Substitute references of a snapshot. */ |
| 199 | static void split_subst_snap(jit_State *J, SnapShot *snap, IRIns *oir) | 312 | static void split_subst_snap(jit_State *J, SnapShot *snap, IRIns *oir) |
| 200 | { | 313 | { |
| @@ -214,7 +327,7 @@ static void split_ir(jit_State *J) | |||
| 214 | IRRef nins = J->cur.nins, nk = J->cur.nk; | 327 | IRRef nins = J->cur.nins, nk = J->cur.nk; |
| 215 | MSize irlen = nins - nk; | 328 | MSize irlen = nins - nk; |
| 216 | MSize need = (irlen+1)*(sizeof(IRIns) + sizeof(IRRef1)); | 329 | MSize need = (irlen+1)*(sizeof(IRIns) + sizeof(IRRef1)); |
| 217 | IRIns *oir = (IRIns *)lj_str_needbuf(J->L, &G(J->L)->tmpbuf, need); | 330 | IRIns *oir = (IRIns *)lj_buf_tmp(J->L, need); |
| 218 | IRRef1 *hisubst; | 331 | IRRef1 *hisubst; |
| 219 | IRRef ref, snref; | 332 | IRRef ref, snref; |
| 220 | SnapShot *snap; | 333 | SnapShot *snap; |
| @@ -241,6 +354,8 @@ static void split_ir(jit_State *J) | |||
| 241 | ir->prev = ref; /* Identity substitution for loword. */ | 354 | ir->prev = ref; /* Identity substitution for loword. */ |
| 242 | hisubst[ref] = 0; | 355 | hisubst[ref] = 0; |
| 243 | } | 356 | } |
| 357 | if (irt_is64(ir->t) && ir->o != IR_KNULL) | ||
| 358 | ref++; | ||
| 244 | } | 359 | } |
| 245 | 360 | ||
| 246 | /* Process old IR instructions. */ | 361 | /* Process old IR instructions. */ |
| @@ -285,35 +400,11 @@ static void split_ir(jit_State *J) | |||
| 285 | hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_div); | 400 | hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_div); |
| 286 | break; | 401 | break; |
| 287 | case IR_POW: | 402 | case IR_POW: |
| 288 | hi = split_call_li(J, hisubst, oir, ir, IRCALL_lj_vm_powi); | 403 | hi = split_call_ll(J, hisubst, oir, ir, IRCALL_pow); |
| 289 | break; | 404 | break; |
| 290 | case IR_FPMATH: | 405 | case IR_FPMATH: |
| 291 | /* Try to rejoin pow from EXP2, MUL and LOG2. */ | ||
| 292 | if (nir->op2 == IRFPM_EXP2 && nir->op1 > J->loopref) { | ||
| 293 | IRIns *irp = IR(nir->op1); | ||
| 294 | if (irp->o == IR_CALLN && irp->op2 == IRCALL_softfp_mul) { | ||
| 295 | IRIns *irm4 = IR(irp->op1); | ||
| 296 | IRIns *irm3 = IR(irm4->op1); | ||
| 297 | IRIns *irm12 = IR(irm3->op1); | ||
| 298 | IRIns *irl1 = IR(irm12->op1); | ||
| 299 | if (irm12->op1 > J->loopref && irl1->o == IR_CALLN && | ||
| 300 | irl1->op2 == IRCALL_lj_vm_log2) { | ||
| 301 | IRRef tmp = irl1->op1; /* Recycle first two args from LOG2. */ | ||
| 302 | IRRef arg3 = irm3->op2, arg4 = irm4->op2; | ||
| 303 | J->cur.nins--; | ||
| 304 | tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, arg3); | ||
| 305 | tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, arg4); | ||
| 306 | ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_pow); | ||
| 307 | hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); | ||
| 308 | break; | ||
| 309 | } | ||
| 310 | } | ||
| 311 | } | ||
| 312 | hi = split_call_l(J, hisubst, oir, ir, IRCALL_lj_vm_floor + ir->op2); | 406 | hi = split_call_l(J, hisubst, oir, ir, IRCALL_lj_vm_floor + ir->op2); |
| 313 | break; | 407 | break; |
| 314 | case IR_ATAN2: | ||
| 315 | hi = split_call_ll(J, hisubst, oir, ir, IRCALL_atan2); | ||
| 316 | break; | ||
| 317 | case IR_LDEXP: | 408 | case IR_LDEXP: |
| 318 | hi = split_call_li(J, hisubst, oir, ir, IRCALL_ldexp); | 409 | hi = split_call_li(J, hisubst, oir, ir, IRCALL_ldexp); |
| 319 | break; | 410 | break; |
| @@ -321,7 +412,8 @@ static void split_ir(jit_State *J) | |||
| 321 | nir->o = IR_CONV; /* Pass through loword. */ | 412 | nir->o = IR_CONV; /* Pass through loword. */ |
| 322 | nir->op2 = (IRT_INT << 5) | IRT_INT; | 413 | nir->op2 = (IRT_INT << 5) | IRT_INT; |
| 323 | hi = split_emit(J, IRT(ir->o == IR_NEG ? IR_BXOR : IR_BAND, IRT_SOFTFP), | 414 | hi = split_emit(J, IRT(ir->o == IR_NEG ? IR_BXOR : IR_BAND, IRT_SOFTFP), |
| 324 | hisubst[ir->op1], hisubst[ir->op2]); | 415 | hisubst[ir->op1], |
| 416 | lj_ir_kint(J, (int32_t)(0x7fffffffu + (ir->o == IR_NEG)))); | ||
| 325 | break; | 417 | break; |
| 326 | case IR_SLOAD: | 418 | case IR_SLOAD: |
| 327 | if ((nir->op2 & IRSLOAD_CONVERT)) { /* Convert from int to number. */ | 419 | if ((nir->op2 & IRSLOAD_CONVERT)) { /* Convert from int to number. */ |
| @@ -336,15 +428,24 @@ static void split_ir(jit_State *J) | |||
| 336 | case IR_STRTO: | 428 | case IR_STRTO: |
| 337 | hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref); | 429 | hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref); |
| 338 | break; | 430 | break; |
| 431 | case IR_FLOAD: | ||
| 432 | lj_assertJ(ir->op1 == REF_NIL, "expected FLOAD from GG_State"); | ||
| 433 | hi = lj_ir_kint(J, *(int32_t*)((char*)J2GG(J) + ir->op2 + LJ_LE*4)); | ||
| 434 | nir->op2 += LJ_BE*4; | ||
| 435 | break; | ||
| 339 | case IR_XLOAD: { | 436 | case IR_XLOAD: { |
| 340 | IRIns inslo = *nir; /* Save/undo the emit of the lo XLOAD. */ | 437 | IRIns inslo = *nir; /* Save/undo the emit of the lo XLOAD. */ |
| 341 | J->cur.nins--; | 438 | J->cur.nins--; |
| 342 | hi = split_ptr(J, oir, ir->op1); /* Insert the hiref ADD. */ | 439 | hi = split_ptr(J, oir, ir->op1); /* Insert the hiref ADD. */ |
| 440 | #if LJ_BE | ||
| 441 | hi = split_emit(J, IRT(IR_XLOAD, IRT_INT), hi, ir->op2); | ||
| 442 | inslo.t.irt = IRT_SOFTFP | (inslo.t.irt & IRT_GUARD); | ||
| 443 | #endif | ||
| 343 | nref = lj_ir_nextins(J); | 444 | nref = lj_ir_nextins(J); |
| 344 | nir = IR(nref); | 445 | nir = IR(nref); |
| 345 | *nir = inslo; /* Re-emit lo XLOAD immediately before hi XLOAD. */ | 446 | *nir = inslo; /* Re-emit lo XLOAD. */ |
| 346 | hi = split_emit(J, IRT(IR_XLOAD, IRT_SOFTFP), hi, ir->op2); | ||
| 347 | #if LJ_LE | 447 | #if LJ_LE |
| 448 | hi = split_emit(J, IRT(IR_XLOAD, IRT_SOFTFP), hi, ir->op2); | ||
| 348 | ir->prev = nref; | 449 | ir->prev = nref; |
| 349 | #else | 450 | #else |
| 350 | ir->prev = hi; hi = nref; | 451 | ir->prev = hi; hi = nref; |
| @@ -364,8 +465,9 @@ static void split_ir(jit_State *J) | |||
| 364 | break; | 465 | break; |
| 365 | } | 466 | } |
| 366 | #endif | 467 | #endif |
| 367 | lua_assert(st == IRT_INT || | 468 | lj_assertJ(st == IRT_INT || |
| 368 | (LJ_32 && LJ_HASFFI && (st == IRT_U32 || st == IRT_FLOAT))); | 469 | (LJ_32 && LJ_HASFFI && (st == IRT_U32 || st == IRT_FLOAT)), |
| 470 | "bad source type for CONV"); | ||
| 369 | nir->o = IR_CALLN; | 471 | nir->o = IR_CALLN; |
| 370 | #if LJ_32 && LJ_HASFFI | 472 | #if LJ_32 && LJ_HASFFI |
| 371 | nir->op2 = st == IRT_INT ? IRCALL_softfp_i2d : | 473 | nir->op2 = st == IRT_INT ? IRCALL_softfp_i2d : |
| @@ -395,7 +497,8 @@ static void split_ir(jit_State *J) | |||
| 395 | hi = nir->op2; | 497 | hi = nir->op2; |
| 396 | break; | 498 | break; |
| 397 | default: | 499 | default: |
| 398 | lua_assert(ir->o <= IR_NE || ir->o == IR_MIN || ir->o == IR_MAX); | 500 | lj_assertJ(ir->o <= IR_NE || ir->o == IR_MIN || ir->o == IR_MAX, |
| 501 | "bad IR op %d", ir->o); | ||
| 399 | hi = split_emit(J, IRTG(IR_HIOP, IRT_SOFTFP), | 502 | hi = split_emit(J, IRTG(IR_HIOP, IRT_SOFTFP), |
| 400 | hisubst[ir->op1], hisubst[ir->op2]); | 503 | hisubst[ir->op1], hisubst[ir->op2]); |
| 401 | break; | 504 | break; |
| @@ -438,8 +541,21 @@ static void split_ir(jit_State *J) | |||
| 438 | irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 : | 541 | irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 : |
| 439 | IRCALL_lj_carith_powu64); | 542 | IRCALL_lj_carith_powu64); |
| 440 | break; | 543 | break; |
| 544 | case IR_BNOT: | ||
| 545 | hi = split_emit(J, IRTI(IR_BNOT), hiref, 0); | ||
| 546 | break; | ||
| 547 | case IR_BSWAP: | ||
| 548 | ir->prev = split_emit(J, IRTI(IR_BSWAP), hiref, 0); | ||
| 549 | hi = nref; | ||
| 550 | break; | ||
| 551 | case IR_BAND: case IR_BOR: case IR_BXOR: | ||
| 552 | hi = split_bitop(J, hisubst, nir, ir); | ||
| 553 | break; | ||
| 554 | case IR_BSHL: case IR_BSHR: case IR_BSAR: case IR_BROL: case IR_BROR: | ||
| 555 | hi = split_bitshift(J, hisubst, oir, nir, ir); | ||
| 556 | break; | ||
| 441 | case IR_FLOAD: | 557 | case IR_FLOAD: |
| 442 | lua_assert(ir->op2 == IRFL_CDATA_INT64); | 558 | lj_assertJ(ir->op2 == IRFL_CDATA_INT64, "only INT64 supported"); |
| 443 | hi = split_emit(J, IRTI(IR_FLOAD), nir->op1, IRFL_CDATA_INT64_4); | 559 | hi = split_emit(J, IRTI(IR_FLOAD), nir->op1, IRFL_CDATA_INT64_4); |
| 444 | #if LJ_BE | 560 | #if LJ_BE |
| 445 | ir->prev = hi; hi = nref; | 561 | ir->prev = hi; hi = nref; |
| @@ -457,13 +573,9 @@ static void split_ir(jit_State *J) | |||
| 457 | case IR_CONV: { /* Conversion to 64 bit integer. Others handled below. */ | 573 | case IR_CONV: { /* Conversion to 64 bit integer. Others handled below. */ |
| 458 | IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); | 574 | IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); |
| 459 | #if LJ_SOFTFP | 575 | #if LJ_SOFTFP |
| 576 | lj_assertJ(st != IRT_FLOAT, "bad CONV *64.float emitted"); | ||
| 460 | if (st == IRT_NUM) { /* NUM to 64 bit int conv. */ | 577 | if (st == IRT_NUM) { /* NUM to 64 bit int conv. */ |
| 461 | hi = split_call_l(J, hisubst, oir, ir, | 578 | hi = split_call_l(J, hisubst, oir, ir, IRCALL_lj_vm_num2u64); |
| 462 | irt_isi64(ir->t) ? IRCALL_fp64_d2l : IRCALL_fp64_d2ul); | ||
| 463 | } else if (st == IRT_FLOAT) { /* FLOAT to 64 bit int conv. */ | ||
| 464 | nir->o = IR_CALLN; | ||
| 465 | nir->op2 = irt_isi64(ir->t) ? IRCALL_fp64_f2l : IRCALL_fp64_f2ul; | ||
| 466 | hi = split_emit(J, IRTI(IR_HIOP), nref, nref); | ||
| 467 | } | 579 | } |
| 468 | #else | 580 | #else |
| 469 | if (st == IRT_NUM || st == IRT_FLOAT) { /* FP to 64 bit int conv. */ | 581 | if (st == IRT_NUM || st == IRT_FLOAT) { /* FP to 64 bit int conv. */ |
| @@ -505,7 +617,7 @@ static void split_ir(jit_State *J) | |||
| 505 | hi = nir->op2; | 617 | hi = nir->op2; |
| 506 | break; | 618 | break; |
| 507 | default: | 619 | default: |
| 508 | lua_assert(ir->o <= IR_NE); /* Comparisons. */ | 620 | lj_assertJ(ir->o <= IR_NE, "bad IR op %d", ir->o); /* Comparisons. */ |
| 509 | split_emit(J, IRTGI(IR_HIOP), hiref, hisubst[ir->op2]); | 621 | split_emit(J, IRTGI(IR_HIOP), hiref, hisubst[ir->op2]); |
| 510 | break; | 622 | break; |
| 511 | } | 623 | } |
| @@ -529,7 +641,7 @@ static void split_ir(jit_State *J) | |||
| 529 | tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev); | 641 | tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev); |
| 530 | #endif | 642 | #endif |
| 531 | ir->prev = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_lj_vm_tobit); | 643 | ir->prev = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_lj_vm_tobit); |
| 532 | } else if (ir->o == IR_TOSTR) { | 644 | } else if (ir->o == IR_TOSTR || ir->o == IR_TMPREF) { |
| 533 | if (hisubst[ir->op1]) { | 645 | if (hisubst[ir->op1]) { |
| 534 | if (irref_isk(ir->op1)) | 646 | if (irref_isk(ir->op1)) |
| 535 | nir->op1 = ir->op1; | 647 | nir->op1 = ir->op1; |
| @@ -576,22 +688,21 @@ static void split_ir(jit_State *J) | |||
| 576 | nir->op2 = st == IRT_INT ? IRCALL_softfp_i2f : IRCALL_softfp_ui2f; | 688 | nir->op2 = st == IRT_INT ? IRCALL_softfp_i2f : IRCALL_softfp_ui2f; |
| 577 | } | 689 | } |
| 578 | } else if (st == IRT_FLOAT) { | 690 | } else if (st == IRT_FLOAT) { |
| 691 | lj_assertJ(!irt_isu32(ir->t), "bad CONV u32.fp emitted"); | ||
| 579 | nir->o = IR_CALLN; | 692 | nir->o = IR_CALLN; |
| 580 | nir->op2 = irt_isint(ir->t) ? IRCALL_softfp_f2i : IRCALL_softfp_f2ui; | 693 | nir->op2 = IRCALL_softfp_f2i; |
| 581 | } else | 694 | } else |
| 582 | #endif | 695 | #endif |
| 583 | #if LJ_SOFTFP | 696 | #if LJ_SOFTFP |
| 584 | if (st == IRT_NUM || (LJ_32 && LJ_HASFFI && st == IRT_FLOAT)) { | 697 | if (st == IRT_NUM || (LJ_32 && LJ_HASFFI && st == IRT_FLOAT)) { |
| 585 | if (irt_isguard(ir->t)) { | 698 | if (irt_isguard(ir->t)) { |
| 586 | lua_assert(st == IRT_NUM && irt_isint(ir->t)); | 699 | lj_assertJ(st == IRT_NUM && irt_isint(ir->t), "bad CONV types"); |
| 587 | J->cur.nins--; | 700 | J->cur.nins--; |
| 588 | ir->prev = split_num2int(J, nir->op1, hisubst[ir->op1], 1); | 701 | ir->prev = split_num2int(J, nir->op1, hisubst[ir->op1], 1); |
| 589 | } else { | 702 | } else { |
| 590 | split_call_l(J, hisubst, oir, ir, | 703 | split_call_l(J, hisubst, oir, ir, |
| 591 | #if LJ_32 && LJ_HASFFI | 704 | #if LJ_32 && LJ_HASFFI |
| 592 | st == IRT_NUM ? | 705 | st == IRT_NUM ? IRCALL_softfp_d2i : IRCALL_softfp_f2i |
| 593 | (irt_isint(ir->t) ? IRCALL_softfp_d2i : IRCALL_softfp_d2ui) : | ||
| 594 | (irt_isint(ir->t) ? IRCALL_softfp_f2i : IRCALL_softfp_f2ui) | ||
| 595 | #else | 706 | #else |
| 596 | IRCALL_softfp_d2i | 707 | IRCALL_softfp_d2i |
| 597 | #endif | 708 | #endif |
| @@ -714,7 +825,7 @@ void lj_opt_split(jit_State *J) | |||
| 714 | if (!J->needsplit) | 825 | if (!J->needsplit) |
| 715 | J->needsplit = split_needsplit(J); | 826 | J->needsplit = split_needsplit(J); |
| 716 | #else | 827 | #else |
| 717 | lua_assert(J->needsplit >= split_needsplit(J)); /* Verify flag. */ | 828 | lj_assertJ(J->needsplit >= split_needsplit(J), "bad SPLIT state"); |
| 718 | #endif | 829 | #endif |
| 719 | if (J->needsplit) { | 830 | if (J->needsplit) { |
| 720 | int errcode = lj_vm_cpcall(J->L, NULL, J, cpsplit); | 831 | int errcode = lj_vm_cpcall(J->L, NULL, J, cpsplit); |
