mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			aarch64-simd.md (aarch64_simd_vec_set<mode>): Adjust for big-endian element order.
2013-11-22 Tejas Belagod <tejas.belagod@arm.com> * config/aarch64/aarch64-simd.md (aarch64_simd_vec_set<mode>): Adjust for big-endian element order. (aarch64_simd_vec_setv2di): Likewise. (*aarch64_get_lane_extend<GPI:mode><VDQQH:mode>, *aarch64_get_lane_zero_extendsi<mode>, aarch64_get_lane): Likewise. (vec_extract): Expand using aarch64_get_lane. * config/aarch64/aarch64.h (ENDIAN_LANE_N): New. From-SVN: r205267
This commit is contained in:
		
							parent
							
								
									635ad37e5a
								
							
						
					
					
						commit
						e58bf20adf
					
				|  | @ -1,3 +1,13 @@ | ||||||
|  | 2013-11-22  Tejas Belagod  <tejas.belagod@arm.com> | ||||||
|  | 
 | ||||||
|  | 	* config/aarch64/aarch64-simd.md (aarch64_simd_vec_set<mode>): Adjust | ||||||
|  | 	for big-endian element order. | ||||||
|  | 	(aarch64_simd_vec_setv2di): Likewise. | ||||||
|  | 	(*aarch64_get_lane_extend<GPI:mode><VDQQH:mode>, | ||||||
|  | 	*aarch64_get_lane_zero_extendsi<mode>, aarch64_get_lane): Likewise. | ||||||
|  | 	(vec_extract): Expand using aarch64_get_lane. | ||||||
|  | 	* config/aarch64/aarch64.h (ENDIAN_LANE_N): New. | ||||||
|  | 
 | ||||||
| 2013-11-22  Tejas Belagod  <tejas.belagod@arm.com> | 2013-11-22  Tejas Belagod  <tejas.belagod@arm.com> | ||||||
| 
 | 
 | ||||||
