aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-07-13 21:36:17 +0200
committerMike Pall <mike>2011-07-13 21:36:17 +0200
commitca8dadb328be41dc9349a5d620348a17e90dba84 (patch)
tree7969042ca2dea94a5c1a0258ed9eca15e7e37aae /src
parent6599bc7db2fd10cb5c3aa38c59bed64c12f893a8 (diff)
downloadluajit-ca8dadb328be41dc9349a5d620348a17e90dba84.tar.gz
luajit-ca8dadb328be41dc9349a5d620348a17e90dba84.tar.bz2
luajit-ca8dadb328be41dc9349a5d620348a17e90dba84.zip
PPC: Add dual-number mode interpreter.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_ppc.dasc1725
-rw-r--r--src/buildvm_ppc.h6687
-rw-r--r--src/lj_arch.h2
-rw-r--r--src/lj_frame.h4
4 files changed, 7579 insertions, 839 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 2964e0e2..de3346cb 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -26,14 +26,12 @@
26|.define LREG, r18 // Register holding lua_State (also in SAVE_L). 26|.define LREG, r18 // Register holding lua_State (also in SAVE_L).
27|.define MULTRES, r19 // Size of multi-result: (nresults+1)*8. 27|.define MULTRES, r19 // Size of multi-result: (nresults+1)*8.
28| 28|
29|// Constants for vectorized type-comparisons (hi+low GPR). C callee-save. 29|// Constants for type-comparisons, stores and conversions. C callee-save.
30|.define TISNUM, r22 30|.define TISNUM, r22
31|.define TISNIL, r23 31|.define TISNIL, r23
32|.define ZERO, r24 32|.define ZERO, r24
33|.define TISSTR, r25 // NYI: remove. 33|.define TOBIT, f30
34|.define TISTAB, r26 // NYI: remove. 34|.define TONUM, f31
35|.define TISFUNC, r27 // NYI: remove.
36|.define TOBIT, r28 // NYI: use FP reg.
37| 35|
38|// The following temporaries are not saved across C calls, except for RA. 36|// The following temporaries are not saved across C calls, except for RA.
39|.define RA, r20 // Callee-save. 37|.define RA, r20 // Callee-save.
@@ -57,8 +55,8 @@
57|.define CARG4, r6 // Overlaps TMP3. 55|.define CARG4, r6 // Overlaps TMP3.
58|.define CARG5, r7 // Overlaps INS. 56|.define CARG5, r7 // Overlaps INS.
59| 57|
60|.define CARGF1, f1 58|.define FARG1, f1
61|.define CARGF2, f2 59|.define FARG2, f2
62| 60|
63|.define CRET1, r3 61|.define CRET1, r3
64|.define CRET2, r4 62|.define CRET2, r4
@@ -69,16 +67,23 @@
69|// Back chain for sp: 256(sp) <-- sp entering interpreter 67|// Back chain for sp: 256(sp) <-- sp entering interpreter
70|.define SAVE_GPR_, 184 // .. 184+18*4: 32 bit GPR saves. 68|.define SAVE_GPR_, 184 // .. 184+18*4: 32 bit GPR saves.
71|.define SAVE_FPR_, 40 // .. 40+18*8: 64 bit FPR saves. 69|.define SAVE_FPR_, 40 // .. 40+18*8: 64 bit FPR saves.
72|.define SAVE_UNUSED, 32(sp) // 8 unused bytes for alignment. 70|.define TONUM_LO, 36(sp)
71|.define TONUM_HI, 32(sp)
73|.define SAVE_ERRF, 28(sp) // 32 bit C frame info. 72|.define SAVE_ERRF, 28(sp) // 32 bit C frame info.
74|.define SAVE_NRES, 24(sp) 73|.define SAVE_NRES, 24(sp)
75|.define SAVE_CFRAME, 20(sp) 74|.define SAVE_CFRAME, 20(sp)
76|.define SAVE_L, 16(sp) 75|.define SAVE_L, 16(sp)
77|.define SAVE_PC, 12(sp) 76|.define SAVE_MULTRES, 12(sp)
78|.define SAVE_MULTRES, 8(sp) 77|.define SAVE_PC, 8(sp)
79|// Next frame lr: 4(sp) 78|// Next frame lr: 4(sp)
80|// Back chain for sp: 0(sp) <-- sp while in interpreter 79|// Back chain for sp: 0(sp) <-- sp while in interpreter
81| 80|
81|.define TMPD_LO, SAVE_MULTRES
82|.define TMPD_BLO, 15(sp)
83|.define TMPD_HI, SAVE_PC
84|.define TMPD, SAVE_PC
85|.define TONUM_D, TONUM_HI
86|
82|.macro save_, reg 87|.macro save_, reg
83| stw r..reg, SAVE_GPR_+(reg-14)*4(sp) 88| stw r..reg, SAVE_GPR_+(reg-14)*4(sp)
84| stfd f..reg, SAVE_FPR_+(reg-14)*8(sp) 89| stfd f..reg, SAVE_FPR_+(reg-14)*8(sp)
@@ -133,6 +138,30 @@
133|// Trap for not-yet-implemented parts. 138|// Trap for not-yet-implemented parts.
134|.macro NYI; tw 4, sp, sp; .endmacro 139|.macro NYI; tw 4, sp, sp; .endmacro
135| 140|
141|// int/FP conversions.
142|.macro tonum_i, freg, reg
143| xoris reg, reg, 0x8000
144| stw reg, TONUM_LO
145| lfd freg, TONUM_D
146| fsub freg, freg, TONUM
147|.endmacro
148|
149|.macro tonum_u, freg, reg
150| stw reg, TONUM_LO
151| lfd freg, TONUM_D
152| fsub freg, freg, TOBIT
153|.endmacro
154|
155|.macro toint, reg, freg, tmpfreg
156| fctiwz tmpfreg, freg
157| stfd tmpfreg, TMPD
158| lwz reg, TMPD_LO
159|.endmacro
160|
161|.macro toint, reg, freg
162| toint reg, freg, freg
163|.endmacro
164|
136|//----------------------------------------------------------------------- 165|//-----------------------------------------------------------------------
137| 166|
138|// Access to frame relative to BASE. 167|// Access to frame relative to BASE.
@@ -218,14 +247,11 @@
218| 247|
219|// Macros to test operand types. 248|// Macros to test operand types.
220|.macro checknum, reg; cmplw reg, TISNUM; .endmacro 249|.macro checknum, reg; cmplw reg, TISNUM; .endmacro
250|.macro checknum, cr, reg; cmplw cr, reg, TISNUM; .endmacro
221|.macro checkstr, reg; cmpwi reg, LJ_TSTR; .endmacro 251|.macro checkstr, reg; cmpwi reg, LJ_TSTR; .endmacro
222|.macro checktab, reg; cmpwi reg, LJ_TTAB; .endmacro 252|.macro checktab, reg; cmpwi reg, LJ_TTAB; .endmacro
223|.macro checkfunc, reg; cmpwi reg, LJ_TFUNC; .endmacro 253|.macro checkfunc, reg; cmpwi reg, LJ_TFUNC; .endmacro
224|.macro checknil, reg; cmpwi reg, LJ_TNIL; .endmacro 254|.macro checknil, reg; cmpwi reg, LJ_TNIL; .endmacro
225|.macro checkok, label; beq label; .endmacro // NYI: remove.
226|.macro checkfail, label; bne label; .endmacro // NYI: remove.
227|.macro checkanyfail, label; bns label; .endmacro // NYI: remove.
228|.macro checkallok, label; bso label; .endmacro // NYI: remove.
229| 255|
230|.macro branch_RD 256|.macro branch_RD
231| srwi TMP0, RD, 1 257| srwi TMP0, RD, 1
@@ -276,7 +302,7 @@ static void build_subroutines(BuildCtx *ctx)
276 |->vm_returnp: 302 |->vm_returnp:
277 | // See vm_return. Also: TMP2 = previous base. 303 | // See vm_return. Also: TMP2 = previous base.
278 | andi. TMP0, PC, FRAME_P 304 | andi. TMP0, PC, FRAME_P
279 | evsplati TMP1, LJ_TTRUE 305 | li TMP1, LJ_TTRUE
280 | beq ->cont_dispatch 306 | beq ->cont_dispatch
281 | 307 |
282 | // Return from pcall or xpcall fast func. 308 | // Return from pcall or xpcall fast func.
@@ -309,9 +335,9 @@ static void build_subroutines(BuildCtx *ctx)
309 | beq >2 335 | beq >2
310 |1: 336 |1:
311 | addic. TMP1, TMP1, -8 337 | addic. TMP1, TMP1, -8
312 | evldd TMP0, 0(RA) 338 | lfd f0, 0(RA)
313 | addi RA, RA, 8 339 | addi RA, RA, 8
314 | evstdd TMP0, 0(BASE) 340 | stfd f0, 0(BASE)
315 | addi BASE, BASE, 8 341 | addi BASE, BASE, 8
316 | bne <1 342 | bne <1
317 | 343 |
@@ -336,16 +362,17 @@ static void build_subroutines(BuildCtx *ctx)
336 | lwz TMP1, L->maxstack 362 | lwz TMP1, L->maxstack
337 | cmplw BASE, TMP1 363 | cmplw BASE, TMP1
338 | bge >8 364 | bge >8
339 | evstdd TISNIL, 0(BASE) 365 | stw TISNIL, 0(BASE)
340 | addi RD, RD, 8 366 | addi RD, RD, 8
341 | addi BASE, BASE, 8 367 | addi BASE, BASE, 8
342 | b <2 368 | b <2
343 | 369 |
344 |7: // Less results wanted. 370 |7: // Less results wanted.
371 | subfic TMP3, TMP2, 0 // LUA_MULTRET+1 case?
345 | sub TMP0, RD, TMP2 372 | sub TMP0, RD, TMP2
346 | cmpwi TMP2, 0 // LUA_MULTRET+1 case? 373 | subfe TMP1, TMP1, TMP1 // TMP1 = TMP2 == 0 ? 0 : -1
347 | sub TMP0, BASE, TMP0 // Subtract the difference. 374 | and TMP0, TMP0, TMP1
348 | iseleq BASE, BASE, TMP0 // Either keep top or shrink it. 375 | sub BASE, BASE, TMP0 // Either keep top or shrink it.
349 | b <3 376 | b <3
350 | 377 |
351 |8: // Corner case: need to grow stack for filling up results. 378 |8: // Corner case: need to grow stack for filling up results.
@@ -380,24 +407,25 @@ static void build_subroutines(BuildCtx *ctx)
380 | rlwinm sp, CARG1, 0, 0, 29 407 | rlwinm sp, CARG1, 0, 0, 29
381 |->vm_unwind_ff_eh: // Landing pad for external unwinder. 408 |->vm_unwind_ff_eh: // Landing pad for external unwinder.
382 | lwz L, SAVE_L 409 | lwz L, SAVE_L
383 | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. 410 | li TISNUM, LJ_TISNUM // Setup type comparison constants.
384 | evsplati TISFUNC, LJ_TFUNC
385 | lus TOBIT, 0x4338
386 | evsplati TISTAB, LJ_TTAB
387 | li TMP0, 0
388 | lwz BASE, L->base 411 | lwz BASE, L->base
389 | evmergelo TOBIT, TOBIT, TMP0 412 | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float).
390 | lwz DISPATCH, L->glref // Setup pointer to dispatch table. 413 | lwz DISPATCH, L->glref // Setup pointer to dispatch table.
391 | evsplati TISSTR, LJ_TSTR 414 | li ZERO, 0
415 | stw TMP3, TMPD
392 | li TMP1, LJ_TFALSE 416 | li TMP1, LJ_TFALSE
393 | evsplati TISNIL, LJ_TNIL 417 | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float).
418 | li TISNIL, LJ_TNIL
394 | li_vmstate INTERP 419 | li_vmstate INTERP
420 | lfs TOBIT, TMPD
395 | lwz PC, FRAME_PC(BASE) // Fetch PC of previous frame. 421 | lwz PC, FRAME_PC(BASE) // Fetch PC of previous frame.
396 | la RA, -8(BASE) // Results start at BASE-8. 422 | la RA, -8(BASE) // Results start at BASE-8.
423 | stw TMP3, TMPD
397 | addi DISPATCH, DISPATCH, GG_G2DISP 424 | addi DISPATCH, DISPATCH, GG_G2DISP
398 | stw TMP1, 0(RA) // Prepend false to error message. 425 | stw TMP1, 0(RA) // Prepend false to error message.
399 | li RD, 16 // 2 results: false + error message. 426 | li RD, 16 // 2 results: false + error message.
400 | st_vmstate 427 | st_vmstate
428 | lfs TONUM, TMPD
401 | b ->vm_returnc 429 | b ->vm_returnc
402 | 430 |
403 |//----------------------------------------------------------------------- 431 |//-----------------------------------------------------------------------
@@ -454,22 +482,25 @@ static void build_subroutines(BuildCtx *ctx)
454 | // Resume after yield (like a return). 482 | // Resume after yield (like a return).
455 | mr RA, BASE 483 | mr RA, BASE
456 | lwz BASE, L->base 484 | lwz BASE, L->base
457 | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. 485 | li TISNUM, LJ_TISNUM // Setup type comparison constants.
458 | lwz TMP1, L->top 486 | lwz TMP1, L->top
459 | evsplati TISFUNC, LJ_TFUNC
460 | lus TOBIT, 0x4338
461 | evsplati TISTAB, LJ_TTAB
462 | lwz PC, FRAME_PC(BASE) 487 | lwz PC, FRAME_PC(BASE)
463 | li TMP2, 0 488 | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float).
464 | evsplati TISSTR, LJ_TSTR
465 | sub RD, TMP1, BASE 489 | sub RD, TMP1, BASE
466 | evmergelo TOBIT, TOBIT, TMP2
467 | stb CARG3, L->status 490 | stb CARG3, L->status
491 | stw TMP3, TMPD
468 | andi. TMP0, PC, FRAME_TYPE 492 | andi. TMP0, PC, FRAME_TYPE
469 | li_vmstate INTERP 493 | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float).
494 | lfs TOBIT, TMPD
495 | li ZERO, 0
496 | stw TMP3, TMPD
470 | addi RD, RD, 8 497 | addi RD, RD, 8
471 | evsplati TISNIL, LJ_TNIL 498 | lus TMP0, 0x4338 // Hiword of 2^52 + 2^51 (double)
472 | mr MULTRES, RD 499 | mr MULTRES, RD
500 | stw TMP0, TONUM_HI
501 | li_vmstate INTERP
502 | lfs TONUM, TMPD
503 | li TISNIL, LJ_TNIL
473 | st_vmstate 504 | st_vmstate
474 | beq ->BC_RET_Z 505 | beq ->BC_RET_Z
475 | b ->vm_return 506 | b ->vm_return
@@ -500,27 +531,29 @@ static void build_subroutines(BuildCtx *ctx)
500 | 531 |
501 |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). 532 |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).
502 | lwz TMP2, L->base // TMP2 = old base (used in vmeta_call). 533 | lwz TMP2, L->base // TMP2 = old base (used in vmeta_call).
503 | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. 534 | li TISNUM, LJ_TISNUM // Setup type comparison constants.
504 | lwz TMP1, L->top 535 | lwz TMP1, L->top
505 | evsplati TISFUNC, LJ_TFUNC 536 | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float).
506 | add PC, PC, BASE 537 | add PC, PC, BASE
507 | evsplati TISTAB, LJ_TTAB 538 | stw TMP3, TMPD
508 | lus TOBIT, 0x4338 539 | li ZERO, 0
509 | li TMP0, 0 540 | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float).
541 | lfs TOBIT, TMPD
510 | sub PC, PC, TMP2 // PC = frame delta + frame type 542 | sub PC, PC, TMP2 // PC = frame delta + frame type
511 | evsplati TISSTR, LJ_TSTR 543 | stw TMP3, TMPD
544 | lus TMP0, 0x4338 // Hiword of 2^52 + 2^51 (double)
512 | sub NARGS8:RC, TMP1, BASE 545 | sub NARGS8:RC, TMP1, BASE
513 | evmergelo TOBIT, TOBIT, TMP0 546 | stw TMP0, TONUM_HI
514 | li_vmstate INTERP 547 | li_vmstate INTERP
515 | evsplati TISNIL, LJ_TNIL 548 | lfs TONUM, TMPD
549 | li TISNIL, LJ_TNIL
516 | st_vmstate 550 | st_vmstate
517 | 551 |
518 |->vm_call_dispatch: 552 |->vm_call_dispatch:
519 | // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC 553 | // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC
520 | li TMP0, -8 554 | lwz TMP0, FRAME_PC(BASE)
521 | evlddx LFUNC:RB, BASE, TMP0 555 | lwz LFUNC:RB, FRAME_FUNC(BASE)
522 | checkfunc LFUNC:RB 556 | checkfunc TMP0; bne ->vmeta_call
523 | checkfail ->vmeta_call
524 | 557 |
525 |->vm_call_dispatch_f: 558 |->vm_call_dispatch_f:
526 | ins_call 559 | ins_call
@@ -570,7 +603,7 @@ static void build_subroutines(BuildCtx *ctx)
570 | beq >1 603 | beq >1
571 | subi TMP2, RD, 8 604 | subi TMP2, RD, 8
572 | lwz TMP1, LFUNC:TMP1->pc 605 | lwz TMP1, LFUNC:TMP1->pc
573 | evstddx TISNIL, RA, TMP2 // Ensure one valid arg. 606 | stwx TISNIL, RA, TMP2 // Ensure one valid arg.
574 | lwz KBASE, PC2PROTO(k)(TMP1) 607 | lwz KBASE, PC2PROTO(k)(TMP1)
575 | // BASE = base, RA = resultptr, RB = meta base 608 | // BASE = base, RA = resultptr, RB = meta base
576 | mtctr TMP0 609 | mtctr TMP0
@@ -585,42 +618,45 @@ static void build_subroutines(BuildCtx *ctx)
585 | lwz INS, -4(PC) 618 | lwz INS, -4(PC)
586 | subi CARG2, RB, 16 619 | subi CARG2, RB, 16
587 | decode_RB8 SAVE0, INS 620 | decode_RB8 SAVE0, INS
588 | evldd TMP0, 0(RA) 621 | lfd f0, 0(RA)
589 | add TMP1, BASE, SAVE0 622 | add TMP1, BASE, SAVE0
590 | stw BASE, L->base 623 | stw BASE, L->base
591 | cmplw TMP1, CARG2 624 | cmplw TMP1, CARG2
592 | sub CARG3, CARG2, TMP1 625 | sub CARG3, CARG2, TMP1
593 | decode_RA8 RA, INS 626 | decode_RA8 RA, INS
594 | evstdd TMP0, 0(CARG2) 627 | stfd f0, 0(CARG2)
595 | bne ->BC_CAT_Z 628 | bne ->BC_CAT_Z
596 | evstddx TMP0, BASE, RA 629 | stfdx f0, BASE, RA
597 | b ->cont_nop 630 | b ->cont_nop
598 | 631 |
599 |//-- Table indexing metamethods ----------------------------------------- 632 |//-- Table indexing metamethods -----------------------------------------
600 | 633 |
601 |->vmeta_tgets1: 634 |->vmeta_tgets1:
602 | evmergelo STR:RC, TISSTR, STR:RC
603 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) 635 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH)
636 | li TMP0, LJ_TSTR
604 | decode_RB8 RB, INS 637 | decode_RB8 RB, INS
605 | evstdd STR:RC, 0(CARG3) 638 | stw STR:RC, 4(CARG3)
606 | add CARG2, BASE, RB 639 | add CARG2, BASE, RB
640 | stw TMP0, 0(CARG3)
607 | b >1 641 | b >1
608 | 642 |
609 |->vmeta_tgets: 643 |->vmeta_tgets:
610 | evmergelo TAB:RB, TISTAB, TAB:RB
611 | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) 644 | la CARG2, DISPATCH_GL(tmptv)(DISPATCH)
612 | evmergelo STR:RC, TISSTR, STR:RC 645 | li TMP0, LJ_TTAB
613 | evstdd TAB:RB, 0(CARG2) 646 | stw TAB:RB, 4(CARG2)
614 | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) 647 | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH)
615 | evstdd STR:RC, 0(CARG3) 648 | stw TMP0, 0(CARG2)
649 | li TMP1, LJ_TSTR
650 | stw STR:RC, 4(CARG3)
651 | stw TMP1, 0(CARG3)
616 | b >1 652 | b >1
617 | 653 |
618 |->vmeta_tgetb: // TMP0 = index 654 |->vmeta_tgetb: // TMP0 = index
619 | efdcfsi TMP0, TMP0 655 | tonum_u f0, TMP0
620 | decode_RB8 RB, INS 656 | decode_RB8 RB, INS
621 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) 657 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH)
622 | add CARG2, BASE, RB 658 | add CARG2, BASE, RB
623 | evstdd TMP0, 0(CARG3) 659 | stfd f0, 0(CARG3)
624 | b >1 660 | b >1
625 | 661 |
626 |->vmeta_tgetv: 662 |->vmeta_tgetv:
@@ -636,9 +672,10 @@ static void build_subroutines(BuildCtx *ctx)
636 | // Returns TValue * (finished) or NULL (metamethod). 672 | // Returns TValue * (finished) or NULL (metamethod).
637 | cmplwi CRET1, 0 673 | cmplwi CRET1, 0
638 | beq >3 674 | beq >3
639 | evldd TMP0, 0(CRET1) 675 | lfd f0, 0(CRET1)
640 | evstddx TMP0, BASE, RA 676 | ins_next1
641 | ins_next 677 | stfdx f0, BASE, RA
678 | ins_next2
642 | 679 |
643 |3: // Call __index metamethod. 680 |3: // Call __index metamethod.
644 | // BASE = base, L->top = new base, stack = cont/func/t/k 681 | // BASE = base, L->top = new base, stack = cont/func/t/k
@@ -653,28 +690,31 @@ static void build_subroutines(BuildCtx *ctx)
653 |//----------------------------------------------------------------------- 690 |//-----------------------------------------------------------------------
654 | 691 |
655 |->vmeta_tsets1: 692 |->vmeta_tsets1:
656 | evmergelo STR:RC, TISSTR, STR:RC
657 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) 693 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH)
694 | li TMP0, LJ_TSTR
658 | decode_RB8 RB, INS 695 | decode_RB8 RB, INS
659 | evstdd STR:RC, 0(CARG3) 696 | stw STR:RC, 4(CARG3)
660 | add CARG2, BASE, RB 697 | add CARG2, BASE, RB
698 | stw TMP0, 0(CARG3)
661 | b >1 699 | b >1
662 | 700 |
663 |->vmeta_tsets: 701 |->vmeta_tsets:
664 | evmergelo TAB:RB, TISTAB, TAB:RB
665 | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) 702 | la CARG2, DISPATCH_GL(tmptv)(DISPATCH)
666 | evmergelo STR:RC, TISSTR, STR:RC 703 | li TMP0, LJ_TTAB
667 | evstdd TAB:RB, 0(CARG2) 704 | stw TAB:RB, 4(CARG2)
668 | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) 705 | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH)
669 | evstdd STR:RC, 0(CARG3) 706 | stw TMP0, 0(CARG2)
707 | li TMP1, LJ_TSTR
708 | stw STR:RC, 4(CARG3)
709 | stw TMP1, 0(CARG3)
670 | b >1 710 | b >1
671 | 711 |
672 |->vmeta_tsetb: // TMP0 = index 712 |->vmeta_tsetb: // TMP0 = index
673 | efdcfsi TMP0, TMP0 713 | tonum_u f0, TMP0
674 | decode_RB8 RB, INS 714 | decode_RB8 RB, INS
675 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) 715 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH)
676 | add CARG2, BASE, RB 716 | add CARG2, BASE, RB
677 | evstdd TMP0, 0(CARG3) 717 | stfd f0, 0(CARG3)
678 | b >1 718 | b >1
679 | 719 |
680 |->vmeta_tsetv: 720 |->vmeta_tsetv:
@@ -689,11 +729,12 @@ static void build_subroutines(BuildCtx *ctx)
689 | bl extern lj_meta_tset // (lua_State *L, TValue *o, TValue *k) 729 | bl extern lj_meta_tset // (lua_State *L, TValue *o, TValue *k)
690 | // Returns TValue * (finished) or NULL (metamethod). 730 | // Returns TValue * (finished) or NULL (metamethod).
691 | cmplwi CRET1, 0 731 | cmplwi CRET1, 0
692 | evlddx TMP0, BASE, RA 732 | lfdx f0, BASE, RA
693 | beq >3 733 | beq >3
694 | // NOBARRIER: lj_meta_tset ensures the table is not black. 734 | // NOBARRIER: lj_meta_tset ensures the table is not black.
695 | evstdd TMP0, 0(CRET1) 735 | ins_next1
696 | ins_next 736 | stfd f0, 0(CRET1)
737 | ins_next2
697 | 738 |
698 |3: // Call __newindex metamethod. 739 |3: // Call __newindex metamethod.
699 | // BASE = base, L->top = new base, stack = cont/func/t/k/(v) 740 | // BASE = base, L->top = new base, stack = cont/func/t/k/(v)
@@ -703,7 +744,7 @@ static void build_subroutines(BuildCtx *ctx)
703 | add PC, TMP1, BASE 744 | add PC, TMP1, BASE
704 | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. 745 | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here.
705 | li NARGS8:RC, 24 // 3 args for func(t, k, v) 746 | li NARGS8:RC, 24 // 3 args for func(t, k, v)
706 | evstdd TMP0, 16(BASE) // Copy value to third argument. 747 | stfd f0, 16(BASE) // Copy value to third argument.
707 | b ->vm_call_dispatch_f 748 | b ->vm_call_dispatch_f
708 | 749 |
709 |//-- Comparison metamethods --------------------------------------------- 750 |//-- Comparison metamethods ---------------------------------------------
@@ -721,33 +762,35 @@ static void build_subroutines(BuildCtx *ctx)
721 |3: 762 |3:
722 | cmplwi CRET1, 1 763 | cmplwi CRET1, 1
723 | bgt ->vmeta_binop 764 | bgt ->vmeta_binop
765 | subfic CRET1, CRET1, 0
724 |4: 766 |4:
725 | lwz INS, 0(PC) 767 | lwz INS, 0(PC)
726 | addi PC, PC, 4 768 | addi PC, PC, 4
727 | decode_RD4 TMP2, INS 769 | decode_RD4 TMP2, INS
728 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) 770 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
729 | add TMP2, TMP2, TMP3 771 | and TMP2, TMP2, CRET1
730 | isellt PC, PC, TMP2 772 | add PC, PC, TMP2
731 |->cont_nop: 773 |->cont_nop:
732 | ins_next 774 | ins_next
733 | 775 |
734 |->cont_ra: // RA = resultptr 776 |->cont_ra: // RA = resultptr
735 | lwz INS, -4(PC) 777 | lwz INS, -4(PC)
736 | evldd TMP0, 0(RA) 778 | lfd f0, 0(RA)
737 | decode_RA8 TMP1, INS 779 | decode_RA8 TMP1, INS
738 | evstddx TMP0, BASE, TMP1 780 | stfdx f0, BASE, TMP1
739 | b ->cont_nop 781 | b ->cont_nop
740 | 782 |
741 |->cont_condt: // RA = resultptr 783 |->cont_condt: // RA = resultptr
742 | lwz TMP0, 0(RA) 784 | lwz TMP0, 0(RA)
743 | li TMP1, LJ_TTRUE 785 | subfic TMP0, TMP0, LJ_TTRUE // Branch if result is true.
744 | cmplw TMP1, TMP0 // Branch if result is true. 786 | subfe CRET1, CRET1, CRET1
787 | not CRET1, CRET1
745 | b <4 788 | b <4
746 | 789 |
747 |->cont_condf: // RA = resultptr 790 |->cont_condf: // RA = resultptr
748 | lwz TMP0, 0(RA) 791 | lwz TMP0, 0(RA)
749 | li TMP1, LJ_TFALSE 792 | subfic TMP0, TMP0, LJ_TTRUE // Branch if result is false.
750 | cmplw TMP0, TMP1 // Branch if result is false. 793 | subfe CRET1, CRET1, CRET1
751 | b <4 794 | b <4
752 | 795 |
753 |->vmeta_equal: 796 |->vmeta_equal:
@@ -773,8 +816,8 @@ static void build_subroutines(BuildCtx *ctx)
773 | b >1 816 | b >1
774 | 817 |
775 |->vmeta_unm: 818 |->vmeta_unm:
776 | add CARG3, BASE, RD 819 | mr CARG3, RD
777 | mr CARG4, CARG3 820 | mr CARG4, RD
778 | b >1 821 | b >1
779 | 822 |
780 |->vmeta_arith_vv: 823 |->vmeta_arith_vv:
@@ -796,6 +839,7 @@ static void build_subroutines(BuildCtx *ctx)
796 | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2 839 | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2
797 | sub TMP1, CRET1, BASE 840 | sub TMP1, CRET1, BASE
798 | stw PC, -16(CRET1) // [cont|PC] 841 | stw PC, -16(CRET1) // [cont|PC]
842 | mr TMP2, BASE
799 | addi PC, TMP1, FRAME_CONT 843 | addi PC, TMP1, FRAME_CONT
800 | mr BASE, CRET1 844 | mr BASE, CRET1
801 | li NARGS8:RC, 16 // 2 args for func(o1, o2). 845 | li NARGS8:RC, 16 // 2 args for func(o1, o2).
@@ -805,7 +849,7 @@ static void build_subroutines(BuildCtx *ctx)
805#ifdef LUAJIT_ENABLE_LUA52COMPAT 849#ifdef LUAJIT_ENABLE_LUA52COMPAT
806 | mr SAVE0, CARG1 850 | mr SAVE0, CARG1
807#endif 851#endif
808 | add CARG2, BASE, RD 852 | mr CARG2, RD
809 | stw BASE, L->base 853 | stw BASE, L->base
810 | mr CARG1, L 854 | mr CARG1, L
811 | stw PC, SAVE_PC 855 | stw PC, SAVE_PC
@@ -882,29 +926,40 @@ static void build_subroutines(BuildCtx *ctx)
882 |.macro .ffunc_1, name 926 |.macro .ffunc_1, name
883 |->ff_ .. name: 927 |->ff_ .. name:
884 | cmplwi NARGS8:RC, 8 928 | cmplwi NARGS8:RC, 8
885 | evldd CARG1, 0(BASE) 929 | lwz CARG3, 0(BASE)
930 | lwz CARG1, 4(BASE)
886 | blt ->fff_fallback 931 | blt ->fff_fallback
887 |.endmacro 932 |.endmacro
888 | 933 |
889 |.macro .ffunc_2, name 934 |.macro .ffunc_2, name
890 |->ff_ .. name: 935 |->ff_ .. name:
891 | cmplwi NARGS8:RC, 16 936 | cmplwi NARGS8:RC, 16
892 | evldd CARG1, 0(BASE) 937 | lwz CARG3, 0(BASE)
893 | evldd CARG2, 8(BASE) 938 | lwz CARG4, 8(BASE)
939 | lwz CARG1, 4(BASE)
940 | lwz CARG2, 12(BASE)
894 | blt ->fff_fallback 941 | blt ->fff_fallback
895 |.endmacro 942 |.endmacro
896 | 943 |
897 |.macro .ffunc_n, name 944 |.macro .ffunc_n, name
898 | .ffunc_1 name 945 |->ff_ .. name:
899 | checknum CARG1 946 | cmplwi NARGS8:RC, 8
900 | checkfail ->fff_fallback 947 | lwz CARG3, 0(BASE)
948 | lfd FARG1, 0(BASE)
949 | blt ->fff_fallback
950 | checknum CARG3; bge ->fff_fallback
901 |.endmacro 951 |.endmacro
902 | 952 |
903 |.macro .ffunc_nn, name 953 |.macro .ffunc_nn, name
904 | .ffunc_2 name 954 |->ff_ .. name:
905 | evmergehi TMP0, CARG1, CARG2 955 | cmplwi NARGS8:RC, 16
906 | checknum TMP0 956 | lwz CARG3, 0(BASE)
907 | checkanyfail ->fff_fallback 957 | lfd FARG1, 0(BASE)
958 | lwz CARG4, 8(BASE)
959 | lfd FARG2, 8(BASE)
960 | blt ->fff_fallback
961 | checknum CARG3; bge ->fff_fallback
962 | checknum CARG4; bge ->fff_fallback
908 |.endmacro 963 |.endmacro
909 | 964 |
910 |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1. 965 |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1.
@@ -917,24 +972,22 @@ static void build_subroutines(BuildCtx *ctx)
917 | 972 |
918 |//-- Base library: checks ----------------------------------------------- 973 |//-- Base library: checks -----------------------------------------------
919 | 974 |
920 |.ffunc assert 975 |.ffunc_1 assert
921 | cmplwi NARGS8:RC, 8 976 | li TMP1, LJ_TFALSE
922 | evldd TMP0, 0(BASE) 977 | la RA, -8(BASE)
923 | blt ->fff_fallback 978 | cmplw cr1, CARG3, TMP1
924 | evaddw TMP1, TISNIL, TISNIL // Synthesize LJ_TFALSE.
925 | la RA, -8(BASE)
926 | evcmpltu cr1, TMP0, TMP1
927 | lwz PC, FRAME_PC(BASE) 979 | lwz PC, FRAME_PC(BASE)
928 | bge cr1, ->fff_fallback 980 | bge cr1, ->fff_fallback
929 | evstdd TMP0, 0(RA) 981 | stw CARG3, 0(RA)
930 | addi RD, NARGS8:RC, 8 // Compute (nresults+1)*8. 982 | addi RD, NARGS8:RC, 8 // Compute (nresults+1)*8.
931 | beq ->fff_res // Done if exactly 1 argument. 983 | stw CARG1, 4(RA)
984 | beq ->fff_res // Done if exactly 1 argument.
932 | li TMP1, 8 985 | li TMP1, 8
933 | subi RC, RC, 8 986 | subi RC, RC, 8
934 |1: 987 |1:
935 | cmplw TMP1, RC 988 | cmplw TMP1, RC
936 | evlddx TMP0, BASE, TMP1 989 | lfdx f0, BASE, TMP1
937 | evstddx TMP0, RA, TMP1 990 | stfdx f0, RA, TMP1
938 | addi TMP1, TMP1, 8 991 | addi TMP1, TMP1, 8
939 | bne <1 992 | bne <1
940 | b ->fff_res 993 | b ->fff_res
@@ -943,71 +996,70 @@ static void build_subroutines(BuildCtx *ctx)
943 | cmplwi NARGS8:RC, 8 996 | cmplwi NARGS8:RC, 8
944 | lwz CARG1, 0(BASE) 997 | lwz CARG1, 0(BASE)
945 | blt ->fff_fallback 998 | blt ->fff_fallback
946 | li TMP2, ~LJ_TNUMX 999 | subfc TMP0, TISNUM, CARG1
947 | cmplw CARG1, TISNUM 1000 | subfe TMP2, CARG1, CARG1
948 | not TMP1, CARG1 1001 | orc TMP1, TMP2, TMP0
949 | isellt TMP1, TMP2, TMP1 1002 | addi TMP1, TMP1, ~LJ_TISNUM+1
950 | slwi TMP1, TMP1, 3 1003 | slwi TMP1, TMP1, 3
951 | la TMP2, CFUNC:RB->upvalue 1004 | la TMP2, CFUNC:RB->upvalue
952 | evlddx STR:CRET1, TMP2, TMP1 1005 | lfdx FARG1, TMP2, TMP1
953 | b ->fff_restv 1006 | b ->fff_resn
954 | 1007 |
955 |//-- Base library: getters and setters --------------------------------- 1008 |//-- Base library: getters and setters ---------------------------------
956 | 1009 |
957 |.ffunc_1 getmetatable 1010 |.ffunc_1 getmetatable
958 | checktab CARG1 1011 | checktab CARG3; bne >6
959 | evmergehi TMP1, CARG1, CARG1
960 | checkfail >6
961 |1: // Field metatable must be at same offset for GCtab and GCudata! 1012 |1: // Field metatable must be at same offset for GCtab and GCudata!
962 | lwz TAB:RB, TAB:CARG1->metatable 1013 | lwz TAB:CARG1, TAB:CARG1->metatable
963 |2: 1014 |2:
964 | evmr CRET1, TISNIL 1015 | li CARG3, LJ_TNIL
965 | cmplwi TAB:RB, 0 1016 | cmplwi TAB:CARG1, 0
966 | lwz STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH) 1017 | lwz STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH)
967 | beq ->fff_restv 1018 | beq ->fff_restv
968 | lwz TMP0, TAB:RB->hmask 1019 | lwz TMP0, TAB:CARG1->hmask
969 | evmergelo CRET1, TISTAB, TAB:RB // Use metatable as default result. 1020 | li CARG3, LJ_TTAB // Use metatable as default result.
970 | lwz TMP1, STR:RC->hash 1021 | lwz TMP1, STR:RC->hash
971 | lwz NODE:TMP2, TAB:RB->node 1022 | lwz NODE:TMP2, TAB:CARG1->node
972 | evmergelo STR:RC, TISSTR, STR:RC
973 | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask 1023 | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask
974 | slwi TMP0, TMP1, 5 1024 | slwi TMP0, TMP1, 5
975 | slwi TMP1, TMP1, 3 1025 | slwi TMP1, TMP1, 3
976 | sub TMP1, TMP0, TMP1 1026 | sub TMP1, TMP0, TMP1
977 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) 1027 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8)
978 |3: // Rearranged logic, because we expect _not_ to find the key. 1028 |3: // Rearranged logic, because we expect _not_ to find the key.
979 | evldd TMP0, NODE:TMP2->key 1029 | lwz CARG4, NODE:TMP2->key
980 | evldd TMP1, NODE:TMP2->val 1030 | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)
981 | evcmpeq TMP0, STR:RC 1031 | lwz CARG2, NODE:TMP2->val
982 | lwz NODE:TMP2, NODE:TMP2->next 1032 | lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2)
983 | checkallok >5 1033 | checkstr CARG4; bne >4
984 | cmplwi NODE:TMP2, 0 1034 | cmpw TMP0, STR:RC; beq >5
985 | beq ->fff_restv // Not found, keep default result. 1035 |4:
986 | b <3 1036 | lwz NODE:TMP2, NODE:TMP2->next
1037 | cmplwi NODE:TMP2, 0
1038 | beq ->fff_restv // Not found, keep default result.
1039 | b <3
987 |5: 1040 |5:
988 | checknil TMP1 1041 | checknil CARG2
989 | checkok ->fff_restv // Ditto for nil value. 1042 | beq ->fff_restv // Ditto for nil value.
990 | evmr CRET1, TMP1 // Return value of mt.__metatable. 1043 | mr CARG3, CARG2 // Return value of mt.__metatable.
1044 | mr CARG1, TMP1
991 | b ->fff_restv 1045 | b ->fff_restv
992 | 1046 |
993 |6: 1047 |6:
994 | cmpwi TMP1, LJ_TUDATA 1048 | cmpwi CARG3, LJ_TUDATA; beq <1
995 | not TMP1, TMP1 1049 | subfc TMP0, TISNUM, CARG3
996 | beq <1 1050 | subfe TMP2, CARG3, CARG3
997 | checknum CARG1 1051 | orc TMP1, TMP2, TMP0
998 | slwi TMP1, TMP1, 2 1052 | addi TMP1, TMP1, ~LJ_TISNUM+1
999 | li TMP2, 4*~LJ_TNUMX 1053 | slwi TMP1, TMP1, 2
1000 | isellt TMP1, TMP2, TMP1
1001 | la TMP2, DISPATCH_GL(gcroot[GCROOT_BASEMT])(DISPATCH) 1054 | la TMP2, DISPATCH_GL(gcroot[GCROOT_BASEMT])(DISPATCH)
1002 | lwzx TAB:RB, TMP2, TMP1 1055 | lwzx TAB:CARG1, TMP2, TMP1
1003 | b <2 1056 | b <2
1004 | 1057 |
1005 |.ffunc_2 setmetatable 1058 |.ffunc_2 setmetatable
1006 | // Fast path: no mt for table yet and not clearing the mt. 1059 | // Fast path: no mt for table yet and not clearing the mt.
1007 | evmergehi TMP0, TAB:CARG1, TAB:CARG2 1060 | checktab CARG3; bne ->fff_fallback
1008 | checktab TMP0
1009 | checkanyfail ->fff_fallback
1010 | lwz TAB:TMP1, TAB:CARG1->metatable 1061 | lwz TAB:TMP1, TAB:CARG1->metatable
1062 | checktab CARG4; bne ->fff_fallback
1011 | cmplwi TAB:TMP1, 0 1063 | cmplwi TAB:TMP1, 0
1012 | lbz TMP3, TAB:CARG1->marked 1064 | lbz TMP3, TAB:CARG1->marked
1013 | bne ->fff_fallback 1065 | bne ->fff_fallback
@@ -1018,60 +1070,61 @@ static void build_subroutines(BuildCtx *ctx)
1018 | b ->fff_restv 1070 | b ->fff_restv
1019 | 1071 |
1020 |.ffunc rawget 1072 |.ffunc rawget
1021 | cmplwi NARGS8:RC, 16 1073 | cmplwi NARGS8:RC, 8
1022 | evldd CARG2, 0(BASE) 1074 | lwz CARG4, 0(BASE)
1075 | lwz TAB:CARG2, 4(BASE)
1023 | blt ->fff_fallback 1076 | blt ->fff_fallback
1024 | checktab CARG2 1077 | checktab CARG4; bne ->fff_fallback
1025 | la CARG3, 8(BASE) 1078 | la CARG3, 8(BASE)
1026 | checkfail ->fff_fallback
1027 | mr CARG1, L 1079 | mr CARG1, L
1028 | bl extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) 1080 | bl extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key)
1029 | // Returns cTValue *. 1081 | // Returns cTValue *.
1030 | evldd CRET1, 0(CRET1) 1082 | lfd FARG1, 0(CRET1)
1031 | b ->fff_restv 1083 | b ->fff_resn
1032 | 1084 |
1033 |//-- Base library: conversions ------------------------------------------ 1085 |//-- Base library: conversions ------------------------------------------
1034 | 1086 |
1035 |.ffunc tonumber 1087 |.ffunc tonumber
1036 | // Only handles the number case inline (without a base argument). 1088 | // Only handles the number case inline (without a base argument).
1037 | cmplwi NARGS8:RC, 8 1089 | cmplwi NARGS8:RC, 8
1038 | evldd CARG1, 0(BASE) 1090 | lwz CARG1, 0(BASE)
1091 | lfd FARG1, 0(BASE)
1039 | bne ->fff_fallback // Exactly one argument. 1092 | bne ->fff_fallback // Exactly one argument.
1040 | checknum CARG1 1093 | checknum CARG1; bgt ->fff_fallback
1041 | checkok ->fff_restv 1094 | b ->fff_resn
1042 | b ->fff_fallback
1043 | 1095 |
1044 |.ffunc_1 tostring 1096 |.ffunc_1 tostring
1045 | // Only handles the string or number case inline. 1097 | // Only handles the string or number case inline.
1046 | checkstr CARG1 1098 | checkstr CARG3
1047 | // A __tostring method in the string base metatable is ignored. 1099 | // A __tostring method in the string base metatable is ignored.
1048 | checkok ->fff_restv // String key? 1100 | beq ->fff_restv // String key?
1049 | // Handle numbers inline, unless a number base metatable is present. 1101 | // Handle numbers inline, unless a number base metatable is present.
1050 | lwz TMP0, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH) 1102 | lwz TMP0, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH)
1051 | checknum CARG1 1103 | checknum CARG3
1052 | cmplwi cr1, TMP0, 0 1104 | cmplwi cr1, TMP0, 0
1053 | stw BASE, L->base // Add frame since C call can throw. 1105 | stw BASE, L->base // Add frame since C call can throw.
1054 | crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq 1106 | crorc 4*cr0+eq, 4*cr0+gt, 4*cr1+eq
1055 | stw PC, SAVE_PC // Redundant (but a defined value). 1107 | stw PC, SAVE_PC // Redundant (but a defined value).
1056 | bne ->fff_fallback 1108 | beq ->fff_fallback
1057 | ffgccheck 1109 | ffgccheck
1058 | mr CARG1, L 1110 | mr CARG1, L
1059 | mr CARG2, BASE 1111 | mr CARG2, BASE
1060 | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np) 1112 | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np)
1061 | // Returns GCstr *. 1113 | // Returns GCstr *.
1062 | evmergelo STR:CRET1, TISSTR, STR:CRET1 1114 | li CARG3, LJ_TSTR
1063 | b ->fff_restv 1115 | b ->fff_restv
1064 | 1116 |
1065 |//-- Base library: iterators ------------------------------------------- 1117 |//-- Base library: iterators -------------------------------------------
1066 | 1118 |
1067 |.ffunc next 1119 |.ffunc next
1068 | cmplwi NARGS8:RC, 8 1120 | cmplwi NARGS8:RC, 8
1069 | evldd CARG2, 0(BASE) 1121 | lwz CARG1, 0(BASE)
1122 | lwz TAB:CARG2, 4(BASE)
1070 | blt ->fff_fallback 1123 | blt ->fff_fallback
1071 | evstddx TISNIL, BASE, NARGS8:RC // Set missing 2nd arg to nil. 1124 | stwx TISNIL, BASE, NARGS8:RC // Set missing 2nd arg to nil.
1072 | checktab TAB:CARG2 1125 | checktab CARG1
1073 | lwz PC, FRAME_PC(BASE) 1126 | lwz PC, FRAME_PC(BASE)
1074 | checkfail ->fff_fallback 1127 | bne ->fff_fallback
1075 | stw BASE, L->base // Add frame since C call can throw. 1128 | stw BASE, L->base // Add frame since C call can throw.
1076 | mr CARG1, L 1129 | mr CARG1, L
1077 | stw BASE, L->top // Dummy frame length is ok. 1130 | stw BASE, L->top // Dummy frame length is ok.
@@ -1080,60 +1133,69 @@ static void build_subroutines(BuildCtx *ctx)
1080 | bl extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) 1133 | bl extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key)
1081 | // Returns 0 at end of traversal. 1134 | // Returns 0 at end of traversal.
1082 | cmplwi CRET1, 0 1135 | cmplwi CRET1, 0
1083 | evmr CRET1, TISNIL 1136 | li CARG3, LJ_TNIL
1084 | beq ->fff_restv // End of traversal: return nil. 1137 | beq ->fff_restv // End of traversal: return nil.
1085 | evldd TMP0, 8(BASE) // Copy key and value to results. 1138 | lfd f0, 8(BASE) // Copy key and value to results.
1086 | la RA, -8(BASE) 1139 | la RA, -8(BASE)
1087 | evldd TMP1, 16(BASE) 1140 | lfd f1, 16(BASE)
1088 | evstdd TMP0, 0(RA) 1141 | stfd f0, 0(RA)
1089 | li RD, (2+1)*8 1142 | li RD, (2+1)*8
1090 | evstdd TMP1, 8(RA) 1143 | stfd f1, 8(RA)
1091 | b ->fff_res 1144 | b ->fff_res
1092 | 1145 |
1093 |.ffunc_1 pairs 1146 |.ffunc_1 pairs
1094 | checktab TAB:CARG1 1147 | checktab CARG3
1095 | lwz PC, FRAME_PC(BASE) 1148 | lwz PC, FRAME_PC(BASE)
1096 | checkfail ->fff_fallback 1149 | bne ->fff_fallback
1097#ifdef LUAJIT_ENABLE_LUA52COMPAT 1150#ifdef LUAJIT_ENABLE_LUA52COMPAT
1098 | lwz TAB:TMP2, TAB:CARG1->metatable 1151 | lwz TAB:TMP2, TAB:CARG1->metatable
1099 | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] 1152 | lfd f0, CFUNC:RB->upvalue[0]
1100 | cmplwi TAB:TMP2, 0 1153 | cmplwi TAB:TMP2, 0
1101 | la RA, -8(BASE) 1154 | la RA, -8(BASE)
1102 | bne ->fff_fallback 1155 | bne ->fff_fallback
1103#else 1156#else
1104 | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] 1157 | lfd f0, CFUNC:RB->upvalue[0]
1105 | la RA, -8(BASE) 1158 | la RA, -8(BASE)
1106#endif 1159#endif
1107 | evstdd TISNIL, 8(BASE) 1160 | stw TISNIL, 8(BASE)
1108 | li RD, (3+1)*8 1161 | li RD, (3+1)*8
1109 | evstdd CFUNC:TMP0, 0(RA) 1162 | stfd f0, 0(RA)
1110 | b ->fff_res 1163 | b ->fff_res
1111 | 1164 |
1112 |.ffunc_2 ipairs_aux 1165 |.ffunc ipairs_aux
1113 | checktab TAB:CARG1 1166 | cmplwi NARGS8:RC, 16
1167 | lwz CARG3, 0(BASE)
1168 | lwz TAB:CARG1, 4(BASE)
1169 | lwz CARG4, 8(BASE)
1170 | lfd FARG2, 8(BASE)
1171 | blt ->fff_fallback
1172 | checktab CARG3
1173 | checknum cr1, CARG4
1114 | lwz PC, FRAME_PC(BASE) 1174 | lwz PC, FRAME_PC(BASE)
1115 | checkfail ->fff_fallback 1175 | lus TMP0, 0x3ff0
1116 | checknum CARG2 1176 | stw ZERO, TMPD_LO
1117 | lus TMP3, 0x3ff0 1177 | bne ->fff_fallback
1118 | checkfail ->fff_fallback 1178 | stw TMP0, TMPD_HI
1119 | efdctsi TMP2, CARG2 1179 | bge cr1, ->fff_fallback
1180 | lfd FARG1, TMPD
1181 | toint TMP2, FARG2, f0
1120 | lwz TMP0, TAB:CARG1->asize 1182 | lwz TMP0, TAB:CARG1->asize
1121 | evmergelo TMP3, TMP3, ZERO
1122 | lwz TMP1, TAB:CARG1->array 1183 | lwz TMP1, TAB:CARG1->array
1123 | efdadd CARG2, CARG2, TMP3 1184 | fadd FARG2, FARG2, FARG1
1124 | addi TMP2, TMP2, 1 1185 | addi TMP2, TMP2, 1
1125 | la RA, -8(BASE) 1186 | la RA, -8(BASE)
1126 | cmplw TMP0, TMP2 1187 | cmplw TMP0, TMP2
1127 | slwi TMP3, TMP2, 3 1188 | slwi TMP3, TMP2, 3
1128 | evstdd CARG2, 0(RA) 1189 | stfd FARG2, 0(RA)
1129 | ble >2 // Not in array part? 1190 | ble >2 // Not in array part?
1130 | evlddx TMP1, TMP1, TMP3 1191 | lwzx TMP2, TMP1, TMP3
1192 | lfdx f0, TMP1, TMP3
1131 |1: 1193 |1:
1132 | checknil TMP1 1194 | checknil TMP2
1133 | li RD, (0+1)*8 1195 | li RD, (0+1)*8
1134 | checkok ->fff_res // End of iteration, return 0 results. 1196 | beq ->fff_res // End of iteration, return 0 results.
1135 | li RD, (2+1)*8 1197 | li RD, (2+1)*8
1136 | evstdd TMP1, 8(RA) 1198 | stfd f0, 8(RA)
1137 | b ->fff_res 1199 | b ->fff_res
1138 |2: // Check for empty hash part first. Otherwise call C function. 1200 |2: // Check for empty hash part first. Otherwise call C function.
1139 | lwz TMP0, TAB:CARG1->hmask 1201 | lwz TMP0, TAB:CARG1->hmask
@@ -1146,27 +1208,28 @@ static void build_subroutines(BuildCtx *ctx)
1146 | cmplwi CRET1, 0 1208 | cmplwi CRET1, 0
1147 | li RD, (0+1)*8 1209 | li RD, (0+1)*8
1148 | beq ->fff_res 1210 | beq ->fff_res
1149 | evldd TMP1, 0(CRET1) 1211 | lwz TMP2, 0(CRET1)
1212 | lfd f0, 0(CRET1)
1150 | b <1 1213 | b <1
1151 | 1214 |
1152 |.ffunc_1 ipairs 1215 |.ffunc_1 ipairs
1153 | checktab TAB:CARG1 1216 | checktab CARG3
1154 | lwz PC, FRAME_PC(BASE) 1217 | lwz PC, FRAME_PC(BASE)
1155 | checkfail ->fff_fallback 1218 | bne ->fff_fallback
1156#ifdef LUAJIT_ENABLE_LUA52COMPAT 1219#ifdef LUAJIT_ENABLE_LUA52COMPAT
1157 | lwz TAB:TMP2, TAB:CARG1->metatable 1220 | lwz TAB:TMP2, TAB:CARG1->metatable
1158 | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] 1221 | lfd f0, CFUNC:RB->upvalue[0]
1159 | cmplwi TAB:TMP2, 0 1222 | cmplwi TAB:TMP2, 0
1160 | la RA, -8(BASE) 1223 | la RA, -8(BASE)
1161 | bne ->fff_fallback 1224 | bne ->fff_fallback
1162#else 1225#else
1163 | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] 1226 | lfd f0, CFUNC:RB->upvalue[0]
1164 | la RA, -8(BASE) 1227 | la RA, -8(BASE)
1165#endif 1228#endif
1166 | evsplati TMP1, 0 1229 | stw ZERO, 8(BASE)
1230 | stw ZERO, 12(BASE)
1167 | li RD, (3+1)*8 1231 | li RD, (3+1)*8
1168 | evstdd TMP1, 8(BASE) 1232 | stfd f0, 0(RA)
1169 | evstdd CFUNC:TMP0, 0(RA)
1170 | b ->fff_res 1233 | b ->fff_res
1171 | 1234 |
1172 |//-- Base library: catch errors ---------------------------------------- 1235 |//-- Base library: catch errors ----------------------------------------
@@ -1183,18 +1246,23 @@ static void build_subroutines(BuildCtx *ctx)
1183 | addi PC, TMP3, 8+FRAME_PCALL 1246 | addi PC, TMP3, 8+FRAME_PCALL
1184 | b ->vm_call_dispatch 1247 | b ->vm_call_dispatch
1185 | 1248 |
1186 |.ffunc_2 xpcall 1249 |.ffunc xpcall
1187 | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) 1250 | cmplwi NARGS8:RC, 16
1251 | lwz CARG4, 8(BASE)
1252 | lfd FARG2, 8(BASE)
1253 | lwz CARG3, 0(BASE)
1254 | lfd FARG1, 0(BASE)
1255 | blt ->fff_fallback
1256 | lbz TMP1, DISPATCH_GL(hookmask)(DISPATCH)
1188 | mr TMP2, BASE 1257 | mr TMP2, BASE
1189 | checkfunc CARG2 // Traceback must be a function. 1258 | checkfunc CARG4; bne ->fff_fallback // Traceback must be a function.
1190 | checkfail ->fff_fallback
1191 | la BASE, 16(BASE) 1259 | la BASE, 16(BASE)
1192 | // Remember active hook before pcall. 1260 | // Remember active hook before pcall.
1193 | rlwinm TMP3, TMP3, 32-HOOK_ACTIVE_SHIFT, 31, 31 1261 | rlwinm TMP1, TMP1, 32-HOOK_ACTIVE_SHIFT, 31, 31
1194 | evstdd CARG2, 0(TMP2) // Swap function and traceback. 1262 | stfd FARG2, 0(TMP2) // Swap function and traceback.
1195 | subi NARGS8:RC, NARGS8:RC, 16 1263 | subi NARGS8:RC, NARGS8:RC, 16
1196 | evstdd CARG1, 8(TMP2) 1264 | stfd FARG1, 8(TMP2)
1197 | addi PC, TMP3, 16+FRAME_PCALL 1265 | addi PC, TMP1, 16+FRAME_PCALL
1198 | b ->vm_call_dispatch 1266 | b ->vm_call_dispatch
1199 | 1267 |
1200 |//-- Coroutine library -------------------------------------------------- 1268 |//-- Coroutine library --------------------------------------------------
@@ -1202,15 +1270,11 @@ static void build_subroutines(BuildCtx *ctx)
1202 |.macro coroutine_resume_wrap, resume 1270 |.macro coroutine_resume_wrap, resume
1203 |.if resume 1271 |.if resume
1204 |.ffunc_1 coroutine_resume 1272 |.ffunc_1 coroutine_resume
1205 | evmergehi TMP0, L:CARG1, L:CARG1 1273 | cmpwi CARG3, LJ_TTHREAD; bne ->fff_fallback
1206 |.else 1274 |.else
1207 |.ffunc coroutine_wrap_aux 1275 |.ffunc coroutine_wrap_aux
1208 | lwz L:CARG1, CFUNC:RB->upvalue[0].gcr 1276 | lwz L:CARG1, CFUNC:RB->upvalue[0].gcr
1209 |.endif 1277 |.endif
1210 |.if resume
1211 | cmpwi TMP0, LJ_TTHREAD
1212 | bne ->fff_fallback
1213 |.endif
1214 | lbz TMP0, L:CARG1->status 1278 | lbz TMP0, L:CARG1->status
1215 | lwz TMP1, L:CARG1->cframe 1279 | lwz TMP1, L:CARG1->cframe
1216 | lwz CARG2, L:CARG1->top 1280 | lwz CARG2, L:CARG1->top
@@ -1240,9 +1304,9 @@ static void build_subroutines(BuildCtx *ctx)
1240 | stw BASE, L->top 1304 | stw BASE, L->top
1241 |2: // Move args to coroutine. 1305 |2: // Move args to coroutine.
1242 | cmpw TMP1, NARGS8:RC 1306 | cmpw TMP1, NARGS8:RC
1243 | evlddx TMP0, BASE, TMP1 1307 | lfdx f0, BASE, TMP1
1244 | beq >3 1308 | beq >3
1245 | evstddx TMP0, CARG2, TMP1 1309 | stfdx f0, CARG2, TMP1
1246 | addi TMP1, TMP1, 8 1310 | addi TMP1, TMP1, 8
1247 | b <2 1311 | b <2
1248 |3: 1312 |3:
@@ -1272,8 +1336,8 @@ static void build_subroutines(BuildCtx *ctx)
1272 | stw TMP2, L:SAVE0->top // Clear coroutine stack. 1336 | stw TMP2, L:SAVE0->top // Clear coroutine stack.
1273 |5: // Move results from coroutine. 1337 |5: // Move results from coroutine.
1274 | cmplw TMP1, TMP3 1338 | cmplw TMP1, TMP3
1275 | evlddx TMP0, TMP2, TMP1 1339 | lfdx f0, TMP2, TMP1
1276 | evstddx TMP0, BASE, TMP1 1340 | stfdx f0, BASE, TMP1
1277 | addi TMP1, TMP1, 8 1341 | addi TMP1, TMP1, 8
1278 | bne <5 1342 | bne <5
1279 |6: 1343 |6:
@@ -1298,12 +1362,12 @@ static void build_subroutines(BuildCtx *ctx)
1298 | andi. TMP0, PC, FRAME_TYPE 1362 | andi. TMP0, PC, FRAME_TYPE
1299 | la TMP3, -8(TMP3) 1363 | la TMP3, -8(TMP3)
1300 | li TMP1, LJ_TFALSE 1364 | li TMP1, LJ_TFALSE
1301 | evldd TMP0, 0(TMP3) 1365 | lfd f0, 0(TMP3)
1302 | stw TMP3, L:SAVE0->top // Remove error from coroutine stack. 1366 | stw TMP3, L:SAVE0->top // Remove error from coroutine stack.
1303 | li RD, (2+1)*8 1367 | li RD, (2+1)*8
1304 | stw TMP1, -8(BASE) // Prepend false to results. 1368 | stw TMP1, -8(BASE) // Prepend false to results.
1305 | la RA, -8(BASE) 1369 | la RA, -8(BASE)
1306 | evstdd TMP0, 0(BASE) // Copy error message. 1370 | stfd f0, 0(BASE) // Copy error message.
1307 | b <7 1371 | b <7
1308 |.else 1372 |.else
1309 | mr CARG1, L 1373 | mr CARG1, L
@@ -1336,15 +1400,17 @@ static void build_subroutines(BuildCtx *ctx)
1336 | 1400 |
1337 |//-- Math library ------------------------------------------------------- 1401 |//-- Math library -------------------------------------------------------
1338 | 1402 |
1339 |.ffunc_n math_abs 1403 |.ffunc_1 math_abs
1340 | efdabs CRET1, CARG1 1404 | checknum CARG3; bge ->fff_fallback
1405 | rlwinm CARG3, CARG3, 0, 1, 31
1341 | // Fallthrough. 1406 | // Fallthrough.
1342 | 1407 |
1343 |->fff_restv: 1408 |->fff_restv:
1344 | // CRET1 = TValue result. 1409 | // CARG3/CARG1 = TValue result.
1345 | lwz PC, FRAME_PC(BASE) 1410 | lwz PC, FRAME_PC(BASE)
1346 | la RA, -8(BASE) 1411 | stw CARG3, -8(BASE)
1347 | evstdd CRET1, 0(RA) 1412 | la RA, -8(BASE)
1413 | stw CARG1, -4(BASE)
1348 |->fff_res1: 1414 |->fff_res1:
1349 | // RA = results, PC = return. 1415 | // RA = results, PC = return.
1350 | li RD, (1+1)*8 1416 | li RD, (1+1)*8
@@ -1367,54 +1433,24 @@ static void build_subroutines(BuildCtx *ctx)
1367 |6: // Fill up results with nil. 1433 |6: // Fill up results with nil.
1368 | subi TMP1, RD, 8 1434 | subi TMP1, RD, 8
1369 | addi RD, RD, 8 1435 | addi RD, RD, 8
1370 | evstddx TISNIL, RA, TMP1 1436 | stwx TISNIL, RA, TMP1
1371 | b <5 1437 | b <5
1372 | 1438 |
1373 |.macro math_extern, func 1439 |.macro math_extern, func
1374 | .ffunc math_ .. func 1440 | .ffunc_n math_ .. func
1375 | cmplwi NARGS8:RC, 8
1376 | evldd CARG2, 0(BASE)
1377 | blt ->fff_fallback
1378 | checknum CARG2
1379 | evmergehi CARG1, CARG2, CARG2
1380 | checkfail ->fff_fallback
1381 | bl extern func 1441 | bl extern func
1382 | evmergelo CRET1, CRET1, CRET2 1442 | b ->fff_resn
1383 | b ->fff_restv
1384 |.endmacro 1443 |.endmacro
1385 | 1444 |
1386 |.macro math_extern2, func 1445 |.macro math_extern2, func
1387 | .ffunc math_ .. func 1446 | .ffunc_nn math_ .. func
1388 | cmplwi NARGS8:RC, 16
1389 | evldd CARG2, 0(BASE)
1390 | evldd CARG4, 8(BASE)
1391 | blt ->fff_fallback
1392 | evmergehi CARG1, CARG4, CARG2
1393 | checknum CARG1
1394 | evmergehi CARG3, CARG4, CARG4
1395 | checkanyfail ->fff_fallback
1396 | bl extern func 1447 | bl extern func
1397 | evmergelo CRET1, CRET1, CRET2 1448 | b ->fff_resn
1398 | b ->fff_restv
1399 |.endmacro 1449 |.endmacro
1400 | 1450 |
1401 |.macro math_round, func 1451 | // NYI: Use internal implementation.
1402 | .ffunc math_ .. func 1452 | math_extern floor
1403 | cmplwi NARGS8:RC, 8 1453 | math_extern ceil
1404 | evldd CARG2, 0(BASE)
1405 | blt ->fff_fallback
1406 | checknum CARG2
1407 | evmergehi CARG1, CARG2, CARG2
1408 | checkfail ->fff_fallback
1409 | lwz PC, FRAME_PC(BASE)
1410 | bl ->vm_..func.._hilo;
1411 | la RA, -8(BASE)
1412 | evstdd CRET2, 0(RA)
1413 | b ->fff_res1
1414 |.endmacro
1415 |
1416 | math_round floor
1417 | math_round ceil
1418 | 1454 |
1419 | math_extern sqrt 1455 | math_extern sqrt
1420 | math_extern log 1456 | math_extern log
@@ -1435,119 +1471,98 @@ static void build_subroutines(BuildCtx *ctx)
1435 | 1471 |
1436 |->ff_math_deg: 1472 |->ff_math_deg:
1437 |.ffunc_n math_rad 1473 |.ffunc_n math_rad
1438 | evldd CARG2, CFUNC:RB->upvalue[0] 1474 | lfd FARG2, CFUNC:RB->upvalue[0]
1439 | efdmul CRET1, CARG1, CARG2 1475 | fmul FARG1, FARG1, FARG2
1440 | b ->fff_restv 1476 | b ->fff_resn
1441 | 1477 |
1442 |.ffunc math_ldexp 1478 |.ffunc_nn math_ldexp
1443 | cmplwi NARGS8:RC, 16 1479 | toint CARG1, FARG2
1444 | evldd CARG2, 0(BASE)
1445 | evldd CARG4, 8(BASE)
1446 | blt ->fff_fallback
1447 | evmergehi CARG1, CARG4, CARG2
1448 | checknum CARG1
1449 | checkanyfail ->fff_fallback
1450 | efdctsi CARG3, CARG4
1451 | bl extern ldexp 1480 | bl extern ldexp
1452 | evmergelo CRET1, CRET1, CRET2 1481 | b ->fff_resn
1453 | b ->fff_restv
1454 | 1482 |
1455 |.ffunc math_frexp 1483 |.ffunc_n math_frexp
1456 | cmplwi NARGS8:RC, 8 1484 | la CARG1, DISPATCH_GL(tmptv)(DISPATCH)
1457 | evldd CARG2, 0(BASE)
1458 | blt ->fff_fallback
1459 | checknum CARG2
1460 | evmergehi CARG1, CARG2, CARG2
1461 | checkfail ->fff_fallback
1462 | la CARG3, DISPATCH_GL(tmptv)(DISPATCH)
1463 | lwz PC, FRAME_PC(BASE) 1485 | lwz PC, FRAME_PC(BASE)
1464 | bl extern frexp 1486 | bl extern frexp
1465 | lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH) 1487 | lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH)
1466 | evmergelo CRET1, CRET1, CRET2
1467 | efdcfsi CRET2, TMP1
1468 | la RA, -8(BASE) 1488 | la RA, -8(BASE)
1469 | evstdd CRET1, 0(RA) 1489 | tonum_i FARG2, TMP1
1490 | stfd FARG1, 0(RA)
1470 | li RD, (2+1)*8 1491 | li RD, (2+1)*8
1471 | evstdd CRET2, 8(RA) 1492 | stfd FARG2, 8(RA)
1472 | b ->fff_res 1493 | b ->fff_res
1473 | 1494 |
1474 |.ffunc math_modf 1495 |.ffunc_n math_modf
1475 | cmplwi NARGS8:RC, 8 1496 | la CARG1, -8(BASE)
1476 | evldd CARG2, 0(BASE)
1477 | blt ->fff_fallback
1478 | checknum CARG2
1479 | evmergehi CARG1, CARG2, CARG2
1480 | checkfail ->fff_fallback
1481 | la CARG3, -8(BASE)
1482 | lwz PC, FRAME_PC(BASE) 1497 | lwz PC, FRAME_PC(BASE)
1483 | bl extern modf 1498 | bl extern modf
1484 | evmergelo CRET1, CRET1, CRET2
1485 | la RA, -8(BASE) 1499 | la RA, -8(BASE)
1486 | evstdd CRET1, 0(BASE) 1500 | stfd FARG1, 0(BASE)
1487 | li RD, (2+1)*8 1501 | li RD, (2+1)*8
1488 | b ->fff_res 1502 | b ->fff_res
1489 | 1503 |
1490 |.macro math_minmax, name, cmpop 1504 |.macro math_minmax, name, ismax
1491 | .ffunc_1 name 1505 | .ffunc_n name
1492 | checknum CARG1 1506 | li TMP1, 8
1493 | li TMP1, 8
1494 | checkfail ->fff_fallback
1495 |1: 1507 |1:
1496 | evlddx CARG2, BASE, TMP1 1508 | lwzx CARG2, BASE, TMP1
1509 | lfdx FARG2, BASE, TMP1
1497 | cmplw cr1, TMP1, NARGS8:RC 1510 | cmplw cr1, TMP1, NARGS8:RC
1498 | checknum CARG2 1511 | checknum CARG2
1499 | bge cr1, ->fff_restv // Ok, since CRET1 = CARG1. 1512 | bge cr1, ->fff_resn
1500 | checkfail ->fff_fallback 1513 | bge ->fff_fallback
1501 | cmpop CARG2, CARG1 1514 | fsub f0, FARG1, FARG2
1502 | addi TMP1, TMP1, 8 1515 | addi TMP1, TMP1, 8
1503 | crmove 4*cr0+lt, 4*cr0+gt 1516 |.if ismax
1504 | evsel CARG1, CARG2, CARG1 1517 | fsel FARG1, f0, FARG1, FARG2
1518 |.else
1519 | fsel FARG1, f0, FARG2, FARG1
1520 |.endif
1505 | b <1 1521 | b <1
1506 |.endmacro 1522 |.endmacro
1507 | 1523 |
1508 | math_minmax math_min, efdtstlt 1524 | math_minmax math_min, 0
1509 | math_minmax math_max, efdtstgt 1525 | math_minmax math_max, 1
1510 | 1526 |
1511 |//-- String library ----------------------------------------------------- 1527 |//-- String library -----------------------------------------------------
1512 | 1528 |
1513 |.ffunc_1 string_len 1529 |.ffunc_1 string_len
1514 | checkstr STR:CARG1 1530 | checkstr CARG3; bne ->fff_fallback
1515 | checkfail ->fff_fallback 1531 | lwz CRET1, STR:CARG1->len
1516 | lwz TMP0, STR:CARG1->len 1532 | b ->fff_resi
1517 | efdcfsi CRET1, TMP0
1518 | b ->fff_restv
1519 | 1533 |
1520 |.ffunc string_byte // Only handle the 1-arg case here. 1534 |.ffunc string_byte // Only handle the 1-arg case here.
1521 | cmplwi NARGS8:RC, 8 1535 | cmplwi NARGS8:RC, 8
1522 | evldd STR:CARG1, 0(BASE) 1536 | lwz CARG3, 0(BASE)
1537 | lwz STR:CARG1, 4(BASE)
1523 | bne ->fff_fallback // Need exactly 1 argument. 1538 | bne ->fff_fallback // Need exactly 1 argument.
1524 | checkstr STR:CARG1 1539 | checkstr CARG3
1525 | la RA, -8(BASE) 1540 | bne ->fff_fallback
1526 | checkfail ->fff_fallback
1527 | lwz TMP0, STR:CARG1->len 1541 | lwz TMP0, STR:CARG1->len
1528 | li RD, (0+1)*8 1542 | lbz TMP1, STR:CARG1[1] // Access is always ok (NUL at end).
1529 | lbz TMP1, STR:CARG1[1] // Access is always ok (NUL at end). 1543 | addic TMP3, TMP0, -1 // RD = ((str->len != 0)+1)*8
1530 | li TMP2, (1+1)*8 1544 | subfe RD, TMP3, TMP0
1531 | cmplwi TMP0, 0 1545 | stw TMP1, TONUM_LO // Inlined tonum_u f0, TMP1.
1532 | lwz PC, FRAME_PC(BASE) 1546 | addi RD, RD, 1
1533 | efdcfsi CRET1, TMP1 1547 | lfd f0, TONUM_D
1534 | iseleq RD, RD, TMP2 1548 | la RA, -8(BASE)
1535 | evstdd CRET1, 0(RA) 1549 | lwz PC, FRAME_PC(BASE)
1550 | fsub f0, f0, TOBIT
1551 | slwi RD, RD, 3
1552 | stfd f0, 0(RA)
1536 | b ->fff_res 1553 | b ->fff_res
1537 | 1554 |
1538 |.ffunc string_char // Only handle the 1-arg case here. 1555 |.ffunc string_char // Only handle the 1-arg case here.
1539 | ffgccheck 1556 | ffgccheck
1540 | cmplwi NARGS8:RC, 8 1557 | cmplwi NARGS8:RC, 8
1541 | evldd CARG1, 0(BASE) 1558 | lwz CARG3, 0(BASE)
1559 | lfd FARG1, 0(BASE)
1542 | bne ->fff_fallback // Exactly 1 argument. 1560 | bne ->fff_fallback // Exactly 1 argument.
1543 | checknum CARG1 1561 | checknum CARG3; bge ->fff_fallback
1544 | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) 1562 | toint TMP0, FARG1
1545 | checkfail ->fff_fallback 1563 | la CARG2, TMPD_BLO
1546 | efdctsiz TMP0, CARG1
1547 | li CARG3, 1 1564 | li CARG3, 1
1548 | cmplwi TMP0, 255 1565 | cmplwi TMP0, 255; bgt ->fff_fallback
1549 | stb TMP0, 0(CARG2)
1550 | bgt ->fff_fallback
1551 |->fff_newstr: 1566 |->fff_newstr:
1552 | mr CARG1, L 1567 | mr CARG1, L
1553 | stw BASE, L->base 1568 | stw BASE, L->base
@@ -1555,67 +1570,71 @@ static void build_subroutines(BuildCtx *ctx)
1555 | bl extern lj_str_new // (lua_State *L, char *str, size_t l) 1570 | bl extern lj_str_new // (lua_State *L, char *str, size_t l)
1556 | // Returns GCstr *. 1571 | // Returns GCstr *.
1557 | lwz BASE, L->base 1572 | lwz BASE, L->base
1558 | evmergelo STR:CRET1, TISSTR, STR:CRET1 1573 | li CARG3, LJ_TSTR
1559 | b ->fff_restv 1574 | b ->fff_restv
1560 | 1575 |
1561 |.ffunc string_sub 1576 |.ffunc string_sub
1562 | ffgccheck 1577 | ffgccheck
1563 | cmplwi NARGS8:RC, 16 1578 | cmplwi NARGS8:RC, 16
1564 | evldd CARG3, 16(BASE) 1579 | lwz CARG3, 16(BASE)
1565 | evldd STR:CARG1, 0(BASE) 1580 | lfd f0, 16(BASE)
1581 | lwz TMP0, 0(BASE)
1582 | lwz STR:CARG1, 4(BASE)
1566 | blt ->fff_fallback 1583 | blt ->fff_fallback
1567 | evldd CARG2, 8(BASE) 1584 | lwz CARG2, 8(BASE)
1585 | lfd f1, 8(BASE)
1568 | li TMP2, -1 1586 | li TMP2, -1
1569 | beq >1 1587 | beq >1
1570 | checknum CARG3 1588 | checknum CARG3; bge ->fff_fallback
1571 | checkfail ->fff_fallback 1589 | toint TMP2, f0
1572 | efdctsiz TMP2, CARG3
1573 |1: 1590 |1:
1574 | checknum CARG2 1591 | checknum CARG2; bge ->fff_fallback
1575 | checkfail ->fff_fallback 1592 | checkstr TMP0; bne ->fff_fallback
1576 | checkstr STR:CARG1 1593 | toint TMP1, f1
1577 | efdctsiz TMP1, CARG2
1578 | checkfail ->fff_fallback
1579 | lwz TMP0, STR:CARG1->len 1594 | lwz TMP0, STR:CARG1->len
1580 | cmplw TMP0, TMP2 // len < end? (unsigned compare) 1595 | cmplw TMP0, TMP2 // len < end? (unsigned compare)
1581 | add TMP3, TMP2, TMP0 1596 | addi TMP3, TMP2, 1
1582 | blt >5 1597 | blt >5
1583 |2: 1598 |2:
1584 | cmpwi TMP1, 0 // start <= 0? 1599 | cmpwi TMP1, 0 // start <= 0?
1585 | add TMP3, TMP1, TMP0 1600 | add TMP3, TMP1, TMP0
1586 | ble >7 1601 | ble >7
1587 |3: 1602 |3:
1588 | sub. CARG3, TMP2, TMP1 1603 | sub CARG3, TMP2, TMP1
1589 | addi CARG2, STR:CARG1, #STR-1 1604 | addi CARG2, STR:CARG1, #STR-1
1605 | srawi TMP0, CARG3, 31
1590 | addi CARG3, CARG3, 1 1606 | addi CARG3, CARG3, 1
1591 | add CARG2, CARG2, TMP1 1607 | add CARG2, CARG2, TMP1
1592 | isellt CARG3, r0, CARG3 1608 | andc CARG3, CARG3, TMP0
1593 | b ->fff_newstr 1609 | b ->fff_newstr
1594 | 1610 |
1595 |5: // Negative end or overflow. 1611 |5: // Negative end or overflow.
1596 | cmpw TMP0, TMP2 1612 | sub CARG2, TMP0, TMP2
1597 | addi TMP3, TMP3, 1 1613 | srawi CARG2, CARG2, 31
1598 | iselgt TMP2, TMP3, TMP0 // end = end > len ? len : end+len+1 1614 | andc TMP3, TMP3, CARG2 // end = end > len ? len : end+len+1
1615 | add TMP2, TMP0, TMP3
1599 | b <2 1616 | b <2
1600 | 1617 |
1601 |7: // Negative start or underflow. 1618 |7: // Negative start or underflow.
1602 | cmpwi cr1, TMP3, 0 1619 | addic CARG3, TMP1, -1
1603 | iseleq TMP1, r0, TMP3 1620 | subfe CARG3, CARG3, CARG3
1604 | isel TMP1, r0, TMP1, 4*cr1+lt 1621 | srawi CARG2, TMP3, 31 // Note: modifies carry.
1622 | andc TMP3, TMP3, CARG3
1623 | andc TMP1, TMP3, CARG2
1605 | addi TMP1, TMP1, 1 // start = 1 + (start ? start+len : 0) 1624 | addi TMP1, TMP1, 1 // start = 1 + (start ? start+len : 0)
1606 | b <3 1625 | b <3
1607 | 1626 |
1608 |.ffunc string_rep // Only handle the 1-char case inline. 1627 |.ffunc string_rep // Only handle the 1-char case inline.
1609 | ffgccheck 1628 | ffgccheck
1610 | cmplwi NARGS8:RC, 16 1629 | cmplwi NARGS8:RC, 16
1611 | evldd CARG1, 0(BASE) 1630 | lwz CARG3, 0(BASE)
1612 | evldd CARG2, 8(BASE) 1631 | lwz STR:CARG1, 4(BASE)
1632 | lwz CARG4, 8(BASE)
1633 | lfd FARG2, 8(BASE)
1613 | blt ->fff_fallback 1634 | blt ->fff_fallback
1614 | checknum CARG2 1635 | checkstr CARG3; bne ->fff_fallback
1615 | checkfail ->fff_fallback 1636 | checknum CARG4; bge ->fff_fallback
1616 | checkstr STR:CARG1 1637 | toint CARG3, FARG2
1617 | efdctsiz CARG3, CARG2
1618 | checkfail ->fff_fallback
1619 | lwz TMP0, STR:CARG1->len 1638 | lwz TMP0, STR:CARG1->len
1620 | cmpwi CARG3, 0 1639 | cmpwi CARG3, 0
1621 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) 1640 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH)
@@ -1635,18 +1654,19 @@ static void build_subroutines(BuildCtx *ctx)
1635 | bne <1 1654 | bne <1
1636 | b ->fff_newstr 1655 | b ->fff_newstr
1637 |2: // Return empty string. 1656 |2: // Return empty string.
1638 | la STR:CRET1, DISPATCH_GL(strempty)(DISPATCH) 1657 | la STR:CARG1, DISPATCH_GL(strempty)(DISPATCH)
1639 | evmergelo CRET1, TISSTR, STR:CRET1 1658 | li CARG3, LJ_TSTR
1640 | b ->fff_restv 1659 | b ->fff_restv
1641 | 1660 |
1642 |.ffunc string_reverse 1661 |.ffunc string_reverse
1643 | ffgccheck 1662 | ffgccheck
1644 | cmplwi NARGS8:RC, 8 1663 | cmplwi NARGS8:RC, 8
1645 | evldd CARG1, 0(BASE) 1664 | lwz CARG3, 0(BASE)
1665 | lwz STR:CARG1, 4(BASE)
1646 | blt ->fff_fallback 1666 | blt ->fff_fallback
1647 | checkstr STR:CARG1 1667 | checkstr CARG3
1648 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) 1668 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH)
1649 | checkfail ->fff_fallback 1669 | bne ->fff_fallback
1650 | lwz CARG3, STR:CARG1->len 1670 | lwz CARG3, STR:CARG1->len
1651 | la CARG1, #STR(STR:CARG1) 1671 | la CARG1, #STR(STR:CARG1)
1652 | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) 1672 | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH)
@@ -1667,11 +1687,12 @@ static void build_subroutines(BuildCtx *ctx)
1667 | .ffunc name 1687 | .ffunc name
1668 | ffgccheck 1688 | ffgccheck
1669 | cmplwi NARGS8:RC, 8 1689 | cmplwi NARGS8:RC, 8
1670 | evldd CARG1, 0(BASE) 1690 | lwz CARG3, 0(BASE)
1691 | lwz STR:CARG1, 4(BASE)
1671 | blt ->fff_fallback 1692 | blt ->fff_fallback
1672 | checkstr STR:CARG1 1693 | checkstr CARG3
1673 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) 1694 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH)
1674 | checkfail ->fff_fallback 1695 | bne ->fff_fallback
1675 | lwz CARG3, STR:CARG1->len 1696 | lwz CARG3, STR:CARG1->len
1676 | la CARG1, #STR(STR:CARG1) 1697 | la CARG1, #STR(STR:CARG1)
1677 | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) 1698 | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH)
@@ -1684,8 +1705,10 @@ static void build_subroutines(BuildCtx *ctx)
1684 | bge ->fff_newstr 1705 | bge ->fff_newstr
1685 | subi TMP0, TMP1, lo 1706 | subi TMP0, TMP1, lo
1686 | xori TMP3, TMP1, 0x20 1707 | xori TMP3, TMP1, 0x20
1687 | cmplwi TMP0, 26 1708 | addic TMP0, TMP0, -26
1688 | isellt TMP1, TMP3, TMP1 1709 | subfe TMP3, TMP3, TMP3
1710 | andi. TMP3, TMP3, 0x20
1711 | xor TMP1, TMP1, TMP3
1689 | stbx TMP1, CARG2, TMP2 1712 | stbx TMP1, CARG2, TMP2
1690 | addi TMP2, TMP2, 1 1713 | addi TMP2, TMP2, 1
1691 | b <1 1714 | b <1
@@ -1697,35 +1720,42 @@ static void build_subroutines(BuildCtx *ctx)
1697 |//-- Table library ------------------------------------------------------ 1720 |//-- Table library ------------------------------------------------------
1698 | 1721 |
1699 |.ffunc_1 table_getn 1722 |.ffunc_1 table_getn
1700 | checktab CARG1 1723 | checktab CARG3; bne ->fff_fallback
1701 | checkfail ->fff_fallback
1702 | bl extern lj_tab_len // (GCtab *t) 1724 | bl extern lj_tab_len // (GCtab *t)
1703 | // Returns uint32_t (but less than 2^31). 1725 | // Returns uint32_t (but less than 2^31).
1704 | efdcfsi CRET1, CRET1 1726 | b ->fff_resi
1705 | b ->fff_restv
1706 | 1727 |
1707 |//-- Bit library -------------------------------------------------------- 1728 |//-- Bit library --------------------------------------------------------
1708 | 1729 |
1709 |.macro .ffunc_bit, name 1730 |.macro .ffunc_bit, name
1710 | .ffunc_n bit_..name 1731 | .ffunc_n bit_..name
1711 | efdadd CARG1, CARG1, TOBIT 1732 | fadd FARG1, FARG1, TOBIT
1733 | stfd FARG1, TMPD
1734 | lwz CARG1, TMPD_LO
1712 |.endmacro 1735 |.endmacro
1713 | 1736 |
1714 |.ffunc_bit tobit 1737 |.ffunc_bit tobit
1715 |->fff_resbit: 1738 |->fff_resi:
1716 | efdcfsi CRET1, CARG1 1739 | tonum_i FARG1, CRET1
1717 | b ->fff_restv 1740 |->fff_resn:
1741 | lwz PC, FRAME_PC(BASE)
1742 | la RA, -8(BASE)
1743 | stfd FARG1, -8(BASE)
1744 | b ->fff_res1
1718 | 1745 |
1719 |.macro .ffunc_bit_op, name, ins 1746 |.macro .ffunc_bit_op, name, ins
1720 | .ffunc_bit name 1747 | .ffunc_bit name
1721 | li TMP1, 8 1748 | li TMP1, 8
1722 |1: 1749 |1:
1723 | evlddx CARG2, BASE, TMP1 1750 | lwzx CARG4, BASE, TMP1
1724 | cmplw cr1, TMP1, NARGS8:RC 1751 | cmplw cr1, TMP1, NARGS8:RC
1725 | checknum CARG2 1752 | lfdx FARG1, BASE, TMP1
1726 | bge cr1, ->fff_resbit 1753 | checknum CARG4
1727 | checkfail ->fff_fallback 1754 | bge cr1, ->fff_resi
1728 | efdadd CARG2, CARG2, TOBIT 1755 | fadd FARG1, FARG1, TOBIT
1756 | bge ->fff_fallback
1757 | stfd FARG1, TMPD
1758 | lwz CARG2, TMPD_LO
1729 | ins CARG1, CARG1, CARG2 1759 | ins CARG1, CARG1, CARG2
1730 | addi TMP1, TMP1, 8 1760 | addi TMP1, TMP1, 8
1731 | b <1 1761 | b <1
@@ -1739,26 +1769,28 @@ static void build_subroutines(BuildCtx *ctx)
1739 | rotlwi TMP0, CARG1, 8 1769 | rotlwi TMP0, CARG1, 8
1740 | rlwimi TMP0, CARG1, 24, 0, 7 1770 | rlwimi TMP0, CARG1, 24, 0, 7
1741 | rlwimi TMP0, CARG1, 24, 16, 23 1771 | rlwimi TMP0, CARG1, 24, 16, 23
1742 | efdcfsi CRET1, TMP0 1772 | mr CRET1, TMP0
1743 | b ->fff_restv 1773 | b ->fff_resi
1744 | 1774 |
1745 |.ffunc_bit bnot 1775 |.ffunc_bit bnot
1746 | not TMP0, CARG1 1776 | not CRET1, CARG1
1747 | efdcfsi CRET1, TMP0 1777 | b ->fff_resi
1748 | b ->fff_restv
1749 | 1778 |
1750 |.macro .ffunc_bit_sh, name, ins, shmod 1779 |.macro .ffunc_bit_sh, name, ins, shmod
1751 | .ffunc_nn bit_..name 1780 | .ffunc_nn bit_..name
1752 | efdadd CARG2, CARG2, TOBIT 1781 | fadd FARG1, FARG1, TOBIT
1753 | efdadd CARG1, CARG1, TOBIT 1782 | fadd FARG2, FARG2, TOBIT
1783 | stfd FARG1, TMPD
1784 | lwz CARG1, TMPD_LO
1785 | stfd FARG2, TMPD
1786 | lwz CARG2, TMPD_LO
1754 |.if shmod == 1 1787 |.if shmod == 1
1755 | rlwinm CARG2, CARG2, 0, 27, 31 1788 | rlwinm CARG2, CARG2, 0, 27, 31
1756 |.elif shmod == 2 1789 |.elif shmod == 2
1757 | neg CARG2, CARG2 1790 | neg CARG2, CARG2
1758 |.endif 1791 |.endif
1759 | ins TMP0, CARG1, CARG2 1792 | ins CRET1, CARG1, CARG2
1760 | efdcfsi CRET1, TMP0 1793 | b ->fff_resi
1761 | b ->fff_restv
1762 |.endmacro 1794 |.endmacro
1763 | 1795 |
1764 |.ffunc_bit_sh lshift, slw, 1 1796 |.ffunc_bit_sh lshift, slw, 1
@@ -1939,93 +1971,14 @@ static void build_subroutines(BuildCtx *ctx)
1939 |//-- Math helper functions ---------------------------------------------- 1971 |//-- Math helper functions ----------------------------------------------
1940 |//----------------------------------------------------------------------- 1972 |//-----------------------------------------------------------------------
1941 | 1973 |
1942 |// FP value rounding. Called by math.floor/math.ceil fast functions 1974 | // NYI: Use internal implementation.
1943 |// and from JIT code.
1944 |//
1945 |// This can be inlined if the CPU has the frin/friz/frip/frim instructions.
1946 |// The alternative hard-float approaches have a deep dependency chain.
1947 |// The resulting latency is at least 3x-7x the double-precision FP latency
1948 |// (e500v2: 6cy, e600: 5cy, Cell: 10cy) or around 20-70 cycles.
1949 |//
1950 |// The soft-float approach is tedious, but much faster (e500v2: ~11cy/~6cy).
1951 |// However it relies on a fast way to transfer the FP value to GPRs
1952 |// (e500v2: 0cy for lo-word, 1cy for hi-word).
1953 |//
1954 |.macro vm_round, name, mode
1955 | // Used temporaries: TMP0, TMP1, TMP2, TMP3.
1956 |->name.._efd: // Input: CARG2, output: CRET2
1957 | evmergehi CARG1, CARG2, CARG2
1958 |->name.._hilo:
1959 | // Input: CARG1 (hi), CARG2 (hi, lo), output: CRET2
1960 | rlwinm TMP2, CARG1, 12, 21, 31
1961 | addic. TMP2, TMP2, -1023 // exp = exponent(x) - 1023
1962 | li TMP1, -1
1963 | cmplwi cr1, TMP2, 51 // 0 <= exp <= 51?
1964 | subfic TMP0, TMP2, 52
1965 | bgt cr1, >1
1966 | lus TMP3, 0xfff0
1967 | slw TMP0, TMP1, TMP0 // lomask = -1 << (52-exp)
1968 | sraw TMP1, TMP3, TMP2 // himask = (int32_t)0xfff00000 >> exp
1969 |.if mode == 2 // trunc(x):
1970 | evmergelo TMP0, TMP1, TMP0
1971 | evand CRET2, CARG2, TMP0 // hi &= himask, lo &= lomask
1972 |.else
1973 | andc TMP2, CARG2, TMP0
1974 | andc TMP3, CARG1, TMP1
1975 | or TMP2, TMP2, TMP3 // ztest = (hi&~himask) | (lo&~lomask)
1976 | srawi TMP3, CARG1, 31 // signmask = (int32_t)hi >> 31
1977 |.if mode == 0 // floor(x):
1978 | and. TMP2, TMP2, TMP3 // iszero = ((ztest & signmask) == 0)
1979 |.else // ceil(x):
1980 | andc. TMP2, TMP2, TMP3 // iszero = ((ztest & ~signmask) == 0)
1981 |.endif
1982 | and CARG2, CARG2, TMP0 // lo &= lomask
1983 | and CARG1, CARG1, TMP1 // hi &= himask
1984 | subc TMP0, CARG2, TMP0
1985 | iseleq TMP0, CARG2, TMP0 // lo = iszero ? lo : lo-lomask
1986 | sube TMP1, CARG1, TMP1
1987 | iseleq TMP1, CARG1, TMP1 // hi = iszero ? hi : hi-himask+carry
1988 | evmergelo CRET2, TMP1, TMP0
1989 |.endif
1990 | blr
1991 |1:
1992 | bgtlr // Already done if >=2^52, +-inf or nan.
1993 |.if mode == 2 // trunc(x):
1994 | rlwinm TMP1, CARG1, 0, 0, 0 // hi = sign(x)
1995 | li TMP0, 0
1996 | evmergelo CRET2, TMP1, TMP0
1997 |.else
1998 | rlwinm TMP2, CARG1, 0, 1, 31
1999 | srawi TMP0, CARG1, 31 // signmask = (int32_t)hi >> 31
2000 | or TMP2, TMP2, CARG2 // ztest = abs(hi) | lo
2001 | lus TMP1, 0x3ff0
2002 |.if mode == 0 // floor(x):
2003 | and. TMP2, TMP2, TMP0 // iszero = ((ztest & signmask) == 0)
2004 |.else // ceil(x):
2005 | andc. TMP2, TMP2, TMP0 // iszero = ((ztest & ~signmask) == 0)
2006 |.endif
2007 | li TMP0, 0
2008 | iseleq TMP1, r0, TMP1
2009 | rlwimi CARG1, TMP1, 0, 1, 31 // hi = sign(x) | (iszero ? 0.0 : 1.0)
2010 | evmergelo CRET2, CARG1, TMP0
2011 |.endif
2012 | blr
2013 |.endmacro
2014 |
2015 |->vm_floor: 1975 |->vm_floor:
2016 | mflr CARG3 1976 | b extern floor
2017 | bl ->vm_floor_hilo 1977 |->vm_ceil:
2018 | mtlr CARG3 1978 | b extern ceil
2019 | evmergehi CRET1, CRET2, CRET2 1979 |->vm_trunc:
2020 | blr
2021 |
2022 | vm_round vm_floor, 0
2023 | vm_round vm_ceil, 1
2024#if LJ_HASJIT 1980#if LJ_HASJIT
2025 | vm_round vm_trunc, 2 1981 | b extern trunc
2026#else
2027 |->vm_trunc_efd:
2028 |->vm_trunc_hilo:
2029#endif 1982#endif
2030 | 1983 |
2031 |->vm_powi: 1984 |->vm_powi:
@@ -2042,31 +1995,38 @@ static void build_subroutines(BuildCtx *ctx)
2042 |// Compute x op y for basic arithmetic operators (+ - * / % ^ and unary -) 1995 |// Compute x op y for basic arithmetic operators (+ - * / % ^ and unary -)
2043 |// and basic math functions. ORDER ARITH 1996 |// and basic math functions. ORDER ARITH
2044 |->vm_foldarith: 1997 |->vm_foldarith:
2045 | evmergelo CARG2, CARG1, CARG2 1998 | cmplwi CARG1, 1
2046 | cmplwi CARG5, 1 1999 | beq >1; bgt >2
2047 | evmergelo CARG4, CARG3, CARG4 2000 | fadd FARG1, FARG1, FARG2; blr
2048 | beq >1; bgt >2
2049 | efdadd CRET2, CARG2, CARG4; evmergehi CRET1, CRET2, CRET2; blr
2050 |1: 2001 |1:
2051 | efdsub CRET2, CARG2, CARG4; evmergehi CRET1, CRET2, CRET2; blr 2002 | fsub FARG1, FARG1, FARG2; blr
2052 |2: 2003 |2:
2053 | cmplwi CARG5, 3; beq >1; bgt >2 2004 | cmplwi CARG1, 3; beq >1; bgt >2
2054 | efdmul CRET2, CARG2, CARG4; evmergehi CRET1, CRET2, CRET2; blr 2005 | fmul FARG1, FARG1, FARG2; blr
2055 |1: 2006 |1:
2056 | efddiv CRET2, CARG2, CARG4; evmergehi CRET1, CRET2, CRET2; blr 2007 | fdiv FARG1, FARG1, FARG2; blr
2057 |2: 2008 |2:
2058 | cmplwi CARG5, 5; beq >1; bgt >2 2009 | cmplwi CARG1, 5; beq >1; bgt >2
2059 | evmr CARG3, CARG2; efddiv CRET2, CARG2, CARG4; evmr RB, CARG4 2010 | // NYI: Use internal implementation of floor and avoid spills.
2060 | mflr RC; bl ->vm_floor_efd; mtlr RC 2011 | stwu sp, -32(sp); stfd f14, 16(sp); stfd f15, 24(sp)
2061 | efdmul CRET2, CRET2, RB; efdsub CRET2, CARG3, CRET2 2012 | mflr r0
2062 | evmergehi CRET1, CRET2, CRET2; blr 2013 | fmr f14, FARG1
2014 | fdiv FARG1, FARG1, FARG2
2015 | stw r0, 36(sp)
2016 | fmr f15, FARG2
2017 | bl extern floor
2018 | lwz r0, 36(sp)
2019 | fmul FARG1, FARG1, f15
2020 | mtlr r0
2021 | fsub FARG1, f14, FARG1;
2022 | lfd f14, 16(sp); lfd f15, 24(sp); addi sp, sp, 32; blr
2063 |1: 2023 |1:
2064 | b extern pow 2024 | b extern pow
2065 |2: 2025 |2:
2066 | cmplwi CARG5, 7; beq >1; bgt >2 2026 | cmplwi CARG1, 7; beq >1; bgt >2
2067 | xoris CARG1, CARG1, 0x8000; blr 2027 | fneg FARG1, FARG1; blr
2068 |1: 2028 |1:
2069 | rlwinm CARG1, CARG1, 0, 1, 31; blr 2029 | fabs FARG1, FARG1; blr
2070 |2: 2030 |2:
2071 | NYI // Other operations only needed by JIT compiler. 2031 | NYI // Other operations only needed by JIT compiler.
2072 | 2032 |
@@ -2100,71 +2060,85 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2100 2060
2101 case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: 2061 case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
2102 | // RA = src1*8, RD = src2*8, JMP with RD = target 2062 | // RA = src1*8, RD = src2*8, JMP with RD = target
2103 | evlddx TMP0, BASE, RA 2063 | lwzx TMP0, BASE, RA
2104 | addi PC, PC, 4 2064 | addi PC, PC, 4
2105 | evlddx TMP1, BASE, RD 2065 | lfdx f0, BASE, RA
2106 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) 2066 | lwzx TMP1, BASE, RD
2067 | checknum cr0, TMP0
2107 | lwz TMP2, -4(PC) 2068 | lwz TMP2, -4(PC)
2108 | evmergehi RB, TMP0, TMP1 2069 | lfdx f1, BASE, RD
2070 | checknum cr1, TMP1
2109 | decode_RD4 TMP2, TMP2 2071 | decode_RD4 TMP2, TMP2
2110 | checknum RB 2072 | bge cr0, ->vmeta_comp
2111 | add TMP2, TMP2, TMP3 2073 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2112 | checkanyfail ->vmeta_comp 2074 | bge cr1, ->vmeta_comp
2113 | efdcmplt TMP0, TMP1 2075 | fcmpu cr0, f0, f1
2114 if (op == BC_ISLE || op == BC_ISGT) { 2076 if (op == BC_ISLT) {
2115 | efdcmpeq cr1, TMP0, TMP1 2077 | bge >1
2116 | cror 4*cr0+gt, 4*cr0+gt, 4*cr1+gt 2078 } else if (op == BC_ISGE) {
2117 } 2079 | blt >1
2118 if (op == BC_ISLT || op == BC_ISLE) { 2080 } else if (op == BC_ISLE) {
2119 | iselgt PC, TMP2, PC 2081 | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq
2082 | bge >1
2120 } else { 2083 } else {
2121 | iselgt PC, PC, TMP2 2084 | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq
2085 | blt >1
2122 } 2086 }
2087 | add PC, PC, TMP2
2088 |1:
2123 | ins_next 2089 | ins_next
2124 break; 2090 break;
2125 2091
2126 case BC_ISEQV: case BC_ISNEV: 2092 case BC_ISEQV: case BC_ISNEV:
2127 vk = op == BC_ISEQV; 2093 vk = op == BC_ISEQV;
2128 | // RA = src1*8, RD = src2*8, JMP with RD = target 2094 | // RA = src1*8, RD = src2*8, JMP with RD = target
2129 | evlddx CARG2, BASE, RA 2095 | lwzux TMP0, RA, BASE
2096 | lwz TMP2, 0(PC)
2097 | lfd f0, 0(RA)
2130 | addi PC, PC, 4 2098 | addi PC, PC, 4
2131 | evlddx CARG3, BASE, RD 2099 | lwzux TMP1, RD, BASE
2132 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) 2100 | checknum cr0, TMP0
2133 | lwz TMP2, -4(PC)
2134 | evmergehi RB, CARG2, CARG3
2135 | decode_RD4 TMP2, TMP2 2101 | decode_RD4 TMP2, TMP2
2136 | checknum RB 2102 | lfd f1, 0(RD)
2137 | add TMP2, TMP2, TMP3 2103 | checknum cr1, TMP1
2138 | checkanyfail >5 2104 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2139 | efdcmpeq CARG2, CARG3 2105 | bge cr0, >5
2106 | bge cr1, >5
2107 | fcmpu cr0, f0, f1
2140 if (vk) { 2108 if (vk) {
2141 | iselgt PC, TMP2, PC 2109 | bne >1
2110 | add PC, PC, TMP2
2142 } else { 2111 } else {
2143 | iselgt PC, PC, TMP2 2112 | beq >1
2113 | add PC, PC, TMP2
2144 } 2114 }
2145 |1: 2115 |1:
2146 | ins_next 2116 | ins_next
2147 | 2117 |
2148 |5: // Either or both types are not numbers. 2118 |5: // Either or both types are not numbers.
2149 | evcmpeq CARG2, CARG3 2119 | lwz CARG2, 4(RA)
2150 | not TMP3, RB 2120 | lwz CARG3, 4(RD)
2121 | not TMP3, TMP0
2122 | cmplw TMP0, TMP1
2151 | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? 2123 | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive?
2152 | crorc 4*cr7+lt, 4*cr0+so, 4*cr0+lt // 1: Same tv or different type.
2153 | cmplwi cr6, TMP3, ~LJ_TISTABUD // Table or userdata? 2124 | cmplwi cr6, TMP3, ~LJ_TISTABUD // Table or userdata?
2154 | crandc 4*cr7+gt, 4*cr0+lt, 4*cr1+gt // 2: Same type and primitive. 2125 | cmplw cr5, CARG2, CARG3
2126 | crandc 4*cr0+gt, 4*cr0+eq, 4*cr1+gt // 2: Same type and primitive.
2127 | crorc 4*cr0+lt, 4*cr5+eq, 4*cr0+eq // 1: Same tv or different type.
2128 | crand 4*cr0+eq, 4*cr0+eq, 4*cr5+eq // 0: Same type and same tv.
2155 | mr SAVE0, PC 2129 | mr SAVE0, PC
2130 | cror 4*cr0+eq, 4*cr0+eq, 4*cr0+gt // 0 or 2.
2131 | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+gt // 1 or 2.
2156 if (vk) { 2132 if (vk) {
2157 | isel PC, TMP2, PC, 4*cr7+gt 2133 | bne cr0, >6
2158 } else { 2134 | add PC, PC, TMP2
2159 | isel TMP2, PC, TMP2, 4*cr7+gt 2135 |6:
2160 }
2161 | cror 4*cr7+lt, 4*cr7+lt, 4*cr7+gt // 1 or 2.
2162 if (vk) {
2163 | isel PC, TMP2, PC, 4*cr0+so
2164 } else { 2136 } else {
2165 | isel PC, PC, TMP2, 4*cr0+so 2137 | beq cr0, >6
2138 | add PC, PC, TMP2
2139 |6:
2166 } 2140 }
2167 | blt cr7, <1 // Done if 1 or 2. 2141 | blt cr0, <1 // Done if 1 or 2.
2168 | blt cr6, <1 // Done if not tab/ud. 2142 | blt cr6, <1 // Done if not tab/ud.
2169 | 2143 |
2170 | // Different tables or userdatas. Need to check __eq metamethod. 2144 | // Different tables or userdatas. Need to check __eq metamethod.
@@ -2183,52 +2157,57 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2183 case BC_ISEQS: case BC_ISNES: 2157 case BC_ISEQS: case BC_ISNES:
2184 vk = op == BC_ISEQS; 2158 vk = op == BC_ISEQS;
2185 | // RA = src*8, RD = str_const*8 (~), JMP with RD = target 2159 | // RA = src*8, RD = str_const*8 (~), JMP with RD = target
2186 | evlddx TMP0, BASE, RA 2160 | lwzux TMP0, RA, BASE
2187 | srwi RD, RD, 1 2161 | srwi RD, RD, 1
2162 | lwz STR:TMP3, 4(RA)
2188 | lwz INS, 0(PC) 2163 | lwz INS, 0(PC)
2189 | subfic RD, RD, -4 2164 | subfic RD, RD, -4
2190 | addi PC, PC, 4 2165 | addi PC, PC, 4
2191 | lwzx STR:TMP1, KBASE, RD // KBASE-4-str_const*4 2166 | lwzx STR:TMP1, KBASE, RD // KBASE-4-str_const*4
2192 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) 2167 | subfic TMP0, TMP0, LJ_TSTR
2168 | sub TMP1, STR:TMP1, STR:TMP3
2169 | or TMP0, TMP0, TMP1
2193 | decode_RD4 TMP2, INS 2170 | decode_RD4 TMP2, INS
2194 | evmergelo STR:TMP1, TISSTR, STR:TMP1 2171 | subfic TMP0, TMP0, 0
2195 | add TMP2, TMP2, TMP3 2172 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2196 | evcmpeq TMP0, STR:TMP1 2173 | subfe TMP1, TMP1, TMP1
2197 if (vk) { 2174 if (vk) {
2198 | isel PC, TMP2, PC, 4*cr0+so 2175 | andc TMP2, TMP2, TMP1
2199 } else { 2176 } else {
2200 | isel PC, PC, TMP2, 4*cr0+so 2177 | and TMP2, TMP2, TMP1
2201 } 2178 }
2179 | add PC, PC, TMP2
2202 | ins_next 2180 | ins_next
2203 break; 2181 break;
2204 2182
2205 case BC_ISEQN: case BC_ISNEN: 2183 case BC_ISEQN: case BC_ISNEN:
2206 vk = op == BC_ISEQN; 2184 vk = op == BC_ISEQN;
2207 | // RA = src*8, RD = num_const*8, JMP with RD = target 2185 | // RA = src*8, RD = num_const*8, JMP with RD = target
2208 | evlddx TMP0, BASE, RA 2186 | lwzx TMP0, BASE, RA
2187 | lfdx f0, BASE, RA
2209 | addi PC, PC, 4 2188 | addi PC, PC, 4
2210 | evlddx TMP1, KBASE, RD 2189 | lfdx f1, KBASE, RD
2211 | addis TMP3, PC, -(BCBIAS_J*4 >> 16)
2212 | lwz INS, -4(PC) 2190 | lwz INS, -4(PC)
2213 | checknum TMP0 2191 | checknum TMP0; bge >5
2214 | checkfail >5 2192 | fcmpu cr0, f0, f1
2215 | efdcmpeq TMP0, TMP1
2216 |1:
2217 | decode_RD4 TMP2, INS 2193 | decode_RD4 TMP2, INS
2218 | add TMP2, TMP2, TMP3 2194 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2219 if (vk) { 2195 if (vk) {
2220 | iselgt PC, TMP2, PC 2196 | bne >5
2197 | add PC, PC, TMP2
2221 |5: 2198 |5:
2222 } else { 2199 } else {
2223 | iselgt PC, PC, TMP2 2200 | beq >2
2201 |1:
2202 | add PC, PC, TMP2
2203 |2:
2224 } 2204 }
2225 |3:
2226 | ins_next 2205 | ins_next
2227 if (!vk) { 2206 if (!vk) {
2228 |5: 2207 |5:
2229 | decode_RD4 TMP2, INS 2208 | decode_RD4 TMP2, INS
2230 | add PC, TMP2, TMP3 2209 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2231 | b <3 2210 | b <1
2232 } 2211 }
2233 break; 2212 break;
2234 2213
@@ -2238,17 +2217,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2238 | lwzx TMP0, BASE, RA 2217 | lwzx TMP0, BASE, RA
2239 | srwi TMP1, RD, 3 2218 | srwi TMP1, RD, 3
2240 | lwz INS, 0(PC) 2219 | lwz INS, 0(PC)
2241 | addi PC, PC, 4
2242 | not TMP1, TMP1 2220 | not TMP1, TMP1
2243 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) 2221 | addi PC, PC, 4
2244 | cmplw TMP0, TMP1 2222 | sub TMP0, TMP0, TMP1
2245 | decode_RD4 TMP2, INS 2223 | decode_RD4 TMP2, INS
2246 | add TMP2, TMP2, TMP3 2224 | addic TMP0, TMP0, -1
2225 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2226 | subfe TMP1, TMP1, TMP1
2247 if (vk) { 2227 if (vk) {
2248 | iseleq PC, TMP2, PC 2228 | and TMP2, TMP2, TMP1
2249 } else { 2229 } else {
2250 | iseleq PC, PC, TMP2 2230 | andc TMP2, TMP2, TMP1
2251 } 2231 }
2232 | add PC, PC, TMP2
2252 | ins_next 2233 | ins_next
2253 break; 2234 break;
2254 2235
@@ -2256,29 +2237,32 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2256 2237
2257 case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: 2238 case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
2258 | // RA = dst*8 or unused, RD = src*8, JMP with RD = target 2239 | // RA = dst*8 or unused, RD = src*8, JMP with RD = target
2259 | evlddx TMP0, BASE, RD 2240 | lwzx TMP0, BASE, RD
2260 | evaddw TMP1, TISNIL, TISNIL // Synthesize LJ_TFALSE.
2261 | lwz INS, 0(PC) 2241 | lwz INS, 0(PC)
2262 | evcmpltu TMP0, TMP1
2263 | addi PC, PC, 4 2242 | addi PC, PC, 4
2264 if (op == BC_IST || op == BC_ISF) { 2243 if (op == BC_IST || op == BC_ISF) {
2265 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) 2244 | subfic TMP0, TMP0, LJ_TTRUE
2266 | decode_RD4 TMP2, INS 2245 | decode_RD4 TMP2, INS
2267 | add TMP2, TMP2, TMP3 2246 | subfe TMP1, TMP1, TMP1
2247 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2268 if (op == BC_IST) { 2248 if (op == BC_IST) {
2269 | isellt PC, TMP2, PC 2249 | andc TMP2, TMP2, TMP1
2270 } else { 2250 } else {
2271 | isellt PC, PC, TMP2 2251 | and TMP2, TMP2, TMP1
2272 } 2252 }
2253 | add PC, PC, TMP2
2273 } else { 2254 } else {
2255 | li TMP1, LJ_TFALSE
2256 | lfdx f0, BASE, RD
2257 | cmplw TMP0, TMP1
2274 if (op == BC_ISTC) { 2258 if (op == BC_ISTC) {
2275 | checkfail >1 2259 | bge >1
2276 } else { 2260 } else {
2277 | checkok >1 2261 | blt >1
2278 } 2262 }
2279 | addis PC, PC, -(BCBIAS_J*4 >> 16) 2263 | addis PC, PC, -(BCBIAS_J*4 >> 16)
2280 | decode_RD4 TMP2, INS 2264 | decode_RD4 TMP2, INS
2281 | evstddx TMP0, BASE, RA 2265 | stfdx f0, BASE, RA
2282 | add PC, PC, TMP2 2266 | add PC, PC, TMP2
2283 |1: 2267 |1:
2284 } 2268 }
@@ -2290,8 +2274,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2290 case BC_MOV: 2274 case BC_MOV:
2291 | // RA = dst*8, RD = src*8 2275 | // RA = dst*8, RD = src*8
2292 | ins_next1 2276 | ins_next1
2293 | evlddx TMP0, BASE, RD 2277 | lfdx f0, BASE, RD
2294 | evstddx TMP0, BASE, RA 2278 | stfdx f0, BASE, RA
2295 | ins_next2 2279 | ins_next2
2296 break; 2280 break;
2297 case BC_NOT: 2281 case BC_NOT:
@@ -2305,28 +2289,28 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2305 break; 2289 break;
2306 case BC_UNM: 2290 case BC_UNM:
2307 | // RA = dst*8, RD = src*8 2291 | // RA = dst*8, RD = src*8
2308 | evlddx TMP0, BASE, RD 2292 | lwzux TMP1, RD, BASE
2309 | checknum TMP0 2293 | lwz TMP0, 4(RD)
2310 | checkfail ->vmeta_unm 2294 | checknum TMP1; bge ->vmeta_unm
2311 | efdneg TMP0, TMP0 2295 | xoris TMP1, TMP1, 0x8000
2312 | ins_next1 2296 | ins_next1
2313 | evstddx TMP0, BASE, RA 2297 | stwux TMP1, RA, BASE
2298 | stw TMP0, 4(RA)
2314 | ins_next2 2299 | ins_next2
2315 break; 2300 break;
2316 case BC_LEN: 2301 case BC_LEN:
2317 | // RA = dst*8, RD = src*8 2302 | // RA = dst*8, RD = src*8
2318 | evlddx CARG1, BASE, RD 2303 | lwzux TMP0, RD, BASE
2319 | checkstr CARG1 2304 | lwz CARG1, 4(RD)
2320 | checkfail >2 2305 | checkstr TMP0; bne >2
2321 | lwz CRET1, STR:CARG1->len 2306 | lwz CRET1, STR:CARG1->len
2322 |1: 2307 |1:
2308 | tonum_u f0, CRET1 // Result is a non-negative integer.
2323 | ins_next1 2309 | ins_next1
2324 | efdcfsi TMP0, CRET1 2310 | stfdx f0, BASE, RA
2325 | evstddx TMP0, BASE, RA
2326 | ins_next2 2311 | ins_next2
2327 |2: 2312 |2:
2328 | checktab CARG1 2313 | checktab TMP0; bne ->vmeta_len
2329 | checkfail ->vmeta_len
2330#ifdef LUAJIT_ENABLE_LUA52COMPAT 2314#ifdef LUAJIT_ENABLE_LUA52COMPAT
2331 | lwz TAB:TMP2, TAB:CARG1->metatable 2315 | lwz TAB:TMP2, TAB:CARG1->metatable
2332 | cmplwi TAB:TMP2, 0 2316 | cmplwi TAB:TMP2, 0
@@ -2353,72 +2337,77 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2353 ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); 2337 ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
2354 ||switch (vk) { 2338 ||switch (vk) {
2355 ||case 0: 2339 ||case 0:
2356 | evlddx t0, BASE, RB 2340 | lwzx CARG1, BASE, RB
2357 | checknum t0 2341 | lfdx t0, BASE, RB
2358 | evlddx t1, KBASE, RC 2342 | lfdx t1, KBASE, RC
2359 | checkfail ->vmeta_arith_vn 2343 | checknum CARG1; bge ->vmeta_arith_vn
2360 || break; 2344 || break;
2361 ||case 1: 2345 ||case 1:
2362 | evlddx t1, BASE, RB 2346 | lwzx CARG1, BASE, RB
2363 | checknum t1 2347 | lfdx t1, BASE, RB
2364 | evlddx t0, KBASE, RC 2348 | lfdx t0, KBASE, RC
2365 | checkfail ->vmeta_arith_nv 2349 | checknum CARG1; bge ->vmeta_arith_nv
2366 || break; 2350 || break;
2367 ||default: 2351 ||default:
2368 | evlddx t0, BASE, RB 2352 | lwzx CARG1, BASE, RB
2369 | evlddx t1, BASE, RC 2353 | lwzx CARG2, BASE, RC
2370 | evmergehi TMP2, t0, t1 2354 | lfdx t0, BASE, RB
2371 | checknum TMP2 2355 | lfdx t1, BASE, RC
2372 | checkanyfail ->vmeta_arith_vv 2356 | checknum cr0, CARG1
2357 | checknum cr1, CARG2
2358 | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt
2359 | bge ->vmeta_arith_vv
2373 || break; 2360 || break;
2374 ||} 2361 ||}
2375 |.endmacro 2362 |.endmacro
2376 | 2363 |
2377 |.macro ins_arith, ins 2364 |.macro ins_arith, ins
2378 | ins_arithpre TMP0, TMP1 2365 | ins_arithpre f0, f1
2379 | ins_next1 2366 | ins_next1
2380 | ins TMP0, TMP0, TMP1 2367 | ins f0, f0, f1
2381 | evstddx TMP0, BASE, RA 2368 | stfdx f0, BASE, RA
2382 | ins_next2 2369 | ins_next2
2383 |.endmacro 2370 |.endmacro
2384 2371
2385 case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: 2372 case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
2386 | ins_arith efdadd 2373 | ins_arith fadd
2387 break; 2374 break;
2388 case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: 2375 case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
2389 | ins_arith efdsub 2376 | ins_arith fsub
2390 break; 2377 break;
2391 case BC_MULVN: case BC_MULNV: case BC_MULVV: 2378 case BC_MULVN: case BC_MULNV: case BC_MULVV:
2392 | ins_arith efdmul 2379 | ins_arith fmul
2393 break; 2380 break;
2394 case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: 2381 case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
2395 | ins_arith efddiv 2382 | ins_arith fdiv
2396 break; 2383 break;
2397 case BC_MODVN: 2384 case BC_MODVN:
2398 | ins_arithpre RD, SAVE0 2385 | ins_arithpre f14, f15
2399 |->BC_MODVN_Z: 2386 |->BC_MODVN_Z:
2400 | efddiv CARG2, RD, SAVE0 2387 | fdiv FARG1, f14, f15
2401 | bl ->vm_floor_efd // floor(b/c) 2388 | // NYI: Use internal implementation of floor.
2402 | efdmul TMP0, CRET2, SAVE0 2389 | bl extern floor // floor(b/c)
2390 | fmul f0, FARG1, f15
2403 | ins_next1 2391 | ins_next1
2404 | efdsub TMP0, RD, TMP0 // b - floor(b/c)*c 2392 | fsub f0, f14, f0 // b - floor(b/c)*c
2405 | evstddx TMP0, BASE, RA 2393 | stfdx f0, BASE, RA
2406 | ins_next2 2394 | ins_next2
2407 break; 2395 break;
2408 case BC_MODNV: case BC_MODVV: 2396 case BC_MODNV: case BC_MODVV:
2409 | ins_arithpre RD, SAVE0 2397 | ins_arithpre f14, f15
2410 | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. 2398 | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway.
2411 break; 2399 break;
2412 case BC_POW: 2400 case BC_POW:
2413 | evlddx CARG2, BASE, RB 2401 | lwzx CARG1, BASE, RB
2414 | evlddx CARG4, BASE, RC 2402 | lfdx FARG1, BASE, RB
2415 | evmergehi CARG1, CARG4, CARG2 2403 | lwzx CARG2, BASE, RC
2416 | checknum CARG1 2404 | lfdx FARG2, BASE, RC
2417 | evmergehi CARG3, CARG4, CARG4 2405 | checknum cr0, CARG1
2418 | checkanyfail ->vmeta_arith_vv 2406 | checknum cr1, CARG2
2407 | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt
2408 | bge ->vmeta_arith_vv
2419 | bl extern pow 2409 | bl extern pow
2420 | evmergelo CRET2, CRET1, CRET2 2410 | stfdx FARG1, BASE, RA
2421 | evstddx CRET2, BASE, RA
2422 | ins_next 2411 | ins_next
2423 break; 2412 break;
2424 2413
@@ -2437,8 +2426,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2437 | cmplwi CRET1, 0 2426 | cmplwi CRET1, 0
2438 | lwz BASE, L->base 2427 | lwz BASE, L->base
2439 | bne ->vmeta_binop 2428 | bne ->vmeta_binop
2440 | evlddx TMP0, BASE, SAVE0 // Copy result from RB to RA. 2429 | lfdx f0, BASE, SAVE0 // Copy result from RB to RA.
2441 | evstddx TMP0, BASE, RA 2430 | stfdx f0, BASE, RA
2442 | ins_next 2431 | ins_next
2443 break; 2432 break;
2444 2433
@@ -2446,41 +2435,63 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2446 2435
2447 case BC_KSTR: 2436 case BC_KSTR:
2448 | // RA = dst*8, RD = str_const*8 (~) 2437 | // RA = dst*8, RD = str_const*8 (~)
2449 | ins_next1
2450 | srwi TMP1, RD, 1 2438 | srwi TMP1, RD, 1
2451 | subfic TMP1, TMP1, -4 2439 | subfic TMP1, TMP1, -4
2452 | lwzx TMP0, KBASE, TMP1 // KBASE-4-str_const*4 2440 | lwzx TMP0, KBASE, TMP1 // KBASE-4-str_const*4
2453 | evmergelo TMP0, TISSTR, TMP0 2441 | li TMP2, LJ_TSTR
2454 | evstddx TMP0, BASE, RA 2442 | ins_next1
2443 | stwux TMP2, RA, BASE
2444 | stw TMP0, 4(RA)
2455 | ins_next2 2445 | ins_next2
2456 break; 2446 break;
2457 case BC_KCDATA: 2447 case BC_KCDATA:
2458#if LJ_HASFFI 2448#if LJ_HASFFI
2459 | // RA = dst*8, RD = cdata_const*8 (~) 2449 | // RA = dst*8, RD = cdata_const*8 (~)
2460 | ins_next1
2461 | srwi TMP1, RD, 1 2450 | srwi TMP1, RD, 1
2462 | subfic TMP1, TMP1, -4 2451 | subfic TMP1, TMP1, -4
2463 | lwzx TMP0, KBASE, TMP1 // KBASE-4-cdata_const*4 2452 | lwzx TMP0, KBASE, TMP1 // KBASE-4-cdata_const*4
2464 | li TMP2, LJ_TCDATA 2453 | li TMP2, LJ_TCDATA
2465 | evmergelo TMP0, TMP2, TMP0 2454 | ins_next1
2466 | evstddx TMP0, BASE, RA 2455 | stwux TMP2, RA, BASE
2456 | stw TMP0, 4(RA)
2467 | ins_next2 2457 | ins_next2
2468#endif 2458#endif
2469 break; 2459 break;
2470 case BC_KSHORT: 2460 case BC_KSHORT:
2471 | // RA = dst*8, RD = int16_literal*8 2461 | // RA = dst*8, RD = int16_literal*8
2472 | srwi TMP1, RD, 3 2462 | // NYI: which approach is faster?
2473 | extsh TMP1, TMP1 2463 |.if 1
2464 | slwi RD, RD, 13
2465 | srawi RD, RD, 16
2466 | tonum_i f0, RD
2467 | ins_next1
2468 | stfdx f0, BASE, RA
2469 | ins_next2
2470 |.else
2471 | slwi RD, RD, 13
2472 | srawi TMP1, RD, 31
2473 | xor TMP2, TMP1, RD
2474 | sub TMP2, TMP2, TMP1 // TMP2 = abs(x)
2475 | cntlzw TMP3, TMP2
2476 | subfic TMP1, TMP3, 0x40d // TMP1 = exponent-1
2477 | slw TMP2, TMP2, TMP3 // TMP2 = left aligned mantissa
2478 | subfic TMP3, RD, 0
2479 | slwi TMP1, TMP1, 20
2480 | rlwimi RD, TMP2, 21, 1, 31 // hi = sign(x) | (mantissa>>11)
2481 | subfe TMP0, TMP0, TMP0
2482 | add RD, RD, TMP1 // hi = hi + exponent-1
2483 | and RD, RD, TMP0 // hi = x == 0 ? 0 : hi
2474 | ins_next1 2484 | ins_next1
2475 | efdcfsi TMP0, TMP1 2485 | stwux RD, RA, BASE
2476 | evstddx TMP0, BASE, RA 2486 | stw ZERO, 4(RA)
2477 | ins_next2 2487 | ins_next2
2488 |.endif
2478 break; 2489 break;
2479 case BC_KNUM: 2490 case BC_KNUM:
2480 | // RA = dst*8, RD = num_const*8 2491 | // RA = dst*8, RD = num_const*8
2481 | evlddx TMP0, KBASE, RD 2492 | lfdx f0, KBASE, RD
2482 | ins_next1 2493 | ins_next1
2483 | evstddx TMP0, BASE, RA 2494 | stfdx f0, BASE, RA
2484 | ins_next2 2495 | ins_next2
2485 break; 2496 break;
2486 case BC_KPRI: 2497 case BC_KPRI:
@@ -2493,10 +2504,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2493 break; 2504 break;
2494 case BC_KNIL: 2505 case BC_KNIL:
2495 | // RA = base*8, RD = end*8 2506 | // RA = base*8, RD = end*8
2496 | evstddx TISNIL, BASE, RA 2507 | stwx TISNIL, BASE, RA
2497 | addi RA, RA, 8 2508 | addi RA, RA, 8
2498 |1: 2509 |1:
2499 | evstddx TISNIL, BASE, RA 2510 | stwx TISNIL, BASE, RA
2500 | cmpw RA, RD 2511 | cmpw RA, RD
2501 | addi RA, RA, 8 2512 | addi RA, RA, 8
2502 | blt <1 2513 | blt <1
@@ -2513,8 +2524,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2513 | addi RD, RD, offsetof(GCfuncL, uvptr) 2524 | addi RD, RD, offsetof(GCfuncL, uvptr)
2514 | lwzx UPVAL:RB, LFUNC:RB, RD 2525 | lwzx UPVAL:RB, LFUNC:RB, RD
2515 | lwz TMP1, UPVAL:RB->v 2526 | lwz TMP1, UPVAL:RB->v
2516 | evldd TMP0, 0(TMP1) 2527 | lfd f0, 0(TMP1)
2517 | evstddx TMP0, BASE, RA 2528 | stfdx f0, BASE, RA
2518 | ins_next2 2529 | ins_next2
2519 break; 2530 break;
2520 case BC_USETV: 2531 case BC_USETV:
@@ -2522,15 +2533,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2522 | lwz LFUNC:RB, FRAME_FUNC(BASE) 2533 | lwz LFUNC:RB, FRAME_FUNC(BASE)
2523 | srwi RA, RA, 1 2534 | srwi RA, RA, 1
2524 | addi RA, RA, offsetof(GCfuncL, uvptr) 2535 | addi RA, RA, offsetof(GCfuncL, uvptr)
2525 | evlddx TMP1, BASE, RD 2536 | lfdux f0, RD, BASE
2526 | lwzx UPVAL:RB, LFUNC:RB, RA 2537 | lwzx UPVAL:RB, LFUNC:RB, RA
2527 | lbz TMP3, UPVAL:RB->marked 2538 | lbz TMP3, UPVAL:RB->marked
2528 | lwz CARG2, UPVAL:RB->v 2539 | lwz CARG2, UPVAL:RB->v
2529 | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) 2540 | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv)
2530 | lbz TMP0, UPVAL:RB->closed 2541 | lbz TMP0, UPVAL:RB->closed
2531 | evmergehi TMP2, TMP1, TMP1 2542 | lwz TMP2, 0(RD)
2532 | evstdd TMP1, 0(CARG2) 2543 | stfd f0, 0(CARG2)
2533 | cmplwi cr1, TMP0, 0 2544 | cmplwi cr1, TMP0, 0
2545 | lwz TMP1, 4(RD)
2534 | cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq 2546 | cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq
2535 | subi TMP2, TMP2, (LJ_TISNUM+1) 2547 | subi TMP2, TMP2, (LJ_TISNUM+1)
2536 | bne >2 // Upvalue is closed and black? 2548 | bne >2 // Upvalue is closed and black?
@@ -2558,13 +2570,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2558 | addi RA, RA, offsetof(GCfuncL, uvptr) 2570 | addi RA, RA, offsetof(GCfuncL, uvptr)
2559 | lwzx STR:TMP1, KBASE, TMP1 // KBASE-4-str_const*4 2571 | lwzx STR:TMP1, KBASE, TMP1 // KBASE-4-str_const*4
2560 | lwzx UPVAL:RB, LFUNC:RB, RA 2572 | lwzx UPVAL:RB, LFUNC:RB, RA
2561 | evmergelo STR:TMP1, TISSTR, STR:TMP1
2562 | lbz TMP3, UPVAL:RB->marked 2573 | lbz TMP3, UPVAL:RB->marked
2563 | lwz CARG2, UPVAL:RB->v 2574 | lwz CARG2, UPVAL:RB->v
2564 | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) 2575 | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv)
2565 | lbz TMP3, STR:TMP1->marked 2576 | lbz TMP3, STR:TMP1->marked
2566 | lbz TMP2, UPVAL:RB->closed 2577 | lbz TMP2, UPVAL:RB->closed
2567 | evstdd STR:TMP1, 0(CARG2) 2578 | li TMP0, LJ_TSTR
2579 | stw STR:TMP1, 4(CARG2)
2580 | stw TMP0, 0(CARG2)
2568 | bne >2 2581 | bne >2
2569 |1: 2582 |1:
2570 | ins_next2 2583 | ins_next2
@@ -2585,10 +2598,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2585 | lwz LFUNC:RB, FRAME_FUNC(BASE) 2598 | lwz LFUNC:RB, FRAME_FUNC(BASE)
2586 | srwi RA, RA, 1 2599 | srwi RA, RA, 1
2587 | addi RA, RA, offsetof(GCfuncL, uvptr) 2600 | addi RA, RA, offsetof(GCfuncL, uvptr)
2588 | evlddx TMP0, KBASE, RD 2601 | lfdx f0, KBASE, RD
2589 | lwzx UPVAL:RB, LFUNC:RB, RA 2602 | lwzx UPVAL:RB, LFUNC:RB, RA
2590 | lwz TMP1, UPVAL:RB->v 2603 | lwz TMP1, UPVAL:RB->v
2591 | evstdd TMP0, 0(TMP1) 2604 | stfd f0, 0(TMP1)
2592 | ins_next2 2605 | ins_next2
2593 break; 2606 break;
2594 case BC_USETP: 2607 case BC_USETP:
@@ -2633,8 +2646,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2633 | bl extern lj_func_newL_gc 2646 | bl extern lj_func_newL_gc
2634 | // Returns GCfuncL *. 2647 | // Returns GCfuncL *.
2635 | lwz BASE, L->base 2648 | lwz BASE, L->base
2636 | evmergelo LFUNC:CRET1, TISFUNC, LFUNC:CRET1 2649 | li TMP0, LJ_TFUNC
2637 | evstddx LFUNC:CRET1, BASE, RA 2650 | stwux TMP0, RA, BASE
2651 | stw LFUNC:CRET1, 4(RA)
2638 | ins_next 2652 | ins_next
2639 break; 2653 break;
2640 2654
@@ -2654,9 +2668,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2654 if (op == BC_TNEW) { 2668 if (op == BC_TNEW) {
2655 | rlwinm CARG2, RD, 29, 21, 31 2669 | rlwinm CARG2, RD, 29, 21, 31
2656 | rlwinm CARG3, RD, 18, 27, 31 2670 | rlwinm CARG3, RD, 18, 27, 31
2657 | cmpwi CARG2, 0x7ff 2671 | cmpwi CARG2, 0x7ff; beq >3
2658 | li TMP1, 0x801 2672 |2:
2659 | iseleq CARG2, TMP1, CARG2
2660 | bl extern lj_tab_new // (lua_State *L, int32_t asize, uint32_t hbits) 2673 | bl extern lj_tab_new // (lua_State *L, int32_t asize, uint32_t hbits)
2661 | // Returns Table *. 2674 | // Returns Table *.
2662 } else { 2675 } else {
@@ -2667,9 +2680,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2667 | // Returns Table *. 2680 | // Returns Table *.
2668 } 2681 }
2669 | lwz BASE, L->base 2682 | lwz BASE, L->base
2670 | evmergelo TAB:CRET1, TISTAB, TAB:CRET1 2683 | li TMP0, LJ_TTAB
2671 | evstddx TAB:CRET1, BASE, RA 2684 | stwux TMP0, RA, BASE
2685 | stw TAB:CRET1, 4(RA)
2672 | ins_next 2686 | ins_next
2687 if (op == BC_TNEW) {
2688 |3:
2689 | li CARG2, 0x801
2690 | b <2
2691 }
2673 |5: 2692 |5:
2674 | mr SAVE0, RD 2693 | mr SAVE0, RD
2675 | bl extern lj_gc_step_fixtop // (lua_State *L) 2694 | bl extern lj_gc_step_fixtop // (lua_State *L)
@@ -2696,28 +2715,34 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2696 2715
2697 case BC_TGETV: 2716 case BC_TGETV:
2698 | // RA = dst*8, RB = table*8, RC = key*8 2717 | // RA = dst*8, RB = table*8, RC = key*8
2699 | evlddx TAB:RB, BASE, RB 2718 | lwzux CARG1, RB, BASE
2700 | evlddx RC, BASE, RC 2719 | lwzux CARG2, RC, BASE
2701 | checktab TAB:RB 2720 | lwz TAB:RB, 4(RB)
2702 | checkfail ->vmeta_tgetv 2721 | lfd f0, 0(RC)
2703 | checknum RC 2722 | checktab CARG1
2704 | checkfail >5 2723 | checknum cr1, CARG2
2705 | // Convert number key to integer 2724 | bne ->vmeta_tgetv
2706 | efdctsi TMP2, RC 2725 | bge cr1, >5
2726 | // Convert number key to integer, check for integerness and range.
2727 | fctiwz f1, f0
2728 | fadd f2, f0, TOBIT
2729 | stfd f1, TMPD
2707 | lwz TMP0, TAB:RB->asize 2730 | lwz TMP0, TAB:RB->asize
2708 | efdcfsi TMP1, TMP2 2731 | fsub f2, f2, TOBIT
2709 | cmplw cr0, TMP0, TMP2 2732 | lwz TMP2, TMPD_LO
2710 | efdcmpeq cr1, RC, TMP1
2711 | lwz TMP1, TAB:RB->array 2733 | lwz TMP1, TAB:RB->array
2712 | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+gt 2734 | fcmpu cr1, f0, f2
2735 | cmplw cr0, TMP0, TMP2
2736 | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq
2713 | slwi TMP2, TMP2, 3 2737 | slwi TMP2, TMP2, 3
2714 | ble ->vmeta_tgetv // Integer key and in array part? 2738 | ble ->vmeta_tgetv // Integer key and in array part?
2715 | evlddx TMP1, TMP1, TMP2 2739 | lwzx TMP0, TMP1, TMP2
2716 | checknil TMP1 2740 | lfdx f14, TMP1, TMP2
2717 | checkok >2 2741 | checknil TMP0; beq >2
2718 |1: 2742 |1:
2719 | evstddx TMP1, BASE, RA 2743 | ins_next1
2720 | ins_next 2744 | stfdx f14, BASE, RA
2745 | ins_next2
2721 | 2746 |
2722 |2: // Check for __index if table value is nil. 2747 |2: // Check for __index if table value is nil.
2723 | lwz TAB:TMP2, TAB:RB->metatable 2748 | lwz TAB:TMP2, TAB:RB->metatable
@@ -2729,38 +2754,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2729 | b ->vmeta_tgetv 2754 | b ->vmeta_tgetv
2730 | 2755 |
2731 |5: 2756 |5:
2732 | checkstr STR:RC // String key? 2757 | checkstr CARG2; bne ->vmeta_tgetv
2733 | checkok ->BC_TGETS_Z 2758 | lwz STR:RC, 4(RC)
2734 | b ->vmeta_tgetv 2759 | b ->BC_TGETS_Z // String key?
2735 break; 2760 break;
2736 case BC_TGETS: 2761 case BC_TGETS:
2737 | // RA = dst*8, RB = table*8, RC = str_const*8 (~) 2762 | // RA = dst*8, RB = table*8, RC = str_const*8 (~)
2738 | evlddx TAB:RB, BASE, RB 2763 | lwzux CARG1, RB, BASE
2739 | srwi TMP1, RC, 1 2764 | srwi TMP1, RC, 1
2740 | checktab TAB:RB 2765 | lwz TAB:RB, 4(RB)
2741 | subfic TMP1, TMP1, -4 2766 | subfic TMP1, TMP1, -4
2767 | checktab CARG1
2742 | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 2768 | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4
2743 | checkfail ->vmeta_tgets1 2769 | bne ->vmeta_tgets1
2744 |->BC_TGETS_Z: 2770 |->BC_TGETS_Z:
2745 | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8 2771 | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8
2746 | lwz TMP0, TAB:RB->hmask 2772 | lwz TMP0, TAB:RB->hmask
2747 | lwz TMP1, STR:RC->hash 2773 | lwz TMP1, STR:RC->hash
2748 | lwz NODE:TMP2, TAB:RB->node 2774 | lwz NODE:TMP2, TAB:RB->node
2749 | evmergelo STR:RC, TISSTR, STR:RC
2750 | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask 2775 | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask
2751 | slwi TMP0, TMP1, 5 2776 | slwi TMP0, TMP1, 5
2752 | slwi TMP1, TMP1, 3 2777 | slwi TMP1, TMP1, 3
2753 | sub TMP1, TMP0, TMP1 2778 | sub TMP1, TMP0, TMP1
2754 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) 2779 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8)
2755 |1: 2780 |1:
2756 | evldd TMP0, NODE:TMP2->key 2781 | lwz CARG1, NODE:TMP2->key
2757 | evldd TMP1, NODE:TMP2->val 2782 | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)
2758 | evcmpeq TMP0, STR:RC 2783 | lwz CARG2, NODE:TMP2->val
2759 | checkanyfail >4 2784 | lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2)
2760 | checknil TMP1 2785 | checkstr CARG1; bne >4
2761 | checkok >5 // Key found, but nil value? 2786 | cmpw TMP0, STR:RC; bne >4
2787 | checknil CARG2; beq >5 // Key found, but nil value?
2762 |3: 2788 |3:
2763 | evstddx TMP1, BASE, RA 2789 | stwux CARG2, RA, BASE
2790 | stw TMP1, 4(RA)
2764 | ins_next 2791 | ins_next
2765 | 2792 |
2766 |4: // Follow hash chain. 2793 |4: // Follow hash chain.
@@ -2768,7 +2795,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2768 | cmplwi NODE:TMP2, 0 2795 | cmplwi NODE:TMP2, 0
2769 | bne <1 2796 | bne <1
2770 | // End of hash chain: key not found, nil result. 2797 | // End of hash chain: key not found, nil result.
2771 | evmr TMP1, TISNIL 2798 | li CARG2, LJ_TNIL
2772 | 2799 |
2773 |5: // Check for __index if table value is nil. 2800 |5: // Check for __index if table value is nil.
2774 | lwz TAB:TMP2, TAB:RB->metatable 2801 | lwz TAB:TMP2, TAB:RB->metatable
@@ -2781,20 +2808,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2781 break; 2808 break;
2782 case BC_TGETB: 2809 case BC_TGETB:
2783 | // RA = dst*8, RB = table*8, RC = index*8 2810 | // RA = dst*8, RB = table*8, RC = index*8
2784 | evlddx TAB:RB, BASE, RB 2811 | lwzux CARG1, RB, BASE
2812 | lwz TAB:RB, 4(RB)
2785 | srwi TMP0, RC, 3 2813 | srwi TMP0, RC, 3
2786 | checktab TAB:RB 2814 | checktab CARG1; bne ->vmeta_tgetb
2787 | checkfail ->vmeta_tgetb
2788 | lwz TMP1, TAB:RB->asize 2815 | lwz TMP1, TAB:RB->asize
2789 | lwz TMP2, TAB:RB->array 2816 | lwz TMP2, TAB:RB->array
2790 | cmplw TMP0, TMP1 2817 | cmplw TMP0, TMP1; bge ->vmeta_tgetb
2791 | bge ->vmeta_tgetb 2818 | lwzx TMP1, TMP2, RC
2792 | evlddx TMP1, TMP2, RC 2819 | lfdx f0, TMP2, RC
2793 | checknil TMP1 2820 | checknil TMP1; beq >5
2794 | checkok >5
2795 |1: 2821 |1:
2796 | ins_next1 2822 | ins_next1
2797 | evstddx TMP1, BASE, RA 2823 | stfdx f0, BASE, RA
2798 | ins_next2 2824 | ins_next2
2799 | 2825 |
2800 |5: // Check for __index if table value is nil. 2826 |5: // Check for __index if table value is nil.
@@ -2809,30 +2835,34 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2809 2835
2810 case BC_TSETV: 2836 case BC_TSETV:
2811 | // RA = src*8, RB = table*8, RC = key*8 2837 | // RA = src*8, RB = table*8, RC = key*8
2812 | evlddx TAB:RB, BASE, RB 2838 | lwzux CARG1, RB, BASE
2813 | evlddx RC, BASE, RC 2839 | lwzux CARG2, RC, BASE
2814 | checktab TAB:RB 2840 | lwz TAB:RB, 4(RB)
2815 | checkfail ->vmeta_tsetv 2841 | lfd f0, 0(RC)
2816 | checknum RC 2842 | checktab CARG1
2817 | checkfail >5 2843 | checknum cr1, CARG2
2818 | // Convert number key to integer 2844 | bne ->vmeta_tsetv
2819 | efdctsi TMP2, RC 2845 | bge cr1, >5
2820 | evlddx SAVE0, BASE, RA 2846 | // Convert number key to integer, check for integerness and range.
2847 | fctiwz f1, f0
2848 | fadd f2, f0, TOBIT
2849 | stfd f1, TMPD
2821 | lwz TMP0, TAB:RB->asize 2850 | lwz TMP0, TAB:RB->asize
2822 | efdcfsi TMP1, TMP2 2851 | fsub f2, f2, TOBIT
2823 | cmplw cr0, TMP0, TMP2 2852 | lwz TMP2, TMPD_LO
2824 | efdcmpeq cr1, RC, TMP1
2825 | lwz TMP1, TAB:RB->array 2853 | lwz TMP1, TAB:RB->array
2826 | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+gt 2854 | fcmpu cr1, f0, f2
2855 | cmplw cr0, TMP0, TMP2
2856 | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq
2827 | slwi TMP0, TMP2, 3 2857 | slwi TMP0, TMP2, 3
2828 | ble ->vmeta_tsetv // Integer key and in array part? 2858 | ble ->vmeta_tsetv // Integer key and in array part?
2829 | lbz TMP3, TAB:RB->marked 2859 | lwzx TMP2, TMP1, TMP0
2830 | evlddx TMP2, TMP1, TMP0 2860 | lbz TMP3, TAB:RB->marked
2831 | checknil TMP2 2861 | lfdx f14, BASE, RA
2832 | checkok >3 2862 | checknil TMP2; beq >3
2833 |1: 2863 |1:
2834 | andi. TMP2, TMP3, LJ_GC_BLACK // isblack(table) 2864 | andi. TMP2, TMP3, LJ_GC_BLACK // isblack(table)
2835 | evstddx SAVE0, TMP1, TMP0 2865 | stfdx f14, TMP1, TMP0
2836 | bne >7 2866 | bne >7
2837 |2: 2867 |2:
2838 | ins_next 2868 | ins_next
@@ -2847,46 +2877,55 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2847 | b ->vmeta_tsetv 2877 | b ->vmeta_tsetv
2848 | 2878 |
2849 |5: 2879 |5:
2850 | checkstr STR:RC // String key? 2880 | checkstr CARG2; bne ->vmeta_tsetv
2851 | checkok ->BC_TSETS_Z 2881 | lwz STR:RC, 4(RC)
2852 | b ->vmeta_tsetv 2882 | b ->BC_TSETS_Z // String key?
2853 | 2883 |
2854 |7: // Possible table write barrier for the value. Skip valiswhite check. 2884 |7: // Possible table write barrier for the value. Skip valiswhite check.
2855 | barrierback TAB:RB, TMP3, TMP0 2885 | barrierback TAB:RB, TMP3, TMP0
2856 | b <2 2886 | b <2
2857 break; 2887 break;
2888 |1:
2889 | checkstr CARG1; bne >4
2890 | cmpw TMP0, STR:RC; bne >4
2891 | checknil CARG2; beq >5 // Key found, but nil value?
2892 |3:
2893 | stwux CARG2, RA, BASE
2894 | stw TMP1, 4(RA)
2895 | ins_next
2858 case BC_TSETS: 2896 case BC_TSETS:
2859 | // RA = src*8, RB = table*8, RC = str_const*8 (~) 2897 | // RA = src*8, RB = table*8, RC = str_const*8 (~)
2860 | evlddx TAB:RB, BASE, RB 2898 | lwzux CARG1, RB, BASE
2861 | srwi TMP1, RC, 1 2899 | srwi TMP1, RC, 1
2862 | checktab TAB:RB 2900 | lwz TAB:RB, 4(RB)
2863 | subfic TMP1, TMP1, -4 2901 | subfic TMP1, TMP1, -4
2902 | checktab CARG1
2864 | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 2903 | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4
2865 | checkfail ->vmeta_tsets1 2904 | bne ->vmeta_tsets1
2866 |->BC_TSETS_Z: 2905 |->BC_TSETS_Z:
2867 | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = src*8 2906 | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = src*8
2868 | lwz TMP0, TAB:RB->hmask 2907 | lwz TMP0, TAB:RB->hmask
2869 | lwz TMP1, STR:RC->hash 2908 | lwz TMP1, STR:RC->hash
2870 | lwz NODE:TMP2, TAB:RB->node 2909 | lwz NODE:TMP2, TAB:RB->node
2871 | evmergelo STR:RC, TISSTR, STR:RC
2872 | stb ZERO, TAB:RB->nomm // Clear metamethod cache. 2910 | stb ZERO, TAB:RB->nomm // Clear metamethod cache.
2873 | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask 2911 | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask
2874 | evlddx SAVE0, BASE, RA 2912 | lfdx f14, BASE, RA
2875 | slwi TMP0, TMP1, 5 2913 | slwi TMP0, TMP1, 5
2876 | slwi TMP1, TMP1, 3 2914 | slwi TMP1, TMP1, 3
2877 | sub TMP1, TMP0, TMP1 2915 | sub TMP1, TMP0, TMP1
2878 | lbz TMP3, TAB:RB->marked 2916 | lbz TMP3, TAB:RB->marked
2879 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) 2917 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8)
2880 |1: 2918 |1:
2881 | evldd TMP0, NODE:TMP2->key 2919 | lwz CARG1, NODE:TMP2->key
2882 | evldd TMP1, NODE:TMP2->val 2920 | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)
2883 | evcmpeq TMP0, STR:RC 2921 | lwz CARG2, NODE:TMP2->val
2884 | checkanyfail >5 2922 | lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2)
2885 | checknil TMP1 2923 | checkstr CARG1; bne >5
2886 | checkok >4 // Key found, but nil value? 2924 | cmpw TMP0, STR:RC; bne >5
2925 | checknil CARG2; beq >4 // Key found, but nil value?
2887 |2: 2926 |2:
2888 | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) 2927 | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table)
2889 | evstdd SAVE0, NODE:TMP2->val 2928 | stfd f14, NODE:TMP2->val
2890 | bne >7 2929 | bne >7
2891 |3: 2930 |3:
2892 | ins_next 2931 | ins_next
@@ -2918,12 +2957,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2918 | andi. TMP0, TMP0, 1<<MM_newindex 2957 | andi. TMP0, TMP0, 1<<MM_newindex
2919 | beq ->vmeta_tsets // 'no __newindex' flag NOT set: check. 2958 | beq ->vmeta_tsets // 'no __newindex' flag NOT set: check.
2920 |6: 2959 |6:
2921 | mr CARG2, TAB:RB 2960 | li TMP0, LJ_TSTR
2922 | evstdd STR:RC, 0(CARG3) 2961 | stw STR:RC, 4(CARG3)
2962 | mr CARG2, TAB:RB
2963 | stw TMP0, 0(CARG3)
2923 | bl extern lj_tab_newkey // (lua_State *L, GCtab *t, TValue *k) 2964 | bl extern lj_tab_newkey // (lua_State *L, GCtab *t, TValue *k)
2924 | // Returns TValue *. 2965 | // Returns TValue *.
2925 | lwz BASE, L->base 2966 | lwz BASE, L->base
2926 | evstdd SAVE0, 0(CRET1) 2967 | stfd f14, 0(CRET1)
2927 | b <3 // No 2nd write barrier needed. 2968 | b <3 // No 2nd write barrier needed.
2928 | 2969 |
2929 |7: // Possible table write barrier for the value. Skip valiswhite check. 2970 |7: // Possible table write barrier for the value. Skip valiswhite check.
@@ -2932,22 +2973,21 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2932 break; 2973 break;
2933 case BC_TSETB: 2974 case BC_TSETB:
2934 | // RA = src*8, RB = table*8, RC = index*8 2975 | // RA = src*8, RB = table*8, RC = index*8
2935 | evlddx TAB:RB, BASE, RB 2976 | lwzux CARG1, RB, BASE
2977 | lwz TAB:RB, 4(RB)
2936 | srwi TMP0, RC, 3 2978 | srwi TMP0, RC, 3
2937 | checktab TAB:RB 2979 | checktab CARG1; bne ->vmeta_tsetb
2938 | checkfail ->vmeta_tsetb
2939 | lwz TMP1, TAB:RB->asize 2980 | lwz TMP1, TAB:RB->asize
2940 | lwz TMP2, TAB:RB->array 2981 | lwz TMP2, TAB:RB->array
2941 | lbz TMP3, TAB:RB->marked 2982 | lbz TMP3, TAB:RB->marked
2942 | cmplw TMP0, TMP1 2983 | cmplw TMP0, TMP1
2943 | evlddx SAVE0, BASE, RA 2984 | lfdx f14, BASE, RA
2944 | bge ->vmeta_tsetb 2985 | bge ->vmeta_tsetb
2945 | evlddx TMP1, TMP2, RC 2986 | lwzx TMP1, TMP2, RC
2946 | checknil TMP1 2987 | checknil TMP1; beq >5
2947 | checkok >5
2948 |1: 2988 |1:
2949 | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) 2989 | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table)
2950 | evstddx SAVE0, TMP2, RC 2990 | stfdx f14, TMP2, RC
2951 | bne >7 2991 | bne >7
2952 |2: 2992 |2:
2953 | ins_next 2993 | ins_next
@@ -2987,10 +3027,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2987 | add TMP1, TMP1, TMP0 3027 | add TMP1, TMP1, TMP0
2988 | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) 3028 | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table)
2989 |3: // Copy result slots to table. 3029 |3: // Copy result slots to table.
2990 | evldd TMP0, 0(RA) 3030 | lfd f0, 0(RA)
2991 | addi RA, RA, 8 3031 | addi RA, RA, 8
2992 | cmpw cr1, RA, TMP2 3032 | cmpw cr1, RA, TMP2
2993 | evstdd TMP0, 0(TMP1) 3033 | stfd f0, 0(TMP1)
2994 | addi TMP1, TMP1, 8 3034 | addi TMP1, TMP1, 8
2995 | blt cr1, <3 3035 | blt cr1, <3
2996 | bne >7 3036 | bne >7
@@ -3021,13 +3061,12 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3021 break; 3061 break;
3022 case BC_CALL: 3062 case BC_CALL:
3023 | // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8 3063 | // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8
3024 | evlddx LFUNC:RB, BASE, RA 3064 | mr TMP2, BASE
3025 | mr TMP2, BASE 3065 | lwzux TMP0, BASE, RA
3026 | add BASE, BASE, RA 3066 | lwz LFUNC:RB, 4(BASE)
3027 | subi NARGS8:RC, NARGS8:RC, 8 3067 | subi NARGS8:RC, NARGS8:RC, 8
3028 | checkfunc LFUNC:RB
3029 | addi BASE, BASE, 8 3068 | addi BASE, BASE, 8
3030 | checkfail ->vmeta_call 3069 | checkfunc TMP0; bne ->vmeta_call
3031 | ins_call 3070 | ins_call
3032 break; 3071 break;
3033 3072
@@ -3038,13 +3077,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3038 break; 3077 break;
3039 case BC_CALLT: 3078 case BC_CALLT:
3040 | // RA = base*8, (RB = 0,) RC = (nargs+1)*8 3079 | // RA = base*8, (RB = 0,) RC = (nargs+1)*8
3041 | evlddx LFUNC:RB, BASE, RA 3080 | lwzux TMP0, RA, BASE
3042 | add RA, BASE, RA 3081 | lwz LFUNC:RB, 4(RA)
3043 | lwz TMP1, FRAME_PC(BASE)
3044 | subi NARGS8:RC, NARGS8:RC, 8 3082 | subi NARGS8:RC, NARGS8:RC, 8
3045 | checkfunc LFUNC:RB 3083 | lwz TMP1, FRAME_PC(BASE)
3084 | checkfunc TMP0
3046 | addi RA, RA, 8 3085 | addi RA, RA, 8
3047 | checkfail ->vmeta_callt 3086 | bne ->vmeta_callt
3048 |->BC_CALLT_Z: 3087 |->BC_CALLT_Z:
3049 | andi. TMP0, TMP1, FRAME_TYPE // Caveat: preserve cr0 until the crand. 3088 | andi. TMP0, TMP1, FRAME_TYPE // Caveat: preserve cr0 until the crand.
3050 | lbz TMP3, LFUNC:RB->ffid 3089 | lbz TMP3, LFUNC:RB->ffid
@@ -3058,9 +3097,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3058 | beq cr1, >3 3097 | beq cr1, >3
3059 |2: 3098 |2:
3060 | addi TMP3, TMP2, 8 3099 | addi TMP3, TMP2, 8
3061 | evlddx TMP0, RA, TMP2 3100 | lfdx f0, RA, TMP2
3062 | cmplw cr1, TMP3, NARGS8:RC 3101 | cmplw cr1, TMP3, NARGS8:RC
3063 | evstddx TMP0, BASE, TMP2 3102 | stfdx f0, BASE, TMP2
3064 | mr TMP2, TMP3 3103 | mr TMP2, TMP3
3065 | bne cr1, <2 3104 | bne cr1, <2
3066 |3: 3105 |3:
@@ -3089,19 +3128,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3089 3128
3090 case BC_ITERC: 3129 case BC_ITERC:
3091 | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8)) 3130 | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8))
3092 | subi RA, RA, 24 // evldd doesn't support neg. offsets. 3131 | mr TMP2, BASE
3093 | mr TMP2, BASE 3132 | add BASE, BASE, RA
3094 | evlddx LFUNC:RB, BASE, RA 3133 | lwz TMP1, -24(BASE)
3095 | add BASE, BASE, RA 3134 | lwz LFUNC:RB, -20(BASE)
3096 | evldd TMP0, 8(BASE) 3135 | lfd f1, -8(BASE)
3097 | evldd TMP1, 16(BASE) 3136 | lfd f0, -16(BASE)
3098 | evstdd LFUNC:RB, 24(BASE) // Copy callable. 3137 | stw TMP1, 0(BASE) // Copy callable.
3099 | checkfunc LFUNC:RB 3138 | stw LFUNC:RB, 4(BASE)
3100 | evstdd TMP0, 32(BASE) // Copy state. 3139 | checkfunc TMP1
3140 | stfd f1, 16(BASE) // Copy control var.
3101 | li NARGS8:RC, 16 // Iterators get 2 arguments. 3141 | li NARGS8:RC, 16 // Iterators get 2 arguments.
3102 | evstdd TMP1, 40(BASE) // Copy control var. 3142 | stfdu f0, 8(BASE) // Copy state.
3103 | addi BASE, BASE, 32 3143 | bne ->vmeta_call
3104 | checkfail ->vmeta_call
3105 | ins_call 3144 | ins_call
3106 break; 3145 break;
3107 3146
@@ -3120,18 +3159,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3120 | cmplw RC, TMP0 3159 | cmplw RC, TMP0
3121 | slwi TMP3, RC, 3 3160 | slwi TMP3, RC, 3
3122 | bge >5 // Index points after array part? 3161 | bge >5 // Index points after array part?
3123 | evlddx TMP2, TMP1, TMP3 3162 | lwzx TMP2, TMP1, TMP3
3163 | lfdx f0, TMP1, TMP3
3124 | checknil TMP2 3164 | checknil TMP2
3125 | lwz INS, -4(PC) 3165 | lwz INS, -4(PC)
3126 | checkok >4 3166 | beq >4
3127 | efdcfsi TMP0, RC 3167 | tonum_u f1, RC
3128 | addi RC, RC, 1 3168 | addi RC, RC, 1
3129 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) 3169 | addis TMP3, PC, -(BCBIAS_J*4 >> 16)
3130 | evstdd TMP2, 8(RA) 3170 | stfd f0, 8(RA)
3131 | decode_RD4 TMP1, INS 3171 | decode_RD4 TMP1, INS
3132 | stw RC, -4(RA) // Update control var. 3172 | stw RC, -4(RA) // Update control var.
3133 | add PC, TMP1, TMP3 3173 | add PC, TMP1, TMP3
3134 | evstdd TMP0, 0(RA) 3174 | stfd f1, 0(RA)
3135 |3: 3175 |3:
3136 | ins_next 3176 | ins_next
3137 | 3177 |
@@ -3149,17 +3189,18 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3149 | bgt <3 3189 | bgt <3
3150 | slwi RB, RC, 3 3190 | slwi RB, RC, 3
3151 | sub TMP3, TMP3, RB 3191 | sub TMP3, TMP3, RB
3152 | evlddx RB, TMP2, TMP3 3192 | lwzx RB, TMP2, TMP3
3193 | lfdx f0, TMP2, TMP3
3153 | add NODE:TMP3, TMP2, TMP3 3194 | add NODE:TMP3, TMP2, TMP3
3154 | checknil RB 3195 | checknil RB
3155 | lwz INS, -4(PC) 3196 | lwz INS, -4(PC)
3156 | checkok >7 3197 | beq >7
3157 | evldd TMP3, NODE:TMP3->key 3198 | lfd f1, NODE:TMP3->key
3158 | addis TMP2, PC, -(BCBIAS_J*4 >> 16) 3199 | addis TMP2, PC, -(BCBIAS_J*4 >> 16)
3159 | evstdd RB, 8(RA) 3200 | stfd f0, 8(RA)
3160 | add RC, RC, TMP0 3201 | add RC, RC, TMP0
3161 | decode_RD4 TMP1, INS 3202 | decode_RD4 TMP1, INS
3162 | evstdd TMP3, 0(RA) 3203 | stfd f1, 0(RA)
3163 | addi RC, RC, 1 3204 | addi RC, RC, 1
3164 | add PC, TMP1, TMP2 3205 | add PC, TMP1, TMP2
3165 | stw RC, -4(RA) // Update control var. 3206 | stw RC, -4(RA) // Update control var.
@@ -3173,11 +3214,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3173 case BC_ISNEXT: 3214 case BC_ISNEXT:
3174 | // RA = base*8, RD = target (points to ITERN) 3215 | // RA = base*8, RD = target (points to ITERN)
3175 | add RA, BASE, RA 3216 | add RA, BASE, RA
3176 | li TMP2, -24 3217 | lwz TMP0, -24(RA)
3177 | evlddx CFUNC:TMP1, RA, TMP2 3218 | lwz CFUNC:TMP1, -20(RA)
3178 | lwz TMP2, -16(RA) 3219 | lwz TMP2, -16(RA)
3179 | lwz TMP3, -8(RA) 3220 | lwz TMP3, -8(RA)
3180 | evmergehi TMP0, CFUNC:TMP1, CFUNC:TMP1
3181 | cmpwi cr0, TMP2, LJ_TTAB 3221 | cmpwi cr0, TMP2, LJ_TTAB
3182 | cmpwi cr1, TMP0, LJ_TFUNC 3222 | cmpwi cr1, TMP0, LJ_TFUNC
3183 | cmpwi cr6, TMP3, LJ_TNIL 3223 | cmpwi cr6, TMP3, LJ_TNIL
@@ -3218,16 +3258,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3218 | subi TMP2, TMP2, 16 3258 | subi TMP2, TMP2, 16
3219 | ble >2 // No vararg slots? 3259 | ble >2 // No vararg slots?
3220 |1: // Copy vararg slots to destination slots. 3260 |1: // Copy vararg slots to destination slots.
3221 | evldd TMP0, 0(RC) 3261 | lfd f0, 0(RC)
3222 | addi RC, RC, 8 3262 | addi RC, RC, 8
3223 | evstdd TMP0, 0(RA) 3263 | stfd f0, 0(RA)
3224 | cmplw RA, TMP2 3264 | cmplw RA, TMP2
3225 | cmplw cr1, RC, TMP3 3265 | cmplw cr1, RC, TMP3
3226 | bge >3 // All destination slots filled? 3266 | bge >3 // All destination slots filled?
3227 | addi RA, RA, 8 3267 | addi RA, RA, 8
3228 | blt cr1, <1 // More vararg slots? 3268 | blt cr1, <1 // More vararg slots?
3229 |2: // Fill up remainder with nil. 3269 |2: // Fill up remainder with nil.
3230 | evstdd TISNIL, 0(RA) 3270 | stw TISNIL, 0(RA)
3231 | cmplw RA, TMP2 3271 | cmplw RA, TMP2
3232 | addi RA, RA, 8 3272 | addi RA, RA, 8
3233 | blt <2 3273 | blt <2
@@ -3243,9 +3283,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3243 | addi MULTRES, TMP1, 8 3283 | addi MULTRES, TMP1, 8
3244 | bgt >7 3284 | bgt >7
3245 |6: 3285 |6:
3246 | evldd TMP0, 0(RC) 3286 | lfd f0, 0(RC)
3247 | addi RC, RC, 8 3287 | addi RC, RC, 8
3248 | evstdd TMP0, 0(RA) 3288 | stfd f0, 0(RA)
3249 | cmplw RC, TMP3 3289 | cmplw RC, TMP3
3250 | addi RA, RA, 8 3290 | addi RA, RA, 8
3251 | blt <6 // More vararg slots? 3291 | blt <6 // More vararg slots?
@@ -3296,14 +3336,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3296 | li TMP1, 0 3336 | li TMP1, 0
3297 |2: 3337 |2:
3298 | addi TMP3, TMP1, 8 3338 | addi TMP3, TMP1, 8
3299 | evlddx TMP0, RA, TMP1 3339 | lfdx f0, RA, TMP1
3300 | cmpw TMP3, RC 3340 | cmpw TMP3, RC
3301 | evstddx TMP0, TMP2, TMP1 3341 | stfdx f0, TMP2, TMP1
3302 | beq >3 3342 | beq >3
3303 | addi TMP1, TMP3, 8 3343 | addi TMP1, TMP3, 8
3304 | evlddx TMP0, RA, TMP3 3344 | lfdx f1, RA, TMP3
3305 | cmpw TMP1, RC 3345 | cmpw TMP1, RC
3306 | evstddx TMP0, TMP2, TMP3 3346 | stfdx f1, TMP2, TMP3
3307 | bne <2 3347 | bne <2
3308 |3: 3348 |3:
3309 |5: 3349 |5:
@@ -3320,7 +3360,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3320 |6: // Fill up results with nil. 3360 |6: // Fill up results with nil.
3321 | subi TMP1, RD, 8 3361 | subi TMP1, RD, 8
3322 | addi RD, RD, 8 3362 | addi RD, RD, 8
3323 | evstddx TISNIL, TMP2, TMP1 3363 | stwx TISNIL, TMP2, TMP1
3324 | b <5 3364 | b <5
3325 | 3365 |
3326 |->BC_RETV_Z: // Non-standard return case. 3366 |->BC_RETV_Z: // Non-standard return case.
@@ -3345,8 +3385,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3345 | subi TMP2, BASE, 8 3385 | subi TMP2, BASE, 8
3346 | decode_RB8 RB, INS 3386 | decode_RB8 RB, INS
3347 if (op == BC_RET1) { 3387 if (op == BC_RET1) {
3348 | evldd TMP0, 0(RA) 3388 | lfd f0, 0(RA)
3349 | evstdd TMP0, 0(TMP2) 3389 | stfd f0, 0(TMP2)
3350 } 3390 }
3351 |5: 3391 |5:
3352 | cmplw RB, RD 3392 | cmplw RB, RD
@@ -3362,7 +3402,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3362 |6: // Fill up results with nil. 3402 |6: // Fill up results with nil.
3363 | subi TMP1, RD, 8 3403 | subi TMP1, RD, 8
3364 | addi RD, RD, 8 3404 | addi RD, RD, 8
3365 | evstddx TISNIL, TMP2, TMP1 3405 | stwx TISNIL, TMP2, TMP1
3366 | b <5 3406 | b <5
3367 break; 3407 break;
3368 3408
@@ -3384,47 +3424,62 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3384 case BC_IFORL: 3424 case BC_IFORL:
3385 | // RA = base*8, RD = target (after end of loop or start of loop) 3425 | // RA = base*8, RD = target (after end of loop or start of loop)
3386 vk = (op == BC_IFORL || op == BC_JFORL); 3426 vk = (op == BC_IFORL || op == BC_JFORL);
3387 | add RA, BASE, RA
3388 | evldd TMP1, FORL_IDX*8(RA)
3389 | evldd TMP3, FORL_STEP*8(RA)
3390 | evldd TMP2, FORL_STOP*8(RA)
3391 if (!vk) {
3392 | evcmpgtu cr0, TMP1, TISNUM
3393 | evcmpgtu cr7, TMP3, TISNUM
3394 | evcmpgtu cr1, TMP2, TISNUM
3395 | cror 4*cr0+lt, 4*cr0+lt, 4*cr7+lt
3396 | cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt
3397 | blt ->vmeta_for
3398 }
3399 if (vk) { 3427 if (vk) {
3400 | efdadd TMP1, TMP1, TMP3 3428 | lfdux f1, RA, BASE
3401 | evstdd TMP1, FORL_IDX*8(RA) 3429 | lfd f3, FORL_STEP*8(RA)
3430 | lfd f2, FORL_STOP*8(RA)
3431 | lwz TMP3, FORL_STEP*8(RA)
3432 | fadd f1, f1, f3
3433 | stfd f1, FORL_IDX*8(RA)
3434 } else {
3435 | lwzux TMP1, RA, BASE
3436 | lfd f1, FORL_IDX*8(RA)
3437 | lwz TMP3, FORL_STEP*8(RA)
3438 | lfd f3, FORL_STEP*8(RA)
3439 | lwz TMP2, FORL_STOP*8(RA)
3440 | lfd f2, FORL_STOP*8(RA)
3441 | cmplw cr0, TMP1, TISNUM
3442 | cmplw cr7, TMP3, TISNUM
3443 | cmplw cr1, TMP2, TISNUM
3444 | crand 4*cr0+lt, 4*cr0+lt, 4*cr7+lt
3445 | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt
3446 | bge ->vmeta_for
3402 } 3447 }
3403 | evcmpgts TMP3, TISNIL 3448 | cmpwi cr3, TMP3, 0
3404 | evstdd TMP1, FORL_EXT*8(RA)
3405 | bge >2
3406 | efdcmpgt TMP1, TMP2
3407 |1:
3408 if (op != BC_JFORL) { 3449 if (op != BC_JFORL) {
3409 | srwi RD, RD, 1 3450 | srwi RD, RD, 1
3451 }
3452 | stfd f1, FORL_EXT*8(RA)
3453 if (op != BC_JFORL) {
3410 | add RD, PC, RD 3454 | add RD, PC, RD
3411 if (op == BC_JFORI) {
3412 | addis PC, RD, -(BCBIAS_J*4 >> 16)
3413 } else {
3414 | addis RD, RD, -(BCBIAS_J*4 >> 16)
3415 }
3416 } 3455 }
3456 | fcmpu cr0, f1, f2
3457 if (op == BC_JFORI) {
3458 | addis PC, RD, -(BCBIAS_J*4 >> 16)
3459 }
3460 | blt cr3, >5
3417 if (op == BC_FORI) { 3461 if (op == BC_FORI) {
3418 | iselgt PC, RD, PC 3462 | bgt >3
3419 } else if (op == BC_IFORL) { 3463 } else if (op == BC_IFORL) {
3420 | iselgt PC, PC, RD 3464 | bgt >2
3465 |1:
3466 | addis PC, RD, -(BCBIAS_J*4 >> 16)
3421 } else { 3467 } else {
3422 | ble =>BC_JLOOP 3468 | ble =>BC_JLOOP
3423 } 3469 }
3424 | ins_next
3425 |2: 3470 |2:
3426 | efdcmpgt TMP2, TMP1 3471 | ins_next
3427 | b <1 3472 |5: // Negative step.
3473 if (op == BC_FORI) {
3474 | bge <2
3475 |3:
3476 | addis PC, RD, -(BCBIAS_J*4 >> 16)
3477 } else if (op == BC_IFORL) {
3478 | bge <1
3479 } else {
3480 | bge =>BC_JLOOP
3481 }
3482 | b <2
3428 break; 3483 break;
3429 3484
3430 case BC_ITERL: 3485 case BC_ITERL:
@@ -3440,15 +3495,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3440#endif 3495#endif
3441 case BC_IITERL: 3496 case BC_IITERL:
3442 | // RA = base*8, RD = target 3497 | // RA = base*8, RD = target
3443 | evlddx TMP1, BASE, RA 3498 | lwzux TMP1, RA, BASE
3444 | subi RA, RA, 8 3499 | lwz TMP2, 4(RA)
3445 | checknil TMP1 3500 | checknil TMP1; beq >1 // Stop if iterator returned nil.
3446 | checkok >1 // Stop if iterator returned nil.
3447 if (op == BC_JITERL) { 3501 if (op == BC_JITERL) {
3448 | NYI 3502 | NYI
3449 } else { 3503 } else {
3450 | branch_RD // Otherwise save control var + branch. 3504 | branch_RD // Otherwise save control var + branch.
3451 | evstddx TMP1, BASE, RA 3505 | stw TMP1, -8(RA)
3506 | stw TMP2, -4(RA)
3452 } 3507 }
3453 |1: 3508 |1:
3454 | ins_next 3509 | ins_next
@@ -3514,7 +3569,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3514 } 3569 }
3515 | 3570 |
3516 |3: // Clear missing parameters. 3571 |3: // Clear missing parameters.
3517 | evstddx TISNIL, BASE, NARGS8:RC 3572 | stwx TISNIL, BASE, NARGS8:RC
3518 | addi NARGS8:RC, NARGS8:RC, 8 3573 | addi NARGS8:RC, NARGS8:RC, 8
3519 | b <2 3574 | b <2
3520 break; 3575 break;
@@ -3546,20 +3601,22 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3546 | beq >3 3601 | beq >3
3547 |1: 3602 |1:
3548 | cmplw RA, RC // Less args than parameters? 3603 | cmplw RA, RC // Less args than parameters?
3549 | evldd TMP0, 0(RA) 3604 | lwz TMP0, 0(RA)
3605 | lwz TMP3, 4(RA)
3550 | bge >4 3606 | bge >4
3551 | evstdd TISNIL, 0(RA) // Clear old fixarg slot (help the GC). 3607 | stw TISNIL, 0(RA) // Clear old fixarg slot (help the GC).
3552 | addi RA, RA, 8 3608 | addi RA, RA, 8
3553 |2: 3609 |2:
3554 | addic. TMP2, TMP2, -1 3610 | addic. TMP2, TMP2, -1
3555 | evstdd TMP0, 8(TMP1) 3611 | stw TMP0, 8(TMP1)
3612 | stw TMP3, 12(TMP1)
3556 | addi TMP1, TMP1, 8 3613 | addi TMP1, TMP1, 8
3557 | bne <1 3614 | bne <1
3558 |3: 3615 |3:
3559 | ins_next2 3616 | ins_next2
3560 | 3617 |
3561 |4: // Clear missing parameters. 3618 |4: // Clear missing parameters.
3562 | evmr TMP0, TISNIL 3619 | li TMP0, LJ_TNIL
3563 | b <2 3620 | b <2
3564 break; 3621 break;
3565 3622
diff --git a/src/buildvm_ppc.h b/src/buildvm_ppc.h
index 0a33c11c..b5d80346 100644
--- a/src/buildvm_ppc.h
+++ b/src/buildvm_ppc.h
@@ -1 +1,6686 @@
1/* Placeholder file. */ 1/*
2** This file has been pre-processed with DynASM.
3** http://luajit.org/dynasm.html
4** DynASM version 1.3.0, DynASM ppc version 1.3.0
5** DO NOT EDIT! The original file is in "buildvm_ppc.dasc".
6*/
7
8#if DASM_VERSION != 10300
9#error "Version mismatch between DynASM and included encoding engine"
10#endif
11
12#define DASM_SECTION_CODE_OP 0
13#define DASM_SECTION_CODE_SUB 1
14#define DASM_MAXSECTION 2
15static const unsigned int build_actionlist[5561] = {
160x00010001,
170x00060014,
180x72000000,
190x00090200,
200x39000000,
210x00098200,
220x41820000,
230x00050815,
240x8209fff8,
250x7d2e4b78,
260x9514fff8,
270x00060016,
280x72000000,
290x00090200,
300x398c0008,
310x7d936378,
320x41820000,
330x00050817,
340x00060018,
350x2c000000,
360x00098200,
370x56090038,
380x38000000,
390x00098200,
400x7d297050,
410x40820000,
420x00050814,
430x350cfff8,
440x91320000,
450x00098200,
460x81210018,
470x39cefff8,
480x90110000,
490x00098200,
500x55291800,
510x000900a1,
520x41820000,
530x00050802,
540x0006000b,
550x3508fff8,
560xc8140000,
570x3a940008,
580xd80e0000,
590x39ce0008,
600x40820000,
610x0005080b,
620x0006000c,
630x7c096000,
640x40820000,
650x00050806,
660x0006000d,
670x91d20000,
680x00098200,
690x00060019,
700x00000000,
710x80010014,
720x38600000,
730x90120000,
740x00098200,
750x0006001a,
760x80010104,
770x81c10000,
780x00098200,
790xc9c10000,
800x00098200,
810x81e10000,
820x00098200,
830xc9e10000,
840x00098200,
850x82010000,
860x00098200,
870xca010000,
880x00098200,
890x82210000,
900x00098200,
910xca210000,
920x00098200,
930x82410000,
940x00098200,
950xca410000,
960x00098200,
970x82610000,
980x00098200,
990xca610000,
1000x00098200,
1010x7c0803a6,
1020x82810000,
1030x00098200,
1040xca810000,
1050x00098200,
1060x82a10000,
1070x00098200,
1080xcaa10000,
1090x00098200,
1100x82c10000,
1110x00098200,
1120xcac10000,
1130x00098200,
1140x82e10000,
1150x00098200,
1160xcae10000,
1170x00098200,
1180x00000000,
1190x83010000,
1200x00098200,
1210xcb010000,
1220x00098200,
1230x83210000,
1240x00098200,
1250xcb210000,
1260x00098200,
1270x83410000,
1280x00098200,
1290xcb410000,
1300x00098200,
1310x83610000,
1320x00098200,
1330xcb610000,
1340x00098200,
1350x83810000,
1360x00098200,
1370xcb810000,
1380x00098200,
1390x83a10000,
1400x00098200,
1410xcba10000,
1420x00098200,
1430x83c10000,
1440x00098200,
1450xcbc10000,
1460x00098200,
1470x83e10000,
1480x00098200,
1490xcbe10000,
1500x00098200,
1510x38210100,
1520x4e800020,
1530x00060010,
1540x40810000,
1550x00050807,
1560x81120000,
1570x00098200,
1580x7c0e4040,
1590x40800000,
1600x00050808,
1610x92ee0000,
1620x398c0008,
1630x39ce0008,
1640x48000000,
1650x0005000c,
1660x00060011,
1670x00000000,
1680x20c90000,
1690x7c096050,
1700x7d084110,
1710x7c004038,
1720x7dc07050,
1730x48000000,
1740x0005000d,
1750x00060012,
1760x91d20000,
1770x00098200,
1780x7d956378,
1790x7d244b78,
1800x7e439378,
1810x48000001,
1820x00030000,
1830x81210018,
1840x7eacab78,
1850x55291800,
1860x000900a1,
1870x81d20000,
1880x00098200,
1890x48000000,
1900x0005000c,
1910x0006001b,
1920x7c611b78,
1930x7c832378,
1940x0006001c,
1950x82410010,
1960x38000000,
1970x00098200,
1980x81120000,
1990x00098200,
2000x90080000,
2010x00098200,
2020x48000000,
2030x0005001a,
2040x0006001d,
2050x5461003a,
2060x0006001e,
2070x82410010,
2080x3ac00000,
2090x00098200,
2100x81d20000,
2110x00098200,
2120x3cc059c0,
2130x82320000,
2140x00098200,
2150x3b000000,
2160x90c10008,
2170x39000000,
2180x00098200,
2190x60c60004,
2200x3ae00000,
2210x00098200,
2220x38000000,
2230x00098200,
2240xc3c10008,
2250x820efff8,
2260x3a8efff8,
2270x90c10008,
2280x3a310000,
2290x00098200,
2300x00000000,
2310x91140000,
2320x39800010,
2330x90110000,
2340x00098200,
2350xc3e10008,
2360x48000000,
2370x00050016,
2380x0006001f,
2390x38800000,
2400x00098200,
2410x48000000,
2420x00050002,
2430x00060020,
2440x7d6e5a14,
2450x7e8ea050,
2460x91d20000,
2470x00098200,
2480x3a100004,
2490x91720000,
2500x00098200,
2510x568400fe,
2520x000900ab,
2530x0006000c,
2540x92010008,
2550x7e439378,
2560x48000001,
2570x00030000,
2580x81d20000,
2590x00098200,
2600x81720000,
2610x00098200,
2620x814efffc,
2630x7d6e5850,
2640x820a0000,
2650x00098200,
2660x80f00000,
2670x3a100004,
2680x54e815ba,
2690x54f4dd78,
2700x7c11402e,
2710x7e947214,
2720x7c0903a6,
2730x4e800420,
2740x00060021,
2750x9421ff00,
2760x91c10000,
2770x00098200,
2780xd9c10000,
2790x00098200,
2800x91e10000,
2810x00098200,
2820xd9e10000,
2830x00098200,
2840x92010000,
2850x00098200,
2860xda010000,
2870x00098200,
2880x92210000,
2890x00098200,
2900x00000000,
2910xda210000,
2920x00098200,
2930x92410000,
2940x00098200,
2950xda410000,
2960x00098200,
2970x92610000,
2980x00098200,
2990xda610000,
3000x00098200,
3010x7c0802a6,
3020x92810000,
3030x00098200,
3040xda810000,
3050x00098200,
3060x92a10000,
3070x00098200,
3080xdaa10000,
3090x00098200,
3100x92c10000,
3110x00098200,
3120xdac10000,
3130x00098200,
3140x92e10000,
3150x00098200,
3160xdae10000,
3170x00098200,
3180x93010000,
3190x00098200,
3200xdb010000,
3210x00098200,
3220x93210000,
3230x00098200,
3240xdb210000,
3250x00098200,
3260x90010104,
3270x93410000,
3280x00098200,
3290xdb410000,
3300x00098200,
3310x93610000,
3320x00098200,
3330xdb610000,
3340x00098200,
3350x93810000,
3360x00098200,
3370x00000000,
3380xdb810000,
3390x00098200,
3400x93a10000,
3410x00098200,
3420xdba10000,
3430x00098200,
3440x93c10000,
3450x00098200,
3460xdbc10000,
3470x00098200,
3480x93e10000,
3490x00098200,
3500xdbe10000,
3510x00098200,
3520x7c721b78,
3530x82320000,
3540x00098200,
3550x7c8e2378,
3560x89120000,
3570x00098200,
3580x92410010,
3590x3a000000,
3600x00098200,
3610x38010000,
3620x00098200,
3630x3a310000,
3640x00098200,
3650x90a10018,
3660x28080000,
3670x90a1001c,
3680x90120000,
3690x00098200,
3700x90a10014,
3710x90610008,
3720x41820000,
3730x00050803,
3740x7dd47378,
3750x81d20000,
3760x00098200,
3770x3ac00000,
3780x00098200,
3790x81120000,
3800x00098200,
3810x820efff8,
3820x3cc059c0,
3830x7d8e4050,
3840x98b20000,
3850x00098200,
3860x90c10008,
3870x72000000,
3880x00090200,
3890x60c60004,
3900xc3c10008,
3910x3b000000,
3920x90c10008,
3930x398c0008,
3940x3c004338,
3950x7d936378,
3960x90010020,
3970x38000000,
3980x00098200,
3990xc3e10008,
4000x3ae00000,
4010x00098200,
4020x90110000,
4030x00098200,
4040x00000000,
4050x41820000,
4060x00050817,
4070x48000000,
4080x00050018,
4090x00060022,
4100x9421ff00,
4110x91c10000,
4120x00098200,
4130xd9c10000,
4140x00098200,
4150x91e10000,
4160x00098200,
4170xd9e10000,
4180x00098200,
4190x92010000,
4200x00098200,
4210xda010000,
4220x00098200,
4230x92210000,
4240x00098200,
4250xda210000,
4260x00098200,
4270x92410000,
4280x00098200,
4290xda410000,
4300x00098200,
4310x92610000,
4320x00098200,
4330xda610000,
4340x00098200,
4350x7c0802a6,
4360x92810000,
4370x00098200,
4380xda810000,
4390x00098200,
4400x92a10000,
4410x00098200,
4420xdaa10000,
4430x00098200,
4440x92c10000,
4450x00098200,
4460xdac10000,
4470x00098200,
4480x92e10000,
4490x00098200,
4500x00000000,
4510xdae10000,
4520x00098200,
4530x93010000,
4540x00098200,
4550xdb010000,
4560x00098200,
4570x93210000,
4580x00098200,
4590xdb210000,
4600x00098200,
4610x90010104,
4620x93410000,
4630x00098200,
4640xdb410000,
4650x00098200,
4660x93610000,
4670x00098200,
4680xdb610000,
4690x00098200,
4700x93810000,
4710x00098200,
4720xdb810000,
4730x00098200,
4740x93a10000,
4750x00098200,
4760xdba10000,
4770x00098200,
4780x93c10000,
4790x00098200,
4800xdbc10000,
4810x00098200,
4820x93e10000,
4830x00098200,
4840xdbe10000,
4850x00098200,
4860x3a000000,
4870x00098200,
4880x90c1001c,
4890x48000000,
4900x00050001,
4910x00060023,
4920x9421ff00,
4930x91c10000,
4940x00098200,
4950xd9c10000,
4960x00098200,
4970x00000000,
4980x91e10000,
4990x00098200,
5000xd9e10000,
5010x00098200,
5020x92010000,
5030x00098200,
5040xda010000,
5050x00098200,
5060x92210000,
5070x00098200,
5080xda210000,
5090x00098200,
5100x92410000,
5110x00098200,
5120xda410000,
5130x00098200,
5140x92610000,
5150x00098200,
5160xda610000,
5170x00098200,
5180x7c0802a6,
5190x92810000,
5200x00098200,
5210xda810000,
5220x00098200,
5230x92a10000,
5240x00098200,
5250xdaa10000,
5260x00098200,
5270x92c10000,
5280x00098200,
5290xdac10000,
5300x00098200,
5310x92e10000,
5320x00098200,
5330xdae10000,
5340x00098200,
5350x93010000,
5360x00098200,
5370xdb010000,
5380x00098200,
5390x93210000,
5400x00098200,
5410xdb210000,
5420x00098200,
5430x00000000,
5440x90010104,
5450x93410000,
5460x00098200,
5470xdb410000,
5480x00098200,
5490x93610000,
5500x00098200,
5510xdb610000,
5520x00098200,
5530x93810000,
5540x00098200,
5550xdb810000,
5560x00098200,
5570x93a10000,
5580x00098200,
5590xdba10000,
5600x00098200,
5610x93c10000,
5620x00098200,
5630xdbc10000,
5640x00098200,
5650x93e10000,
5660x00098200,
5670xdbe10000,
5680x00098200,
5690x3a000000,
5700x00098200,
5710x0006000b,
5720x81030000,
5730x00098200,
5740x90a10018,
5750x7c721b78,
5760x90610010,
5770x7c8e2378,
5780x90320000,
5790x00098200,
5800x82320000,
5810x00098200,
5820x90610008,
5830x91010014,
5840x3a310000,
5850x00098200,
5860x0006000d,
5870x81320000,
5880x00098200,
5890x3ac00000,
5900x00098200,
5910x81120000,
5920x00098200,
5930x00000000,
5940x3cc059c0,
5950x7e107214,
5960x90c10008,
5970x3b000000,
5980x60c60004,
5990xc3c10008,
6000x7e098050,
6010x90c10008,
6020x3c004338,
6030x7d6e4050,
6040x90010020,
6050x38000000,
6060x00098200,
6070xc3e10008,
6080x3ae00000,
6090x00098200,
6100x90110000,
6110x00098200,
6120x00060024,
6130x800efff8,
6140x814efffc,
6150x2c000000,
6160x00098200,
6170x40820000,
6180x00050825,
6190x00060026,
6200x920efff8,
6210x820a0000,
6220x00098200,
6230x80f00000,
6240x3a100004,
6250x54e815ba,
6260x54f4dd78,
6270x7c11402e,
6280x7e947214,
6290x7c0903a6,
6300x4e800420,
6310x00060027,
6320x9421ff00,
6330x91c10000,
6340x00098200,
6350xd9c10000,
6360x00098200,
6370x91e10000,
6380x00098200,
6390xd9e10000,
6400x00098200,
6410x92010000,
6420x00098200,
6430xda010000,
6440x00098200,
6450x92210000,
6460x00098200,
6470xda210000,
6480x00098200,
6490x92410000,
6500x00098200,
6510xda410000,
6520x00098200,
6530x92610000,
6540x00098200,
6550xda610000,
6560x00098200,
6570x7c0802a6,
6580x92810000,
6590x00098200,
6600x00000000,
6610xda810000,
6620x00098200,
6630x92a10000,
6640x00098200,
6650xdaa10000,
6660x00098200,
6670x92c10000,
6680x00098200,
6690xdac10000,
6700x00098200,
6710x92e10000,
6720x00098200,
6730xdae10000,
6740x00098200,
6750x93010000,
6760x00098200,
6770xdb010000,
6780x00098200,
6790x93210000,
6800x00098200,
6810xdb210000,
6820x00098200,
6830x90010104,
6840x93410000,
6850x00098200,
6860xdb410000,
6870x00098200,
6880x93610000,
6890x00098200,
6900xdb610000,
6910x00098200,
6920x93810000,
6930x00098200,
6940xdb810000,
6950x00098200,
6960x93a10000,
6970x00098200,
6980xdba10000,
6990x00098200,
7000x93c10000,
7010x00098200,
7020xdbc10000,
7030x00098200,
7040x93e10000,
7050x00098200,
7060x00000000,
7070xdbe10000,
7080x00098200,
7090x7c721b78,
7100x80030000,
7110x00098200,
7120x90610010,
7130x81120000,
7140x00098200,
7150x90610008,
7160x7c080050,
7170x81120000,
7180x00098200,
7190x90320000,
7200x00098200,
7210x39200000,
7220x90010018,
7230x9121001c,
7240x91010014,
7250x7cc903a6,
7260x4e800421,
7270x7c6e1b79,
7280x82320000,
7290x00098200,
7300x3a000000,
7310x00098200,
7320x3a310000,
7330x00098200,
7340x40820000,
7350x0005080d,
7360x48000000,
7370x00050019,
7380x00060015,
7390x800efff4,
7400x7dca7378,
7410x7d2e4b78,
7420x8109fffc,
7430x28000000,
7440x820afff0,
7450x41820000,
7460x00050801,
7470x392cfff8,
7480x81080000,
7490x00098200,
7500x7ef4492e,
7510x81e80000,
7520x00098200,
7530x7c0903a6,
7540x4e800420,
7550x0006000b,
7560x390afff0,
7570x7d6e4050,
7580x48000000,
7590x00050028,
7600x00060029,
7610x80f0fffc,
7620x388afff0,
7630x54f55d78,
7640xc8140000,
7650x7d0eaa14,
7660x91d20000,
7670x00098200,
7680x7c082040,
7690x7ca82050,
7700x54f4dd78,
7710xd8040000,
7720x40820000,
7730x0005082a,
7740x7c0ea5ae,
7750x48000000,
7760x0005002b,
7770x0006002c,
7780x38b10000,
7790x00098200,
7800x00000000,
7810x38000000,
7820x00098200,
7830x54ea5d78,
7840x91650004,
7850x7c8e5214,
7860x90050000,
7870x48000000,
7880x00050001,
7890x0006002d,
7900x38910000,
7910x00098200,
7920x38000000,
7930x00098200,
7940x91440004,
7950x38b10000,
7960x00098200,
7970x90040000,
7980x39000000,
7990x00098200,
8000x91650004,
8010x91050000,
8020x48000000,
8030x00050001,
8040x0006002e,
8050x90010024,
8060xc8010020,
8070xfc00f028,
8080x54ea5d78,
8090x38b10000,
8100x00098200,
8110x7c8e5214,
8120xd8050000,
8130x48000000,
8140x00050001,
8150x0006002f,
8160x54ea5d78,
8170x54eb9d78,
8180x7c8e5214,
8190x7cae5a14,
8200x0006000b,
8210x91d20000,
8220x00098200,
8230x7e439378,
8240x92010008,
8250x48000001,
8260x00030001,
8270x28030000,
8280x41820000,
8290x00050803,
8300xc8030000,
8310x80f00000,
8320x3a100004,
8330x7c0ea5ae,
8340x54e815ba,
8350x54ea5d78,
8360x54ec9b78,
8370x7c11402e,
8380x54f4dd78,
8390x54eb9d78,
8400x7c0903a6,
8410x4e800420,
8420x0006000d,
8430x210e0000,
8440x00098200,
8450x81d20000,
8460x00098200,
8470x920efff0,
8480x7e087214,
8490x814efffc,
8500x39600010,
8510x48000000,
8520x00050026,
8530x00060030,
8540x38b10000,
8550x00098200,
8560x00000000,
8570x38000000,
8580x00098200,
8590x54ea5d78,
8600x91650004,
8610x7c8e5214,
8620x90050000,
8630x48000000,
8640x00050001,
8650x00060031,
8660x38910000,
8670x00098200,
8680x38000000,
8690x00098200,
8700x91440004,
8710x38b10000,
8720x00098200,
8730x90040000,
8740x39000000,
8750x00098200,
8760x91650004,
8770x91050000,
8780x48000000,
8790x00050001,
8800x00060032,
8810x90010024,
8820xc8010020,
8830xfc00f028,
8840x54ea5d78,
8850x38b10000,
8860x00098200,
8870x7c8e5214,
8880xd8050000,
8890x48000000,
8900x00050001,
8910x00060033,
8920x54ea5d78,
8930x54eb9d78,
8940x7c8e5214,
8950x7cae5a14,
8960x0006000b,
8970x91d20000,
8980x00098200,
8990x7e439378,
9000x92010008,
9010x48000001,
9020x00030002,
9030x28030000,
9040x7c0ea4ae,
9050x41820000,
9060x00050803,
9070x80f00000,
9080x3a100004,
9090xd8030000,
9100x54e815ba,
9110x54ea5d78,
9120x54ec9b78,
9130x7c11402e,
9140x54f4dd78,
9150x54eb9d78,
9160x7c0903a6,
9170x4e800420,
9180x0006000d,
9190x210e0000,
9200x00098200,
9210x81d20000,
9220x00098200,
9230x920efff0,
9240x7e087214,
9250x814efffc,
9260x39600018,
9270xd80e0010,
9280x48000000,
9290x00050026,
9300x00060034,
9310x7e439378,
9320x3a10fffc,
9330x7c8ea214,
9340x92010008,
9350x7cae6214,
9360x91d20000,
9370x00098200,
9380x00000000,
9390x54e6063e,
9400x48000001,
9410x00030003,
9420x0006000d,
9430x28030001,
9440x41810000,
9450x00050835,
9460x20630000,
9470x0006000e,
9480x80f00000,
9490x3a100004,
9500x54e993ba,
9510x3d290000,
9520x00098200,
9530x7d291838,
9540x7e104a14,
9550x0006002b,
9560x80f00000,
9570x3a100004,
9580x54e815ba,
9590x54ea5d78,
9600x54ec9b78,
9610x7c11402e,
9620x54f4dd78,
9630x54eb9d78,
9640x7c0903a6,
9650x4e800420,
9660x00060036,
9670x80f0fffc,
9680xc8140000,
9690x54e8dd78,
9700x7c0e45ae,
9710x48000000,
9720x0005002b,
9730x00060037,
9740x80140000,
9750x20000000,
9760x00098200,
9770x7c631910,
9780x7c6318f8,
9790x48000000,
9800x0005000e,
9810x00060038,
9820x80140000,
9830x20000000,
9840x00098200,
9850x7c631910,
9860x48000000,
9870x0005000e,
9880x00060039,
9890x3a10fffc,
9900x91d20000,
9910x00098200,
9920x7e439378,
9930x92010008,
9940x48000001,
9950x00030004,
9960x48000000,
9970x0005000d,
9980x0006003a,
9990x7cae5214,
10000x7ccf5a14,
10010x48000000,
10020x00050001,
10030x0006003b,
10040x7caf5a14,
10050x7cce5214,
10060x48000000,
10070x00050001,
10080x0006003c,
10090x00000000,
10100x7d856378,
10110x7d866378,
10120x48000000,
10130x00050001,
10140x0006003d,
10150x7cae5214,
10160x7cce5a14,
10170x0006000b,
10180x7c8ea214,
10190x91d20000,
10200x00098200,
10210x7e439378,
10220x92010008,
10230x54e7063e,
10240x48000001,
10250x00030005,
10260x28030000,
10270x41820000,
10280x0005082b,
10290x00060035,
10300x7d0e1850,
10310x9203fff0,
10320x7dc97378,
10330x3a080000,
10340x00098200,
10350x7c6e1b78,
10360x39600010,
10370x48000000,
10380x00050024,
10390x0006003e,
10400x00000000,
10410x7c751b78,
10420x00000000,
10430x7d846378,
10440x91d20000,
10450x00098200,
10460x7e439378,
10470x92010008,
10480x48000001,
10490x00030006,
10500x00000000,
10510x28030000,
10520x40820000,
10530x00050835,
10540x7ea3ab78,
10550x48000000,
10560x0005003f,
10570x00000000,
10580x48000000,
10590x00050035,
10600x00000000,
10610x00060025,
10620x7e439378,
10630x91320000,
10640x00098200,
10650x388efff8,
10660x92010008,
10670x7cae5a14,
10680x7d755b78,
10690x48000001,
10700x00030007,
10710x814efffc,
10720x39750008,
10730x920efff8,
10740x820a0000,
10750x00098200,
10760x80f00000,
10770x3a100004,
10780x54e815ba,
10790x54f4dd78,
10800x7c11402e,
10810x7e947214,
10820x7c0903a6,
10830x4e800420,
10840x00060040,
10850x7e439378,
10860x91d20000,
10870x00098200,
10880x3894fff8,
10890x92010008,
10900x7cb45a14,
10910x7d755b78,
10920x48000001,
10930x00030007,
10940x810efff8,
10950x39750008,
10960x8154fffc,
10970x48000000,
10980x00050041,
10990x00060042,
11000x7e439378,
11010x91d20000,
11020x00098200,
11030x7e84a378,
11040x92010008,
11050x7cf53b78,
11060x48000001,
11070x00030008,
11080x00000000,
11090x56a0063e,
11100x00000000,
11110x56b4dd78,
11120x00000000,
11130x2c000000,
11140x00098200,
11150x00000000,
11160x56ac9b78,
11170x00000000,
11180x41820000,
11190x00070800,
11200x00000000,
11210x48000000,
11220x00070000,
11230x00060043,
11240x280b0008,
11250x80ae0000,
11260x806e0004,
11270x41800000,
11280x00050844,
11290x39000000,
11300x00098200,
11310x3a8efff8,
11320x7c854040,
11330x820efff8,
11340x40840000,
11350x00050844,
11360x90b40000,
11370x398b0008,
11380x90740004,
11390x41820000,
11400x00050845,
11410x39000008,
11420x396bfff8,
11430x0006000b,
11440x7c085840,
11450x7c0e44ae,
11460x7c1445ae,
11470x39080008,
11480x40820000,
11490x0005080b,
11500x48000000,
11510x00050045,
11520x00060046,
11530x280b0008,
11540x806e0000,
11550x41800000,
11560x00050844,
11570x7c161810,
11580x7d231910,
11590x7d280338,
11600x39080000,
11610x00098200,
11620x55081800,
11630x000900a1,
11640x392a0000,
11650x00098200,
11660x7c2944ae,
11670x48000000,
11680x00050047,
11690x00060048,
11700x280b0008,
11710x80ae0000,
11720x806e0004,
11730x41800000,
11740x00050844,
11750x2c050000,
11760x00098200,
11770x40820000,
11780x00050806,
11790x0006000b,
11800x80630000,
11810x00098200,
11820x0006000c,
11830x00000000,
11840x38a00000,
11850x00098200,
11860x28030000,
11870x81710000,
11880x00098200,
11890x41820000,
11900x00050849,
11910x80030000,
11920x00098200,
11930x38a00000,
11940x00098200,
11950x810b0000,
11960x00098200,
11970x81230000,
11980x00098200,
11990x7d080038,
12000x55002800,
12010x000900a1,
12020x55081800,
12030x000900a1,
12040x7d080050,
12050x7d294214,
12060x0006000d,
12070x80c90000,
12080x00098200,
12090x80090000,
12100x00098200,
12110x80890000,
12120x00098200,
12130x81090000,
12140x00098200,
12150x2c060000,
12160x00098200,
12170x40820000,
12180x00050804,
12190x7c005800,
12200x41820000,
12210x00050805,
12220x0006000e,
12230x81290000,
12240x00098200,
12250x28090000,
12260x41820000,
12270x00050849,
12280x48000000,
12290x0005000d,
12300x0006000f,
12310x00000000,
12320x2c040000,
12330x00098200,
12340x41820000,
12350x00050849,
12360x7c852378,
12370x7d034378,
12380x48000000,
12390x00050049,
12400x00060010,
12410x2c050000,
12420x00098200,
12430x41820000,
12440x0005080b,
12450x7c162810,
12460x7d252910,
12470x7d280338,
12480x39080000,
12490x00098200,
12500x55081000,
12510x000900a1,
12520x39310000,
12530x00098200,
12540x7c69402e,
12550x48000000,
12560x0005000c,
12570x0006004a,
12580x280b0010,
12590x80ae0000,
12600x80ce0008,
12610x806e0004,
12620x808e000c,
12630x41800000,
12640x00050844,
12650x2c050000,
12660x00098200,
12670x40820000,
12680x00050844,
12690x81030000,
12700x00098200,
12710x2c060000,
12720x00098200,
12730x40820000,
12740x00050844,
12750x28080000,
12760x88c30000,
12770x00098200,
12780x40820000,
12790x00050844,
12800x70c00000,
12810x00090200,
12820x90830000,
12830x00098200,
12840x41820000,
12850x00050849,
12860x00000000,
12870x80110000,
12880x00098200,
12890x54c607b8,
12900x90710000,
12910x00098200,
12920x98c30000,
12930x00098200,
12940x90030000,
12950x00098200,
12960x48000000,
12970x00050049,
12980x0006004b,
12990x280b0008,
13000x80ce0000,
13010x808e0004,
13020x41800000,
13030x00050844,
13040x2c060000,
13050x00098200,
13060x40820000,
13070x00050844,
13080x38ae0008,
13090x7e439378,
13100x48000001,
13110x00030009,
13120xc8230000,
13130x48000000,
13140x00050047,
13150x0006004c,
13160x280b0008,
13170x806e0000,
13180xc82e0000,
13190x40820000,
13200x00050844,
13210x7c03b040,
13220x41810000,
13230x00050844,
13240x48000000,
13250x00050047,
13260x0006004d,
13270x280b0008,
13280x80ae0000,
13290x806e0004,
13300x41800000,
13310x00050844,
13320x2c050000,
13330x00098200,
13340x41820000,
13350x00050849,
13360x80110000,
13370x00098200,
13380x7c05b040,
13390x28800000,
13400x91d20000,
13410x00098200,
13420x4c413342,
13430x92010008,
13440x41820000,
13450x00050844,
13460x00000000,
13470x80110000,
13480x00098200,
13490x81110000,
13500x00098200,
13510x7c004040,
13520x40800001,
13530x0005084e,
13540x7e439378,
13550x7dc47378,
13560x48000001,
13570x0003000a,
13580x38a00000,
13590x00098200,
13600x48000000,
13610x00050049,
13620x0006004f,
13630x280b0008,
13640x806e0000,
13650x808e0004,
13660x41800000,
13670x00050844,
13680x7eee592e,
13690x2c030000,
13700x00098200,
13710x820efff8,
13720x40820000,
13730x00050844,
13740x91d20000,
13750x00098200,
13760x7e439378,
13770x91d20000,
13780x00098200,
13790x38ae0008,
13800x92010008,
13810x48000001,
13820x0003000b,
13830x28030000,
13840x38a00000,
13850x00098200,
13860x41820000,
13870x00050849,
13880xc80e0008,
13890x3a8efff8,
13900xc82e0010,
13910xd8140000,
13920x39800000,
13930x00098200,
13940xd8340008,
13950x48000000,
13960x00050045,
13970x00060050,
13980x280b0008,
13990x80ae0000,
14000x806e0004,
14010x41800000,
14020x00050844,
14030x2c050000,
14040x00098200,
14050x820efff8,
14060x40820000,
14070x00050844,
14080x00000000,
14090x81230000,
14100x00098200,
14110xc80a0000,
14120x00098200,
14130x28090000,
14140x3a8efff8,
14150x40820000,
14160x00050844,
14170x00000000,
14180xc80a0000,
14190x00098200,
14200x3a8efff8,
14210x00000000,
14220x92ee0008,
14230x39800000,
14240x00098200,
14250xd8140000,
14260x48000000,
14270x00050045,
14280x00060051,
14290x280b0010,
14300x80ae0000,
14310x806e0004,
14320x80ce0008,
14330xc84e0008,
14340x41800000,
14350x00050844,
14360x2c050000,
14370x00098200,
14380x7c86b040,
14390x820efff8,
14400x3c003ff0,
14410x9301000c,
14420x40820000,
14430x00050844,
14440x90010008,
14450x40840000,
14460x00050844,
14470xc8210008,
14480xfc00101e,
14490xd8010008,
14500x8121000c,
14510x80030000,
14520x00098200,
14530x81030000,
14540x00098200,
14550xfc42082a,
14560x39290001,
14570x3a8efff8,
14580x7c004840,
14590x55261800,
14600x000900a1,
14610xd8540000,
14620x40810000,
14630x00050802,
14640x7d28302e,
14650x7c0834ae,
14660x0006000b,
14670x2c090000,
14680x00098200,
14690x39800000,
14700x00098200,
14710x41820000,
14720x00050845,
14730x39800000,
14740x00098200,
14750xd8140008,
14760x48000000,
14770x00050045,
14780x0006000c,
14790x80030000,
14800x00098200,
14810x28000000,
14820x39800000,
14830x00098200,
14840x41820000,
14850x00050845,
14860x7d244b78,
14870x48000001,
14880x0003000c,
14890x00000000,
14900x28030000,
14910x39800000,
14920x00098200,
14930x41820000,
14940x00050845,
14950x81230000,
14960xc8030000,
14970x48000000,
14980x0005000b,
14990x00060052,
15000x280b0008,
15010x80ae0000,
15020x806e0004,
15030x41800000,
15040x00050844,
15050x2c050000,
15060x00098200,
15070x820efff8,
15080x40820000,
15090x00050844,
15100x00000000,
15110x81230000,
15120x00098200,
15130xc80a0000,
15140x00098200,
15150x28090000,
15160x3a8efff8,
15170x40820000,
15180x00050844,
15190x00000000,
15200xc80a0000,
15210x00098200,
15220x3a8efff8,
15230x00000000,
15240x930e0008,
15250x930e000c,
15260x39800000,
15270x00098200,
15280xd8140000,
15290x48000000,
15300x00050045,
15310x00060053,
15320x280b0008,
15330x88d10000,
15340x00098200,
15350x41800000,
15360x00050844,
15370x7dc97378,
15380x39ce0008,
15390x54c607fe,
15400x000900ab,
15410x396bfff8,
15420x3a060000,
15430x00098200,
15440x48000000,
15450x00050024,
15460x00060054,
15470x280b0010,
15480x80ce0008,
15490xc84e0008,
15500x80ae0000,
15510xc82e0000,
15520x41800000,
15530x00050844,
15540x89110000,
15550x00098200,
15560x7dc97378,
15570x2c060000,
15580x00098200,
15590x40820000,
15600x00050844,
15610x39ce0010,
15620x550807fe,
15630x000900ab,
15640xd8490000,
15650x396bfff0,
15660xd8290008,
15670x3a080000,
15680x00098200,
15690x48000000,
15700x00050024,
15710x00060055,
15720x280b0008,
15730x80ae0000,
15740x806e0004,
15750x41800000,
15760x00050844,
15770x2c050000,
15780x00098200,
15790x40820000,
15800x00050844,
15810x88030000,
15820x00098200,
15830x81030000,
15840x00098200,
15850x00000000,
15860x80830000,
15870x00098200,
15880x28000000,
15890x00090200,
15900x81230000,
15910x00098200,
15920x28880000,
15930x80030000,
15940x00098200,
15950x7f844840,
15960x820efff8,
15970x4f013342,
15980x7d245a14,
15990x4f3e1102,
16000x7c890040,
16010x4f18cb82,
16020x92010008,
16030x4f182b82,
16040x91d20000,
16050x00098200,
16060x41980000,
16070x00050844,
16080x0006000b,
16090x39ce0008,
16100x396bfff8,
16110x3929fff8,
16120x91230000,
16130x00098200,
16140x39000000,
16150x91d20000,
16160x00098200,
16170x0006000c,
16180x7c085800,
16190x7c0e44ae,
16200x41820000,
16210x00050803,
16220x7c0445ae,
16230x39080008,
16240x48000000,
16250x0005000c,
16260x0006000d,
16270x38a00000,
16280x7c751b78,
16290x38c00000,
16300x48000001,
16310x00050021,
16320x0006000e,
16330x81350000,
16340x00098200,
16350x28030000,
16360x00090200,
16370x80d50000,
16380x00098200,
16390x38000000,
16400x00098200,
16410x81d20000,
16420x00098200,
16430x90110000,
16440x00098200,
16450x41810000,
16460x00050808,
16470x00000000,
16480x7d893050,
16490x80120000,
16500x00098200,
16510x280c0000,
16520x7d0e6214,
16530x41820000,
16540x00050806,
16550x7c080040,
16560x39000000,
16570x41810000,
16580x00050809,
16590x38ccfff8,
16600x91350000,
16610x00098200,
16620x0006000f,
16630x7c083040,
16640x7c0944ae,
16650x7c0e45ae,
16660x39080008,
16670x40820000,
16680x0005080f,
16690x00060010,
16700x72000000,
16710x00090200,
16720x39000000,
16730x00098200,
16740x3a8efff8,
16750x910efff8,
16760x398c0010,
16770x00060011,
16780x92010008,
16790x7d936378,
16800x41820000,
16810x00050817,
16820x48000000,
16830x00050018,
16840x00060012,
16850x72000000,
16860x00090200,
16870x38c6fff8,
16880x39000000,
16890x00098200,
16900xc8060000,
16910x90d50000,
16920x00098200,
16930x39800000,
16940x00098200,
16950x910efff8,
16960x3a8efff8,
16970xd80e0000,
16980x48000000,
16990x00050011,
17000x00060013,
17010x7e439378,
17020x558400fe,
17030x000900ab,
17040x48000001,
17050x00030000,
17060x38600000,
17070x48000000,
17080x0005000e,
17090x00060056,
17100x00000000,
17110x806a0000,
17120x00098200,
17130x88030000,
17140x00098200,
17150x81030000,
17160x00098200,
17170x80830000,
17180x00098200,
17190x28000000,
17200x00090200,
17210x81230000,
17220x00098200,
17230x28880000,
17240x80030000,
17250x00098200,
17260x7f844840,
17270x820efff8,
17280x4f013342,
17290x7d245a14,
17300x4f3e1102,
17310x7c890040,
17320x4f18cb82,
17330x92010008,
17340x4f182b82,
17350x91d20000,
17360x00098200,
17370x41980000,
17380x00050844,
17390x0006000b,
17400x91230000,
17410x00098200,
17420x39000000,
17430x91d20000,
17440x00098200,
17450x0006000c,
17460x7c085800,
17470x7c0e44ae,
17480x41820000,
17490x00050803,
17500x7c0445ae,
17510x39080008,
17520x48000000,
17530x0005000c,
17540x0006000d,
17550x38a00000,
17560x7c751b78,
17570x38c00000,
17580x48000001,
17590x00050021,
17600x0006000e,
17610x81350000,
17620x00098200,
17630x28030000,
17640x00090200,
17650x80d50000,
17660x00098200,
17670x38000000,
17680x00098200,
17690x00000000,
17700x81d20000,
17710x00098200,
17720x90110000,
17730x00098200,
17740x41810000,
17750x00050808,
17760x7d893050,
17770x80120000,
17780x00098200,
17790x280c0000,
17800x7d0e6214,
17810x41820000,
17820x00050806,
17830x7c080040,
17840x39000000,
17850x41810000,
17860x00050809,
17870x38ccfff8,
17880x91350000,
17890x00098200,
17900x0006000f,
17910x7c083040,
17920x7c0944ae,
17930x7c0e45ae,
17940x39080008,
17950x40820000,
17960x0005080f,
17970x00060010,
17980x72000000,
17990x00090200,
18000x7dd47378,
18010x398c0008,
18020x00060011,
18030x92010008,
18040x7d936378,
18050x41820000,
18060x00050817,
18070x48000000,
18080x00050018,
18090x00060012,
18100x7e439378,
18110x7ea4ab78,
18120x48000001,
18130x0003000d,
18140x00060013,
18150x7e439378,
18160x558400fe,
18170x000900ab,
18180x48000001,
18190x00030000,
18200x38600000,
18210x48000000,
18220x0005000e,
18230x00060057,
18240x80120000,
18250x00098200,
18260x00000000,
18270x7d0e5a14,
18280x91d20000,
18290x00098200,
18300x70000000,
18310x00090200,
18320x91120000,
18330x00098200,
18340x38600000,
18350x00098200,
18360x41820000,
18370x00050844,
18380x93120000,
18390x00098200,
18400x98720000,
18410x00098200,
18420x48000000,
18430x0005001a,
18440x00060058,
18450x280b0008,
18460x80ae0000,
18470x806e0004,
18480x41800000,
18490x00050844,
18500x7c05b040,
18510x40800000,
18520x00050844,
18530x54a5007e,
18540x00060049,
18550x820efff8,
18560x90aefff8,
18570x3a8efff8,
18580x906efffc,
18590x00060059,
18600x39800000,
18610x00098200,
18620x00060045,
18630x72000000,
18640x00090200,
18650x7d936378,
18660x40820000,
18670x00050818,
18680x80f0fffc,
18690x54ea5d78,
18700x0006000f,
18710x7c0a6040,
18720x54e0dd78,
18730x41810000,
18740x00050806,
18750x80f00000,
18760x3a100004,
18770x7dc0a050,
18780x54e815ba,
18790x54ea5d78,
18800x54ec9b78,
18810x7c11402e,
18820x54f4dd78,
18830x54eb9d78,
18840x7c0903a6,
18850x4e800420,
18860x00060010,
18870x390cfff8,
18880x398c0008,
18890x7ef4412e,
18900x48000000,
18910x0005000f,
18920x0006005a,
18930x00000000,
18940x280b0008,
18950x80ae0000,
18960xc82e0000,
18970x41800000,
18980x00050844,
18990x7c05b040,
19000x40800000,
19010x00050844,
19020x48000001,
19030x0003000e,
19040x48000000,
19050x00050047,
19060x0006005b,
19070x280b0008,
19080x80ae0000,
19090xc82e0000,
19100x41800000,
19110x00050844,
19120x7c05b040,
19130x40800000,
19140x00050844,
19150x48000001,
19160x0003000f,
19170x48000000,
19180x00050047,
19190x0006005c,
19200x280b0008,
19210x80ae0000,
19220xc82e0000,
19230x41800000,
19240x00050844,
19250x7c05b040,
19260x40800000,
19270x00050844,
19280x48000001,
19290x00030010,
19300x48000000,
19310x00050047,
19320x0006005d,
19330x280b0008,
19340x80ae0000,
19350xc82e0000,
19360x41800000,
19370x00050844,
19380x7c05b040,
19390x40800000,
19400x00050844,
19410x48000001,
19420x00030011,
19430x48000000,
19440x00050047,
19450x0006005e,
19460x280b0008,
19470x80ae0000,
19480xc82e0000,
19490x41800000,
19500x00050844,
19510x7c05b040,
19520x40800000,
19530x00050844,
19540x00000000,
19550x48000001,
19560x00030012,
19570x48000000,
19580x00050047,
19590x0006005f,
19600x280b0008,
19610x80ae0000,
19620xc82e0000,
19630x41800000,
19640x00050844,
19650x7c05b040,
19660x40800000,
19670x00050844,
19680x48000001,
19690x00030013,
19700x48000000,
19710x00050047,
19720x00060060,
19730x280b0008,
19740x80ae0000,
19750xc82e0000,
19760x41800000,
19770x00050844,
19780x7c05b040,
19790x40800000,
19800x00050844,
19810x48000001,
19820x00030014,
19830x48000000,
19840x00050047,
19850x00060061,
19860x280b0008,
19870x80ae0000,
19880xc82e0000,
19890x41800000,
19900x00050844,
19910x7c05b040,
19920x40800000,
19930x00050844,
19940x48000001,
19950x00030015,
19960x48000000,
19970x00050047,
19980x00060062,
19990x280b0008,
20000x80ae0000,
20010xc82e0000,
20020x41800000,
20030x00050844,
20040x7c05b040,
20050x40800000,
20060x00050844,
20070x48000001,
20080x00030016,
20090x48000000,
20100x00050047,
20110x00060063,
20120x00000000,
20130x280b0008,
20140x80ae0000,
20150xc82e0000,
20160x41800000,
20170x00050844,
20180x7c05b040,
20190x40800000,
20200x00050844,
20210x48000001,
20220x00030017,
20230x48000000,
20240x00050047,
20250x00060064,
20260x280b0008,
20270x80ae0000,
20280xc82e0000,
20290x41800000,
20300x00050844,
20310x7c05b040,
20320x40800000,
20330x00050844,
20340x48000001,
20350x00030018,
20360x48000000,
20370x00050047,
20380x00060065,
20390x280b0008,
20400x80ae0000,
20410xc82e0000,
20420x41800000,
20430x00050844,
20440x7c05b040,
20450x40800000,
20460x00050844,
20470x48000001,
20480x00030019,
20490x48000000,
20500x00050047,
20510x00060066,
20520x280b0008,
20530x80ae0000,
20540xc82e0000,
20550x41800000,
20560x00050844,
20570x7c05b040,
20580x40800000,
20590x00050844,
20600x48000001,
20610x0003001a,
20620x48000000,
20630x00050047,
20640x00060067,
20650x280b0008,
20660x80ae0000,
20670xc82e0000,
20680x41800000,
20690x00050844,
20700x7c05b040,
20710x40800000,
20720x00050844,
20730x00000000,
20740x48000001,
20750x0003001b,
20760x48000000,
20770x00050047,
20780x00060068,
20790x280b0008,
20800x80ae0000,
20810xc82e0000,
20820x41800000,
20830x00050844,
20840x7c05b040,
20850x40800000,
20860x00050844,
20870x48000001,
20880x0003001c,
20890x48000000,
20900x00050047,
20910x00060069,
20920x280b0010,
20930x80ae0000,
20940xc82e0000,
20950x80ce0008,
20960xc84e0008,
20970x41800000,
20980x00050844,
20990x7c05b040,
21000x40800000,
21010x00050844,
21020x7c06b040,
21030x40800000,
21040x00050844,
21050x48000001,
21060x0003001d,
21070x48000000,
21080x00050047,
21090x0006006a,
21100x280b0010,
21110x80ae0000,
21120xc82e0000,
21130x80ce0008,
21140xc84e0008,
21150x41800000,
21160x00050844,
21170x7c05b040,
21180x40800000,
21190x00050844,
21200x7c06b040,
21210x40800000,
21220x00050844,
21230x48000001,
21240x0003001e,
21250x48000000,
21260x00050047,
21270x0006006b,
21280x280b0010,
21290x80ae0000,
21300xc82e0000,
21310x80ce0008,
21320xc84e0008,
21330x41800000,
21340x00050844,
21350x7c05b040,
21360x40800000,
21370x00050844,
21380x00000000,
21390x7c06b040,
21400x40800000,
21410x00050844,
21420x48000001,
21430x0003001f,
21440x48000000,
21450x00050047,
21460x0006006c,
21470x0006006d,
21480x280b0008,
21490x80ae0000,
21500xc82e0000,
21510x41800000,
21520x00050844,
21530x7c05b040,
21540x40800000,
21550x00050844,
21560xc84a0000,
21570x00098200,
21580xfc2100b2,
21590x48000000,
21600x00050047,
21610x0006006e,
21620x280b0010,
21630x80ae0000,
21640xc82e0000,
21650x80ce0008,
21660xc84e0008,
21670x41800000,
21680x00050844,
21690x7c05b040,
21700x40800000,
21710x00050844,
21720x7c06b040,
21730x40800000,
21740x00050844,
21750xfc40101e,
21760xd8410008,
21770x8061000c,
21780x48000001,
21790x00030020,
21800x48000000,
21810x00050047,
21820x0006006f,
21830x280b0008,
21840x80ae0000,
21850xc82e0000,
21860x41800000,
21870x00050844,
21880x7c05b040,
21890x40800000,
21900x00050844,
21910x38710000,
21920x00098200,
21930x820efff8,
21940x48000001,
21950x00030021,
21960x81110000,
21970x00098200,
21980x3a8efff8,
21990x6d088000,
22000x91010024,
22010xc8410020,
22020xfc42f828,
22030xd8340000,
22040x39800000,
22050x00098200,
22060x00000000,
22070xd8540008,
22080x48000000,
22090x00050045,
22100x00060070,
22110x280b0008,
22120x80ae0000,
22130xc82e0000,
22140x41800000,
22150x00050844,
22160x7c05b040,
22170x40800000,
22180x00050844,
22190x386efff8,
22200x820efff8,
22210x48000001,
22220x00030022,
22230x3a8efff8,
22240xd82e0000,
22250x39800000,
22260x00098200,
22270x48000000,
22280x00050045,
22290x00060071,
22300x280b0008,
22310x80ae0000,
22320xc82e0000,
22330x41800000,
22340x00050844,
22350x7c05b040,
22360x40800000,
22370x00050844,
22380x39000008,
22390x0006000b,
22400x7c8e402e,
22410x7c4e44ae,
22420x7c885840,
22430x7c04b040,
22440x40840000,
22450x00050847,
22460x40800000,
22470x00050844,
22480xfc011028,
22490x39080008,
22500xfc2008ae,
22510x48000000,
22520x0005000b,
22530x00060072,
22540x280b0008,
22550x80ae0000,
22560xc82e0000,
22570x41800000,
22580x00050844,
22590x7c05b040,
22600x40800000,
22610x00050844,
22620x39000008,
22630x0006000b,
22640x7c8e402e,
22650x7c4e44ae,
22660x7c885840,
22670x7c04b040,
22680x40840000,
22690x00050847,
22700x40800000,
22710x00050844,
22720xfc011028,
22730x39080008,
22740xfc20106e,
22750x48000000,
22760x0005000b,
22770x00060073,
22780x00000000,
22790x280b0008,
22800x80ae0000,
22810x806e0004,
22820x41800000,
22830x00050844,
22840x2c050000,
22850x00098200,
22860x40820000,
22870x00050844,
22880x80630000,
22890x00098200,
22900x48000000,
22910x00050074,
22920x00060075,
22930x280b0008,
22940x80ae0000,
22950x806e0004,
22960x40820000,
22970x00050844,
22980x2c050000,
22990x00098200,
23000x40820000,
23010x00050844,
23020x80030000,
23030x00098200,
23040x89030000,
23050x00098200,
23060x30c0ffff,
23070x7d860110,
23080x91010024,
23090x398c0001,
23100xc8010020,
23110x3a8efff8,
23120x820efff8,
23130xfc00f028,
23140x558c1800,
23150x000900a1,
23160xd8140000,
23170x48000000,
23180x00050045,
23190x00060076,
23200x80110000,
23210x00098200,
23220x81110000,
23230x00098200,
23240x7c004040,
23250x40800001,
23260x0005084e,
23270x280b0008,
23280x80ae0000,
23290xc82e0000,
23300x40820000,
23310x00050844,
23320x7c05b040,
23330x40800000,
23340x00050844,
23350xfc20081e,
23360xd8210008,
23370x8001000c,
23380x3881000f,
23390x38a00001,
23400x280000ff,
23410x41810000,
23420x00050844,
23430x00060077,
23440x7e439378,
23450x91d20000,
23460x00098200,
23470x00000000,
23480x92010008,
23490x48000001,
23500x00030023,
23510x81d20000,
23520x00098200,
23530x38a00000,
23540x00098200,
23550x48000000,
23560x00050049,
23570x00060078,
23580x80110000,
23590x00098200,
23600x81110000,
23610x00098200,
23620x7c004040,
23630x40800001,
23640x0005084e,
23650x280b0010,
23660x80ae0010,
23670xc80e0010,
23680x800e0000,
23690x806e0004,
23700x41800000,
23710x00050844,
23720x808e0008,
23730xc82e0008,
23740x3920ffff,
23750x41820000,
23760x00050801,
23770x7c05b040,
23780x40800000,
23790x00050844,
23800xfc00001e,
23810xd8010008,
23820x8121000c,
23830x0006000b,
23840x7c04b040,
23850x40800000,
23860x00050844,
23870x2c000000,
23880x00098200,
23890x40820000,
23900x00050844,
23910xfc20081e,
23920xd8210008,
23930x8101000c,
23940x80030000,
23950x00098200,
23960x7c004840,
23970x38c90001,
23980x41800000,
23990x00050805,
24000x0006000c,
24010x2c080000,
24020x7cc80214,
24030x40810000,
24040x00050807,
24050x0006000d,
24060x7ca84850,
24070x38830000,
24080x00098200,
24090x7ca0fe70,
24100x38a50001,
24110x7c844214,
24120x7ca50078,
24130x48000000,
24140x00050077,
24150x0006000f,
24160x00000000,
24170x7c890050,
24180x7c84fe70,
24190x7cc62078,
24200x7d203214,
24210x48000000,
24220x0005000c,
24230x00060011,
24240x30a8ffff,
24250x7ca52910,
24260x7cc4fe70,
24270x7cc62878,
24280x7cc82078,
24290x39080001,
24300x48000000,
24310x0005000d,
24320x00060079,
24330x80110000,
24340x00098200,
24350x81110000,
24360x00098200,
24370x7c004040,
24380x40800001,
24390x0005084e,
24400x280b0010,
24410x80ae0000,
24420x806e0004,
24430x80ce0008,
24440xc84e0008,
24450x41800000,
24460x00050844,
24470x2c050000,
24480x00098200,
24490x40820000,
24500x00050844,
24510x7c06b040,
24520x40800000,
24530x00050844,
24540xfc40101e,
24550xd8410008,
24560x80a1000c,
24570x80030000,
24580x00098200,
24590x2c050000,
24600x81110000,
24610x00098200,
24620x40810000,
24630x00050802,
24640x28000001,
24650x3925ffff,
24660x41800000,
24670x00050802,
24680x7c882840,
24690x40820000,
24700x00050844,
24710x88030000,
24720x00098200,
24730x80910000,
24740x00098200,
24750x41840000,
24760x00050844,
24770x0006000b,
24780x28090000,
24790x7c0449ae,
24800x3929ffff,
24810x40820000,
24820x0005080b,
24830x48000000,
24840x00050077,
24850x0006000c,
24860x00000000,
24870x38710000,
24880x00098200,
24890x38a00000,
24900x00098200,
24910x48000000,
24920x00050049,
24930x0006007a,
24940x80110000,
24950x00098200,
24960x81110000,
24970x00098200,
24980x7c004040,
24990x40800001,
25000x0005084e,
25010x280b0008,
25020x80ae0000,
25030x806e0004,
25040x41800000,
25050x00050844,
25060x2c050000,
25070x00098200,
25080x81110000,
25090x00098200,
25100x40820000,
25110x00050844,
25120x80a30000,
25130x00098200,
25140x38630000,
25150x00098200,
25160x80910000,
25170x00098200,
25180x39200000,
25190x7c082840,
25200x38c5ffff,
25210x41800000,
25220x00050844,
25230x0006000b,
25240x2c060000,
25250x7d0348ae,
25260x41800000,
25270x00050877,
25280x7d0431ae,
25290x38c6ffff,
25300x39290001,
25310x48000000,
25320x0005000b,
25330x0006007b,
25340x80110000,
25350x00098200,
25360x81110000,
25370x00098200,
25380x7c004040,
25390x40800001,
25400x0005084e,
25410x00000000,
25420x280b0008,
25430x80ae0000,
25440x806e0004,
25450x41800000,
25460x00050844,
25470x2c050000,
25480x00098200,
25490x81110000,
25500x00098200,
25510x40820000,
25520x00050844,
25530x80a30000,
25540x00098200,
25550x38630000,
25560x00098200,
25570x80910000,
25580x00098200,
25590x7c082840,
25600x39200000,
25610x41800000,
25620x00050844,
25630x0006000b,
25640x7c092840,
25650x7d0348ae,
25660x40800000,
25670x00050877,
25680x3808ffbf,
25690x69060020,
25700x3000ffe6,
25710x7cc63110,
25720x70c60020,
25730x7d083278,
25740x7d0449ae,
25750x39290001,
25760x48000000,
25770x0005000b,
25780x0006007c,
25790x80110000,
25800x00098200,
25810x81110000,
25820x00098200,
25830x7c004040,
25840x40800001,
25850x0005084e,
25860x280b0008,
25870x80ae0000,
25880x806e0004,
25890x41800000,
25900x00050844,
25910x2c050000,
25920x00098200,
25930x81110000,
25940x00098200,
25950x40820000,
25960x00050844,
25970x80a30000,
25980x00098200,
25990x38630000,
26000x00098200,
26010x80910000,
26020x00098200,
26030x00000000,
26040x7c082840,
26050x39200000,
26060x41800000,
26070x00050844,
26080x0006000b,
26090x7c092840,
26100x7d0348ae,
26110x40800000,
26120x00050877,
26130x3808ff9f,
26140x69060020,
26150x3000ffe6,
26160x7cc63110,
26170x70c60020,
26180x7d083278,
26190x7d0449ae,
26200x39290001,
26210x48000000,
26220x0005000b,
26230x0006007d,
26240x280b0008,
26250x80ae0000,
26260x806e0004,
26270x41800000,
26280x00050844,
26290x2c050000,
26300x00098200,
26310x40820000,
26320x00050844,
26330x48000001,
26340x00030024,
26350x48000000,
26360x00050074,
26370x0006007e,
26380x280b0008,
26390x80ae0000,
26400xc82e0000,
26410x41800000,
26420x00050844,
26430x7c05b040,
26440x40800000,
26450x00050844,
26460xfc21f02a,
26470xd8210008,
26480x8061000c,
26490x00060074,
26500x6c638000,
26510x90610024,
26520xc8210020,
26530xfc21f828,
26540x00060047,
26550x820efff8,
26560x3a8efff8,
26570xd82efff8,
26580x48000000,
26590x00050059,
26600x0006007f,
26610x280b0008,
26620x80ae0000,
26630xc82e0000,
26640x41800000,
26650x00050844,
26660x7c05b040,
26670x40800000,
26680x00050844,
26690xfc21f02a,
26700xd8210008,
26710x8061000c,
26720x39000008,
26730x0006000b,
26740x7cce402e,
26750x7c885840,
26760x7c2e44ae,
26770x7c06b040,
26780x40840000,
26790x00050874,
26800xfc21f02a,
26810x40800000,
26820x00050844,
26830x00000000,
26840xd8210008,
26850x8081000c,
26860x7c632038,
26870x39080008,
26880x48000000,
26890x0005000b,
26900x00060080,
26910x280b0008,
26920x80ae0000,
26930xc82e0000,
26940x41800000,
26950x00050844,
26960x7c05b040,
26970x40800000,
26980x00050844,
26990xfc21f02a,
27000xd8210008,
27010x8061000c,
27020x39000008,
27030x0006000b,
27040x7cce402e,
27050x7c885840,
27060x7c2e44ae,
27070x7c06b040,
27080x40840000,
27090x00050874,
27100xfc21f02a,
27110x40800000,
27120x00050844,
27130xd8210008,
27140x8081000c,
27150x7c632378,
27160x39080008,
27170x48000000,
27180x0005000b,
27190x00060081,
27200x280b0008,
27210x80ae0000,
27220xc82e0000,
27230x41800000,
27240x00050844,
27250x7c05b040,
27260x40800000,
27270x00050844,
27280xfc21f02a,
27290xd8210008,
27300x8061000c,
27310x39000008,
27320x0006000b,
27330x7cce402e,
27340x7c885840,
27350x7c2e44ae,
27360x7c06b040,
27370x40840000,
27380x00050874,
27390xfc21f02a,
27400x40800000,
27410x00050844,
27420xd8210008,
27430x8081000c,
27440x7c632278,
27450x39080008,
27460x48000000,
27470x0005000b,
27480x00060082,
27490x280b0008,
27500x80ae0000,
27510xc82e0000,
27520x41800000,
27530x00050844,
27540x7c05b040,
27550x40800000,
27560x00050844,
27570xfc21f02a,
27580xd8210008,
27590x8061000c,
27600x5460403e,
27610x5060c00e,
27620x5060c42e,
27630x7c030378,
27640x48000000,
27650x00050074,
27660x00060083,
27670x280b0008,
27680x80ae0000,
27690xc82e0000,
27700x41800000,
27710x00050844,
27720x7c05b040,
27730x40800000,
27740x00050844,
27750x00000000,
27760xfc21f02a,
27770xd8210008,
27780x8061000c,
27790x7c6318f8,
27800x48000000,
27810x00050074,
27820x00060084,
27830x280b0010,
27840x80ae0000,
27850xc82e0000,
27860x80ce0008,
27870xc84e0008,
27880x41800000,
27890x00050844,
27900x7c05b040,
27910x40800000,
27920x00050844,
27930x7c06b040,
27940x40800000,
27950x00050844,
27960xfc21f02a,
27970xfc42f02a,
27980xd8210008,
27990x8061000c,
28000xd8410008,
28010x8081000c,
28020x548406fe,
28030x7c632030,
28040x48000000,
28050x00050074,
28060x00060085,
28070x280b0010,
28080x80ae0000,
28090xc82e0000,
28100x80ce0008,
28110xc84e0008,
28120x41800000,
28130x00050844,
28140x7c05b040,
28150x40800000,
28160x00050844,
28170x7c06b040,
28180x40800000,
28190x00050844,
28200xfc21f02a,
28210xfc42f02a,
28220xd8210008,
28230x8061000c,
28240xd8410008,
28250x8081000c,
28260x548406fe,
28270x7c632430,
28280x48000000,
28290x00050074,
28300x00060086,
28310x280b0010,
28320x80ae0000,
28330xc82e0000,
28340x80ce0008,
28350xc84e0008,
28360x41800000,
28370x00050844,
28380x7c05b040,
28390x40800000,
28400x00050844,
28410x7c06b040,
28420x40800000,
28430x00050844,
28440xfc21f02a,
28450xfc42f02a,
28460xd8210008,
28470x8061000c,
28480xd8410008,
28490x8081000c,
28500x548406fe,
28510x7c632630,
28520x48000000,
28530x00050074,
28540x00060087,
28550x280b0010,
28560x80ae0000,
28570xc82e0000,
28580x80ce0008,
28590xc84e0008,
28600x41800000,
28610x00050844,
28620x7c05b040,
28630x40800000,
28640x00050844,
28650x7c06b040,
28660x40800000,
28670x00050844,
28680xfc21f02a,
28690xfc42f02a,
28700xd8210008,
28710x8061000c,
28720xd8410008,
28730x8081000c,
28740x5c63203e,
28750x48000000,
28760x00050074,
28770x00060088,
28780x00000000,
28790x280b0010,
28800x80ae0000,
28810xc82e0000,
28820x80ce0008,
28830xc84e0008,
28840x41800000,
28850x00050844,
28860x7c05b040,
28870x40800000,
28880x00050844,
28890x7c06b040,
28900x40800000,
28910x00050844,
28920xfc21f02a,
28930xfc42f02a,
28940xd8210008,
28950x8061000c,
28960xd8410008,
28970x8081000c,
28980x7c8400d0,
28990x5c63203e,
29000x48000000,
29010x00050074,
29020x00060044,
29030x80ca0000,
29040x00098200,
29050x7d0e5a14,
29060x820efff8,
29070x38080000,
29080x00098200,
29090x81320000,
29100x00098200,
29110x92010008,
29120x7c004840,
29130x91d20000,
29140x00098200,
29150x91120000,
29160x00098200,
29170x7e439378,
29180x41810000,
29190x00050805,
29200x7cc903a6,
29210x4e800421,
29220x81d20000,
29230x00098200,
29240x2c030000,
29250x546c1800,
29260x000900a1,
29270x3a8efff8,
29280x41810000,
29290x00050845,
29300x0006000b,
29310x80120000,
29320x00098200,
29330x814efffc,
29340x7d6e0050,
29350x40820000,
29360x00050828,
29370x820a0000,
29380x00098200,
29390x80f00000,
29400x3a100004,
29410x54e815ba,
29420x54f4dd78,
29430x7c11402e,
29440x7e947214,
29450x7c0903a6,
29460x4e800420,
29470x00060028,
29480x72000000,
29490x00090200,
29500x56080038,
29510x40820000,
29520x00050803,
29530x80f0fffc,
29540x54e8dd78,
29550x0006000d,
29560x00000000,
29570x7d287050,
29580x48000000,
29590x00050024,
29600x0006000f,
29610x38800000,
29620x00098200,
29630x48000001,
29640x00030000,
29650x81d20000,
29660x00098200,
29670x7c000000,
29680x48000000,
29690x0005000b,
29700x0006004e,
29710x7ea802a6,
29720x91d20000,
29730x00098200,
29740x7c0e5a14,
29750x92010008,
29760x90120000,
29770x00098200,
29780x7e439378,
29790x48000001,
29800x00030025,
29810x81d20000,
29820x00098200,
29830x7ea803a6,
29840x80120000,
29850x00098200,
29860x7d6e0050,
29870x814efffc,
29880x4e800020,
29890x00060089,
29900x00000000,
29910x7c810808,
29920x00000000,
29930x0006008a,
29940x88d10000,
29950x00098200,
29960x70c00000,
29970x00090200,
29980x41820000,
29990x00050801,
30000x0006000f,
30010x39080000,
30020x00098200,
30030x7c11402e,
30040x7c0903a6,
30050x4e800420,
30060x0006008b,
30070x88d10000,
30080x00098200,
30090x81310000,
30100x00098200,
30110x70c00000,
30120x00090200,
30130x54c007c0,
30140x000900ab,
30150x40820000,
30160x0005080f,
30170x2c800000,
30180x3529ffff,
30190x41860000,
30200x0005080f,
30210x91310000,
30220x00098200,
30230x41820000,
30240x00050801,
30250x40840000,
30260x0005080f,
30270x0006000b,
30280x7e439378,
30290x9261000c,
30300x7e048378,
30310x91d20000,
30320x00098200,
30330x48000001,
30340x00030026,
30350x0006000d,
30360x81d20000,
30370x00098200,
30380x0006000e,
30390x00000000,
30400x80f0fffc,
30410x54e815ba,
30420x54ea5d78,
30430x39080000,
30440x00098200,
30450x54ec9b78,
30460x7c11402e,
30470x54f4dd78,
30480x54eb9d78,
30490x7c0903a6,
30500x4e800420,
30510x0006008c,
30520x3a100004,
30530x826affec,
30540x48000000,
30550x0005000e,
30560x0006008d,
30570x00000000,
30580x7c810808,
30590x00000000,
30600x0006008e,
30610x7e048378,
30620x00000000,
30630x48000000,
30640x00050001,
30650x00000000,
30660x0006008f,
30670x00000000,
30680x62040001,
30690x0006000b,
30700x00000000,
30710x7c0e5a14,
30720x92010008,
30730x7e439378,
30740x91d20000,
30750x00098200,
30760x7e8ea050,
30770x90120000,
30780x00098200,
30790x48000001,
30800x00030027,
30810x81d20000,
30820x00098200,
30830x80120000,
30840x00098200,
30850x93010008,
30860x7d6e0050,
30870x7e8ea214,
30880x814efffc,
30890x7c6903a6,
30900x4e800420,
30910x00060090,
30920x00000000,
30930x7c810808,
30940x00000000,
30950x00060091,
30960x00000000,
30970x7c810808,
30980x00000000,
30990x00060092,
31000x48000000,
31010x0003000e,
31020x00060093,
31030x48000000,
31040x0003000f,
31050x00060094,
31060x00000000,
31070x48000000,
31080x00030028,
31090x00000000,
31100x00060095,
31110x00000000,
31120x7c810808,
31130x00000000,
31140x00060096,
31150x00000000,
31160x7c810808,
31170x00000000,
31180x00060097,
31190x28030001,
31200x41820000,
31210x00050801,
31220x41810000,
31230x00050802,
31240xfc21102a,
31250x4e800020,
31260x0006000b,
31270xfc211028,
31280x4e800020,
31290x0006000c,
31300x28030003,
31310x41820000,
31320x00050801,
31330x41810000,
31340x00050802,
31350xfc2100b2,
31360x4e800020,
31370x0006000b,
31380xfc211024,
31390x4e800020,
31400x0006000c,
31410x28030005,
31420x41820000,
31430x00050801,
31440x41810000,
31450x00050802,
31460x9421ffe0,
31470xd9c10010,
31480xd9e10018,
31490x7c0802a6,
31500xfdc00890,
31510xfc211024,
31520x90010024,
31530xfde01090,
31540x48000001,
31550x0003000e,
31560x80010024,
31570xfc2103f2,
31580x7c0803a6,
31590xfc2e0828,
31600xc9c10010,
31610xc9e10018,
31620x38210020,
31630x4e800020,
31640x0006000b,
31650x48000000,
31660x0003001d,
31670x0006000c,
31680x28030007,
31690x41820000,
31700x00050801,
31710x41810000,
31720x00050802,
31730xfc200850,
31740x4e800020,
31750x0006000b,
31760xfc200a10,
31770x4e800020,
31780x0006000c,
31790x7c810808,
31800x00060098,
31810x00000000,
31820x7c810808,
31830x00000000,
31840x00080000,
31850x00000000,
31860x7c0ea02e,
31870x3a100004,
31880x7c0ea4ae,
31890x7d0e602e,
31900x7c00b040,
31910x8130fffc,
31920x7c2e64ae,
31930x7c88b040,
31940x552993ba,
31950x40800000,
31960x00050834,
31970x3d290000,
31980x00098200,
31990x40840000,
32000x00050834,
32010xfc000800,
32020x00000000,
32030x40800000,
32040x00050801,
32050x00000000,
32060x41800000,
32070x00050801,
32080x00000000,
32090x4c001382,
32100x40800000,
32110x00050801,
32120x00000000,
32130x4c001382,
32140x41800000,
32150x00050801,
32160x00000000,
32170x7e104a14,
32180x0006000b,
32190x80f00000,
32200x3a100004,
32210x54e815ba,
32220x54ea5d78,
32230x54ec9b78,
32240x7c11402e,
32250x54f4dd78,
32260x54eb9d78,
32270x7c0903a6,
32280x4e800420,
32290x00000000,
32300x7c14706e,
32310x81300000,
32320xc8140000,
32330x3a100004,
32340x7d0c706e,
32350x7c00b040,
32360x552993ba,
32370xc82c0000,
32380x7c88b040,
32390x3d290000,
32400x00098200,
32410x40800000,
32420x00050805,
32430x40840000,
32440x00050805,
32450xfc000800,
32460x00000000,
32470x40820000,
32480x00050801,
32490x7e104a14,
32500x00000000,
32510x41820000,
32520x00050801,
32530x7e104a14,
32540x00000000,
32550x0006000b,
32560x80f00000,
32570x3a100004,
32580x54e815ba,
32590x54ea5d78,
32600x54ec9b78,
32610x7c11402e,
32620x54f4dd78,
32630x54eb9d78,
32640x7c0903a6,
32650x4e800420,
32660x0006000f,
32670x80940004,
32680x80ac0004,
32690x7c0600f8,
32700x7c004040,
32710x28860000,
32720x00090200,
32730x2b060000,
32740x00090200,
32750x7e842840,
32760x4c222902,
32770x4c161342,
32780x4c42b202,
32790x7e158378,
32800x4c420b82,
32810x4c000b82,
32820x00000000,
32830x40820000,
32840x00050806,
32850x7e104a14,
32860x00060010,
32870x00000000,
32880x41820000,
32890x00050806,
32900x7e104a14,
32910x00060010,
32920x00000000,
32930x41800000,
32940x0005080b,
32950x41980000,
32960x0005080b,
32970x81240000,
32980x00098200,
32990x38c00000,
33000x00098200,
33010x28090000,
33020x41820000,
33030x0005080b,
33040x89290000,
33050x00098200,
33060x71290000,
33070x00090200,
33080x40820000,
33090x0005080b,
33100x7eb0ab78,
33110x48000000,
33120x00050039,
33130x00000000,
33140x7c14706e,
33150x558c007e,
33160x000900ab,
33170x80d40004,
33180x80f00000,
33190x218cfffc,
33200x3a100004,
33210x7d0f602e,
33220x20000000,
33230x00098200,
33240x7d064050,
33250x7c004378,
33260x54e993ba,
33270x20000000,
33280x3d290000,
33290x00098200,
33300x7d084110,
33310x00000000,
33320x7d294078,
33330x00000000,
33340x7d294038,
33350x00000000,
33360x7e104a14,
33370x80f00000,
33380x3a100004,
33390x54e815ba,
33400x54ea5d78,
33410x54ec9b78,
33420x7c11402e,
33430x54f4dd78,
33440x54eb9d78,
33450x7c0903a6,
33460x4e800420,
33470x00000000,
33480x7c0ea02e,
33490x7c0ea4ae,
33500x3a100004,
33510x7c2f64ae,
33520x80f0fffc,
33530x7c00b040,
33540x40800000,
33550x00050805,
33560xfc000800,
33570x54e993ba,
33580x3d290000,
33590x00098200,
33600x00000000,
33610x40820000,
33620x00050805,
33630x7e104a14,
33640x0006000f,
33650x00000000,
33660x41820000,
33670x00050802,
33680x0006000b,
33690x7e104a14,
33700x0006000c,
33710x00000000,
33720x80f00000,
33730x3a100004,
33740x54e815ba,
33750x54ea5d78,
33760x54ec9b78,
33770x7c11402e,
33780x54f4dd78,
33790x54eb9d78,
33800x7c0903a6,
33810x4e800420,
33820x00000000,
33830x0006000f,
33840x54e993ba,
33850x3d290000,
33860x00098200,
33870x48000000,
33880x0005000b,
33890x00000000,
33900x7c0ea02e,
33910x558800fe,
33920x000900ab,
33930x80f00000,
33940x7d0840f8,
33950x3a100004,
33960x7c080050,
33970x54e993ba,
33980x3000ffff,
33990x3d290000,
34000x00098200,
34010x7d084110,
34020x00000000,
34030x7d294038,
34040x00000000,
34050x7d294078,
34060x00000000,
34070x7e104a14,
34080x80f00000,
34090x3a100004,
34100x54e815ba,
34110x54ea5d78,
34120x54ec9b78,
34130x7c11402e,
34140x54f4dd78,
34150x54eb9d78,
34160x7c0903a6,
34170x4e800420,
34180x00000000,
34190x7c0e602e,
34200x80f00000,
34210x3a100004,
34220x00000000,
34230x20000000,
34240x00098200,
34250x54e993ba,
34260x7d084110,
34270x3d290000,
34280x00098200,
34290x00000000,
34300x7d294078,
34310x00000000,
34320x7d294038,
34330x00000000,
34340x7e104a14,
34350x00000000,
34360x39000000,
34370x00098200,
34380x7c0e64ae,
34390x7c004040,
34400x00000000,
34410x40800000,
34420x00050801,
34430x00000000,
34440x41800000,
34450x00050801,
34460x00000000,
34470x3e100000,
34480x00098200,
34490x54e993ba,
34500x7c0ea5ae,
34510x7e104a14,
34520x0006000b,
34530x00000000,
34540x80f00000,
34550x3a100004,
34560x54e815ba,
34570x54ea5d78,
34580x54ec9b78,
34590x7c11402e,
34600x54f4dd78,
34610x54eb9d78,
34620x7c0903a6,
34630x4e800420,
34640x00000000,
34650x80f00000,
34660x3a100004,
34670x7c0e64ae,
34680x7c0ea5ae,
34690x54e815ba,
34700x54ea5d78,
34710x54ec9b78,
34720x7c11402e,
34730x54f4dd78,
34740x54eb9d78,
34750x7c0903a6,
34760x4e800420,
34770x00000000,
34780x80f00000,
34790x3a100004,
34800x7c0e602e,
34810x21000000,
34820x00098200,
34830x7c004114,
34840x7c0ea12e,
34850x54e815ba,
34860x54ea5d78,
34870x54ec9b78,
34880x7c11402e,
34890x54f4dd78,
34900x54eb9d78,
34910x7c0903a6,
34920x4e800420,
34930x00000000,
34940x7d0c706e,
34950x800c0004,
34960x7c08b040,
34970x40800000,
34980x0005083c,
34990x6d088000,
35000x80f00000,
35010x3a100004,
35020x7d14716e,
35030x90140004,
35040x54e815ba,
35050x54ea5d78,
35060x54ec9b78,
35070x7c11402e,
35080x54f4dd78,
35090x54eb9d78,
35100x7c0903a6,
35110x4e800420,
35120x00000000,
35130x7c0c706e,
35140x806c0004,
35150x2c000000,
35160x00098200,
35170x40820000,
35180x00050802,
35190x80630000,
35200x00098200,
35210x0006000b,
35220x90610024,
35230xc8010020,
35240xfc00f028,
35250x80f00000,
35260x3a100004,
35270x7c0ea5ae,
35280x54e815ba,
35290x54ea5d78,
35300x54ec9b78,
35310x7c11402e,
35320x54f4dd78,
35330x54eb9d78,
35340x7c0903a6,
35350x4e800420,
35360x0006000c,
35370x2c000000,
35380x00098200,
35390x40820000,
35400x0005083e,
35410x00000000,
35420x81230000,
35430x00098200,
35440x28090000,
35450x40820000,
35460x00050809,
35470x0006000d,
35480x00000000,
35490x0006003f,
35500x48000001,
35510x00030024,
35520x48000000,
35530x0005000b,
35540x00000000,
35550x00060013,
35560x88090000,
35570x00098200,
35580x70000000,
35590x00090200,
35600x40820000,
35610x0005080d,
35620x48000000,
35630x0005003e,
35640x00000000,
35650x7c6e502e,
35660x7c0e54ae,
35670x7c2f5cae,
35680x7c03b040,
35690x40800000,
35700x0005083a,
35710x00000000,
35720x7c6e502e,
35730x7c2e54ae,
35740x7c0f5cae,
35750x7c03b040,
35760x40800000,
35770x0005083b,
35780x00000000,
35790x7c6e502e,
35800x7c8e582e,
35810x7c0e54ae,
35820x7c2e5cae,
35830x7c03b040,
35840x7c84b040,
35850x4c002202,
35860x40800000,
35870x0005083d,
35880x00000000,
35890x80f00000,
35900x3a100004,
35910xfc00082a,
35920x7c0ea5ae,
35930x54e815ba,
35940x54ea5d78,
35950x54ec9b78,
35960x7c11402e,
35970x54f4dd78,
35980x54eb9d78,
35990x7c0903a6,
36000x4e800420,
36010x00000000,
36020x7c6e502e,
36030x7c0e54ae,
36040x7c2f5cae,
36050x7c03b040,
36060x40800000,
36070x0005083a,
36080x00000000,
36090x7c6e502e,
36100x7c2e54ae,
36110x7c0f5cae,
36120x7c03b040,
36130x40800000,
36140x0005083b,
36150x00000000,
36160x7c6e502e,
36170x7c8e582e,
36180x7c0e54ae,
36190x7c2e5cae,
36200x7c03b040,
36210x7c84b040,
36220x4c002202,
36230x40800000,
36240x0005083d,
36250x00000000,
36260x80f00000,
36270x3a100004,
36280xfc000828,
36290x7c0ea5ae,
36300x54e815ba,
36310x54ea5d78,
36320x54ec9b78,
36330x7c11402e,
36340x54f4dd78,
36350x54eb9d78,
36360x7c0903a6,
36370x4e800420,
36380x00000000,
36390x7c6e502e,
36400x7c0e54ae,
36410x7c2f5cae,
36420x7c03b040,
36430x40800000,
36440x0005083a,
36450x00000000,
36460x7c6e502e,
36470x7c2e54ae,
36480x7c0f5cae,
36490x7c03b040,
36500x40800000,
36510x0005083b,
36520x00000000,
36530x7c6e502e,
36540x7c8e582e,
36550x7c0e54ae,
36560x7c2e5cae,
36570x7c03b040,
36580x7c84b040,
36590x4c002202,
36600x40800000,
36610x0005083d,
36620x00000000,
36630x80f00000,
36640x3a100004,
36650xfc000072,
36660x7c0ea5ae,
36670x54e815ba,
36680x54ea5d78,
36690x54ec9b78,
36700x7c11402e,
36710x54f4dd78,
36720x54eb9d78,
36730x7c0903a6,
36740x4e800420,
36750x00000000,
36760x7c6e502e,
36770x7c0e54ae,
36780x7c2f5cae,
36790x7c03b040,
36800x40800000,
36810x0005083a,
36820x00000000,
36830x7c6e502e,
36840x7c2e54ae,
36850x7c0f5cae,
36860x7c03b040,
36870x40800000,
36880x0005083b,
36890x00000000,
36900x7c6e502e,
36910x7c8e582e,
36920x7c0e54ae,
36930x7c2e5cae,
36940x7c03b040,
36950x7c84b040,
36960x4c002202,
36970x40800000,
36980x0005083d,
36990x00000000,
37000x80f00000,
37010x3a100004,
37020xfc000824,
37030x7c0ea5ae,
37040x54e815ba,
37050x54ea5d78,
37060x54ec9b78,
37070x7c11402e,
37080x54f4dd78,
37090x54eb9d78,
37100x7c0903a6,
37110x4e800420,
37120x00000000,
37130x7c6e502e,
37140x7dce54ae,
37150x7def5cae,
37160x7c03b040,
37170x40800000,
37180x0005083a,
37190x00000000,
37200x7c6e502e,
37210x7dee54ae,
37220x7dcf5cae,
37230x7c03b040,
37240x40800000,
37250x0005083b,
37260x00000000,
37270x7c6e502e,
37280x7c8e582e,
37290x7dce54ae,
37300x7dee5cae,
37310x7c03b040,
37320x7c84b040,
37330x4c002202,
37340x40800000,
37350x0005083d,
37360x00000000,
37370x00060099,
37380xfc2e7824,
37390x48000001,
37400x0003000e,
37410xfc0103f2,
37420x80f00000,
37430x3a100004,
37440xfc0e0028,
37450x7c0ea5ae,
37460x54e815ba,
37470x54ea5d78,
37480x54ec9b78,
37490x7c11402e,
37500x54f4dd78,
37510x54eb9d78,
37520x7c0903a6,
37530x4e800420,
37540x00000000,
37550x7c6e502e,
37560x7dce54ae,
37570x7def5cae,
37580x7c03b040,
37590x40800000,
37600x0005083a,
37610x00000000,
37620x7c6e502e,
37630x7dee54ae,
37640x7dcf5cae,
37650x7c03b040,
37660x40800000,
37670x0005083b,
37680x00000000,
37690x7c6e502e,
37700x7c8e582e,
37710x7dce54ae,
37720x7dee5cae,
37730x7c03b040,
37740x7c84b040,
37750x4c002202,
37760x40800000,
37770x0005083d,
37780x00000000,
37790x48000000,
37800x00050099,
37810x00000000,
37820x7c6e502e,
37830x7c2e54ae,
37840x7c8e582e,
37850x7c4e5cae,
37860x7c03b040,
37870x7c84b040,
37880x4c002202,
37890x40800000,
37900x0005083d,
37910x48000001,
37920x0003001d,
37930x7c2ea5ae,
37940x80f00000,
37950x3a100004,
37960x54e815ba,
37970x54ea5d78,
37980x54ec9b78,
37990x7c11402e,
38000x54f4dd78,
38010x54eb9d78,
38020x7c0903a6,
38030x4e800420,
38040x00000000,
38050x7caa5850,
38060x91d20000,
38070x00098200,
38080x7c8e5a14,
38090x7d555378,
38100x0006002a,
38110x92010008,
38120x7e439378,
38130x54a500fe,
38140x000900ab,
38150x48000001,
38160x00030029,
38170x28030000,
38180x81d20000,
38190x00098200,
38200x40820000,
38210x00050835,
38220x7c0eacae,
38230x7c0ea5ae,
38240x80f00000,
38250x3a100004,
38260x54e815ba,
38270x54ea5d78,
38280x54ec9b78,
38290x7c11402e,
38300x54f4dd78,
38310x54eb9d78,
38320x7c0903a6,
38330x4e800420,
38340x00000000,
38350x5588007e,
38360x000900ab,
38370x2108fffc,
38380x7c0f402e,
38390x39200000,
38400x00098200,
38410x80f00000,
38420x3a100004,
38430x7d34716e,
38440x90140004,
38450x54e815ba,
38460x54ea5d78,
38470x54ec9b78,
38480x7c11402e,
38490x54f4dd78,
38500x54eb9d78,
38510x7c0903a6,
38520x4e800420,
38530x00000000,
38540x5588007e,
38550x000900ab,
38560x2108fffc,
38570x7c0f402e,
38580x39200000,
38590x00098200,
38600x80f00000,
38610x3a100004,
38620x7d34716e,
38630x90140004,
38640x54e815ba,
38650x54ea5d78,
38660x54ec9b78,
38670x7c11402e,
38680x54f4dd78,
38690x54eb9d78,
38700x7c0903a6,
38710x4e800420,
38720x00000000,
38730x558c6800,
38740x000900a1,
38750x7d8c8670,
38760x6d8c8000,
38770x91810024,
38780xc8010020,
38790xfc00f828,
38800x80f00000,
38810x3a100004,
38820x7c0ea5ae,
38830x54e815ba,
38840x54ea5d78,
38850x54ec9b78,
38860x7c11402e,
38870x54f4dd78,
38880x54eb9d78,
38890x7c0903a6,
38900x4e800420,
38910x00000000,
38920x7c0f64ae,
38930x80f00000,
38940x3a100004,
38950x7c0ea5ae,
38960x54e815ba,
38970x54ea5d78,
38980x54ec9b78,
38990x7c11402e,
39000x54f4dd78,
39010x54eb9d78,
39020x7c0903a6,
39030x4e800420,
39040x00000000,
39050x558800fe,
39060x000900ab,
39070x7d0040f8,
39080x80f00000,
39090x3a100004,
39100x7c0ea12e,
39110x54e815ba,
39120x54ea5d78,
39130x54ec9b78,
39140x7c11402e,
39150x54f4dd78,
39160x54eb9d78,
39170x7c0903a6,
39180x4e800420,
39190x00000000,
39200x7eeea12e,
39210x3a940008,
39220x0006000b,
39230x7eeea12e,
39240x7c146000,
39250x3a940008,
39260x41800000,
39270x0005080b,
39280x80f00000,
39290x3a100004,
39300x54e815ba,
39310x54ea5d78,
39320x54ec9b78,
39330x7c11402e,
39340x54f4dd78,
39350x54eb9d78,
39360x7c0903a6,
39370x4e800420,
39380x00000000,
39390x80f00000,
39400x3a100004,
39410x814efffc,
39420x558c007e,
39430x000900ab,
39440x398c0000,
39450x00098200,
39460x7d4a602e,
39470x810a0000,
39480x00098200,
39490xc8080000,
39500x7c0ea5ae,
39510x54e815ba,
39520x54ea5d78,
39530x54ec9b78,
39540x7c11402e,
39550x54f4dd78,
39560x54eb9d78,
39570x7c0903a6,
39580x4e800420,
39590x00000000,
39600x814efffc,
39610x5694007e,
39620x000900ab,
39630x3a940000,
39640x00098200,
39650x7c0c74ee,
39660x7d4aa02e,
39670x88ca0000,
39680x00098200,
39690x808a0000,
39700x00098200,
39710x70c60000,
39720x00090200,
39730x880a0000,
39740x00098200,
39750x812c0000,
39760xd8040000,
39770x28800000,
39780x810c0004,
39790x4c423382,
39800x39290000,
39810x00098200,
39820x40820000,
39830x00050802,
39840x0006000b,
39850x80f00000,
39860x3a100004,
39870x54e815ba,
39880x54ea5d78,
39890x54ec9b78,
39900x7c11402e,
39910x54f4dd78,
39920x54eb9d78,
39930x7c0903a6,
39940x4e800420,
39950x0006000c,
39960x28090000,
39970x00090200,
39980x40800000,
39990x0005080b,
40000x88c80000,
40010x00098200,
40020x70c60000,
40030x00090200,
40040x38710000,
40050x00098200,
40060x41820000,
40070x0005080b,
40080x48000001,
40090x0003002a,
40100x48000000,
40110x0005000b,
40120x00000000,
40130x80f00000,
40140x3a100004,
40150x814efffc,
40160x5588007e,
40170x000900ab,
40180x5694007e,
40190x000900ab,
40200x2108fffc,
40210x3a940000,
40220x00098200,
40230x7d0f402e,
40240x7d4aa02e,
40250x88ca0000,
40260x00098200,
40270x808a0000,
40280x00098200,
40290x70c60000,
40300x00090200,
40310x88c80000,
40320x00098200,
40330x892a0000,
40340x00098200,
40350x38000000,
40360x00098200,
40370x91040004,
40380x90040000,
40390x40820000,
40400x00050802,
40410x0006000b,
40420x54e815ba,
40430x54ea5d78,
40440x54ec9b78,
40450x7c11402e,
40460x54f4dd78,
40470x54eb9d78,
40480x7c0903a6,
40490x4e800420,
40500x0006000c,
40510x70c60000,
40520x00090200,
40530x28890000,
40540x4c423382,
40550x38710000,
40560x00098200,
40570x41820000,
40580x0005080b,
40590x48000001,
40600x0003002a,
40610x48000000,
40620x0005000b,
40630x00000000,
40640x80f00000,
40650x3a100004,
40660x814efffc,
40670x5694007e,
40680x000900ab,
40690x3a940000,
40700x00098200,
40710x7c0f64ae,
40720x7d4aa02e,
40730x810a0000,
40740x00098200,
40750xd8080000,
40760x54e815ba,
40770x54ea5d78,
40780x54ec9b78,
40790x7c11402e,
40800x54f4dd78,
40810x54eb9d78,
40820x7c0903a6,
40830x4e800420,
40840x00000000,
40850x80f00000,
40860x3a100004,
40870x814efffc,
40880x5694007e,
40890x000900ab,
40900x3a940000,
40910x00098200,
40920x558000fe,
40930x000900ab,
40940x7d4aa02e,
40950x7c0000f8,
40960x810a0000,
40970x00098200,
40980x90080000,
40990x54e815ba,
41000x54ea5d78,
41010x54ec9b78,
41020x7c11402e,
41030x54f4dd78,
41040x54eb9d78,
41050x7c0903a6,
41060x4e800420,
41070x00000000,
41080x81120000,
41090x00098200,
41100x5580007e,
41110x000900ab,
41120x7e100214,
41130x3e100000,
41140x00098200,
41150x91d20000,
41160x00098200,
41170x28080000,
41180x7e439378,
41190x41820000,
41200x00050801,
41210x7c8ea214,
41220x48000001,
41230x0003002b,
41240x81d20000,
41250x00098200,
41260x0006000b,
41270x80f00000,
41280x3a100004,
41290x54e815ba,
41300x54ea5d78,
41310x54ec9b78,
41320x7c11402e,
41330x54f4dd78,
41340x54eb9d78,
41350x7c0903a6,
41360x4e800420,
41370x00000000,
41380x5588007e,
41390x000900ab,
41400x91d20000,
41410x00098200,
41420x2108fffc,
41430x92010008,
41440x7c8f402e,
41450x7e439378,
41460x80aefffc,
41470x48000001,
41480x0003002c,
41490x81d20000,
41500x00098200,
41510x38000000,
41520x00098200,
41530x7c14716e,
41540x90740004,
41550x80f00000,
41560x3a100004,
41570x54e815ba,
41580x54ea5d78,
41590x54ec9b78,
41600x7c11402e,
41610x54f4dd78,
41620x54eb9d78,
41630x7c0903a6,
41640x4e800420,
41650x00000000,
41660x80110000,
41670x00098200,
41680x7e439378,
41690x81110000,
41700x00098200,
41710x91d20000,
41720x00098200,
41730x7c004040,
41740x92010008,
41750x40800000,
41760x00050805,
41770x0006000b,
41780x00000000,
41790x5584ed7e,
41800x558596fe,
41810x2c0407ff,
41820x41820000,
41830x00050803,
41840x0006000c,
41850x48000001,
41860x0003002d,
41870x00000000,
41880x5588007e,
41890x000900ab,
41900x2108fffc,
41910x7c8f402e,
41920x48000001,
41930x0003002e,
41940x00000000,
41950x81d20000,
41960x00098200,
41970x38000000,
41980x00098200,
41990x7c14716e,
42000x90740004,
42010x80f00000,
42020x3a100004,
42030x54e815ba,
42040x54ea5d78,
42050x54ec9b78,
42060x7c11402e,
42070x54f4dd78,
42080x54eb9d78,
42090x7c0903a6,
42100x4e800420,
42110x00000000,
42120x0006000d,
42130x38800801,
42140x48000000,
42150x0005000c,
42160x00000000,
42170x0006000f,
42180x7d956378,
42190x48000001,
42200x0003002f,
42210x7eacab78,
42220x7e439378,
42230x48000000,
42240x0005000b,
42250x00000000,
42260x812efffc,
42270x5588007e,
42280x000900ab,
42290x81490000,
42300x00098200,
42310x2108fffc,
42320x7d6f402e,
42330x00000000,
42340x48000000,
42350x0005009a,
42360x00000000,
42370x48000000,
42380x0005009b,
42390x00000000,
42400x7c6a706e,
42410x7c8b706e,
42420x814a0004,
42430xc80b0000,
42440x2c030000,
42450x00098200,
42460x7c84b040,
42470x40820000,
42480x0005082f,
42490x40840000,
42500x00050805,
42510xfc20001e,
42520xfc40f02a,
42530xd8210008,
42540x800a0000,
42550x00098200,
42560xfc42f028,
42570x8121000c,
42580x810a0000,
42590x00098200,
42600xfc801000,
42610x7c004840,
42620x4c213202,
42630x55291800,
42640x000900a1,
42650x40810000,
42660x0005082f,
42670x7c08482e,
42680x7dc84cae,
42690x2c000000,
42700x00098200,
42710x41820000,
42720x00050802,
42730x0006000b,
42740x80f00000,
42750x3a100004,
42760x7dcea5ae,
42770x54e815ba,
42780x54ea5d78,
42790x54ec9b78,
42800x7c11402e,
42810x54f4dd78,
42820x54eb9d78,
42830x7c0903a6,
42840x4e800420,
42850x0006000c,
42860x812a0000,
42870x00098200,
42880x28090000,
42890x41820000,
42900x0005080b,
42910x88090000,
42920x00098200,
42930x70000000,
42940x00090200,
42950x40820000,
42960x0005080b,
42970x48000000,
42980x0005002f,
42990x0006000f,
43000x2c040000,
43010x00098200,
43020x40820000,
43030x0005082f,
43040x816b0004,
43050x48000000,
43060x0005009a,
43070x00000000,
43080x7c6a706e,
43090x5568007e,
43100x000900ab,
43110x814a0004,
43120x2108fffc,
43130x2c030000,
43140x00098200,
43150x7d6f402e,
43160x40820000,
43170x0005082c,
43180x0006009a,
43190x800a0000,
43200x00098200,
43210x810b0000,
43220x00098200,
43230x812a0000,
43240x00098200,
43250x7d080038,
43260x55002800,
43270x000900a1,
43280x55081800,
43290x000900a1,
43300x7d080050,
43310x7d294214,
43320x0006000b,
43330x80690000,
43340x00098200,
43350x80090000,
43360x00098200,
43370x80890000,
43380x00098200,
43390x81090000,
43400x00098200,
43410x2c030000,
43420x00098200,
43430x40820000,
43440x00050804,
43450x7c005800,
43460x40820000,
43470x00050804,
43480x2c040000,
43490x00098200,
43500x41820000,
43510x00050805,
43520x0006000d,
43530x7c94716e,
43540x91140004,
43550x80f00000,
43560x3a100004,
43570x54e815ba,
43580x54ea5d78,
43590x54ec9b78,
43600x7c11402e,
43610x54f4dd78,
43620x54eb9d78,
43630x7c0903a6,
43640x4e800420,
43650x0006000e,
43660x81290000,
43670x00098200,
43680x00000000,
43690x28090000,
43700x40820000,
43710x0005080b,
43720x38800000,
43730x00098200,
43740x0006000f,
43750x812a0000,
43760x00098200,
43770x28090000,
43780x41820000,
43790x0005080d,
43800x88090000,
43810x00098200,
43820x70000000,
43830x00090200,
43840x40820000,
43850x0005080d,
43860x48000000,
43870x0005002d,
43880x00000000,
43890x7c6a706e,
43900x814a0004,
43910x556000fe,
43920x000900ab,
43930x2c030000,
43940x00098200,
43950x40820000,
43960x0005082e,
43970x810a0000,
43980x00098200,
43990x812a0000,
44000x00098200,
44010x7c004040,
44020x40800000,
44030x0005082e,
44040x7d09582e,
44050x7c095cae,
44060x2c080000,
44070x00098200,
44080x41820000,
44090x00050805,
44100x0006000b,
44110x80f00000,
44120x3a100004,
44130x7c0ea5ae,
44140x54e815ba,
44150x54ea5d78,
44160x54ec9b78,
44170x7c11402e,
44180x54f4dd78,
44190x54eb9d78,
44200x7c0903a6,
44210x4e800420,
44220x0006000f,
44230x812a0000,
44240x00098200,
44250x28090000,
44260x41820000,
44270x0005080b,
44280x89290000,
44290x00098200,
44300x71290000,
44310x00090200,
44320x40820000,
44330x0005080b,
44340x48000000,
44350x0005002e,
44360x00000000,
44370x7c6a706e,
44380x7c8b706e,
44390x814a0004,
44400xc80b0000,
44410x2c030000,
44420x00098200,
44430x7c84b040,
44440x40820000,
44450x00050833,
44460x40840000,
44470x00050805,
44480xfc20001e,
44490xfc40f02a,
44500xd8210008,
44510x800a0000,
44520x00098200,
44530xfc42f028,
44540x8121000c,
44550x810a0000,
44560x00098200,
44570xfc801000,
44580x7c004840,
44590x4c213202,
44600x55201800,
44610x000900a1,
44620x40810000,
44630x00050833,
44640x7d28002e,
44650x88ca0000,
44660x00098200,
44670x7dcea4ae,
44680x2c090000,
44690x00098200,
44700x41820000,
44710x00050803,
44720x0006000b,
44730x70c90000,
44740x00090200,
44750x7dc805ae,
44760x40820000,
44770x00050807,
44780x0006000c,
44790x80f00000,
44800x3a100004,
44810x54e815ba,
44820x54ea5d78,
44830x54ec9b78,
44840x7c11402e,
44850x54f4dd78,
44860x54eb9d78,
44870x7c0903a6,
44880x4e800420,
44890x0006000d,
44900x812a0000,
44910x00098200,
44920x28090000,
44930x41820000,
44940x0005080b,
44950x89290000,
44960x00098200,
44970x71290000,
44980x00090200,
44990x40820000,
45000x0005080b,
45010x48000000,
45020x00050033,
45030x0006000f,
45040x00000000,
45050x2c040000,
45060x00098200,
45070x40820000,
45080x00050833,
45090x816b0004,
45100x48000000,
45110x0005009b,
45120x00060011,
45130x80110000,
45140x00098200,
45150x54c607b8,
45160x91510000,
45170x00098200,
45180x98ca0000,
45190x00098200,
45200x900a0000,
45210x00098200,
45220x48000000,
45230x0005000c,
45240x00000000,
45250x0006000b,
45260x2c030000,
45270x00098200,
45280x40820000,
45290x00050804,
45300x7c005800,
45310x40820000,
45320x00050804,
45330x2c040000,
45340x00098200,
45350x41820000,
45360x00050805,
45370x0006000d,
45380x7c94716e,
45390x91140004,
45400x80f00000,
45410x3a100004,
45420x54e815ba,
45430x54ea5d78,
45440x54ec9b78,
45450x7c11402e,
45460x54f4dd78,
45470x54eb9d78,
45480x7c0903a6,
45490x4e800420,
45500x00000000,
45510x7c6a706e,
45520x5568007e,
45530x000900ab,
45540x814a0004,
45550x2108fffc,
45560x2c030000,
45570x00098200,
45580x7d6f402e,
45590x40820000,
45600x00050830,
45610x0006009b,
45620x800a0000,
45630x00098200,
45640x810b0000,
45650x00098200,
45660x812a0000,
45670x00098200,
45680x9b0a0000,
45690x00098200,
45700x7d080038,
45710x7dcea4ae,
45720x55002800,
45730x000900a1,
45740x55081800,
45750x000900a1,
45760x7d080050,
45770x88ca0000,
45780x00098200,
45790x7d294214,
45800x0006000b,
45810x80690000,
45820x00098200,
45830x80090000,
45840x00098200,
45850x80890000,
45860x00098200,
45870x81090000,
45880x00098200,
45890x2c030000,
45900x00098200,
45910x40820000,
45920x00050805,
45930x7c005800,
45940x40820000,
45950x00050805,
45960x2c040000,
45970x00098200,
45980x41820000,
45990x00050804,
46000x0006000c,
46010x00000000,
46020x70c00000,
46030x00090200,
46040xd9c90000,
46050x00098200,
46060x40820000,
46070x00050807,
46080x0006000d,
46090x80f00000,
46100x3a100004,
46110x54e815ba,
46120x54ea5d78,
46130x54ec9b78,
46140x7c11402e,
46150x54f4dd78,
46160x54eb9d78,
46170x7c0903a6,
46180x4e800420,
46190x0006000e,
46200x810a0000,
46210x00098200,
46220x28080000,
46230x41820000,
46240x0005080c,
46250x88080000,
46260x00098200,
46270x70000000,
46280x00090200,
46290x40820000,
46300x0005080c,
46310x48000000,
46320x00050031,
46330x0006000f,
46340x81290000,
46350x00098200,
46360x28090000,
46370x40820000,
46380x0005080b,
46390x810a0000,
46400x00098200,
46410x38b10000,
46420x00098200,
46430x92010008,
46440x7e439378,
46450x28080000,
46460x91d20000,
46470x00098200,
46480x41820000,
46490x00050806,
46500x88080000,
46510x00098200,
46520x70000000,
46530x00090200,
46540x41820000,
46550x00050831,
46560x00060010,
46570x00000000,
46580x38000000,
46590x00098200,
46600x91650004,
46610x7d445378,
46620x90050000,
46630x48000001,
46640x00030030,
46650x81d20000,
46660x00098200,
46670xd9c30000,
46680x48000000,
46690x0005000d,
46700x00060011,
46710x80110000,
46720x00098200,
46730x54c607b8,
46740x91510000,
46750x00098200,
46760x98ca0000,
46770x00098200,
46780x900a0000,
46790x00098200,
46800x48000000,
46810x0005000d,
46820x00000000,
46830x7c6a706e,
46840x814a0004,
46850x556000fe,
46860x000900ab,
46870x2c030000,
46880x00098200,
46890x40820000,
46900x00050832,
46910x810a0000,
46920x00098200,
46930x812a0000,
46940x00098200,
46950x88ca0000,
46960x00098200,
46970x7c004040,
46980x7dcea4ae,
46990x40800000,
47000x00050832,
47010x7d09582e,
47020x2c080000,
47030x00098200,
47040x41820000,
47050x00050805,
47060x0006000b,
47070x70c00000,
47080x00090200,
47090x7dc95dae,
47100x40820000,
47110x00050807,
47120x0006000c,
47130x80f00000,
47140x3a100004,
47150x54e815ba,
47160x54ea5d78,
47170x54ec9b78,
47180x7c11402e,
47190x54f4dd78,
47200x54eb9d78,
47210x7c0903a6,
47220x4e800420,
47230x0006000f,
47240x810a0000,
47250x00098200,
47260x28080000,
47270x41820000,
47280x0005080b,
47290x89080000,
47300x00098200,
47310x71080000,
47320x00090200,
47330x40820000,
47340x0005080b,
47350x48000000,
47360x00050032,
47370x00060011,
47380x80110000,
47390x00098200,
47400x00000000,
47410x54c607b8,
47420x91510000,
47430x00098200,
47440x98ca0000,
47450x00098200,
47460x900a0000,
47470x00098200,
47480x48000000,
47490x0005000c,
47500x00000000,
47510x7e8ea214,
47520x0006000b,
47530x7ccf6214,
47540x8094fffc,
47550x3413fff8,
47560x80c60004,
47570x540500fe,
47580x000900ab,
47590x41820000,
47600x00050804,
47610x7ca53214,
47620x81240000,
47630x00098200,
47640x54c81800,
47650x000900a1,
47660x88c40000,
47670x00098200,
47680x7c054840,
47690x7d340214,
47700x80040000,
47710x00098200,
47720x41810000,
47730x00050805,
47740x7d080214,
47750x70c00000,
47760x00090200,
47770x0006000d,
47780xc8140000,
47790x3a940008,
47800x7c944800,
47810xd8080000,
47820x39080008,
47830x41840000,
47840x0005080d,
47850x40820000,
47860x00050807,
47870x0006000e,
47880x80f00000,
47890x3a100004,
47900x54e815ba,
47910x54ea5d78,
47920x54ec9b78,
47930x7c11402e,
47940x54f4dd78,
47950x54eb9d78,
47960x7c0903a6,
47970x4e800420,
47980x0006000f,
47990x91d20000,
48000x00098200,
48010x7e439378,
48020x92010008,
48030x7d956378,
48040x48000001,
48050x00030031,
48060x7eacab78,
48070x48000000,
48080x0005000b,
48090x00060011,
48100x80110000,
48110x00098200,
48120x54c607b8,
48130x91510000,
48140x00098200,
48150x98ca0000,
48160x00098200,
48170x900a0000,
48180x00098200,
48190x00000000,
48200x48000000,
48210x0005000e,
48220x00000000,
48230x7d6b9a14,
48240x00000000,
48250x7dc97378,
48260x7c0ea06e,
48270x814e0004,
48280x396bfff8,
48290x39ce0008,
48300x2c000000,
48310x00098200,
48320x40820000,
48330x00050825,
48340x920efff8,
48350x820a0000,
48360x00098200,
48370x80f00000,
48380x3a100004,
48390x54e815ba,
48400x54f4dd78,
48410x7c11402e,
48420x7e947214,
48430x7c0903a6,
48440x4e800420,
48450x00000000,
48460x7d6b9a14,
48470x00000000,
48480x7c14706e,
48490x81540004,
48500x396bfff8,
48510x810efff8,
48520x2c000000,
48530x00098200,
48540x3a940008,
48550x40820000,
48560x00050840,
48570x00060041,
48580x71000000,
48590x00090200,
48600x88ca0000,
48610x00098200,
48620x69090000,
48630x00090200,
48640x288b0000,
48650x40820000,
48660x00050807,
48670x0006000b,
48680x914efffc,
48690x39200000,
48700x2b860001,
48710x41860000,
48720x00050803,
48730x0006000c,
48740x38c90008,
48750x7c144cae,
48760x7c865840,
48770x7c0e4dae,
48780x7cc93378,
48790x40860000,
48800x0005080c,
48810x0006000d,
48820x4c42ea02,
48830x41820000,
48840x00050805,
48850x0006000e,
48860x820a0000,
48870x00098200,
48880x80f00000,
48890x3a100004,
48900x54e815ba,
48910x54f4dd78,
48920x7c11402e,
48930x7e947214,
48940x7c0903a6,
48950x4e800420,
48960x0006000f,
48970x80e8fffc,
48980x54f4dd78,
48990x7d147050,
49000x81080000,
49010x00098200,
49020x81080000,
49030x00098200,
49040x81e80000,
49050x00098200,
49060x48000000,
49070x0005000e,
49080x00060011,
49090x71200000,
49100x00090200,
49110x00000000,
49120x40820000,
49130x0005080b,
49140x7dc97050,
49150x810efff8,
49160x71000000,
49170x00090200,
49180x48000000,
49190x0005000b,
49200x00000000,
49210x7dc97378,
49220x7dcea214,
49230x810effe8,
49240x814effec,
49250xc82efff8,
49260xc80efff0,
49270x910e0000,
49280x914e0004,
49290x2c080000,
49300x00098200,
49310xd82e0010,
49320x39600010,
49330xdc0e0008,
49340x40820000,
49350x00050825,
49360x920efff8,
49370x820a0000,
49380x00098200,
49390x80f00000,
49400x3a100004,
49410x54e815ba,
49420x54f4dd78,
49430x7c11402e,
49440x7e947214,
49450x7c0903a6,
49460x4e800420,
49470x00000000,
49480x7e8ea214,
49490x8154fff4,
49500x8174fffc,
49510x800a0000,
49520x00098200,
49530x810a0000,
49540x00098200,
49550x3a100004,
49560x0006000b,
49570x7c0b0040,
49580x55661800,
49590x000900a1,
49600x40800000,
49610x00050805,
49620x7d28302e,
49630x7c0834ae,
49640x2c090000,
49650x00098200,
49660x80f0fffc,
49670x41820000,
49680x00050804,
49690x91610024,
49700xc8210020,
49710xfc21f028,
49720x396b0001,
49730x3cd00000,
49740x00098200,
49750xd8140008,
49760x54e893ba,
49770x9174fffc,
49780x7e083214,
49790xd8340000,
49800x0006000d,
49810x80f00000,
49820x3a100004,
49830x54e815ba,
49840x54ea5d78,
49850x54ec9b78,
49860x7c11402e,
49870x54f4dd78,
49880x54eb9d78,
49890x7c0903a6,
49900x4e800420,
49910x0006000e,
49920x396b0001,
49930x48000000,
49940x0005000b,
49950x0006000f,
49960x810a0000,
49970x00098200,
49980x7d605850,
49990x812a0000,
50000x00098200,
50010x00060010,
50020x7c0b4040,
50030x55662800,
50040x000900a1,
50050x41810000,
50060x0005080d,
50070x556a1800,
50080x000900a1,
50090x7cca3050,
50100x7d49302e,
50110x7c0934ae,
50120x7cc93214,
50130x2c0a0000,
50140x00098200,
50150x80f0fffc,
50160x41820000,
50170x00050807,
50180xc8260000,
50190x00098200,
50200x3d300000,
50210x00098200,
50220x00000000,
50230xd8140008,
50240x7d6b0214,
50250x54e893ba,
50260xd8340000,
50270x396b0001,
50280x7e084a14,
50290x9174fffc,
50300x48000000,
50310x0005000d,
50320x00060011,
50330x396b0001,
50340x48000000,
50350x00050010,
50360x00000000,
50370x7e8ea214,
50380x8014ffe8,
50390x8114ffec,
50400x8134fff0,
50410x80d4fff8,
50420x2c090000,
50430x00098200,
50440x2c800000,
50450x00098200,
50460x2f060000,
50470x00098200,
50480x40860000,
50490x00050805,
50500x89080000,
50510x00098200,
50520x4c42d202,
50530x2f880000,
50540x00098200,
50550x5580007e,
50560x000900ab,
50570x4c42f202,
50580x7cd00214,
50590x40820000,
50600x00050805,
50610x9314fffc,
50620x3e060000,
50630x00098200,
50640x0006000b,
50650x80f00000,
50660x3a100004,
50670x54e815ba,
50680x54ea5d78,
50690x54ec9b78,
50700x7c11402e,
50710x54f4dd78,
50720x54eb9d78,
50730x7c0903a6,
50740x4e800420,
50750x0006000f,
50760x38000000,
50770x00098200,
50780x39000000,
50790x00098200,
50800x9810ffff,
50810x3e060000,
50820x00098200,
50830x99100003,
50840x48000000,
50850x0005000b,
50860x00000000,
50870x800efff8,
50880x7d6e5a14,
50890x7e8ea214,
50900x396b0000,
50910x00098200,
50920x7d345214,
50930x38cefff8,
50940x7d605850,
50950x288a0000,
50960x7d0b3051,
50970x41860000,
50980x00050805,
50990x3929fff0,
51000x40810000,
51010x00050802,
51020x0006000b,
51030xc80b0000,
51040x396b0008,
51050xd8140000,
51060x7c144840,
51070x7c8b3040,
51080x40800000,
51090x00050803,
51100x3a940008,
51110x41840000,
51120x0005080b,
51130x0006000c,
51140x92f40000,
51150x7c144840,
51160x3a940008,
51170x41800000,
51180x0005080c,
51190x0006000d,
51200x80f00000,
51210x3a100004,
51220x54e815ba,
51230x54ea5d78,
51240x54ec9b78,
51250x7c11402e,
51260x54f4dd78,
51270x54eb9d78,
51280x7c0903a6,
51290x4e800420,
51300x0006000f,
51310x80120000,
51320x00098200,
51330x3a600008,
51340x40810000,
51350x0005080d,
51360x7d344214,
51370x7c090040,
51380x3a680008,
51390x41810000,
51400x00050807,
51410x00060010,
51420xc80b0000,
51430x396b0008,
51440xd8140000,
51450x7c0b3040,
51460x3a940008,
51470x41800000,
51480x00050810,
51490x48000000,
51500x0005000d,
51510x00060011,
51520x7e439378,
51530x92920000,
51540x00098200,
51550x7eae5850,
51560x91d20000,
51570x00098200,
51580x7e8ea050,
51590x92010008,
51600x550400fe,
51610x000900ab,
51620x48000001,
51630x00030000,
51640x81d20000,
51650x00098200,
51660x00000000,
51670x7e8ea214,
51680x7d6eaa14,
51690x38cefff8,
51700x48000000,
51710x00050010,
51720x00000000,
51730x7d8c9a14,
51740x00000000,
51750x820efff8,
51760x7e8ea214,
51770x7d936378,
51780x0006000b,
51790x72000000,
51800x00090200,
51810x6a080000,
51820x00090200,
51830x40820000,
51840x0005089c,
51850x00060017,
51860x80f0fffc,
51870x2c0c0008,
51880x392efff8,
51890x396cfff8,
51900x54ea5d78,
51910x41820000,
51920x00050803,
51930x39000000,
51940x0006000c,
51950x38c80008,
51960x7c1444ae,
51970x7c065800,
51980x7c0945ae,
51990x41820000,
52000x00050803,
52010x39060008,
52020x7c3434ae,
52030x7c085800,
52040x7c2935ae,
52050x40820000,
52060x0005080c,
52070x0006000d,
52080x0006000f,
52090x7c0a6040,
52100x54f4dd78,
52110x41810000,
52120x00050806,
52130x7dd44850,
52140x810efffc,
52150x80f00000,
52160x3a100004,
52170x81080000,
52180x00098200,
52190x81e80000,
52200x00098200,
52210x54e815ba,
52220x54ea5d78,
52230x54ec9b78,
52240x7c11402e,
52250x54f4dd78,
52260x54eb9d78,
52270x7c0903a6,
52280x4e800420,
52290x00060010,
52300x390cfff8,
52310x398c0008,
52320x7ee9412e,
52330x48000000,
52340x0005000f,
52350x0006009c,
52360x71090000,
52370x00090200,
52380x40820000,
52390x00050818,
52400x7dc87050,
52410x820efff8,
52420x48000000,
52430x0005000b,
52440x00000000,
52450x820efff8,
52460x7e8ea214,
52470x7d936378,
52480x72000000,
52490x00090200,
52500x6a080000,
52510x00090200,
52520x40820000,
52530x0005089c,
52540x80f0fffc,
52550x392efff8,
52560x54ea5d78,
52570x00000000,
52580xc8140000,
52590xd8090000,
52600x00000000,
52610x0006000f,
52620x7c0a6040,
52630x54f4dd78,
52640x41810000,
52650x00050806,
52660x7dd44850,
52670x810efffc,
52680x80f00000,
52690x3a100004,
52700x81080000,
52710x00098200,
52720x81e80000,
52730x00098200,
52740x54e815ba,
52750x54ea5d78,
52760x54ec9b78,
52770x7c11402e,
52780x54f4dd78,
52790x54eb9d78,
52800x7c0903a6,
52810x4e800420,
52820x00060010,
52830x390cfff8,
52840x398c0008,
52850x7ee9412e,
52860x48000000,
52870x0005000f,
52880x00000000,
52890x7c810808,
52900x00000000,
52910x7c3474ee,
52920xc8740000,
52930x00098200,
52940xc8540000,
52950x00098200,
52960x80d40000,
52970x00098200,
52980xfc21182a,
52990xd8340000,
53000x00098200,
53010x00000000,
53020x7d14706e,
53030xc8340000,
53040x00098200,
53050x80d40000,
53060x00098200,
53070xc8740000,
53080x00098200,
53090x81340000,
53100x00098200,
53110xc8540000,
53120x00098200,
53130x7c08b040,
53140x7f86b040,
53150x7c89b040,
53160x4c00e202,
53170x4c002202,
53180x40800000,
53190x00050842,
53200x00000000,
53210x2d860000,
53220x00000000,
53230x558c007e,
53240x000900ab,
53250x00000000,
53260xd8340000,
53270x00098200,
53280x00000000,
53290x7d906214,
53300x00000000,
53310xfc011000,
53320x00000000,
53330x3e0c0000,
53340x00098200,
53350x00000000,
53360x418c0000,
53370x00050805,
53380x00000000,
53390x41810000,
53400x00050803,
53410x00000000,
53420x41810000,
53430x00050802,
53440x0006000b,
53450x3e0c0000,
53460x00098200,
53470x00000000,
53480x40810000,
53490x00070800,
53500x00000000,
53510x0006000c,
53520x80f00000,
53530x3a100004,
53540x54e815ba,
53550x54ea5d78,
53560x54ec9b78,
53570x7c11402e,
53580x54f4dd78,
53590x54eb9d78,
53600x7c0903a6,
53610x4e800420,
53620x0006000f,
53630x00000000,
53640x40800000,
53650x0005080c,
53660x0006000d,
53670x3e0c0000,
53680x00098200,
53690x00000000,
53700x40800000,
53710x0005080b,
53720x00000000,
53730x40800000,
53740x00070800,
53750x00000000,
53760x48000000,
53770x0005000c,
53780x00000000,
53790x7c810808,
53800x00000000,
53810x7d14706e,
53820x81340004,
53830x2c080000,
53840x00098200,
53850x41820000,
53860x00050801,
53870x00000000,
53880x7c810808,
53890x00000000,
53900x5580007e,
53910x000900ab,
53920x7e100214,
53930x3e100000,
53940x00098200,
53950x9114fff8,
53960x9134fffc,
53970x00000000,
53980x0006000b,
53990x80f00000,
54000x3a100004,
54010x54e815ba,
54020x54ea5d78,
54030x54ec9b78,
54040x7c11402e,
54050x54f4dd78,
54060x54eb9d78,
54070x7c0903a6,
54080x4e800420,
54090x00000000,
54100x7c810808,
54110x00000000,
54120x80f00000,
54130x3a100004,
54140x54e815ba,
54150x54ea5d78,
54160x54ec9b78,
54170x7c11402e,
54180x54f4dd78,
54190x54eb9d78,
54200x7c0903a6,
54210x4e800420,
54220x00000000,
54230x7c810808,
54240x00000000,
54250x5580007e,
54260x000900ab,
54270x7e100214,
54280x3e100000,
54290x00098200,
54300x80f00000,
54310x3a100004,
54320x54e815ba,
54330x54ea5d78,
54340x54ec9b78,
54350x7c11402e,
54360x54f4dd78,
54370x54eb9d78,
54380x7c0903a6,
54390x4e800420,
54400x00000000,
54410x7c810808,
54420x00000000,
54430x81320000,
54440x00098200,
54450x89100000,
54460x00098200,
54470x81f00000,
54480x00098200,
54490x7c144840,
54500x55081800,
54510x000900a1,
54520x41810000,
54530x00050820,
54540x80f00000,
54550x3a100004,
54560x0006000c,
54570x7c0b4040,
54580x40810000,
54590x00050803,
54600x00000000,
54610x7c810808,
54620x00000000,
54630x54e815ba,
54640x54ea5d78,
54650x54ec9b78,
54660x7c11402e,
54670x54f4dd78,
54680x54eb9d78,
54690x7c0903a6,
54700x4e800420,
54710x00000000,
54720x0006000d,
54730x7eee592e,
54740x396b0008,
54750x48000000,
54760x0005000c,
54770x00000000,
54780x7c810808,
54790x00000000,
54800x81320000,
54810x00098200,
54820x7d0e5a14,
54830x7c145a14,
54840x91480004,
54850x38cb0000,
54860x00098200,
54870x81f00000,
54880x00098200,
54890x7c004840,
54900x90c80000,
54910x40800000,
54920x00050820,
54930x89300000,
54940x00098200,
54950x7dd47378,
54960x7d0b4378,
54970x80f00000,
54980x3a100004,
54990x2c090000,
55000x39c80008,
55010x41820000,
55020x00050803,
55030x0006000b,
55040x7c145840,
55050x80140000,
55060x80d40004,
55070x40800000,
55080x00050804,
55090x92f40000,
55100x3a940008,
55110x0006000c,
55120x3529ffff,
55130x90080008,
55140x90c8000c,
55150x39080008,
55160x40820000,
55170x0005080b,
55180x0006000d,
55190x54e815ba,
55200x54ea5d78,
55210x54ec9b78,
55220x7c11402e,
55230x54f4dd78,
55240x54eb9d78,
55250x7c0903a6,
55260x4e800420,
55270x0006000e,
55280x38000000,
55290x00098200,
55300x48000000,
55310x0005000c,
55320x00000000,
55330x80ca0000,
55340x00098200,
55350x00000000,
55360x80d10000,
55370x00098200,
55380x00000000,
55390x7d145a14,
55400x81320000,
55410x00098200,
55420x7d6e5a14,
55430x91d20000,
55440x00098200,
55450x7c084840,
55460x91720000,
55470x00098200,
55480x38000000,
55490x00098200,
55500x7cc903a6,
55510x00000000,
55520x808a0000,
55530x00098200,
55540x00000000,
55550x7e439378,
55560x41810000,
55570x0005081f,
55580x90110000,
55590x00098200,
55600x4e800421,
55610x81120000,
55620x00098200,
55630x546c1800,
55640x000900a1,
55650x81d20000,
55660x00098200,
55670x38000000,
55680x00098200,
55690x820efff8,
55700x7e8c4050,
55710x90110000,
55720x00098200,
55730x48000000,
55740x00050016,
55750x00000000,
55760x00010000
5577};
5578
5579enum {
5580 GLOB_vm_returnp,
5581 GLOB_cont_dispatch,
5582 GLOB_vm_returnc,
5583 GLOB_BC_RET_Z,
5584 GLOB_vm_return,
5585 GLOB_vm_leave_cp,
5586 GLOB_vm_leave_unw,
5587 GLOB_vm_unwind_c,
5588 GLOB_vm_unwind_c_eh,
5589 GLOB_vm_unwind_ff,
5590 GLOB_vm_unwind_ff_eh,
5591 GLOB_vm_growstack_c,
5592 GLOB_vm_growstack_l,
5593 GLOB_vm_resume,
5594 GLOB_vm_pcall,
5595 GLOB_vm_call,
5596 GLOB_vm_call_dispatch,
5597 GLOB_vmeta_call,
5598 GLOB_vm_call_dispatch_f,
5599 GLOB_vm_cpcall,
5600 GLOB_vm_call_tail,
5601 GLOB_cont_cat,
5602 GLOB_BC_CAT_Z,
5603 GLOB_cont_nop,
5604 GLOB_vmeta_tgets1,
5605 GLOB_vmeta_tgets,
5606 GLOB_vmeta_tgetb,
5607 GLOB_vmeta_tgetv,
5608 GLOB_vmeta_tsets1,
5609 GLOB_vmeta_tsets,
5610 GLOB_vmeta_tsetb,
5611 GLOB_vmeta_tsetv,
5612 GLOB_vmeta_comp,
5613 GLOB_vmeta_binop,
5614 GLOB_cont_ra,
5615 GLOB_cont_condt,
5616 GLOB_cont_condf,
5617 GLOB_vmeta_equal,
5618 GLOB_vmeta_arith_vn,
5619 GLOB_vmeta_arith_nv,
5620 GLOB_vmeta_unm,
5621 GLOB_vmeta_arith_vv,
5622 GLOB_vmeta_len,
5623 GLOB_BC_LEN_Z,
5624 GLOB_vmeta_callt,
5625 GLOB_BC_CALLT_Z,
5626 GLOB_vmeta_for,
5627 GLOB_ff_assert,
5628 GLOB_fff_fallback,
5629 GLOB_fff_res,
5630 GLOB_ff_type,
5631 GLOB_fff_resn,
5632 GLOB_ff_getmetatable,
5633 GLOB_fff_restv,
5634 GLOB_ff_setmetatable,
5635 GLOB_ff_rawget,
5636 GLOB_ff_tonumber,
5637 GLOB_ff_tostring,
5638 GLOB_fff_gcstep,
5639 GLOB_ff_next,
5640 GLOB_ff_pairs,
5641 GLOB_ff_ipairs_aux,
5642 GLOB_ff_ipairs,
5643 GLOB_ff_pcall,
5644 GLOB_ff_xpcall,
5645 GLOB_ff_coroutine_resume,
5646 GLOB_ff_coroutine_wrap_aux,
5647 GLOB_ff_coroutine_yield,
5648 GLOB_ff_math_abs,
5649 GLOB_fff_res1,
5650 GLOB_ff_math_floor,
5651 GLOB_ff_math_ceil,
5652 GLOB_ff_math_sqrt,
5653 GLOB_ff_math_log,
5654 GLOB_ff_math_log10,
5655 GLOB_ff_math_exp,
5656 GLOB_ff_math_sin,
5657 GLOB_ff_math_cos,
5658 GLOB_ff_math_tan,
5659 GLOB_ff_math_asin,
5660 GLOB_ff_math_acos,
5661 GLOB_ff_math_atan,
5662 GLOB_ff_math_sinh,
5663 GLOB_ff_math_cosh,
5664 GLOB_ff_math_tanh,
5665 GLOB_ff_math_pow,
5666 GLOB_ff_math_atan2,
5667 GLOB_ff_math_fmod,
5668 GLOB_ff_math_deg,
5669 GLOB_ff_math_rad,
5670 GLOB_ff_math_ldexp,
5671 GLOB_ff_math_frexp,
5672 GLOB_ff_math_modf,
5673 GLOB_ff_math_min,
5674 GLOB_ff_math_max,
5675 GLOB_ff_string_len,
5676 GLOB_fff_resi,
5677 GLOB_ff_string_byte,
5678 GLOB_ff_string_char,
5679 GLOB_fff_newstr,
5680 GLOB_ff_string_sub,
5681 GLOB_ff_string_rep,
5682 GLOB_ff_string_reverse,
5683 GLOB_ff_string_lower,
5684 GLOB_ff_string_upper,
5685 GLOB_ff_table_getn,
5686 GLOB_ff_bit_tobit,
5687 GLOB_ff_bit_band,
5688 GLOB_ff_bit_bor,
5689 GLOB_ff_bit_bxor,
5690 GLOB_ff_bit_bswap,
5691 GLOB_ff_bit_bnot,
5692 GLOB_ff_bit_lshift,
5693 GLOB_ff_bit_rshift,
5694 GLOB_ff_bit_arshift,
5695 GLOB_ff_bit_rol,
5696 GLOB_ff_bit_ror,
5697 GLOB_vm_record,
5698 GLOB_vm_rethook,
5699 GLOB_vm_inshook,
5700 GLOB_cont_hook,
5701 GLOB_vm_hotloop,
5702 GLOB_vm_callhook,
5703 GLOB_vm_hotcall,
5704 GLOB_vm_exit_handler,
5705 GLOB_vm_exit_interp,
5706 GLOB_vm_floor,
5707 GLOB_vm_ceil,
5708 GLOB_vm_trunc,
5709 GLOB_vm_powi,
5710 GLOB_vm_foldfpm,
5711 GLOB_vm_foldarith,
5712 GLOB_vm_ffi_call,
5713 GLOB_BC_MODVN_Z,
5714 GLOB_BC_TGETS_Z,
5715 GLOB_BC_TSETS_Z,
5716 GLOB_BC_RETV_Z,
5717 GLOB__MAX
5718};
5719static const char *const globnames[] = {
5720 "vm_returnp",
5721 "cont_dispatch",
5722 "vm_returnc",
5723 "BC_RET_Z",
5724 "vm_return",
5725 "vm_leave_cp",
5726 "vm_leave_unw",
5727 "vm_unwind_c",
5728 "vm_unwind_c_eh",
5729 "vm_unwind_ff",
5730 "vm_unwind_ff_eh",
5731 "vm_growstack_c",
5732 "vm_growstack_l",
5733 "vm_resume",
5734 "vm_pcall",
5735 "vm_call",
5736 "vm_call_dispatch",
5737 "vmeta_call",
5738 "vm_call_dispatch_f",
5739 "vm_cpcall",
5740 "vm_call_tail",
5741 "cont_cat",
5742 "BC_CAT_Z",
5743 "cont_nop",
5744 "vmeta_tgets1",
5745 "vmeta_tgets",
5746 "vmeta_tgetb",
5747 "vmeta_tgetv",
5748 "vmeta_tsets1",
5749 "vmeta_tsets",
5750 "vmeta_tsetb",
5751 "vmeta_tsetv",
5752 "vmeta_comp",
5753 "vmeta_binop",
5754 "cont_ra",
5755 "cont_condt",
5756 "cont_condf",
5757 "vmeta_equal",
5758 "vmeta_arith_vn",
5759 "vmeta_arith_nv",
5760 "vmeta_unm",
5761 "vmeta_arith_vv",
5762 "vmeta_len",
5763 "BC_LEN_Z",
5764 "vmeta_callt",
5765 "BC_CALLT_Z",
5766 "vmeta_for",
5767 "ff_assert",
5768 "fff_fallback",
5769 "fff_res",
5770 "ff_type",
5771 "fff_resn",
5772 "ff_getmetatable",
5773 "fff_restv",
5774 "ff_setmetatable",
5775 "ff_rawget",
5776 "ff_tonumber",
5777 "ff_tostring",
5778 "fff_gcstep",
5779 "ff_next",
5780 "ff_pairs",
5781 "ff_ipairs_aux",
5782 "ff_ipairs",
5783 "ff_pcall",
5784 "ff_xpcall",
5785 "ff_coroutine_resume",
5786 "ff_coroutine_wrap_aux",
5787 "ff_coroutine_yield",
5788 "ff_math_abs",
5789 "fff_res1",
5790 "ff_math_floor",
5791 "ff_math_ceil",
5792 "ff_math_sqrt",
5793 "ff_math_log",
5794 "ff_math_log10",
5795 "ff_math_exp",
5796 "ff_math_sin",
5797 "ff_math_cos",
5798 "ff_math_tan",
5799 "ff_math_asin",
5800 "ff_math_acos",
5801 "ff_math_atan",
5802 "ff_math_sinh",
5803 "ff_math_cosh",
5804 "ff_math_tanh",
5805 "ff_math_pow",
5806 "ff_math_atan2",
5807 "ff_math_fmod",
5808 "ff_math_deg",
5809 "ff_math_rad",
5810 "ff_math_ldexp",
5811 "ff_math_frexp",
5812 "ff_math_modf",
5813 "ff_math_min",
5814 "ff_math_max",
5815 "ff_string_len",
5816 "fff_resi",
5817 "ff_string_byte",
5818 "ff_string_char",
5819 "fff_newstr",
5820 "ff_string_sub",
5821 "ff_string_rep",
5822 "ff_string_reverse",
5823 "ff_string_lower",
5824 "ff_string_upper",
5825 "ff_table_getn",
5826 "ff_bit_tobit",
5827 "ff_bit_band",
5828 "ff_bit_bor",
5829 "ff_bit_bxor",
5830 "ff_bit_bswap",
5831 "ff_bit_bnot",
5832 "ff_bit_lshift",
5833 "ff_bit_rshift",
5834 "ff_bit_arshift",
5835 "ff_bit_rol",
5836 "ff_bit_ror",
5837 "vm_record",
5838 "vm_rethook",
5839 "vm_inshook",
5840 "cont_hook",
5841 "vm_hotloop",
5842 "vm_callhook",
5843 "vm_hotcall",
5844 "vm_exit_handler",
5845 "vm_exit_interp",
5846 "vm_floor",
5847 "vm_ceil",
5848 "vm_trunc",
5849 "vm_powi",
5850 "vm_foldfpm",
5851 "vm_foldarith",
5852 "vm_ffi_call",
5853 "BC_MODVN_Z",
5854 "BC_TGETS_Z",
5855 "BC_TSETS_Z",
5856 "BC_RETV_Z",
5857 (const char *)0
5858};
5859static const char *const extnames[] = {
5860 "lj_state_growstack",
5861 "lj_meta_tget",
5862 "lj_meta_tset",
5863 "lj_meta_comp",
5864 "lj_meta_equal",
5865 "lj_meta_arith",
5866 "lj_meta_len",
5867 "lj_meta_call",
5868 "lj_meta_for",
5869 "lj_tab_get",
5870 "lj_str_fromnum",
5871 "lj_tab_next",
5872 "lj_tab_getinth",
5873 "lj_ffh_coroutine_wrap_err",
5874 "floor",
5875 "ceil",
5876 "sqrt",
5877 "log",
5878 "log10",
5879 "exp",
5880 "sin",
5881 "cos",
5882 "tan",
5883 "asin",
5884 "acos",
5885 "atan",
5886 "sinh",
5887 "cosh",
5888 "tanh",
5889 "pow",
5890 "atan2",
5891 "fmod",
5892 "ldexp",
5893 "frexp",
5894 "modf",
5895 "lj_str_new",
5896 "lj_tab_len",
5897 "lj_gc_step",
5898 "lj_dispatch_ins",
5899 "lj_dispatch_call",
5900 "trunc",
5901 "lj_meta_cat",
5902 "lj_gc_barrieruv",
5903 "lj_func_closeuv",
5904 "lj_func_newL_gc",
5905 "lj_tab_new",
5906 "lj_tab_dup",
5907 "lj_gc_step_fixtop",
5908 "lj_tab_newkey",
5909 "lj_tab_reasize",
5910 (const char *)0
5911};
5912#define Dt1(_V) (int)(ptrdiff_t)&(((lua_State *)0)_V)
5913#define Dt2(_V) (int)(ptrdiff_t)&(((global_State *)0)_V)
5914#define Dt3(_V) (int)(ptrdiff_t)&(((TValue *)0)_V)
5915#define Dt4(_V) (int)(ptrdiff_t)&(((GCobj *)0)_V)
5916#define Dt5(_V) (int)(ptrdiff_t)&(((GCstr *)0)_V)
5917#define Dt6(_V) (int)(ptrdiff_t)&(((GCtab *)0)_V)
5918#define Dt7(_V) (int)(ptrdiff_t)&(((GCfuncL *)0)_V)
5919#define Dt8(_V) (int)(ptrdiff_t)&(((GCfuncC *)0)_V)
5920#define Dt9(_V) (int)(ptrdiff_t)&(((GCproto *)0)_V)
5921#define DtA(_V) (int)(ptrdiff_t)&(((GCupval *)0)_V)
5922#define DtB(_V) (int)(ptrdiff_t)&(((Node *)0)_V)
5923#define DtC(_V) (int)(ptrdiff_t)&(((int *)0)_V)
5924#define DtD(_V) (int)(ptrdiff_t)&(((GCtrace *)0)_V)
5925#define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field))
5926#define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field))
5927#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))
5928
5929/* Generate subroutines used by opcodes and other parts of the VM. */
5930/* The .code_sub section should be last to help static branch prediction. */
5931static void build_subroutines(BuildCtx *ctx)
5932{
5933 dasm_put(Dst, 0);
5934 dasm_put(Dst, 1, FRAME_P, LJ_TTRUE, FRAME_TYPE, FRAME_C, ~LJ_VMST_C, Dt1(->base), DISPATCH_GL(vmstate), 31-3, Dt1(->top));
5935 dasm_put(Dst, 55, Dt1(->cframe), 184+(14-14)*4, 40+(14-14)*8, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4, 40+(23-14)*8);
5936 dasm_put(Dst, 103, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4, 40+(31-14)*8, Dt1(->maxstack));
5937 dasm_put(Dst, 152, Dt1(->top), 31-3, Dt1(->top), ~LJ_VMST_C, Dt1(->glref), Dt2(->vmstate), LJ_TISNUM, Dt1(->base), Dt1(->glref), LJ_TFALSE, LJ_TNIL, ~LJ_VMST_INTERP, GG_G2DISP);
5938 dasm_put(Dst, 215, DISPATCH_GL(vmstate), LUA_MINSTACK, Dt1(->base), Dt1(->top), 32-3, Dt1(->base), Dt1(->top), Dt7(->pc), 184+(14-14)*4, 40+(14-14)*8, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4);
5939 dasm_put(Dst, 275, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4, 40+(23-14)*8, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4);
5940 dasm_put(Dst, 322, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4, 40+(31-14)*8, Dt1(->glref), Dt1(->status), FRAME_CP, CFRAME_RESUME, GG_G2DISP, Dt1(->cframe), Dt1(->base), LJ_TISNUM, Dt1(->top), Dt1(->status), FRAME_TYPE, ~LJ_VMST_INTERP, LJ_TNIL, DISPATCH_GL(vmstate));
5941 dasm_put(Dst, 389, 184+(14-14)*4, 40+(14-14)*8, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4);
5942 dasm_put(Dst, 435, 40+(23-14)*8, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4, 40+(31-14)*8, FRAME_CP, 184+(14-14)*4, 40+(14-14)*8);
5943 dasm_put(Dst, 482, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4, 40+(23-14)*8, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8);
5944 dasm_put(Dst, 528, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4, 40+(31-14)*8, FRAME_C, Dt1(->cframe), Dt1(->cframe), Dt1(->glref), GG_G2DISP, Dt1(->base), LJ_TISNUM, Dt1(->top));
5945 dasm_put(Dst, 578, ~LJ_VMST_INTERP, LJ_TNIL, DISPATCH_GL(vmstate), LJ_TFUNC, Dt7(->pc), 184+(14-14)*4, 40+(14-14)*8, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4);
5946 dasm_put(Dst, 645, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4, 40+(23-14)*8, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4);
5947 dasm_put(Dst, 691, 40+(31-14)*8, Dt1(->stack), Dt1(->top), Dt1(->cframe), Dt1(->cframe), Dt1(->glref), FRAME_CP, GG_G2DISP, Dt7(->pc), PC2PROTO(k), Dt1(->base), DISPATCH_GL(tmptv));
5948 dasm_put(Dst, 765, LJ_TSTR, DISPATCH_GL(tmptv), LJ_TTAB, DISPATCH_GL(tmptv2), LJ_TSTR, DISPATCH_GL(tmptv), Dt1(->base), FRAME_CONT, Dt1(->top), DISPATCH_GL(tmptv));
5949 dasm_put(Dst, 841, LJ_TSTR, DISPATCH_GL(tmptv), LJ_TTAB, DISPATCH_GL(tmptv2), LJ_TSTR, DISPATCH_GL(tmptv), Dt1(->base), FRAME_CONT, Dt1(->top), Dt1(->base));
5950 dasm_put(Dst, 923, -(BCBIAS_J*4 >> 16), LJ_TTRUE, LJ_TTRUE, Dt1(->base));
5951 dasm_put(Dst, 994, Dt1(->base), FRAME_CONT);
5952#ifdef LUAJIT_ENABLE_LUA52COMPAT
5953 dasm_put(Dst, 1025);
5954#endif
5955 dasm_put(Dst, 1027, Dt1(->base));
5956#ifdef LUAJIT_ENABLE_LUA52COMPAT
5957 dasm_put(Dst, 1035);
5958#else
5959 dasm_put(Dst, 1042);
5960#endif
5961 dasm_put(Dst, 1045, Dt1(->base), Dt7(->pc), Dt1(->base), Dt1(->base));
5962#if LJ_HASJIT
5963 dasm_put(Dst, 1093);
5964#endif
5965 dasm_put(Dst, 1095);
5966#if LJ_HASJIT
5967 dasm_put(Dst, 1097, BC_JFORI);
5968#endif
5969 dasm_put(Dst, 1100);
5970#if LJ_HASJIT
5971 dasm_put(Dst, 1102, BC_JFORI);
5972#endif
5973 dasm_put(Dst, 1105, BC_FORI, LJ_TFALSE, ~LJ_TISNUM+1, 31-3, Dt8(->upvalue), LJ_TTAB, Dt6(->metatable));
5974 dasm_put(Dst, 1168, LJ_TNIL, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable]), Dt6(->hmask), LJ_TTAB, Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, DtB(->next));
5975 dasm_put(Dst, 1216, LJ_TNIL, LJ_TUDATA, ~LJ_TISNUM+1, 31-2, DISPATCH_GL(gcroot[GCROOT_BASEMT]), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable));
5976 dasm_put(Dst, 1271, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist), LJ_TTAB, LJ_TSTR, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), Dt1(->base));
5977 dasm_put(Dst, 1331, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, LJ_TTAB, Dt1(->base), Dt1(->top), LJ_TNIL, (2+1)*8, LJ_TTAB);
5978#ifdef LUAJIT_ENABLE_LUA52COMPAT
5979 dasm_put(Dst, 1393, Dt6(->metatable), Dt8(->upvalue[0]));
5980#else
5981 dasm_put(Dst, 1402, Dt8(->upvalue[0]));
5982#endif
5983 dasm_put(Dst, 1406, (3+1)*8, LJ_TTAB, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL, (0+1)*8, (2+1)*8, Dt6(->hmask), (0+1)*8);
5984 dasm_put(Dst, 1474, (0+1)*8, LJ_TTAB);
5985#ifdef LUAJIT_ENABLE_LUA52COMPAT
5986 dasm_put(Dst, 1495, Dt6(->metatable), Dt8(->upvalue[0]));
5987#else
5988 dasm_put(Dst, 1504, Dt8(->upvalue[0]));
5989#endif
5990 dasm_put(Dst, 1508, (3+1)*8, DISPATCH_GL(hookmask), 32-HOOK_ACTIVE_SHIFT, 8+FRAME_PCALL, DISPATCH_GL(hookmask), LJ_TFUNC, 32-HOOK_ACTIVE_SHIFT, 16+FRAME_PCALL, LJ_TTHREAD, Dt1(->status), Dt1(->cframe));
5991 dasm_put(Dst, 1570, Dt1(->top), LUA_YIELD, Dt1(->base), Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->base), LUA_YIELD, Dt1(->top), ~LJ_VMST_INTERP, Dt1(->base), DISPATCH_GL(vmstate));
5992 dasm_put(Dst, 1632, Dt1(->maxstack), Dt1(->top), FRAME_TYPE, LJ_TTRUE, FRAME_TYPE, LJ_TFALSE, Dt1(->top), (2+1)*8, 32-3);
5993 dasm_put(Dst, 1695, Dt8(->upvalue[0].gcr), Dt1(->status), Dt1(->cframe), Dt1(->top), LUA_YIELD, Dt1(->base), Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->base), LUA_YIELD, Dt1(->top), ~LJ_VMST_INTERP);
5994 dasm_put(Dst, 1754, Dt1(->base), DISPATCH_GL(vmstate), Dt1(->maxstack), Dt1(->top), FRAME_TYPE, 32-3, Dt1(->cframe));
5995 dasm_put(Dst, 1811, Dt1(->base), CFRAME_RESUME, Dt1(->top), LUA_YIELD, Dt1(->cframe), Dt1(->status), (1+1)*8, FRAME_TYPE);
5996 dasm_put(Dst, 1878);
5997 dasm_put(Dst, 1939);
5998 dasm_put(Dst, 1997);
5999 dasm_put(Dst, 2058);
6000 dasm_put(Dst, 2123, Dt8(->upvalue[0]), DISPATCH_GL(tmptv), DISPATCH_GL(tmptv), (2+1)*8);
6001 dasm_put(Dst, 2191, (2+1)*8);
6002 dasm_put(Dst, 2263, LJ_TSTR, Dt5(->len), LJ_TSTR, Dt5(->len), Dt5([1]), 31-3, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
6003 dasm_put(Dst, 2332, Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), sizeof(GCstr)-1);
6004 dasm_put(Dst, 2401, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf));
6005 dasm_put(Dst, 2471, DISPATCH_GL(strempty), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, DISPATCH_GL(tmpbuf.sz), Dt5(->len), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold));
6006 dasm_put(Dst, 2526, LJ_TSTR, DISPATCH_GL(tmpbuf.sz), Dt5(->len), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, DISPATCH_GL(tmpbuf.sz), Dt5(->len), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf));
6007 dasm_put(Dst, 2588, LJ_TTAB);
6008 dasm_put(Dst, 2668);
6009 dasm_put(Dst, 2760);
6010 dasm_put(Dst, 2863, Dt8(->f), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), 31-3, Dt1(->top), Dt7(->pc), FRAME_TYPE);
6011 dasm_put(Dst, 2941, LUA_MINSTACK, Dt1(->base), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
6012#if LJ_HASJIT
6013 dasm_put(Dst, 2975);
6014#endif
6015 dasm_put(Dst, 2977, DISPATCH_GL(hookmask), HOOK_ACTIVE, GG_DISP2STATIC, DISPATCH_GL(hookmask), DISPATCH_GL(hookcount), HOOK_ACTIVE, 31-LUA_HOOKLINE, DISPATCH_GL(hookcount), Dt1(->base), Dt1(->base));
6016 dasm_put(Dst, 3024, GG_DISP2STATIC);
6017#if LJ_HASJIT
6018 dasm_put(Dst, 3042);
6019#endif
6020 dasm_put(Dst, 3044);
6021#if LJ_HASJIT
6022 dasm_put(Dst, 3047);
6023#endif
6024 dasm_put(Dst, 3050);
6025#if LJ_HASJIT
6026 dasm_put(Dst, 3052);
6027#endif
6028 dasm_put(Dst, 3055, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
6029#if LJ_HASJIT
6030 dasm_put(Dst, 3077);
6031#endif
6032 dasm_put(Dst, 3079);
6033#if LJ_HASJIT
6034 dasm_put(Dst, 3081);
6035#endif
6036 dasm_put(Dst, 3083);
6037#if LJ_HASJIT
6038 dasm_put(Dst, 3091);
6039#endif
6040 dasm_put(Dst, 3094);
6041#if LJ_HASJIT
6042 dasm_put(Dst, 3096);
6043#endif
6044 dasm_put(Dst, 3098);
6045#if LJ_HASJIT
6046 dasm_put(Dst, 3100);
6047#endif
6048 dasm_put(Dst, 3102);
6049#if LJ_HASFFI
6050 dasm_put(Dst, 3166);
6051#endif
6052}
6053
6054/* Generate the code for a single instruction. */
6055static void build_ins(BuildCtx *ctx, BCOp op, int defop)
6056{
6057 int vk = 0;
6058 dasm_put(Dst, 3168, defop);
6059
6060 switch (op) {
6061
6062 /* -- Comparison ops ---------------------------------------------------- */
6063
6064 /* Remember: all ops branch for a true comparison, fall through otherwise. */
6065
6066 case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
6067 dasm_put(Dst, 3170, -(BCBIAS_J*4 >> 16));
6068 if (op == BC_ISLT) {
6069 dasm_put(Dst, 3187);
6070 } else if (op == BC_ISGE) {
6071 dasm_put(Dst, 3190);
6072 } else if (op == BC_ISLE) {
6073 dasm_put(Dst, 3193);
6074 } else {
6075 dasm_put(Dst, 3197);
6076 }
6077 dasm_put(Dst, 3201);
6078 break;
6079
6080 case BC_ISEQV: case BC_ISNEV:
6081 vk = op == BC_ISEQV;
6082 dasm_put(Dst, 3214, -(BCBIAS_J*4 >> 16));
6083 if (vk) {
6084 dasm_put(Dst, 3231);
6085 } else {
6086 dasm_put(Dst, 3235);
6087 }
6088 dasm_put(Dst, 3239, ~LJ_TISPRI, ~LJ_TISTABUD);
6089 if (vk) {
6090 dasm_put(Dst, 3267);
6091 } else {
6092 dasm_put(Dst, 3272);
6093 }
6094 dasm_put(Dst, 3277, Dt6(->metatable), 1-vk, Dt6(->nomm), 1<<MM_eq);
6095 break;
6096
6097 case BC_ISEQS: case BC_ISNES:
6098 vk = op == BC_ISEQS;
6099 dasm_put(Dst, 3298, 32-1, LJ_TSTR, -(BCBIAS_J*4 >> 16));
6100 if (vk) {
6101 dasm_put(Dst, 3316);
6102 } else {
6103 dasm_put(Dst, 3318);
6104 }
6105 dasm_put(Dst, 3320);
6106 break;
6107
6108 case BC_ISEQN: case BC_ISNEN:
6109 vk = op == BC_ISEQN;
6110 dasm_put(Dst, 3332, -(BCBIAS_J*4 >> 16));
6111 if (vk) {
6112 dasm_put(Dst, 3345);
6113 } else {
6114 dasm_put(Dst, 3350);
6115 }
6116 dasm_put(Dst, 3356);
6117 if (!vk) {
6118 dasm_put(Dst, 3367, -(BCBIAS_J*4 >> 16));
6119 }
6120 break;
6121
6122 case BC_ISEQP: case BC_ISNEP:
6123 vk = op == BC_ISEQP;
6124 dasm_put(Dst, 3374, 32-3, -(BCBIAS_J*4 >> 16));
6125 if (vk) {
6126 dasm_put(Dst, 3387);
6127 } else {
6128 dasm_put(Dst, 3389);
6129 }
6130 dasm_put(Dst, 3391);
6131 break;
6132
6133 /* -- Unary test and copy ops ------------------------------------------- */
6134
6135 case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
6136 dasm_put(Dst, 3403);
6137 if (op == BC_IST || op == BC_ISF) {
6138 dasm_put(Dst, 3407, LJ_TTRUE, -(BCBIAS_J*4 >> 16));
6139 if (op == BC_IST) {
6140 dasm_put(Dst, 3414);
6141 } else {
6142 dasm_put(Dst, 3416);
6143 }
6144 dasm_put(Dst, 3418);
6145 } else {
6146 dasm_put(Dst, 3420, LJ_TFALSE);
6147 if (op == BC_ISTC) {
6148 dasm_put(Dst, 3425);
6149 } else {
6150 dasm_put(Dst, 3428);
6151 }
6152 dasm_put(Dst, 3431, -(BCBIAS_J*4 >> 16));
6153 }
6154 dasm_put(Dst, 3438);
6155 break;
6156
6157 /* -- Unary ops --------------------------------------------------------- */
6158
6159 case BC_MOV:
6160 dasm_put(Dst, 3449);
6161 break;
6162 case BC_NOT:
6163 dasm_put(Dst, 3462, LJ_TTRUE);
6164 break;
6165 case BC_UNM:
6166 dasm_put(Dst, 3478);
6167 break;
6168 case BC_LEN:
6169 dasm_put(Dst, 3497, LJ_TSTR, Dt5(->len), LJ_TTAB);
6170#ifdef LUAJIT_ENABLE_LUA52COMPAT
6171 dasm_put(Dst, 3526, Dt6(->metatable));
6172#endif
6173 dasm_put(Dst, 3533);
6174#ifdef LUAJIT_ENABLE_LUA52COMPAT
6175 dasm_put(Dst, 3539, Dt6(->nomm), 1<<MM_len);
6176#endif
6177 break;
6178
6179 /* -- Binary ops -------------------------------------------------------- */
6180
6181
6182 case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
6183 vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
6184 switch (vk) {
6185 case 0:
6186 dasm_put(Dst, 3549);
6187 break;
6188 case 1:
6189 dasm_put(Dst, 3556);
6190 break;
6191 default:
6192 dasm_put(Dst, 3563);
6193 break;
6194 }
6195 dasm_put(Dst, 3573);
6196 break;
6197 case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
6198 vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
6199 switch (vk) {
6200 case 0:
6201 dasm_put(Dst, 3586);
6202 break;
6203 case 1:
6204 dasm_put(Dst, 3593);
6205 break;
6206 default:
6207 dasm_put(Dst, 3600);
6208 break;
6209 }
6210 dasm_put(Dst, 3610);
6211 break;
6212 case BC_MULVN: case BC_MULNV: case BC_MULVV:
6213 vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
6214 switch (vk) {
6215 case 0:
6216 dasm_put(Dst, 3623);
6217 break;
6218 case 1:
6219 dasm_put(Dst, 3630);
6220 break;
6221 default:
6222 dasm_put(Dst, 3637);
6223 break;
6224 }
6225 dasm_put(Dst, 3647);
6226 break;
6227 case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
6228 vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
6229 switch (vk) {
6230 case 0:
6231 dasm_put(Dst, 3660);
6232 break;
6233 case 1:
6234 dasm_put(Dst, 3667);
6235 break;
6236 default:
6237 dasm_put(Dst, 3674);
6238 break;
6239 }
6240 dasm_put(Dst, 3684);
6241 break;
6242 case BC_MODVN:
6243 vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
6244 switch (vk) {
6245 case 0:
6246 dasm_put(Dst, 3697);
6247 break;
6248 case 1:
6249 dasm_put(Dst, 3704);
6250 break;
6251 default:
6252 dasm_put(Dst, 3711);
6253 break;
6254 }
6255 dasm_put(Dst, 3721);
6256 break;
6257 case BC_MODNV: case BC_MODVV:
6258 vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
6259 switch (vk) {
6260 case 0:
6261 dasm_put(Dst, 3739);
6262 break;
6263 case 1:
6264 dasm_put(Dst, 3746);
6265 break;
6266 default:
6267 dasm_put(Dst, 3753);
6268 break;
6269 }
6270 dasm_put(Dst, 3763);
6271 break;
6272 case BC_POW:
6273 dasm_put(Dst, 3766);
6274 break;
6275
6276 case BC_CAT:
6277 dasm_put(Dst, 3789, Dt1(->base), 32-3, Dt1(->base));
6278 break;
6279
6280 /* -- Constant ops ------------------------------------------------------ */
6281
6282 case BC_KSTR:
6283 dasm_put(Dst, 3819, 32-1, LJ_TSTR);
6284 break;
6285 case BC_KCDATA:
6286#if LJ_HASFFI
6287 dasm_put(Dst, 3838, 32-1, LJ_TCDATA);
6288#endif
6289 break;
6290 case BC_KSHORT:
6291 dasm_put(Dst, 3857, 31-13);
6292 break;
6293 case BC_KNUM:
6294 dasm_put(Dst, 3876);
6295 break;
6296 case BC_KPRI:
6297 dasm_put(Dst, 3889, 32-3);
6298 break;
6299 case BC_KNIL:
6300 dasm_put(Dst, 3904);
6301 break;
6302
6303 /* -- Upvalue and function ops ------------------------------------------ */
6304
6305 case BC_UGET:
6306 dasm_put(Dst, 3923, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
6307 break;
6308 case BC_USETV:
6309 dasm_put(Dst, 3944, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, DtA(->closed), -(LJ_TISNUM+1), LJ_TISGCV - (LJ_TISNUM+1), Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
6310 break;
6311 case BC_USETS:
6312 dasm_put(Dst, 3997, 32-1, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, Dt5(->marked), DtA(->closed), LJ_TSTR, LJ_GC_WHITES, GG_DISP2G);
6313 break;
6314 case BC_USETN:
6315 dasm_put(Dst, 4048, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
6316 break;
6317 case BC_USETP:
6318 dasm_put(Dst, 4069, 32-1, offsetof(GCfuncL, uvptr), 32-3, DtA(->v));
6319 break;
6320
6321 case BC_UCLO:
6322 dasm_put(Dst, 4092, Dt1(->openupval), 32-1, -(BCBIAS_J*4 >> 16), Dt1(->base), Dt1(->base));
6323 break;
6324
6325 case BC_FNEW:
6326 dasm_put(Dst, 4122, 32-1, Dt1(->base), Dt1(->base), LJ_TFUNC);
6327 break;
6328
6329 /* -- Table ops --------------------------------------------------------- */
6330
6331 case BC_TNEW:
6332 case BC_TDUP:
6333 dasm_put(Dst, 4150, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
6334 if (op == BC_TNEW) {
6335 dasm_put(Dst, 4163);
6336 } else {
6337 dasm_put(Dst, 4172, 32-1);
6338 }
6339 dasm_put(Dst, 4179, Dt1(->base), LJ_TTAB);
6340 if (op == BC_TNEW) {
6341 dasm_put(Dst, 4196);
6342 }
6343 dasm_put(Dst, 4201);
6344 break;
6345
6346 case BC_GGET:
6347 case BC_GSET:
6348 dasm_put(Dst, 4210, 32-1, Dt7(->env));
6349 if (op == BC_GGET) {
6350 dasm_put(Dst, 4218);
6351 } else {
6352 dasm_put(Dst, 4221);
6353 }
6354 break;
6355
6356 case BC_TGETV:
6357 dasm_put(Dst, 4224, LJ_TTAB, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TSTR);
6358 break;
6359 case BC_TGETS:
6360 dasm_put(Dst, 4292, 32-1, LJ_TTAB, Dt6(->hmask), Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, LJ_TNIL, DtB(->next));
6361 dasm_put(Dst, 4353, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
6362 break;
6363 case BC_TGETB:
6364 dasm_put(Dst, 4373, 32-3, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
6365 break;
6366
6367 case BC_TSETV:
6368 dasm_put(Dst, 4421, LJ_TTAB, Dt6(->asize), Dt6(->array), 31-3, Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
6369 dasm_put(Dst, 4489, LJ_TSTR, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
6370 break;
6371 dasm_put(Dst, 4509, LJ_TSTR, LJ_TNIL);
6372 case BC_TSETS:
6373 dasm_put(Dst, 4535, 32-1, LJ_TTAB, Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), 31-5, 31-3, Dt6(->marked), DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, LJ_TNIL);
6374 dasm_put(Dst, 4586, LJ_GC_BLACK, DtB(->val), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next), Dt6(->metatable), DISPATCH_GL(tmptv), Dt1(->base), Dt6(->nomm), 1<<MM_newindex);
6375 dasm_put(Dst, 4642, LJ_TSTR, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
6376 break;
6377 case BC_TSETB:
6378 dasm_put(Dst, 4667, 32-3, LJ_TTAB, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain));
6379 dasm_put(Dst, 4725, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
6380 break;
6381
6382 case BC_TSETM:
6383 dasm_put(Dst, 4735, 32-3, Dt6(->asize), 31-3, Dt6(->marked), Dt6(->array), LJ_GC_BLACK, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
6384 dasm_put(Dst, 4804);
6385 break;
6386
6387 /* -- Calls and vararg handling ----------------------------------------- */
6388
6389 case BC_CALLM:
6390 dasm_put(Dst, 4807);
6391 break;
6392 case BC_CALL:
6393 dasm_put(Dst, 4809, LJ_TFUNC, Dt7(->pc));
6394 break;
6395
6396 case BC_CALLMT:
6397 dasm_put(Dst, 4830);
6398 break;
6399 case BC_CALLT:
6400 dasm_put(Dst, 4832, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
6401 dasm_put(Dst, 4896, FRAME_TYPE);
6402 break;
6403
6404 case BC_ITERC:
6405 dasm_put(Dst, 4905, LJ_TFUNC, Dt7(->pc));
6406 break;
6407
6408 case BC_ITERN:
6409#if LJ_HASJIT
6410#endif
6411 dasm_put(Dst, 4932, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL, -(BCBIAS_J*4 >> 16), Dt6(->hmask), Dt6(->node), 31-5, 31-3, LJ_TNIL, DtB(->key), -(BCBIAS_J*4 >> 16));
6412 dasm_put(Dst, 5007);
6413 break;
6414
6415 case BC_ISNEXT:
6416 dasm_put(Dst, 5021, LJ_TTAB, LJ_TFUNC, LJ_TNIL, Dt8(->ffid), FF_next_N, 32-1, -(BCBIAS_J*4 >> 16), BC_JMP, BC_ITERC, -(BCBIAS_J*4 >> 16));
6417 break;
6418
6419 case BC_VARG:
6420 dasm_put(Dst, 5071, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base));
6421 dasm_put(Dst, 5151);
6422 break;
6423
6424 /* -- Returns ----------------------------------------------------------- */
6425
6426 case BC_RETM:
6427 dasm_put(Dst, 5157);
6428 break;
6429
6430 case BC_RET:
6431 dasm_put(Dst, 5159, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
6432 break;
6433
6434 case BC_RET0: case BC_RET1:
6435 dasm_put(Dst, 5229, FRAME_TYPE, FRAME_VARG);
6436 if (op == BC_RET1) {
6437 dasm_put(Dst, 5242);
6438 }
6439 dasm_put(Dst, 5245, Dt7(->pc), PC2PROTO(k));
6440 break;
6441
6442 /* -- Loops and branches ------------------------------------------------ */
6443
6444 case BC_FORL:
6445#if LJ_HASJIT
6446 dasm_put(Dst, 5273);
6447#endif
6448 break;
6449
6450 case BC_JFORI:
6451 case BC_JFORL:
6452#if !LJ_HASJIT
6453 break;
6454#endif
6455 case BC_FORI:
6456 case BC_IFORL:
6457 vk = (op == BC_IFORL || op == BC_JFORL);
6458 if (vk) {
6459 dasm_put(Dst, 5275, FORL_STEP*8, FORL_STOP*8, FORL_STEP*8, FORL_IDX*8);
6460 } else {
6461 dasm_put(Dst, 5286, FORL_IDX*8, FORL_STEP*8, FORL_STEP*8, FORL_STOP*8, FORL_STOP*8);
6462 }
6463 dasm_put(Dst, 5305);
6464 if (op != BC_JFORL) {
6465 dasm_put(Dst, 5307, 32-1);
6466 }
6467 dasm_put(Dst, 5310, FORL_EXT*8);
6468 if (op != BC_JFORL) {
6469 dasm_put(Dst, 5313);
6470 }
6471 dasm_put(Dst, 5315);
6472 if (op == BC_JFORI) {
6473 dasm_put(Dst, 5317, -(BCBIAS_J*4 >> 16));
6474 }
6475 dasm_put(Dst, 5320);
6476 if (op == BC_FORI) {
6477 dasm_put(Dst, 5323);
6478 } else if (op == BC_IFORL) {
6479 dasm_put(Dst, 5326, -(BCBIAS_J*4 >> 16));
6480 } else {
6481 dasm_put(Dst, 5332, BC_JLOOP);
6482 }
6483 dasm_put(Dst, 5335);
6484 if (op == BC_FORI) {
6485 dasm_put(Dst, 5348, -(BCBIAS_J*4 >> 16));
6486 } else if (op == BC_IFORL) {
6487 dasm_put(Dst, 5354);
6488 } else {
6489 dasm_put(Dst, 5357, BC_JLOOP);
6490 }
6491 dasm_put(Dst, 5360);
6492 break;
6493
6494 case BC_ITERL:
6495#if LJ_HASJIT
6496 dasm_put(Dst, 5363);
6497#endif
6498 break;
6499
6500 case BC_JITERL:
6501#if !LJ_HASJIT
6502 break;
6503#endif
6504 case BC_IITERL:
6505 dasm_put(Dst, 5365, LJ_TNIL);
6506 if (op == BC_JITERL) {
6507 dasm_put(Dst, 5372);
6508 } else {
6509 dasm_put(Dst, 5374, 32-1, -(BCBIAS_J*4 >> 16));
6510 }
6511 dasm_put(Dst, 5382);
6512 break;
6513
6514 case BC_LOOP:
6515#if LJ_HASJIT
6516 dasm_put(Dst, 5394);
6517#endif
6518 break;
6519
6520 case BC_ILOOP:
6521 dasm_put(Dst, 5396);
6522 break;
6523
6524 case BC_JLOOP:
6525#if LJ_HASJIT
6526 dasm_put(Dst, 5407);
6527#endif
6528 break;
6529
6530 case BC_JMP:
6531 dasm_put(Dst, 5409, 32-1, -(BCBIAS_J*4 >> 16));
6532 break;
6533
6534 /* -- Function headers -------------------------------------------------- */
6535
6536 case BC_FUNCF:
6537#if LJ_HASJIT
6538 dasm_put(Dst, 5425);
6539#endif
6540 case BC_FUNCV: /* NYI: compiled vararg functions. */
6541 break;
6542
6543 case BC_JFUNCF:
6544#if !LJ_HASJIT
6545 break;
6546#endif
6547 case BC_IFUNCF:
6548 dasm_put(Dst, 5427, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3);
6549 if (op == BC_JFUNCF) {
6550 dasm_put(Dst, 5445);
6551 } else {
6552 dasm_put(Dst, 5447);
6553 }
6554 dasm_put(Dst, 5456);
6555 break;
6556
6557 case BC_JFUNCV:
6558#if !LJ_HASJIT
6559 break;
6560#endif
6561 dasm_put(Dst, 5462);
6562 break; /* NYI: compiled vararg functions. */
6563
6564 case BC_IFUNCV:
6565 dasm_put(Dst, 5464, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), LJ_TNIL);
6566 break;
6567
6568 case BC_FUNCC:
6569 case BC_FUNCCW:
6570 if (op == BC_FUNCC) {
6571 dasm_put(Dst, 5517, Dt8(->f));
6572 } else {
6573 dasm_put(Dst, 5520, DISPATCH_GL(wrapf));
6574 }
6575 dasm_put(Dst, 5523, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C);
6576 if (op == BC_FUNCCW) {
6577 dasm_put(Dst, 5536, Dt8(->f));
6578 }
6579 dasm_put(Dst, 5539, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate));
6580 break;
6581
6582 /* ---------------------------------------------------------------------- */
6583
6584 default:
6585 fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);
6586 exit(2);
6587 break;
6588 }
6589}
6590
6591static int build_backend(BuildCtx *ctx)
6592{
6593 int op;
6594
6595 dasm_growpc(Dst, BC__MAX);
6596
6597 build_subroutines(ctx);
6598
6599 dasm_put(Dst, 5560);
6600 for (op = 0; op < BC__MAX; op++)
6601 build_ins(ctx, (BCOp)op, op);
6602
6603 return BC__MAX;
6604}
6605
6606/* Emit pseudo frame-info for all assembler functions. */
6607static void emit_asm_debug(BuildCtx *ctx)
6608{
6609 int i;
6610 switch (ctx->mode) {
6611 case BUILD_elfasm:
6612 fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");
6613 fprintf(ctx->fp,
6614 ".Lframe0:\n"
6615 "\t.long .LECIE0-.LSCIE0\n"
6616 ".LSCIE0:\n"
6617 "\t.long 0xffffffff\n"
6618 "\t.byte 0x1\n"
6619 "\t.string \"\"\n"
6620 "\t.uleb128 0x1\n"
6621 "\t.sleb128 -4\n"
6622 "\t.byte 65\n"
6623 "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"
6624 "\t.align 2\n"
6625 ".LECIE0:\n\n");
6626 fprintf(ctx->fp,
6627 ".LSFDE0:\n"
6628 "\t.long .LEFDE0-.LASFDE0\n"
6629 ".LASFDE0:\n"
6630 "\t.long .Lframe0\n"
6631 "\t.long .Lbegin\n"
6632 "\t.long %d\n"
6633 "\t.byte 0xe\n\t.uleb128 %d\n"
6634 "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n",
6635 (int)ctx->codesz, CFRAME_SIZE);
6636 for (i = 14; i <= 31; i++)
6637 fprintf(ctx->fp,
6638 "\t.byte %d\n\t.uleb128 %d\n"
6639 "\t.byte %d\n\t.uleb128 %d\n",
6640 0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));
6641 fprintf(ctx->fp,
6642 "\t.align 2\n"
6643 ".LEFDE0:\n\n");
6644 fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");
6645 fprintf(ctx->fp,
6646 ".Lframe1:\n"
6647 "\t.long .LECIE1-.LSCIE1\n"
6648 ".LSCIE1:\n"
6649 "\t.long 0\n"
6650 "\t.byte 0x1\n"
6651 "\t.string \"zPR\"\n"
6652 "\t.uleb128 0x1\n"
6653 "\t.sleb128 -4\n"
6654 "\t.byte 65\n"
6655 "\t.uleb128 6\n" /* augmentation length */
6656 "\t.byte 0x1b\n" /* pcrel|sdata4 */
6657 "\t.long lj_err_unwind_dwarf-.\n"
6658 "\t.byte 0x1b\n" /* pcrel|sdata4 */
6659 "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"
6660 "\t.align 2\n"
6661 ".LECIE1:\n\n");
6662 fprintf(ctx->fp,
6663 ".LSFDE1:\n"
6664 "\t.long .LEFDE1-.LASFDE1\n"
6665 ".LASFDE1:\n"
6666 "\t.long .LASFDE1-.Lframe1\n"
6667 "\t.long .Lbegin-.\n"
6668 "\t.long %d\n"
6669 "\t.uleb128 0\n" /* augmentation length */
6670 "\t.byte 0xe\n\t.uleb128 %d\n"
6671 "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n",
6672 (int)ctx->codesz, CFRAME_SIZE);
6673 for (i = 14; i <= 31; i++)
6674 fprintf(ctx->fp,
6675 "\t.byte %d\n\t.uleb128 %d\n"
6676 "\t.byte %d\n\t.uleb128 %d\n",
6677 0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));
6678 fprintf(ctx->fp,
6679 "\t.align 2\n"
6680 ".LEFDE1:\n\n");
6681 break;
6682 default:
6683 break;
6684 }
6685}
6686
diff --git a/src/lj_arch.h b/src/lj_arch.h
index 03da79a6..826c54c1 100644
--- a/src/lj_arch.h
+++ b/src/lj_arch.h
@@ -166,8 +166,6 @@
166#define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */ 166#define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */
167#define LJ_ARCH_NOJIT 1 167#define LJ_ARCH_NOJIT 1
168 168
169#error "No support for plain PowerPC CPUs (yet)"
170
171#elif LUAJIT_TARGET == LUAJIT_ARCH_PPCSPE 169#elif LUAJIT_TARGET == LUAJIT_ARCH_PPCSPE
172 170
173#define LJ_ARCH_NAME "ppcspe" 171#define LJ_ARCH_NAME "ppcspe"
diff --git a/src/lj_frame.h b/src/lj_frame.h
index f09b73d0..2baf44a8 100644
--- a/src/lj_frame.h
+++ b/src/lj_frame.h
@@ -104,8 +104,8 @@ enum {
104#define CFRAME_OFS_NRES 24 104#define CFRAME_OFS_NRES 24
105#define CFRAME_OFS_PREV 20 105#define CFRAME_OFS_PREV 20
106#define CFRAME_OFS_L 16 106#define CFRAME_OFS_L 16
107#define CFRAME_OFS_PC 12 107#define CFRAME_OFS_PC 8
108#define CFRAME_OFS_MULTRES 8 108#define CFRAME_OFS_MULTRES 12
109#define CFRAME_SIZE 256 109#define CFRAME_SIZE 256
110#define CFRAME_SHIFT_MULTRES 3 110#define CFRAME_SHIFT_MULTRES 3
111#elif LJ_TARGET_PPCSPE 111#elif LJ_TARGET_PPCSPE