mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			re PR target/56315 (ARM: Improve use of 64-bit constants in logical operations)
gcc/ 2013-06-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR target/56315 * config/arm/arm.md (*xordi3_insn): Change to insn_and_split. (xordi3): Change operand 2 constraint to arm_xordi_operand. * config/arm/arm.c (const_ok_for_dimode_op): Handle XOR. * config/arm/constraints.md (Dg): New constraint. * config/arm/neon.md (xordi3_neon): Remove. (neon_veor<mode>): Generate xordi3 instead of xordi3_neon. * config/arm/predicates.md (arm_xordi_operand): New predicate. gcc/testsuite 2013-06-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR target/56315 * gcc.target/arm/xordi3-opt.c: New test. From-SVN: r199814
This commit is contained in:
		
							parent
							
								
									45db6b0d14
								
							
						
					
					
						commit
						79678d044b
					
				|  | @ -1,3 +1,14 @@ | ||||||
|  | 2013-06-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com> | ||||||
|  | 
 | ||||||
|  | 	PR target/56315 | ||||||
|  | 	* config/arm/arm.md (*xordi3_insn): Change to insn_and_split. | ||||||
|  | 	(xordi3): Change operand 2 constraint to arm_xordi_operand. | ||||||
|  | 	* config/arm/arm.c (const_ok_for_dimode_op): Handle XOR. | ||||||
|  | 	* config/arm/constraints.md (Dg): New constraint. | ||||||
|  | 	* config/arm/neon.md (xordi3_neon): Remove. | ||||||
|  | 	(neon_veor<mode>): Generate xordi3 instead of xordi3_neon. | ||||||
|  | 	* config/arm/predicates.md (arm_xordi_operand): New predicate. | ||||||
|  | 
 | ||||||
| 2013-06-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com> | 2013-06-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com> | ||||||
| 
 | 
 | ||||||
