Support ptr_mode != Pmode in x86_output_mi_thunk.
authorH.J. Lu <hongjiu.lu@intel.com>
Wed, 13 Jul 2011 15:54:15 +0000 (15:54 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Wed, 13 Jul 2011 15:54:15 +0000 (08:54 -0700)
2011-07-13  H.J. Lu  <hongjiu.lu@intel.com>

* config/i386/i386.c (x86_output_mi_thunk): Support ptr_mode
!= Pmode.

* config/i386/i386.md (*addsi_1_zext): Renamed to ...
(addsi_1_zext): This.

From-SVN: r176238

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

index 7bb3a05ff2c63addc1a0350a12ad6eb297b0cc87..ed493138eebf7330a54821f0035437e179e36620 100644 (file)
@@ -1,3 +1,11 @@
+2011-07-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/i386.c (x86_output_mi_thunk): Support ptr_mode
+       != Pmode.
+
+       * config/i386/i386.md (*addsi_1_zext): Renamed to ...
+       (addsi_1_zext): This.
+
 2011-07-13  Bernd Schmidt  <bernds@codesourcery.com>
 
        * doc/tm.texi.in (TARGET_ASM_MERGEABLE_RODATA_PREFIX): Add hook.
index 24c906c2c59e11b972ae97c3ec5e8fae0be57e2c..f643efcd58f30e92dbfed33b9ee69ae2004bfa0e 100644 (file)
@@ -29442,7 +29442,7 @@ x86_output_mi_thunk (FILE *file,
   /* Adjust the this parameter by a value stored in the vtable.  */
   if (vcall_offset)
     {
-      rtx vcall_addr, vcall_mem;
+      rtx vcall_addr, vcall_mem, this_mem;
       unsigned int tmp_regno;
 
       if (TARGET_64BIT)
@@ -29457,7 +29457,10 @@ x86_output_mi_thunk (FILE *file,
        }
       tmp = gen_rtx_REG (Pmode, tmp_regno);
 
-      emit_move_insn (tmp, gen_rtx_MEM (ptr_mode, this_reg));
+      this_mem = gen_rtx_MEM (ptr_mode, this_reg);
+      if (Pmode != ptr_mode)
+       this_mem = gen_rtx_ZERO_EXTEND (Pmode, this_mem);
+      emit_move_insn (tmp, this_mem);
 
       /* Adjust the this parameter.  */
       vcall_addr = plus_constant (tmp, vcall_offset);
@@ -29469,8 +29472,14 @@ x86_output_mi_thunk (FILE *file,
          vcall_addr = gen_rtx_PLUS (Pmode, tmp, tmp2);
        }
 
-      vcall_mem = gen_rtx_MEM (Pmode, vcall_addr);
-      emit_insn (ix86_gen_add3 (this_reg, this_reg, vcall_mem));
+      vcall_mem = gen_rtx_MEM (ptr_mode, vcall_addr);
+      if (Pmode != ptr_mode)
+       emit_insn (gen_addsi_1_zext (this_reg,
+                                    gen_rtx_REG (ptr_mode,
+                                                 REGNO (this_reg)),
+                                    vcall_mem));
+      else
+       emit_insn (ix86_gen_add3 (this_reg, this_reg, vcall_mem));
     }
 
   /* If necessary, drop THIS back to its stack slot.  */
index 0451c678f8779a9c5e3c9f932e318c5fa1848c77..cf0fdf4fa211c688dbaccac1c854f8431f82c177 100644 (file)
 ;; operands so proper swapping will be done in reload.  This allow
 ;; patterns constructed from addsi_1 to match.
 
-(define_insn "*addsi_1_zext"
+(define_insn "addsi_1_zext"
   [(set (match_operand:DI 0 "register_operand" "=r,r,r")
        (zero_extend:DI
          (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,r,r")