Commit e9ebed4d41fc0630e433a32ecfd1057cae8b10bf
1 parent
3d834c78
Sparc64 update: more VIS ops
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2714 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
884 additions
and
36 deletions
target-sparc/cpu.h
... | ... | @@ -225,6 +225,9 @@ typedef struct CPUSPARCState { |
225 | 225 | uint64_t fprs; |
226 | 226 | uint64_t tick_cmpr, stick_cmpr; |
227 | 227 | uint64_t gsr; |
228 | + uint32_t gl; // UA2005 | |
229 | + /* UA 2005 hyperprivileged registers */ | |
230 | + uint64_t hpstate, htstate[MAXTL], hintp, htba, hver, hstick_cmpr, ssr; | |
228 | 231 | #endif |
229 | 232 | #if !defined(TARGET_SPARC64) && !defined(reg_T2) |
230 | 233 | target_ulong t2; | ... | ... |
target-sparc/op.c
... | ... | @@ -1095,7 +1095,7 @@ void OPPROTO op_rdtick(void) |
1095 | 1095 | |
1096 | 1096 | void OPPROTO op_wrtick(void) |
1097 | 1097 | { |
1098 | - // XXX write cycle counter and bit 31 | |
1098 | + T0 = 0; // XXX write cycle counter and bit 31 | |
1099 | 1099 | } |
1100 | 1100 | |
1101 | 1101 | void OPPROTO op_rdtpc(void) |
... | ... | @@ -1818,8 +1818,7 @@ void OPPROTO op_retry(void) |
1818 | 1818 | |
1819 | 1819 | void OPPROTO op_sir(void) |
1820 | 1820 | { |
1821 | - // XXX | |
1822 | - | |
1821 | + T0 = 0; // XXX | |
1823 | 1822 | } |
1824 | 1823 | |
1825 | 1824 | void OPPROTO op_ld_asi_reg() |
... | ... | @@ -1846,6 +1845,44 @@ void OPPROTO op_st_asi() |
1846 | 1845 | } |
1847 | 1846 | |
1848 | 1847 | #ifdef TARGET_SPARC64 |
1848 | +// This function uses non-native bit order | |
1849 | +#define GET_FIELD(X, FROM, TO) \ | |
1850 | + ((X) >> (63 - (TO)) & ((1ULL << ((TO) - (FROM) + 1)) - 1)) | |
1851 | + | |
1852 | +// This function uses the order in the manuals, i.e. bit 0 is 2^0 | |
1853 | +#define GET_FIELD_SP(X, FROM, TO) \ | |
1854 | + GET_FIELD(X, 63 - (TO), 63 - (FROM)) | |
1855 | + | |
1856 | +void OPPROTO op_array8() | |
1857 | +{ | |
1858 | + T0 = (GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) | | |
1859 | + (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) | | |
1860 | + (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) | | |
1861 | + (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) | | |
1862 | + (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) | | |
1863 | + (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12); | |
1864 | +} | |
1865 | + | |
1866 | +void OPPROTO op_array16() | |
1867 | +{ | |
1868 | + T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) | | |
1869 | + (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) | | |
1870 | + (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) | | |
1871 | + (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) | | |
1872 | + (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) | | |
1873 | + (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 1; | |
1874 | +} | |
1875 | + | |
1876 | +void OPPROTO op_array32() | |
1877 | +{ | |
1878 | + T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) | | |
1879 | + (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) | | |
1880 | + (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) | | |
1881 | + (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) | | |
1882 | + (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) | | |
1883 | + (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 2; | |
1884 | +} | |
1885 | + | |
1849 | 1886 | void OPPROTO op_alignaddr() |
1850 | 1887 | { |
1851 | 1888 | uint64_t tmp; |
... | ... | @@ -1862,26 +1899,440 @@ void OPPROTO op_faligndata() |
1862 | 1899 | |
1863 | 1900 | tmp = (*((uint64_t *)&DT0)) << ((env->gsr & 7) * 8); |
1864 | 1901 | tmp |= (*((uint64_t *)&DT1)) >> (64 - (env->gsr & 7) * 8); |
1865 | - (*((uint64_t *)&DT0)) = tmp; | |
1902 | + *((uint64_t *)&DT0) = tmp; | |
1866 | 1903 | } |
1867 | 1904 | |
1868 | 1905 | void OPPROTO op_movl_FT0_0(void) |
1869 | 1906 | { |
1870 | - (*((uint32_t *)&FT0)) = 0; | |
1907 | + *((uint32_t *)&FT0) = 0; | |
1871 | 1908 | } |
1872 | 1909 | |
1873 | 1910 | void OPPROTO op_movl_DT0_0(void) |
1874 | 1911 | { |
1875 | - (*((uint64_t *)&DT0)) = 0; | |
1912 | + *((uint64_t *)&DT0) = 0; | |
1876 | 1913 | } |
1877 | 1914 | |
1878 | 1915 | void OPPROTO op_movl_FT0_1(void) |
1879 | 1916 | { |
1880 | - (*((uint32_t *)&FT0)) = 0xffffffff; | |
1917 | + *((uint32_t *)&FT0) = 0xffffffff; | |
1881 | 1918 | } |
1882 | 1919 | |
1883 | 1920 | void OPPROTO op_movl_DT0_1(void) |
1884 | 1921 | { |
1885 | - (*((uint64_t *)&DT0)) = 0xffffffffffffffffULL; | |
1922 | + *((uint64_t *)&DT0) = 0xffffffffffffffffULL; | |
1923 | +} | |
1924 | + | |
1925 | +void OPPROTO op_fnot(void) | |
1926 | +{ | |
1927 | + *(uint64_t *)&DT0 = ~*(uint64_t *)&DT1; | |
1928 | +} | |
1929 | + | |
1930 | +void OPPROTO op_fnots(void) | |
1931 | +{ | |
1932 | + *(uint32_t *)&FT0 = ~*(uint32_t *)&FT1; | |
1933 | +} | |
1934 | + | |
1935 | +void OPPROTO op_fnor(void) | |
1936 | +{ | |
1937 | + *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 | *(uint64_t *)&DT1); | |
1938 | +} | |
1939 | + | |
1940 | +void OPPROTO op_fnors(void) | |
1941 | +{ | |
1942 | + *(uint32_t *)&FT0 = ~(*(uint32_t *)&FT0 | *(uint32_t *)&FT1); | |
1943 | +} | |
1944 | + | |
1945 | +void OPPROTO op_for(void) | |
1946 | +{ | |
1947 | + *(uint64_t *)&DT0 |= *(uint64_t *)&DT1; | |
1948 | +} | |
1949 | + | |
1950 | +void OPPROTO op_fors(void) | |
1951 | +{ | |
1952 | + *(uint32_t *)&FT0 |= *(uint32_t *)&FT1; | |
1953 | +} | |
1954 | + | |
1955 | +void OPPROTO op_fxor(void) | |
1956 | +{ | |
1957 | + *(uint64_t *)&DT0 ^= *(uint64_t *)&DT1; | |
1958 | +} | |
1959 | + | |
1960 | +void OPPROTO op_fxors(void) | |
1961 | +{ | |
1962 | + *(uint32_t *)&FT0 ^= *(uint32_t *)&FT1; | |
1963 | +} | |
1964 | + | |
1965 | +void OPPROTO op_fand(void) | |
1966 | +{ | |
1967 | + *(uint64_t *)&DT0 &= *(uint64_t *)&DT1; | |
1968 | +} | |
1969 | + | |
1970 | +void OPPROTO op_fands(void) | |
1971 | +{ | |
1972 | + *(uint32_t *)&FT0 &= *(uint32_t *)&FT1; | |
1973 | +} | |
1974 | + | |
1975 | +void OPPROTO op_fornot(void) | |
1976 | +{ | |
1977 | + *(uint64_t *)&DT0 = *(uint64_t *)&DT0 | ~*(uint64_t *)&DT1; | |
1978 | +} | |
1979 | + | |
1980 | +void OPPROTO op_fornots(void) | |
1981 | +{ | |
1982 | + *(uint32_t *)&FT0 = *(uint32_t *)&FT0 | ~*(uint32_t *)&FT1; | |
1983 | +} | |
1984 | + | |
1985 | +void OPPROTO op_fandnot(void) | |
1986 | +{ | |
1987 | + *(uint64_t *)&DT0 = *(uint64_t *)&DT0 & ~*(uint64_t *)&DT1; | |
1988 | +} | |
1989 | + | |
1990 | +void OPPROTO op_fandnots(void) | |
1991 | +{ | |
1992 | + *(uint32_t *)&FT0 = *(uint32_t *)&FT0 & ~*(uint32_t *)&FT1; | |
1993 | +} | |
1994 | + | |
1995 | +void OPPROTO op_fnand(void) | |
1996 | +{ | |
1997 | + *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 & *(uint64_t *)&DT1); | |
1998 | +} | |
1999 | + | |
2000 | +void OPPROTO op_fnands(void) | |
2001 | +{ | |
2002 | + *(uint32_t *)&FT0 = ~(*(uint32_t *)&FT0 & *(uint32_t *)&FT1); | |
2003 | +} | |
2004 | + | |
2005 | +void OPPROTO op_fxnor(void) | |
2006 | +{ | |
2007 | + *(uint64_t *)&DT0 ^= ~*(uint64_t *)&DT1; | |
2008 | +} | |
2009 | + | |
2010 | +void OPPROTO op_fxnors(void) | |
2011 | +{ | |
2012 | + *(uint32_t *)&FT0 ^= ~*(uint32_t *)&FT1; | |
2013 | +} | |
2014 | + | |
2015 | +#ifdef WORDS_BIGENDIAN | |
2016 | +#define VIS_B64(n) b[7 - (n)] | |
2017 | +#define VIS_W64(n) w[3 - (n)] | |
2018 | +#define VIS_SW64(n) sw[3 - (n)] | |
2019 | +#define VIS_L64(n) l[1 - (n)] | |
2020 | +#define VIS_B32(n) b[3 - (n)] | |
2021 | +#define VIS_W32(n) w[1 - (n)] | |
2022 | +#else | |
2023 | +#define VIS_B64(n) b[n] | |
2024 | +#define VIS_W64(n) w[n] | |
2025 | +#define VIS_SW64(n) sw[n] | |
2026 | +#define VIS_L64(n) l[n] | |
2027 | +#define VIS_B32(n) b[n] | |
2028 | +#define VIS_W32(n) w[n] | |
2029 | +#endif | |
2030 | + | |
2031 | +typedef union { | |
2032 | + uint8_t b[8]; | |
2033 | + uint16_t w[4]; | |
2034 | + int16_t sw[4]; | |
2035 | + uint32_t l[2]; | |
2036 | + float64 d; | |
2037 | +} vis64; | |
2038 | + | |
2039 | +typedef union { | |
2040 | + uint8_t b[4]; | |
2041 | + uint16_t w[2]; | |
2042 | + uint32_t l; | |
2043 | + float32 f; | |
2044 | +} vis32; | |
2045 | + | |
2046 | +void OPPROTO op_fpmerge(void) | |
2047 | +{ | |
2048 | + vis64 s, d; | |
2049 | + | |
2050 | + s.d = DT0; | |
2051 | + d.d = DT1; | |
2052 | + | |
2053 | + // Reverse calculation order to handle overlap | |
2054 | + d.VIS_B64(7) = s.VIS_B64(3); | |
2055 | + d.VIS_B64(6) = d.VIS_B64(3); | |
2056 | + d.VIS_B64(5) = s.VIS_B64(2); | |
2057 | + d.VIS_B64(4) = d.VIS_B64(2); | |
2058 | + d.VIS_B64(3) = s.VIS_B64(1); | |
2059 | + d.VIS_B64(2) = d.VIS_B64(1); | |
2060 | + d.VIS_B64(1) = s.VIS_B64(0); | |
2061 | + //d.VIS_B64(0) = d.VIS_B64(0); | |
2062 | + | |
2063 | + DT0 = d.d; | |
2064 | +} | |
2065 | + | |
2066 | +void OPPROTO op_fmul8x16(void) | |
2067 | +{ | |
2068 | + vis64 s, d; | |
2069 | + uint32_t tmp; | |
2070 | + | |
2071 | + s.d = DT0; | |
2072 | + d.d = DT1; | |
2073 | + | |
2074 | +#define PMUL(r) \ | |
2075 | + tmp = (int32_t)d.VIS_SW64(r) * (int32_t)s.VIS_B64(r); \ | |
2076 | + if ((tmp & 0xff) > 0x7f) \ | |
2077 | + tmp += 0x100; \ | |
2078 | + d.VIS_W64(r) = tmp >> 8; | |
2079 | + | |
2080 | + PMUL(0); | |
2081 | + PMUL(1); | |
2082 | + PMUL(2); | |
2083 | + PMUL(3); | |
2084 | +#undef PMUL | |
2085 | + | |
2086 | + DT0 = d.d; | |
2087 | +} | |
2088 | + | |
2089 | +void OPPROTO op_fmul8x16al(void) | |
2090 | +{ | |
2091 | + vis64 s, d; | |
2092 | + uint32_t tmp; | |
2093 | + | |
2094 | + s.d = DT0; | |
2095 | + d.d = DT1; | |
2096 | + | |
2097 | +#define PMUL(r) \ | |
2098 | + tmp = (int32_t)d.VIS_SW64(1) * (int32_t)s.VIS_B64(r); \ | |
2099 | + if ((tmp & 0xff) > 0x7f) \ | |
2100 | + tmp += 0x100; \ | |
2101 | + d.VIS_W64(r) = tmp >> 8; | |
2102 | + | |
2103 | + PMUL(0); | |
2104 | + PMUL(1); | |
2105 | + PMUL(2); | |
2106 | + PMUL(3); | |
2107 | +#undef PMUL | |
2108 | + | |
2109 | + DT0 = d.d; | |
1886 | 2110 | } |
2111 | + | |
2112 | +void OPPROTO op_fmul8x16au(void) | |
2113 | +{ | |
2114 | + vis64 s, d; | |
2115 | + uint32_t tmp; | |
2116 | + | |
2117 | + s.d = DT0; | |
2118 | + d.d = DT1; | |
2119 | + | |
2120 | +#define PMUL(r) \ | |
2121 | + tmp = (int32_t)d.VIS_SW64(0) * (int32_t)s.VIS_B64(r); \ | |
2122 | + if ((tmp & 0xff) > 0x7f) \ | |
2123 | + tmp += 0x100; \ | |
2124 | + d.VIS_W64(r) = tmp >> 8; | |
2125 | + | |
2126 | + PMUL(0); | |
2127 | + PMUL(1); | |
2128 | + PMUL(2); | |
2129 | + PMUL(3); | |
2130 | +#undef PMUL | |
2131 | + | |
2132 | + DT0 = d.d; | |
2133 | +} | |
2134 | + | |
2135 | +void OPPROTO op_fmul8sux16(void) | |
2136 | +{ | |
2137 | + vis64 s, d; | |
2138 | + uint32_t tmp; | |
2139 | + | |
2140 | + s.d = DT0; | |
2141 | + d.d = DT1; | |
2142 | + | |
2143 | +#define PMUL(r) \ | |
2144 | + tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8); \ | |
2145 | + if ((tmp & 0xff) > 0x7f) \ | |
2146 | + tmp += 0x100; \ | |
2147 | + d.VIS_W64(r) = tmp >> 8; | |
2148 | + | |
2149 | + PMUL(0); | |
2150 | + PMUL(1); | |
2151 | + PMUL(2); | |
2152 | + PMUL(3); | |
2153 | +#undef PMUL | |
2154 | + | |
2155 | + DT0 = d.d; | |
2156 | +} | |
2157 | + | |
2158 | +void OPPROTO op_fmul8ulx16(void) | |
2159 | +{ | |
2160 | + vis64 s, d; | |
2161 | + uint32_t tmp; | |
2162 | + | |
2163 | + s.d = DT0; | |
2164 | + d.d = DT1; | |
2165 | + | |
2166 | +#define PMUL(r) \ | |
2167 | + tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2)); \ | |
2168 | + if ((tmp & 0xff) > 0x7f) \ | |
2169 | + tmp += 0x100; \ | |
2170 | + d.VIS_W64(r) = tmp >> 8; | |
2171 | + | |
2172 | + PMUL(0); | |
2173 | + PMUL(1); | |
2174 | + PMUL(2); | |
2175 | + PMUL(3); | |
2176 | +#undef PMUL | |
2177 | + | |
2178 | + DT0 = d.d; | |
2179 | +} | |
2180 | + | |
2181 | +void OPPROTO op_fmuld8sux16(void) | |
2182 | +{ | |
2183 | + vis64 s, d; | |
2184 | + uint32_t tmp; | |
2185 | + | |
2186 | + s.d = DT0; | |
2187 | + d.d = DT1; | |
2188 | + | |
2189 | +#define PMUL(r) \ | |
2190 | + tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8); \ | |
2191 | + if ((tmp & 0xff) > 0x7f) \ | |
2192 | + tmp += 0x100; \ | |
2193 | + d.VIS_L64(r) = tmp; | |
2194 | + | |
2195 | + // Reverse calculation order to handle overlap | |
2196 | + PMUL(1); | |
2197 | + PMUL(0); | |
2198 | +#undef PMUL | |
2199 | + | |
2200 | + DT0 = d.d; | |
2201 | +} | |
2202 | + | |
2203 | +void OPPROTO op_fmuld8ulx16(void) | |
2204 | +{ | |
2205 | + vis64 s, d; | |
2206 | + uint32_t tmp; | |
2207 | + | |
2208 | + s.d = DT0; | |
2209 | + d.d = DT1; | |
2210 | + | |
2211 | +#define PMUL(r) \ | |
2212 | + tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2)); \ | |
2213 | + if ((tmp & 0xff) > 0x7f) \ | |
2214 | + tmp += 0x100; \ | |
2215 | + d.VIS_L64(r) = tmp; | |
2216 | + | |
2217 | + // Reverse calculation order to handle overlap | |
2218 | + PMUL(1); | |
2219 | + PMUL(0); | |
2220 | +#undef PMUL | |
2221 | + | |
2222 | + DT0 = d.d; | |
2223 | +} | |
2224 | + | |
2225 | +void OPPROTO op_fexpand(void) | |
2226 | +{ | |
2227 | + vis32 s; | |
2228 | + vis64 d; | |
2229 | + | |
2230 | + s.l = (uint32_t)(*(uint64_t *)&DT0 & 0xffffffff); | |
2231 | + d.d = DT1; | |
2232 | + d.VIS_L64(0) = s.VIS_W32(0) << 4; | |
2233 | + d.VIS_L64(1) = s.VIS_W32(1) << 4; | |
2234 | + d.VIS_L64(2) = s.VIS_W32(2) << 4; | |
2235 | + d.VIS_L64(3) = s.VIS_W32(3) << 4; | |
2236 | + | |
2237 | + DT0 = d.d; | |
2238 | +} | |
2239 | + | |
2240 | +#define VIS_OP(name, F) \ | |
2241 | + void OPPROTO name##16(void) \ | |
2242 | + { \ | |
2243 | + vis64 s, d; \ | |
2244 | + \ | |
2245 | + s.d = DT0; \ | |
2246 | + d.d = DT1; \ | |
2247 | + \ | |
2248 | + d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0)); \ | |
2249 | + d.VIS_W64(1) = F(d.VIS_W64(1), s.VIS_W64(1)); \ | |
2250 | + d.VIS_W64(2) = F(d.VIS_W64(2), s.VIS_W64(2)); \ | |
2251 | + d.VIS_W64(3) = F(d.VIS_W64(3), s.VIS_W64(3)); \ | |
2252 | + \ | |
2253 | + DT0 = d.d; \ | |
2254 | + } \ | |
2255 | + \ | |
2256 | + void OPPROTO name##16s(void) \ | |
2257 | + { \ | |
2258 | + vis32 s, d; \ | |
2259 | + \ | |
2260 | + s.f = FT0; \ | |
2261 | + d.f = FT1; \ | |
2262 | + \ | |
2263 | + d.VIS_W32(0) = F(d.VIS_W32(0), s.VIS_W32(0)); \ | |
2264 | + d.VIS_W32(1) = F(d.VIS_W32(1), s.VIS_W32(1)); \ | |
2265 | + \ | |
2266 | + FT0 = d.f; \ | |
2267 | + } \ | |
2268 | + \ | |
2269 | + void OPPROTO name##32(void) \ | |
2270 | + { \ | |
2271 | + vis64 s, d; \ | |
2272 | + \ | |
2273 | + s.d = DT0; \ | |
2274 | + d.d = DT1; \ | |
2275 | + \ | |
2276 | + d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0)); \ | |
2277 | + d.VIS_L64(1) = F(d.VIS_L64(1), s.VIS_L64(1)); \ | |
2278 | + \ | |
2279 | + DT0 = d.d; \ | |
2280 | + } \ | |
2281 | + \ | |
2282 | + void OPPROTO name##32s(void) \ | |
2283 | + { \ | |
2284 | + vis32 s, d; \ | |
2285 | + \ | |
2286 | + s.f = FT0; \ | |
2287 | + d.f = FT1; \ | |
2288 | + \ | |
2289 | + d.l = F(d.l, s.l); \ | |
2290 | + \ | |
2291 | + FT0 = d.f; \ | |
2292 | + } | |
2293 | + | |
2294 | +#define FADD(a, b) ((a) + (b)) | |
2295 | +#define FSUB(a, b) ((a) - (b)) | |
2296 | +VIS_OP(op_fpadd, FADD) | |
2297 | +VIS_OP(op_fpsub, FSUB) | |
2298 | + | |
2299 | +#define VIS_CMPOP(name, F) \ | |
2300 | + void OPPROTO name##16(void) \ | |
2301 | + { \ | |
2302 | + vis64 s, d; \ | |
2303 | + \ | |
2304 | + s.d = DT0; \ | |
2305 | + d.d = DT1; \ | |
2306 | + \ | |
2307 | + d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0))? 1: 0; \ | |
2308 | + d.VIS_W64(0) |= F(d.VIS_W64(1), s.VIS_W64(1))? 2: 0; \ | |
2309 | + d.VIS_W64(0) |= F(d.VIS_W64(2), s.VIS_W64(2))? 4: 0; \ | |
2310 | + d.VIS_W64(0) |= F(d.VIS_W64(3), s.VIS_W64(3))? 8: 0; \ | |
2311 | + \ | |
2312 | + DT0 = d.d; \ | |
2313 | + } \ | |
2314 | + \ | |
2315 | + void OPPROTO name##32(void) \ | |
2316 | + { \ | |
2317 | + vis64 s, d; \ | |
2318 | + \ | |
2319 | + s.d = DT0; \ | |
2320 | + d.d = DT1; \ | |
2321 | + \ | |
2322 | + d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0))? 1: 0; \ | |
2323 | + d.VIS_L64(0) |= F(d.VIS_L64(1), s.VIS_L64(1))? 2: 0; \ | |
2324 | + \ | |
2325 | + DT0 = d.d; \ | |
2326 | + } | |
2327 | + | |
2328 | +#define FCMPGT(a, b) ((a) > (b)) | |
2329 | +#define FCMPEQ(a, b) ((a) == (b)) | |
2330 | +#define FCMPLE(a, b) ((a) <= (b)) | |
2331 | +#define FCMPNE(a, b) ((a) != (b)) | |
2332 | + | |
2333 | +VIS_CMPOP(op_fcmpgt, FCMPGT) | |
2334 | +VIS_CMPOP(op_fcmpeq, FCMPEQ) | |
2335 | +VIS_CMPOP(op_fcmple, FCMPLE) | |
2336 | +VIS_CMPOP(op_fcmpne, FCMPNE) | |
2337 | + | |
1887 | 2338 | #endif | ... | ... |
target-sparc/translate.c
... | ... | @@ -350,6 +350,7 @@ GEN32(gen_op_store_DT1_fpr, gen_op_store_DT1_fpr_fprf); |
350 | 350 | // 'a' versions allowed to user depending on asi |
351 | 351 | #if defined(CONFIG_USER_ONLY) |
352 | 352 | #define supervisor(dc) 0 |
353 | +#define hypervisor(dc) 0 | |
353 | 354 | #define gen_op_ldst(name) gen_op_##name##_raw() |
354 | 355 | #define OP_LD_TABLE(width) \ |
355 | 356 | static void gen_op_##width##a(int insn, int is_ld, int size, int sign) \ |
... | ... | @@ -405,6 +406,7 @@ GEN32(gen_op_store_DT1_fpr, gen_op_store_DT1_fpr_fprf); |
405 | 406 | } |
406 | 407 | |
407 | 408 | #define supervisor(dc) (dc->mem_idx == 1) |
409 | +#define hypervisor(dc) (dc->mem_idx == 2) | |
408 | 410 | #endif |
409 | 411 | #else |
410 | 412 | #if defined(CONFIG_USER_ONLY) |
... | ... | @@ -1218,14 +1220,40 @@ static void disas_sparc_insn(DisasContext * dc) |
1218 | 1220 | goto illegal_insn; |
1219 | 1221 | } |
1220 | 1222 | #if !defined(CONFIG_USER_ONLY) |
1223 | + } else if (xop == 0x29) { /* rdpsr / UA2005 rdhpr */ | |
1221 | 1224 | #ifndef TARGET_SPARC64 |
1222 | - } else if (xop == 0x29) { /* rdpsr / V9 unimp */ | |
1223 | 1225 | if (!supervisor(dc)) |
1224 | 1226 | goto priv_insn; |
1225 | 1227 | gen_op_rdpsr(); |
1228 | +#else | |
1229 | + if (!hypervisor(dc)) | |
1230 | + goto priv_insn; | |
1231 | + rs1 = GET_FIELD(insn, 13, 17); | |
1232 | + switch (rs1) { | |
1233 | + case 0: // hpstate | |
1234 | + // gen_op_rdhpstate(); | |
1235 | + break; | |
1236 | + case 1: // htstate | |
1237 | + // gen_op_rdhtstate(); | |
1238 | + break; | |
1239 | + case 3: // hintp | |
1240 | + gen_op_movl_T0_env(offsetof(CPUSPARCState, hintp)); | |
1241 | + break; | |
1242 | + case 5: // htba | |
1243 | + gen_op_movl_T0_env(offsetof(CPUSPARCState, htba)); | |
1244 | + break; | |
1245 | + case 6: // hver | |
1246 | + gen_op_movl_T0_env(offsetof(CPUSPARCState, hver)); | |
1247 | + break; | |
1248 | + case 31: // hstick_cmpr | |
1249 | + gen_op_movl_env_T0(offsetof(CPUSPARCState, hstick_cmpr)); | |
1250 | + break; | |
1251 | + default: | |
1252 | + goto illegal_insn; | |
1253 | + } | |
1254 | +#endif | |
1226 | 1255 | gen_movl_T0_reg(rd); |
1227 | 1256 | break; |
1228 | -#endif | |
1229 | 1257 | } else if (xop == 0x2a) { /* rdwim / V9 rdpr */ |
1230 | 1258 | if (!supervisor(dc)) |
1231 | 1259 | goto priv_insn; |
... | ... | @@ -1277,6 +1305,14 @@ static void disas_sparc_insn(DisasContext * dc) |
1277 | 1305 | case 14: // wstate |
1278 | 1306 | gen_op_movl_T0_env(offsetof(CPUSPARCState, wstate)); |
1279 | 1307 | break; |
1308 | + case 16: // UA2005 gl | |
1309 | + gen_op_movl_T0_env(offsetof(CPUSPARCState, gl)); | |
1310 | + break; | |
1311 | + case 26: // UA2005 strand status | |
1312 | + if (!hypervisor(dc)) | |
1313 | + goto priv_insn; | |
1314 | + gen_op_movl_T0_env(offsetof(CPUSPARCState, ssr)); | |
1315 | + break; | |
1280 | 1316 | case 31: // ver |
1281 | 1317 | gen_op_movtl_T0_env(offsetof(CPUSPARCState, version)); |
1282 | 1318 | break; |
... | ... | @@ -1997,6 +2033,11 @@ static void disas_sparc_insn(DisasContext * dc) |
1997 | 2033 | case 1: |
1998 | 2034 | gen_op_restored(); |
1999 | 2035 | break; |
2036 | + case 2: /* UA2005 allclean */ | |
2037 | + case 3: /* UA2005 otherw */ | |
2038 | + case 4: /* UA2005 normalw */ | |
2039 | + case 5: /* UA2005 invalw */ | |
2040 | + // XXX | |
2000 | 2041 | default: |
2001 | 2042 | goto illegal_insn; |
2002 | 2043 | } |
... | ... | @@ -2068,6 +2109,14 @@ static void disas_sparc_insn(DisasContext * dc) |
2068 | 2109 | case 14: // wstate |
2069 | 2110 | gen_op_movl_env_T0(offsetof(CPUSPARCState, wstate)); |
2070 | 2111 | break; |
2112 | + case 16: // UA2005 gl | |
2113 | + gen_op_movl_env_T0(offsetof(CPUSPARCState, gl)); | |
2114 | + break; | |
2115 | + case 26: // UA2005 strand status | |
2116 | + if (!hypervisor(dc)) | |
2117 | + goto priv_insn; | |
2118 | + gen_op_movl_env_T0(offsetof(CPUSPARCState, ssr)); | |
2119 | + break; | |
2071 | 2120 | default: |
2072 | 2121 | goto illegal_insn; |
2073 | 2122 | } |
... | ... | @@ -2076,17 +2125,46 @@ static void disas_sparc_insn(DisasContext * dc) |
2076 | 2125 | #endif |
2077 | 2126 | } |
2078 | 2127 | break; |
2079 | -#ifndef TARGET_SPARC64 | |
2080 | - case 0x33: /* wrtbr, V9 unimp */ | |
2128 | + case 0x33: /* wrtbr, UA2005 wrhpr */ | |
2081 | 2129 | { |
2130 | +#ifndef TARGET_SPARC64 | |
2082 | 2131 | if (!supervisor(dc)) |
2083 | 2132 | goto priv_insn; |
2084 | 2133 | gen_op_xor_T1_T0(); |
2085 | - gen_op_movtl_env_T0(offsetof(CPUSPARCState, tbr)); | |
2134 | + gen_op_movtl_env_T0(offsetof(CPUSPARCState, tbr)); | |
2135 | +#else | |
2136 | + if (!hypervisor(dc)) | |
2137 | + goto priv_insn; | |
2138 | + gen_op_xor_T1_T0(); | |
2139 | + switch (rd) { | |
2140 | + case 0: // hpstate | |
2141 | + // XXX gen_op_wrhpstate(); | |
2142 | + save_state(dc); | |
2143 | + gen_op_next_insn(); | |
2144 | + gen_op_movl_T0_0(); | |
2145 | + gen_op_exit_tb(); | |
2146 | + dc->is_br = 1; | |
2147 | + break; | |
2148 | + case 1: // htstate | |
2149 | + // XXX gen_op_wrhtstate(); | |
2150 | + break; | |
2151 | + case 3: // hintp | |
2152 | + gen_op_movl_env_T0(offsetof(CPUSPARCState, hintp)); | |
2153 | + break; | |
2154 | + case 5: // htba | |
2155 | + gen_op_movl_env_T0(offsetof(CPUSPARCState, htba)); | |
2156 | + break; | |
2157 | + case 31: // hstick_cmpr | |
2158 | + gen_op_movl_env_T0(offsetof(CPUSPARCState, hstick_cmpr)); | |
2159 | + break; | |
2160 | + case 6: // hver readonly | |
2161 | + default: | |
2162 | + goto illegal_insn; | |
2163 | + } | |
2164 | +#endif | |
2086 | 2165 | } |
2087 | 2166 | break; |
2088 | 2167 | #endif |
2089 | -#endif | |
2090 | 2168 | #ifdef TARGET_SPARC64 |
2091 | 2169 | case 0x2c: /* V9 movcc */ |
2092 | 2170 | { |
... | ... | @@ -2164,77 +2242,393 @@ static void disas_sparc_insn(DisasContext * dc) |
2164 | 2242 | int opf = GET_FIELD_SP(insn, 5, 13); |
2165 | 2243 | rs1 = GET_FIELD(insn, 13, 17); |
2166 | 2244 | rs2 = GET_FIELD(insn, 27, 31); |
2245 | + if (gen_trap_ifnofpu(dc)) | |
2246 | + goto jmp_insn; | |
2167 | 2247 | |
2168 | 2248 | switch (opf) { |
2249 | + case 0x000: /* VIS I edge8cc */ | |
2250 | + case 0x001: /* VIS II edge8n */ | |
2251 | + case 0x002: /* VIS I edge8lcc */ | |
2252 | + case 0x003: /* VIS II edge8ln */ | |
2253 | + case 0x004: /* VIS I edge16cc */ | |
2254 | + case 0x005: /* VIS II edge16n */ | |
2255 | + case 0x006: /* VIS I edge16lcc */ | |
2256 | + case 0x007: /* VIS II edge16ln */ | |
2257 | + case 0x008: /* VIS I edge32cc */ | |
2258 | + case 0x009: /* VIS II edge32n */ | |
2259 | + case 0x00a: /* VIS I edge32lcc */ | |
2260 | + case 0x00b: /* VIS II edge32ln */ | |
2261 | + // XXX | |
2262 | + goto illegal_insn; | |
2263 | + case 0x010: /* VIS I array8 */ | |
2264 | + gen_movl_reg_T0(rs1); | |
2265 | + gen_movl_reg_T1(rs2); | |
2266 | + gen_op_array8(); | |
2267 | + gen_movl_T0_reg(rd); | |
2268 | + break; | |
2269 | + case 0x012: /* VIS I array16 */ | |
2270 | + gen_movl_reg_T0(rs1); | |
2271 | + gen_movl_reg_T1(rs2); | |
2272 | + gen_op_array16(); | |
2273 | + gen_movl_T0_reg(rd); | |
2274 | + break; | |
2275 | + case 0x014: /* VIS I array32 */ | |
2276 | + gen_movl_reg_T0(rs1); | |
2277 | + gen_movl_reg_T1(rs2); | |
2278 | + gen_op_array32(); | |
2279 | + gen_movl_T0_reg(rd); | |
2280 | + break; | |
2169 | 2281 | case 0x018: /* VIS I alignaddr */ |
2170 | - if (gen_trap_ifnofpu(dc)) | |
2171 | - goto jmp_insn; | |
2172 | 2282 | gen_movl_reg_T0(rs1); |
2173 | 2283 | gen_movl_reg_T1(rs2); |
2174 | 2284 | gen_op_alignaddr(); |
2175 | 2285 | gen_movl_T0_reg(rd); |
2176 | 2286 | break; |
2287 | + case 0x019: /* VIS II bmask */ | |
2177 | 2288 | case 0x01a: /* VIS I alignaddrl */ |
2178 | - if (gen_trap_ifnofpu(dc)) | |
2179 | - goto jmp_insn; | |
2180 | 2289 | // XXX |
2290 | + goto illegal_insn; | |
2291 | + case 0x020: /* VIS I fcmple16 */ | |
2292 | + gen_op_load_fpr_DT0(rs1); | |
2293 | + gen_op_load_fpr_DT1(rs2); | |
2294 | + gen_op_fcmple16(); | |
2295 | + gen_op_store_DT0_fpr(rd); | |
2296 | + break; | |
2297 | + case 0x022: /* VIS I fcmpne16 */ | |
2298 | + gen_op_load_fpr_DT0(rs1); | |
2299 | + gen_op_load_fpr_DT1(rs2); | |
2300 | + gen_op_fcmpne16(); | |
2301 | + gen_op_store_DT0_fpr(rd); | |
2181 | 2302 | break; |
2303 | + case 0x024: /* VIS I fcmple32 */ | |
2304 | + gen_op_load_fpr_DT0(rs1); | |
2305 | + gen_op_load_fpr_DT1(rs2); | |
2306 | + gen_op_fcmple32(); | |
2307 | + gen_op_store_DT0_fpr(rd); | |
2308 | + break; | |
2309 | + case 0x026: /* VIS I fcmpne32 */ | |
2310 | + gen_op_load_fpr_DT0(rs1); | |
2311 | + gen_op_load_fpr_DT1(rs2); | |
2312 | + gen_op_fcmpne32(); | |
2313 | + gen_op_store_DT0_fpr(rd); | |
2314 | + break; | |
2315 | + case 0x028: /* VIS I fcmpgt16 */ | |
2316 | + gen_op_load_fpr_DT0(rs1); | |
2317 | + gen_op_load_fpr_DT1(rs2); | |
2318 | + gen_op_fcmpgt16(); | |
2319 | + gen_op_store_DT0_fpr(rd); | |
2320 | + break; | |
2321 | + case 0x02a: /* VIS I fcmpeq16 */ | |
2322 | + gen_op_load_fpr_DT0(rs1); | |
2323 | + gen_op_load_fpr_DT1(rs2); | |
2324 | + gen_op_fcmpeq16(); | |
2325 | + gen_op_store_DT0_fpr(rd); | |
2326 | + break; | |
2327 | + case 0x02c: /* VIS I fcmpgt32 */ | |
2328 | + gen_op_load_fpr_DT0(rs1); | |
2329 | + gen_op_load_fpr_DT1(rs2); | |
2330 | + gen_op_fcmpgt32(); | |
2331 | + gen_op_store_DT0_fpr(rd); | |
2332 | + break; | |
2333 | + case 0x02e: /* VIS I fcmpeq32 */ | |
2334 | + gen_op_load_fpr_DT0(rs1); | |
2335 | + gen_op_load_fpr_DT1(rs2); | |
2336 | + gen_op_fcmpeq32(); | |
2337 | + gen_op_store_DT0_fpr(rd); | |
2338 | + break; | |
2339 | + case 0x031: /* VIS I fmul8x16 */ | |
2340 | + gen_op_load_fpr_DT0(rs1); | |
2341 | + gen_op_load_fpr_DT1(rs2); | |
2342 | + gen_op_fmul8x16(); | |
2343 | + gen_op_store_DT0_fpr(rd); | |
2344 | + break; | |
2345 | + case 0x033: /* VIS I fmul8x16au */ | |
2346 | + gen_op_load_fpr_DT0(rs1); | |
2347 | + gen_op_load_fpr_DT1(rs2); | |
2348 | + gen_op_fmul8x16au(); | |
2349 | + gen_op_store_DT0_fpr(rd); | |
2350 | + break; | |
2351 | + case 0x035: /* VIS I fmul8x16al */ | |
2352 | + gen_op_load_fpr_DT0(rs1); | |
2353 | + gen_op_load_fpr_DT1(rs2); | |
2354 | + gen_op_fmul8x16al(); | |
2355 | + gen_op_store_DT0_fpr(rd); | |
2356 | + break; | |
2357 | + case 0x036: /* VIS I fmul8sux16 */ | |
2358 | + gen_op_load_fpr_DT0(rs1); | |
2359 | + gen_op_load_fpr_DT1(rs2); | |
2360 | + gen_op_fmul8sux16(); | |
2361 | + gen_op_store_DT0_fpr(rd); | |
2362 | + break; | |
2363 | + case 0x037: /* VIS I fmul8ulx16 */ | |
2364 | + gen_op_load_fpr_DT0(rs1); | |
2365 | + gen_op_load_fpr_DT1(rs2); | |
2366 | + gen_op_fmul8ulx16(); | |
2367 | + gen_op_store_DT0_fpr(rd); | |
2368 | + break; | |
2369 | + case 0x038: /* VIS I fmuld8sux16 */ | |
2370 | + gen_op_load_fpr_DT0(rs1); | |
2371 | + gen_op_load_fpr_DT1(rs2); | |
2372 | + gen_op_fmuld8sux16(); | |
2373 | + gen_op_store_DT0_fpr(rd); | |
2374 | + break; | |
2375 | + case 0x039: /* VIS I fmuld8ulx16 */ | |
2376 | + gen_op_load_fpr_DT0(rs1); | |
2377 | + gen_op_load_fpr_DT1(rs2); | |
2378 | + gen_op_fmuld8ulx16(); | |
2379 | + gen_op_store_DT0_fpr(rd); | |
2380 | + break; | |
2381 | + case 0x03a: /* VIS I fpack32 */ | |
2382 | + case 0x03b: /* VIS I fpack16 */ | |
2383 | + case 0x03d: /* VIS I fpackfix */ | |
2384 | + case 0x03e: /* VIS I pdist */ | |
2385 | + // XXX | |
2386 | + goto illegal_insn; | |
2182 | 2387 | case 0x048: /* VIS I faligndata */ |
2183 | - if (gen_trap_ifnofpu(dc)) | |
2184 | - goto jmp_insn; | |
2185 | 2388 | gen_op_load_fpr_DT0(rs1); |
2186 | 2389 | gen_op_load_fpr_DT1(rs2); |
2187 | 2390 | gen_op_faligndata(); |
2188 | 2391 | gen_op_store_DT0_fpr(rd); |
2189 | 2392 | break; |
2393 | + case 0x04b: /* VIS I fpmerge */ | |
2394 | + gen_op_load_fpr_DT0(rs1); | |
2395 | + gen_op_load_fpr_DT1(rs2); | |
2396 | + gen_op_fpmerge(); | |
2397 | + gen_op_store_DT0_fpr(rd); | |
2398 | + break; | |
2399 | + case 0x04c: /* VIS II bshuffle */ | |
2400 | + // XXX | |
2401 | + goto illegal_insn; | |
2402 | + case 0x04d: /* VIS I fexpand */ | |
2403 | + gen_op_load_fpr_DT0(rs1); | |
2404 | + gen_op_load_fpr_DT1(rs2); | |
2405 | + gen_op_fexpand(); | |
2406 | + gen_op_store_DT0_fpr(rd); | |
2407 | + break; | |
2408 | + case 0x050: /* VIS I fpadd16 */ | |
2409 | + gen_op_load_fpr_DT0(rs1); | |
2410 | + gen_op_load_fpr_DT1(rs2); | |
2411 | + gen_op_fpadd16(); | |
2412 | + gen_op_store_DT0_fpr(rd); | |
2413 | + break; | |
2414 | + case 0x051: /* VIS I fpadd16s */ | |
2415 | + gen_op_load_fpr_FT0(rs1); | |
2416 | + gen_op_load_fpr_FT1(rs2); | |
2417 | + gen_op_fpadd16s(); | |
2418 | + gen_op_store_FT0_fpr(rd); | |
2419 | + break; | |
2420 | + case 0x052: /* VIS I fpadd32 */ | |
2421 | + gen_op_load_fpr_DT0(rs1); | |
2422 | + gen_op_load_fpr_DT1(rs2); | |
2423 | + gen_op_fpadd32(); | |
2424 | + gen_op_store_DT0_fpr(rd); | |
2425 | + break; | |
2426 | + case 0x053: /* VIS I fpadd32s */ | |
2427 | + gen_op_load_fpr_FT0(rs1); | |
2428 | + gen_op_load_fpr_FT1(rs2); | |
2429 | + gen_op_fpadd32s(); | |
2430 | + gen_op_store_FT0_fpr(rd); | |
2431 | + break; | |
2432 | + case 0x054: /* VIS I fpsub16 */ | |
2433 | + gen_op_load_fpr_DT0(rs1); | |
2434 | + gen_op_load_fpr_DT1(rs2); | |
2435 | + gen_op_fpsub16(); | |
2436 | + gen_op_store_DT0_fpr(rd); | |
2437 | + break; | |
2438 | + case 0x055: /* VIS I fpsub16s */ | |
2439 | + gen_op_load_fpr_FT0(rs1); | |
2440 | + gen_op_load_fpr_FT1(rs2); | |
2441 | + gen_op_fpsub16s(); | |
2442 | + gen_op_store_FT0_fpr(rd); | |
2443 | + break; | |
2444 | + case 0x056: /* VIS I fpsub32 */ | |
2445 | + gen_op_load_fpr_DT0(rs1); | |
2446 | + gen_op_load_fpr_DT1(rs2); | |
2447 | + gen_op_fpadd32(); | |
2448 | + gen_op_store_DT0_fpr(rd); | |
2449 | + break; | |
2450 | + case 0x057: /* VIS I fpsub32s */ | |
2451 | + gen_op_load_fpr_FT0(rs1); | |
2452 | + gen_op_load_fpr_FT1(rs2); | |
2453 | + gen_op_fpsub32s(); | |
2454 | + gen_op_store_FT0_fpr(rd); | |
2455 | + break; | |
2190 | 2456 | case 0x060: /* VIS I fzero */ |
2191 | - if (gen_trap_ifnofpu(dc)) | |
2192 | - goto jmp_insn; | |
2193 | 2457 | gen_op_movl_DT0_0(); |
2194 | 2458 | gen_op_store_DT0_fpr(rd); |
2195 | 2459 | break; |
2196 | 2460 | case 0x061: /* VIS I fzeros */ |
2197 | - if (gen_trap_ifnofpu(dc)) | |
2198 | - goto jmp_insn; | |
2199 | 2461 | gen_op_movl_FT0_0(); |
2200 | 2462 | gen_op_store_FT0_fpr(rd); |
2201 | 2463 | break; |
2464 | + case 0x062: /* VIS I fnor */ | |
2465 | + gen_op_load_fpr_DT0(rs1); | |
2466 | + gen_op_load_fpr_DT1(rs2); | |
2467 | + gen_op_fnor(); | |
2468 | + gen_op_store_DT0_fpr(rd); | |
2469 | + break; | |
2470 | + case 0x063: /* VIS I fnors */ | |
2471 | + gen_op_load_fpr_FT0(rs1); | |
2472 | + gen_op_load_fpr_FT1(rs2); | |
2473 | + gen_op_fnors(); | |
2474 | + gen_op_store_FT0_fpr(rd); | |
2475 | + break; | |
2476 | + case 0x064: /* VIS I fandnot2 */ | |
2477 | + gen_op_load_fpr_DT1(rs1); | |
2478 | + gen_op_load_fpr_DT0(rs2); | |
2479 | + gen_op_fandnot(); | |
2480 | + gen_op_store_DT0_fpr(rd); | |
2481 | + break; | |
2482 | + case 0x065: /* VIS I fandnot2s */ | |
2483 | + gen_op_load_fpr_FT1(rs1); | |
2484 | + gen_op_load_fpr_FT0(rs2); | |
2485 | + gen_op_fandnots(); | |
2486 | + gen_op_store_FT0_fpr(rd); | |
2487 | + break; | |
2488 | + case 0x066: /* VIS I fnot2 */ | |
2489 | + gen_op_load_fpr_DT1(rs2); | |
2490 | + gen_op_fnot(); | |
2491 | + gen_op_store_DT0_fpr(rd); | |
2492 | + break; | |
2493 | + case 0x067: /* VIS I fnot2s */ | |
2494 | + gen_op_load_fpr_FT1(rs2); | |
2495 | + gen_op_fnot(); | |
2496 | + gen_op_store_FT0_fpr(rd); | |
2497 | + break; | |
2498 | + case 0x068: /* VIS I fandnot1 */ | |
2499 | + gen_op_load_fpr_DT0(rs1); | |
2500 | + gen_op_load_fpr_DT1(rs2); | |
2501 | + gen_op_fandnot(); | |
2502 | + gen_op_store_DT0_fpr(rd); | |
2503 | + break; | |
2504 | + case 0x069: /* VIS I fandnot1s */ | |
2505 | + gen_op_load_fpr_FT0(rs1); | |
2506 | + gen_op_load_fpr_FT1(rs2); | |
2507 | + gen_op_fandnots(); | |
2508 | + gen_op_store_FT0_fpr(rd); | |
2509 | + break; | |
2510 | + case 0x06a: /* VIS I fnot1 */ | |
2511 | + gen_op_load_fpr_DT1(rs1); | |
2512 | + gen_op_fnot(); | |
2513 | + gen_op_store_DT0_fpr(rd); | |
2514 | + break; | |
2515 | + case 0x06b: /* VIS I fnot1s */ | |
2516 | + gen_op_load_fpr_FT1(rs1); | |
2517 | + gen_op_fnot(); | |
2518 | + gen_op_store_FT0_fpr(rd); | |
2519 | + break; | |
2520 | + case 0x06c: /* VIS I fxor */ | |
2521 | + gen_op_load_fpr_DT0(rs1); | |
2522 | + gen_op_load_fpr_DT1(rs2); | |
2523 | + gen_op_fxor(); | |
2524 | + gen_op_store_DT0_fpr(rd); | |
2525 | + break; | |
2526 | + case 0x06d: /* VIS I fxors */ | |
2527 | + gen_op_load_fpr_FT0(rs1); | |
2528 | + gen_op_load_fpr_FT1(rs2); | |
2529 | + gen_op_fxors(); | |
2530 | + gen_op_store_FT0_fpr(rd); | |
2531 | + break; | |
2532 | + case 0x06e: /* VIS I fnand */ | |
2533 | + gen_op_load_fpr_DT0(rs1); | |
2534 | + gen_op_load_fpr_DT1(rs2); | |
2535 | + gen_op_fnand(); | |
2536 | + gen_op_store_DT0_fpr(rd); | |
2537 | + break; | |
2538 | + case 0x06f: /* VIS I fnands */ | |
2539 | + gen_op_load_fpr_FT0(rs1); | |
2540 | + gen_op_load_fpr_FT1(rs2); | |
2541 | + gen_op_fnands(); | |
2542 | + gen_op_store_FT0_fpr(rd); | |
2543 | + break; | |
2544 | + case 0x070: /* VIS I fand */ | |
2545 | + gen_op_load_fpr_DT0(rs1); | |
2546 | + gen_op_load_fpr_DT1(rs2); | |
2547 | + gen_op_fand(); | |
2548 | + gen_op_store_DT0_fpr(rd); | |
2549 | + break; | |
2550 | + case 0x071: /* VIS I fands */ | |
2551 | + gen_op_load_fpr_FT0(rs1); | |
2552 | + gen_op_load_fpr_FT1(rs2); | |
2553 | + gen_op_fands(); | |
2554 | + gen_op_store_FT0_fpr(rd); | |
2555 | + break; | |
2556 | + case 0x072: /* VIS I fxnor */ | |
2557 | + gen_op_load_fpr_DT0(rs1); | |
2558 | + gen_op_load_fpr_DT1(rs2); | |
2559 | + gen_op_fxnor(); | |
2560 | + gen_op_store_DT0_fpr(rd); | |
2561 | + break; | |
2562 | + case 0x073: /* VIS I fxnors */ | |
2563 | + gen_op_load_fpr_FT0(rs1); | |
2564 | + gen_op_load_fpr_FT1(rs2); | |
2565 | + gen_op_fxnors(); | |
2566 | + gen_op_store_FT0_fpr(rd); | |
2567 | + break; | |
2202 | 2568 | case 0x074: /* VIS I fsrc1 */ |
2203 | - if (gen_trap_ifnofpu(dc)) | |
2204 | - goto jmp_insn; | |
2205 | 2569 | gen_op_load_fpr_DT0(rs1); |
2206 | 2570 | gen_op_store_DT0_fpr(rd); |
2207 | 2571 | break; |
2208 | 2572 | case 0x075: /* VIS I fsrc1s */ |
2209 | - if (gen_trap_ifnofpu(dc)) | |
2210 | - goto jmp_insn; | |
2211 | 2573 | gen_op_load_fpr_FT0(rs1); |
2212 | 2574 | gen_op_store_FT0_fpr(rd); |
2213 | 2575 | break; |
2576 | + case 0x076: /* VIS I fornot2 */ | |
2577 | + gen_op_load_fpr_DT1(rs1); | |
2578 | + gen_op_load_fpr_DT0(rs2); | |
2579 | + gen_op_fornot(); | |
2580 | + gen_op_store_DT0_fpr(rd); | |
2581 | + break; | |
2582 | + case 0x077: /* VIS I fornot2s */ | |
2583 | + gen_op_load_fpr_FT1(rs1); | |
2584 | + gen_op_load_fpr_FT0(rs2); | |
2585 | + gen_op_fornots(); | |
2586 | + gen_op_store_FT0_fpr(rd); | |
2587 | + break; | |
2214 | 2588 | case 0x078: /* VIS I fsrc2 */ |
2215 | - if (gen_trap_ifnofpu(dc)) | |
2216 | - goto jmp_insn; | |
2217 | 2589 | gen_op_load_fpr_DT0(rs2); |
2218 | 2590 | gen_op_store_DT0_fpr(rd); |
2219 | 2591 | break; |
2220 | 2592 | case 0x079: /* VIS I fsrc2s */ |
2221 | - if (gen_trap_ifnofpu(dc)) | |
2222 | - goto jmp_insn; | |
2223 | 2593 | gen_op_load_fpr_FT0(rs2); |
2224 | 2594 | gen_op_store_FT0_fpr(rd); |
2225 | 2595 | break; |
2596 | + case 0x07a: /* VIS I fornot1 */ | |
2597 | + gen_op_load_fpr_DT0(rs1); | |
2598 | + gen_op_load_fpr_DT1(rs2); | |
2599 | + gen_op_fornot(); | |
2600 | + gen_op_store_DT0_fpr(rd); | |
2601 | + break; | |
2602 | + case 0x07b: /* VIS I fornot1s */ | |
2603 | + gen_op_load_fpr_FT0(rs1); | |
2604 | + gen_op_load_fpr_FT1(rs2); | |
2605 | + gen_op_fornots(); | |
2606 | + gen_op_store_FT0_fpr(rd); | |
2607 | + break; | |
2608 | + case 0x07c: /* VIS I for */ | |
2609 | + gen_op_load_fpr_DT0(rs1); | |
2610 | + gen_op_load_fpr_DT1(rs2); | |
2611 | + gen_op_for(); | |
2612 | + gen_op_store_DT0_fpr(rd); | |
2613 | + break; | |
2614 | + case 0x07d: /* VIS I fors */ | |
2615 | + gen_op_load_fpr_FT0(rs1); | |
2616 | + gen_op_load_fpr_FT1(rs2); | |
2617 | + gen_op_fors(); | |
2618 | + gen_op_store_FT0_fpr(rd); | |
2619 | + break; | |
2226 | 2620 | case 0x07e: /* VIS I fone */ |
2227 | - if (gen_trap_ifnofpu(dc)) | |
2228 | - goto jmp_insn; | |
2229 | 2621 | gen_op_movl_DT0_1(); |
2230 | 2622 | gen_op_store_DT0_fpr(rd); |
2231 | 2623 | break; |
2232 | 2624 | case 0x07f: /* VIS I fones */ |
2233 | - if (gen_trap_ifnofpu(dc)) | |
2234 | - goto jmp_insn; | |
2235 | 2625 | gen_op_movl_FT0_1(); |
2236 | 2626 | gen_op_store_FT0_fpr(rd); |
2237 | 2627 | break; |
2628 | + case 0x080: /* VIS I shutdown */ | |
2629 | + case 0x081: /* VIS II siam */ | |
2630 | + // XXX | |
2631 | + goto illegal_insn; | |
2238 | 2632 | default: |
2239 | 2633 | goto illegal_insn; |
2240 | 2634 | } | ... | ... |