558 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -o - -mtriple=x86_64-apple-darwin -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE23; RUN: llc < %s -o - -mtriple=x86_64-apple-darwin -mattr=+sse4.2 | FileCheck %s --check-prefixes=CHECK,SSE414 5; For a setult against a constant, turn it into a setule and lower via psubusw.6 7define void @loop_no_const_reload(ptr %in, ptr %out, i32 %n) {8; SSE2-LABEL: loop_no_const_reload:9; SSE2: ## %bb.0: ## %entry10; SSE2-NEXT: testl %edx, %edx11; SSE2-NEXT: je LBB0_312; SSE2-NEXT: ## %bb.1: ## %for.body.preheader13; SSE2-NEXT: xorl %eax, %eax14; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [25,25,25,25,25,25,25,25]15; SSE2-NEXT: pxor %xmm1, %xmm116; SSE2-NEXT: .p2align 417; SSE2-NEXT: LBB0_2: ## %for.body18; SSE2-NEXT: ## =>This Inner Loop Header: Depth=119; SSE2-NEXT: movdqa (%rdi,%rax), %xmm220; SSE2-NEXT: psubusw %xmm0, %xmm221; SSE2-NEXT: pcmpeqw %xmm1, %xmm222; SSE2-NEXT: movdqa %xmm2, (%rsi,%rax)23; SSE2-NEXT: addq $16, %rax24; SSE2-NEXT: decl %edx25; SSE2-NEXT: jne LBB0_226; SSE2-NEXT: LBB0_3: ## %for.end27; SSE2-NEXT: retq28;29; SSE41-LABEL: loop_no_const_reload:30; SSE41: ## %bb.0: ## %entry31; SSE41-NEXT: testl %edx, %edx32; SSE41-NEXT: je LBB0_333; SSE41-NEXT: ## %bb.1: ## %for.body.preheader34; SSE41-NEXT: xorl %eax, %eax35; SSE41-NEXT: pmovsxbw {{.*#+}} xmm0 = [25,25,25,25,25,25,25,25]36; SSE41-NEXT: .p2align 437; SSE41-NEXT: LBB0_2: ## %for.body38; SSE41-NEXT: ## =>This Inner Loop Header: Depth=139; SSE41-NEXT: movdqa (%rdi,%rax), %xmm140; SSE41-NEXT: movdqa %xmm1, %xmm241; SSE41-NEXT: pminuw %xmm0, %xmm242; SSE41-NEXT: pcmpeqw %xmm1, %xmm243; SSE41-NEXT: movdqa %xmm2, (%rsi,%rax)44; SSE41-NEXT: addq $16, %rax45; SSE41-NEXT: decl %edx46; SSE41-NEXT: jne LBB0_247; SSE41-NEXT: LBB0_3: ## %for.end48; SSE41-NEXT: retq49entry:50 %cmp9 = icmp eq i32 %n, 051 br i1 %cmp9, label %for.end, label %for.body52 53for.body: ; preds = %for.body, %entry54 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]55 %arrayidx1 = getelementptr inbounds <2 x i64>, ptr %in, i64 %indvars.iv56 %arrayidx1.val = load <2 x i64>, ptr %arrayidx1, align 1657 %0 = bitcast <2 x i64> %arrayidx1.val to <8 x i16>58 %cmp.i.i = icmp ult <8 x i16> %0, <i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26>59 %sext.i.i = sext <8 x i1> %cmp.i.i to <8 x i16>60 %1 = bitcast <8 x i16> %sext.i.i to <2 x i64>61 %arrayidx5 = getelementptr inbounds <2 x i64>, ptr %out, i64 %indvars.iv62 store <2 x i64> %1, ptr %arrayidx5, align 1663 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 164 %lftr.wideiv = trunc i64 %indvars.iv.next to i3265 %exitcond = icmp eq i32 %lftr.wideiv, %n66 br i1 %exitcond, label %for.end, label %for.body67 68for.end: ; preds = %for.body, %entry69 ret void70}71 72; Be careful if decrementing the constant would undeflow.73 74define void @loop_const_folding_underflow(ptr %in, ptr %out, i32 %n) {75; SSE2-LABEL: loop_const_folding_underflow:76; SSE2: ## %bb.0: ## %entry77; SSE2-NEXT: testl %edx, %edx78; SSE2-NEXT: je LBB1_379; SSE2-NEXT: ## %bb.1: ## %for.body.preheader80; SSE2-NEXT: xorl %eax, %eax81; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [32768,32768,32768,32768,32768,32768,32768,32768]82; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [32768,32794,32794,32794,32794,32794,32794,32794]83; SSE2-NEXT: .p2align 484; SSE2-NEXT: LBB1_2: ## %for.body85; SSE2-NEXT: ## =>This Inner Loop Header: Depth=186; SSE2-NEXT: movdqa (%rdi,%rax), %xmm287; SSE2-NEXT: pxor %xmm0, %xmm288; SSE2-NEXT: movdqa %xmm1, %xmm389; SSE2-NEXT: pcmpgtw %xmm2, %xmm390; SSE2-NEXT: movdqa %xmm3, (%rsi,%rax)91; SSE2-NEXT: addq $16, %rax92; SSE2-NEXT: decl %edx93; SSE2-NEXT: jne LBB1_294; SSE2-NEXT: LBB1_3: ## %for.end95; SSE2-NEXT: retq96;97; SSE41-LABEL: loop_const_folding_underflow:98; SSE41: ## %bb.0: ## %entry99; SSE41-NEXT: testl %edx, %edx100; SSE41-NEXT: je LBB1_3101; SSE41-NEXT: ## %bb.1: ## %for.body.preheader102; SSE41-NEXT: xorl %eax, %eax103; SSE41-NEXT: pmovsxbw {{.*#+}} xmm0 = [0,26,26,26,26,26,26,26]104; SSE41-NEXT: pcmpeqd %xmm1, %xmm1105; SSE41-NEXT: .p2align 4106; SSE41-NEXT: LBB1_2: ## %for.body107; SSE41-NEXT: ## =>This Inner Loop Header: Depth=1108; SSE41-NEXT: movdqa (%rdi,%rax), %xmm2109; SSE41-NEXT: movdqa %xmm2, %xmm3110; SSE41-NEXT: pmaxuw %xmm0, %xmm3111; SSE41-NEXT: pcmpeqw %xmm2, %xmm3112; SSE41-NEXT: pxor %xmm1, %xmm3113; SSE41-NEXT: movdqa %xmm3, (%rsi,%rax)114; SSE41-NEXT: addq $16, %rax115; SSE41-NEXT: decl %edx116; SSE41-NEXT: jne LBB1_2117; SSE41-NEXT: LBB1_3: ## %for.end118; SSE41-NEXT: retq119entry:120 %cmp9 = icmp eq i32 %n, 0121 br i1 %cmp9, label %for.end, label %for.body122 123for.body: ; preds = %for.body, %entry124 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]125 %arrayidx1 = getelementptr inbounds <2 x i64>, ptr %in, i64 %indvars.iv126 %arrayidx1.val = load <2 x i64>, ptr %arrayidx1, align 16127 %0 = bitcast <2 x i64> %arrayidx1.val to <8 x i16>128 %cmp.i.i = icmp ult <8 x i16> %0, <i16 0, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26>129 %sext.i.i = sext <8 x i1> %cmp.i.i to <8 x i16>130 %1 = bitcast <8 x i16> %sext.i.i to <2 x i64>131 %arrayidx5 = getelementptr inbounds <2 x i64>, ptr %out, i64 %indvars.iv132 store <2 x i64> %1, ptr %arrayidx5, align 16133 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1134 %lftr.wideiv = trunc i64 %indvars.iv.next to i32135 %exitcond = icmp eq i32 %lftr.wideiv, %n136 br i1 %exitcond, label %for.end, label %for.body137 138for.end: ; preds = %for.body, %entry139 ret void140}141 142; Test for PSUBUSB143 144define <16 x i8> @test_ult_byte(<16 x i8> %a) {145; CHECK-LABEL: test_ult_byte:146; CHECK: ## %bb.0: ## %entry147; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]148; CHECK-NEXT: pminub %xmm0, %xmm1149; CHECK-NEXT: pcmpeqb %xmm1, %xmm0150; CHECK-NEXT: retq151entry:152 %icmp = icmp ult <16 x i8> %a, <i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11, i8 11>153 %sext = sext <16 x i1> %icmp to <16 x i8>154 ret <16 x i8> %sext155}156 157; Only do this when we can turn the comparison into a setule. I.e. not for158; register operands.159 160define <8 x i16> @test_ult_register(<8 x i16> %a, <8 x i16> %b) {161; SSE2-LABEL: test_ult_register:162; SSE2: ## %bb.0: ## %entry163; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]164; SSE2-NEXT: pxor %xmm2, %xmm0165; SSE2-NEXT: pxor %xmm1, %xmm2166; SSE2-NEXT: pcmpgtw %xmm0, %xmm2167; SSE2-NEXT: movdqa %xmm2, %xmm0168; SSE2-NEXT: retq169;170; SSE41-LABEL: test_ult_register:171; SSE41: ## %bb.0: ## %entry172; SSE41-NEXT: pmaxuw %xmm0, %xmm1173; SSE41-NEXT: pcmpeqw %xmm1, %xmm0174; SSE41-NEXT: pcmpeqd %xmm1, %xmm1175; SSE41-NEXT: pxor %xmm1, %xmm0176; SSE41-NEXT: retq177entry:178 %icmp = icmp ult <8 x i16> %a, %b179 %sext = sext <8 x i1> %icmp to <8 x i16>180 ret <8 x i16> %sext181}182 183define <16 x i1> @ugt_v16i8_splat(<16 x i8> %x) {184; CHECK-LABEL: ugt_v16i8_splat:185; CHECK: ## %bb.0:186; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43]187; CHECK-NEXT: pmaxub %xmm0, %xmm1188; CHECK-NEXT: pcmpeqb %xmm1, %xmm0189; CHECK-NEXT: retq190 %cmp = icmp ugt <16 x i8> %x, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>191 ret <16 x i1> %cmp192}193 194define <8 x i1> @ugt_v8i16_splat(<8 x i16> %x) {195; SSE2-LABEL: ugt_v8i16_splat:196; SSE2: ## %bb.0:197; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [243,243,243,243,243,243,243,243]198; SSE2-NEXT: psubusw %xmm0, %xmm1199; SSE2-NEXT: pxor %xmm0, %xmm0200; SSE2-NEXT: pcmpeqw %xmm1, %xmm0201; SSE2-NEXT: retq202;203; SSE41-LABEL: ugt_v8i16_splat:204; SSE41: ## %bb.0:205; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [243,243,243,243,243,243,243,243]206; SSE41-NEXT: pmaxuw %xmm0, %xmm1207; SSE41-NEXT: pcmpeqw %xmm1, %xmm0208; SSE41-NEXT: retq209 %cmp = icmp ugt <8 x i16> %x, <i16 242, i16 242, i16 242, i16 242, i16 242, i16 242, i16 242, i16 242>210 ret <8 x i1> %cmp211}212 213define <4 x i1> @ugt_v4i32_splat(<4 x i32> %x) {214; SSE2-LABEL: ugt_v4i32_splat:215; SSE2: ## %bb.0:216; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0217; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0218; SSE2-NEXT: retq219;220; SSE41-LABEL: ugt_v4i32_splat:221; SSE41: ## %bb.0:222; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [4294967255,4294967255,4294967255,4294967255]223; SSE41-NEXT: pmaxud %xmm0, %xmm1224; SSE41-NEXT: pcmpeqd %xmm1, %xmm0225; SSE41-NEXT: retq226 %cmp = icmp ugt <4 x i32> %x, <i32 -42, i32 -42, i32 -42, i32 -42>227 ret <4 x i1> %cmp228}229 230define <2 x i1> @ugt_v2i64_splat(<2 x i64> %x) {231; SSE2-LABEL: ugt_v2i64_splat:232; SSE2: ## %bb.0:233; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0234; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]235; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0236; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]237; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1238; SSE2-NEXT: pand %xmm2, %xmm1239; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]240; SSE2-NEXT: por %xmm1, %xmm0241; SSE2-NEXT: retq242;243; SSE41-LABEL: ugt_v2i64_splat:244; SSE41: ## %bb.0:245; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0246; SSE41-NEXT: pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0247; SSE41-NEXT: retq248 %cmp = icmp ugt <2 x i64> %x, <i64 442, i64 442>249 ret <2 x i1> %cmp250}251 252define <16 x i1> @uge_v16i8_splat(<16 x i8> %x) {253; CHECK-LABEL: uge_v16i8_splat:254; CHECK: ## %bb.0:255; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42]256; CHECK-NEXT: pmaxub %xmm0, %xmm1257; CHECK-NEXT: pcmpeqb %xmm1, %xmm0258; CHECK-NEXT: retq259 %cmp = icmp uge <16 x i8> %x, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>260 ret <16 x i1> %cmp261}262 263define <8 x i1> @uge_v8i16_splat(<8 x i16> %x) {264; SSE2-LABEL: uge_v8i16_splat:265; SSE2: ## %bb.0:266; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [242,242,242,242,242,242,242,242]267; SSE2-NEXT: psubusw %xmm0, %xmm1268; SSE2-NEXT: pxor %xmm0, %xmm0269; SSE2-NEXT: pcmpeqw %xmm1, %xmm0270; SSE2-NEXT: retq271;272; SSE41-LABEL: uge_v8i16_splat:273; SSE41: ## %bb.0:274; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [242,242,242,242,242,242,242,242]275; SSE41-NEXT: pmaxuw %xmm0, %xmm1276; SSE41-NEXT: pcmpeqw %xmm1, %xmm0277; SSE41-NEXT: retq278 %cmp = icmp uge <8 x i16> %x, <i16 242, i16 242, i16 242, i16 242, i16 242, i16 242, i16 242, i16 242>279 ret <8 x i1> %cmp280}281 282define <4 x i1> @uge_v4i32_splat(<4 x i32> %x) {283; SSE2-LABEL: uge_v4i32_splat:284; SSE2: ## %bb.0:285; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0286; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483606,2147483606,2147483606,2147483606]287; SSE2-NEXT: pcmpgtd %xmm0, %xmm1288; SSE2-NEXT: pcmpeqd %xmm0, %xmm0289; SSE2-NEXT: pxor %xmm1, %xmm0290; SSE2-NEXT: retq291;292; SSE41-LABEL: uge_v4i32_splat:293; SSE41: ## %bb.0:294; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [4294967254,4294967254,4294967254,4294967254]295; SSE41-NEXT: pmaxud %xmm0, %xmm1296; SSE41-NEXT: pcmpeqd %xmm1, %xmm0297; SSE41-NEXT: retq298 %cmp = icmp uge <4 x i32> %x, <i32 -42, i32 -42, i32 -42, i32 -42>299 ret <4 x i1> %cmp300}301 302define <2 x i1> @uge_v2i64_splat(<2 x i64> %x) {303; SSE2-LABEL: uge_v2i64_splat:304; SSE2: ## %bb.0:305; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0306; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]307; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1308; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]309; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2310; SSE2-NEXT: pandn %xmm1, %xmm2311; SSE2-NEXT: pcmpeqd %xmm0, %xmm0312; SSE2-NEXT: pxor %xmm2, %xmm0313; SSE2-NEXT: retq314;315; SSE41-LABEL: uge_v2i64_splat:316; SSE41: ## %bb.0:317; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0318; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [9223372036854776250,9223372036854776250]319; SSE41-NEXT: pcmpgtq %xmm0, %xmm1320; SSE41-NEXT: pcmpeqd %xmm0, %xmm0321; SSE41-NEXT: pxor %xmm1, %xmm0322; SSE41-NEXT: retq323 %cmp = icmp uge <2 x i64> %x, <i64 442, i64 442>324 ret <2 x i1> %cmp325}326 327define <16 x i1> @ult_v16i8_splat(<16 x i8> %x) {328; CHECK-LABEL: ult_v16i8_splat:329; CHECK: ## %bb.0:330; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41]331; CHECK-NEXT: pminub %xmm0, %xmm1332; CHECK-NEXT: pcmpeqb %xmm1, %xmm0333; CHECK-NEXT: retq334 %cmp = icmp ult <16 x i8> %x, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>335 ret <16 x i1> %cmp336}337 338define <8 x i1> @ult_v8i16_splat(<8 x i16> %x) {339; SSE2-LABEL: ult_v8i16_splat:340; SSE2: ## %bb.0:341; SSE2-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0342; SSE2-NEXT: pxor %xmm1, %xmm1343; SSE2-NEXT: pcmpeqw %xmm1, %xmm0344; SSE2-NEXT: retq345;346; SSE41-LABEL: ult_v8i16_splat:347; SSE41: ## %bb.0:348; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [241,241,241,241,241,241,241,241]349; SSE41-NEXT: pminuw %xmm0, %xmm1350; SSE41-NEXT: pcmpeqw %xmm1, %xmm0351; SSE41-NEXT: retq352 %cmp = icmp ult <8 x i16> %x, <i16 242, i16 242, i16 242, i16 242, i16 242, i16 242, i16 242, i16 242>353 ret <8 x i1> %cmp354}355 356define <4 x i1> @ult_v4i32_splat(<4 x i32> %x) {357; SSE2-LABEL: ult_v4i32_splat:358; SSE2: ## %bb.0:359; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0360; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483606,2147483606,2147483606,2147483606]361; SSE2-NEXT: pcmpgtd %xmm0, %xmm1362; SSE2-NEXT: movdqa %xmm1, %xmm0363; SSE2-NEXT: retq364;365; SSE41-LABEL: ult_v4i32_splat:366; SSE41: ## %bb.0:367; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [4294967253,4294967253,4294967253,4294967253]368; SSE41-NEXT: pminud %xmm0, %xmm1369; SSE41-NEXT: pcmpeqd %xmm1, %xmm0370; SSE41-NEXT: retq371 %cmp = icmp ult <4 x i32> %x, <i32 -42, i32 -42, i32 -42, i32 -42>372 ret <4 x i1> %cmp373}374 375define <2 x i1> @ult_v2i64_splat(<2 x i64> %x) {376; SSE2-LABEL: ult_v2i64_splat:377; SSE2: ## %bb.0:378; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0379; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]380; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1381; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,2,2]382; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0383; SSE2-NEXT: pandn %xmm1, %xmm0384; SSE2-NEXT: retq385;386; SSE41-LABEL: ult_v2i64_splat:387; SSE41: ## %bb.0:388; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0389; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [9223372036854776250,9223372036854776250]390; SSE41-NEXT: pcmpgtq %xmm0, %xmm1391; SSE41-NEXT: movdqa %xmm1, %xmm0392; SSE41-NEXT: retq393 %cmp = icmp ult <2 x i64> %x, <i64 442, i64 442>394 ret <2 x i1> %cmp395}396 397define <16 x i1> @ule_v16i8_splat(<16 x i8> %x) {398; CHECK-LABEL: ule_v16i8_splat:399; CHECK: ## %bb.0:400; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42]401; CHECK-NEXT: pminub %xmm0, %xmm1402; CHECK-NEXT: pcmpeqb %xmm1, %xmm0403; CHECK-NEXT: retq404 %cmp = icmp ule <16 x i8> %x, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>405 ret <16 x i1> %cmp406}407 408define <8 x i1> @ule_v8i16_splat(<8 x i16> %x) {409; SSE2-LABEL: ule_v8i16_splat:410; SSE2: ## %bb.0:411; SSE2-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0412; SSE2-NEXT: pxor %xmm1, %xmm1413; SSE2-NEXT: pcmpeqw %xmm1, %xmm0414; SSE2-NEXT: retq415;416; SSE41-LABEL: ule_v8i16_splat:417; SSE41: ## %bb.0:418; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [242,242,242,242,242,242,242,242]419; SSE41-NEXT: pminuw %xmm0, %xmm1420; SSE41-NEXT: pcmpeqw %xmm1, %xmm0421; SSE41-NEXT: retq422 %cmp = icmp ule <8 x i16> %x, <i16 242, i16 242, i16 242, i16 242, i16 242, i16 242, i16 242, i16 242>423 ret <8 x i1> %cmp424}425 426define <4 x i1> @ule_v4i32_splat(<4 x i32> %x) {427; SSE2-LABEL: ule_v4i32_splat:428; SSE2: ## %bb.0:429; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0430; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0431; SSE2-NEXT: pcmpeqd %xmm1, %xmm1432; SSE2-NEXT: pxor %xmm1, %xmm0433; SSE2-NEXT: retq434;435; SSE41-LABEL: ule_v4i32_splat:436; SSE41: ## %bb.0:437; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [4294967254,4294967254,4294967254,4294967254]438; SSE41-NEXT: pminud %xmm0, %xmm1439; SSE41-NEXT: pcmpeqd %xmm1, %xmm0440; SSE41-NEXT: retq441 %cmp = icmp ule <4 x i32> %x, <i32 -42, i32 -42, i32 -42, i32 -42>442 ret <4 x i1> %cmp443}444 445define <2 x i1> @ule_v2i64_splat(<2 x i64> %x) {446; SSE2-LABEL: ule_v2i64_splat:447; SSE2: ## %bb.0:448; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0449; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]450; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0451; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]452; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1453; SSE2-NEXT: pand %xmm2, %xmm1454; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]455; SSE2-NEXT: por %xmm1, %xmm2456; SSE2-NEXT: pcmpeqd %xmm0, %xmm0457; SSE2-NEXT: pxor %xmm2, %xmm0458; SSE2-NEXT: retq459;460; SSE41-LABEL: ule_v2i64_splat:461; SSE41: ## %bb.0:462; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0463; SSE41-NEXT: pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0464; SSE41-NEXT: pcmpeqd %xmm1, %xmm1465; SSE41-NEXT: pxor %xmm1, %xmm0466; SSE41-NEXT: retq467 %cmp = icmp ule <2 x i64> %x, <i64 442, i64 442>468 ret <2 x i1> %cmp469}470 471; This should be simplified before we reach lowering, but472; make sure that we are not getting it wrong by underflowing.473 474define <4 x i1> @ult_v4i32_splat_0_simplify(<4 x i32> %x) {475; CHECK-LABEL: ult_v4i32_splat_0_simplify:476; CHECK: ## %bb.0:477; CHECK-NEXT: xorps %xmm0, %xmm0478; CHECK-NEXT: retq479 %cmp = icmp ult <4 x i32> %x, <i32 0, i32 0, i32 0, i32 0>480 ret <4 x i1> %cmp481}482 483; This should be simplified before we reach lowering, but484; make sure that we are not getting it wrong by overflowing.485 486define <4 x i1> @ugt_v4i32_splat_maxval_simplify(<4 x i32> %x) {487; CHECK-LABEL: ugt_v4i32_splat_maxval_simplify:488; CHECK: ## %bb.0:489; CHECK-NEXT: xorps %xmm0, %xmm0490; CHECK-NEXT: retq491 %cmp = icmp ugt <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>492 ret <4 x i1> %cmp493}494 495define <4 x i1> @ugt_v4i32_nonsplat(<4 x i32> %x) {496; SSE2-LABEL: ugt_v4i32_nonsplat:497; SSE2: ## %bb.0:498; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0499; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0500; SSE2-NEXT: retq501;502; SSE41-LABEL: ugt_v4i32_nonsplat:503; SSE41: ## %bb.0:504; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [4294967254,4294967255,4294967256,4294967257]505; SSE41-NEXT: pmaxud %xmm0, %xmm1506; SSE41-NEXT: pcmpeqd %xmm1, %xmm0507; SSE41-NEXT: retq508 %cmp = icmp ugt <4 x i32> %x, <i32 -43, i32 -42, i32 -41, i32 -40>509 ret <4 x i1> %cmp510}511 512define <4 x i1> @ugt_v4i32_splat_commute(<4 x i32> %x) {513; SSE2-LABEL: ugt_v4i32_splat_commute:514; SSE2: ## %bb.0:515; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0516; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483652,2147483652,2147483652,2147483652]517; SSE2-NEXT: pcmpgtd %xmm0, %xmm1518; SSE2-NEXT: movdqa %xmm1, %xmm0519; SSE2-NEXT: retq520;521; SSE41-LABEL: ugt_v4i32_splat_commute:522; SSE41: ## %bb.0:523; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [3,3,3,3]524; SSE41-NEXT: pminud %xmm0, %xmm1525; SSE41-NEXT: pcmpeqd %xmm1, %xmm0526; SSE41-NEXT: retq527 %cmp = icmp ugt <4 x i32> <i32 4, i32 4, i32 4, i32 4>, %x528 ret <4 x i1> %cmp529}530 531define <8 x i16> @PR39859(<8 x i16> %x, <8 x i16> %y) {532; SSE2-LABEL: PR39859:533; SSE2: ## %bb.0:534; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [43,43,43,43,43,43,43,43]535; SSE2-NEXT: psubusw %xmm0, %xmm3536; SSE2-NEXT: pxor %xmm2, %xmm2537; SSE2-NEXT: pcmpeqw %xmm3, %xmm2538; SSE2-NEXT: pand %xmm2, %xmm1539; SSE2-NEXT: pandn %xmm0, %xmm2540; SSE2-NEXT: por %xmm1, %xmm2541; SSE2-NEXT: movdqa %xmm2, %xmm0542; SSE2-NEXT: retq543;544; SSE41-LABEL: PR39859:545; SSE41: ## %bb.0:546; SSE41-NEXT: movdqa %xmm0, %xmm2547; SSE41-NEXT: pmovsxbw {{.*#+}} xmm0 = [43,43,43,43,43,43,43,43]548; SSE41-NEXT: pmaxuw %xmm2, %xmm0549; SSE41-NEXT: pcmpeqw %xmm2, %xmm0550; SSE41-NEXT: pblendvb %xmm0, %xmm1, %xmm2551; SSE41-NEXT: movdqa %xmm2, %xmm0552; SSE41-NEXT: retq553 %cmp = icmp ugt <8 x i16> %x, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>554 %sel = select <8 x i1> %cmp, <8 x i16> %y, <8 x i16> %x555 ret <8 x i16> %sel556}557 558