diff options
author | liuhongt <hongtao.liu@intel.com> | 2021-06-03 16:38:32 +0800 |
---|---|---|
committer | liuhongt <hongtao.liu@intel.com> | 2021-06-07 11:27:45 +0800 |
commit | be5efe9c12cb852c788f74f8555e6ab8d755479b (patch) | |
tree | cb264bb95cf555691dd800d18b3995c7bde55499 | |
parent | 9a90b311f22956addaf4f5f9bdb3592afd45083f (diff) | |
download | gcc-be5efe9c12cb852c788f74f8555e6ab8d755479b.zip gcc-be5efe9c12cb852c788f74f8555e6ab8d755479b.tar.gz gcc-be5efe9c12cb852c788f74f8555e6ab8d755479b.tar.bz2 |
Fix ICE of insn does not satisfy its constraints.
evex encoding vpmovzxbx needs both AVX512BW and AVX512VL which means
constraint "Yw" should be used instead of constraint "v".
gcc/ChangeLog:
PR target/100885
* config/i386/sse.md (*sse4_1_zero_extendv8qiv8hi2_3): Refine
constraints.
(<insn>v4siv4di2): Delete constraints for define_expand.
gcc/testsuite/ChangeLog:
PR target/100885
* g++.target/i386/pr100885.C: New test.
-rw-r--r-- | gcc/config/i386/sse.md | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.target/i386/pr100885.C | 144 |
2 files changed, 148 insertions, 4 deletions
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 9fc1176..2a34756 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -18115,10 +18115,10 @@ "operands[1] = adjust_address_nv (operands[1], V8QImode, 0);") (define_insn_and_split "*sse4_1_zero_extendv8qiv8hi2_3" - [(set (match_operand:V16QI 0 "register_operand" "=Yr,*x,v") + [(set (match_operand:V16QI 0 "register_operand" "=Yr,*x,Yw") (vec_select:V16QI (vec_concat:V32QI - (match_operand:V16QI 1 "vector_operand" "YrBm,*xBm,vm") + (match_operand:V16QI 1 "vector_operand" "YrBm,*xBm,Ywm") (match_operand:V16QI 2 "const0_operand" "C,C,C")) (match_parallel 3 "pmovzx_parallel" [(match_operand 4 "const_int_operand" "n,n,n")])))] @@ -18803,9 +18803,9 @@ }) (define_expand "<insn>v4siv4di2" - [(set (match_operand:V4DI 0 "register_operand" "=v") + [(set (match_operand:V4DI 0 "register_operand") (any_extend:V4DI - (match_operand:V4SI 1 "nonimmediate_operand" "vm")))] + (match_operand:V4SI 1 "nonimmediate_operand")))] "TARGET_AVX2") (define_insn "sse4_1_<code>v2siv2di2<mask_name>" diff --git a/gcc/testsuite/g++.target/i386/pr100885.C b/gcc/testsuite/g++.target/i386/pr100885.C new file mode 100644 index 0000000..08a5bdd --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr100885.C @@ -0,0 +1,144 @@ +/* { dg-do compile { target { ! ia32 } } } */ +/* { dg-options "-mavx512vl -mno-avx512bw -O2 -Wno-int-to-pointer-cast -std=c++14" } */ + +#include<x86intrin.h> +typedef unsigned char byte; +enum ZoomLevel { ZOOM_LVL_COUNT }; +struct Colour { + unsigned data; + Colour(int data) : data(data) {} +}; +struct Palette { + Colour palette[6]; +}; +enum BlitterMode { BM_COLOUR_REMAP }; +class Blitter { +public: + struct BlitterParams { + int width; + int height; + int left; + int top; + void *dst; + }; + virtual void Draw(); +}; +class Blitter_32bppAnim : public Blitter { +protected: + unsigned short anim_buf; + Palette palette; + int LookupColourInPalette_index; + Colour LookupColourInPalette() { + return palette.palette[LookupColourInPalette_index]; + } +}; +__m128i _mm_set_epi64(__m64 __q0) { + __m128i __trans_tmp_5{(long)__q0}; + return __trans_tmp_5; +} +long _mm_storel_epi64___P, Draw_dsts; +__m128i _mm_packus_epi16___B, _mm_subs_epu16___B, _mm_hadd_epi16___Y, + Draw_srcABCD, Draw___trans_tmp_10, Draw___trans_tmp_29, Draw___trans_tmp_7, + AlphaBlendTwoPixels___trans_tmp_12, AlphaBlendTwoPixels___trans_tmp_11, + AdjustBrightnessOfTwoPixels_from; +int _mm_srli_epi16___B; +class Blitter_32bppSSE_Base { +public: + enum ReadMode { RM_WITH_MARGIN }; + enum BlockType { BT_NONE }; + struct SpriteData { + int infos[ZOOM_LVL_COUNT]; + byte data; + }; +}; +byte *Draw_remap; +short Draw_si_0; +class Blitter_32bppSSE4_Anim : Blitter_32bppAnim, Blitter_32bppSSE_Base { + template <BlitterMode, ReadMode, BlockType, bool, bool> + void Draw(const BlitterParams *, ZoomLevel); + void Draw(); +}; +__m128i AdjustBrightnessOfTwoPixels() { + __m128i __trans_tmp_28, __trans_tmp_27, __trans_tmp_26, __trans_tmp_24, + __trans_tmp_23, __trans_tmp_22, __trans_tmp_21, __trans_tmp_20, + __trans_tmp_19, __trans_tmp_18, __trans_tmp_17, __trans_tmp_16, + __trans_tmp_14 = _mm_srli_epi16(AdjustBrightnessOfTwoPixels_from, + _mm_srli_epi16___B), + __trans_tmp_7; + char __trans_tmp_8; + __trans_tmp_7 = __m128i{__trans_tmp_8}; + { + __m128i __trans_tmp_7; + char __trans_tmp_8; + __trans_tmp_7 = __m128i{__trans_tmp_8}; + __trans_tmp_26 = __trans_tmp_7; + } + __trans_tmp_16 = (__v8hi)__trans_tmp_14 > (__v8hi)__trans_tmp_26; + __trans_tmp_17 = _mm_hadd_epi16(__trans_tmp_16, _mm_hadd_epi16___Y); + __trans_tmp_18 = _mm_hadd_epi16(__trans_tmp_17, _mm_hadd_epi16___Y); + __trans_tmp_19 = _mm_srli_epi16(__trans_tmp_18, _mm_srli_epi16___B); + { + __m128i __trans_tmp_7; + char __trans_tmp_8; + __trans_tmp_7 = __m128i{__trans_tmp_8}; + __trans_tmp_27 = __trans_tmp_7; + } + __trans_tmp_20 = _mm_shuffle_epi8(__trans_tmp_19, + __trans_tmp_27); + { + __m128i __trans_tmp_7; + char __trans_tmp_8; + __trans_tmp_7 = __m128i{__trans_tmp_8}; + __trans_tmp_28 = __trans_tmp_7; + } + __trans_tmp_21 = _mm_subs_epu16(__trans_tmp_28, _mm_subs_epu16___B); + __trans_tmp_22 = __m128i((__v8hu)__trans_tmp_21 * (__v8hu)__trans_tmp_20); + __trans_tmp_23 = __m128i((__v8hu)__trans_tmp_22 + (__v8hu)__trans_tmp_7); + __trans_tmp_24 = _mm_packus_epi16(__trans_tmp_23, _mm_packus_epi16___B); + return __trans_tmp_24; +} +template <BlitterMode, Blitter_32bppSSE_Base::ReadMode, + Blitter_32bppSSE_Base::BlockType, bool, bool> +void Blitter_32bppSSE4_Anim::Draw(const BlitterParams *bp, ZoomLevel zoom) { + __m128i __trans_tmp_30; + Colour *dst_line = (Colour *)bp->dst + bp->left; + unsigned short *anim_line = &anim_buf + bp->top; + int effective_width; + SpriteData *sd = (SpriteData *)bp; + Colour *src_rgba_line = (Colour *)sd->data; + Draw___trans_tmp_29 = Draw___trans_tmp_7; + for (int y = bp->height; y; y--) { + Colour *dst = dst_line; + unsigned short *anim = anim_line; + anim += src_rgba_line[0].data; + dst += src_rgba_line[0].data; + int width_diff = Draw_si_0 - bp->width; + effective_width = width_diff ?: effective_width; + for (int x = effective_width; x; x--) { + int mvX2 = *(unsigned *)sd->infos[zoom], m = byte(mvX2); + __trans_tmp_30 = _mm_set_epi64(*(__m64_u *)dst); + Colour c0 = Draw_dsts, srcm(0), cmap = LookupColourInPalette().data & 40; + c0 = Draw_remap[m] ?: cmap; + c0 = m ? c0 : srcm; + Draw___trans_tmp_10 = __v2di{c0.data}; + if (mvX2) + Draw_srcABCD = AdjustBrightnessOfTwoPixels(); + if (src_rgba_line) + anim[1] = 0; + __m128i tmp; + __m128i dstAB = _mm_unpacklo_epi8(__trans_tmp_30, tmp); + AlphaBlendTwoPixels___trans_tmp_12 = + __m128i((__v8hu)Draw_srcABCD + (__v8hu)dstAB); + AlphaBlendTwoPixels___trans_tmp_11 = _mm_shuffle_epi8 (AlphaBlendTwoPixels___trans_tmp_12, + Draw___trans_tmp_7); + *(__m64_u *)_mm_storel_epi64___P = + (__m64)AlphaBlendTwoPixels___trans_tmp_11[0]; + } + } +} +Blitter::BlitterParams Draw_bp; +ZoomLevel Draw_zoom; +void Blitter_32bppSSE4_Anim::Draw() { + Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true, false>(&Draw_bp, + Draw_zoom); +} |