mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-03-13 14:05:17 +00:00
ARM: Add bit.* fast functions and lj_vm_tobit().
This commit is contained in:
parent
161bc379f0
commit
f089f3954c
@ -1240,41 +1240,107 @@ static void build_subroutines(BuildCtx *ctx)
|
|||||||
|
|
|
|
||||||
|//-- Bit library --------------------------------------------------------
|
|//-- Bit library --------------------------------------------------------
|
||||||
|
|
|
|
||||||
|
|// FP number to bit conversion for soft-float. Clobbers r0-r3.
|
||||||
|
|->vm_tobit_fb:
|
||||||
|
| bhi ->fff_fallback
|
||||||
|
|->vm_tobit:
|
||||||
|
| lsl CARG3, CARG2, #1
|
||||||
|
| adds CARG3, CARG3, #0x00200000
|
||||||
|
| movpl CARG1, #0 // |x| < 1?
|
||||||
|
| bxpl lr
|
||||||
|
| mvn CARG4, #0x3e0
|
||||||
|
| subs CARG3, CARG4, CARG3, asr #21
|
||||||
|
| bmi >1 // |x| >= 2^32?
|
||||||
|
| lsl CARG4, CARG2, #11
|
||||||
|
| orr CARG4, CARG4, #0x80000000
|
||||||
|
| orr CARG4, CARG4, CARG1, lsr #21
|
||||||
|
| cmp CARG2, #0
|
||||||
|
| lsr CARG1, CARG4, CARG3
|
||||||
|
| rsblt CARG1, CARG1, #0
|
||||||
|
| bx lr
|
||||||
|
|1:
|
||||||
|
| add CARG3, CARG3, #21
|
||||||
|
| lsr CARG4, CARG1, CARG3
|
||||||
|
| rsb CARG3, CARG3, #20
|
||||||
|
| lsl CARG1, CARG2, #12
|
||||||
|
| cmp CARG2, #0
|
||||||
|
| orr CARG1, CARG4, CARG1, lsl CARG3
|
||||||
|
| rsblt CARG1, CARG1, #0
|
||||||
|
| bx lr
|
||||||
|
|
|
||||||
|.macro .ffunc_bit, name
|
|.macro .ffunc_bit, name
|
||||||
| .ffunc_1 bit_..name
|
| .ffunc_1 bit_..name
|
||||||
| NYI
|
| checktp CARG2, LJ_TISNUM
|
||||||
|
| blne ->vm_tobit_fb
|
||||||
|.endmacro
|
|.endmacro
|
||||||
|
|
|
|
||||||
|.ffunc_bit tobit
|
|.ffunc_bit tobit
|
||||||
| NYI
|
| mvn CARG2, #~LJ_TISNUM
|
||||||
|->fff_resbit:
|
| b ->fff_restv
|
||||||
| NYI
|
|
||||||
|
|
|
|
||||||
|.macro .ffunc_bit_op, name, ins
|
|.macro .ffunc_bit_op, name, ins
|
||||||
| .ffunc_bit name
|
| .ffunc_bit name
|
||||||
| NYI
|
| mov CARG3, CARG1
|
||||||
|
| mov RA, #8
|
||||||
|
|1:
|
||||||
|
| ldrd CARG12, [BASE, RA]
|
||||||
|
| cmp RA, NARGS8:RC
|
||||||
|
| add RA, RA, #8
|
||||||
|
| bge >2
|
||||||
|
| checktp CARG2, LJ_TISNUM
|
||||||
|
| blne ->vm_tobit_fb
|
||||||
|
| ins CARG3, CARG3, CARG1
|
||||||
|
| b <1
|
||||||
|.endmacro
|
|.endmacro
|
||||||
|
|
|
|
||||||
|.ffunc_bit_op band, and
|
|.ffunc_bit_op band, and
|
||||||
|.ffunc_bit_op bor, or
|
|.ffunc_bit_op bor, orr
|
||||||
|.ffunc_bit_op bxor, eor
|
|.ffunc_bit_op bxor, eor
|
||||||
|
|
|
|
||||||
|
|2:
|
||||||
|
| mvn CARG4, #~LJ_TISNUM
|
||||||
|
| ldr PC, [BASE, FRAME_PC]
|
||||||
|
| strd CARG34, [BASE, #-8]
|
||||||
|
| b ->fff_res1
|
||||||
|
|
|
||||||
|.ffunc_bit bswap
|
|.ffunc_bit bswap
|
||||||
| NYI
|
| eor CARG3, CARG1, CARG1, ror #16
|
||||||
|
| bic CARG3, CARG3, #0x00ff0000
|
||||||
|
| ror CARG1, CARG1, #8
|
||||||
|
| mvn CARG2, #~LJ_TISNUM
|
||||||
|
| eor CARG1, CARG1, CARG3, lsr #8
|
||||||
|
| b ->fff_restv
|
||||||
|
|
|
|
||||||
|.ffunc_bit bnot
|
|.ffunc_bit bnot
|
||||||
| NYI
|
| mvn CARG1, CARG1
|
||||||
|
| mvn CARG2, #~LJ_TISNUM
|
||||||
|
| b ->fff_restv
|
||||||
|
|
|
|
||||||
|.macro .ffunc_bit_sh, name, ins, shmod
|
|.macro .ffunc_bit_sh, name, ins, shmod
|
||||||
| .ffunc_2 bit_..name
|
| .ffunc bit_..name
|
||||||
| NYI
|
| ldrd CARG12, [BASE, #8]
|
||||||
|
| cmp NARGS8:RC, #16
|
||||||
|
| blo ->fff_fallback
|
||||||
|
| checktp CARG2, LJ_TISNUM
|
||||||
|
| blne ->vm_tobit_fb
|
||||||
|
|.if shmod == 0
|
||||||
|
| and RA, CARG1, #31
|
||||||
|
|.else
|
||||||
|
| rsb RA, CARG1, #0
|
||||||
|
|.endif
|
||||||
|
| ldrd CARG12, [BASE]
|
||||||
|
| checktp CARG2, LJ_TISNUM
|
||||||
|
| blne ->vm_tobit_fb
|
||||||
|
| ins CARG1, CARG1, RA
|
||||||
|
| mvn CARG2, #~LJ_TISNUM
|
||||||
|
| b ->fff_restv
|
||||||
|.endmacro
|
|.endmacro
|
||||||
|
|
|
|
||||||
|.ffunc_bit_sh lshift, NYI, 1
|
|.ffunc_bit_sh lshift, lsl, 0
|
||||||
|.ffunc_bit_sh rshift, NYI, 1
|
|.ffunc_bit_sh rshift, lsr, 0
|
||||||
|.ffunc_bit_sh arshift, NYI, 1
|
|.ffunc_bit_sh arshift, asr, 0
|
||||||
|.ffunc_bit_sh rol, NYI, 2
|
|.ffunc_bit_sh rol, ror, 1
|
||||||
|.ffunc_bit_sh ror, NYI, 0
|
|.ffunc_bit_sh ror, ror, 0
|
||||||
|
|
|
|
||||||
|//-----------------------------------------------------------------------
|
|//-----------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
|
Loading…
Reference in New Issue
Block a user