| 	* config/aarch64/aarch64-simd.md (*aarch64_simd_mov<mode>): Fix loads | 	* config/aarch64/aarch64-simd.md (*aarch64_simd_mov<mode>): Fix loads | ||||||
|  |  | ||||||
|  | @ -428,9 +428,19 @@ | ||||||
| 	    (match_operand:VQ_S 3 "register_operand" "0,0") | 	    (match_operand:VQ_S 3 "register_operand" "0,0") | ||||||
| 	    (match_operand:SI 2 "immediate_operand" "i,i")))] | 	    (match_operand:SI 2 "immediate_operand" "i,i")))] | ||||||
|   "TARGET_SIMD" |   "TARGET_SIMD" | ||||||
|   "@ |   { | ||||||
|    ins\t%0.<Vetype>[%p2], %w1 |    int elt = ENDIAN_LANE_N (<MODE>mode, exact_log2 (INTVAL (operands[2]))); | ||||||
|    ins\\t%0.<Vetype>[%p2], %1.<Vetype>[0]" |    operands[2] = GEN_INT ((HOST_WIDE_INT) 1 << elt); | ||||||
|  |    switch (which_alternative) | ||||||
|  |      { | ||||||
|  |      case 0: | ||||||
|  | 	return "ins\\t%0.<Vetype>[%p2], %w1"; | ||||||
|  |      case 1: | ||||||
|  | 	return "ins\\t%0.<Vetype>[%p2], %1.<Vetype>[0]"; | ||||||
|  |      default: | ||||||
|  | 	gcc_unreachable (); | ||||||
|  |      } | ||||||
|  |   } | ||||||
|   [(set_attr "type" "neon_from_gp<q>, neon_ins<q>")] |   [(set_attr "type" "neon_from_gp<q>, neon_ins<q>")] | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -692,9 +702,19 @@ | ||||||
| 	    (match_operand:V2DI 3 "register_operand" "0,0") | 	    (match_operand:V2DI 3 "register_operand" "0,0") | ||||||
| 	    (match_operand:SI 2 "immediate_operand" "i,i")))] | 	    (match_operand:SI 2 "immediate_operand" "i,i")))] | ||||||
|   "TARGET_SIMD" |   "TARGET_SIMD" | ||||||
|   "@ |   { | ||||||
|    ins\t%0.d[%p2], %1 |     int elt = ENDIAN_LANE_N (V2DImode, exact_log2 (INTVAL (operands[2]))); | ||||||
|    ins\\t%0.d[%p2], %1.d[0]" |     operands[2] = GEN_INT ((HOST_WIDE_INT) 1 << elt); | ||||||
|  |     switch (which_alternative) | ||||||
|  |       { | ||||||
|  |       case 0: | ||||||
|  | 	return "ins\\t%0.d[%p2], %1"; | ||||||
|  |       case 1: | ||||||
|  |         return "ins\\t%0.d[%p2], %1.d[0]"; | ||||||
|  |       default: | ||||||
|  | 	gcc_unreachable (); | ||||||
|  |       } | ||||||
|  |   } | ||||||
|   [(set_attr "type" "neon_from_gp, neon_ins_q")] |   [(set_attr "type" "neon_from_gp, neon_ins_q")] | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -719,7 +739,12 @@ | ||||||
| 	    (match_operand:VDQF 3 "register_operand" "0") | 	    (match_operand:VDQF 3 "register_operand" "0") | ||||||
| 	    (match_operand:SI 2 "immediate_operand" "i")))] | 	    (match_operand:SI 2 "immediate_operand" "i")))] | ||||||
|   "TARGET_SIMD" |   "TARGET_SIMD" | ||||||
|   "ins\t%0.<Vetype>[%p2], %1.<Vetype>[0]"; |   { | ||||||
|  |     int elt = ENDIAN_LANE_N (<MODE>mode, exact_log2 (INTVAL (operands[2]))); | ||||||
|  | 
 | ||||||
|  |     operands[2] = GEN_INT ((HOST_WIDE_INT)1 << elt); | ||||||
|  |     return "ins\t%0.<Vetype>[%p2], %1.<Vetype>[0]"; | ||||||
|  |   } | ||||||
|   [(set_attr "type" "neon_ins<q>")] |   [(set_attr "type" "neon_ins<q>")] | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -2022,7 +2047,10 @@ | ||||||
| 	    (match_operand:VDQQH 1 "register_operand" "w") | 	    (match_operand:VDQQH 1 "register_operand" "w") | ||||||
| 	    (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))] | 	    (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))] | ||||||
|   "TARGET_SIMD" |   "TARGET_SIMD" | ||||||
|   "smov\\t%<GPI:w>0, %1.<VDQQH:Vetype>[%2]" |   { | ||||||
|  |     operands[2] = GEN_INT (ENDIAN_LANE_N (<MODE>mode, INTVAL (operands[2]))); | ||||||
|  |     return "smov\\t%<GPI:w>0, %1.<VDQQH:Vetype>[%2]"; | ||||||
|  |   } | ||||||
|   [(set_attr "type" "neon_to_gp<q>")] |   [(set_attr "type" "neon_to_gp<q>")] | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -2033,22 +2061,36 @@ | ||||||
| 	    (match_operand:VDQQH 1 "register_operand" "w") | 	    (match_operand:VDQQH 1 "register_operand" "w") | ||||||
| 	    (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))] | 	    (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))] | ||||||
|   "TARGET_SIMD" |   "TARGET_SIMD" | ||||||
|   "umov\\t%w0, %1.<Vetype>[%2]" |   { | ||||||
|  |     operands[2] = GEN_INT (ENDIAN_LANE_N (<MODE>mode, INTVAL (operands[2]))); | ||||||
|  |     return "umov\\t%w0, %1.<Vetype>[%2]"; | ||||||
|  |   } | ||||||
|   [(set_attr "type" "neon_to_gp<q>")] |   [(set_attr "type" "neon_to_gp<q>")] | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| ;; Lane extraction of a value, neither sign nor zero extension | ;; Lane extraction of a value, neither sign nor zero extension | ||||||
| ;; is guaranteed so upper bits should be considered undefined. | ;; is guaranteed so upper bits should be considered undefined. | ||||||
| (define_insn "aarch64_get_lane<mode>" | (define_insn "aarch64_get_lane<mode>" | ||||||
|   [(set (match_operand:<VEL> 0 "register_operand" "=r, w") |   [(set (match_operand:<VEL> 0 "aarch64_simd_nonimmediate_operand" "=r, w, Utv") | ||||||
| 	(vec_select:<VEL> | 	(vec_select:<VEL> | ||||||
| 	  (match_operand:VALL 1 "register_operand" "w, w") | 	  (match_operand:VALL 1 "register_operand" "w, w, w") | ||||||
| 	  (parallel [(match_operand:SI 2 "immediate_operand" "i, i")])))] | 	  (parallel [(match_operand:SI 2 "immediate_operand" "i, i, i")])))] | ||||||
|   "TARGET_SIMD" |   "TARGET_SIMD" | ||||||
|   "@ |   { | ||||||
|    umov\\t%<vwcore>0, %1.<Vetype>[%2] |     operands[2] = GEN_INT (ENDIAN_LANE_N (<MODE>mode, INTVAL (operands[2]))); | ||||||
|    dup\\t%<Vetype>0, %1.<Vetype>[%2]" |     switch (which_alternative) | ||||||
|   [(set_attr "type" "neon_to_gp<q>, neon_dup<q>")] |       { | ||||||
|  | 	case 0: | ||||||
|  | 	  return "umov\\t%<vwcore>0, %1.<Vetype>[%2]"; | ||||||
|  | 	case 1: | ||||||
|  | 	  return "dup\\t%<Vetype>0, %1.<Vetype>[%2]"; | ||||||
|  | 	case 2: | ||||||
|  | 	  return "st1\\t{%1.<Vetype>}[%2], %0"; | ||||||
|  | 	default: | ||||||
|  | 	  gcc_unreachable (); | ||||||
|  |       } | ||||||
|  |   } | ||||||
|  |   [(set_attr "type" "neon_to_gp<q>, neon_dup<q>, neon_store1_one_lane<q>")] | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| (define_expand "aarch64_get_lanedi" | (define_expand "aarch64_get_lanedi" | ||||||
|  | @ -4028,16 +4070,13 @@ | ||||||
| 
 | 
 | ||||||
| ;; Standard pattern name vec_extract<mode>. | ;; Standard pattern name vec_extract<mode>. | ||||||
| 
 | 
 | ||||||
| (define_insn "vec_extract<mode>" | (define_expand "vec_extract<mode>" | ||||||
|   [(set (match_operand:<VEL> 0 "aarch64_simd_nonimmediate_operand" "=r, w, Utv") |   [(match_operand:<VEL> 0 "aarch64_simd_nonimmediate_operand" "") | ||||||
| 	(vec_select:<VEL> |    (match_operand:VALL 1 "register_operand" "") | ||||||
| 	  (match_operand:VALL 1 "register_operand" "w, w, w") |    (match_operand:SI 2 "immediate_operand" "")] | ||||||
| 	  (parallel [(match_operand:SI 2 "immediate_operand" "i,i,i")])))] |  | ||||||
|   "TARGET_SIMD" |   "TARGET_SIMD" | ||||||
|   "@ | { | ||||||
|   umov\\t%<vw>0, %1.<Vetype>[%2] |     emit_insn | ||||||
|   dup\\t%<Vetype>0, %1.<Vetype>[%2] |       (gen_aarch64_get_lane<mode> (operands[0], operands[1], operands[2])); | ||||||
|   st1\\t{%1.<Vetype>}[%2], %0" |     DONE; | ||||||
|   [(set_attr "type" "neon_to_gp<q>, neon_dup<q>, neon_store1_one_lane<q>")] | }) | ||||||
| ) |  | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -854,4 +854,7 @@ extern enum aarch64_code_model aarch64_cmodel; | ||||||
|   ((MODE) == V4SImode || (MODE) == V8HImode || (MODE) == V16QImode \ |   ((MODE) == V4SImode || (MODE) == V8HImode || (MODE) == V16QImode \ | ||||||
|    || (MODE) == V4SFmode || (MODE) == V2DImode || mode == V2DFmode) |    || (MODE) == V4SFmode || (MODE) == V2DImode || mode == V2DFmode) | ||||||
| 
 | 
 | ||||||
|  | #define ENDIAN_LANE_N(mode, n)  \ | ||||||
|  |   (BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (mode) - 1 - n : n) | ||||||
|  | 
 | ||||||
| #endif /* GCC_AARCH64_H */ | #endif /* GCC_AARCH64_H */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Tejas Belagod
						Tejas Belagod