]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386.md (*msabi_syvabi): Add SSE regs clobbers.
authorJan Hubicka <jh@suse.cz>
Tue, 6 Jan 2009 15:11:04 +0000 (16:11 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 6 Jan 2009 15:11:04 +0000 (15:11 +0000)
* i386.md (*msabi_syvabi): Add SSE regs clobbers.
* i386.c (ix86_expand_call): Add clobbers.

Co-Authored-By: Kai Tietz <kai.tietz@onevision.com>
From-SVN: r143120

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.md

index 21de6806b2b9cc0656ba37dc746247ce98883dca..1f7d286492c4a134c48bf34eeb2292a239de2fdf 100644 (file)
@@ -1,3 +1,9 @@
+2009-01-06  Jan Hubicka  <jh@suse.cz>
+           Kai Tietz <kai.tietz@onevision.com>
+
+       * i386.md (*msabi_syvabi): Add SSE regs clobbers.
+       * i386.c (ix86_expand_call): Add clobbers.
+
 2009-01-06  Jan Hubicka  <jh@suse.cz>
            Kai Tietz <kai.tietz@onevision.com>
 
index 73a717ddbe63af3f955661f0aa50a1f1edc06650..91af83a87b7db4578b56daad2a445ca99d1aebf6 100644 (file)
@@ -18501,16 +18501,29 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
       gcc_assert (ix86_cfun_abi () != MS_ABI || function_call_abi != SYSV_ABI);
     }
-  /* We need to represent that SI and DI registers are clobbered by SYSV calls.
-     */
+  /* We need to represent that SI and DI registers are clobbered
+     by SYSV calls.  */
   if (ix86_cfun_abi () == MS_ABI && function_call_abi == SYSV_ABI)
     {
-      rtx clobber1 = gen_rtx_CLOBBER (DImode, gen_rtx_REG (DImode, SI_REG));
-      rtx clobber2 = gen_rtx_CLOBBER (DImode, gen_rtx_REG (DImode, DI_REG));
+      static int clobbered_registers[] ={27, 28, 45, 46, 47, 48, 49, 50, 51, 52, SI_REG, DI_REG};
+      static const int nclobbered_registers = sizeof (clobbered_registers) / sizeof (int);
+      int i;
+      rtx vec[nclobbered_registers + 2];
       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
                                   UNSPEC_MS_TO_SYSV_CALL);
+
+      vec[0] = call;
+      vec[1] = unspec;
+      for (i = 0; i < nclobbered_registers; i++)
+        vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
+                                     ? TImode : DImode,
+                                     gen_rtx_REG
+                                       (SSE_REGNO_P (clobbered_registers[i])
+                                                     ? TImode : DImode,
+                                        clobbered_registers[i]));
+
       call = gen_rtx_PARALLEL (VOIDmode,
-                              gen_rtvec (4, call, unspec, clobber1, clobber2));
+                              gen_rtvec_v (nclobbered_registers + 2, vec));
     }
 
   call = emit_call_insn (call);
index f0bec12adcefc9d0c1e14d4a927a97788f564c2e..0569f0413a84a7e61f0b0ae5fab8b4fec9c36cc4 100644 (file)
   [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rsm"))
         (match_operand 1 "" ""))
    (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
+   (clobber (reg:TI 27))
+   (clobber (reg:TI 28))
+   (clobber (reg:TI 45))
+   (clobber (reg:TI 46))
+   (clobber (reg:TI 47))
+   (clobber (reg:TI 48))
+   (clobber (reg:TI 49))
+   (clobber (reg:TI 50))
+   (clobber (reg:TI 51))
+   (clobber (reg:TI 52))
    (clobber (reg:DI SI_REG))
    (clobber (reg:DI DI_REG))]
   "!SIBLING_CALL_P (insn) && TARGET_64BIT"
        (call (mem:QI (match_operand:DI 1 "constant_call_address_operand" ""))
              (match_operand:DI 2 "const_int_operand" "")))
    (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
+   (clobber (reg:TI 27))
+   (clobber (reg:TI 28))
+   (clobber (reg:TI 45))
+   (clobber (reg:TI 46))
+   (clobber (reg:TI 47))
+   (clobber (reg:TI 48))
+   (clobber (reg:TI 49))
+   (clobber (reg:TI 50))
+   (clobber (reg:TI 51))
+   (clobber (reg:TI 52))
    (clobber (reg:DI SI_REG))
    (clobber (reg:DI DI_REG))]
   "!SIBLING_CALL_P (insn) && TARGET_64BIT"
        (call (mem:QI (match_operand:DI 1 "call_insn_operand" "rsm"))
              (match_operand:DI 2 "" "")))
    (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
+   (clobber (reg:TI 27))
+   (clobber (reg:TI 28))
+   (clobber (reg:TI 45))
+   (clobber (reg:TI 46))
+   (clobber (reg:TI 47))
+   (clobber (reg:TI 48))
+   (clobber (reg:TI 49))
+   (clobber (reg:TI 50))
+   (clobber (reg:TI 51))
+   (clobber (reg:TI 52))
    (clobber (reg:DI SI_REG))
    (clobber (reg:DI DI_REG))]
   "!SIBLING_CALL_P (insn) && TARGET_64BIT"