aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-08 02:50:56 +0200
committerMike Pall <mike>2011-04-08 02:50:56 +0200
commit9e18260fb403f1dec2f2f86e9fffe6cf9dc96dbf (patch)
tree75795fcda7cb85a0f80791493a81ecfe61919c1b /src
parent3af41060c736e926ebb303999793fac0f5e9da12 (diff)
downloadluajit-9e18260fb403f1dec2f2f86e9fffe6cf9dc96dbf.tar.gz
luajit-9e18260fb403f1dec2f2f86e9fffe6cf9dc96dbf.tar.bz2
luajit-9e18260fb403f1dec2f2f86e9fffe6cf9dc96dbf.zip
ARM: Add upvalue get/set and closure-related instructions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc122
1 files changed, 115 insertions, 7 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc
index 4411d46b..248b2cfe 100644
--- a/src/buildvm_arm.dasc
+++ b/src/buildvm_arm.dasc
@@ -1834,27 +1834,135 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1834 /* -- Upvalue and function ops ------------------------------------------ */ 1834 /* -- Upvalue and function ops ------------------------------------------ */
1835 1835
1836 case BC_UGET: 1836 case BC_UGET:
1837 | NYI 1837 | // RA = dst*8, RC = uvnum
1838 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC]
1839 | lsl RC, RC, #2
1840 | add RC, RC, #offsetof(GCfuncL, uvptr)
1841 | ldr UPVAL:CARG2, [LFUNC:CARG2, RC]
1842 | ldr CARG2, UPVAL:CARG2->v
1843 | ldrd CARG34, [CARG2]
1844 | ins_next1
1845 | ins_next2
1846 | strd CARG34, [BASE, RA]
1847 | ins_next3
1838 break; 1848 break;
1839 case BC_USETV: 1849 case BC_USETV:
1840 | NYI 1850 | // RA = uvnum*8, RC = src
1851 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC]
1852 | lsr RA, RA, #1
1853 | add RA, RA, #offsetof(GCfuncL, uvptr)
1854 | lsl RC, RC, #3
1855 | ldr UPVAL:CARG2, [LFUNC:CARG2, RA]
1856 | ldrd CARG34, [BASE, RC]
1857 | ldrb RB, UPVAL:CARG2->marked
1858 | ldrb RC, UPVAL:CARG2->closed
1859 | ldr CARG2, UPVAL:CARG2->v
1860 | tst RB, #LJ_GC_BLACK // isblack(uv)
1861 | add RB, CARG4, #-LJ_TISGCV
1862 | cmpne RC, #0
1863 | strd CARG34, [CARG2]
1864 | bne >2 // Upvalue is closed and black?
1865 |1:
1866 | ins_next
1867 |
1868 |2: // Check if new value is collectable.
1869 | cmn RB, #-(LJ_TISNUM - LJ_TISGCV)
1870 | ldrbhi RC, GCOBJ:CARG3->gch.marked
1871 | bls <1 // tvisgcv(v)
1872 | sub CARG1, DISPATCH, #-GG_DISP2G
1873 | tst RC, #LJ_GC_WHITES
1874 | // Crossed a write barrier. Move the barrier forward.
1875 | blne extern lj_gc_barrieruv // (global_State *g, TValue *tv)
1876 | b <1
1841 break; 1877 break;
1842 case BC_USETS: 1878 case BC_USETS:
1843 | NYI 1879 | // RA = uvnum*8, RC = str_const (~)
1880 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC]
1881 | lsr RA, RA, #1
1882 | add RA, RA, #offsetof(GCfuncL, uvptr)
1883 | mvn RC, RC
1884 | ldr UPVAL:CARG2, [LFUNC:CARG2, RA]
1885 | ldr STR:CARG3, [KBASE, RC, lsl #2]
1886 | mvn CARG4, #~LJ_TSTR
1887 | ldrb RB, UPVAL:CARG2->marked
1888 | ldr CARG2, UPVAL:CARG2->v
1889 | ldrb RC, UPVAL:CARG2->closed
1890 | tst RB, #LJ_GC_BLACK // isblack(uv)
1891 | ldrb RB, STR:CARG3->marked
1892 | strd CARG34, [CARG2]
1893 | bne >2
1894 |1:
1895 | ins_next
1896 |
1897 |2: // Check if string is white and ensure upvalue is closed.
1898 | tst RB, #LJ_GC_WHITES // iswhite(str)
1899 | cmpne RC, #0
1900 | sub CARG1, DISPATCH, #-GG_DISP2G
1901 | // Crossed a write barrier. Move the barrier forward.
1902 | blne extern lj_gc_barrieruv // (global_State *g, TValue *tv)
1903 | b <1
1844 break; 1904 break;
1845 case BC_USETN: 1905 case BC_USETN:
1846 | NYI 1906 | // RA = uvnum*8, RC = num_const
1907 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC]
1908 | lsr RA, RA, #1
1909 | add RA, RA, #offsetof(GCfuncL, uvptr)
1910 | lsl RC, RC, #3
1911 | ldr UPVAL:CARG2, [LFUNC:CARG2, RA]
1912 | ldrd CARG34, [KBASE, RC]
1913 | ldr CARG2, UPVAL:CARG2->v
1914 | ins_next1
1915 | ins_next2
1916 | strd CARG34, [CARG2]
1917 | ins_next3
1847 break; 1918 break;
1848 case BC_USETP: 1919 case BC_USETP:
1849 | NYI 1920 | // RA = uvnum*8, RC = primitive_type (~)
1921 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC]
1922 | lsr RA, RA, #1
1923 | add RA, RA, #offsetof(GCfuncL, uvptr)
1924 | ldr UPVAL:CARG2, [LFUNC:CARG2, RA]
1925 | mvn RC, RC
1926 | ldr CARG2, UPVAL:CARG2->v
1927 | ins_next1
1928 | ins_next2
1929 | str RC, [CARG2, #4]
1930 | ins_next3
1850 break; 1931 break;
1851 1932
1852 case BC_UCLO: 1933 case BC_UCLO:
1853 | NYI 1934 | // RA = level*8, RC = target
1935 | ldr CARG3, L->openupval
1936 | add RC, PC, RC, lsl #2
1937 | str BASE, L->base
1938 | cmp CARG3, #0
1939 | sub PC, RC, #0x20000
1940 | beq >1
1941 | mov CARG1, L
1942 | add CARG2, BASE, RA
1943 | bl extern lj_func_closeuv // (lua_State *L, TValue *level)
1944 | ldr BASE, L->base
1945 |1:
1946 | ins_next
1854 break; 1947 break;
1855 1948
1856 case BC_FNEW: 1949 case BC_FNEW:
1857 | NYI 1950 | // RA = dst*8, RC = proto_const (~) (holding function prototype)
1951 | mvn RC, RC
1952 | str BASE, L->base
1953 | ldr CARG2, [KBASE, RC, lsl #2]
1954 | str PC, SAVE_PC
1955 | ldr CARG3, [BASE, FRAME_FUNC]
1956 | mov CARG1, L
1957 | // (lua_State *L, GCproto *pt, GCfuncL *parent)
1958 | bl extern lj_func_newL_gc
1959 | // Returns GCfuncL *.
1960 | ldr BASE, L->base
1961 | mvn CARG2, #~LJ_TFUNC
1962 | ins_next1
1963 | ins_next2
1964 | strd CARG12, [BASE, RA]
1965 | ins_next3
1858 break; 1966 break;
1859 1967
1860 /* -- Table ops --------------------------------------------------------- */ 1968 /* -- Table ops --------------------------------------------------------- */