diff options
| -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 --------------------------------------------------------- */ |
