comparison gcc/config/i386/i386.c @ 47:3bfb6c00c1e0

update it from 4.4.2 to 4.4.3.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Sun, 07 Feb 2010 17:44:34 +0900
parents 855418dad1a3
children 9907f3135723 77e2b8dfacca
comparison
equal deleted inserted replaced
46:b85a337e5837 47:3bfb6c00c1e0
10377 been replaced by a cselib value. */ 10377 been replaced by a cselib value. */
10378 10378
10379 static bool 10379 static bool
10380 ix86_pic_register_p (rtx x) 10380 ix86_pic_register_p (rtx x)
10381 { 10381 {
10382 if (GET_CODE (x) == VALUE) 10382 if (GET_CODE (x) == VALUE && CSELIB_VAL_PTR (x))
10383 return (pic_offset_table_rtx 10383 return (pic_offset_table_rtx
10384 && rtx_equal_for_cselib_p (x, pic_offset_table_rtx)); 10384 && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
10385 else 10385 else
10386 return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM; 10386 return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
10387 } 10387 }
11311 { 11311 {
11312 case 1: size = "BYTE"; break; 11312 case 1: size = "BYTE"; break;
11313 case 2: size = "WORD"; break; 11313 case 2: size = "WORD"; break;
11314 case 4: size = "DWORD"; break; 11314 case 4: size = "DWORD"; break;
11315 case 8: size = "QWORD"; break; 11315 case 8: size = "QWORD"; break;
11316 case 12: size = "XWORD"; break; 11316 case 12: size = "TBYTE"; break;
11317 case 16: 11317 case 16:
11318 if (GET_MODE (x) == XFmode) 11318 if (GET_MODE (x) == XFmode)
11319 size = "XWORD"; 11319 size = "TBYTE";
11320 else 11320 else
11321 size = "XMMWORD"; 11321 size = "XMMWORD";
11322 break; 11322 break;
11323 case 32: size = "YMMWORD"; break;
11323 default: 11324 default:
11324 gcc_unreachable (); 11325 gcc_unreachable ();
11325 } 11326 }
11326 11327
11327 /* Check for explicit size override (codes 'b', 'w' and 'k') */ 11328 /* Check for explicit size override (codes 'b', 'w' and 'k') */
15672 default: 15673 default:
15673 gcc_unreachable (); 15674 gcc_unreachable ();
15674 } 15675 }
15675 } 15676 }
15676 15677
15677 /* Unsigned parallel compare is not supported by the hardware. Play some 15678 /* Unsigned parallel compare is not supported by the hardware.
15678 tricks to turn this into a signed comparison against 0. */ 15679 Play some tricks to turn this into a signed comparison
15680 against 0. */
15679 if (code == GTU) 15681 if (code == GTU)
15680 { 15682 {
15681 cop0 = force_reg (mode, cop0); 15683 cop0 = force_reg (mode, cop0);
15682 15684
15683 switch (mode) 15685 switch (mode)
15684 { 15686 {
15685 case V4SImode: 15687 case V4SImode:
15686 case V2DImode: 15688 case V2DImode:
15687 { 15689 {
15688 rtx t1, t2, mask; 15690 rtx t1, t2, mask;
15689 15691 rtx (*gen_sub3) (rtx, rtx, rtx);
15690 /* Perform a parallel modulo subtraction. */ 15692
15691 t1 = gen_reg_rtx (mode); 15693 /* Subtract (-(INT MAX) - 1) from both operands to make
15692 emit_insn ((mode == V4SImode 15694 them signed. */
15693 ? gen_subv4si3 15695 mask = ix86_build_signbit_mask (GET_MODE_INNER (mode),
15694 : gen_subv2di3) (t1, cop0, cop1)); 15696 true, false);
15695 15697 gen_sub3 = (mode == V4SImode
15696 /* Extract the original sign bit of op0. */ 15698 ? gen_subv4si3 : gen_subv2di3);
15697 mask = ix86_build_signbit_mask (GET_MODE_INNER (mode), 15699 t1 = gen_reg_rtx (mode);
15698 true, false); 15700 emit_insn (gen_sub3 (t1, cop0, mask));
15699 t2 = gen_reg_rtx (mode); 15701
15700 emit_insn ((mode == V4SImode 15702 t2 = gen_reg_rtx (mode);
15701 ? gen_andv4si3 15703 emit_insn (gen_sub3 (t2, cop1, mask));
15702 : gen_andv2di3) (t2, cop0, mask)); 15704
15703 15705 cop0 = t1;
15704 /* XOR it back into the result of the subtraction. This results 15706 cop1 = t2;
15705 in the sign bit set iff we saw unsigned underflow. */ 15707 code = GT;
15706 x = gen_reg_rtx (mode); 15708 }
15707 emit_insn ((mode == V4SImode
15708 ? gen_xorv4si3
15709 : gen_xorv2di3) (x, t1, t2));
15710
15711 code = GT;
15712 }
15713 break; 15709 break;
15714 15710
15715 case V16QImode: 15711 case V16QImode:
15716 case V8HImode: 15712 case V8HImode:
15717 /* Perform a parallel unsigned saturating subtraction. */ 15713 /* Perform a parallel unsigned saturating subtraction. */
15718 x = gen_reg_rtx (mode); 15714 x = gen_reg_rtx (mode);
15719 emit_insn (gen_rtx_SET (VOIDmode, x, 15715 emit_insn (gen_rtx_SET (VOIDmode, x,
15720 gen_rtx_US_MINUS (mode, cop0, cop1))); 15716 gen_rtx_US_MINUS (mode, cop0, cop1)));
15721 15717
15718 cop0 = x;
15719 cop1 = CONST0_RTX (mode);
15722 code = EQ; 15720 code = EQ;
15723 negate = !negate; 15721 negate = !negate;
15724 break; 15722 break;
15725 15723
15726 default: 15724 default:
15727 gcc_unreachable (); 15725 gcc_unreachable ();
15728 } 15726 }
15729
15730 cop0 = x;
15731 cop1 = CONST0_RTX (mode);
15732 } 15727 }
15733 } 15728 }
15734 15729
15735 x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1, 15730 x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
15736 operands[1+negate], operands[2-negate]); 15731 operands[1+negate], operands[2-negate]);