1 ; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=core2 < %s | FileCheck --check-prefix=SSE2-CODEGEN %s 2 ; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s 3 4 %shifttype = type <2 x i16> 5 define %shifttype @shift2i16(%shifttype %a, %shifttype %b) { 6 entry: 7 ; SSE2: shift2i16 8 ; SSE2: cost of 12 {{.*}} ashr 9 ; SSE2-CODEGEN: shift2i16 10 ; SSE2-CODEGEN: psrlq 11 12 %0 = ashr %shifttype %a , %b 13 ret %shifttype %0 14 } 15 16 %shifttype4i16 = type <4 x i16> 17 define %shifttype4i16 @shift4i16(%shifttype4i16 %a, %shifttype4i16 %b) { 18 entry: 19 ; SSE2: shift4i16 20 ; SSE2: cost of 16 {{.*}} ashr 21 ; SSE2-CODEGEN: shift4i16 22 ; SSE2-CODEGEN: psrad 23 24 %0 = ashr %shifttype4i16 %a , %b 25 ret %shifttype4i16 %0 26 } 27 28 %shifttype8i16 = type <8 x i16> 29 define %shifttype8i16 @shift8i16(%shifttype8i16 %a, %shifttype8i16 %b) { 30 entry: 31 ; SSE2: shift8i16 32 ; SSE2: cost of 32 {{.*}} ashr 33 ; SSE2-CODEGEN: shift8i16 34 ; SSE2-CODEGEN: psraw 35 36 %0 = ashr %shifttype8i16 %a , %b 37 ret %shifttype8i16 %0 38 } 39 40 %shifttype16i16 = type <16 x i16> 41 define %shifttype16i16 @shift16i16(%shifttype16i16 %a, %shifttype16i16 %b) { 42 entry: 43 ; SSE2: shift16i16 44 ; SSE2: cost of 64 {{.*}} ashr 45 ; SSE2-CODEGEN: shift16i16 46 ; SSE2-CODEGEN: psraw 47 48 %0 = ashr %shifttype16i16 %a , %b 49 ret %shifttype16i16 %0 50 } 51 52 %shifttype32i16 = type <32 x i16> 53 define %shifttype32i16 @shift32i16(%shifttype32i16 %a, %shifttype32i16 %b) { 54 entry: 55 ; SSE2: shift32i16 56 ; SSE2: cost of 128 {{.*}} ashr 57 ; SSE2-CODEGEN: shift32i16 58 ; SSE2-CODEGEN: psraw 59 60 %0 = ashr %shifttype32i16 %a , %b 61 ret %shifttype32i16 %0 62 } 63 64 %shifttype2i32 = type <2 x i32> 65 define %shifttype2i32 @shift2i32(%shifttype2i32 %a, %shifttype2i32 %b) { 66 entry: 67 ; SSE2: shift2i32 68 ; SSE2: cost of 12 {{.*}} ashr 69 ; SSE2-CODEGEN: shift2i32 70 ; SSE2-CODEGEN: psrlq 71 72 %0 = ashr %shifttype2i32 %a , %b 73 ret %shifttype2i32 %0 74 } 75 76 %shifttype4i32 = type <4 x i32> 77 define %shifttype4i32 @shift4i32(%shifttype4i32 %a, %shifttype4i32 %b) { 78 entry: 79 ; SSE2: shift4i32 80 ; SSE2: cost of 16 {{.*}} ashr 81 ; SSE2-CODEGEN: shift4i32 82 ; SSE2-CODEGEN: psrad 83 84 %0 = ashr %shifttype4i32 %a , %b 85 ret %shifttype4i32 %0 86 } 87 88 %shifttype8i32 = type <8 x i32> 89 define %shifttype8i32 @shift8i32(%shifttype8i32 %a, %shifttype8i32 %b) { 90 entry: 91 ; SSE2: shift8i32 92 ; SSE2: cost of 32 {{.*}} ashr 93 ; SSE2-CODEGEN: shift8i32 94 ; SSE2-CODEGEN: psrad 95 96 %0 = ashr %shifttype8i32 %a , %b 97 ret %shifttype8i32 %0 98 } 99 100 %shifttype16i32 = type <16 x i32> 101 define %shifttype16i32 @shift16i32(%shifttype16i32 %a, %shifttype16i32 %b) { 102 entry: 103 ; SSE2: shift16i32 104 ; SSE2: cost of 64 {{.*}} ashr 105 ; SSE2-CODEGEN: shift16i32 106 ; SSE2-CODEGEN: psrad 107 108 %0 = ashr %shifttype16i32 %a , %b 109 ret %shifttype16i32 %0 110 } 111 112 %shifttype32i32 = type <32 x i32> 113 define %shifttype32i32 @shift32i32(%shifttype32i32 %a, %shifttype32i32 %b) { 114 entry: 115 ; SSE2: shift32i32 116 ; SSE2: cost of 128 {{.*}} ashr 117 ; SSE2-CODEGEN: shift32i32 118 ; SSE2-CODEGEN: psrad 119 120 %0 = ashr %shifttype32i32 %a , %b 121 ret %shifttype32i32 %0 122 } 123 124 %shifttype2i64 = type <2 x i64> 125 define %shifttype2i64 @shift2i64(%shifttype2i64 %a, %shifttype2i64 %b) { 126 entry: 127 ; SSE2: shift2i64 128 ; SSE2: cost of 12 {{.*}} ashr 129 ; SSE2-CODEGEN: shift2i64 130 ; SSE2-CODEGEN: psrlq 131 132 %0 = ashr %shifttype2i64 %a , %b 133 ret %shifttype2i64 %0 134 } 135 136 %shifttype4i64 = type <4 x i64> 137 define %shifttype4i64 @shift4i64(%shifttype4i64 %a, %shifttype4i64 %b) { 138 entry: 139 ; SSE2: shift4i64 140 ; SSE2: cost of 24 {{.*}} ashr 141 ; SSE2-CODEGEN: shift4i64 142 ; SSE2-CODEGEN: psrlq 143 144 %0 = ashr %shifttype4i64 %a , %b 145 ret %shifttype4i64 %0 146 } 147 148 %shifttype8i64 = type <8 x i64> 149 define %shifttype8i64 @shift8i64(%shifttype8i64 %a, %shifttype8i64 %b) { 150 entry: 151 ; SSE2: shift8i64 152 ; SSE2: cost of 48 {{.*}} ashr 153 ; SSE2-CODEGEN: shift8i64 154 ; SSE2-CODEGEN: psrlq 155 156 %0 = ashr %shifttype8i64 %a , %b 157 ret %shifttype8i64 %0 158 } 159 160 %shifttype16i64 = type <16 x i64> 161 define %shifttype16i64 @shift16i64(%shifttype16i64 %a, %shifttype16i64 %b) { 162 entry: 163 ; SSE2: shift16i64 164 ; SSE2: cost of 96 {{.*}} ashr 165 ; SSE2-CODEGEN: shift16i64 166 ; SSE2-CODEGEN: psrlq 167 168 %0 = ashr %shifttype16i64 %a , %b 169 ret %shifttype16i64 %0 170 } 171 172 %shifttype32i64 = type <32 x i64> 173 define %shifttype32i64 @shift32i64(%shifttype32i64 %a, %shifttype32i64 %b) { 174 entry: 175 ; SSE2: shift32i64 176 ; SSE2: cost of 192 {{.*}} ashr 177 ; SSE2-CODEGEN: shift32i64 178 ; SSE2-CODEGEN: psrlq 179 180 %0 = ashr %shifttype32i64 %a , %b 181 ret %shifttype32i64 %0 182 } 183 184 %shifttype2i8 = type <2 x i8> 185 define %shifttype2i8 @shift2i8(%shifttype2i8 %a, %shifttype2i8 %b) { 186 entry: 187 ; SSE2: shift2i8 188 ; SSE2: cost of 12 {{.*}} ashr 189 ; SSE2-CODEGEN: shift2i8 190 ; SSE2-CODEGEN: psrlq 191 192 %0 = ashr %shifttype2i8 %a , %b 193 ret %shifttype2i8 %0 194 } 195 196 %shifttype4i8 = type <4 x i8> 197 define %shifttype4i8 @shift4i8(%shifttype4i8 %a, %shifttype4i8 %b) { 198 entry: 199 ; SSE2: shift4i8 200 ; SSE2: cost of 16 {{.*}} ashr 201 ; SSE2-CODEGEN: shift4i8 202 ; SSE2-CODEGEN: psrad 203 204 %0 = ashr %shifttype4i8 %a , %b 205 ret %shifttype4i8 %0 206 } 207 208 %shifttype8i8 = type <8 x i8> 209 define %shifttype8i8 @shift8i8(%shifttype8i8 %a, %shifttype8i8 %b) { 210 entry: 211 ; SSE2: shift8i8 212 ; SSE2: cost of 32 {{.*}} ashr 213 ; SSE2-CODEGEN: shift8i8 214 ; SSE2-CODEGEN: psraw 215 216 %0 = ashr %shifttype8i8 %a , %b 217 ret %shifttype8i8 %0 218 } 219 220 %shifttype16i8 = type <16 x i8> 221 define %shifttype16i8 @shift16i8(%shifttype16i8 %a, %shifttype16i8 %b) { 222 entry: 223 ; SSE2: shift16i8 224 ; SSE2: cost of 54 {{.*}} ashr 225 ; SSE2-CODEGEN: shift16i8 226 ; SSE2-CODEGEN: psraw 227 228 %0 = ashr %shifttype16i8 %a , %b 229 ret %shifttype16i8 %0 230 } 231 232 %shifttype32i8 = type <32 x i8> 233 define %shifttype32i8 @shift32i8(%shifttype32i8 %a, %shifttype32i8 %b) { 234 entry: 235 ; SSE2: shift32i8 236 ; SSE2: cost of 108 {{.*}} ashr 237 ; SSE2-CODEGEN: shift32i8 238 ; SSE2-CODEGEN: psraw 239 240 %0 = ashr %shifttype32i8 %a , %b 241 ret %shifttype32i8 %0 242 } 243 244 ; Test shift by a constant a value. 245 246 %shifttypec = type <2 x i16> 247 define %shifttypec @shift2i16const(%shifttypec %a, %shifttypec %b) { 248 entry: 249 ; SSE2: shift2i16const 250 ; SSE2: cost of 4 {{.*}} ashr 251 ; SSE2-CODEGEN: shift2i16const 252 ; SSE2-CODEGEN: psrad $3 253 254 %0 = ashr %shifttypec %a , <i16 3, i16 3> 255 ret %shifttypec %0 256 } 257 258 %shifttypec4i16 = type <4 x i16> 259 define %shifttypec4i16 @shift4i16const(%shifttypec4i16 %a, %shifttypec4i16 %b) { 260 entry: 261 ; SSE2: shift4i16const 262 ; SSE2: cost of 1 {{.*}} ashr 263 ; SSE2-CODEGEN: shift4i16const 264 ; SSE2-CODEGEN: psrad $3 265 266 %0 = ashr %shifttypec4i16 %a , <i16 3, i16 3, i16 3, i16 3> 267 ret %shifttypec4i16 %0 268 } 269 270 %shifttypec8i16 = type <8 x i16> 271 define %shifttypec8i16 @shift8i16const(%shifttypec8i16 %a, %shifttypec8i16 %b) { 272 entry: 273 ; SSE2: shift8i16const 274 ; SSE2: cost of 1 {{.*}} ashr 275 ; SSE2-CODEGEN: shift8i16const 276 ; SSE2-CODEGEN: psraw $3 277 278 %0 = ashr %shifttypec8i16 %a , <i16 3, i16 3, i16 3, i16 3, 279 i16 3, i16 3, i16 3, i16 3> 280 ret %shifttypec8i16 %0 281 } 282 283 %shifttypec16i16 = type <16 x i16> 284 define %shifttypec16i16 @shift16i16const(%shifttypec16i16 %a, 285 %shifttypec16i16 %b) { 286 entry: 287 ; SSE2: shift16i16const 288 ; SSE2: cost of 2 {{.*}} ashr 289 ; SSE2-CODEGEN: shift16i16const 290 ; SSE2-CODEGEN: psraw $3 291 292 %0 = ashr %shifttypec16i16 %a , <i16 3, i16 3, i16 3, i16 3, 293 i16 3, i16 3, i16 3, i16 3, 294 i16 3, i16 3, i16 3, i16 3, 295 i16 3, i16 3, i16 3, i16 3> 296 ret %shifttypec16i16 %0 297 } 298 299 %shifttypec32i16 = type <32 x i16> 300 define %shifttypec32i16 @shift32i16const(%shifttypec32i16 %a, 301 %shifttypec32i16 %b) { 302 entry: 303 ; SSE2: shift32i16const 304 ; SSE2: cost of 4 {{.*}} ashr 305 ; SSE2-CODEGEN: shift32i16const 306 ; SSE2-CODEGEN: psraw $3 307 308 %0 = ashr %shifttypec32i16 %a , <i16 3, i16 3, i16 3, i16 3, 309 i16 3, i16 3, i16 3, i16 3, 310 i16 3, i16 3, i16 3, i16 3, 311 i16 3, i16 3, i16 3, i16 3, 312 i16 3, i16 3, i16 3, i16 3, 313 i16 3, i16 3, i16 3, i16 3, 314 i16 3, i16 3, i16 3, i16 3, 315 i16 3, i16 3, i16 3, i16 3> 316 ret %shifttypec32i16 %0 317 } 318 319 %shifttypec2i32 = type <2 x i32> 320 define %shifttypec2i32 @shift2i32c(%shifttypec2i32 %a, %shifttypec2i32 %b) { 321 entry: 322 ; SSE2: shift2i32c 323 ; SSE2: cost of 4 {{.*}} ashr 324 ; SSE2-CODEGEN: shift2i32c 325 ; SSE2-CODEGEN: psrad $3 326 327 %0 = ashr %shifttypec2i32 %a , <i32 3, i32 3> 328 ret %shifttypec2i32 %0 329 } 330 331 %shifttypec4i32 = type <4 x i32> 332 define %shifttypec4i32 @shift4i32c(%shifttypec4i32 %a, %shifttypec4i32 %b) { 333 entry: 334 ; SSE2: shift4i32c 335 ; SSE2: cost of 1 {{.*}} ashr 336 ; SSE2-CODEGEN: shift4i32c 337 ; SSE2-CODEGEN: psrad $3 338 339 %0 = ashr %shifttypec4i32 %a , <i32 3, i32 3, i32 3, i32 3> 340 ret %shifttypec4i32 %0 341 } 342 343 %shifttypec8i32 = type <8 x i32> 344 define %shifttypec8i32 @shift8i32c(%shifttypec8i32 %a, %shifttypec8i32 %b) { 345 entry: 346 ; SSE2: shift8i32c 347 ; SSE2: cost of 2 {{.*}} ashr 348 ; SSE2-CODEGEN: shift8i32c 349 ; SSE2-CODEGEN: psrad $3 350 351 %0 = ashr %shifttypec8i32 %a , <i32 3, i32 3, i32 3, i32 3, 352 i32 3, i32 3, i32 3, i32 3> 353 ret %shifttypec8i32 %0 354 } 355 356 %shifttypec16i32 = type <16 x i32> 357 define %shifttypec16i32 @shift16i32c(%shifttypec16i32 %a, %shifttypec16i32 %b) { 358 entry: 359 ; SSE2: shift16i32c 360 ; SSE2: cost of 4 {{.*}} ashr 361 ; SSE2-CODEGEN: shift16i32c 362 ; SSE2-CODEGEN: psrad $3 363 364 %0 = ashr %shifttypec16i32 %a , <i32 3, i32 3, i32 3, i32 3, 365 i32 3, i32 3, i32 3, i32 3, 366 i32 3, i32 3, i32 3, i32 3, 367 i32 3, i32 3, i32 3, i32 3> 368 ret %shifttypec16i32 %0 369 } 370 371 %shifttypec32i32 = type <32 x i32> 372 define %shifttypec32i32 @shift32i32c(%shifttypec32i32 %a, %shifttypec32i32 %b) { 373 entry: 374 ; SSE2: shift32i32c 375 ; getTypeConversion fails here and promotes this to a i64. 376 ; SSE2: cost of 8 {{.*}} ashr 377 ; SSE2-CODEGEN: shift32i32c 378 ; SSE2-CODEGEN: psrad $3 379 %0 = ashr %shifttypec32i32 %a , <i32 3, i32 3, i32 3, i32 3, 380 i32 3, i32 3, i32 3, i32 3, 381 i32 3, i32 3, i32 3, i32 3, 382 i32 3, i32 3, i32 3, i32 3, 383 i32 3, i32 3, i32 3, i32 3, 384 i32 3, i32 3, i32 3, i32 3, 385 i32 3, i32 3, i32 3, i32 3, 386 i32 3, i32 3, i32 3, i32 3> 387 ret %shifttypec32i32 %0 388 } 389 390 %shifttypec2i64 = type <2 x i64> 391 define %shifttypec2i64 @shift2i64c(%shifttypec2i64 %a, %shifttypec2i64 %b) { 392 entry: 393 ; SSE2: shift2i64c 394 ; SSE2: cost of 4 {{.*}} ashr 395 ; SSE2-CODEGEN: shift2i64c 396 ; SSE2-CODEGEN: psrad $3 397 398 %0 = ashr %shifttypec2i64 %a , <i64 3, i64 3> 399 ret %shifttypec2i64 %0 400 } 401 402 %shifttypec4i64 = type <4 x i64> 403 define %shifttypec4i64 @shift4i64c(%shifttypec4i64 %a, %shifttypec4i64 %b) { 404 entry: 405 ; SSE2: shift4i64c 406 ; SSE2: cost of 8 {{.*}} ashr 407 ; SSE2-CODEGEN: shift4i64c 408 ; SSE2-CODEGEN: psrad $3 409 410 %0 = ashr %shifttypec4i64 %a , <i64 3, i64 3, i64 3, i64 3> 411 ret %shifttypec4i64 %0 412 } 413 414 %shifttypec8i64 = type <8 x i64> 415 define %shifttypec8i64 @shift8i64c(%shifttypec8i64 %a, %shifttypec8i64 %b) { 416 entry: 417 ; SSE2: shift8i64c 418 ; SSE2: cost of 16 {{.*}} ashr 419 ; SSE2-CODEGEN: shift8i64c 420 ; SSE2-CODEGEN: psrad $3 421 422 %0 = ashr %shifttypec8i64 %a , <i64 3, i64 3, i64 3, i64 3, 423 i64 3, i64 3, i64 3, i64 3> 424 ret %shifttypec8i64 %0 425 } 426 427 %shifttypec16i64 = type <16 x i64> 428 define %shifttypec16i64 @shift16i64c(%shifttypec16i64 %a, %shifttypec16i64 %b) { 429 entry: 430 ; SSE2: shift16i64c 431 ; SSE2: cost of 32 {{.*}} ashr 432 ; SSE2-CODEGEN: shift16i64c 433 ; SSE2-CODEGEN: psrad $3 434 435 %0 = ashr %shifttypec16i64 %a , <i64 3, i64 3, i64 3, i64 3, 436 i64 3, i64 3, i64 3, i64 3, 437 i64 3, i64 3, i64 3, i64 3, 438 i64 3, i64 3, i64 3, i64 3> 439 ret %shifttypec16i64 %0 440 } 441 442 %shifttypec32i64 = type <32 x i64> 443 define %shifttypec32i64 @shift32i64c(%shifttypec32i64 %a, %shifttypec32i64 %b) { 444 entry: 445 ; SSE2: shift32i64c 446 ; SSE2: cost of 64 {{.*}} ashr 447 ; SSE2-CODEGEN: shift32i64c 448 ; SSE2-CODEGEN: psrad $3 449 450 %0 = ashr %shifttypec32i64 %a ,<i64 3, i64 3, i64 3, i64 3, 451 i64 3, i64 3, i64 3, i64 3, 452 i64 3, i64 3, i64 3, i64 3, 453 i64 3, i64 3, i64 3, i64 3, 454 i64 3, i64 3, i64 3, i64 3, 455 i64 3, i64 3, i64 3, i64 3, 456 i64 3, i64 3, i64 3, i64 3, 457 i64 3, i64 3, i64 3, i64 3> 458 ret %shifttypec32i64 %0 459 } 460 461 %shifttypec2i8 = type <2 x i8> 462 define %shifttypec2i8 @shift2i8c(%shifttypec2i8 %a, %shifttypec2i8 %b) { 463 entry: 464 ; SSE2: shift2i8c 465 ; SSE2: cost of 4 {{.*}} ashr 466 ; SSE2-CODEGEN: shift2i8c 467 ; SSE2-CODEGEN: psrad $3 468 469 %0 = ashr %shifttypec2i8 %a , <i8 3, i8 3> 470 ret %shifttypec2i8 %0 471 } 472 473 %shifttypec4i8 = type <4 x i8> 474 define %shifttypec4i8 @shift4i8c(%shifttypec4i8 %a, %shifttypec4i8 %b) { 475 entry: 476 ; SSE2: shift4i8c 477 ; SSE2: cost of 1 {{.*}} ashr 478 ; SSE2-CODEGEN: shift4i8c 479 ; SSE2-CODEGEN: psrad $3 480 481 %0 = ashr %shifttypec4i8 %a , <i8 3, i8 3, i8 3, i8 3> 482 ret %shifttypec4i8 %0 483 } 484 485 %shifttypec8i8 = type <8 x i8> 486 define %shifttypec8i8 @shift8i8c(%shifttypec8i8 %a, %shifttypec8i8 %b) { 487 entry: 488 ; SSE2: shift8i8c 489 ; SSE2: cost of 1 {{.*}} ashr 490 ; SSE2-CODEGEN: shift8i8c 491 ; SSE2-CODEGEN: psraw $3 492 493 %0 = ashr %shifttypec8i8 %a , <i8 3, i8 3, i8 3, i8 3, 494 i8 3, i8 3, i8 3, i8 3> 495 ret %shifttypec8i8 %0 496 } 497 498 %shifttypec16i8 = type <16 x i8> 499 define %shifttypec16i8 @shift16i8c(%shifttypec16i8 %a, %shifttypec16i8 %b) { 500 entry: 501 ; SSE2: shift16i8c 502 ; SSE2: cost of 4 {{.*}} ashr 503 ; SSE2-CODEGEN: shift16i8c 504 ; SSE2-CODEGEN: psrlw $3 505 506 %0 = ashr %shifttypec16i8 %a , <i8 3, i8 3, i8 3, i8 3, 507 i8 3, i8 3, i8 3, i8 3, 508 i8 3, i8 3, i8 3, i8 3, 509 i8 3, i8 3, i8 3, i8 3> 510 ret %shifttypec16i8 %0 511 } 512 513 %shifttypec32i8 = type <32 x i8> 514 define %shifttypec32i8 @shift32i8c(%shifttypec32i8 %a, %shifttypec32i8 %b) { 515 entry: 516 ; SSE2: shift32i8c 517 ; SSE2: cost of 8 {{.*}} ashr 518 ; SSE2-CODEGEN: shift32i8c 519 ; SSE2-CODEGEN: psrlw $3 520 521 %0 = ashr %shifttypec32i8 %a , <i8 3, i8 3, i8 3, i8 3, 522 i8 3, i8 3, i8 3, i8 3, 523 i8 3, i8 3, i8 3, i8 3, 524 i8 3, i8 3, i8 3, i8 3, 525 i8 3, i8 3, i8 3, i8 3, 526 i8 3, i8 3, i8 3, i8 3, 527 i8 3, i8 3, i8 3, i8 3, 528 i8 3, i8 3, i8 3, i8 3> 529 ret %shifttypec32i8 %0 530 } 531 532