1 ; RUN: llc < %s -march=x86-64 -mcpu=x86-64 | FileCheck %s -check-prefix=SSE2 2 ; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s -check-prefix=SSSE3 3 ; RUN: llc < %s -march=x86-64 -mcpu=core-avx2 | FileCheck %s -check-prefix=AVX2 4 5 define <4 x i32> @test1(<4 x i32> %a) nounwind { 6 ; SSE2-LABEL: test1: 7 ; SSE2: movdqa 8 ; SSE2: psrad $31 9 ; SSE2-NEXT: padd 10 ; SSE2-NEXT: pxor 11 ; SSE2-NEXT: ret 12 13 ; SSSE3-LABEL: test1: 14 ; SSSE3: pabsd 15 ; SSSE3-NEXT: ret 16 17 ; AVX2-LABEL: test1: 18 ; AVX2: vpabsd 19 ; AVX2-NEXT: ret 20 %tmp1neg = sub <4 x i32> zeroinitializer, %a 21 %b = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1> 22 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg 23 ret <4 x i32> %abs 24 } 25 26 define <4 x i32> @test2(<4 x i32> %a) nounwind { 27 ; SSE2-LABEL: test2: 28 ; SSE2: movdqa 29 ; SSE2: psrad $31 30 ; SSE2-NEXT: padd 31 ; SSE2-NEXT: pxor 32 ; SSE2-NEXT: ret 33 34 ; SSSE3-LABEL: test2: 35 ; SSSE3: pabsd 36 ; SSSE3-NEXT: ret 37 38 ; AVX2-LABEL: test2: 39 ; AVX2: vpabsd 40 ; AVX2-NEXT: ret 41 %tmp1neg = sub <4 x i32> zeroinitializer, %a 42 %b = icmp sge <4 x i32> %a, zeroinitializer 43 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg 44 ret <4 x i32> %abs 45 } 46 47 define <8 x i16> @test3(<8 x i16> %a) nounwind { 48 ; SSE2-LABEL: test3: 49 ; SSE2: movdqa 50 ; SSE2: psraw $15 51 ; SSE2-NEXT: padd 52 ; SSE2-NEXT: pxor 53 ; SSE2-NEXT: ret 54 55 ; SSSE3-LABEL: test3: 56 ; SSSE3: pabsw 57 ; SSSE3-NEXT: ret 58 59 ; AVX2-LABEL: test3: 60 ; AVX2: vpabsw 61 ; AVX2-NEXT: ret 62 %tmp1neg = sub <8 x i16> zeroinitializer, %a 63 %b = icmp sgt <8 x i16> %a, zeroinitializer 64 %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg 65 ret <8 x i16> %abs 66 } 67 68 define <16 x i8> @test4(<16 x i8> %a) nounwind { 69 ; SSE2-LABEL: test4: 70 ; SSE2: pxor 71 ; SSE2: pcmpgtb 72 ; SSE2-NEXT: padd 73 ; SSE2-NEXT: pxor 74 ; SSE2-NEXT: ret 75 76 ; SSSE3-LABEL: test4: 77 ; SSSE3: pabsb 78 ; SSSE3-NEXT: ret 79 80 ; AVX2-LABEL: test4: 81 ; AVX2: vpabsb 82 ; AVX2-NEXT: ret 83 %tmp1neg = sub <16 x i8> zeroinitializer, %a 84 %b = icmp slt <16 x i8> %a, zeroinitializer 85 %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a 86 ret <16 x i8> %abs 87 } 88 89 define <4 x i32> @test5(<4 x i32> %a) nounwind { 90 ; SSE2-LABEL: test5: 91 ; SSE2: movdqa 92 ; SSE2: psrad $31 93 ; SSE2-NEXT: padd 94 ; SSE2-NEXT: pxor 95 ; SSE2-NEXT: ret 96 97 ; SSSE3-LABEL: test5: 98 ; SSSE3: pabsd 99 ; SSSE3-NEXT: ret 100 101 ; AVX2-LABEL: test5: 102 ; AVX2: vpabsd 103 ; AVX2-NEXT: ret 104 %tmp1neg = sub <4 x i32> zeroinitializer, %a 105 %b = icmp sle <4 x i32> %a, zeroinitializer 106 %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a 107 ret <4 x i32> %abs 108 } 109 110 define <8 x i32> @test6(<8 x i32> %a) nounwind { 111 ; SSSE3-LABEL: test6: 112 ; SSSE3: pabsd 113 ; SSSE3: pabsd 114 ; SSSE3-NEXT: ret 115 116 ; AVX2-LABEL: test6: 117 ; AVX2: vpabsd {{.*}}%ymm 118 ; AVX2-NEXT: ret 119 %tmp1neg = sub <8 x i32> zeroinitializer, %a 120 %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 121 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg 122 ret <8 x i32> %abs 123 } 124 125 define <8 x i32> @test7(<8 x i32> %a) nounwind { 126 ; SSSE3-LABEL: test7: 127 ; SSSE3: pabsd 128 ; SSSE3: pabsd 129 ; SSSE3-NEXT: ret 130 131 ; AVX2-LABEL: test7: 132 ; AVX2: vpabsd {{.*}}%ymm 133 ; AVX2-NEXT: ret 134 %tmp1neg = sub <8 x i32> zeroinitializer, %a 135 %b = icmp sge <8 x i32> %a, zeroinitializer 136 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg 137 ret <8 x i32> %abs 138 } 139 140 define <16 x i16> @test8(<16 x i16> %a) nounwind { 141 ; SSSE3-LABEL: test8: 142 ; SSSE3: pabsw 143 ; SSSE3: pabsw 144 ; SSSE3-NEXT: ret 145 146 ; AVX2-LABEL: test8: 147 ; AVX2: vpabsw {{.*}}%ymm 148 ; AVX2-NEXT: ret 149 %tmp1neg = sub <16 x i16> zeroinitializer, %a 150 %b = icmp sgt <16 x i16> %a, zeroinitializer 151 %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg 152 ret <16 x i16> %abs 153 } 154 155 define <32 x i8> @test9(<32 x i8> %a) nounwind { 156 ; SSSE3-LABEL: test9: 157 ; SSSE3: pabsb 158 ; SSSE3: pabsb 159 ; SSSE3-NEXT: ret 160 161 ; AVX2-LABEL: test9: 162 ; AVX2: vpabsb {{.*}}%ymm 163 ; AVX2-NEXT: ret 164 %tmp1neg = sub <32 x i8> zeroinitializer, %a 165 %b = icmp slt <32 x i8> %a, zeroinitializer 166 %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a 167 ret <32 x i8> %abs 168 } 169 170 define <8 x i32> @test10(<8 x i32> %a) nounwind { 171 ; SSSE3-LABEL: test10: 172 ; SSSE3: pabsd 173 ; SSSE3: pabsd 174 ; SSSE3-NEXT: ret 175 176 ; AVX2-LABEL: test10: 177 ; AVX2: vpabsd {{.*}}%ymm 178 ; AVX2-NEXT: ret 179 %tmp1neg = sub <8 x i32> zeroinitializer, %a 180 %b = icmp sle <8 x i32> %a, zeroinitializer 181 %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a 182 ret <8 x i32> %abs 183 } 184