1 ; RUN: llc -march=arm64 -aarch64-neon-syntax=apple < %s | FileCheck %s 2 3 ;;; Float vectors 4 5 %v2f32 = type <2 x float> 6 ; CHECK: test_v2f32.sqrt: 7 define %v2f32 @test_v2f32.sqrt(%v2f32 %a) { 8 ; CHECK: fsqrt.2s 9 %1 = call %v2f32 @llvm.sqrt.v2f32(%v2f32 %a) 10 ret %v2f32 %1 11 } 12 ; CHECK: test_v2f32.powi: 13 define %v2f32 @test_v2f32.powi(%v2f32 %a, i32 %b) { 14 ; CHECK: pow 15 %1 = call %v2f32 @llvm.powi.v2f32(%v2f32 %a, i32 %b) 16 ret %v2f32 %1 17 } 18 ; CHECK: test_v2f32.sin: 19 define %v2f32 @test_v2f32.sin(%v2f32 %a) { 20 ; CHECK: sin 21 %1 = call %v2f32 @llvm.sin.v2f32(%v2f32 %a) 22 ret %v2f32 %1 23 } 24 ; CHECK: test_v2f32.cos: 25 define %v2f32 @test_v2f32.cos(%v2f32 %a) { 26 ; CHECK: cos 27 %1 = call %v2f32 @llvm.cos.v2f32(%v2f32 %a) 28 ret %v2f32 %1 29 } 30 ; CHECK: test_v2f32.pow: 31 define %v2f32 @test_v2f32.pow(%v2f32 %a, %v2f32 %b) { 32 ; CHECK: pow 33 %1 = call %v2f32 @llvm.pow.v2f32(%v2f32 %a, %v2f32 %b) 34 ret %v2f32 %1 35 } 36 ; CHECK: test_v2f32.exp: 37 define %v2f32 @test_v2f32.exp(%v2f32 %a) { 38 ; CHECK: exp 39 %1 = call %v2f32 @llvm.exp.v2f32(%v2f32 %a) 40 ret %v2f32 %1 41 } 42 ; CHECK: test_v2f32.exp2: 43 define %v2f32 @test_v2f32.exp2(%v2f32 %a) { 44 ; CHECK: exp 45 %1 = call %v2f32 @llvm.exp2.v2f32(%v2f32 %a) 46 ret %v2f32 %1 47 } 48 ; CHECK: test_v2f32.log: 49 define %v2f32 @test_v2f32.log(%v2f32 %a) { 50 ; CHECK: log 51 %1 = call %v2f32 @llvm.log.v2f32(%v2f32 %a) 52 ret %v2f32 %1 53 } 54 ; CHECK: test_v2f32.log10: 55 define %v2f32 @test_v2f32.log10(%v2f32 %a) { 56 ; CHECK: log 57 %1 = call %v2f32 @llvm.log10.v2f32(%v2f32 %a) 58 ret %v2f32 %1 59 } 60 ; CHECK: test_v2f32.log2: 61 define %v2f32 @test_v2f32.log2(%v2f32 %a) { 62 ; CHECK: log 63 %1 = call %v2f32 @llvm.log2.v2f32(%v2f32 %a) 64 ret %v2f32 %1 65 } 66 ; CHECK: test_v2f32.fma: 67 define %v2f32 @test_v2f32.fma(%v2f32 %a, %v2f32 %b, %v2f32 %c) { 68 ; CHECK: fma 69 %1 = call %v2f32 @llvm.fma.v2f32(%v2f32 %a, %v2f32 %b, %v2f32 %c) 70 ret %v2f32 %1 71 } 72 ; CHECK: test_v2f32.fabs: 73 define %v2f32 @test_v2f32.fabs(%v2f32 %a) { 74 ; CHECK: fabs 75 %1 = call %v2f32 @llvm.fabs.v2f32(%v2f32 %a) 76 ret %v2f32 %1 77 } 78 ; CHECK: test_v2f32.floor: 79 define %v2f32 @test_v2f32.floor(%v2f32 %a) { 80 ; CHECK: frintm.2s 81 %1 = call %v2f32 @llvm.floor.v2f32(%v2f32 %a) 82 ret %v2f32 %1 83 } 84 ; CHECK: test_v2f32.ceil: 85 define %v2f32 @test_v2f32.ceil(%v2f32 %a) { 86 ; CHECK: frintp.2s 87 %1 = call %v2f32 @llvm.ceil.v2f32(%v2f32 %a) 88 ret %v2f32 %1 89 } 90 ; CHECK: test_v2f32.trunc: 91 define %v2f32 @test_v2f32.trunc(%v2f32 %a) { 92 ; CHECK: frintz.2s 93 %1 = call %v2f32 @llvm.trunc.v2f32(%v2f32 %a) 94 ret %v2f32 %1 95 } 96 ; CHECK: test_v2f32.rint: 97 define %v2f32 @test_v2f32.rint(%v2f32 %a) { 98 ; CHECK: frintx.2s 99 %1 = call %v2f32 @llvm.rint.v2f32(%v2f32 %a) 100 ret %v2f32 %1 101 } 102 ; CHECK: test_v2f32.nearbyint: 103 define %v2f32 @test_v2f32.nearbyint(%v2f32 %a) { 104 ; CHECK: frinti.2s 105 %1 = call %v2f32 @llvm.nearbyint.v2f32(%v2f32 %a) 106 ret %v2f32 %1 107 } 108 109 declare %v2f32 @llvm.sqrt.v2f32(%v2f32) #0 110 declare %v2f32 @llvm.powi.v2f32(%v2f32, i32) #0 111 declare %v2f32 @llvm.sin.v2f32(%v2f32) #0 112 declare %v2f32 @llvm.cos.v2f32(%v2f32) #0 113 declare %v2f32 @llvm.pow.v2f32(%v2f32, %v2f32) #0 114 declare %v2f32 @llvm.exp.v2f32(%v2f32) #0 115 declare %v2f32 @llvm.exp2.v2f32(%v2f32) #0 116 declare %v2f32 @llvm.log.v2f32(%v2f32) #0 117 declare %v2f32 @llvm.log10.v2f32(%v2f32) #0 118 declare %v2f32 @llvm.log2.v2f32(%v2f32) #0 119 declare %v2f32 @llvm.fma.v2f32(%v2f32, %v2f32, %v2f32) #0 120 declare %v2f32 @llvm.fabs.v2f32(%v2f32) #0 121 declare %v2f32 @llvm.floor.v2f32(%v2f32) #0 122 declare %v2f32 @llvm.ceil.v2f32(%v2f32) #0 123 declare %v2f32 @llvm.trunc.v2f32(%v2f32) #0 124 declare %v2f32 @llvm.rint.v2f32(%v2f32) #0 125 declare %v2f32 @llvm.nearbyint.v2f32(%v2f32) #0 126 127 ;;; 128 129 %v4f32 = type <4 x float> 130 ; CHECK: test_v4f32.sqrt: 131 define %v4f32 @test_v4f32.sqrt(%v4f32 %a) { 132 ; CHECK: fsqrt.4s 133 %1 = call %v4f32 @llvm.sqrt.v4f32(%v4f32 %a) 134 ret %v4f32 %1 135 } 136 ; CHECK: test_v4f32.powi: 137 define %v4f32 @test_v4f32.powi(%v4f32 %a, i32 %b) { 138 ; CHECK: pow 139 %1 = call %v4f32 @llvm.powi.v4f32(%v4f32 %a, i32 %b) 140 ret %v4f32 %1 141 } 142 ; CHECK: test_v4f32.sin: 143 define %v4f32 @test_v4f32.sin(%v4f32 %a) { 144 ; CHECK: sin 145 %1 = call %v4f32 @llvm.sin.v4f32(%v4f32 %a) 146 ret %v4f32 %1 147 } 148 ; CHECK: test_v4f32.cos: 149 define %v4f32 @test_v4f32.cos(%v4f32 %a) { 150 ; CHECK: cos 151 %1 = call %v4f32 @llvm.cos.v4f32(%v4f32 %a) 152 ret %v4f32 %1 153 } 154 ; CHECK: test_v4f32.pow: 155 define %v4f32 @test_v4f32.pow(%v4f32 %a, %v4f32 %b) { 156 ; CHECK: pow 157 %1 = call %v4f32 @llvm.pow.v4f32(%v4f32 %a, %v4f32 %b) 158 ret %v4f32 %1 159 } 160 ; CHECK: test_v4f32.exp: 161 define %v4f32 @test_v4f32.exp(%v4f32 %a) { 162 ; CHECK: exp 163 %1 = call %v4f32 @llvm.exp.v4f32(%v4f32 %a) 164 ret %v4f32 %1 165 } 166 ; CHECK: test_v4f32.exp2: 167 define %v4f32 @test_v4f32.exp2(%v4f32 %a) { 168 ; CHECK: exp 169 %1 = call %v4f32 @llvm.exp2.v4f32(%v4f32 %a) 170 ret %v4f32 %1 171 } 172 ; CHECK: test_v4f32.log: 173 define %v4f32 @test_v4f32.log(%v4f32 %a) { 174 ; CHECK: log 175 %1 = call %v4f32 @llvm.log.v4f32(%v4f32 %a) 176 ret %v4f32 %1 177 } 178 ; CHECK: test_v4f32.log10: 179 define %v4f32 @test_v4f32.log10(%v4f32 %a) { 180 ; CHECK: log 181 %1 = call %v4f32 @llvm.log10.v4f32(%v4f32 %a) 182 ret %v4f32 %1 183 } 184 ; CHECK: test_v4f32.log2: 185 define %v4f32 @test_v4f32.log2(%v4f32 %a) { 186 ; CHECK: log 187 %1 = call %v4f32 @llvm.log2.v4f32(%v4f32 %a) 188 ret %v4f32 %1 189 } 190 ; CHECK: test_v4f32.fma: 191 define %v4f32 @test_v4f32.fma(%v4f32 %a, %v4f32 %b, %v4f32 %c) { 192 ; CHECK: fma 193 %1 = call %v4f32 @llvm.fma.v4f32(%v4f32 %a, %v4f32 %b, %v4f32 %c) 194 ret %v4f32 %1 195 } 196 ; CHECK: test_v4f32.fabs: 197 define %v4f32 @test_v4f32.fabs(%v4f32 %a) { 198 ; CHECK: fabs 199 %1 = call %v4f32 @llvm.fabs.v4f32(%v4f32 %a) 200 ret %v4f32 %1 201 } 202 ; CHECK: test_v4f32.floor: 203 define %v4f32 @test_v4f32.floor(%v4f32 %a) { 204 ; CHECK: frintm.4s 205 %1 = call %v4f32 @llvm.floor.v4f32(%v4f32 %a) 206 ret %v4f32 %1 207 } 208 ; CHECK: test_v4f32.ceil: 209 define %v4f32 @test_v4f32.ceil(%v4f32 %a) { 210 ; CHECK: frintp.4s 211 %1 = call %v4f32 @llvm.ceil.v4f32(%v4f32 %a) 212 ret %v4f32 %1 213 } 214 ; CHECK: test_v4f32.trunc: 215 define %v4f32 @test_v4f32.trunc(%v4f32 %a) { 216 ; CHECK: frintz.4s 217 %1 = call %v4f32 @llvm.trunc.v4f32(%v4f32 %a) 218 ret %v4f32 %1 219 } 220 ; CHECK: test_v4f32.rint: 221 define %v4f32 @test_v4f32.rint(%v4f32 %a) { 222 ; CHECK: frintx.4s 223 %1 = call %v4f32 @llvm.rint.v4f32(%v4f32 %a) 224 ret %v4f32 %1 225 } 226 ; CHECK: test_v4f32.nearbyint: 227 define %v4f32 @test_v4f32.nearbyint(%v4f32 %a) { 228 ; CHECK: frinti.4s 229 %1 = call %v4f32 @llvm.nearbyint.v4f32(%v4f32 %a) 230 ret %v4f32 %1 231 } 232 233 declare %v4f32 @llvm.sqrt.v4f32(%v4f32) #0 234 declare %v4f32 @llvm.powi.v4f32(%v4f32, i32) #0 235 declare %v4f32 @llvm.sin.v4f32(%v4f32) #0 236 declare %v4f32 @llvm.cos.v4f32(%v4f32) #0 237 declare %v4f32 @llvm.pow.v4f32(%v4f32, %v4f32) #0 238 declare %v4f32 @llvm.exp.v4f32(%v4f32) #0 239 declare %v4f32 @llvm.exp2.v4f32(%v4f32) #0 240 declare %v4f32 @llvm.log.v4f32(%v4f32) #0 241 declare %v4f32 @llvm.log10.v4f32(%v4f32) #0 242 declare %v4f32 @llvm.log2.v4f32(%v4f32) #0 243 declare %v4f32 @llvm.fma.v4f32(%v4f32, %v4f32, %v4f32) #0 244 declare %v4f32 @llvm.fabs.v4f32(%v4f32) #0 245 declare %v4f32 @llvm.floor.v4f32(%v4f32) #0 246 declare %v4f32 @llvm.ceil.v4f32(%v4f32) #0 247 declare %v4f32 @llvm.trunc.v4f32(%v4f32) #0 248 declare %v4f32 @llvm.rint.v4f32(%v4f32) #0 249 declare %v4f32 @llvm.nearbyint.v4f32(%v4f32) #0 250 251 ;;; Double vector 252 253 %v2f64 = type <2 x double> 254 ; CHECK: test_v2f64.sqrt: 255 define %v2f64 @test_v2f64.sqrt(%v2f64 %a) { 256 ; CHECK: fsqrt.2d 257 %1 = call %v2f64 @llvm.sqrt.v2f64(%v2f64 %a) 258 ret %v2f64 %1 259 } 260 ; CHECK: test_v2f64.powi: 261 define %v2f64 @test_v2f64.powi(%v2f64 %a, i32 %b) { 262 ; CHECK: pow 263 %1 = call %v2f64 @llvm.powi.v2f64(%v2f64 %a, i32 %b) 264 ret %v2f64 %1 265 } 266 ; CHECK: test_v2f64.sin: 267 define %v2f64 @test_v2f64.sin(%v2f64 %a) { 268 ; CHECK: sin 269 %1 = call %v2f64 @llvm.sin.v2f64(%v2f64 %a) 270 ret %v2f64 %1 271 } 272 ; CHECK: test_v2f64.cos: 273 define %v2f64 @test_v2f64.cos(%v2f64 %a) { 274 ; CHECK: cos 275 %1 = call %v2f64 @llvm.cos.v2f64(%v2f64 %a) 276 ret %v2f64 %1 277 } 278 ; CHECK: test_v2f64.pow: 279 define %v2f64 @test_v2f64.pow(%v2f64 %a, %v2f64 %b) { 280 ; CHECK: pow 281 %1 = call %v2f64 @llvm.pow.v2f64(%v2f64 %a, %v2f64 %b) 282 ret %v2f64 %1 283 } 284 ; CHECK: test_v2f64.exp: 285 define %v2f64 @test_v2f64.exp(%v2f64 %a) { 286 ; CHECK: exp 287 %1 = call %v2f64 @llvm.exp.v2f64(%v2f64 %a) 288 ret %v2f64 %1 289 } 290 ; CHECK: test_v2f64.exp2: 291 define %v2f64 @test_v2f64.exp2(%v2f64 %a) { 292 ; CHECK: exp 293 %1 = call %v2f64 @llvm.exp2.v2f64(%v2f64 %a) 294 ret %v2f64 %1 295 } 296 ; CHECK: test_v2f64.log: 297 define %v2f64 @test_v2f64.log(%v2f64 %a) { 298 ; CHECK: log 299 %1 = call %v2f64 @llvm.log.v2f64(%v2f64 %a) 300 ret %v2f64 %1 301 } 302 ; CHECK: test_v2f64.log10: 303 define %v2f64 @test_v2f64.log10(%v2f64 %a) { 304 ; CHECK: log 305 %1 = call %v2f64 @llvm.log10.v2f64(%v2f64 %a) 306 ret %v2f64 %1 307 } 308 ; CHECK: test_v2f64.log2: 309 define %v2f64 @test_v2f64.log2(%v2f64 %a) { 310 ; CHECK: log 311 %1 = call %v2f64 @llvm.log2.v2f64(%v2f64 %a) 312 ret %v2f64 %1 313 } 314 ; CHECK: test_v2f64.fma: 315 define %v2f64 @test_v2f64.fma(%v2f64 %a, %v2f64 %b, %v2f64 %c) { 316 ; CHECK: fma 317 %1 = call %v2f64 @llvm.fma.v2f64(%v2f64 %a, %v2f64 %b, %v2f64 %c) 318 ret %v2f64 %1 319 } 320 ; CHECK: test_v2f64.fabs: 321 define %v2f64 @test_v2f64.fabs(%v2f64 %a) { 322 ; CHECK: fabs 323 %1 = call %v2f64 @llvm.fabs.v2f64(%v2f64 %a) 324 ret %v2f64 %1 325 } 326 ; CHECK: test_v2f64.floor: 327 define %v2f64 @test_v2f64.floor(%v2f64 %a) { 328 ; CHECK: frintm.2d 329 %1 = call %v2f64 @llvm.floor.v2f64(%v2f64 %a) 330 ret %v2f64 %1 331 } 332 ; CHECK: test_v2f64.ceil: 333 define %v2f64 @test_v2f64.ceil(%v2f64 %a) { 334 ; CHECK: frintp.2d 335 %1 = call %v2f64 @llvm.ceil.v2f64(%v2f64 %a) 336 ret %v2f64 %1 337 } 338 ; CHECK: test_v2f64.trunc: 339 define %v2f64 @test_v2f64.trunc(%v2f64 %a) { 340 ; CHECK: frintz.2d 341 %1 = call %v2f64 @llvm.trunc.v2f64(%v2f64 %a) 342 ret %v2f64 %1 343 } 344 ; CHECK: test_v2f64.rint: 345 define %v2f64 @test_v2f64.rint(%v2f64 %a) { 346 ; CHECK: frintx.2d 347 %1 = call %v2f64 @llvm.rint.v2f64(%v2f64 %a) 348 ret %v2f64 %1 349 } 350 ; CHECK: test_v2f64.nearbyint: 351 define %v2f64 @test_v2f64.nearbyint(%v2f64 %a) { 352 ; CHECK: frinti.2d 353 %1 = call %v2f64 @llvm.nearbyint.v2f64(%v2f64 %a) 354 ret %v2f64 %1 355 } 356 357 declare %v2f64 @llvm.sqrt.v2f64(%v2f64) #0 358 declare %v2f64 @llvm.powi.v2f64(%v2f64, i32) #0 359 declare %v2f64 @llvm.sin.v2f64(%v2f64) #0 360 declare %v2f64 @llvm.cos.v2f64(%v2f64) #0 361 declare %v2f64 @llvm.pow.v2f64(%v2f64, %v2f64) #0 362 declare %v2f64 @llvm.exp.v2f64(%v2f64) #0 363 declare %v2f64 @llvm.exp2.v2f64(%v2f64) #0 364 declare %v2f64 @llvm.log.v2f64(%v2f64) #0 365 declare %v2f64 @llvm.log10.v2f64(%v2f64) #0 366 declare %v2f64 @llvm.log2.v2f64(%v2f64) #0 367 declare %v2f64 @llvm.fma.v2f64(%v2f64, %v2f64, %v2f64) #0 368 declare %v2f64 @llvm.fabs.v2f64(%v2f64) #0 369 declare %v2f64 @llvm.floor.v2f64(%v2f64) #0 370 declare %v2f64 @llvm.ceil.v2f64(%v2f64) #0 371 declare %v2f64 @llvm.trunc.v2f64(%v2f64) #0 372 declare %v2f64 @llvm.rint.v2f64(%v2f64) #0 373 declare %v2f64 @llvm.nearbyint.v2f64(%v2f64) #0 374 375 attributes #0 = { nounwind readonly } 376