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