Mercurial > hg > CbC > CbC_gcc
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]); |