aboutsummaryrefslogtreecommitdiffstats
path: root/package/devel/valgrind/patches/130-mips_fix_soft_float.patch
blob: 05be099ca5e4e77efd5fe1fa05ddb03a5279c3e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Disable the valgrind helpers which use MIPS floating point operations 
when floating point support is deactivated in the toolchain.

The fix from this commit is not sufficient any more:
https://sourceware.org/git/?p=valgrind.git;a=commitdiff;h=869fcf2f6739f17b4eff36ec68f8dca826c8afeb

This fixes the following error message when compiling with a GCC 10 MIPS BE 32:
---------------------------------------------------------
../VEX/priv/guest_mips_helpers.c: In function 'mips_dirtyhelper_calculate_FCSR_fp32':
../VEX/priv/guest_mips_helpers.c:640:10: error: the register '$f21' cannot be clobbered in 'asm' for the current target
  640 |          ASM_VOLATILE_UNARY32_DOUBLE(round.w.d)
      |          ^
---------------------------------------------------------

--- a/VEX/priv/guest_mips_helpers.c
+++ b/VEX/priv/guest_mips_helpers.c
@@ -617,6 +617,7 @@ extern UInt mips_dirtyhelper_calculate_F
                                                    flt_op inst )
 {
    UInt ret = 0;
+#ifndef __mips_soft_float
 #if defined(__mips__)
    VexGuestMIPS32State* guest_state = (VexGuestMIPS32State*)gs;
    UInt loFsVal, hiFsVal, loFtVal, hiFtVal;
@@ -699,6 +700,7 @@ extern UInt mips_dirtyhelper_calculate_F
          break;
    }
 #endif
+#endif
    return ret;
 }
 
@@ -708,6 +710,7 @@ extern UInt mips_dirtyhelper_calculate_F
                                                    flt_op inst )
 {
    UInt ret = 0;
+#ifndef __mips_soft_float
 #if defined(__mips__) && ((__mips == 64) ||                                  \
                           (defined(__mips_isa_rev) && (__mips_isa_rev >= 2)))
 #if defined(VGA_mips32)
@@ -860,6 +863,7 @@ extern UInt mips_dirtyhelper_calculate_F
          break;
    }
 #endif
+#endif
    return ret;
 }
 
--- a/coregrind/m_machine.c
+++ b/coregrind/m_machine.c
@@ -1828,6 +1828,7 @@ Bool VG_(machine_get_hwcaps)( void )
            we are using alternative way to determine FP mode */
         ULong result = 0;
 
+#ifndef __mips_soft_float
         if (!VG_MINIMAL_SETJMP(env_unsup_insn)) {
            __asm__ volatile (
               ".set push\n\t"
@@ -1845,6 +1846,9 @@ Bool VG_(machine_get_hwcaps)( void )
 
            fpmode = (result != 0x3FF0000000000000ull);
         }
+#else
+	fpmode = 0;
+#endif
      }
 
      if (fpmode != 0)