236 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=X644 5;6; AND/XOR/OR i32 as v4i87;8 9define i32 @and_i32_as_v4i8(i32 %a, i32 %b) nounwind {10; X86-LABEL: and_i32_as_v4i8:11; X86: # %bb.0:12; X86-NEXT: movl {{[0-9]+}}(%esp), %eax13; X86-NEXT: andl {{[0-9]+}}(%esp), %eax14; X86-NEXT: retl15;16; X64-LABEL: and_i32_as_v4i8:17; X64: # %bb.0:18; X64-NEXT: movl %edi, %eax19; X64-NEXT: andl %esi, %eax20; X64-NEXT: retq21 %1 = bitcast i32 %a to <4 x i8>22 %2 = bitcast i32 %b to <4 x i8>23 %3 = and <4 x i8> %1, %224 %4 = bitcast <4 x i8> %3 to i3225 ret i32 %426}27 28define i32 @xor_i32_as_v4i8(i32 %a, i32 %b) nounwind {29; X86-LABEL: xor_i32_as_v4i8:30; X86: # %bb.0:31; X86-NEXT: movl {{[0-9]+}}(%esp), %eax32; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax33; X86-NEXT: retl34;35; X64-LABEL: xor_i32_as_v4i8:36; X64: # %bb.0:37; X64-NEXT: movl %edi, %eax38; X64-NEXT: xorl %esi, %eax39; X64-NEXT: retq40 %1 = bitcast i32 %a to <4 x i8>41 %2 = bitcast i32 %b to <4 x i8>42 %3 = xor <4 x i8> %1, %243 %4 = bitcast <4 x i8> %3 to i3244 ret i32 %445}46 47define i32 @or_i32_as_v4i8(i32 %a, i32 %b) nounwind {48; X86-LABEL: or_i32_as_v4i8:49; X86: # %bb.0:50; X86-NEXT: movl {{[0-9]+}}(%esp), %eax51; X86-NEXT: orl {{[0-9]+}}(%esp), %eax52; X86-NEXT: retl53;54; X64-LABEL: or_i32_as_v4i8:55; X64: # %bb.0:56; X64-NEXT: movl %edi, %eax57; X64-NEXT: orl %esi, %eax58; X64-NEXT: retq59 %1 = bitcast i32 %a to <4 x i8>60 %2 = bitcast i32 %b to <4 x i8>61 %3 = or <4 x i8> %1, %262 %4 = bitcast <4 x i8> %3 to i3263 ret i32 %464}65 66;67; AND/XOR/OR i32 as v8i468;69 70define i32 @and_i32_as_v8i4(i32 %a, i32 %b) nounwind {71; X86-LABEL: and_i32_as_v8i4:72; X86: # %bb.0:73; X86-NEXT: movl {{[0-9]+}}(%esp), %eax74; X86-NEXT: andl {{[0-9]+}}(%esp), %eax75; X86-NEXT: retl76;77; X64-LABEL: and_i32_as_v8i4:78; X64: # %bb.0:79; X64-NEXT: movl %edi, %eax80; X64-NEXT: andl %esi, %eax81; X64-NEXT: retq82 %1 = bitcast i32 %a to <8 x i4>83 %2 = bitcast i32 %b to <8 x i4>84 %3 = and <8 x i4> %1, %285 %4 = bitcast <8 x i4> %3 to i3286 ret i32 %487}88 89define i32 @xor_i32_as_v8i4(i32 %a, i32 %b) nounwind {90; X86-LABEL: xor_i32_as_v8i4:91; X86: # %bb.0:92; X86-NEXT: movl {{[0-9]+}}(%esp), %eax93; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax94; X86-NEXT: retl95;96; X64-LABEL: xor_i32_as_v8i4:97; X64: # %bb.0:98; X64-NEXT: movl %edi, %eax99; X64-NEXT: xorl %esi, %eax100; X64-NEXT: retq101 %1 = bitcast i32 %a to <8 x i4>102 %2 = bitcast i32 %b to <8 x i4>103 %3 = xor <8 x i4> %1, %2104 %4 = bitcast <8 x i4> %3 to i32105 ret i32 %4106}107 108define i32 @or_i32_as_v8i4(i32 %a, i32 %b) nounwind {109; X86-LABEL: or_i32_as_v8i4:110; X86: # %bb.0:111; X86-NEXT: movl {{[0-9]+}}(%esp), %eax112; X86-NEXT: orl {{[0-9]+}}(%esp), %eax113; X86-NEXT: retl114;115; X64-LABEL: or_i32_as_v8i4:116; X64: # %bb.0:117; X64-NEXT: movl %edi, %eax118; X64-NEXT: orl %esi, %eax119; X64-NEXT: retq120 %1 = bitcast i32 %a to <8 x i4>121 %2 = bitcast i32 %b to <8 x i4>122 %3 = or <8 x i4> %1, %2123 %4 = bitcast <8 x i4> %3 to i32124 ret i32 %4125}126 127;128; AND/XOR/OR v4i8 as i32129;130 131define <4 x i8> @and_v4i8_as_i32(<4 x i8> %a, <4 x i8> %b) nounwind {132; X86-LABEL: and_v4i8_as_i32:133; X86: # %bb.0:134; X86-NEXT: andps %xmm1, %xmm0135; X86-NEXT: retl136;137; X64-LABEL: and_v4i8_as_i32:138; X64: # %bb.0:139; X64-NEXT: andps %xmm1, %xmm0140; X64-NEXT: retq141 %1 = bitcast <4 x i8> %a to i32142 %2 = bitcast <4 x i8> %b to i32143 %3 = and i32 %1, %2144 %4 = bitcast i32 %3 to <4 x i8>145 ret <4 x i8> %4146}147 148define <4 x i8> @xor_v4i8_as_i32(<4 x i8> %a, <4 x i8> %b) nounwind {149; X86-LABEL: xor_v4i8_as_i32:150; X86: # %bb.0:151; X86-NEXT: xorps %xmm1, %xmm0152; X86-NEXT: retl153;154; X64-LABEL: xor_v4i8_as_i32:155; X64: # %bb.0:156; X64-NEXT: xorps %xmm1, %xmm0157; X64-NEXT: retq158 %1 = bitcast <4 x i8> %a to i32159 %2 = bitcast <4 x i8> %b to i32160 %3 = xor i32 %1, %2161 %4 = bitcast i32 %3 to <4 x i8>162 ret <4 x i8> %4163}164 165define <4 x i8> @or_v4i8_as_i32(<4 x i8> %a, <4 x i8> %b) nounwind {166; X86-LABEL: or_v4i8_as_i32:167; X86: # %bb.0:168; X86-NEXT: orps %xmm1, %xmm0169; X86-NEXT: retl170;171; X64-LABEL: or_v4i8_as_i32:172; X64: # %bb.0:173; X64-NEXT: orps %xmm1, %xmm0174; X64-NEXT: retq175 %1 = bitcast <4 x i8> %a to i32176 %2 = bitcast <4 x i8> %b to i32177 %3 = or i32 %1, %2178 %4 = bitcast i32 %3 to <4 x i8>179 ret <4 x i8> %4180}181 182;183; AND/XOR/OR v8i4 as i32184;185 186define <8 x i4> @and_v8i4_as_i32(<8 x i4> %a, <8 x i4> %b) nounwind {187; X86-LABEL: and_v8i4_as_i32:188; X86: # %bb.0:189; X86-NEXT: andps %xmm1, %xmm0190; X86-NEXT: retl191;192; X64-LABEL: and_v8i4_as_i32:193; X64: # %bb.0:194; X64-NEXT: andps %xmm1, %xmm0195; X64-NEXT: retq196 %1 = bitcast <8 x i4> %a to i32197 %2 = bitcast <8 x i4> %b to i32198 %3 = and i32 %1, %2199 %4 = bitcast i32 %3 to <8 x i4>200 ret <8 x i4> %4201}202 203define <8 x i4> @xor_v8i4_as_i32(<8 x i4> %a, <8 x i4> %b) nounwind {204; X86-LABEL: xor_v8i4_as_i32:205; X86: # %bb.0:206; X86-NEXT: xorps %xmm1, %xmm0207; X86-NEXT: retl208;209; X64-LABEL: xor_v8i4_as_i32:210; X64: # %bb.0:211; X64-NEXT: xorps %xmm1, %xmm0212; X64-NEXT: retq213 %1 = bitcast <8 x i4> %a to i32214 %2 = bitcast <8 x i4> %b to i32215 %3 = xor i32 %1, %2216 %4 = bitcast i32 %3 to <8 x i4>217 ret <8 x i4> %4218}219 220define <8 x i4> @or_v8i4_as_i32(<8 x i4> %a, <8 x i4> %b) nounwind {221; X86-LABEL: or_v8i4_as_i32:222; X86: # %bb.0:223; X86-NEXT: orps %xmm1, %xmm0224; X86-NEXT: retl225;226; X64-LABEL: or_v8i4_as_i32:227; X64: # %bb.0:228; X64-NEXT: orps %xmm1, %xmm0229; X64-NEXT: retq230 %1 = bitcast <8 x i4> %a to i32231 %2 = bitcast <8 x i4> %b to i32232 %3 = or i32 %1, %2233 %4 = bitcast i32 %3 to <8 x i4>234 ret <8 x i4> %4235}236