|
11 | 11 | //===----------------------------------------------------------------------===//
|
12 | 12 | // RUN: %empty-directory(%t)
|
13 | 13 | // RUN: %gyb %s -o %t/SIMDFloatComparisons.swift
|
14 |
| -// RUN: %target-swift-frontend -primary-file %t/SIMDFloatComparisons.swift -S | %FileCheck %t/SIMDFloatComparisons.swift --check-prefix=CHECK --check-prefix=CHECK-%target-cpu --check-prefix=CHECKOnone-%target-cpu |
15 |
| -// RUN: %target-swift-frontend -primary-file %t/SIMDFloatComparisons.swift -S -O | %FileCheck %t/SIMDFloatComparisons.swift --check-prefix=CHECK --check-prefix=CHECK-%target-cpu --check-prefix=CHECKO-%target-cpu |
| 14 | +// RUN: %target-swift-frontend -primary-file %t/SIMDFloatComparisons.swift -emit-ir | %FileCheck %t/SIMDFloatComparisons.swift --check-prefix=CHECK --check-prefix=CHECK-%target-cpu |
16 | 15 |
|
17 | 16 | import Swift
|
18 | 17 |
|
19 |
| -%for bits in [32,64]: |
20 |
| -% scalar = {32:'Float',64:'Double'}[bits] |
| 18 | +%for bits in [16,32,64]: |
| 19 | +% scalar = {16:'Float16',32:'Float',64:'Double'}[bits] |
| 20 | +% llvm = {16:'half',32:'float',64:'double'}[bits] |
21 | 21 | % for totalBits in [64,128]:
|
| 22 | +% if bits == 16 or totalBits == 64: |
| 23 | +% arch = "-arm64" |
| 24 | +% else: |
| 25 | +% arch = "" |
| 26 | +% end |
22 | 27 | % n = totalBits // bits
|
23 | 28 | % if n != 1:
|
24 | 29 | % neonSuffix = str(n) + {8:'b',16:'h',32:'s',64:'d'}[bits]
|
| 30 | +% if bits == 16: |
| 31 | +#if arch(arm64) |
| 32 | +@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) |
| 33 | +% end |
25 | 34 | func compare_eq${n}x${bits}(
|
26 | 35 | _ a: SIMD${n}<${scalar}>, _ b: SIMD${n}<${scalar}>
|
27 | 36 | ) -> SIMDMask<SIMD${n}<Int${bits}>> {
|
28 | 37 | a .== b
|
29 | 38 | }
|
30 |
| -// CHECK: compare_eq${n}x${bits}{{[[:alnum:]_]+}}: |
31 |
| -// CHECK-x86_64: cmpeqp${'s' if bits == 32 else 'd'} |
32 |
| -// CHECK-x86_64: ret |
33 |
| -// CHECKO-arm64-NEXT: fcmeq.${neonSuffix} v0, v0, v1 |
34 |
| -// CHECKO-arm64-NEXT: ret |
35 |
| -// CHECKOnone-arm64: fcmeq.${neonSuffix} |
36 |
| -// CHECKOnone-arm64: ret |
| 39 | +% if bits == 16: |
| 40 | +#endif |
| 41 | +% end |
| 42 | +// CHECK${arch}: compare_eq${n}x${bits}{{.*}} { |
| 43 | +// CHECK${arch}: entry: |
| 44 | +// CHECK${arch}: [[TMP:%[0-9]+]] = fcmp oeq <${n} x ${llvm}> %0, %1 |
| 45 | +// CHECK${arch}-NEXT: [[RES:%[0-9]+]] = sext <${n} x i1> [[TMP]] to <${n} x i${bits}> |
| 46 | +// CHECK${arch}-NEXT: ret <${n} x i${bits}> [[RES]] |
37 | 47 |
|
| 48 | +% if bits == 16: |
| 49 | +#if arch(arm64) |
| 50 | +@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) |
| 51 | +% end |
38 | 52 | func compare_ne${n}x${bits}(
|
39 | 53 | _ a: SIMD${n}<${scalar}>, _ b: SIMD${n}<${scalar}>
|
40 | 54 | ) -> SIMDMask<SIMD${n}<Int${bits}>> {
|
41 | 55 | a .!= b
|
42 | 56 | }
|
43 |
| -// CHECK: compare_ne${n}x${bits}{{[[:alnum:]_]+}}: |
44 |
| -// CHECK-x86_64: cmpneqp${'s' if bits == 32 else 'd'} |
45 |
| -// CHECK-x86_64: ret |
46 |
| -// CHECKO-arm64-NEXT: fcmeq.${neonSuffix} [[TMP:v[0-9]+]], v0, v1 |
47 |
| -// CHECKO-arm64-NEXT: mvn.${totalBits//8}b v0, [[TMP]] |
48 |
| -// CHECKO-arm64-NEXT: ret |
49 |
| -// CHECKOnone-arm64: fcmeq.${neonSuffix} |
50 |
| -// CHECKOnone-arm64: mvn.${totalBits//8}b |
51 |
| -// CHECKOnone-arm64: ret |
| 57 | +% if bits == 16: |
| 58 | +#endif |
| 59 | +% end |
| 60 | +// CHECK${arch}: compare_ne${n}x${bits}{{.*}} { |
| 61 | +// CHECK${arch}: entry: |
| 62 | +// CHECK${arch}: [[TMP:%[0-9]+]] = fcmp une <${n} x ${llvm}> %0, %1 |
| 63 | +// CHECK${arch}-NEXT: [[RES:%[0-9]+]] = sext <${n} x i1> [[TMP]] to <${n} x i${bits}> |
| 64 | +// CHECK${arch}-NEXT: ret <${n} x i${bits}> [[RES]] |
52 | 65 |
|
| 66 | +% if bits == 16: |
| 67 | +#if arch(arm64) |
| 68 | +@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) |
| 69 | +% end |
53 | 70 | func compare_lt${n}x${bits}(
|
54 | 71 | _ a: SIMD${n}<${scalar}>, _ b: SIMD${n}<${scalar}>
|
55 | 72 | ) -> SIMDMask<SIMD${n}<Int${bits}>> {
|
56 | 73 | a .< b
|
57 | 74 | }
|
58 |
| -// CHECK: compare_lt${n}x${bits}{{[[:alnum:]_]+}}: |
59 |
| -// CHECK-x86_64: cmpltp${'s' if bits == 32 else 'd'} |
60 |
| -// CHECK-x86_64: ret |
61 |
| -// CHECKO-arm64-NEXT: fcmgt.${neonSuffix} v0, v1, v0 |
62 |
| -// CHECKO-arm64-NEXT: ret |
63 |
| -// CHECKOnone-arm64: fcmgt.${neonSuffix} |
64 |
| -// CHECKOnone-arm64: ret |
| 75 | +% if bits == 16: |
| 76 | +#endif |
| 77 | +% end |
| 78 | +// CHECK${arch}: compare_lt${n}x${bits}{{.*}} { |
| 79 | +// CHECK${arch}: entry: |
| 80 | +// CHECK${arch}: [[TMP:%[0-9]+]] = fcmp olt <${n} x ${llvm}> %0, %1 |
| 81 | +// CHECK${arch}-NEXT: [[RES:%[0-9]+]] = sext <${n} x i1> [[TMP]] to <${n} x i${bits}> |
| 82 | +// CHECK${arch}-NEXT: ret <${n} x i${bits}> [[RES]] |
65 | 83 |
|
| 84 | +% if bits == 16: |
| 85 | +#if arch(arm64) |
| 86 | +@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) |
| 87 | +% end |
66 | 88 | func compare_le${n}x${bits}(
|
67 | 89 | _ a: SIMD${n}<${scalar}>, _ b: SIMD${n}<${scalar}>
|
68 | 90 | ) -> SIMDMask<SIMD${n}<Int${bits}>> {
|
69 | 91 | a .<= b
|
70 | 92 | }
|
71 |
| -// CHECK: compare_le${n}x${bits}{{[[:alnum:]_]+}}: |
72 |
| -// CHECK-x86_64: cmplep${'s' if bits == 32 else 'd'} |
73 |
| -// CHECK-x86_64: ret |
74 |
| -// CHECKO-arm64-NEXT: fcmge.${neonSuffix} v0, v1, v0 |
75 |
| -// CHECKO-arm64-NEXT: ret |
76 |
| -// CHECKOnone-arm64: fcmge.${neonSuffix} |
77 |
| -// CHECKOnone-arm64: ret |
| 93 | +% if bits == 16: |
| 94 | +#endif |
| 95 | +% end |
| 96 | +// CHECK${arch}: compare_le${n}x${bits}{{.*}} { |
| 97 | +// CHECK${arch}: entry: |
| 98 | +// CHECK${arch}: [[TMP:%[0-9]+]] = fcmp ole <${n} x ${llvm}> %0, %1 |
| 99 | +// CHECK${arch}-NEXT: [[RES:%[0-9]+]] = sext <${n} x i1> [[TMP]] to <${n} x i${bits}> |
| 100 | +// CHECK${arch}-NEXT: ret <${n} x i${bits}> [[RES]] |
78 | 101 |
|
| 102 | +% if bits == 16: |
| 103 | +#if arch(arm64) |
| 104 | +@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) |
| 105 | +% end |
79 | 106 | func compare_ge${n}x${bits}(
|
80 | 107 | _ a: SIMD${n}<${scalar}>, _ b: SIMD${n}<${scalar}>
|
81 | 108 | ) -> SIMDMask<SIMD${n}<Int${bits}>> {
|
82 | 109 | a .>= b
|
83 | 110 | }
|
84 |
| -// CHECK: compare_ge${n}x${bits}{{[[:alnum:]_]+}}: |
85 |
| -// CHECK-x86_64: cmplep${'s' if bits == 32 else 'd'} |
86 |
| -// CHECK-x86_64: ret |
87 |
| -// CHECKO-arm64-NEXT: fcmge.${neonSuffix} v0, v0, v1 |
88 |
| -// CHECKO-arm64-NEXT: ret |
89 |
| -// CHECKOnone-arm64: fcmge.${neonSuffix} |
90 |
| -// CHECKOnone-arm64: ret |
| 111 | +% if bits == 16: |
| 112 | +#endif |
| 113 | +% end |
| 114 | +// CHECK${arch}: compare_ge${n}x${bits}{{.*}} { |
| 115 | +// CHECK${arch}: entry: |
| 116 | +// CHECK${arch}: [[TMP:%[0-9]+]] = fcmp oge <${n} x ${llvm}> %0, %1 |
| 117 | +// CHECK${arch}-NEXT: [[RES:%[0-9]+]] = sext <${n} x i1> [[TMP]] to <${n} x i${bits}> |
| 118 | +// CHECK${arch}-NEXT: ret <${n} x i${bits}> [[RES]] |
91 | 119 |
|
| 120 | +% if bits == 16: |
| 121 | +#if arch(arm64) |
| 122 | +@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) |
| 123 | +% end |
92 | 124 | func compare_gt${n}x${bits}(
|
93 | 125 | _ a: SIMD${n}<${scalar}>, _ b: SIMD${n}<${scalar}>
|
94 | 126 | ) -> SIMDMask<SIMD${n}<Int${bits}>> {
|
95 | 127 | a .> b
|
96 | 128 | }
|
97 |
| -// CHECK: compare_gt${n}x${bits}{{[[:alnum:]_]+}}: |
98 |
| -// CHECK-x86_64: cmpltp${'s' if bits == 32 else 'd'} |
99 |
| -// CHECK-x86_64: ret |
100 |
| -// CHECKO-arm64-NEXT: fcmgt.${neonSuffix} v0, v0, v1 |
101 |
| -// CHECKO-arm64-NEXT: ret |
102 |
| -// CHECKOnone-arm64: fcmgt.${neonSuffix} |
103 |
| -// CHECKOnone-arm64: ret |
| 129 | +% if bits == 16: |
| 130 | +#endif |
| 131 | +% end |
| 132 | +// CHECK${arch}: compare_gt${n}x${bits}{{.*}} { |
| 133 | +// CHECK${arch}: entry: |
| 134 | +// CHECK${arch}: [[TMP:%[0-9]+]] = fcmp ogt <${n} x ${llvm}> %0, %1 |
| 135 | +// CHECK${arch}-NEXT: [[RES:%[0-9]+]] = sext <${n} x i1> [[TMP]] to <${n} x i${bits}> |
| 136 | +// CHECK${arch}-NEXT: ret <${n} x i${bits}> [[RES]] |
104 | 137 |
|
105 | 138 | % end
|
106 | 139 | % end
|
|
0 commit comments