Inline-Lua
view release on metacpan or search on metacpan
ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/vm_arm64.dasc view on Meta::CPAN
|.endif
|// Note: vm_ffi_call must be the last function in this object file!
|
|//-----------------------------------------------------------------------
}
/* Generate the code for a single instruction. */
static void build_ins(BuildCtx *ctx, BCOp op, int defop)
{
int vk = 0;
|=>defop:
switch (op) {
/* -- Comparison ops ---------------------------------------------------- */
/* Remember: all ops branch for a true comparison, fall through otherwise. */
case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
| // RA = src1, RC = src2, JMP with RC = target
| ldr CARG1, [BASE, RA, lsl #3]
| ldrh RBw, [PC, # OFS_RD]
| ldr CARG2, [BASE, RC, lsl #3]
| add PC, PC, #4
| add RB, PC, RB, lsl #2
| sub RB, RB, #0x20000
| checkint CARG1, >3
| checkint CARG2, >4
| cmp CARG1w, CARG2w
if (op == BC_ISLT) {
| csel PC, RB, PC, lt
} else if (op == BC_ISGE) {
| csel PC, RB, PC, ge
} else if (op == BC_ISLE) {
| csel PC, RB, PC, le
} else {
| csel PC, RB, PC, gt
}
|1:
| ins_next
|
|3: // RA not int.
| ldr FARG1, [BASE, RA, lsl #3]
| blo ->vmeta_comp
| ldr FARG2, [BASE, RC, lsl #3]
| cmp TISNUMhi, CARG2, lsr #32
| bhi >5
| bne ->vmeta_comp
| // RA number, RC int.
| scvtf FARG2, CARG2w
| b >5
|
|4: // RA int, RC not int
| ldr FARG2, [BASE, RC, lsl #3]
| blo ->vmeta_comp
| // RA int, RC number.
| scvtf FARG1, CARG1w
|
|5: // RA number, RC number
| fcmp FARG1, FARG2
| // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.
if (op == BC_ISLT) {
| csel PC, RB, PC, lo
} else if (op == BC_ISGE) {
| csel PC, RB, PC, hs
} else if (op == BC_ISLE) {
| csel PC, RB, PC, ls
} else {
| csel PC, RB, PC, hi
}
| b <1
break;
case BC_ISEQV: case BC_ISNEV:
vk = op == BC_ISEQV;
| // RA = src1, RC = src2, JMP with RC = target
| ldr CARG1, [BASE, RA, lsl #3]
| add RC, BASE, RC, lsl #3
| ldrh RBw, [PC, # OFS_RD]
| ldr CARG3, [RC]
| add PC, PC, #4
| add RB, PC, RB, lsl #2
| sub RB, RB, #0x20000
| asr ITYPE, CARG3, #47
| cmn ITYPE, #-LJ_TISNUM
if (vk) {
| bls ->BC_ISEQN_Z
} else {
| bls ->BC_ISNEN_Z
}
| // RC is not a number.
| asr TMP0, CARG1, #47
|.if FFI
| // Check if RC or RA is a cdata.
| cmn ITYPE, #-LJ_TCDATA
| ccmn TMP0, #-LJ_TCDATA, #4, ne
| beq ->vmeta_equal_cd
|.endif
| cmp CARG1, CARG3
| bne >2
| // Tag and value are equal.
if (vk) {
|->BC_ISEQV_Z:
| mov PC, RB // Perform branch.
}
|1:
| ins_next
|
|2: // Check if the tags are the same and it's a table or userdata.
| cmp ITYPE, TMP0
| ccmn ITYPE, #-LJ_TISTABUD, #2, eq
if (vk) {
| bhi <1
} else {
| bhi ->BC_ISEQV_Z // Reuse code from opposite instruction.
}
| // Different tables or userdatas. Need to check __eq metamethod.
| // Field metatable must be at same offset for GCtab and GCudata!
| and TAB:CARG2, CARG1, #LJ_GCVMASK
| ldr TAB:TMP2, TAB:CARG2->metatable
if (vk) {
( run in 1.740 second using v1.01-cache-2.11-cpan-39bf76dae61 )