Commit 57fa1fb31c23f1bf78664159d5813206bf2e4d0e

Authored by ths
1 parent f469b9db

More MIPS 64-bit FPU support.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2834 c046a42c-6fe2-441c-8c8c-71466251a162
target-mips/exec.h
@@ -166,6 +166,36 @@ void cpu_mips_clock_init (CPUState *env); @@ -166,6 +166,36 @@ void cpu_mips_clock_init (CPUState *env);
166 void cpu_mips_tlb_flush (CPUState *env, int flush_global); 166 void cpu_mips_tlb_flush (CPUState *env, int flush_global);
167 167
168 void do_ctc1 (void); 168 void do_ctc1 (void);
  169 +
  170 +#define FOP_PROTO(op) \
  171 +void do_float_ ## op ## _s(void); \
  172 +void do_float_ ## op ## _d(void);
  173 +FOP_PROTO(roundl)
  174 +FOP_PROTO(roundw)
  175 +FOP_PROTO(truncl)
  176 +FOP_PROTO(truncw)
  177 +FOP_PROTO(ceill)
  178 +FOP_PROTO(ceilw)
  179 +FOP_PROTO(floorl)
  180 +FOP_PROTO(floorw)
  181 +FOP_PROTO(rsqrt)
  182 +FOP_PROTO(recip)
  183 +#undef FOP_PROTO
  184 +
  185 +#define FOP_PROTO(op) \
  186 +void do_float_ ## op ## _s(void); \
  187 +void do_float_ ## op ## _d(void); \
  188 +void do_float_ ## op ## _ps(void);
  189 +FOP_PROTO(add)
  190 +FOP_PROTO(sub)
  191 +FOP_PROTO(mul)
  192 +FOP_PROTO(div)
  193 +FOP_PROTO(recip1)
  194 +FOP_PROTO(recip2)
  195 +FOP_PROTO(rsqrt1)
  196 +FOP_PROTO(rsqrt2)
  197 +#undef FOP_PROTO
  198 +
169 void do_float_cvtd_s(void); 199 void do_float_cvtd_s(void);
170 void do_float_cvtd_w(void); 200 void do_float_cvtd_w(void);
171 void do_float_cvtd_l(void); 201 void do_float_cvtd_l(void);
@@ -180,37 +210,11 @@ void do_float_cvts_pl(void); @@ -180,37 +210,11 @@ void do_float_cvts_pl(void);
180 void do_float_cvts_pu(void); 210 void do_float_cvts_pu(void);
181 void do_float_cvtw_s(void); 211 void do_float_cvtw_s(void);
182 void do_float_cvtw_d(void); 212 void do_float_cvtw_d(void);
183 -void do_float_roundl_d(void);  
184 -void do_float_roundl_s(void);  
185 -void do_float_roundw_d(void);  
186 -void do_float_roundw_s(void);  
187 -void do_float_truncl_d(void);  
188 -void do_float_truncl_s(void);  
189 -void do_float_truncw_d(void);  
190 -void do_float_truncw_s(void);  
191 -void do_float_ceill_d(void);  
192 -void do_float_ceill_s(void);  
193 -void do_float_ceilw_d(void);  
194 -void do_float_ceilw_s(void);  
195 -void do_float_floorl_d(void);  
196 -void do_float_floorl_s(void);  
197 -void do_float_floorw_d(void);  
198 -void do_float_floorw_s(void);  
199 -void do_float_add_d(void);  
200 -void do_float_add_s(void);  
201 -void do_float_add_ps(void);  
202 -void do_float_sub_d(void);  
203 -void do_float_sub_s(void);  
204 -void do_float_sub_ps(void);  
205 -void do_float_mul_d(void);  
206 -void do_float_mul_s(void);  
207 -void do_float_mul_ps(void);  
208 -void do_float_div_d(void);  
209 -void do_float_div_s(void);  
210 -void do_float_div_ps(void); 213 +
211 void do_float_addr_ps(void); 214 void do_float_addr_ps(void);
  215 +void do_float_mulr_ps(void);
212 216
213 -#define CMP_OPS(op) \ 217 +#define FOP_PROTO(op) \
214 void do_cmp_d_ ## op(long cc); \ 218 void do_cmp_d_ ## op(long cc); \
215 void do_cmpabs_d_ ## op(long cc); \ 219 void do_cmpabs_d_ ## op(long cc); \
216 void do_cmp_s_ ## op(long cc); \ 220 void do_cmp_s_ ## op(long cc); \
@@ -218,22 +222,22 @@ void do_cmpabs_s_ ## op(long cc); \ @@ -218,22 +222,22 @@ void do_cmpabs_s_ ## op(long cc); \
218 void do_cmp_ps_ ## op(long cc); \ 222 void do_cmp_ps_ ## op(long cc); \
219 void do_cmpabs_ps_ ## op(long cc); 223 void do_cmpabs_ps_ ## op(long cc);
220 224
221 -CMP_OPS(f)  
222 -CMP_OPS(un)  
223 -CMP_OPS(eq)  
224 -CMP_OPS(ueq)  
225 -CMP_OPS(olt)  
226 -CMP_OPS(ult)  
227 -CMP_OPS(ole)  
228 -CMP_OPS(ule)  
229 -CMP_OPS(sf)  
230 -CMP_OPS(ngle)  
231 -CMP_OPS(seq)  
232 -CMP_OPS(ngl)  
233 -CMP_OPS(lt)  
234 -CMP_OPS(nge)  
235 -CMP_OPS(le)  
236 -CMP_OPS(ngt)  
237 -#undef CMP_OPS 225 +FOP_PROTO(f)
  226 +FOP_PROTO(un)
  227 +FOP_PROTO(eq)
  228 +FOP_PROTO(ueq)
  229 +FOP_PROTO(olt)
  230 +FOP_PROTO(ult)
  231 +FOP_PROTO(ole)
  232 +FOP_PROTO(ule)
  233 +FOP_PROTO(sf)
  234 +FOP_PROTO(ngle)
  235 +FOP_PROTO(seq)
  236 +FOP_PROTO(ngl)
  237 +FOP_PROTO(lt)
  238 +FOP_PROTO(nge)
  239 +FOP_PROTO(le)
  240 +FOP_PROTO(ngt)
  241 +#undef FOP_PROTO
238 242
239 #endif /* !defined(__QEMU_MIPS_EXEC_H__) */ 243 #endif /* !defined(__QEMU_MIPS_EXEC_H__) */
target-mips/op.c
@@ -1609,6 +1609,14 @@ void op_cp1_enabled(void) @@ -1609,6 +1609,14 @@ void op_cp1_enabled(void)
1609 RETURN(); 1609 RETURN();
1610 } 1610 }
1611 1611
  1612 +void op_cp1_64bitmode(void)
  1613 +{
  1614 + if (!(env->CP0_Status & (1 << CP0St_FR))) {
  1615 + CALL_FROM_TB1(do_raise_exception, EXCP_RI);
  1616 + }
  1617 + RETURN();
  1618 +}
  1619 +
