]> gcc.gnu.org Git - gcc.git/commitdiff
Fix float conversions if sign extension in offset would occur
authorMichael Meissner <meissner@gcc.gnu.org>
Fri, 18 Oct 1996 17:35:40 +0000 (17:35 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Fri, 18 Oct 1996 17:35:40 +0000 (17:35 +0000)
From-SVN: r12977

gcc/config/rs6000/rs6000.md

index 9c93f9b3ec55bd43f8416398a943681b69fd38fa..382a0a79abda763f1b01a37acb85838b4dcec924 100644 (file)
 
       xop[0] = operands[0];
       xop[1] = (frame_pointer_needed) ? frame_pointer_rtx : stack_pointer_rtx;
-      xop[2] = GEN_INT ((rs6000_fpmem_offset >> 16) & 0xffff);
+      xop[2] = GEN_INT ((rs6000_fpmem_offset >> 16) + ((rs6000_fpmem_offset & 0x8000) >> 15));
       output_asm_insn (\"{cau %0,%2(%1)|addis %0,%1,%2}\", xop);
     }
   else if (rs6000_fpmem_offset < 0)
   operands[2] = gen_rtx (MEM, SImode,
                         gen_rtx (PLUS, Pmode,
                                  indx,
-                                 GEN_INT ((rs6000_fpmem_offset & 0xffff)
+                                 GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000)
                                           + ((WORDS_BIG_ENDIAN != 0) * 4))));
 
   return \"{st|stw} %0,%2\";
   operands[2] = gen_rtx (MEM, SImode,
                         gen_rtx (PLUS, Pmode,
                                  indx,
-                                 GEN_INT ((rs6000_fpmem_offset & 0xffff)
+                                 GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000)
                                           + ((WORDS_BIG_ENDIAN == 0) * 4))));
 
   return \"{st|stw} %0,%2\";
   if (rs6000_fpmem_offset > 32760)
     {
       indx = operands[1];
-      offset &= 0xffff;
+      offset = (((offset & 0xffff) ^ 0x8000) - 0x8000);
     }
   else if (frame_pointer_needed)
     indx = frame_pointer_rtx;
   operands[2] = gen_rtx (MEM, DFmode,
                         gen_rtx (PLUS, Pmode,
                                  indx,
-                                 GEN_INT ((rs6000_fpmem_offset & 0xffff))));
+                                 GEN_INT (rs6000_fpmem_offset)));
 
-  return \"stfd %0,%2\";
+  return \"stfd %0,%w2\";
 }"
   [(set_attr "type" "fpstore")])
 
   operands[2] = gen_rtx (MEM, DFmode,
                         gen_rtx (PLUS, Pmode,
                                  indx,
-                                 GEN_INT ((rs6000_fpmem_offset & 0xffff)
+                                 GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000)
                                           + ((WORDS_BIG_ENDIAN) ? 4 : 0))));
 
   return \"{l|lwz} %0,%2\";
This page took 0.08925 seconds and 5 git commands to generate.