diff options
| author | Mike Pall <mike> | 2011-04-10 16:56:13 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-04-10 16:56:13 +0200 |
| commit | f089f3954c9be976faccc82661b4a7b00e70c3b0 (patch) | |
| tree | 3bd8281a9506a961bfa544a21359b0ed1788d232 /src | |
| parent | 161bc379f059bc903873b67da603b48d50cb8ffe (diff) | |
| download | luajit-f089f3954c9be976faccc82661b4a7b00e70c3b0.tar.gz luajit-f089f3954c9be976faccc82661b4a7b00e70c3b0.tar.bz2 luajit-f089f3954c9be976faccc82661b4a7b00e70c3b0.zip | |
ARM: Add bit.* fast functions and lj_vm_tobit().
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildvm_arm.dasc | 96 |
1 files changed, 81 insertions, 15 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index 7280438c..bf800eab 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
| @@ -1240,41 +1240,107 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 1240 | | | 1240 | | |
| 1241 | |//-- Bit library -------------------------------------------------------- | 1241 | |//-- Bit library -------------------------------------------------------- |
| 1242 | | | 1242 | | |
| 1243 | |// FP number to bit conversion for soft-float. Clobbers r0-r3. | ||
| 1244 | |->vm_tobit_fb: | ||
| 1245 | | bhi ->fff_fallback | ||
| 1246 | |->vm_tobit: | ||
| 1247 | | lsl CARG3, CARG2, #1 | ||
| 1248 | | adds CARG3, CARG3, #0x00200000 | ||
| 1249 | | movpl CARG1, #0 // |x| < 1? | ||
| 1250 | | bxpl lr | ||
| 1251 | | mvn CARG4, #0x3e0 | ||
| 1252 | | subs CARG3, CARG4, CARG3, asr #21 | ||
| 1253 | | bmi >1 // |x| >= 2^32? | ||
| 1254 | | lsl CARG4, CARG2, #11 | ||
| 1255 | | orr CARG4, CARG4, #0x80000000 | ||
| 1256 | | orr CARG4, CARG4, CARG1, lsr #21 | ||
| 1257 | | cmp CARG2, #0 | ||
| 1258 | | lsr CARG1, CARG4, CARG3 | ||
| 1259 | | rsblt CARG1, CARG1, #0 | ||
| 1260 | | bx lr | ||
| 1261 | |1: | ||
| 1262 | | add CARG3, CARG3, #21 | ||
| 1263 | | lsr CARG4, CARG1, CARG3 | ||
| 1264 | | rsb CARG3, CARG3, #20 | ||
| 1265 | | lsl CARG1, CARG2, #12 | ||
| 1266 | | cmp CARG2, #0 | ||
| 1267 | | orr CARG1, CARG4, CARG1, lsl CARG3 | ||
| 1268 | | rsblt CARG1, CARG1, #0 | ||
| 1269 | | bx lr | ||
| 1270 | | | ||
| 1243 | |.macro .ffunc_bit, name | 1271 | |.macro .ffunc_bit, name |
| 1244 | | .ffunc_1 bit_..name | 1272 | | .ffunc_1 bit_..name |
| 1245 | | NYI | 1273 | | checktp CARG2, LJ_TISNUM |
| 1274 | | blne ->vm_tobit_fb | ||
| 1246 | |.endmacro | 1275 | |.endmacro |
| 1247 | | | 1276 | | |
| 1248 | |.ffunc_bit tobit | 1277 | |.ffunc_bit tobit |
| 1249 | | NYI | 1278 | | mvn CARG2, #~LJ_TISNUM |
| 1250 | |->fff_resbit: | 1279 | | b ->fff_restv |
| 1251 | | NYI | ||
| 1252 | | | 1280 | | |
| 1253 | |.macro .ffunc_bit_op, name, ins | 1281 | |.macro .ffunc_bit_op, name, ins |
| 1254 | | .ffunc_bit name | 1282 | | .ffunc_bit name |
| 1255 | | NYI | 1283 | | mov CARG3, CARG1 |
| 1284 | | mov RA, #8 | ||
| 1285 | |1: | ||
| 1286 | | ldrd CARG12, [BASE, RA] | ||
| 1287 | | cmp RA, NARGS8:RC | ||
| 1288 | | add RA, RA, #8 | ||
| 1289 | | bge >2 | ||
| 1290 | | checktp CARG2, LJ_TISNUM | ||
| 1291 | | blne ->vm_tobit_fb | ||
| 1292 | | ins CARG3, CARG3, CARG1 | ||
| 1293 | | b <1 | ||
| 1256 | |.endmacro | 1294 | |.endmacro |
| 1257 | | | 1295 | | |
| 1258 | |.ffunc_bit_op band, and | 1296 | |.ffunc_bit_op band, and |
| 1259 | |.ffunc_bit_op bor, or | 1297 | |.ffunc_bit_op bor, orr |
| 1260 | |.ffunc_bit_op bxor, eor | 1298 | |.ffunc_bit_op bxor, eor |
| 1261 | | | 1299 | | |
| 1300 | |2: | ||
| 1301 | | mvn CARG4, #~LJ_TISNUM | ||
| 1302 | | ldr PC, [BASE, FRAME_PC] | ||
| 1303 | | strd CARG34, [BASE, #-8] | ||
| 1304 | | b ->fff_res1 | ||
| 1305 | | | ||
| 1262 | |.ffunc_bit bswap | 1306 | |.ffunc_bit bswap |
| 1263 | | NYI | 1307 | | eor CARG3, CARG1, CARG1, ror #16 |
| 1308 | | bic CARG3, CARG3, #0x00ff0000 | ||
| 1309 | | ror CARG1, CARG1, #8 | ||
| 1310 | | mvn CARG2, #~LJ_TISNUM | ||
| 1311 | | eor CARG1, CARG1, CARG3, lsr #8 | ||
| 1312 | | b ->fff_restv | ||
| 1264 | | | 1313 | | |
| 1265 | |.ffunc_bit bnot | 1314 | |.ffunc_bit bnot |
| 1266 | | NYI | 1315 | | mvn CARG1, CARG1 |
| 1316 | | mvn CARG2, #~LJ_TISNUM | ||
| 1317 | | b ->fff_restv | ||
| 1267 | | | 1318 | | |
| 1268 | |.macro .ffunc_bit_sh, name, ins, shmod | 1319 | |.macro .ffunc_bit_sh, name, ins, shmod |
| 1269 | | .ffunc_2 bit_..name | 1320 | | .ffunc bit_..name |
| 1270 | | NYI | 1321 | | ldrd CARG12, [BASE, #8] |
| 1322 | | cmp NARGS8:RC, #16 | ||
| 1323 | | blo ->fff_fallback | ||
| 1324 | | checktp CARG2, LJ_TISNUM | ||
| 1325 | | blne ->vm_tobit_fb | ||
| 1326 | |.if shmod == 0 | ||
| 1327 | | and RA, CARG1, #31 | ||
| 1328 | |.else | ||
| 1329 | | rsb RA, CARG1, #0 | ||
| 1330 | |.endif | ||
| 1331 | | ldrd CARG12, [BASE] | ||
| 1332 | | checktp CARG2, LJ_TISNUM | ||
| 1333 | | blne ->vm_tobit_fb | ||
| 1334 | | ins CARG1, CARG1, RA | ||
| 1335 | | mvn CARG2, #~LJ_TISNUM | ||
| 1336 | | b ->fff_restv | ||
| 1271 | |.endmacro | 1337 | |.endmacro |
| 1272 | | | 1338 | | |
| 1273 | |.ffunc_bit_sh lshift, NYI, 1 | 1339 | |.ffunc_bit_sh lshift, lsl, 0 |
| 1274 | |.ffunc_bit_sh rshift, NYI, 1 | 1340 | |.ffunc_bit_sh rshift, lsr, 0 |
| 1275 | |.ffunc_bit_sh arshift, NYI, 1 | 1341 | |.ffunc_bit_sh arshift, asr, 0 |
| 1276 | |.ffunc_bit_sh rol, NYI, 2 | 1342 | |.ffunc_bit_sh rol, ror, 1 |
| 1277 | |.ffunc_bit_sh ror, NYI, 0 | 1343 | |.ffunc_bit_sh ror, ror, 0 |
| 1278 | | | 1344 | | |
| 1279 | |//----------------------------------------------------------------------- | 1345 | |//----------------------------------------------------------------------- |
| 1280 | | | 1346 | | |
