diff options
Diffstat (limited to 'test/CodeGen/arm64_vecCmpBr.c')
-rw-r--r-- | test/CodeGen/arm64_vecCmpBr.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/test/CodeGen/arm64_vecCmpBr.c b/test/CodeGen/arm64_vecCmpBr.c new file mode 100644 index 000000000000..3ae7433baed1 --- /dev/null +++ b/test/CodeGen/arm64_vecCmpBr.c @@ -0,0 +1,111 @@ +// 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; +} + |