brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.9 KiB · 17580a5 Raw
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