|
| 1 | +// Test/document all of the dependencies between possible AArch64 FMV extensions. |
| 2 | +// Also test the name mangling. |
| 3 | + |
| 4 | +// RUN: %clang --target=aarch64-linux-gnu --rtlib=compiler-rt -emit-llvm -S -o - %s | FileCheck %s |
| 5 | + |
| 6 | +// CHECK: define dso_local i32 @fmv._Maes() #[[ATTR0:[0-9]+]] { |
| 7 | +__attribute__((target_version("aes"))) int fmv(void) { return 0; } |
| 8 | + |
| 9 | +// CHECK: define dso_local i32 @fmv._Mbf16() #[[bf16_ebf16:[0-9]+]] { |
| 10 | +__attribute__((target_version("bf16"))) int fmv(void) { return 0; } |
| 11 | + |
| 12 | +// CHECK: define dso_local i32 @fmv._Mbti() #[[bti:[0-9]+]] { |
| 13 | +__attribute__((target_version("bti"))) int fmv(void) { return 0; } |
| 14 | + |
| 15 | +// CHECK: define dso_local i32 @fmv._Mcrc() #[[crc:[0-9]+]] { |
| 16 | +__attribute__((target_version("crc"))) int fmv(void) { return 0; } |
| 17 | + |
| 18 | +// CHECK: define dso_local i32 @fmv._Mdgh() #[[ATTR0:[0-9]+]] { |
| 19 | +__attribute__((target_version("dgh"))) int fmv(void) { return 0; } |
| 20 | + |
| 21 | +// CHECK: define dso_local i32 @fmv._Mdit() #[[dit:[0-9]+]] { |
| 22 | +__attribute__((target_version("dit"))) int fmv(void) { return 0; } |
| 23 | + |
| 24 | +// CHECK: define dso_local i32 @fmv._Mdotprod() #[[dotprod:[0-9]+]] { |
| 25 | +__attribute__((target_version("dotprod"))) int fmv(void) { return 0; } |
| 26 | + |
| 27 | +// CHECK: define dso_local i32 @fmv._Mdpb() #[[dpb:[0-9]+]] { |
| 28 | +__attribute__((target_version("dpb"))) int fmv(void) { return 0; } |
| 29 | + |
| 30 | +// CHECK: define dso_local i32 @fmv._Mdpb2() #[[dpb2:[0-9]+]] { |
| 31 | +__attribute__((target_version("dpb2"))) int fmv(void) { return 0; } |
| 32 | + |
| 33 | +// CHECK: define dso_local i32 @fmv._Mebf16() #[[bf16_ebf16:[0-9]+]] { |
| 34 | +__attribute__((target_version("ebf16"))) int fmv(void) { return 0; } |
| 35 | + |
| 36 | +// CHECK: define dso_local i32 @fmv._Mf32mm() #[[f32mm:[0-9]+]] { |
| 37 | +__attribute__((target_version("f32mm"))) int fmv(void) { return 0; } |
| 38 | + |
| 39 | +// CHECK: define dso_local i32 @fmv._Mf64mm() #[[f64mm:[0-9]+]] { |
| 40 | +__attribute__((target_version("f64mm"))) int fmv(void) { return 0; } |
| 41 | + |
| 42 | +// CHECK: define dso_local i32 @fmv._Mfcma() #[[fcma:[0-9]+]] { |
| 43 | +__attribute__((target_version("fcma"))) int fmv(void) { return 0; } |
| 44 | + |
| 45 | +// CHECK: define dso_local i32 @fmv._Mflagm() #[[flagm:[0-9]+]] { |
| 46 | +__attribute__((target_version("flagm"))) int fmv(void) { return 0; } |
| 47 | + |
| 48 | +// CHECK: define dso_local i32 @fmv._Mflagm2() #[[flagm2:[0-9]+]] { |
| 49 | +__attribute__((target_version("flagm2"))) int fmv(void) { return 0; } |
| 50 | + |
| 51 | +// CHECK: define dso_local i32 @fmv._Mfp() #[[ATTR0:[0-9]+]] { |
| 52 | +__attribute__((target_version("fp"))) int fmv(void) { return 0; } |
| 53 | + |
| 54 | +// CHECK: define dso_local i32 @fmv._Mfp16() #[[fp16:[0-9]+]] { |
| 55 | +__attribute__((target_version("fp16"))) int fmv(void) { return 0; } |
| 56 | + |
| 57 | +// CHECK: define dso_local i32 @fmv._Mfp16fml() #[[fp16fml:[0-9]+]] { |
| 58 | +__attribute__((target_version("fp16fml"))) int fmv(void) { return 0; } |
| 59 | + |
| 60 | +// CHECK: define dso_local i32 @fmv._Mfrintts() #[[frintts:[0-9]+]] { |
| 61 | +__attribute__((target_version("frintts"))) int fmv(void) { return 0; } |
| 62 | + |
| 63 | +// CHECK: define dso_local i32 @fmv._Mi8mm() #[[i8mm:[0-9]+]] { |
| 64 | +__attribute__((target_version("i8mm"))) int fmv(void) { return 0; } |
| 65 | + |
| 66 | +// CHECK: define dso_local i32 @fmv._Mjscvt() #[[jscvt:[0-9]+]] { |
| 67 | +__attribute__((target_version("jscvt"))) int fmv(void) { return 0; } |
| 68 | + |
| 69 | +// CHECK: define dso_local i32 @fmv._Mls64() #[[ATTR0:[0-9]+]] { |
| 70 | +__attribute__((target_version("ls64"))) int fmv(void) { return 0; } |
| 71 | + |
| 72 | +// CHECK: define dso_local i32 @fmv._Mls64_accdata() #[[ls64_accdata:[0-9]+]] { |
| 73 | +__attribute__((target_version("ls64_accdata"))) int fmv(void) { return 0; } |
| 74 | + |
| 75 | +// CHECK: define dso_local i32 @fmv._Mls64_v() #[[ATTR0:[0-9]+]] { |
| 76 | +__attribute__((target_version("ls64_v"))) int fmv(void) { return 0; } |
| 77 | + |
| 78 | +// CHECK: define dso_local i32 @fmv._Mlse() #[[lse:[0-9]+]] { |
| 79 | +__attribute__((target_version("lse"))) int fmv(void) { return 0; } |
| 80 | + |
| 81 | +// CHECK: define dso_local i32 @fmv._Mmemtag() #[[ATTR0:[0-9]+]] { |
| 82 | +__attribute__((target_version("memtag"))) int fmv(void) { return 0; } |
| 83 | + |
| 84 | +// CHECK: define dso_local i32 @fmv._Mmemtag2() #[[memtag2:[0-9]+]] { |
| 85 | +__attribute__((target_version("memtag2"))) int fmv(void) { return 0; } |
| 86 | + |
| 87 | +// CHECK: define dso_local i32 @fmv._Mmemtag3() #[[memtag2:[0-9]+]] { |
| 88 | +__attribute__((target_version("memtag3"))) int fmv(void) { return 0; } |
| 89 | + |
| 90 | +// CHECK: define dso_local i32 @fmv._Mmops() #[[mops:[0-9]+]] { |
| 91 | +__attribute__((target_version("mops"))) int fmv(void) { return 0; } |
| 92 | + |
| 93 | +// CHECK: define dso_local i32 @fmv._Mpmull() #[[pmull:[0-9]+]] { |
| 94 | +__attribute__((target_version("pmull"))) int fmv(void) { return 0; } |
| 95 | + |
| 96 | +// CHECK: define dso_local i32 @fmv._Mpredres() #[[predres:[0-9]+]] { |
| 97 | +__attribute__((target_version("predres"))) int fmv(void) { return 0; } |
| 98 | + |
| 99 | +// CHECK: define dso_local i32 @fmv._Mrcpc() #[[rcpc:[0-9]+]] { |
| 100 | +__attribute__((target_version("rcpc"))) int fmv(void) { return 0; } |
| 101 | + |
| 102 | +// CHECK: define dso_local i32 @fmv._Mrcpc2() #[[rcpc:[0-9]+]] { |
| 103 | +__attribute__((target_version("rcpc2"))) int fmv(void) { return 0; } |
| 104 | + |
| 105 | +// CHECK: define dso_local i32 @fmv._Mrcpc3() #[[rcpc3:[0-9]+]] { |
| 106 | +__attribute__((target_version("rcpc3"))) int fmv(void) { return 0; } |
| 107 | + |
| 108 | +// CHECK: define dso_local i32 @fmv._Mrdm() #[[rdm:[0-9]+]] { |
| 109 | +__attribute__((target_version("rdm"))) int fmv(void) { return 0; } |
| 110 | + |
| 111 | +// CHECK: define dso_local i32 @fmv._Mrng() #[[rng:[0-9]+]] { |
| 112 | +__attribute__((target_version("rng"))) int fmv(void) { return 0; } |
| 113 | + |
| 114 | +// CHECK: define dso_local i32 @fmv._Mrpres() #[[ATTR0:[0-9]+]] { |
| 115 | +__attribute__((target_version("rpres"))) int fmv(void) { return 0; } |
| 116 | + |
| 117 | +// CHECK: define dso_local i32 @fmv._Msb() #[[sb:[0-9]+]] { |
| 118 | +__attribute__((target_version("sb"))) int fmv(void) { return 0; } |
| 119 | + |
| 120 | +// CHECK: define dso_local i32 @fmv._Msha1() #[[ATTR0:[0-9]+]] { |
| 121 | +__attribute__((target_version("sha1"))) int fmv(void) { return 0; } |
| 122 | + |
| 123 | +// CHECK: define dso_local i32 @fmv._Msha2() #[[sha2:[0-9]+]] { |
| 124 | +__attribute__((target_version("sha2"))) int fmv(void) { return 0; } |
| 125 | + |
| 126 | +// CHECK: define dso_local i32 @fmv._Msha3() #[[sha3:[0-9]+]] { |
| 127 | +__attribute__((target_version("sha3"))) int fmv(void) { return 0; } |
| 128 | + |
| 129 | +// CHECK: define dso_local i32 @fmv._Msimd() #[[ATTR0:[0-9]+]] { |
| 130 | +__attribute__((target_version("simd"))) int fmv(void) { return 0; } |
| 131 | + |
| 132 | +// CHECK: define dso_local i32 @fmv._Msm4() #[[sm4:[0-9]+]] { |
| 133 | +__attribute__((target_version("sm4"))) int fmv(void) { return 0; } |
| 134 | + |
| 135 | +// CHECK: define dso_local i32 @fmv._Msme() #[[sme:[0-9]+]] { |
| 136 | +__attribute__((target_version("sme"))) int fmv(void) { return 0; } |
| 137 | + |
| 138 | +// CHECK: define dso_local i32 @fmv._Msme-f64f64() #[[sme_f64f64:[0-9]+]] { |
| 139 | +__attribute__((target_version("sme-f64f64"))) int fmv(void) { return 0; } |
| 140 | + |
| 141 | +// CHECK: define dso_local i32 @fmv._Msme-i16i64() #[[sme_i16i64:[0-9]+]] { |
| 142 | +__attribute__((target_version("sme-i16i64"))) int fmv(void) { return 0; } |
| 143 | + |
| 144 | +// CHECK: define dso_local i32 @fmv._Msme2() #[[sme2:[0-9]+]] { |
| 145 | +__attribute__((target_version("sme2"))) int fmv(void) { return 0; } |
| 146 | + |
| 147 | +// CHECK: define dso_local i32 @fmv._Mssbs() #[[ATTR0:[0-9]+]] { |
| 148 | +__attribute__((target_version("ssbs"))) int fmv(void) { return 0; } |
| 149 | + |
| 150 | +// CHECK: define dso_local i32 @fmv._Mssbs2() #[[ssbs2:[0-9]+]] { |
| 151 | +__attribute__((target_version("ssbs2"))) int fmv(void) { return 0; } |
| 152 | + |
| 153 | +// CHECK: define dso_local i32 @fmv._Msve() #[[sve:[0-9]+]] { |
| 154 | +__attribute__((target_version("sve"))) int fmv(void) { return 0; } |
| 155 | + |
| 156 | +// CHECK: define dso_local i32 @fmv._Msve-bf16() #[[sve_bf16_ebf16:[0-9]+]] { |
| 157 | +__attribute__((target_version("sve-bf16"))) int fmv(void) { return 0; } |
| 158 | + |
| 159 | +// CHECK: define dso_local i32 @fmv._Msve-ebf16() #[[sve_bf16_ebf16:[0-9]+]] { |
| 160 | +__attribute__((target_version("sve-ebf16"))) int fmv(void) { return 0; } |
| 161 | + |
| 162 | +// CHECK: define dso_local i32 @fmv._Msve-i8mm() #[[sve_i8mm:[0-9]+]] { |
| 163 | +__attribute__((target_version("sve-i8mm"))) int fmv(void) { return 0; } |
| 164 | + |
| 165 | +// CHECK: define dso_local i32 @fmv._Msve2() #[[sve2:[0-9]+]] { |
| 166 | +__attribute__((target_version("sve2"))) int fmv(void) { return 0; } |
| 167 | + |
| 168 | +// CHECK: define dso_local i32 @fmv._Msve2-aes() #[[sve2_aes_sve2_pmull128:[0-9]+]] { |
| 169 | +__attribute__((target_version("sve2-aes"))) int fmv(void) { return 0; } |
| 170 | + |
| 171 | +// CHECK: define dso_local i32 @fmv._Msve2-bitperm() #[[sve2_bitperm:[0-9]+]] { |
| 172 | +__attribute__((target_version("sve2-bitperm"))) int fmv(void) { return 0; } |
| 173 | + |
| 174 | +// CHECK: define dso_local i32 @fmv._Msve2-pmull128() #[[sve2_aes_sve2_pmull128:[0-9]+]] { |
| 175 | +__attribute__((target_version("sve2-pmull128"))) int fmv(void) { return 0; } |
| 176 | + |
| 177 | +// CHECK: define dso_local i32 @fmv._Msve2-sha3() #[[sve2_sha3:[0-9]+]] { |
| 178 | +__attribute__((target_version("sve2-sha3"))) int fmv(void) { return 0; } |
| 179 | + |
| 180 | +// CHECK: define dso_local i32 @fmv._Msve2-sm4() #[[sve2_sm4:[0-9]+]] { |
| 181 | +__attribute__((target_version("sve2-sm4"))) int fmv(void) { return 0; } |
| 182 | + |
| 183 | +// CHECK: define dso_local i32 @fmv._Mwfxt() #[[wfxt:[0-9]+]] { |
| 184 | +__attribute__((target_version("wfxt"))) int fmv(void) { return 0; } |
| 185 | + |
| 186 | +// CHECK-NOT: define dso_local i32 @fmv._M{{.*}} |
| 187 | +__attribute__((target_version("non_existent_extension"))) int fmv(void); |
| 188 | + |
| 189 | +__attribute__((target_version("default"))) int fmv(void); |
| 190 | + |
| 191 | +int caller() { |
| 192 | + return fmv(); |
| 193 | +} |
| 194 | + |
| 195 | +// CHECK: attributes #[[ATTR0:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+v8a" |
| 196 | +// CHECK: attributes #[[bf16_ebf16:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 197 | +// CHECK: attributes #[[bti:[0-9]+]] = { {{.*}} "target-features"="+bti,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 198 | +// CHECK: attributes #[[crc:[0-9]+]] = { {{.*}} "target-features"="+crc,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 199 | +// CHECK: attributes #[[dit:[0-9]+]] = { {{.*}} "target-features"="+dit,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 200 | +// CHECK: attributes #[[dotprod:[0-9]+]] = { {{.*}} "target-features"="+dotprod,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 201 | +// CHECK: attributes #[[dpb:[0-9]+]] = { {{.*}} "target-features"="+ccpp,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 202 | +// CHECK: attributes #[[dpb2:[0-9]+]] = { {{.*}} "target-features"="+ccdp,+ccpp,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 203 | +// CHECK: attributes #[[f32mm:[0-9]+]] = { {{.*}} "target-features"="+f32mm,+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+v8a" |
| 204 | +// CHECK: attributes #[[f64mm:[0-9]+]] = { {{.*}} "target-features"="+f64mm,+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+v8a" |
| 205 | +// CHECK: attributes #[[fcma:[0-9]+]] = { {{.*}} "target-features"="+complxnum,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 206 | +// CHECK: attributes #[[flagm:[0-9]+]] = { {{.*}} "target-features"="+flagm,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 207 | +// CHECK: attributes #[[flagm2:[0-9]+]] = { {{.*}} "target-features"="+altnzcv,+flagm,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 208 | +// CHECK: attributes #[[fp16:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+v8a" |
| 209 | +// CHECK: attributes #[[fp16fml:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fp16fml,+fullfp16,+neon,+outline-atomics,+v8a" |
| 210 | +// CHECK: attributes #[[frintts:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fptoint,+neon,+outline-atomics,+v8a" |
| 211 | +// CHECK: attributes #[[i8mm:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+i8mm,+neon,+outline-atomics,+v8a" |
| 212 | +// CHECK: attributes #[[jscvt:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+jsconv,+neon,+outline-atomics,+v8a" |
| 213 | +// CHECK: attributes #[[ls64_accdata:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+ls64,+neon,+outline-atomics,+v8a" |
| 214 | +// CHECK: attributes #[[lse:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+lse,+neon,+outline-atomics,+v8a" |
| 215 | +// CHECK: attributes #[[memtag2:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+mte,+neon,+outline-atomics,+v8a" |
| 216 | +// CHECK: attributes #[[mops:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+mops,+neon,+outline-atomics,+v8a" |
| 217 | +// CHECK: attributes #[[pmull:[0-9]+]] = { {{.*}} "target-features"="+aes,+fp-armv8,+neon,+outline-atomics,+v8a" |
| 218 | +// CHECK: attributes #[[predres:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+predres,+v8a" |
| 219 | +// CHECK: attributes #[[rcpc:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rcpc,+v8a" |
| 220 | +// CHECK: attributes #[[rcpc3:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rcpc,+rcpc3,+v8a" |
| 221 | +// CHECK: attributes #[[rdm:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rdm,+v8a" |
| 222 | +// CHECK: attributes #[[rng:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rand,+v8a" |
| 223 | +// CHECK: attributes #[[sb:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sb,+v8a" |
| 224 | +// CHECK: attributes #[[sha2:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sha2,+v8a" |
| 225 | +// CHECK: attributes #[[sha3:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sha2,+sha3,+v8a" |
| 226 | +// CHECK: attributes #[[sm4:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sm4,+v8a" |
| 227 | +// CHECK: attributes #[[sme:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+sme,+v8a" |
| 228 | +// CHECK: attributes #[[sme_f64f64:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+sme,+sme-f64f64,+v8a" |
| 229 | +// CHECK: attributes #[[sme_i16i64:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+sme,+sme-i16i64,+v8a" |
| 230 | +// CHECK: attributes #[[sme2:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+sme,+sme2,+v8a" |
| 231 | +// CHECK: attributes #[[ssbs2:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+ssbs,+v8a" |
| 232 | +// CHECK: attributes #[[sve:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+v8a" |
| 233 | +// CHECK: attributes #[[sve_bf16_ebf16:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+v8a" |
| 234 | +// CHECK: attributes #[[sve_i8mm:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+i8mm,+neon,+outline-atomics,+sve,+v8a" |
| 235 | +// CHECK: attributes #[[sve2:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+v8a" |
| 236 | +// CHECK: attributes #[[sve2_aes_sve2_pmull128:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-aes,+v8a" |
| 237 | +// CHECK: attributes #[[sve2_bitperm:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-bitperm,+v8a" |
| 238 | +// CHECK: attributes #[[sve2_sha3:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-sha3,+v8a" |
| 239 | +// CHECK: attributes #[[sve2_sm4:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-sm4,+v8a" |
| 240 | +// CHECK: attributes #[[wfxt:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+v8a,+wfxt" |
0 commit comments