diff options
author | Mike Pall <mike> | 2011-04-08 03:01:37 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-04-08 03:01:37 +0200 |
commit | b56784aae24bb865a308a0dafd1a067ac0dbe947 (patch) | |
tree | 4b1153d67751a9da0eadbf838629cf8a2b48fa8b /src | |
parent | b1912f33258dca7476d8c608204b24cbb46b6cb5 (diff) | |
download | luajit-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.dasc | 38 |
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 ------------------------------------------------------ */ |