280 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX7 8define i32 @sad8_32bit_icmp_sge(ptr nocapture readonly %cur, ptr nocapture readonly %ref, i32 %stride) local_unnamed_addr #0 {9; SSE2-LABEL: sad8_32bit_icmp_sge:10; SSE2: # %bb.0: # %entry11; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero12; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero13; SSE2-NEXT: psadbw %xmm0, %xmm114; SSE2-NEXT: movd %xmm1, %eax15; SSE2-NEXT: retq16;17; AVX-LABEL: sad8_32bit_icmp_sge:18; AVX: # %bb.0: # %entry19; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero20; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero21; AVX-NEXT: vpsadbw %xmm1, %xmm0, %xmm022; AVX-NEXT: vmovd %xmm0, %eax23; AVX-NEXT: retq24 25entry:26 %idx.ext = zext i32 %stride to i6427 br label %for.body28 29for.body: ; preds = %entry30 %0 = load <8 x i8>, ptr %cur, align 131 %1 = zext <8 x i8> %0 to <8 x i32>32 %2 = load <8 x i8>, ptr %ref, align 133 %3 = zext <8 x i8> %2 to <8 x i32>34 %4 = sub nsw <8 x i32> %1, %335 %5 = icmp sgt <8 x i32> %4, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>36 %6 = sub nsw <8 x i32> zeroinitializer, %437 %7 = select <8 x i1> %5, <8 x i32> %4, <8 x i32> %638 %rdx.shuf = shufflevector <8 x i32> %7, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>39 %bin.rdx = add <8 x i32> %7, %rdx.shuf40 %rdx.shuf229 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>41 %bin.rdx230 = add <8 x i32> %bin.rdx, %rdx.shuf22942 %rdx.shuf231 = shufflevector <8 x i32> %bin.rdx230, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>43 %bin.rdx232 = add <8 x i32> %bin.rdx230, %rdx.shuf23144 %8 = extractelement <8 x i32> %bin.rdx232, i32 045 ret i32 %846}47 48define i32 @sad8_32bit_icmp_sgt(ptr nocapture readonly %cur, ptr nocapture readonly %ref, i32 %stride) local_unnamed_addr #1 {49; SSE2-LABEL: sad8_32bit_icmp_sgt:50; SSE2: # %bb.0: # %entry51; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero52; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero53; SSE2-NEXT: psadbw %xmm0, %xmm154; SSE2-NEXT: movd %xmm1, %eax55; SSE2-NEXT: retq56;57; AVX-LABEL: sad8_32bit_icmp_sgt:58; AVX: # %bb.0: # %entry59; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero60; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero61; AVX-NEXT: vpsadbw %xmm1, %xmm0, %xmm062; AVX-NEXT: vmovd %xmm0, %eax63; AVX-NEXT: retq64entry:65 %idx.ext = zext i32 %stride to i6466 br label %for.body67 68for.body: ; preds = %entry69 %0 = load <8 x i8>, ptr %cur, align 170 %1 = zext <8 x i8> %0 to <8 x i32>71 %2 = load <8 x i8>, ptr %ref, align 172 %3 = zext <8 x i8> %2 to <8 x i32>73 %4 = sub nsw <8 x i32> %1, %374 %5 = icmp sgt <8 x i32> %4, zeroinitializer75 %6 = sub nsw <8 x i32> zeroinitializer, %476 %7 = select <8 x i1> %5, <8 x i32> %4, <8 x i32> %677 %rdx.shuf = shufflevector <8 x i32> %7, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>78 %bin.rdx = add <8 x i32> %7, %rdx.shuf79 %rdx.shuf229 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>80 %bin.rdx230 = add <8 x i32> %bin.rdx, %rdx.shuf22981 %rdx.shuf231 = shufflevector <8 x i32> %bin.rdx230, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>82 %bin.rdx232 = add <8 x i32> %bin.rdx230, %rdx.shuf23183 %8 = extractelement <8 x i32> %bin.rdx232, i32 084 ret i32 %885}86 87define i32 @sad8_32bit_icmp_sle(ptr nocapture readonly %cur, ptr nocapture readonly %ref, i32 %stride) local_unnamed_addr #2 {88; SSE2-LABEL: sad8_32bit_icmp_sle:89; SSE2: # %bb.0: # %entry90; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero91; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero92; SSE2-NEXT: psadbw %xmm0, %xmm193; SSE2-NEXT: movd %xmm1, %eax94; SSE2-NEXT: retq95;96; AVX-LABEL: sad8_32bit_icmp_sle:97; AVX: # %bb.0: # %entry98; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero99; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero100; AVX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0101; AVX-NEXT: vmovd %xmm0, %eax102; AVX-NEXT: retq103entry:104 %idx.ext = zext i32 %stride to i64105 br label %for.body106 107for.body: ; preds = %entry108 %0 = load <8 x i8>, ptr %cur, align 1109 %1 = zext <8 x i8> %0 to <8 x i32>110 %2 = load <8 x i8>, ptr %ref, align 1111 %3 = zext <8 x i8> %2 to <8 x i32>112 %4 = sub nsw <8 x i32> %1, %3113 %5 = icmp slt <8 x i32> %4, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>114 %6 = sub nsw <8 x i32> zeroinitializer, %4115 %7 = select <8 x i1> %5, <8 x i32> %6, <8 x i32> %4116 %rdx.shuf = shufflevector <8 x i32> %7, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>117 %bin.rdx = add <8 x i32> %7, %rdx.shuf118 %rdx.shuf229 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>119 %bin.rdx230 = add <8 x i32> %bin.rdx, %rdx.shuf229120 %rdx.shuf231 = shufflevector <8 x i32> %bin.rdx230, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>121 %bin.rdx232 = add <8 x i32> %bin.rdx230, %rdx.shuf231122 %8 = extractelement <8 x i32> %bin.rdx232, i32 0123 ret i32 %8124}125 126define i32 @sad8_32bit_icmp_slt(ptr nocapture readonly %cur, ptr nocapture readonly %ref, i32 %stride) local_unnamed_addr #3 {127; SSE2-LABEL: sad8_32bit_icmp_slt:128; SSE2: # %bb.0: # %entry129; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero130; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero131; SSE2-NEXT: psadbw %xmm0, %xmm1132; SSE2-NEXT: movd %xmm1, %eax133; SSE2-NEXT: retq134;135; AVX-LABEL: sad8_32bit_icmp_slt:136; AVX: # %bb.0: # %entry137; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero138; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero139; AVX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0140; AVX-NEXT: vmovd %xmm0, %eax141; AVX-NEXT: retq142entry:143 %idx.ext = zext i32 %stride to i64144 br label %for.body145 146for.body: ; preds = %entry147 %0 = load <8 x i8>, ptr %cur, align 1148 %1 = zext <8 x i8> %0 to <8 x i32>149 %2 = load <8 x i8>, ptr %ref, align 1150 %3 = zext <8 x i8> %2 to <8 x i32>151 %4 = sub nsw <8 x i32> %1, %3152 %5 = icmp slt <8 x i32> %4, zeroinitializer153 %6 = sub nsw <8 x i32> zeroinitializer, %4154 %7 = select <8 x i1> %5, <8 x i32> %6, <8 x i32> %4155 %rdx.shuf = shufflevector <8 x i32> %7, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>156 %bin.rdx = add <8 x i32> %7, %rdx.shuf157 %rdx.shuf229 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>158 %bin.rdx230 = add <8 x i32> %bin.rdx, %rdx.shuf229159 %rdx.shuf231 = shufflevector <8 x i32> %bin.rdx230, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>160 %bin.rdx232 = add <8 x i32> %bin.rdx230, %rdx.shuf231161 %8 = extractelement <8 x i32> %bin.rdx232, i32 0162 ret i32 %8163}164 165define i64 @sad8_64bit_icmp_sext_slt(ptr nocapture readonly %cur, ptr nocapture readonly %ref, i64 %stride) local_unnamed_addr #4 {166; SSE2-LABEL: sad8_64bit_icmp_sext_slt:167; SSE2: # %bb.0: # %entry168; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero169; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero170; SSE2-NEXT: psadbw %xmm0, %xmm1171; SSE2-NEXT: movq %xmm1, %rax172; SSE2-NEXT: retq173;174; AVX-LABEL: sad8_64bit_icmp_sext_slt:175; AVX: # %bb.0: # %entry176; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero177; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero178; AVX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0179; AVX-NEXT: vmovq %xmm0, %rax180; AVX-NEXT: retq181entry:182 br label %for.body183 184for.body: ; preds = %entry185 %0 = load <8 x i8>, ptr %cur, align 1186 %1 = zext <8 x i8> %0 to <8 x i32>187 %2 = load <8 x i8>, ptr %ref, align 1188 %3 = zext <8 x i8> %2 to <8 x i32>189 %4 = sub nsw <8 x i32> %1, %3190 %5 = icmp slt <8 x i32> %4, zeroinitializer191 %6 = sub nsw <8 x i32> zeroinitializer, %4192 %7 = select <8 x i1> %5, <8 x i32> %6, <8 x i32> %4193 %8 = sext <8 x i32> %7 to <8 x i64>194 %rdx.shuf = shufflevector <8 x i64> %8, <8 x i64> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>195 %bin.rdx = add <8 x i64> %rdx.shuf, %8196 %rdx.shuf236 = shufflevector <8 x i64> %bin.rdx, <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>197 %bin.rdx237 = add <8 x i64> %bin.rdx, %rdx.shuf236198 %rdx.shuf238 = shufflevector <8 x i64> %bin.rdx237, <8 x i64> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>199 %bin.rdx239 = add <8 x i64> %bin.rdx237, %rdx.shuf238200 %9 = extractelement <8 x i64> %bin.rdx239, i32 0201 ret i64 %9202}203 204define i64 @sad8_64bit_icmp_zext_slt(ptr nocapture readonly %cur, ptr nocapture readonly %ref, i64 %stride) local_unnamed_addr #4 {205; SSE2-LABEL: sad8_64bit_icmp_zext_slt:206; SSE2: # %bb.0: # %entry207; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero208; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero209; SSE2-NEXT: psadbw %xmm0, %xmm1210; SSE2-NEXT: movq %xmm1, %rax211; SSE2-NEXT: retq212;213; AVX-LABEL: sad8_64bit_icmp_zext_slt:214; AVX: # %bb.0: # %entry215; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero216; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero217; AVX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0218; AVX-NEXT: vmovq %xmm0, %rax219; AVX-NEXT: retq220entry:221 br label %for.body222 223for.body: ; preds = %entry224 %0 = load <8 x i8>, ptr %cur, align 1225 %1 = zext <8 x i8> %0 to <8 x i32>226 %2 = load <8 x i8>, ptr %ref, align 1227 %3 = zext <8 x i8> %2 to <8 x i32>228 %4 = sub nsw <8 x i32> %1, %3229 %5 = icmp slt <8 x i32> %4, zeroinitializer230 %6 = sub nsw <8 x i32> zeroinitializer, %4231 %7 = select <8 x i1> %5, <8 x i32> %6, <8 x i32> %4232 %8 = zext <8 x i32> %7 to <8 x i64>233 %rdx.shuf = shufflevector <8 x i64> %8, <8 x i64> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>234 %bin.rdx = add <8 x i64> %rdx.shuf, %8235 %rdx.shuf236 = shufflevector <8 x i64> %bin.rdx, <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>236 %bin.rdx237 = add <8 x i64> %bin.rdx, %rdx.shuf236237 %rdx.shuf238 = shufflevector <8 x i64> %bin.rdx237, <8 x i64> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>238 %bin.rdx239 = add <8 x i64> %bin.rdx237, %rdx.shuf238239 %9 = extractelement <8 x i64> %bin.rdx239, i32 0240 ret i64 %9241}242 243define i64 @sad8_early_64bit_icmp_zext_slt(ptr nocapture readonly %cur, ptr nocapture readonly %ref, i64 %stride) local_unnamed_addr #4 {244; SSE2-LABEL: sad8_early_64bit_icmp_zext_slt:245; SSE2: # %bb.0: # %entry246; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero247; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero248; SSE2-NEXT: psadbw %xmm0, %xmm1249; SSE2-NEXT: movq %xmm1, %rax250; SSE2-NEXT: retq251;252; AVX-LABEL: sad8_early_64bit_icmp_zext_slt:253; AVX: # %bb.0: # %entry254; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero255; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero256; AVX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0257; AVX-NEXT: vmovq %xmm0, %rax258; AVX-NEXT: retq259entry:260 br label %for.body261 262for.body: ; preds = %entry263 %0 = load <8 x i8>, ptr %cur, align 1264 %1 = zext <8 x i8> %0 to <8 x i64>265 %2 = load <8 x i8>, ptr %ref, align 1266 %3 = zext <8 x i8> %2 to <8 x i64>267 %4 = sub nsw <8 x i64> %1, %3268 %5 = icmp slt <8 x i64> %4, zeroinitializer269 %6 = sub nsw <8 x i64> zeroinitializer, %4270 %7 = select <8 x i1> %5, <8 x i64> %6, <8 x i64> %4271 %rdx.shuf = shufflevector <8 x i64> %7, <8 x i64> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>272 %bin.rdx = add <8 x i64> %rdx.shuf, %7273 %rdx.shuf236 = shufflevector <8 x i64> %bin.rdx, <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>274 %bin.rdx237 = add <8 x i64> %bin.rdx, %rdx.shuf236275 %rdx.shuf238 = shufflevector <8 x i64> %bin.rdx237, <8 x i64> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>276 %bin.rdx239 = add <8 x i64> %bin.rdx237, %rdx.shuf238277 %8 = extractelement <8 x i64> %bin.rdx239, i32 0278 ret i64 %8279}280