|
@@ -106,3 +106,62 @@ unsigned int PerformFLT(const unsigned int opcode)
|
|
|
if (roundData.exception)
|
|
|
float_raise(roundData.exception);
|
|
|
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int PerformFIX(const unsigned int opcode)
|
|
|
+{
|
|
|
+ FPA11 *fpa11 = GET_FPA11();
|
|
|
+ unsigned int Fn = getFm(opcode);
|
|
|
+ struct roundingData roundData;
|
|
|
+
|
|
|
+ roundData.mode = SetRoundingMode(opcode);
|
|
|
+ roundData.precision = SetRoundingPrecision(opcode);
|
|
|
+ roundData.exception = 0;
|
|
|
+
|
|
|
+ switch (fpa11->fType[Fn]) {
|
|
|
+ case typeSingle:
|
|
|
+ {
|
|
|
+ writeRegister(getRd(opcode), float32_to_int32(&roundData, fpa11->fpreg[Fn].fSingle));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case typeDouble:
|
|
|
+ {
|
|
|
+ writeRegister(getRd(opcode), float64_to_int32(&roundData, fpa11->fpreg[Fn].fDouble));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+#ifdef CONFIG_FPE_NWFPE_XP
|
|
|
+ case typeExtended:
|
|
|
+ {
|
|
|
+ writeRegister(getRd(opcode), floatx80_to_int32(&roundData, fpa11->fpreg[Fn].fExtended));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+#endif
|
|
|
+
|
|
|
+ default:
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (roundData.exception)
|
|
|
+ float_raise(roundData.exception);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+/* This instruction sets the flags N, Z, C, V in the FPSR. */
|
|
|
+static unsigned int PerformComparison(const unsigned int opcode)
|
|
|
+{
|
|
|
+ FPA11 *fpa11 = GET_FPA11();
|
|
|
+ unsigned int Fn = getFn(opcode), Fm = getFm(opcode);
|
|
|
+ int e_flag = opcode & 0x400000; /* 1 if CxFE */
|
|
|
+ int n_flag = opcode & 0x200000; /* 1 if CNxx */
|
|
|
+ unsigned int flags = 0;
|
|
|
+
|
|
|
+#ifdef CONFIG_FPE_NWFPE_XP
|
|
|
+ floatx80 rFn, rFm;
|
|
|
+
|
|
|
+ /* Check for unordered condition and convert all operands to 80-bit
|
|
|
+ format.
|
|
|
+ ?? Might be some mileage in avoiding this conversion if possible.
|