Commit e9ebed4d41fc0630e433a32ecfd1057cae8b10bf

Authored by blueswir1
1 parent 3d834c78

Sparc64 update: more VIS ops


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2714 c046a42c-6fe2-441c-8c8c-71466251a162
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 }
... ...