diff options
author | Mike Pall <mike> | 2011-04-08 02:50:56 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-04-08 02:50:56 +0200 |
commit | 9e18260fb403f1dec2f2f86e9fffe6cf9dc96dbf (patch) | |
tree | 75795fcda7cb85a0f80791493a81ecfe61919c1b /src | |
parent | 3af41060c736e926ebb303999793fac0f5e9da12 (diff) | |
download | luajit-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.dasc | 122 |
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 --------------------------------------------------------- */ |