aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-17 02:31:00 +0200
committerMike Pall <mike>2011-04-17 02:31:00 +0200
commit7bb4b0f57082bec83b1048a379f1eb1ca28b0b44 (patch)
treeaf3db8fc769df999351e7229f37a04e6b4395201 /src
parent32db4525d9e02aba29cf393025afcb1febff8458 (diff)
downloadluajit-7bb4b0f57082bec83b1048a379f1eb1ca28b0b44.tar.gz
luajit-7bb4b0f57082bec83b1048a379f1eb1ca28b0b44.tar.bz2
luajit-7bb4b0f57082bec83b1048a379f1eb1ca28b0b44.zip
ARM: Normalize results of math.floor()/ceil() fast functions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc96
1 files changed, 75 insertions, 21 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc
index 905e0ada..68f33d97 100644
--- a/src/buildvm_arm.dasc
+++ b/src/buildvm_arm.dasc
@@ -1203,8 +1203,74 @@ static void build_subroutines(BuildCtx *ctx)
1203 | 1203 |
1204 |//-- Math library ------------------------------------------------------- 1204 |//-- Math library -------------------------------------------------------
1205 | 1205 |
1206 |.align 8 1206 |.macro math_round, func
1207 | .ffunc_1 math_ .. func
1208 | checktp CARG2, LJ_TISNUM
1209 | beq ->fff_restv
1210 | bhi ->fff_fallback
1211 | // Round FP value and normalize result.
1212 | lsl CARG3, CARG2, #1
1213 | adds RB, CARG3, #0x00200000
1214 | bpl >2 // |x| < 1?
1215 | mvn CARG4, #0x3e0
1216 | subs RB, CARG4, RB, asr #21
1217 | lsl CARG4, CARG2, #11
1218 | lsl CARG3, CARG1, #11
1219 | orr CARG4, CARG4, #0x80000000
1220 | rsb INS, RB, #32
1221 | orr CARG4, CARG4, CARG1, lsr #21
1222 | bls >3 // |x| >= 2^31?
1223 | orr CARG3, CARG3, CARG4, lsl INS
1224 | lsr CARG1, CARG4, RB
1225 |.if "func" == "floor"
1226 | tst CARG3, CARG2, asr #31
1227 | addne CARG1, CARG1, #1
1228 |.else
1229 | bics CARG3, CARG3, CARG2, asr #31
1230 | addsne CARG1, CARG1, #1
1231 | ldrdvs CARG12, >9
1232 | bvs ->fff_restv
1233 |.endif
1234 | cmp CARG2, #0
1235 | rsblt CARG1, CARG1, #0
1207 |1: 1236 |1:
1237 | mvn CARG2, #~LJ_TISNUM
1238 | b ->fff_restv
1239 |
1240 |2: // |x| < 1
1241 | orr CARG3, CARG3, CARG1 // ztest = abs(hi) | lo
1242 |.if "func" == "floor"
1243 | tst CARG3, CARG2, asr #31 // return (ztest & sign) == 0 ? 0 : -1
1244 | moveq CARG1, #0
1245 | mvnne CARG1, #0
1246 |.else
1247 | bics CARG3, CARG3, CARG2, asr #31 // return (ztest & ~sign) == 0 ? 0 : 1
1248 | moveq CARG1, #0
1249 | movne CARG1, #1
1250 |.endif
1251 | mvn CARG2, #~LJ_TISNUM
1252 | b ->fff_restv
1253 |
1254 |3: // |x| >= 2^31. Check for x == -(2^31).
1255 | cmpeq CARG4, #0x80000000
1256 |.if "func" == "floor"
1257 | cmpeq CARG3, #0
1258 |.endif
1259 | bne >4
1260 | cmp CARG2, #0
1261 | movmi CARG1, #0x80000000
1262 | bmi <1
1263 |4:
1264 | // NYI: Use internal implementation.
1265 | bl extern func
1266 | b ->fff_restv
1267 |.endmacro
1268 |
1269 | math_round floor
1270 | math_round ceil
1271 |
1272 |.align 8
1273 |9:
1208 | .long 0x00000000, 0x41e00000 // 2^31. 1274 | .long 0x00000000, 0x41e00000 // 2^31.
1209 | 1275 |
1210 |.ffunc_1 math_abs 1276 |.ffunc_1 math_abs
@@ -1214,7 +1280,7 @@ static void build_subroutines(BuildCtx *ctx)
1214 | bne ->fff_restv 1280 | bne ->fff_restv
1215 | cmp CARG1, #0 1281 | cmp CARG1, #0
1216 | rsbslt CARG1, CARG1, #0 1282 | rsbslt CARG1, CARG1, #0
1217 | ldrdvs CARG12, <1 1283 | ldrdvs CARG12, <9
1218 | // Fallthrough. 1284 | // Fallthrough.
1219 | 1285 |
1220 |->fff_restv: 1286 |->fff_restv:
@@ -1261,18 +1327,6 @@ static void build_subroutines(BuildCtx *ctx)
1261 | b ->fff_restv 1327 | b ->fff_restv
1262 |.endmacro 1328 |.endmacro
1263 | 1329 |
1264 |.macro math_round, func
1265 | .ffunc_1 math_ .. func
1266 | checktp CARG2, LJ_TISNUM
1267 | bhi ->fff_fallback
1268 | bllo extern func // NYI: use internal implementation of floor/ceil.
1269 | // NYI: normalize result.
1270 | b ->fff_restv
1271 |.endmacro
1272 |
1273 | math_round floor
1274 | math_round ceil
1275 |
1276 | math_extern sqrt 1330 | math_extern sqrt
1277 | math_extern log 1331 | math_extern log
1278 | math_extern log10 1332 | math_extern log10
@@ -1805,18 +1859,18 @@ static void build_subroutines(BuildCtx *ctx)
1805 |//-- Math helper functions ---------------------------------------------- 1859 |//-- Math helper functions ----------------------------------------------
1806 |//----------------------------------------------------------------------- 1860 |//-----------------------------------------------------------------------
1807 | 1861 |
1808 |// FP value rounding. Called by math.floor/math.ceil fast functions 1862 |// FP value rounding. Called from JIT code.
1809 |// and from JIT code.
1810 |// 1863 |//
1811 |.macro vm_round, name, mode 1864 |// double lj_vm_floor/ceil/trunc(double x);
1812 |->name: 1865 |.macro vm_round, func
1866 |->vm_ .. func:
1813 | NYI 1867 | NYI
1814 |.endmacro 1868 |.endmacro
1815 | 1869 |
1816 | vm_round vm_floor, 0 1870 | vm_round floor
1817 | vm_round vm_ceil, 1 1871 | vm_round ceil
1818#if LJ_HASJIT 1872#if LJ_HASJIT
1819 | vm_round vm_trunc, 2 1873 | vm_round trunc
1820#else 1874#else
1821 |->vm_trunc: 1875 |->vm_trunc:
1822#endif 1876#endif