From 83e302938b690ac76d73937d242ebb0d5b7513c2 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Fri, 8 Apr 2011 02:47:19 +0200 Subject: [PATCH] ARM: Add math.* fast functions. --- src/buildvm_arm.dasc | 114 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 95 insertions(+), 19 deletions(-) diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index bd121561..dbc31e1a 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc @@ -679,12 +679,15 @@ static void build_subroutines(BuildCtx *ctx) | |.macro .ffunc_n, name | .ffunc_1 name - | NYI + | checktp CARG2, LJ_TISNUM + | bhs ->fff_fallback |.endmacro | |.macro .ffunc_nn, name | .ffunc_2 name - | NYI + | checktp CARG2, LJ_TISNUM + | cmnlo CARG4, #-LJ_TISNUM + | bhs ->fff_fallback |.endmacro | |.macro ffgccheck @@ -947,8 +950,19 @@ static void build_subroutines(BuildCtx *ctx) | |//-- Math library ------------------------------------------------------- | - |.ffunc_n math_abs - | NYI + |.align 8 + |1: + | .long 0x00000000, 0x41e00000 // 2^31. + | + |.ffunc_1 math_abs + | checktp CARG2, LJ_TISNUM + | bhi ->fff_fallback + | bicne CARG2, CARG2, #0x80000000 + | bne ->fff_restv + | cmp CARG1, #0 + | rsbslt CARG1, CARG1, #0 + | ldrdvs CARG12, <1 + | // Fallthrough. | |->fff_restv: | // CARG12 = TValue result. @@ -983,13 +997,15 @@ static void build_subroutines(BuildCtx *ctx) | b <5 | |.macro math_extern, func - | .ffunc math_ .. func - | NYI + | .ffunc_n math_ .. func + | bl extern func + | b ->fff_restv |.endmacro | |.macro math_extern2, func - | .ffunc math_ .. func - | NYI + | .ffunc_nn math_ .. func + | bl extern func + | b ->fff_restv |.endmacro | |.macro math_round, func @@ -1019,24 +1035,84 @@ static void build_subroutines(BuildCtx *ctx) | |->ff_math_deg: |.ffunc_n math_rad - | NYI + | ldrd CARG34, CFUNC:CARG3->upvalue[0] + | bl extern __aeabi_dmul + | b ->fff_restv | - |.ffunc math_ldexp - | NYI + |.ffunc_2 math_ldexp + | checktp CARG2, LJ_TISNUM + | bhs ->fff_fallback + | checktp CARG4, LJ_TISNUM + | bne ->fff_fallback + | bl extern ldexp // (double x, int exp) + | b ->fff_restv | - |.ffunc math_frexp - | NYI + |.ffunc_n math_frexp + | mov CARG3, sp + | bl extern frexp + | ldr CARG3, [sp] + | mvn CARG4, #~LJ_TISNUM + | ldr PC, [BASE, FRAME_PC] + | strd CARG12, [BASE, #-8] + | mov RC, #(2+1)*8 + | strd CARG34, [BASE] + | b ->fff_res | - |.ffunc math_modf - | NYI + |.ffunc_n math_modf + | sub CARG3, BASE, #8 + | ldr PC, [BASE, FRAME_PC] + | bl extern modf + | mov RC, #(2+1)*8 + | strd CARG12, [BASE] + | b ->fff_res | - |.macro math_minmax, name, cmpop + |.macro math_minmax, name, cond, fcond | .ffunc_1 name - | NYI + | checktp CARG2, LJ_TISNUM + | mov RA, #8 + | bne >4 + |1: // Handle integers. + | ldrd CARG34, [BASE, RA] + | cmp RA, RC + | bhs ->fff_restv + | checktp CARG4, LJ_TISNUM + | bne >3 + | cmp CARG1, CARG3 + | add RA, RA, #8 + | mov..cond CARG1, CARG3 + | b <1 + |3: + | bhi ->fff_fallback + | // Convert intermediate result to number and continue below. + | bl extern __aeabi_i2d + | ldrd CARG34, [BASE, RA] + | b >6 + | + |4: + | bhi ->fff_fallback + |5: // Handle numbers. + | ldrd CARG34, [BASE, RA] + | cmp RA, RC + | bhs ->fff_restv + | checktp CARG4, LJ_TISNUM + | bhs >7 + |6: + | bl extern __aeabi_cdcmple + | add RA, RA, #8 + | mov..fcond CARG1, CARG3 + | mov..fcond CARG2, CARG4 + | b <5 + |7: // Convert integer to number and continue above. + | bhi ->fff_fallback + | strd CARG12, TMPD + | mov CARG1, CARG3 + | bl extern __aeabi_i2d + | ldrd CARG34, TMPD + | b <6 |.endmacro | - | math_minmax math_min, NYI - | math_minmax math_max, NYI + | math_minmax math_min, gt, hi + | math_minmax math_max, lt, lo | |//-- String library ----------------------------------------------------- |