aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-08 03:01:37 +0200
committerMike Pall <mike>2011-04-08 03:01:37 +0200
commitb56784aae24bb865a308a0dafd1a067ac0dbe947 (patch)
tree4b1153d67751a9da0eadbf838629cf8a2b48fa8b /src
parentb1912f33258dca7476d8c608204b24cbb46b6cb5 (diff)
downloadluajit-b56784aae24bb865a308a0dafd1a067ac0dbe947.tar.gz
luajit-b56784aae24bb865a308a0dafd1a067ac0dbe947.tar.bz2
luajit-b56784aae24bb865a308a0dafd1a067ac0dbe947.zip
ARM: Add BC_CAT and lj_cont_cat.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc38
1 files changed, 35 insertions, 3 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc
index 7b2d3ce7..aa55e549 100644
--- a/src/buildvm_arm.dasc
+++ b/src/buildvm_arm.dasc
@@ -457,8 +457,20 @@ static void build_subroutines(BuildCtx *ctx)
457 | // BASE = base, RA = resultptr, CARG4 = meta base 457 | // BASE = base, RA = resultptr, CARG4 = meta base
458 | bx CARG1 458 | bx CARG1
459 | 459 |
460 |->cont_cat: 460 |->cont_cat: // RA = resultptr, CARG4 = meta base
461 | NYI 461 | ldr INS, [PC, #-4]
462 | sub CARG2, CARG4, #16
463 | ldrd CARG34, [RA]
464 | str BASE, L->base
465 | decode_RB8 RC, INS
466 | decode_RA8 RA, INS
467 | add CARG1, BASE, RC
468 | subs CARG1, CARG2, CARG1
469 | strdne CARG34, [CARG2]
470 | movne CARG3, CARG1
471 | bne ->BC_CAT_Z
472 | strd CARG34, [BASE, RA]
473 | b ->cont_nop
462 | 474 |
463 |//-- Table indexing metamethods ----------------------------------------- 475 |//-- Table indexing metamethods -----------------------------------------
464 | 476 |
@@ -1846,7 +1858,27 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1846 break; 1858 break;
1847 1859
1848 case BC_CAT: 1860 case BC_CAT:
1849 | NYI 1861 | decode_RB8 RC, INS
1862 | decode_RC8 RB, INS
1863 | // RA = dst*8, RC = src_start*8, RB = src_end*8 (note: RB/RC swapped!)
1864 | sub CARG3, RB, RC
1865 | str BASE, L->base
1866 | add CARG2, BASE, RB
1867 |->BC_CAT_Z:
1868 | // RA = dst*8, RC = src_start*8, CARG2 = top-1
1869 | mov CARG1, L
1870 | str PC, SAVE_PC
1871 | lsr CARG3, CARG3, #3
1872 | bl extern lj_meta_cat // (lua_State *L, TValue *top, int left)
1873 | // Returns NULL (finished) or TValue * (metamethod).
1874 | ldr BASE, L->base
1875 | cmp CRET1, #0
1876 | bne ->vmeta_binop
1877 | ldrd CARG34, [BASE, RC]
1878 | ins_next1
1879 | ins_next2
1880 | strd CARG34, [BASE, RA] // Copy result to RA.
1881 | ins_next3
1850 break; 1882 break;
1851 1883
1852 /* -- Constant ops ------------------------------------------------------ */ 1884 /* -- Constant ops ------------------------------------------------------ */