1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s 3 4define <8 x i32> @cmp00(<8 x float> %a, <8 x float> %b) nounwind { 5; CHECK-LABEL: cmp00: 6; CHECK: # %bb.0: 7; CHECK-NEXT: vcmpltps %ymm1, %ymm0, %ymm0 8; CHECK-NEXT: retq 9 %bincmp = fcmp olt <8 x float> %a, %b 10 %s = sext <8 x i1> %bincmp to <8 x i32> 11 ret <8 x i32> %s 12} 13 14define <4 x i64> @cmp01(<4 x double> %a, <4 x double> %b) nounwind { 15; CHECK-LABEL: cmp01: 16; CHECK: # %bb.0: 17; CHECK-NEXT: vcmpltpd %ymm1, %ymm0, %ymm0 18; CHECK-NEXT: retq 19 %bincmp = fcmp olt <4 x double> %a, %b 20 %s = sext <4 x i1> %bincmp to <4 x i64> 21 ret <4 x i64> %s 22} 23 24declare void @scale() nounwind 25 26define void @render(double %a0) nounwind { 27; CHECK-LABEL: render: 28; CHECK: # %bb.0: # %entry 29; CHECK-NEXT: pushq %rbp 30; CHECK-NEXT: pushq %rbx 31; CHECK-NEXT: pushq %rax 32; CHECK-NEXT: vmovsd %xmm0, (%rsp) # 8-byte Spill 33; CHECK-NEXT: xorl %eax, %eax 34; CHECK-NEXT: testb %al, %al 35; CHECK-NEXT: jne .LBB2_6 36; CHECK-NEXT: # %bb.1: # %for.cond5.preheader 37; CHECK-NEXT: xorl %ebx, %ebx 38; CHECK-NEXT: movb $1, %bpl 39; CHECK-NEXT: .p2align 4, 0x90 40; CHECK-NEXT: .LBB2_2: # %for.cond5 41; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 42; CHECK-NEXT: testb %bl, %bl 43; CHECK-NEXT: jne .LBB2_2 44; CHECK-NEXT: # %bb.3: # %for.cond5 45; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1 46; CHECK-NEXT: testb %bpl, %bpl 47; CHECK-NEXT: jne .LBB2_2 48; CHECK-NEXT: # %bb.4: # %for.body33.preheader 49; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1 50; CHECK-NEXT: vmovsd (%rsp), %xmm0 # 8-byte Reload 51; CHECK-NEXT: # xmm0 = mem[0],zero 52; CHECK-NEXT: vucomisd {{\.LCPI.*}}, %xmm0 53; CHECK-NEXT: jne .LBB2_5 54; CHECK-NEXT: jnp .LBB2_2 55; CHECK-NEXT: .LBB2_5: # %if.then 56; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1 57; CHECK-NEXT: callq scale 58; CHECK-NEXT: jmp .LBB2_2 59; CHECK-NEXT: .LBB2_6: # %for.end52 60; CHECK-NEXT: addq $8, %rsp 61; CHECK-NEXT: popq %rbx 62; CHECK-NEXT: popq %rbp 63; CHECK-NEXT: retq 64entry: 65 br i1 undef, label %for.cond5, label %for.end52 66 67for.cond5: 68 %or.cond = and i1 undef, false 69 br i1 %or.cond, label %for.body33, label %for.cond5 70 71for.cond30: 72 br i1 false, label %for.body33, label %for.cond5 73 74for.body33: 75 %tobool = fcmp une double %a0, 0.000000e+00 76 br i1 %tobool, label %if.then, label %for.cond30 77 78if.then: 79 call void @scale() 80 br label %for.cond30 81 82for.end52: 83 ret void 84} 85 86define <8 x i32> @int256_cmp(<8 x i32> %i, <8 x i32> %j) nounwind { 87; CHECK-LABEL: int256_cmp: 88; CHECK: # %bb.0: 89; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm2 90; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm3 91; CHECK-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2 92; CHECK-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0 93; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 94; CHECK-NEXT: retq 95 %bincmp = icmp slt <8 x i32> %i, %j 96 %x = sext <8 x i1> %bincmp to <8 x i32> 97 ret <8 x i32> %x 98} 99 100define <4 x i64> @v4i64_cmp(<4 x i64> %i, <4 x i64> %j) nounwind { 101; CHECK-LABEL: v4i64_cmp: 102; CHECK: # %bb.0: 103; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm2 104; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm3 105; CHECK-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 106; CHECK-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 107; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 108; CHECK-NEXT: retq 109 %bincmp = icmp slt <4 x i64> %i, %j 110 %x = sext <4 x i1> %bincmp to <4 x i64> 111 ret <4 x i64> %x 112} 113 114define <16 x i16> @v16i16_cmp(<16 x i16> %i, <16 x i16> %j) nounwind { 115; CHECK-LABEL: v16i16_cmp: 116; CHECK: # %bb.0: 117; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm2 118; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm3 119; CHECK-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm2 120; CHECK-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0 121; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 122; CHECK-NEXT: retq 123 %bincmp = icmp slt <16 x i16> %i, %j 124 %x = sext <16 x i1> %bincmp to <16 x i16> 125 ret <16 x i16> %x 126} 127 128define <32 x i8> @v32i8_cmp(<32 x i8> %i, <32 x i8> %j) nounwind { 129; CHECK-LABEL: v32i8_cmp: 130; CHECK: # %bb.0: 131; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm2 132; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm3 133; CHECK-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm2 134; CHECK-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0 135; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 136; CHECK-NEXT: retq 137 %bincmp = icmp slt <32 x i8> %i, %j 138 %x = sext <32 x i1> %bincmp to <32 x i8> 139 ret <32 x i8> %x 140} 141 142define <8 x i32> @int256_cmpeq(<8 x i32> %i, <8 x i32> %j) nounwind { 143; CHECK-LABEL: int256_cmpeq: 144; CHECK: # %bb.0: 145; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2 146; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3 147; CHECK-NEXT: vpcmpeqd %xmm2, %xmm3, %xmm2 148; CHECK-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 149; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 150; CHECK-NEXT: retq 151 %bincmp = icmp eq <8 x i32> %i, %j 152 %x = sext <8 x i1> %bincmp to <8 x i32> 153 ret <8 x i32> %x 154} 155 156define <4 x i64> @v4i64_cmpeq(<4 x i64> %i, <4 x i64> %j) nounwind { 157; CHECK-LABEL: v4i64_cmpeq: 158; CHECK: # %bb.0: 159; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2 160; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3 161; CHECK-NEXT: vpcmpeqq %xmm2, %xmm3, %xmm2 162; CHECK-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 163; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 164; CHECK-NEXT: retq 165 %bincmp = icmp eq <4 x i64> %i, %j 166 %x = sext <4 x i1> %bincmp to <4 x i64> 167 ret <4 x i64> %x 168} 169 170define <16 x i16> @v16i16_cmpeq(<16 x i16> %i, <16 x i16> %j) nounwind { 171; CHECK-LABEL: v16i16_cmpeq: 172; CHECK: # %bb.0: 173; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2 174; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3 175; CHECK-NEXT: vpcmpeqw %xmm2, %xmm3, %xmm2 176; CHECK-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 177; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 178; CHECK-NEXT: retq 179 %bincmp = icmp eq <16 x i16> %i, %j 180 %x = sext <16 x i1> %bincmp to <16 x i16> 181 ret <16 x i16> %x 182} 183 184define <32 x i8> @v32i8_cmpeq(<32 x i8> %i, <32 x i8> %j) nounwind { 185; CHECK-LABEL: v32i8_cmpeq: 186; CHECK: # %bb.0: 187; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2 188; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3 189; CHECK-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm2 190; CHECK-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 191; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 192; CHECK-NEXT: retq 193 %bincmp = icmp eq <32 x i8> %i, %j 194 %x = sext <32 x i1> %bincmp to <32 x i8> 195 ret <32 x i8> %x 196} 197 198;; Scalar comparison 199 200define i32 @scalarcmpA(double %a0) uwtable ssp { 201; CHECK-LABEL: scalarcmpA: 202; CHECK: # %bb.0: 203; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1 204; CHECK-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0 205; CHECK-NEXT: vmovq %xmm0, %rax 206; CHECK-NEXT: andl $1, %eax 207; CHECK-NEXT: # kill: def $eax killed $eax killed $rax 208; CHECK-NEXT: retq 209 %cmp29 = fcmp oeq double %a0, 0.000000e+00 210 %res = zext i1 %cmp29 to i32 211 ret i32 %res 212} 213 214define i32 @scalarcmpB(float %a0) uwtable ssp { 215; CHECK-LABEL: scalarcmpB: 216; CHECK: # %bb.0: 217; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 218; CHECK-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0 219; CHECK-NEXT: vmovd %xmm0, %eax 220; CHECK-NEXT: andl $1, %eax 221; CHECK-NEXT: retq 222 %cmp29 = fcmp oeq float %a0, 0.000000e+00 223 %res = zext i1 %cmp29 to i32 224 ret i32 %res 225} 226 227