| 	* config/arm/arm.md (anddi3_insn): Remove duplicate alternatives. | 	* config/arm/arm.md (anddi3_insn): Remove duplicate alternatives. | ||||||
|  |  | ||||||
|  | @ -2687,6 +2687,7 @@ const_ok_for_dimode_op (HOST_WIDE_INT i, enum rtx_code code) | ||||||
|     { |     { | ||||||
|     case AND: |     case AND: | ||||||
|     case IOR: |     case IOR: | ||||||
|  |     case XOR: | ||||||
|       return (const_ok_for_op (hi_val, code) || hi_val == 0xFFFFFFFF) |       return (const_ok_for_op (hi_val, code) || hi_val == 0xFFFFFFFF) | ||||||
|               && (const_ok_for_op (lo_val, code) || lo_val == 0xFFFFFFFF); |               && (const_ok_for_op (lo_val, code) || lo_val == 0xFFFFFFFF); | ||||||
|     case PLUS: |     case PLUS: | ||||||
|  |  | ||||||
|  | @ -3181,19 +3181,49 @@ | ||||||
| (define_expand "xordi3" | (define_expand "xordi3" | ||||||
|   [(set (match_operand:DI         0 "s_register_operand" "") |   [(set (match_operand:DI         0 "s_register_operand" "") | ||||||
| 	(xor:DI (match_operand:DI 1 "s_register_operand" "") | 	(xor:DI (match_operand:DI 1 "s_register_operand" "") | ||||||
| 		(match_operand:DI 2 "s_register_operand" "")))] | 		(match_operand:DI 2 "arm_xordi_operand" "")))] | ||||||
|   "TARGET_32BIT" |   "TARGET_32BIT" | ||||||
|   "" |   "" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| (define_insn "*xordi3_insn" | (define_insn_and_split "*xordi3_insn" | ||||||
|   [(set (match_operand:DI         0 "s_register_operand" "=&r,&r") |   [(set (match_operand:DI         0 "s_register_operand" "=w,&r,&r,&r,&r,?w") | ||||||
| 	(xor:DI (match_operand:DI 1 "s_register_operand"  "%0,r") | 	(xor:DI (match_operand:DI 1 "s_register_operand" "w ,%0,r ,0 ,r ,w") | ||||||
| 		(match_operand:DI 2 "s_register_operand"   "r,r")))] | 		(match_operand:DI 2 "arm_xordi_operand"  "w ,r ,r ,Dg,Dg,w")))] | ||||||
|   "TARGET_32BIT && !TARGET_IWMMXT && !TARGET_NEON" |   "TARGET_32BIT && !TARGET_IWMMXT" | ||||||
|   "#" | { | ||||||
|   [(set_attr "length" "8") |   switch (which_alternative) | ||||||
|    (set_attr "predicable" "yes")] |     { | ||||||
|  |     case 1: | ||||||
|  |     case 2: | ||||||
|  |     case 3: | ||||||
|  |     case 4:  /* fall through */ | ||||||
|  |       return "#"; | ||||||
|  |     case 0: /* fall through */ | ||||||
|  |     case 5: return "veor\t%P0, %P1, %P2"; | ||||||
|  |     default: gcc_unreachable (); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |   "TARGET_32BIT && !TARGET_IWMMXT && reload_completed | ||||||
|  |    && !(IS_VFP_REGNUM (REGNO (operands[0])))" | ||||||
|  |   [(set (match_dup 3) (match_dup 4)) | ||||||
|  |    (set (match_dup 5) (match_dup 6))] | ||||||
|  |   " | ||||||
|  |   { | ||||||
|  |     operands[3] = gen_lowpart (SImode, operands[0]); | ||||||
|  |     operands[5] = gen_highpart (SImode, operands[0]); | ||||||
|  | 
 | ||||||
|  |     operands[4] = simplify_gen_binary (XOR, SImode, | ||||||
|  |                                            gen_lowpart (SImode, operands[1]), | ||||||
|  |                                            gen_lowpart (SImode, operands[2])); | ||||||
|  |     operands[6] = simplify_gen_binary (XOR, SImode, | ||||||
|  |                                            gen_highpart (SImode, operands[1]), | ||||||
|  |                                            gen_highpart_mode (SImode, DImode, operands[2])); | ||||||
|  | 
 | ||||||
|  |   }" | ||||||
|  |   [(set_attr "length" "*,8,8,8,8,*") | ||||||
|  |    (set_attr "neon_type" "neon_int_1,*,*,*,*,neon_int_1") | ||||||
|  |    (set_attr "arch" "neon_for_64bits,*,*,*,*,avoid_neon_for_64bits")] | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| (define_insn "*xordi_zesidi_di" | (define_insn "*xordi_zesidi_di" | ||||||
|  |  | ||||||
|  | @ -266,6 +266,12 @@ | ||||||
|  (and (match_code "const_int") |  (and (match_code "const_int") | ||||||
|       (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, IOR)"))) |       (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, IOR)"))) | ||||||
| 
 | 
 | ||||||
|  | (define_constraint "Dg" | ||||||
|  |  "@internal | ||||||
|  |   In ARM/Thumb-2 state a const_int that can be used by insn xordi." | ||||||
|  |  (and (match_code "const_int") | ||||||
|  |       (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, XOR)"))) | ||||||
|  | 
 | ||||||
| (define_constraint "Di" | (define_constraint "Di" | ||||||
|  "@internal |  "@internal | ||||||
|   In ARM/Thumb-2 state a const_int or const_double where both the high |   In ARM/Thumb-2 state a const_int or const_double where both the high | ||||||
|  |  | ||||||
|  | @ -782,21 +782,6 @@ | ||||||
|   [(set_attr "neon_type" "neon_int_1")] |   [(set_attr "neon_type" "neon_int_1")] | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| (define_insn "xordi3_neon" |  | ||||||
|   [(set (match_operand:DI 0 "s_register_operand" "=w,?&r,?&r,?w") |  | ||||||
|         (xor:DI (match_operand:DI 1 "s_register_operand" "%w,0,r,w") |  | ||||||
| 	        (match_operand:DI 2 "s_register_operand" "w,r,r,w")))] |  | ||||||
|   "TARGET_NEON" |  | ||||||
|   "@ |  | ||||||
|    veor\t%P0, %P1, %P2 |  | ||||||
|    # |  | ||||||
|    # |  | ||||||
|    veor\t%P0, %P1, %P2" |  | ||||||
|   [(set_attr "neon_type" "neon_int_1,*,*,neon_int_1") |  | ||||||
|    (set_attr "length" "*,8,8,*") |  | ||||||
|    (set_attr "arch" "neon_for_64bits,*,*,avoid_neon_for_64bits")] |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| (define_insn "one_cmpl<mode>2" | (define_insn "one_cmpl<mode>2" | ||||||
|   [(set (match_operand:VDQ 0 "s_register_operand" "=w") |   [(set (match_operand:VDQ 0 "s_register_operand" "=w") | ||||||
|         (not:VDQ (match_operand:VDQ 1 "s_register_operand" "w")))] |         (not:VDQ (match_operand:VDQ 1 "s_register_operand" "w")))] | ||||||
|  | @ -5605,7 +5590,7 @@ | ||||||
|    (match_operand:SI 3 "immediate_operand" "")] |    (match_operand:SI 3 "immediate_operand" "")] | ||||||
|   "TARGET_NEON" |   "TARGET_NEON" | ||||||
| { | { | ||||||
|   emit_insn (gen_xor<mode>3<V_suf64> (operands[0], operands[1], operands[2])); |   emit_insn (gen_xor<mode>3 (operands[0], operands[1], operands[2])); | ||||||
|   DONE; |   DONE; | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -179,6 +179,11 @@ | ||||||
| 	    (match_test "const_ok_for_dimode_op (INTVAL (op), IOR)")) | 	    (match_test "const_ok_for_dimode_op (INTVAL (op), IOR)")) | ||||||
|        (match_operand 0 "neon_logic_op2"))) |        (match_operand 0 "neon_logic_op2"))) | ||||||
| 
 | 
 | ||||||
|  | (define_predicate "arm_xordi_operand" | ||||||
|  |   (ior (match_operand 0 "s_register_operand") | ||||||
|  |        (and (match_code "const_int") | ||||||
|  | 	    (match_test "const_ok_for_dimode_op (INTVAL (op), XOR)")))) | ||||||
|  | 
 | ||||||
| (define_predicate "arm_adddi_operand" | (define_predicate "arm_adddi_operand" | ||||||
|   (ior (match_operand 0 "s_register_operand") |   (ior (match_operand 0 "s_register_operand") | ||||||
|        (and (match_code "const_int") |        (and (match_code "const_int") | ||||||
|  |  | ||||||
|  | @ -1,3 +1,8 @@ | ||||||
|  | 2013-06-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com> | ||||||
|  | 
 | ||||||
|  | 	PR target/56315 | ||||||
|  | 	* gcc.target/arm/xordi3-opt.c: New test. | ||||||
|  | 
 | ||||||
| 2013-06-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE> | 2013-06-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE> | ||||||
| 
 | 
 | ||||||
| 	* gcc.dg/debug/dwarf2/discriminator.c: Fix wording. | 	* gcc.dg/debug/dwarf2/discriminator.c: Fix wording. | ||||||
|  |  | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | /* { dg-do compile } */ | ||||||
|  | /* { dg-options "-O1" } */ | ||||||
|  | 
 | ||||||
|  | unsigned long long xor64 (unsigned long long input) | ||||||
|  | { | ||||||
|  |     return input ^ 0x200000004ULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* { dg-final { scan-assembler-not "mov\[\\t \]+.+,\[\\t \]*.+" } } */ | ||||||
		Loading…
	
		Reference in New Issue
	
	 Kyrylo Tkachov
						Kyrylo Tkachov