1612 /* 1620 /*
1613 * Verify if floating point register is valid; an operation is not defined 1621 * Verify if floating point register is valid; an operation is not defined
1614 * if bit 0 of any register specification is set and the FR bit in the 1622 * if bit 0 of any register specification is set and the FR bit in the
@@ -1946,8 +1954,8 @@ FLOAT_OP(movn, ps) @@ -1946,8 +1954,8 @@ FLOAT_OP(movn, ps)
1946 RETURN(); 1954 RETURN();
1947 } 1955 }
1948 1956
1949 -/* binary operations */  
1950 -#define FLOAT_BINOP(name) \ 1957 +/* operations calling helpers, for s, d and ps */
  1958 +#define FLOAT_HOP(name) \
1951 FLOAT_OP(name, d) \ 1959 FLOAT_OP(name, d) \
1952 { \ 1960 { \
1953 CALL_FROM_TB0(do_float_ ## name ## _d); \ 1961 CALL_FROM_TB0(do_float_ ## name ## _d); \
@@ -1966,18 +1974,45 @@ FLOAT_OP(name, ps) \ @@ -1966,18 +1974,45 @@ FLOAT_OP(name, ps) \
1966 DEBUG_FPU_STATE(); \ 1974 DEBUG_FPU_STATE(); \
1967 RETURN(); \ 1975 RETURN(); \
1968 } 1976 }
1969 -FLOAT_BINOP(add)  
1970 -FLOAT_BINOP(sub)  
1971 -FLOAT_BINOP(mul)  
1972 -FLOAT_BINOP(div)  
1973 -#undef FLOAT_BINOP 1977 +FLOAT_HOP(add)
  1978 +FLOAT_HOP(sub)
  1979 +FLOAT_HOP(mul)
  1980 +FLOAT_HOP(div)
  1981 +FLOAT_HOP(recip2)
  1982 +FLOAT_HOP(rsqrt2)
  1983 +FLOAT_HOP(rsqrt1)
  1984 +FLOAT_HOP(recip1)
  1985 +#undef FLOAT_HOP
  1986 +
  1987 +/* operations calling helpers, for s and d */
  1988 +#define FLOAT_HOP(name) \
  1989 +FLOAT_OP(name, d) \
  1990 +{ \
  1991 + CALL_FROM_TB0(do_float_ ## name ## _d); \
  1992 + DEBUG_FPU_STATE(); \
  1993 + RETURN(); \
  1994 +} \
  1995 +FLOAT_OP(name, s) \
  1996 +{ \
  1997 + CALL_FROM_TB0(do_float_ ## name ## _s); \
  1998 + DEBUG_FPU_STATE(); \
  1999 + RETURN(); \
  2000 +}
  2001 +FLOAT_HOP(rsqrt)
  2002 +FLOAT_HOP(recip)
  2003 +#undef FLOAT_HOP
1974 2004
1975 -FLOAT_OP(addr, ps)  
1976 -{  
1977 - CALL_FROM_TB0(do_float_addr_ps);  
1978 - DEBUG_FPU_STATE();  
1979 - RETURN(); 2005 +/* operations calling helpers, for ps */
  2006 +#define FLOAT_HOP(name) \
  2007 +FLOAT_OP(name, ps) \
  2008 +{ \
  2009 + CALL_FROM_TB0(do_float_ ## name ## _ps); \
  2010 + DEBUG_FPU_STATE(); \
  2011 + RETURN(); \
1980 } 2012 }
  2013 +FLOAT_HOP(addr)
  2014 +FLOAT_HOP(mulr)
  2015 +#undef FLOAT_HOP
1981 2016
1982 /* ternary operations */ 2017 /* ternary operations */
1983 #define FLOAT_TERNOP(name1, name2) \ 2018 #define FLOAT_TERNOP(name1, name2) \
@@ -2053,14 +2088,7 @@ FLOAT_OP(name, s) \ @@ -2053,14 +2088,7 @@ FLOAT_OP(name, s) \
2053 { \ 2088 { \
2054 FST2 = float32_ ## name(FST0, &env->fp_status); \ 2089 FST2 = float32_ ## name(FST0, &env->fp_status); \
2055 DEBUG_FPU_STATE(); \ 2090 DEBUG_FPU_STATE(); \
2056 - RETURN(); \  
2057 -} \  
2058 -FLOAT_OP(name, ps) \  
2059 -{ \  
2060 - FST2 = float32_ ## name(FST0, &env->fp_status); \  
2061 - FSTH2 = float32_ ## name(FSTH0, &env->fp_status); \  
2062 - DEBUG_FPU_STATE(); \  
2063 - RETURN(); \ 2091 + RETURN(); \
2064 } 2092 }
2065 FLOAT_UNOP(sqrt) 2093 FLOAT_UNOP(sqrt)
2066 #undef FLOAT_UNOP 2094 #undef FLOAT_UNOP
target-mips/op_helper.c
@@ -916,6 +916,59 @@ FLOAT_OP(floorw, s) @@ -916,6 +916,59 @@ FLOAT_OP(floorw, s)
916 WT2 = 0x7fffffff; 916 WT2 = 0x7fffffff;
917 } 917 }
918 918
  919 +/* unary operations, MIPS specific, s and d */
  920 +#define FLOAT_UNOP(name) \
  921 +FLOAT_OP(name, d) \
  922 +{ \
  923 + set_float_exception_flags(0, &env->fp_status); \
  924 +/* XXX: not implemented */ \
  925 +/* FDT2 = float64_ ## name (FDT0, &env->fp_status);*/ \
  926 +do_raise_exception(EXCP_RI); \
  927 + update_fcr31(); \
  928 +} \
  929 +FLOAT_OP(name, s) \
  930 +{ \
  931 + set_float_exception_flags(0, &env->fp_status); \
  932 +/* XXX: not implemented */ \
  933 +/* FST2 = float32_ ## name (FST0, &env->fp_status);*/ \
  934 +do_raise_exception(EXCP_RI); \
  935 + update_fcr31(); \
  936 +}
  937 +FLOAT_UNOP(rsqrt)
  938 +FLOAT_UNOP(recip)
  939 +#undef FLOAT_UNOP
  940 +
  941 +/* unary operations, MIPS specific, s, d and ps */
  942 +#define FLOAT_UNOP(name) \
  943 +FLOAT_OP(name, d) \
  944 +{ \
  945 + set_float_exception_flags(0, &env->fp_status); \
  946 +/* XXX: not implemented */ \
  947 +/* FDT2 = float64_ ## name (FDT0, &env->fp_status);*/ \
  948 +do_raise_exception(EXCP_RI); \
  949 + update_fcr31(); \
  950 +} \
  951 +FLOAT_OP(name, s) \
  952 +{ \
  953 + set_float_exception_flags(0, &env->fp_status); \
  954 +/* XXX: not implemented */ \
  955 +/* FST2 = float32_ ## name (FST0, &env->fp_status);*/ \
  956 +do_raise_exception(EXCP_RI); \
  957 + update_fcr31(); \
  958 +} \
  959 +FLOAT_OP(name, ps) \
  960 +{ \
  961 + set_float_exception_flags(0, &env->fp_status); \
  962 +/* XXX: not implemented */ \
  963 +/* FST2 = float32_ ## name (FST0, &env->fp_status);*/ \
  964 +/* FSTH2 = float32_ ## name (FSTH0, &env->fp_status);*/ \
  965 +do_raise_exception(EXCP_RI); \
  966 + update_fcr31(); \
  967 +}
  968 +FLOAT_UNOP(rsqrt1)
  969 +FLOAT_UNOP(recip1)
  970 +#undef FLOAT_UNOP
  971 +
919 /* binary operations */ 972 /* binary operations */
920 #define FLOAT_BINOP(name) \ 973 #define FLOAT_BINOP(name) \
921 FLOAT_OP(name, d) \ 974 FLOAT_OP(name, d) \
@@ -943,6 +996,37 @@ FLOAT_BINOP(mul) @@ -943,6 +996,37 @@ FLOAT_BINOP(mul)
943 FLOAT_BINOP(div) 996 FLOAT_BINOP(div)
944 #undef FLOAT_BINOP 997 #undef FLOAT_BINOP
945 998
  999 +/* binary operations, MIPS specific */
  1000 +#define FLOAT_BINOP(name) \
  1001 +FLOAT_OP(name, d) \
  1002 +{ \
  1003 + set_float_exception_flags(0, &env->fp_status); \
  1004 +/* XXX: not implemented */ \
  1005 +/* FDT2 = float64_ ## name (FDT0, FDT1, &env->fp_status);*/ \
  1006 +do_raise_exception(EXCP_RI); \
  1007 + update_fcr31(); \
  1008 +} \
  1009 +FLOAT_OP(name, s) \
  1010 +{ \
  1011 + set_float_exception_flags(0, &env->fp_status); \
  1012 +/* XXX: not implemented */ \
  1013 +/* FST2 = float32_ ## name (FST0, FST1, &env->fp_status);*/ \
  1014 +do_raise_exception(EXCP_RI); \
  1015 + update_fcr31(); \
  1016 +} \
  1017 +FLOAT_OP(name, ps) \
  1018 +{ \
  1019 + set_float_exception_flags(0, &env->fp_status); \
  1020 +/* XXX: not implemented */ \
  1021 +/* FST2 = float32_ ## name (FST0, FST1, &env->fp_status);*/ \
  1022 +/* FSTH2 = float32_ ## name (FSTH0, FSTH1, &env->fp_status);*/ \
  1023 +do_raise_exception(EXCP_RI); \
  1024 + update_fcr31(); \
  1025 +}
  1026 +FLOAT_BINOP(rsqrt2)
  1027 +FLOAT_BINOP(recip2)
  1028 +#undef FLOAT_BINOP
  1029 +
946 FLOAT_OP(addr, ps) 1030 FLOAT_OP(addr, ps)
947 { 1031 {
948 set_float_exception_flags(0, &env->fp_status); 1032 set_float_exception_flags(0, &env->fp_status);
@@ -951,6 +1035,14 @@ FLOAT_OP(addr, ps) @@ -951,6 +1035,14 @@ FLOAT_OP(addr, ps)
951 update_fcr31(); 1035 update_fcr31();
952 } 1036 }
953 1037
  1038 +FLOAT_OP(mulr, ps)
  1039 +{
  1040 + set_float_exception_flags(0, &env->fp_status);
  1041 + FST2 = float32_mul (FST0, FSTH0, &env->fp_status);
  1042 + FSTH2 = float32_mul (FST1, FSTH1, &env->fp_status);
  1043 + update_fcr31();
  1044 +}
  1045 +
954 #define FOP_COND_D(op, cond) \ 1046 #define FOP_COND_D(op, cond) \
955 void do_cmp_d_ ## op (long cc) \ 1047 void do_cmp_d_ ## op (long cc) \
956 { \ 1048 { \
target-mips/translate.c
@@ -4378,14 +4378,12 @@ static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs) @@ -4378,14 +4378,12 @@ static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
4378 opn = "dmtc1"; 4378 opn = "dmtc1";
4379 break; 4379 break;
4380 case OPC_MFHC1: 4380 case OPC_MFHC1:
4381 - gen_op_cp1_registers(fs);  
4382 GEN_LOAD_FREG_FTN(WTH0, fs); 4381 GEN_LOAD_FREG_FTN(WTH0, fs);
4383 gen_op_mfhc1(); 4382 gen_op_mfhc1();
4384 GEN_STORE_TN_REG(rt, T0); 4383 GEN_STORE_TN_REG(rt, T0);
4385 opn = "mfhc1"; 4384 opn = "mfhc1";
4386 break; 4385 break;
4387 case OPC_MTHC1: 4386 case OPC_MTHC1:
4388 - gen_op_cp1_registers(fs);  
4389 GEN_LOAD_REG_TN(T0, rt); 4387 GEN_LOAD_REG_TN(T0, rt);
4390 gen_op_mthc1(); 4388 gen_op_mthc1();
4391 GEN_STORE_FTN_FREG(fs, WTH0); 4389 GEN_STORE_FTN_FREG(fs, WTH0);
@@ -4405,9 +4403,9 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf) @@ -4405,9 +4403,9 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
4405 4403
4406 GEN_LOAD_REG_TN(T0, rd); 4404 GEN_LOAD_REG_TN(T0, rd);
4407 GEN_LOAD_REG_TN(T1, rs); 4405 GEN_LOAD_REG_TN(T1, rs);
4408 - if (cc) 4406 + if (cc) {
4409 ccbit = 1 << (24 + cc); 4407 ccbit = 1 << (24 + cc);
4410 - else 4408 + } else
4411 ccbit = 1 << 23; 4409 ccbit = 1 << 23;
4412 if (!tf) 4410 if (!tf)
4413 gen_op_movf(ccbit); 4411 gen_op_movf(ccbit);
@@ -4421,9 +4419,9 @@ static void glue(gen_movcf_, fmt) (DisasContext *ctx, int cc, int tf) \ @@ -4421,9 +4419,9 @@ static void glue(gen_movcf_, fmt) (DisasContext *ctx, int cc, int tf) \
4421 { \ 4419 { \
4422 uint32_t ccbit; \ 4420 uint32_t ccbit; \
4423 \ 4421 \
4424 - if (cc) \ 4422 + if (cc) { \
4425 ccbit = 1 << (24 + cc); \ 4423 ccbit = 1 << (24 + cc); \
4426 - else \ 4424 + } else \
4427 ccbit = 1 << 23; \ 4425 ccbit = 1 << 23; \
4428 if (!tf) \ 4426 if (!tf) \
4429 glue(gen_op_float_movf_, fmt)(ccbit); \ 4427 glue(gen_op_float_movf_, fmt)(ccbit); \
@@ -4536,28 +4534,28 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4536,28 +4534,28 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4536 opn = "neg.s"; 4534 opn = "neg.s";
4537 break; 4535 break;
4538 case FOP(8, 16): 4536 case FOP(8, 16):
4539 - gen_op_cp1_registers(fs); 4537 + gen_op_cp1_64bitmode();
4540 GEN_LOAD_FREG_FTN(WT0, fs); 4538 GEN_LOAD_FREG_FTN(WT0, fs);
4541 gen_op_float_roundl_s(); 4539 gen_op_float_roundl_s();
4542 GEN_STORE_FTN_FREG(fd, DT2); 4540 GEN_STORE_FTN_FREG(fd, DT2);
4543 opn = "round.l.s"; 4541 opn = "round.l.s";
4544 break; 4542 break;
4545 case FOP(9, 16): 4543 case FOP(9, 16):
4546 - gen_op_cp1_registers(fs); 4544 + gen_op_cp1_64bitmode();
4547 GEN_LOAD_FREG_FTN(WT0, fs); 4545 GEN_LOAD_FREG_FTN(WT0, fs);
4548 gen_op_float_truncl_s(); 4546 gen_op_float_truncl_s();
4549 GEN_STORE_FTN_FREG(fd, DT2); 4547 GEN_STORE_FTN_FREG(fd, DT2);
4550 opn = "trunc.l.s"; 4548 opn = "trunc.l.s";
4551 break; 4549 break;
4552 case FOP(10, 16): 4550 case FOP(10, 16):
4553 - gen_op_cp1_registers(fs); 4551 + gen_op_cp1_64bitmode();
4554 GEN_LOAD_FREG_FTN(WT0, fs); 4552 GEN_LOAD_FREG_FTN(WT0, fs);
4555 gen_op_float_ceill_s(); 4553 gen_op_float_ceill_s();
4556 GEN_STORE_FTN_FREG(fd, DT2); 4554 GEN_STORE_FTN_FREG(fd, DT2);
4557 opn = "ceil.l.s"; 4555 opn = "ceil.l.s";
4558 break; 4556 break;
4559 case FOP(11, 16): 4557 case FOP(11, 16):
4560 - gen_op_cp1_registers(fs); 4558 + gen_op_cp1_64bitmode();
4561 GEN_LOAD_FREG_FTN(WT0, fs); 4559 GEN_LOAD_FREG_FTN(WT0, fs);
4562 gen_op_float_floorl_s(); 4560 gen_op_float_floorl_s();
4563 GEN_STORE_FTN_FREG(fd, DT2); 4561 GEN_STORE_FTN_FREG(fd, DT2);
@@ -4611,6 +4609,48 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4611,6 +4609,48 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4611 GEN_STORE_FTN_FREG(fd, WT2); 4609 GEN_STORE_FTN_FREG(fd, WT2);
4612 opn = "movn.s"; 4610 opn = "movn.s";
4613 break; 4611 break;
  4612 + case FOP(21, 16):
  4613 + GEN_LOAD_FREG_FTN(WT0, fs);
  4614 + gen_op_float_recip_s();
  4615 + GEN_STORE_FTN_FREG(fd, WT2);
  4616 + opn = "recip.s";
  4617 + break;
  4618 + case FOP(22, 16):
  4619 + GEN_LOAD_FREG_FTN(WT0, fs);
  4620 + gen_op_float_rsqrt_s();
  4621 + GEN_STORE_FTN_FREG(fd, WT2);
  4622 + opn = "rsqrt.s";
  4623 + break;
  4624 + case FOP(28, 16):
  4625 + gen_op_cp1_64bitmode();
  4626 + GEN_LOAD_FREG_FTN(WT0, fs);
  4627 + GEN_LOAD_FREG_FTN(WT2, fd);
  4628 + gen_op_float_recip2_s();
  4629 + GEN_STORE_FTN_FREG(fd, WT2);
  4630 + opn = "recip2.s";
  4631 + break;
  4632 + case FOP(29, 16):
  4633 + gen_op_cp1_64bitmode();
  4634 + GEN_LOAD_FREG_FTN(WT0, fs);
  4635 + gen_op_float_recip1_s();
  4636 + GEN_STORE_FTN_FREG(fd, WT2);
  4637 + opn = "recip1.s";
  4638 + break;
  4639 + case FOP(30, 16):
  4640 + gen_op_cp1_64bitmode();
  4641 + GEN_LOAD_FREG_FTN(WT0, fs);
  4642 + gen_op_float_rsqrt1_s();
  4643 + GEN_STORE_FTN_FREG(fd, WT2);
  4644 + opn = "rsqrt1.s";
  4645 + break;
  4646 + case FOP(31, 16):
  4647 + gen_op_cp1_64bitmode();
  4648 + GEN_LOAD_FREG_FTN(WT0, fs);
  4649 + GEN_LOAD_FREG_FTN(WT2, fd);
  4650 + gen_op_float_rsqrt2_s();
  4651 + GEN_STORE_FTN_FREG(fd, WT2);
  4652 + opn = "rsqrt2.s";
  4653 + break;
4614 case FOP(33, 16): 4654 case FOP(33, 16):
4615 gen_op_cp1_registers(fd); 4655 gen_op_cp1_registers(fd);
4616 GEN_LOAD_FREG_FTN(WT0, fs); 4656 GEN_LOAD_FREG_FTN(WT0, fs);
@@ -4625,14 +4665,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4625,14 +4665,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4625 opn = "cvt.w.s"; 4665 opn = "cvt.w.s";
4626 break; 4666 break;
4627 case FOP(37, 16): 4667 case FOP(37, 16):
4628 - gen_op_cp1_registers(fs | fd); 4668 + gen_op_cp1_64bitmode();
4629 GEN_LOAD_FREG_FTN(WT0, fs); 4669 GEN_LOAD_FREG_FTN(WT0, fs);
4630 gen_op_float_cvtl_s(); 4670 gen_op_float_cvtl_s();
4631 GEN_STORE_FTN_FREG(fd, DT2); 4671 GEN_STORE_FTN_FREG(fd, DT2);
4632 opn = "cvt.l.s"; 4672 opn = "cvt.l.s";
4633 break; 4673 break;
4634 case FOP(38, 16): 4674 case FOP(38, 16):
4635 - gen_op_cp1_registers(fs | ft | fd); 4675 + gen_op_cp1_64bitmode();
4636 GEN_LOAD_FREG_FTN(WT1, fs); 4676 GEN_LOAD_FREG_FTN(WT1, fs);
4637 GEN_LOAD_FREG_FTN(WT0, ft); 4677 GEN_LOAD_FREG_FTN(WT0, ft);
4638 gen_op_float_cvtps_s(); 4678 gen_op_float_cvtps_s();
@@ -4658,6 +4698,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4658,6 +4698,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4658 GEN_LOAD_FREG_FTN(WT0, fs); 4698 GEN_LOAD_FREG_FTN(WT0, fs);
4659 GEN_LOAD_FREG_FTN(WT1, ft); 4699 GEN_LOAD_FREG_FTN(WT1, ft);
4660 if (ctx->opcode & (1 << 6)) { 4700 if (ctx->opcode & (1 << 6)) {
  4701 + gen_op_cp1_64bitmode();
4661 gen_cmpabs_s(func-48, cc); 4702 gen_cmpabs_s(func-48, cc);
4662 opn = condnames_abs[func-48]; 4703 opn = condnames_abs[func-48];
4663 } else { 4704 } else {
@@ -4730,28 +4771,28 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4730,28 +4771,28 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4730 opn = "neg.d"; 4771 opn = "neg.d";
4731 break; 4772 break;
4732 case FOP(8, 17): 4773 case FOP(8, 17):
4733 - gen_op_cp1_registers(fs); 4774 + gen_op_cp1_64bitmode();
4734 GEN_LOAD_FREG_FTN(DT0, fs); 4775 GEN_LOAD_FREG_FTN(DT0, fs);
4735 gen_op_float_roundl_d(); 4776 gen_op_float_roundl_d();
4736 GEN_STORE_FTN_FREG(fd, DT2); 4777 GEN_STORE_FTN_FREG(fd, DT2);
4737 opn = "round.l.d"; 4778 opn = "round.l.d";
4738 break; 4779 break;
4739 case FOP(9, 17): 4780 case FOP(9, 17):
4740 - gen_op_cp1_registers(fs); 4781 + gen_op_cp1_64bitmode();
4741 GEN_LOAD_FREG_FTN(DT0, fs); 4782 GEN_LOAD_FREG_FTN(DT0, fs);
4742 gen_op_float_truncl_d(); 4783 gen_op_float_truncl_d();
4743 GEN_STORE_FTN_FREG(fd, DT2); 4784 GEN_STORE_FTN_FREG(fd, DT2);
4744 opn = "trunc.l.d"; 4785 opn = "trunc.l.d";
4745 break; 4786 break;
4746 case FOP(10, 17): 4787 case FOP(10, 17):
4747 - gen_op_cp1_registers(fs); 4788 + gen_op_cp1_64bitmode();
4748 GEN_LOAD_FREG_FTN(DT0, fs); 4789 GEN_LOAD_FREG_FTN(DT0, fs);
4749 gen_op_float_ceill_d(); 4790 gen_op_float_ceill_d();
4750 GEN_STORE_FTN_FREG(fd, DT2); 4791 GEN_STORE_FTN_FREG(fd, DT2);
4751 opn = "ceil.l.d"; 4792 opn = "ceil.l.d";
4752 break; 4793 break;
4753 case FOP(11, 17): 4794 case FOP(11, 17):
4754 - gen_op_cp1_registers(fs); 4795 + gen_op_cp1_64bitmode();
4755 GEN_LOAD_FREG_FTN(DT0, fs); 4796 GEN_LOAD_FREG_FTN(DT0, fs);
4756 gen_op_float_floorl_d(); 4797 gen_op_float_floorl_d();
4757 GEN_STORE_FTN_FREG(fd, DT2); 4798 GEN_STORE_FTN_FREG(fd, DT2);
@@ -4809,6 +4850,50 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4809,6 +4850,50 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4809 GEN_STORE_FTN_FREG(fd, DT2); 4850 GEN_STORE_FTN_FREG(fd, DT2);
4810 opn = "movn.d"; 4851 opn = "movn.d";
4811 break; 4852 break;
  4853 + case FOP(21, 17):
  4854 + gen_op_cp1_registers(fs | fd);
  4855 + GEN_LOAD_FREG_FTN(DT0, fs);
  4856 + gen_op_float_recip_d();
  4857 + GEN_STORE_FTN_FREG(fd, DT2);
  4858 + opn = "recip.d";
  4859 + break;
  4860 + case FOP(22, 17):
  4861 + gen_op_cp1_registers(fs | fd);
  4862 + GEN_LOAD_FREG_FTN(DT0, fs);
  4863 + gen_op_float_rsqrt_d();
  4864 + GEN_STORE_FTN_FREG(fd, DT2);
  4865 + opn = "rsqrt.d";
  4866 + break;
  4867 + case FOP(28, 17):
  4868 + gen_op_cp1_64bitmode();
  4869 + GEN_LOAD_FREG_FTN(DT0, fs);
  4870 + GEN_LOAD_FREG_FTN(DT2, ft);
  4871 + gen_op_float_recip2_d();
  4872 + GEN_STORE_FTN_FREG(fd, DT2);
  4873 + opn = "recip2.d";
  4874 + break;
  4875 + case FOP(29, 17):
  4876 + gen_op_cp1_64bitmode();
  4877 + GEN_LOAD_FREG_FTN(DT0, fs);
  4878 + gen_op_float_recip1_d();
  4879 + GEN_STORE_FTN_FREG(fd, DT2);
  4880 + opn = "recip1.d";
  4881 + break;
  4882 + case FOP(30, 17):
  4883 + gen_op_cp1_64bitmode();
  4884 + GEN_LOAD_FREG_FTN(DT0, fs);
  4885 + gen_op_float_rsqrt1_d();
  4886 + GEN_STORE_FTN_FREG(fd, DT2);
  4887 + opn = "rsqrt1.d";
  4888 + break;
  4889 + case FOP(31, 17):
  4890 + gen_op_cp1_64bitmode();
  4891 + GEN_LOAD_FREG_FTN(DT0, fs);
  4892 + GEN_LOAD_FREG_FTN(DT2, ft);
  4893 + gen_op_float_rsqrt2_d();
  4894 + GEN_STORE_FTN_FREG(fd, DT2);
  4895 + opn = "rsqrt2.d";
  4896 + break;
4812 case FOP(48, 17): 4897 case FOP(48, 17):
4813 case FOP(49, 17): 4898 case FOP(49, 17):
4814 case FOP(50, 17): 4899 case FOP(50, 17):
@@ -4825,13 +4910,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4825,13 +4910,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4825 case FOP(61, 17): 4910 case FOP(61, 17):
4826 case FOP(62, 17): 4911 case FOP(62, 17):
4827 case FOP(63, 17): 4912 case FOP(63, 17):
4828 - gen_op_cp1_registers(fs | ft);  
4829 GEN_LOAD_FREG_FTN(DT0, fs); 4913 GEN_LOAD_FREG_FTN(DT0, fs);
4830 GEN_LOAD_FREG_FTN(DT1, ft); 4914 GEN_LOAD_FREG_FTN(DT1, ft);
4831 if (ctx->opcode & (1 << 6)) { 4915 if (ctx->opcode & (1 << 6)) {
  4916 + gen_op_cp1_64bitmode();
4832 gen_cmpabs_d(func-48, cc); 4917 gen_cmpabs_d(func-48, cc);
4833 opn = condnames_abs[func-48]; 4918 opn = condnames_abs[func-48];
4834 } else { 4919 } else {
  4920 + gen_op_cp1_registers(fs | ft);
4835 gen_cmp_d(func-48, cc); 4921 gen_cmp_d(func-48, cc);
4836 opn = condnames[func-48]; 4922 opn = condnames[func-48];
4837 } 4923 }
@@ -4851,7 +4937,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4851,7 +4937,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4851 opn = "cvt.w.d"; 4937 opn = "cvt.w.d";
4852 break; 4938 break;
4853 case FOP(37, 17): 4939 case FOP(37, 17):
4854 - gen_op_cp1_registers(fs | fd); 4940 + gen_op_cp1_64bitmode();
4855 GEN_LOAD_FREG_FTN(DT0, fs); 4941 GEN_LOAD_FREG_FTN(DT0, fs);
4856 gen_op_float_cvtl_d(); 4942 gen_op_float_cvtl_d();
4857 GEN_STORE_FTN_FREG(fd, DT2); 4943 GEN_STORE_FTN_FREG(fd, DT2);
@@ -4871,14 +4957,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4871,14 +4957,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4871 opn = "cvt.d.w"; 4957 opn = "cvt.d.w";
4872 break; 4958 break;
4873 case FOP(32, 21): 4959 case FOP(32, 21):
4874 - gen_op_cp1_registers(fs); 4960 + gen_op_cp1_64bitmode();
4875 GEN_LOAD_FREG_FTN(DT0, fs); 4961 GEN_LOAD_FREG_FTN(DT0, fs);
4876 gen_op_float_cvts_l(); 4962 gen_op_float_cvts_l();
4877 GEN_STORE_FTN_FREG(fd, WT2); 4963 GEN_STORE_FTN_FREG(fd, WT2);
4878 opn = "cvt.s.l"; 4964 opn = "cvt.s.l";
4879 break; 4965 break;
4880 case FOP(33, 21): 4966 case FOP(33, 21):
4881 - gen_op_cp1_registers(fs | fd); 4967 + gen_op_cp1_64bitmode();
4882 GEN_LOAD_FREG_FTN(DT0, fs); 4968 GEN_LOAD_FREG_FTN(DT0, fs);
4883 gen_op_float_cvtd_l(); 4969 gen_op_float_cvtd_l();
4884 GEN_STORE_FTN_FREG(fd, DT2); 4970 GEN_STORE_FTN_FREG(fd, DT2);
@@ -4886,7 +4972,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4886,7 +4972,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4886 break; 4972 break;
4887 case FOP(38, 20): 4973 case FOP(38, 20):
4888 case FOP(38, 21): 4974 case FOP(38, 21):
4889 - gen_op_cp1_registers(fs | fd); 4975 + gen_op_cp1_64bitmode();
4890 GEN_LOAD_FREG_FTN(WT0, fs); 4976 GEN_LOAD_FREG_FTN(WT0, fs);
4891 GEN_LOAD_FREG_FTN(WTH0, fs); 4977 GEN_LOAD_FREG_FTN(WTH0, fs);
4892 gen_op_float_cvtps_pw(); 4978 gen_op_float_cvtps_pw();
@@ -4895,7 +4981,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4895,7 +4981,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4895 opn = "cvt.ps.pw"; 4981 opn = "cvt.ps.pw";
4896 break; 4982 break;
4897 case FOP(0, 22): 4983 case FOP(0, 22):
4898 - gen_op_cp1_registers(fs | ft | fd); 4984 + gen_op_cp1_64bitmode();
4899 GEN_LOAD_FREG_FTN(WT0, fs); 4985 GEN_LOAD_FREG_FTN(WT0, fs);
4900 GEN_LOAD_FREG_FTN(WTH0, fs); 4986 GEN_LOAD_FREG_FTN(WTH0, fs);
4901 GEN_LOAD_FREG_FTN(WT1, ft); 4987 GEN_LOAD_FREG_FTN(WT1, ft);
@@ -4906,7 +4992,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4906,7 +4992,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4906 opn = "add.ps"; 4992 opn = "add.ps";
4907 break; 4993 break;
4908 case FOP(1, 22): 4994 case FOP(1, 22):
4909 - gen_op_cp1_registers(fs | ft | fd); 4995 + gen_op_cp1_64bitmode();
4910 GEN_LOAD_FREG_FTN(WT0, fs); 4996 GEN_LOAD_FREG_FTN(WT0, fs);
4911 GEN_LOAD_FREG_FTN(WTH0, fs); 4997 GEN_LOAD_FREG_FTN(WTH0, fs);
4912 GEN_LOAD_FREG_FTN(WT1, ft); 4998 GEN_LOAD_FREG_FTN(WT1, ft);
@@ -4917,7 +5003,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4917,7 +5003,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4917 opn = "sub.ps"; 5003 opn = "sub.ps";
4918 break; 5004 break;
4919 case FOP(2, 22): 5005 case FOP(2, 22):
4920 - gen_op_cp1_registers(fs | ft | fd); 5006 + gen_op_cp1_64bitmode();
4921 GEN_LOAD_FREG_FTN(WT0, fs); 5007 GEN_LOAD_FREG_FTN(WT0, fs);
4922 GEN_LOAD_FREG_FTN(WTH0, fs); 5008 GEN_LOAD_FREG_FTN(WTH0, fs);
4923 GEN_LOAD_FREG_FTN(WT1, ft); 5009 GEN_LOAD_FREG_FTN(WT1, ft);
@@ -4928,7 +5014,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4928,7 +5014,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4928 opn = "mul.ps"; 5014 opn = "mul.ps";
4929 break; 5015 break;
4930 case FOP(5, 22): 5016 case FOP(5, 22):
4931 - gen_op_cp1_registers(fs | fd); 5017 + gen_op_cp1_64bitmode();
4932 GEN_LOAD_FREG_FTN(WT0, fs); 5018 GEN_LOAD_FREG_FTN(WT0, fs);
4933 GEN_LOAD_FREG_FTN(WTH0, fs); 5019 GEN_LOAD_FREG_FTN(WTH0, fs);
4934 gen_op_float_abs_ps(); 5020 gen_op_float_abs_ps();
@@ -4937,7 +5023,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4937,7 +5023,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4937 opn = "abs.ps"; 5023 opn = "abs.ps";
4938 break; 5024 break;
4939 case FOP(6, 22): 5025 case FOP(6, 22):
4940 - gen_op_cp1_registers(fs | fd); 5026 + gen_op_cp1_64bitmode();
4941 GEN_LOAD_FREG_FTN(WT0, fs); 5027 GEN_LOAD_FREG_FTN(WT0, fs);
4942 GEN_LOAD_FREG_FTN(WTH0, fs); 5028 GEN_LOAD_FREG_FTN(WTH0, fs);
4943 gen_op_float_mov_ps(); 5029 gen_op_float_mov_ps();
@@ -4946,7 +5032,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4946,7 +5032,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4946 opn = "mov.ps"; 5032 opn = "mov.ps";
4947 break; 5033 break;
4948 case FOP(7, 22): 5034 case FOP(7, 22):
4949 - gen_op_cp1_registers(fs | fd); 5035 + gen_op_cp1_64bitmode();
4950 GEN_LOAD_FREG_FTN(WT0, fs); 5036 GEN_LOAD_FREG_FTN(WT0, fs);
4951 GEN_LOAD_FREG_FTN(WTH0, fs); 5037 GEN_LOAD_FREG_FTN(WTH0, fs);
4952 gen_op_float_chs_ps(); 5038 gen_op_float_chs_ps();
@@ -4955,6 +5041,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4955,6 +5041,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4955 opn = "neg.ps"; 5041 opn = "neg.ps";
4956 break; 5042 break;
4957 case FOP(17, 22): 5043 case FOP(17, 22):
  5044 + gen_op_cp1_64bitmode();
4958 GEN_LOAD_REG_TN(T0, ft); 5045 GEN_LOAD_REG_TN(T0, ft);
4959 GEN_LOAD_FREG_FTN(WT0, fs); 5046 GEN_LOAD_FREG_FTN(WT0, fs);
4960 GEN_LOAD_FREG_FTN(WTH0, fs); 5047 GEN_LOAD_FREG_FTN(WTH0, fs);
@@ -4966,6 +5053,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4966,6 +5053,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4966 opn = "movcf.ps"; 5053 opn = "movcf.ps";
4967 break; 5054 break;
4968 case FOP(18, 22): 5055 case FOP(18, 22):
  5056 + gen_op_cp1_64bitmode();
4969 GEN_LOAD_REG_TN(T0, ft); 5057 GEN_LOAD_REG_TN(T0, ft);
4970 GEN_LOAD_FREG_FTN(WT0, fs); 5058 GEN_LOAD_FREG_FTN(WT0, fs);
4971 GEN_LOAD_FREG_FTN(WTH0, fs); 5059 GEN_LOAD_FREG_FTN(WTH0, fs);
@@ -4977,6 +5065,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4977,6 +5065,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4977 opn = "movz.ps"; 5065 opn = "movz.ps";
4978 break; 5066 break;
4979 case FOP(19, 22): 5067 case FOP(19, 22):
  5068 + gen_op_cp1_64bitmode();
4980 GEN_LOAD_REG_TN(T0, ft); 5069 GEN_LOAD_REG_TN(T0, ft);
4981 GEN_LOAD_FREG_FTN(WT0, fs); 5070 GEN_LOAD_FREG_FTN(WT0, fs);
4982 GEN_LOAD_FREG_FTN(WTH0, fs); 5071 GEN_LOAD_FREG_FTN(WTH0, fs);
@@ -4988,7 +5077,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4988,7 +5077,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4988 opn = "movn.ps"; 5077 opn = "movn.ps";
4989 break; 5078 break;
4990 case FOP(24, 22): 5079 case FOP(24, 22):
4991 - gen_op_cp1_registers(fs | fd | ft); 5080 + gen_op_cp1_64bitmode();
4992 GEN_LOAD_FREG_FTN(WT0, fs); 5081 GEN_LOAD_FREG_FTN(WT0, fs);
4993 GEN_LOAD_FREG_FTN(WTH0, fs); 5082 GEN_LOAD_FREG_FTN(WTH0, fs);
4994 GEN_LOAD_FREG_FTN(WT1, ft); 5083 GEN_LOAD_FREG_FTN(WT1, ft);
@@ -4998,15 +5087,66 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -4998,15 +5087,66 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
4998 GEN_STORE_FTN_FREG(fd, WTH2); 5087 GEN_STORE_FTN_FREG(fd, WTH2);
4999 opn = "addr.ps"; 5088 opn = "addr.ps";
5000 break; 5089 break;
  5090 + case FOP(26, 22):
  5091 + gen_op_cp1_64bitmode();
  5092 + GEN_LOAD_FREG_FTN(WT0, fs);
  5093 + GEN_LOAD_FREG_FTN(WTH0, fs);
  5094 + GEN_LOAD_FREG_FTN(WT1, ft);
  5095 + GEN_LOAD_FREG_FTN(WTH1, ft);
  5096 + gen_op_float_mulr_ps();
  5097 + GEN_STORE_FTN_FREG(fd, WT2);
  5098 + GEN_STORE_FTN_FREG(fd, WTH2);
  5099 + opn = "mulr.ps";
  5100 + break;
  5101 + case FOP(28, 22):
  5102 + gen_op_cp1_64bitmode();
  5103 + GEN_LOAD_FREG_FTN(WT0, fs);
  5104 + GEN_LOAD_FREG_FTN(WTH0, fs);
  5105 + GEN_LOAD_FREG_FTN(WT2, fd);
  5106 + GEN_LOAD_FREG_FTN(WTH2, fd);
  5107 + gen_op_float_recip2_ps();
  5108 + GEN_STORE_FTN_FREG(fd, WT2);
  5109 + GEN_STORE_FTN_FREG(fd, WTH2);
  5110 + opn = "recip2.ps";
  5111 + break;
  5112 + case FOP(29, 22):
  5113 + gen_op_cp1_64bitmode();
  5114 + GEN_LOAD_FREG_FTN(WT0, fs);
  5115 + GEN_LOAD_FREG_FTN(WTH0, fs);
  5116 + gen_op_float_recip1_ps();
  5117 + GEN_STORE_FTN_FREG(fd, WT2);
  5118 + GEN_STORE_FTN_FREG(fd, WTH2);
  5119 + opn = "recip1.ps";
  5120 + break;
  5121 + case FOP(30, 22):
  5122 + gen_op_cp1_64bitmode();
  5123 + GEN_LOAD_FREG_FTN(WT0, fs);
  5124 + GEN_LOAD_FREG_FTN(WTH0, fs);
  5125 + gen_op_float_rsqrt1_ps();
  5126 + GEN_STORE_FTN_FREG(fd, WT2);
  5127 + GEN_STORE_FTN_FREG(fd, WTH2);
  5128 + opn = "rsqrt1.ps";
  5129 + break;
  5130 + case FOP(31, 22):
  5131 + gen_op_cp1_64bitmode();
  5132 + GEN_LOAD_FREG_FTN(WT0, fs);
  5133 + GEN_LOAD_FREG_FTN(WTH0, fs);
  5134 + GEN_LOAD_FREG_FTN(WT2, fd);
  5135 + GEN_LOAD_FREG_FTN(WTH2, fd);
  5136 + gen_op_float_rsqrt2_ps();
  5137 + GEN_STORE_FTN_FREG(fd, WT2);
  5138 + GEN_STORE_FTN_FREG(fd, WTH2);
  5139 + opn = "rsqrt2.ps";
  5140 + break;
5001 case FOP(32, 22): 5141 case FOP(32, 22):
5002 - gen_op_cp1_registers(fs); 5142 + gen_op_cp1_64bitmode();
5003 GEN_LOAD_FREG_FTN(WTH0, fs); 5143 GEN_LOAD_FREG_FTN(WTH0, fs);
5004 gen_op_float_cvts_pu(); 5144 gen_op_float_cvts_pu();
5005 GEN_STORE_FTN_FREG(fd, WT2); 5145 GEN_STORE_FTN_FREG(fd, WT2);
5006 opn = "cvt.s.pu"; 5146 opn = "cvt.s.pu";
5007 break; 5147 break;
5008 case FOP(36, 22): 5148 case FOP(36, 22):
5009 - gen_op_cp1_registers(fs | fd); 5149 + gen_op_cp1_64bitmode();
5010 GEN_LOAD_FREG_FTN(WT0, fs); 5150 GEN_LOAD_FREG_FTN(WT0, fs);
5011 GEN_LOAD_FREG_FTN(WTH0, fs); 5151 GEN_LOAD_FREG_FTN(WTH0, fs);
5012 gen_op_float_cvtpw_ps(); 5152 gen_op_float_cvtpw_ps();
@@ -5015,14 +5155,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -5015,14 +5155,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
5015 opn = "cvt.pw.ps"; 5155 opn = "cvt.pw.ps";
5016 break; 5156 break;
5017 case FOP(40, 22): 5157 case FOP(40, 22):
5018 - gen_op_cp1_registers(fs); 5158 + gen_op_cp1_64bitmode();
5019 GEN_LOAD_FREG_FTN(WT0, fs); 5159 GEN_LOAD_FREG_FTN(WT0, fs);
5020 gen_op_float_cvts_pl(); 5160 gen_op_float_cvts_pl();
5021 GEN_STORE_FTN_FREG(fd, WT2); 5161 GEN_STORE_FTN_FREG(fd, WT2);
5022 opn = "cvt.s.pl"; 5162 opn = "cvt.s.pl";
5023 break; 5163 break;
5024 case FOP(44, 22): 5164 case FOP(44, 22):
5025 - gen_op_cp1_registers(fs | ft | fd); 5165 + gen_op_cp1_64bitmode();
5026 GEN_LOAD_FREG_FTN(WT0, fs); 5166 GEN_LOAD_FREG_FTN(WT0, fs);
5027 GEN_LOAD_FREG_FTN(WT1, ft); 5167 GEN_LOAD_FREG_FTN(WT1, ft);
5028 gen_op_float_pll_ps(); 5168 gen_op_float_pll_ps();
@@ -5030,7 +5170,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -5030,7 +5170,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
5030 opn = "pll.ps"; 5170 opn = "pll.ps";
5031 break; 5171 break;
5032 case FOP(45, 22): 5172 case FOP(45, 22):
5033 - gen_op_cp1_registers(fs | ft | fd); 5173 + gen_op_cp1_64bitmode();
5034 GEN_LOAD_FREG_FTN(WT0, fs); 5174 GEN_LOAD_FREG_FTN(WT0, fs);
5035 GEN_LOAD_FREG_FTN(WTH1, ft); 5175 GEN_LOAD_FREG_FTN(WTH1, ft);
5036 gen_op_float_plu_ps(); 5176 gen_op_float_plu_ps();
@@ -5038,7 +5178,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -5038,7 +5178,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
5038 opn = "plu.ps"; 5178 opn = "plu.ps";
5039 break; 5179 break;
5040 case FOP(46, 22): 5180 case FOP(46, 22):
5041 - gen_op_cp1_registers(fs | ft | fd); 5181 + gen_op_cp1_64bitmode();
5042 GEN_LOAD_FREG_FTN(WTH0, fs); 5182 GEN_LOAD_FREG_FTN(WTH0, fs);
5043 GEN_LOAD_FREG_FTN(WT1, ft); 5183 GEN_LOAD_FREG_FTN(WT1, ft);
5044 gen_op_float_pul_ps(); 5184 gen_op_float_pul_ps();
@@ -5046,7 +5186,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -5046,7 +5186,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
5046 opn = "pul.ps"; 5186 opn = "pul.ps";
5047 break; 5187 break;
5048 case FOP(47, 22): 5188 case FOP(47, 22):
5049 - gen_op_cp1_registers(fs | ft | fd); 5189 + gen_op_cp1_64bitmode();
5050 GEN_LOAD_FREG_FTN(WTH0, fs); 5190 GEN_LOAD_FREG_FTN(WTH0, fs);
5051 GEN_LOAD_FREG_FTN(WTH1, ft); 5191 GEN_LOAD_FREG_FTN(WTH1, ft);
5052 gen_op_float_puu_ps(); 5192 gen_op_float_puu_ps();
@@ -5069,7 +5209,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, @@ -5069,7 +5209,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft,
5069 case FOP(61, 22): 5209 case FOP(61, 22):
5070 case FOP(62, 22): 5210 case FOP(62, 22):
5071 case FOP(63, 22): 5211 case FOP(63, 22):
5072 - gen_op_cp1_registers(fs | ft); 5212 + gen_op_cp1_64bitmode();
5073 GEN_LOAD_FREG_FTN(WT0, fs); 5213 GEN_LOAD_FREG_FTN(WT0, fs);
5074 GEN_LOAD_FREG_FTN(WTH0, fs); 5214 GEN_LOAD_FREG_FTN(WTH0, fs);
5075 GEN_LOAD_FREG_FTN(WT1, ft); 5215 GEN_LOAD_FREG_FTN(WT1, ft);
@@ -5106,6 +5246,8 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, int fd, @@ -5106,6 +5246,8 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, int fd,
5106 { 5246 {
5107 const char *opn = "extended float load/store"; 5247 const char *opn = "extended float load/store";
5108 5248
  5249 + /* All of those work only on 64bit FPUs. */
  5250 + gen_op_cp1_64bitmode();
5109 GEN_LOAD_REG_TN(T0, base); 5251 GEN_LOAD_REG_TN(T0, base);
5110 GEN_LOAD_REG_TN(T1, index); 5252 GEN_LOAD_REG_TN(T1, index);
5111 /* Don't do NOP if destination is zero: we must perform the actual 5253 /* Don't do NOP if destination is zero: we must perform the actual
@@ -5156,7 +5298,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, int fd, @@ -5156,7 +5298,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, int fd,
5156 const char *opn = "flt3_arith"; 5298 const char *opn = "flt3_arith";
5157 5299
5158 /* All of those work only on 64bit FPUs. */ 5300 /* All of those work only on 64bit FPUs. */
5159 - gen_op_cp1_registers(fd | fr | fs | ft); 5301 + gen_op_cp1_64bitmode();
5160 switch (opc) { 5302 switch (opc) {
5161 case OPC_ALNV_PS: 5303 case OPC_ALNV_PS:
5162 GEN_LOAD_REG_TN(T0, fr); 5304 GEN_LOAD_REG_TN(T0, fr);