return t->asize + (uint32_t)(n - noderef(t->node));
/* Hash key indexes: [t->asize..t->asize+t->nmask] */
} while ((n = nextnode(n)));
+ if (key->u32.hi == 0xfffe7fff) /* ITERN was despecialized while running. */
+ return key->u32.lo - 1;
lj_err_msg(L, LJ_ERR_NEXTIDX);
return 0; /* unreachable */
}
| ins_next1
| ins_next2
| mov CARG1, #0
- | str CARG1, [RA, #-8] // Initialize control var.
+ | mvn CARG2, #0x00018000
+ | strd CARG1, [RA, #-8] // Initialize control var.
|1:
| ins_next3
|5: // Despecialize bytecode if any of the checks fail.
| bnez TMP1, >5
|. lui TMP2, (-(BCBIAS_J*4 >> 16) & 65535)
| addu PC, TMP0, TMP2
+ | lui TMP1, 0xfffe
+ | ori TMP1, TMP1, 0x7fff
| sw r0, -8+LO(RA) // Initialize control var.
+ | sw TMP1, -8+HI(RA)
|1:
| ins_next
|5: // Despecialize bytecode if any of the checks fail.
| crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq
| add TMP3, PC, TMP0
| bne cr0, >5
+ | lus TMP1, 0xfffe
+ | ori TMP1, TMP1, 0x7fff
| stw ZERO, -4(RA) // Initialize control var.
+ | stw TMP1, -8(RA)
| addis PC, TMP3, -(BCBIAS_J*4 >> 16)
|1:
| ins_next
| crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq
| add TMP3, PC, TMP0
| bne cr0, >5
+ | lus TMP1, 0xfffe
+ | ori TMP1, TMP1, 0x7fff
| stw ZERO, -4(RA) // Initialize control var.
+ | stw TMP1, -8(RA)
| addis PC, TMP3, -(BCBIAS_J*4 >> 16)
|1:
| ins_next
| add BASE, 8
| mov ARG3, BASE
|.endif
- | mov SAVE_PC, PC // Redundant (but a defined value).
+ | mov SAVE_PC, PC // Needed for ITERN fallback.
| call extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key)
| // Flag returned in eax (RD).
| mov BASE, L:RB->base
| cmp byte CFUNC:RB->ffid, FF_next_N; jne >5
| branchPC RD
| mov dword [BASE+RA*8-8], 0 // Initialize control var.
+ | mov dword [BASE+RA*8-4], 0xfffe7fff
|1:
| ins_next
|5: // Despecialize bytecode if any of the checks fail.