mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			re PR target/85480 (zero extension from xmm to zmm via _mm512_insert???x? not optimized)
PR target/85480 * config/i386/sse.md (ssequaterinsnmode): New mode attribute. (*<extract_type>_vinsert<shuffletype><extract_suf>_0): New pattern. * gcc.target/i386/avx512dq-pr85480-1.c: New test. * gcc.target/i386/avx512dq-pr85480-2.c: New test. From-SVN: r260039
This commit is contained in:
		
							parent
							
								
									57cfbfbab8
								
							
						
					
					
						commit
						294c6f6637
					
				|  | @ -1,3 +1,9 @@ | |||
| 2018-05-08  Jakub Jelinek  <jakub@redhat.com> | ||||
| 
 | ||||
| 	PR target/85480 | ||||
| 	* config/i386/sse.md (ssequaterinsnmode): New mode attribute. | ||||
| 	(*<extract_type>_vinsert<shuffletype><extract_suf>_0): New pattern. | ||||
| 
 | ||||
| 2018-05-08  Richard Earnshaw  <rearnsha@arm.com> | ||||
| 
 | ||||
| 	PR target/85658 | ||||
|  |  | |||
|  | @ -581,6 +581,9 @@ | |||
| (define_mode_attr ssequartermode | ||||
|   [(V16SF "V4SF") (V8DF "V2DF") (V16SI "V4SI") (V8DI "V2DI")]) | ||||
| 
 | ||||
| (define_mode_attr ssequarterinsnmode | ||||
|   [(V16SF "V4SF") (V8DF "V2DF") (V16SI "TI") (V8DI "TI")]) | ||||
| 
 | ||||
| (define_mode_attr ssedoublemodelower | ||||
|   [(V16QI "v16hi") (V32QI "v32hi") (V64QI "v64hi") | ||||
|    (V8HI "v8si")   (V16HI "v16si") (V32HI "v32si") | ||||
|  | @ -12721,6 +12724,40 @@ | |||
|   DONE; | ||||
| }) | ||||
| 
 | ||||
| (define_insn "*<extract_type>_vinsert<shuffletype><extract_suf>_0" | ||||
|   [(set (match_operand:AVX512_VEC 0 "register_operand" "=v,x,Yv") | ||||
| 	(vec_merge:AVX512_VEC | ||||
| 	  (match_operand:AVX512_VEC 1 "reg_or_0_operand" "v,C,C") | ||||
| 	  (vec_duplicate:AVX512_VEC | ||||
| 		(match_operand:<ssequartermode> 2 "nonimmediate_operand" "vm,xm,vm")) | ||||
| 	  (match_operand:SI 3 "const_int_operand" "n,n,n")))] | ||||
|   "TARGET_AVX512F | ||||
|    && (INTVAL (operands[3]) | ||||
|        == (GET_MODE_UNIT_SIZE (<MODE>mode) == 4 ? 0xFFF0 : 0xFC))" | ||||
| { | ||||
|   if (which_alternative == 0) | ||||
|     return "vinsert<shuffletype><extract_suf>\t{$0, %2, %1, %0|%0, %1, %2, 0}"; | ||||
|   switch (<MODE>mode) | ||||
|     { | ||||
|     case E_V8DFmode: | ||||
|       return "vmovapd\t{%2, %x0|%x0, %2}"; | ||||
|     case E_V16SFmode: | ||||
|       return "vmovaps\t{%2, %x0|%x0, %2}"; | ||||
|     case E_V8DImode: | ||||
|       return which_alternative == 2 ? "vmovdqa64\t{%2, %x0|%x0, %2}" | ||||
| 				    : "vmovdqa\t{%2, %x0|%x0, %2}"; | ||||
|     case E_V16SImode: | ||||
|       return which_alternative == 2 ? "vmovdqa32\t{%2, %x0|%x0, %2}" | ||||
| 				    : "vmovdqa\t{%2, %x0|%x0, %2}"; | ||||
|     default: | ||||
|       gcc_unreachable (); | ||||
|     } | ||||
| } | ||||
|   [(set_attr "type" "sselog,ssemov,ssemov") | ||||
|    (set_attr "length_immediate" "1,0,0") | ||||
|    (set_attr "prefix" "evex,vex,evex") | ||||
|    (set_attr "mode" "<sseinsnmode>,<ssequarterinsnmode>,<ssequarterinsnmode>")]) | ||||
| 
 | ||||
