| // RUN: %clang_cc1 -O3 -triple arm64-apple-ios7 -target-feature +neon -S -ffreestanding %s -o - -target-cpu cyclone | FileCheck %s |
| // REQUIRES: aarch64-registered-target |
| // test code generation for <rdar://problem/11487757> |
| #include <arm_neon.h> |
| |
| unsigned bar(); |
| |
| // Branch if any lane of V0 is zero; 64 bit => !min |
| unsigned anyZero64(uint16x4_t a) { |
| // CHECK: anyZero64: |
| // CHECK: uminv.8b b[[REGNO1:[0-9]+]], v0 |
| // CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] |
| // CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[.A-Z_0-9]+]] |
| // CHECK: [[LABEL]]: |
| // CHECK-NEXT: b {{_bar|bar}} |
| if (!vminv_u8(a)) |
| return bar(); |
| return 0; |
| } |
| |
| // Branch if any lane of V0 is zero; 128 bit => !min |
| unsigned anyZero128(uint16x8_t a) { |
| // CHECK: anyZero128: |
| // CHECK: uminv.16b b[[REGNO1:[0-9]+]], v0 |
| // CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] |
| // CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[.A-Z_0-9]+]] |
| // CHECK: [[LABEL]]: |
| // CHECK-NEXT: b {{_bar|bar}} |
| if (!vminvq_u8(a)) |
| return bar(); |
| return 0; |
| } |
| |
| // Branch if any lane of V0 is non-zero; 64 bit => max |
| unsigned anyNonZero64(uint16x4_t a) { |
| // CHECK: anyNonZero64: |
| // CHECK: umaxv.8b b[[REGNO1:[0-9]+]], v0 |
| // CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] |
| // CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[.A-Z_0-9]+]] |
| // CHECK: [[LABEL]]: |
| // CHECK-NEXT: movz w0, #0 |
| if (vmaxv_u8(a)) |
| return bar(); |
| return 0; |
| } |
| |
| // Branch if any lane of V0 is non-zero; 128 bit => max |
| unsigned anyNonZero128(uint16x8_t a) { |
| // CHECK: anyNonZero128: |
| // CHECK: umaxv.16b b[[REGNO1:[0-9]+]], v0 |
| // CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] |
| // CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[.A-Z_0-9]+]] |
| // CHECK: [[LABEL]]: |
| // CHECK-NEXT: movz w0, #0 |
| if (vmaxvq_u8(a)) |
| return bar(); |
| return 0; |
| } |
| |
| // Branch if all lanes of V0 are zero; 64 bit => !max |
| unsigned allZero64(uint16x4_t a) { |
| // CHECK: allZero64: |
| // CHECK: umaxv.8b b[[REGNO1:[0-9]+]], v0 |
| // CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] |
| // CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[.A-Z_0-9]+]] |
| // CHECK: [[LABEL]]: |
| // CHECK-NEXT: b {{_bar|bar}} |
| if (!vmaxv_u8(a)) |
| return bar(); |
| return 0; |
| } |
| |
| // Branch if all lanes of V0 are zero; 128 bit => !max |
| unsigned allZero128(uint16x8_t a) { |
| // CHECK: allZero128: |
| // CHECK: umaxv.16b b[[REGNO1:[0-9]+]], v0 |
| // CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] |
| // CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[.A-Z_0-9]+]] |
| // CHECK: [[LABEL]]: |
| // CHECK-NEXT: b {{_bar|bar}} |
| if (!vmaxvq_u8(a)) |
| return bar(); |
| return 0; |
| } |
| |
| // Branch if all lanes of V0 are non-zero; 64 bit => min |
| unsigned allNonZero64(uint16x4_t a) { |
| // CHECK: allNonZero64: |
| // CHECK: uminv.8b b[[REGNO1:[0-9]+]], v0 |
| // CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] |
| // CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[.A-Z_0-9]+]] |
| // CHECK: [[LABEL]]: |
| // CHECK-NEXT: movz w0, #0 |
| if (vminv_u8(a)) |
| return bar(); |
| return 0; |
| } |
| |
| // Branch if all lanes of V0 are non-zero; 128 bit => min |
| unsigned allNonZero128(uint16x8_t a) { |
| // CHECK: allNonZero128: |
| // CHECK: uminv.16b b[[REGNO1:[0-9]+]], v0 |
| // CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] |
| // CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[.A-Z_0-9]+]] |
| // CHECK: [[LABEL]]: |
| // CHECK-NEXT: movz w0, #0 |
| if (vminvq_u8(a)) |
| return bar(); |
| return 0; |
| } |
| |