| (define_insn "<mask_codefor><extract_type>_vinsert<shuffletype><extract_suf>_1<mask_name>" | ||||
|   [(set (match_operand:AVX512_VEC 0 "register_operand" "=v") | ||||
| 	(vec_merge:AVX512_VEC | ||||
|  |  | |||
|  | @ -1,3 +1,9 @@ | |||
| 2018-05-08  Jakub Jelinek  <jakub@redhat.com> | ||||
| 
 | ||||
| 	PR target/85480 | ||||
| 	* gcc.target/i386/avx512dq-pr85480-1.c: New test. | ||||
| 	* gcc.target/i386/avx512dq-pr85480-2.c: New test. | ||||
| 
 | ||||
| 2018-05-08  Richard Sandiford  <richard.sandiford@linaro.org> | ||||
| 
 | ||||
| 	* g++.dg/other/sve_const_pred_1.C: Rename to... | ||||
|  |  | |||
|  | @ -0,0 +1,26 @@ | |||
| /* PR target/85480 */ | ||||
| /* { dg-do compile } */ | ||||
| /* { dg-options "-O2 -mavx512dq" } */ | ||||
| /* { dg-final { scan-assembler-times "vmovaps\[^\n\r]*xmm0\[^\n\r]*xmm0" 1 } } */ | ||||
| /* { dg-final { scan-assembler-times "vmovapd\[^\n\r]*xmm0\[^\n\r]*xmm0" 1 } } */ | ||||
| /* { dg-final { scan-assembler-times "vmovdqa\[^\n\r]*xmm0\[^\n\r]*xmm0" 1 } } */ | ||||
| 
 | ||||
| #include <x86intrin.h> | ||||
| 
 | ||||
| __m512 | ||||
| f1 (__m128 a) | ||||
| { | ||||
|   return _mm512_insertf32x4 (_mm512_set1_ps (0.0f), a, 0); | ||||
| } | ||||
| 
 | ||||
| __m512d | ||||
| f2 (__m128d a) | ||||
| { | ||||
|   return _mm512_insertf64x2 (_mm512_set1_pd (0.0), a, 0); | ||||
| } | ||||
| 
 | ||||
| __m512i | ||||
| f3 (__m128i a) | ||||
| { | ||||
|   return _mm512_inserti32x4 (_mm512_set1_epi32 (0), a, 0); | ||||
| } | ||||
|  | @ -0,0 +1,38 @@ | |||
| /* PR target/85480 */ | ||||
| /* { dg-do compile { target lp64 } } */ | ||||
| /* { dg-options "-O2 -mavx512dq -mavx512vl" } */ | ||||
| /* { dg-final { scan-assembler-times "vmovaps\[^\n\r]*xmm1\[67]\[^\n\r]*xmm1\[67]" 1 } } */ | ||||
| /* { dg-final { scan-assembler-times "vmovapd\[^\n\r]*xmm1\[67]\[^\n\r]*xmm1\[67]" 1 } } */ | ||||
| /* { dg-final { scan-assembler-times "vmovdqa32\[^\n\r]*xmm1\[67]\[^\n\r]*xmm1\[67]" 1 } } */ | ||||
| 
 | ||||
| #include <x86intrin.h> | ||||
| 
 | ||||
| __m512 | ||||
| f1 (__m128 a) | ||||
| { | ||||
|   register __m128 b __asm ("xmm16"); | ||||
|   asm ("" : "=v" (b) : "0" (a)); | ||||
|   register __m512 c __asm ("xmm17") = _mm512_insertf32x4 (_mm512_set1_ps (0.0f), b, 0); | ||||
|   asm ("" : "+v" (c)); | ||||
|   return c; | ||||
| } | ||||
| 
 | ||||
| __m512d | ||||
| f2 (__m128d a) | ||||
| { | ||||
|   register __m128d b __asm ("xmm16"); | ||||
|   asm ("" : "=v" (b) : "0" (a)); | ||||
|   register __m512d c __asm ("xmm17") = _mm512_insertf64x2 (_mm512_set1_pd (0.0), b, 0); | ||||
|   asm ("" : "+v" (c)); | ||||
|   return c; | ||||
| } | ||||
| 
 | ||||
| __m512i | ||||
| f3 (__m128i a) | ||||
| { | ||||
|   register __m128i b __asm ("xmm16"); | ||||
|   asm ("" : "=v" (b) : "0" (a)); | ||||
|   register __m512i c __asm ("xmm17") = _mm512_inserti32x4 (_mm512_set1_epi32 (0), b, 0); | ||||
|   asm ("" : "+v" (c)); | ||||
|   return c; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 Jakub Jelinek
						Jakub Jelinek