Home | History | Annotate | Download | only in PowerPC
      1 ; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx < %s | FileCheck %s
      2 ; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx < %s | FileCheck -check-prefix=CHECK-REG %s
      3 ; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx -fast-isel -O0 < %s | FileCheck %s
      4 ; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx -fast-isel -O0 < %s | FileCheck -check-prefix=CHECK-FISL %s
      5 ; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu -mattr=+vsx < %s | FileCheck -check-prefix=CHECK-LE %s
      6 
      7 define double @test1(double %a, double %b) {
      8 entry:
      9   %v = fmul double %a, %b
     10   ret double %v
     11 
     12 ; CHECK-LABEL: @test1
     13 ; CHECK: xsmuldp 1, 1, 2
     14 ; CHECK: blr
     15 
     16 ; CHECK-LE-LABEL: @test1
     17 ; CHECK-LE: xsmuldp 1, 1, 2
     18 ; CHECK-LE: blr
     19 }
     20 
     21 define double @test2(double %a, double %b) {
     22 entry:
     23   %v = fdiv double %a, %b
     24   ret double %v
     25 
     26 ; CHECK-LABEL: @test2
     27 ; CHECK: xsdivdp 1, 1, 2
     28 ; CHECK: blr
     29 
     30 ; CHECK-LE-LABEL: @test2
     31 ; CHECK-LE: xsdivdp 1, 1, 2
     32 ; CHECK-LE: blr
     33 }
     34 
     35 define double @test3(double %a, double %b) {
     36 entry:
     37   %v = fadd double %a, %b
     38   ret double %v
     39 
     40 ; CHECK-LABEL: @test3
     41 ; CHECK: xsadddp 1, 1, 2
     42 ; CHECK: blr
     43 
     44 ; CHECK-LE-LABEL: @test3
     45 ; CHECK-LE: xsadddp 1, 1, 2
     46 ; CHECK-LE: blr
     47 }
     48 
     49 define <2 x double> @test4(<2 x double> %a, <2 x double> %b) {
     50 entry:
     51   %v = fadd <2 x double> %a, %b
     52   ret <2 x double> %v
     53 
     54 ; CHECK-LABEL: @test4
     55 ; CHECK: xvadddp 34, 34, 35
     56 ; CHECK: blr
     57 
     58 ; CHECK-LE-LABEL: @test4
     59 ; CHECK-LE: xvadddp 34, 34, 35
     60 ; CHECK-LE: blr
     61 }
     62 
     63 define <4 x i32> @test5(<4 x i32> %a, <4 x i32> %b) {
     64 entry:
     65   %v = xor <4 x i32> %a, %b
     66   ret <4 x i32> %v
     67 
     68 ; CHECK-REG-LABEL: @test5
     69 ; CHECK-REG: xxlxor 34, 34, 35
     70 ; CHECK-REG: blr
     71 
     72 ; CHECK-FISL-LABEL: @test5
     73 ; CHECK-FISL: xxlxor 34, 34, 35
     74 ; CHECK-FISL: blr
     75 
     76 ; CHECK-LE-LABEL: @test5
     77 ; CHECK-LE: xxlxor 34, 34, 35
     78 ; CHECK-LE: blr
     79 }
     80 
     81 define <8 x i16> @test6(<8 x i16> %a, <8 x i16> %b) {
     82 entry:
     83   %v = xor <8 x i16> %a, %b
     84   ret <8 x i16> %v
     85 
     86 ; CHECK-REG-LABEL: @test6
     87 ; CHECK-REG: xxlxor 34, 34, 35
     88 ; CHECK-REG: blr
     89 
     90 ; CHECK-FISL-LABEL: @test6
     91 ; CHECK-FISL: xxlxor 34, 34, 35
     92 ; CHECK-FISL: blr
     93 
     94 ; CHECK-LE-LABEL: @test6
     95 ; CHECK-LE: xxlxor 34, 34, 35
     96 ; CHECK-LE: blr
     97 }
     98 
     99 define <16 x i8> @test7(<16 x i8> %a, <16 x i8> %b) {
    100 entry:
    101   %v = xor <16 x i8> %a, %b
    102   ret <16 x i8> %v
    103 
    104 ; CHECK-REG-LABEL: @test7
    105 ; CHECK-REG: xxlxor 34, 34, 35
    106 ; CHECK-REG: blr
    107 
    108 ; CHECK-FISL-LABEL: @test7
    109 ; CHECK-FISL: xxlxor 34, 34, 35
    110 ; CHECK-FISL: blr
    111 
    112 ; CHECK-LE-LABEL: @test7
    113 ; CHECK-LE: xxlxor 34, 34, 35
    114 ; CHECK-LE: blr
    115 }
    116 
    117 define <4 x i32> @test8(<4 x i32> %a, <4 x i32> %b) {
    118 entry:
    119   %v = or <4 x i32> %a, %b
    120   ret <4 x i32> %v
    121 
    122 ; CHECK-REG-LABEL: @test8
    123 ; CHECK-REG: xxlor 34, 34, 35
    124 ; CHECK-REG: blr
    125 
    126 ; CHECK-FISL-LABEL: @test8
    127 ; CHECK-FISL: xxlor 34, 34, 35
    128 ; CHECK-FISL: blr
    129 
    130 ; CHECK-LE-LABEL: @test8
    131 ; CHECK-LE: xxlor 34, 34, 35
    132 ; CHECK-LE: blr
    133 }
    134 
    135 define <8 x i16> @test9(<8 x i16> %a, <8 x i16> %b) {
    136 entry:
    137   %v = or <8 x i16> %a, %b
    138   ret <8 x i16> %v
    139 
    140 ; CHECK-REG-LABEL: @test9
    141 ; CHECK-REG: xxlor 34, 34, 35
    142 ; CHECK-REG: blr
    143 
    144 ; CHECK-FISL-LABEL: @test9
    145 ; CHECK-FISL: xxlor 34, 34, 35
    146 ; CHECK-FISL: blr
    147 
    148 ; CHECK-LE-LABEL: @test9
    149 ; CHECK-LE: xxlor 34, 34, 35
    150 ; CHECK-LE: blr
    151 }
    152 
    153 define <16 x i8> @test10(<16 x i8> %a, <16 x i8> %b) {
    154 entry:
    155   %v = or <16 x i8> %a, %b
    156   ret <16 x i8> %v
    157 
    158 ; CHECK-REG-LABEL: @test10
    159 ; CHECK-REG: xxlor 34, 34, 35
    160 ; CHECK-REG: blr
    161 
    162 ; CHECK-FISL-LABEL: @test10
    163 ; CHECK-FISL: xxlor 34, 34, 35
    164 ; CHECK-FISL: blr
    165 
    166 ; CHECK-LE-LABEL: @test10
    167 ; CHECK-LE: xxlor 34, 34, 35
    168 ; CHECK-LE: blr
    169 }
    170 
    171 define <4 x i32> @test11(<4 x i32> %a, <4 x i32> %b) {
    172 entry:
    173   %v = and <4 x i32> %a, %b
    174   ret <4 x i32> %v
    175 
    176 ; CHECK-REG-LABEL: @test11
    177 ; CHECK-REG: xxland 34, 34, 35
    178 ; CHECK-REG: blr
    179 
    180 ; CHECK-FISL-LABEL: @test11
    181 ; CHECK-FISL: xxland 34, 34, 35
    182 ; CHECK-FISL: blr
    183 
    184 ; CHECK-LE-LABEL: @test11
    185 ; CHECK-LE: xxland 34, 34, 35
    186 ; CHECK-LE: blr
    187 }
    188 
    189 define <8 x i16> @test12(<8 x i16> %a, <8 x i16> %b) {
    190 entry:
    191   %v = and <8 x i16> %a, %b
    192   ret <8 x i16> %v
    193 
    194 ; CHECK-REG-LABEL: @test12
    195 ; CHECK-REG: xxland 34, 34, 35
    196 ; CHECK-REG: blr
    197 
    198 ; CHECK-FISL-LABEL: @test12
    199 ; CHECK-FISL: xxland 34, 34, 35
    200 ; CHECK-FISL: blr
    201 
    202 ; CHECK-LE-LABEL: @test12
    203 ; CHECK-LE: xxland 34, 34, 35
    204 ; CHECK-LE: blr
    205 }
    206 
    207 define <16 x i8> @test13(<16 x i8> %a, <16 x i8> %b) {
    208 entry:
    209   %v = and <16 x i8> %a, %b
    210   ret <16 x i8> %v
    211 
    212 ; CHECK-REG-LABEL: @test13
    213 ; CHECK-REG: xxland 34, 34, 35
    214 ; CHECK-REG: blr
    215 
    216 ; CHECK-FISL-LABEL: @test13
    217 ; CHECK-FISL: xxland 34, 34, 35
    218 ; CHECK-FISL: blr
    219 
    220 ; CHECK-LE-LABEL: @test13
    221 ; CHECK-LE: xxland 34, 34, 35
    222 ; CHECK-LE: blr
    223 }
    224 
    225 define <4 x i32> @test14(<4 x i32> %a, <4 x i32> %b) {
    226 entry:
    227   %v = or <4 x i32> %a, %b
    228   %w = xor <4 x i32> %v, <i32 -1, i32 -1, i32 -1, i32 -1>
    229   ret <4 x i32> %w
    230 
    231 ; CHECK-REG-LABEL: @test14
    232 ; CHECK-REG: xxlnor 34, 34, 35
    233 ; CHECK-REG: blr
    234 
    235 ; CHECK-FISL-LABEL: @test14
    236 ; CHECK-FISL: xxlor 0, 34, 35
    237 ; CHECK-FISL: xxlnor 34, 34, 35
    238 ; CHECK-FISL-NOT: lis
    239 ; CHECK-FISL-NOT: ori
    240 ; CHECK-FISL: li 3, -16
    241 ; CHECK-FISL-NOT: lis
    242 ; CHECK-FISL-NOT: ori
    243 ; CHECK-FISL: stxvd2x 0, 1, 3
    244 ; CHECK-FISL: blr
    245 
    246 ; CHECK-LE-LABEL: @test14
    247 ; CHECK-LE: xxlnor 34, 34, 35
    248 ; CHECK-LE: blr
    249 }
    250 
    251 define <8 x i16> @test15(<8 x i16> %a, <8 x i16> %b) {
    252 entry:
    253   %v = or <8 x i16> %a, %b
    254   %w = xor <8 x i16> %v, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
    255   ret <8 x i16> %w
    256 
    257 ; CHECK-REG-LABEL: @test15
    258 ; CHECK-REG: xxlnor 34, 34, 35
    259 ; CHECK-REG: blr
    260 
    261 ; CHECK-FISL-LABEL: @test15
    262 ; CHECK-FISL: xxlor 0, 34, 35
    263 ; CHECK-FISL: xxlor 36, 0, 0
    264 ; CHECK-FISL: xxlnor 0, 34, 35
    265 ; CHECK-FISL: xxlor 34, 0, 0
    266 ; CHECK-FISL-NOT: lis
    267 ; CHECK-FISL-NOT: ori
    268 ; CHECK-FISL: li 3, -16
    269 ; CHECK-FISL-NOT: lis
    270 ; CHECK-FISL-NOT: ori
    271 ; CHECK-FISL: stxvd2x 36, 1, 3
    272 ; CHECK-FISL: blr
    273 
    274 ; CHECK-LE-LABEL: @test15
    275 ; CHECK-LE: xxlnor 34, 34, 35
    276 ; CHECK-LE: blr
    277 }
    278 
    279 define <16 x i8> @test16(<16 x i8> %a, <16 x i8> %b) {
    280 entry:
    281   %v = or <16 x i8> %a, %b
    282   %w = xor <16 x i8> %v, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
    283   ret <16 x i8> %w
    284 
    285 ; CHECK-REG-LABEL: @test16
    286 ; CHECK-REG: xxlnor 34, 34, 35
    287 ; CHECK-REG: blr
    288 
    289 ; CHECK-FISL-LABEL: @test16
    290 ; CHECK-FISL: xxlor 0, 34, 35
    291 ; CHECK-FISL: xxlor 36, 0, 0
    292 ; CHECK-FISL: xxlnor 0, 34, 35
    293 ; CHECK-FISL: xxlor 34, 0, 0
    294 ; CHECK-FISL-NOT: lis
    295 ; CHECK-FISL-NOT: ori
    296 ; CHECK-FISL: li 3, -16
    297 ; CHECK-FISL-NOT: lis
    298 ; CHECK-FISL-NOT: ori
    299 ; CHECK-FISL: stxvd2x 36, 1, 3
    300 ; CHECK-FISL: blr
    301 
    302 ; CHECK-LE-LABEL: @test16
    303 ; CHECK-LE: xxlnor 34, 34, 35
    304 ; CHECK-LE: blr
    305 }
    306 
    307 define <4 x i32> @test17(<4 x i32> %a, <4 x i32> %b) {
    308 entry:
    309   %w = xor <4 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1>
    310   %v = and <4 x i32> %a, %w
    311   ret <4 x i32> %v
    312 
    313 ; CHECK-REG-LABEL: @test17
    314 ; CHECK-REG: xxlandc 34, 34, 35
    315 ; CHECK-REG: blr
    316 
    317 ; CHECK-FISL-LABEL: @test17
    318 ; CHECK-FISL: xxlnor 35, 35, 35
    319 ; CHECK-FISL: xxland 34, 34, 35
    320 ; CHECK-FISL: blr
    321 
    322 ; CHECK-LE-LABEL: @test17
    323 ; CHECK-LE: xxlandc 34, 34, 35
    324 ; CHECK-LE: blr
    325 }
    326 
    327 define <8 x i16> @test18(<8 x i16> %a, <8 x i16> %b) {
    328 entry:
    329   %w = xor <8 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
    330   %v = and <8 x i16> %a, %w
    331   ret <8 x i16> %v
    332 
    333 ; CHECK-REG-LABEL: @test18
    334 ; CHECK-REG: xxlandc 34, 34, 35
    335 ; CHECK-REG: blr
    336 
    337 ; CHECK-FISL-LABEL: @test18
    338 ; CHECK-FISL: xxlnor 0, 35, 35
    339 ; CHECK-FISL: xxlor 36, 0, 0
    340 ; CHECK-FISL: xxlandc 0, 34, 35
    341 ; CHECK-FISL: xxlor 34, 0, 0
    342 ; CHECK-FISL-NOT: lis
    343 ; CHECK-FISL-NOT: ori
    344 ; CHECK-FISL: li 3, -16
    345 ; CHECK-FISL-NOT: lis
    346 ; CHECK-FISL-NOT: ori
    347 ; CHECK-FISL: stxvd2x 36, 1, 3
    348 ; CHECK-FISL: blr
    349 
    350 ; CHECK-LE-LABEL: @test18
    351 ; CHECK-LE: xxlandc 34, 34, 35
    352 ; CHECK-LE: blr
    353 }
    354 
    355 define <16 x i8> @test19(<16 x i8> %a, <16 x i8> %b) {
    356 entry:
    357   %w = xor <16 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
    358   %v = and <16 x i8> %a, %w
    359   ret <16 x i8> %v
    360 
    361 ; CHECK-REG-LABEL: @test19
    362 ; CHECK-REG: xxlandc 34, 34, 35
    363 ; CHECK-REG: blr
    364 
    365 ; CHECK-FISL-LABEL: @test19
    366 ; CHECK-FISL: xxlnor 0, 35, 35
    367 ; CHECK-FISL: xxlor 36, 0, 0
    368 ; CHECK-FISL: xxlandc 0, 34, 35
    369 ; CHECK-FISL: xxlor 34, 0, 0
    370 ; CHECK-FISL-NOT: lis
    371 ; CHECK-FISL-NOT: ori
    372 ; CHECK-FISL: li 3, -16
    373 ; CHECK-FISL-NOT: lis
    374 ; CHECK-FISL-NOT: ori
    375 ; CHECK-FISL: stxvd2x 36, 1, 3
    376 ; CHECK-FISL: blr
    377 
    378 ; CHECK-LE-LABEL: @test19
    379 ; CHECK-LE: xxlandc 34, 34, 35
    380 ; CHECK-LE: blr
    381 }
    382 
    383 define <4 x i32> @test20(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
    384 entry:
    385   %m = icmp eq <4 x i32> %c, %d
    386   %v = select <4 x i1> %m, <4 x i32> %a, <4 x i32> %b
    387   ret <4 x i32> %v
    388 
    389 ; CHECK-REG-LABEL: @test20
    390 ; CHECK-REG: vcmpequw {{[0-9]+}}, 4, 5
    391 ; CHECK-REG: xxsel 34, 35, 34, {{[0-9]+}}
    392 ; CHECK-REG: blr
    393 
    394 ; CHECK-FISL-LABEL: @test20
    395 ; CHECK-FISL: vcmpequw {{[0-9]+}}, 4, 5
    396 ; CHECK-FISL: xxsel 34, 35, 34, {{[0-9]+}}
    397 ; CHECK-FISL: blr
    398 
    399 ; CHECK-LE-LABEL: @test20
    400 ; CHECK-LE: vcmpequw {{[0-9]+}}, 4, 5
    401 ; CHECK-LE: xxsel 34, 35, 34, {{[0-9]+}}
    402 ; CHECK-LE: blr
    403 }
    404 
    405 define <4 x float> @test21(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {
    406 entry:
    407   %m = fcmp oeq <4 x float> %c, %d
    408   %v = select <4 x i1> %m, <4 x float> %a, <4 x float> %b
    409   ret <4 x float> %v
    410 
    411 ; CHECK-REG-LABEL: @test21
    412 ; CHECK-REG: xvcmpeqsp [[V1:[0-9]+]], 36, 37
    413 ; CHECK-REG: xxsel 34, 35, 34, [[V1]]
    414 ; CHECK-REG: blr
    415 
    416 ; CHECK-FISL-LABEL: @test21
    417 ; CHECK-FISL: xvcmpeqsp [[V1:[0-9]+]], 36, 37
    418 ; CHECK-FISL: xxsel 34, 35, 34, [[V1]]
    419 ; CHECK-FISL: blr
    420 
    421 ; CHECK-LE-LABEL: @test21
    422 ; CHECK-LE: xvcmpeqsp [[V1:[0-9]+]], 36, 37
    423 ; CHECK-LE: xxsel 34, 35, 34, [[V1]]
    424 ; CHECK-LE: blr
    425 }
    426 
    427 define <4 x float> @test22(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {
    428 entry:
    429   %m = fcmp ueq <4 x float> %c, %d
    430   %v = select <4 x i1> %m, <4 x float> %a, <4 x float> %b
    431   ret <4 x float> %v
    432 
    433 ; CHECK-REG-LABEL: @test22
    434 ; CHECK-REG-DAG: xvcmpeqsp {{[0-9]+}}, 37, 37
    435 ; CHECK-REG-DAG: xvcmpeqsp {{[0-9]+}}, 36, 36
    436 ; CHECK-REG-DAG: xvcmpeqsp {{[0-9]+}}, 36, 37
    437 ; CHECK-REG-DAG: xxlnor
    438 ; CHECK-REG-DAG: xxlnor
    439 ; CHECK-REG-DAG: xxlor
    440 ; CHECK-REG-DAG: xxlor
    441 ; CHECK-REG: xxsel 34, 35, 34, {{[0-9]+}}
    442 ; CHECK-REG: blr
    443 
    444 ; CHECK-FISL-LABEL: @test22
    445 ; CHECK-FISL-DAG: xvcmpeqsp {{[0-9]+}}, 37, 37
    446 ; CHECK-FISL-DAG: xvcmpeqsp {{[0-9]+}}, 36, 36
    447 ; CHECK-FISL-DAG: xvcmpeqsp {{[0-9]+}}, 36, 37
    448 ; CHECK-FISL-DAG: xxlnor
    449 ; CHECK-FISL-DAG: xxlnor
    450 ; CHECK-FISL-DAG: xxlor
    451 ; CHECK-FISL-DAG: xxlor
    452 ; CHECK-FISL: xxsel 34, 35, 34, {{[0-9]+}}
    453 ; CHECK-FISL: blr
    454 
    455 ; CHECK-LE-LABEL: @test22
    456 ; CHECK-LE-DAG: xvcmpeqsp {{[0-9]+}}, 37, 37
    457 ; CHECK-LE-DAG: xvcmpeqsp {{[0-9]+}}, 36, 36
    458 ; CHECK-LE-DAG: xvcmpeqsp {{[0-9]+}}, 36, 37
    459 ; CHECK-LE-DAG: xxlnor
    460 ; CHECK-LE-DAG: xxlnor
    461 ; CHECK-LE-DAG: xxlor
    462 ; CHECK-LE-DAG: xxlor
    463 ; CHECK-LE: xxsel 34, 35, 34, {{[0-9]+}}
    464 ; CHECK-LE: blr
    465 }
    466 
    467 define <8 x i16> @test23(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, <8 x i16> %d) {
    468 entry:
    469   %m = icmp eq <8 x i16> %c, %d
    470   %v = select <8 x i1> %m, <8 x i16> %a, <8 x i16> %b
    471   ret <8 x i16> %v
    472 
    473 ; CHECK-REG-LABEL: @test23
    474 ; CHECK-REG: vcmpequh {{[0-9]+}}, 4, 5
    475 ; CHECK-REG: xxsel 34, 35, 34, {{[0-9]+}}
    476 ; CHECK-REG: blr
    477 
    478 ; CHECK-FISL-LABEL: @test23
    479 ; CHECK-FISL: vcmpequh 4, 4, 5
    480 ; CHECK-FISL: xxsel 34, 35, 34, 36
    481 ; CHECK-FISL: blr
    482 
    483 ; CHECK-LE-LABEL: @test23
    484 ; CHECK-LE: vcmpequh {{[0-9]+}}, 4, 5
    485 ; CHECK-LE: xxsel 34, 35, 34, {{[0-9]+}}
    486 ; CHECK-LE: blr
    487 }
    488 
    489 define <16 x i8> @test24(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, <16 x i8> %d) {
    490 entry:
    491   %m = icmp eq <16 x i8> %c, %d
    492   %v = select <16 x i1> %m, <16 x i8> %a, <16 x i8> %b
    493   ret <16 x i8> %v
    494 
    495 ; CHECK-REG-LABEL: @test24
    496 ; CHECK-REG: vcmpequb {{[0-9]+}}, 4, 5
    497 ; CHECK-REG: xxsel 34, 35, 34, {{[0-9]+}}
    498 ; CHECK-REG: blr
    499 
    500 ; CHECK-FISL-LABEL: @test24
    501 ; CHECK-FISL: vcmpequb 4, 4, 5
    502 ; CHECK-FISL: xxsel 34, 35, 34, 36
    503 ; CHECK-FISL: blr
    504 
    505 ; CHECK-LE-LABEL: @test24
    506 ; CHECK-LE: vcmpequb {{[0-9]+}}, 4, 5
    507 ; CHECK-LE: xxsel 34, 35, 34, {{[0-9]+}}
    508 ; CHECK-LE: blr
    509 }
    510 
    511 define <2 x double> @test25(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %d) {
    512 entry:
    513   %m = fcmp oeq <2 x double> %c, %d
    514   %v = select <2 x i1> %m, <2 x double> %a, <2 x double> %b
    515   ret <2 x double> %v
    516 
    517 ; CHECK-LABEL: @test25
    518 ; CHECK: xvcmpeqdp [[V1:[0-9]+]], 36, 37
    519 ; CHECK: xxsel 34, 35, 34, [[V1]]
    520 ; CHECK: blr
    521 
    522 ; CHECK-LE-LABEL: @test25
    523 ; CHECK-LE: xvcmpeqdp [[V1:[0-9]+]], 36, 37
    524 ; CHECK-LE: xxsel 34, 35, 34, [[V1]]
    525 ; CHECK-LE: blr
    526 }
    527 
    528 define <2 x i64> @test26(<2 x i64> %a, <2 x i64> %b) {
    529   %v = add <2 x i64> %a, %b
    530   ret <2 x i64> %v
    531 
    532 ; CHECK-LABEL: @test26
    533 
    534 ; Make sure we use only two stores (one for each operand).
    535 ; CHECK: stxvd2x 35,
    536 ; CHECK: stxvd2x 34,
    537 ; CHECK-NOT: stxvd2x
    538 
    539 ; FIXME: The code quality here is not good; just make sure we do something for now.
    540 ; CHECK: add
    541 ; CHECK: add
    542 ; CHECK: blr
    543 
    544 ; CHECK-LE: vaddudm 2, 2, 3
    545 ; CHECK-LE: blr
    546 }
    547 
    548 define <2 x i64> @test27(<2 x i64> %a, <2 x i64> %b) {
    549   %v = and <2 x i64> %a, %b
    550   ret <2 x i64> %v
    551 
    552 ; CHECK-LABEL: @test27
    553 ; CHECK: xxland 34, 34, 35
    554 ; CHECK: blr
    555 
    556 ; CHECK-LE-LABEL: @test27
    557 ; CHECK-LE: xxland 34, 34, 35
    558 ; CHECK-LE: blr
    559 }
    560 
    561 define <2 x double> @test28(<2 x double>* %a) {
    562   %v = load <2 x double>, <2 x double>* %a, align 16
    563   ret <2 x double> %v
    564 
    565 ; CHECK-LABEL: @test28
    566 ; CHECK: lxvd2x 34, 0, 3
    567 ; CHECK: blr
    568 
    569 ; CHECK-LE-LABEL: @test28
    570 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
    571 ; CHECK-LE: xxswapd 34, [[V1]]
    572 ; CHECK-LE: blr
    573 }
    574 
    575 define void @test29(<2 x double>* %a, <2 x double> %b) {
    576   store <2 x double> %b, <2 x double>* %a, align 16
    577   ret void
    578 
    579 ; CHECK-LABEL: @test29
    580 ; CHECK: stxvd2x 34, 0, 3
    581 ; CHECK: blr
    582 
    583 ; CHECK-LE-LABEL: @test29
    584 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
    585 ; CHECK-LE: stxvd2x [[V1]], 0, 3
    586 ; CHECK-LE: blr
    587 }
    588 
    589 define <2 x double> @test28u(<2 x double>* %a) {
    590   %v = load <2 x double>, <2 x double>* %a, align 8
    591   ret <2 x double> %v
    592 
    593 ; CHECK-LABEL: @test28u
    594 ; CHECK: lxvd2x 34, 0, 3
    595 ; CHECK: blr
    596 
    597 ; CHECK-LE-LABEL: @test28u
    598 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
    599 ; CHECK-LE: xxswapd 34, [[V1]]
    600 ; CHECK-LE: blr
    601 }
    602 
    603 define void @test29u(<2 x double>* %a, <2 x double> %b) {
    604   store <2 x double> %b, <2 x double>* %a, align 8
    605   ret void
    606 
    607 ; CHECK-LABEL: @test29u
    608 ; CHECK: stxvd2x 34, 0, 3
    609 ; CHECK: blr
    610 
    611 ; CHECK-LE-LABEL: @test29u
    612 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
    613 ; CHECK-LE: stxvd2x [[V1]], 0, 3
    614 ; CHECK-LE: blr
    615 }
    616 
    617 define <2 x i64> @test30(<2 x i64>* %a) {
    618   %v = load <2 x i64>, <2 x i64>* %a, align 16
    619   ret <2 x i64> %v
    620 
    621 ; CHECK-REG-LABEL: @test30
    622 ; CHECK-REG: lxvd2x 34, 0, 3
    623 ; CHECK-REG: blr
    624 
    625 ; CHECK-FISL-LABEL: @test30
    626 ; CHECK-FISL: lxvd2x 0, 0, 3
    627 ; CHECK-FISL: xxlor 34, 0, 0
    628 ; CHECK-FISL: blr
    629 
    630 ; CHECK-LE-LABEL: @test30
    631 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
    632 ; CHECK-LE: xxswapd 34, [[V1]]
    633 ; CHECK-LE: blr
    634 }
    635 
    636 define void @test31(<2 x i64>* %a, <2 x i64> %b) {
    637   store <2 x i64> %b, <2 x i64>* %a, align 16
    638   ret void
    639 
    640 ; CHECK-LABEL: @test31
    641 ; CHECK: stxvd2x 34, 0, 3
    642 ; CHECK: blr
    643 
    644 ; CHECK-LE-LABEL: @test31
    645 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
    646 ; CHECK-LE: stxvd2x [[V1]], 0, 3
    647 ; CHECK-LE: blr
    648 }
    649 
    650 define <4 x float> @test32(<4 x float>* %a) {
    651   %v = load <4 x float>, <4 x float>* %a, align 16
    652   ret <4 x float> %v
    653 
    654 ; CHECK-REG-LABEL: @test32
    655 ; CHECK-REG: lxvw4x 34, 0, 3
    656 ; CHECK-REG: blr
    657 
    658 ; CHECK-FISL-LABEL: @test32
    659 ; CHECK-FISL: lxvw4x 34, 0, 3
    660 ; CHECK-FISL: blr
    661 
    662 ; CHECK-LE-LABEL: @test32
    663 ; CHECK-LE: lvx 2, 0, 3
    664 ; CHECK-LE-NOT: xxswapd
    665 ; CHECK-LE: blr
    666 }
    667 
    668 define void @test33(<4 x float>* %a, <4 x float> %b) {
    669   store <4 x float> %b, <4 x float>* %a, align 16
    670   ret void
    671 
    672 ; CHECK-REG-LABEL: @test33
    673 ; CHECK-REG: stxvw4x 34, 0, 3
    674 ; CHECK-REG: blr
    675 
    676 ; CHECK-FISL-LABEL: @test33
    677 ; CHECK-FISL: stxvw4x 34, 0, 3
    678 ; CHECK-FISL: blr
    679 
    680 ; CHECK-LE-LABEL: @test33
    681 ; CHECK-LE-NOT: xxswapd
    682 ; CHECK-LE: stvx 2, 0, 3
    683 ; CHECK-LE: blr
    684 }
    685 
    686 define <4 x float> @test32u(<4 x float>* %a) {
    687   %v = load <4 x float>, <4 x float>* %a, align 8
    688   ret <4 x float> %v
    689 
    690 ; CHECK-LABEL: @test32u
    691 ; CHECK-DAG: lvsl
    692 ; CHECK-DAG: lvx
    693 ; CHECK-DAG: lvx
    694 ; CHECK: vperm 2,
    695 ; CHECK: blr
    696 
    697 ; CHECK-LE-LABEL: @test32u
    698 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
    699 ; CHECK-LE: xxswapd 34, [[V1]]
    700 ; CHECK-LE: blr
    701 }
    702 
    703 define void @test33u(<4 x float>* %a, <4 x float> %b) {
    704   store <4 x float> %b, <4 x float>* %a, align 8
    705   ret void
    706 
    707 ; CHECK-REG-LABEL: @test33u
    708 ; CHECK-REG: stxvw4x 34, 0, 3
    709 ; CHECK-REG: blr
    710 
    711 ; CHECK-FISL-LABEL: @test33u
    712 ; CHECK-FISL: stxvw4x 34, 0, 3
    713 ; CHECK-FISL: blr
    714 
    715 ; CHECK-LE-LABEL: @test33u
    716 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
    717 ; CHECK-LE: stxvd2x [[V1]], 0, 3
    718 ; CHECK-LE: blr
    719 }
    720 
    721 define <4 x i32> @test34(<4 x i32>* %a) {
    722   %v = load <4 x i32>, <4 x i32>* %a, align 16
    723   ret <4 x i32> %v
    724 
    725 ; CHECK-REG-LABEL: @test34
    726 ; CHECK-REG: lxvw4x 34, 0, 3
    727 ; CHECK-REG: blr
    728 
    729 ; CHECK-FISL-LABEL: @test34
    730 ; CHECK-FISL: lxvw4x 34, 0, 3
    731 ; CHECK-FISL: blr
    732 
    733 ; CHECK-LE-LABEL: @test34
    734 ; CHECK-LE: lvx 2, 0, 3
    735 ; CHECK-LE-NOT: xxswapd
    736 ; CHECK-LE: blr
    737 }
    738 
    739 define void @test35(<4 x i32>* %a, <4 x i32> %b) {
    740   store <4 x i32> %b, <4 x i32>* %a, align 16
    741   ret void
    742 
    743 ; CHECK-REG-LABEL: @test35
    744 ; CHECK-REG: stxvw4x 34, 0, 3
    745 ; CHECK-REG: blr
    746 
    747 ; CHECK-FISL-LABEL: @test35
    748 ; CHECK-FISL: stxvw4x 34, 0, 3
    749 ; CHECK-FISL: blr
    750 
    751 ; CHECK-LE-LABEL: @test35
    752 ; CHECK-LE-NOT: xxswapd
    753 ; CHECK-LE: stvx 2, 0, 3
    754 ; CHECK-LE: blr
    755 }
    756 
    757 define <2 x double> @test40(<2 x i64> %a) {
    758   %v = uitofp <2 x i64> %a to <2 x double>
    759   ret <2 x double> %v
    760 
    761 ; CHECK-LABEL: @test40
    762 ; CHECK: xvcvuxddp 34, 34
    763 ; CHECK: blr
    764 
    765 ; CHECK-LE-LABEL: @test40
    766 ; CHECK-LE: xvcvuxddp 34, 34
    767 ; CHECK-LE: blr
    768 }
    769 
    770 define <2 x double> @test41(<2 x i64> %a) {
    771   %v = sitofp <2 x i64> %a to <2 x double>
    772   ret <2 x double> %v
    773 
    774 ; CHECK-LABEL: @test41
    775 ; CHECK: xvcvsxddp 34, 34
    776 ; CHECK: blr
    777 
    778 ; CHECK-LE-LABEL: @test41
    779 ; CHECK-LE: xvcvsxddp 34, 34
    780 ; CHECK-LE: blr
    781 }
    782 
    783 define <2 x i64> @test42(<2 x double> %a) {
    784   %v = fptoui <2 x double> %a to <2 x i64>
    785   ret <2 x i64> %v
    786 
    787 ; CHECK-LABEL: @test42
    788 ; CHECK: xvcvdpuxds 34, 34
    789 ; CHECK: blr
    790 
    791 ; CHECK-LE-LABEL: @test42
    792 ; CHECK-LE: xvcvdpuxds 34, 34
    793 ; CHECK-LE: blr
    794 }
    795 
    796 define <2 x i64> @test43(<2 x double> %a) {
    797   %v = fptosi <2 x double> %a to <2 x i64>
    798   ret <2 x i64> %v
    799 
    800 ; CHECK-LABEL: @test43
    801 ; CHECK: xvcvdpsxds 34, 34
    802 ; CHECK: blr
    803 
    804 ; CHECK-LE-LABEL: @test43
    805 ; CHECK-LE: xvcvdpsxds 34, 34
    806 ; CHECK-LE: blr
    807 }
    808 
    809 define <2 x float> @test44(<2 x i64> %a) {
    810   %v = uitofp <2 x i64> %a to <2 x float>
    811   ret <2 x float> %v
    812 
    813 ; CHECK-LABEL: @test44
    814 ; FIXME: The code quality here looks pretty bad.
    815 ; CHECK: blr
    816 }
    817 
    818 define <2 x float> @test45(<2 x i64> %a) {
    819   %v = sitofp <2 x i64> %a to <2 x float>
    820   ret <2 x float> %v
    821 
    822 ; CHECK-LABEL: @test45
    823 ; FIXME: The code quality here looks pretty bad.
    824 ; CHECK: blr
    825 }
    826 
    827 define <2 x i64> @test46(<2 x float> %a) {
    828   %v = fptoui <2 x float> %a to <2 x i64>
    829   ret <2 x i64> %v
    830 
    831 ; CHECK-LABEL: @test46
    832 ; FIXME: The code quality here looks pretty bad.
    833 ; CHECK: blr
    834 }
    835 
    836 define <2 x i64> @test47(<2 x float> %a) {
    837   %v = fptosi <2 x float> %a to <2 x i64>
    838   ret <2 x i64> %v
    839 
    840 ; CHECK-LABEL: @test47
    841 ; FIXME: The code quality here looks pretty bad.
    842 ; CHECK: blr
    843 }
    844 
    845 define <2 x double> @test50(double* %a) {
    846   %v = load double, double* %a, align 8
    847   %w = insertelement <2 x double> undef, double %v, i32 0
    848   %x = insertelement <2 x double> %w, double %v, i32 1
    849   ret <2 x double> %x
    850 
    851 ; CHECK-LABEL: @test50
    852 ; CHECK: lxvdsx 34, 0, 3
    853 ; CHECK: blr
    854 
    855 ; CHECK-LE-LABEL: @test50
    856 ; CHECK-LE: lxvdsx 34, 0, 3
    857 ; CHECK-LE: blr
    858 }
    859 
    860 define <2 x double> @test51(<2 x double> %a, <2 x double> %b) {
    861   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0>
    862   ret <2 x double> %v
    863 
    864 ; CHECK-LABEL: @test51
    865 ; CHECK: xxspltd 34, 34, 0
    866 ; CHECK: blr
    867 
    868 ; CHECK-LE-LABEL: @test51
    869 ; CHECK-LE: xxspltd 34, 34, 1
    870 ; CHECK-LE: blr
    871 }
    872 
    873 define <2 x double> @test52(<2 x double> %a, <2 x double> %b) {
    874   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 2>
    875   ret <2 x double> %v
    876 
    877 ; CHECK-LABEL: @test52
    878 ; CHECK: xxmrghd 34, 34, 35
    879 ; CHECK: blr
    880 
    881 ; CHECK-LE-LABEL: @test52
    882 ; CHECK-LE: xxmrgld 34, 35, 34
    883 ; CHECK-LE: blr
    884 }
    885 
    886 define <2 x double> @test53(<2 x double> %a, <2 x double> %b) {
    887   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 0>
    888   ret <2 x double> %v
    889 
    890 ; CHECK-LABEL: @test53
    891 ; CHECK: xxmrghd 34, 35, 34
    892 ; CHECK: blr
    893 
    894 ; CHECK-LE-LABEL: @test53
    895 ; CHECK-LE: xxmrgld 34, 34, 35
    896 ; CHECK-LE: blr
    897 }
    898 
    899 define <2 x double> @test54(<2 x double> %a, <2 x double> %b) {
    900   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 2>
    901   ret <2 x double> %v
    902 
    903 ; CHECK-LABEL: @test54
    904 ; CHECK: xxpermdi 34, 34, 35, 2
    905 ; CHECK: blr
    906 
    907 ; CHECK-LE-LABEL: @test54
    908 ; CHECK-LE: xxpermdi 34, 35, 34, 2
    909 ; CHECK-LE: blr
    910 }
    911 
    912 define <2 x double> @test55(<2 x double> %a, <2 x double> %b) {
    913   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 3>
    914   ret <2 x double> %v
    915 
    916 ; CHECK-LABEL: @test55
    917 ; CHECK: xxmrgld 34, 34, 35
    918 ; CHECK: blr
    919 
    920 ; CHECK-LE-LABEL: @test55
    921 ; CHECK-LE: xxmrghd 34, 35, 34
    922 ; CHECK-LE: blr
    923 }
    924 
    925 define <2 x i64> @test56(<2 x i64> %a, <2 x i64> %b) {
    926   %v = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
    927   ret <2 x i64> %v
    928 
    929 ; CHECK-LABEL: @test56
    930 ; CHECK: xxmrgld 34, 34, 35
    931 ; CHECK: blr
    932 
    933 ; CHECK-LE-LABEL: @test56
    934 ; CHECK-LE: xxmrghd 34, 35, 34
    935 ; CHECK-LE: blr
    936 }
    937 
    938 define <2 x i64> @test60(<2 x i64> %a, <2 x i64> %b) {
    939   %v = shl <2 x i64> %a, %b
    940   ret <2 x i64> %v
    941 
    942 ; CHECK-LABEL: @test60
    943 ; This should scalarize, and the current code quality is not good.
    944 ; CHECK: stxvd2x
    945 ; CHECK: stxvd2x
    946 ; CHECK: sld
    947 ; CHECK: sld
    948 ; CHECK: lxvd2x
    949 ; CHECK: blr
    950 }
    951 
    952 define <2 x i64> @test61(<2 x i64> %a, <2 x i64> %b) {
    953   %v = lshr <2 x i64> %a, %b
    954   ret <2 x i64> %v
    955 
    956 ; CHECK-LABEL: @test61
    957 ; This should scalarize, and the current code quality is not good.
    958 ; CHECK: stxvd2x
    959 ; CHECK: stxvd2x
    960 ; CHECK: srd
    961 ; CHECK: srd
    962 ; CHECK: lxvd2x
    963 ; CHECK: blr
    964 }
    965 
    966 define <2 x i64> @test62(<2 x i64> %a, <2 x i64> %b) {
    967   %v = ashr <2 x i64> %a, %b
    968   ret <2 x i64> %v
    969 
    970 ; CHECK-LABEL: @test62
    971 ; This should scalarize, and the current code quality is not good.
    972 ; CHECK: stxvd2x
    973 ; CHECK: stxvd2x
    974 ; CHECK: srad
    975 ; CHECK: srad
    976 ; CHECK: lxvd2x
    977 ; CHECK: blr
    978 }
    979 
    980 define double @test63(<2 x double> %a) {
    981   %v = extractelement <2 x double> %a, i32 0
    982   ret double %v
    983 
    984 ; CHECK-REG-LABEL: @test63
    985 ; CHECK-REG: xxlor 1, 34, 34
    986 ; CHECK-REG: blr
    987 
    988 ; CHECK-FISL-LABEL: @test63
    989 ; CHECK-FISL: xxlor 0, 34, 34
    990 ; CHECK-FISL: fmr 1, 0
    991 ; CHECK-FISL: blr
    992 
    993 ; CHECK-LE-LABEL: @test63
    994 ; CHECK-LE: xxswapd 1, 34
    995 ; CHECK-LE: blr
    996 }
    997 
    998 define double @test64(<2 x double> %a) {
    999   %v = extractelement <2 x double> %a, i32 1
   1000   ret double %v
   1001 
   1002 ; CHECK-REG-LABEL: @test64
   1003 ; CHECK-REG: xxswapd 1, 34
   1004 ; CHECK-REG: blr
   1005 
   1006 ; CHECK-FISL-LABEL: @test64
   1007 ; CHECK-FISL: xxswapd  34, 34
   1008 ; CHECK-FISL: xxlor 0, 34, 34
   1009 ; CHECK-FISL: fmr 1, 0
   1010 ; CHECK-FISL: blr
   1011 
   1012 ; CHECK-LE-LABEL: @test64
   1013 ; CHECK-LE: xxlor 1, 34, 34
   1014 }
   1015 
   1016 define <2 x i1> @test65(<2 x i64> %a, <2 x i64> %b) {
   1017   %w = icmp eq <2 x i64> %a, %b
   1018   ret <2 x i1> %w
   1019 
   1020 ; CHECK-REG-LABEL: @test65
   1021 ; CHECK-REG: vcmpequw 2, 2, 3
   1022 ; CHECK-REG: blr
   1023 
   1024 ; CHECK-FISL-LABEL: @test65
   1025 ; CHECK-FISL: vcmpequw 2, 2, 3
   1026 ; CHECK-FISL: blr
   1027 
   1028 ; CHECK-LE-LABEL: @test65
   1029 ; CHECK-LE: vcmpequd 2, 2, 3
   1030 ; CHECK-LE: blr
   1031 }
   1032 
   1033 define <2 x i1> @test66(<2 x i64> %a, <2 x i64> %b) {
   1034   %w = icmp ne <2 x i64> %a, %b
   1035   ret <2 x i1> %w
   1036 
   1037 ; CHECK-REG-LABEL: @test66
   1038 ; CHECK-REG: vcmpequw {{[0-9]+}}, 2, 3
   1039 ; CHECK-REG: xxlnor 34, {{[0-9]+}}, {{[0-9]+}}
   1040 ; CHECK-REG: blr
   1041 
   1042 ; CHECK-FISL-LABEL: @test66
   1043 ; CHECK-FISL: vcmpequw 2, 2, 3
   1044 ; CHECK-FISL: xxlnor 34, 34, 34
   1045 ; CHECK-FISL: blr
   1046 
   1047 ; CHECK-LE-LABEL: @test66
   1048 ; CHECK-LE: vcmpequd {{[0-9]+}}, 2, 3
   1049 ; CHECK-LE: xxlnor 34, {{[0-9]+}}, {{[0-9]+}}
   1050 ; CHECK-LE: blr
   1051 }
   1052 
   1053 define <2 x i1> @test67(<2 x i64> %a, <2 x i64> %b) {
   1054   %w = icmp ult <2 x i64> %a, %b
   1055   ret <2 x i1> %w
   1056 
   1057 ; CHECK-LABEL: @test67
   1058 ; This should scalarize, and the current code quality is not good.
   1059 ; CHECK: stxvd2x
   1060 ; CHECK: stxvd2x
   1061 ; CHECK: cmpld
   1062 ; CHECK: cmpld
   1063 ; CHECK: lxvd2x
   1064 ; CHECK: blr
   1065 
   1066 ; CHECK-LE-LABEL: @test67
   1067 ; CHECK-LE: vcmpgtud 2, 3, 2
   1068 ; CHECK-LE: blr
   1069 }
   1070 
   1071 define <2 x double> @test68(<2 x i32> %a) {
   1072   %w = sitofp <2 x i32> %a to <2 x double>
   1073   ret <2 x double> %w
   1074 
   1075 ; CHECK-LABEL: @test68
   1076 ; CHECK: xxmrghw [[V1:[0-9]+]]
   1077 ; CHECK: xvcvsxwdp 34, [[V1]]
   1078 ; CHECK: blr
   1079 
   1080 ; CHECK-LE-LABEL: @test68
   1081 ; CHECK-LE: xxmrglw [[V1:[0-9]+]], 34, 34
   1082 ; CHECK-LE: xvcvsxwdp 34, [[V1]]
   1083 ; CHECK-LE: blr
   1084 }
   1085 
   1086 ; This gets scalarized so the code isn't great
   1087 define <2 x double> @test69(<2 x i16> %a) {
   1088   %w = sitofp <2 x i16> %a to <2 x double>
   1089   ret <2 x double> %w
   1090 
   1091 ; CHECK-LABEL: @test69
   1092 ; CHECK-DAG: lfiwax
   1093 ; CHECK-DAG: lfiwax
   1094 ; CHECK-DAG: xscvsxddp
   1095 ; CHECK-DAG: xscvsxddp
   1096 ; CHECK: xxmrghd
   1097 ; CHECK: blr
   1098 
   1099 ; CHECK-LE-LABEL: @test69
   1100 ; CHECK-LE: mfvsrd
   1101 ; CHECK-LE: mtvsrwa
   1102 ; CHECK-LE: mtvsrwa
   1103 ; CHECK-LE: xscvsxddp
   1104 ; CHECK-LE: xscvsxddp
   1105 ; CHECK-LE: xxmrghd
   1106 ; CHECK-LE: blr
   1107 }
   1108 
   1109 ; This gets scalarized so the code isn't great
   1110 define <2 x double> @test70(<2 x i8> %a) {
   1111   %w = sitofp <2 x i8> %a to <2 x double>
   1112   ret <2 x double> %w
   1113 
   1114 ; CHECK-LABEL: @test70
   1115 ; CHECK-DAG: lfiwax
   1116 ; CHECK-DAG: lfiwax
   1117 ; CHECK-DAG: xscvsxddp
   1118 ; CHECK-DAG: xscvsxddp
   1119 ; CHECK: xxmrghd
   1120 ; CHECK: blr
   1121 
   1122 ; CHECK-LE-LABEL: @test70
   1123 ; CHECK-LE: mfvsrd
   1124 ; CHECK-LE: mtvsrwa
   1125 ; CHECK-LE: mtvsrwa
   1126 ; CHECK-LE: xscvsxddp
   1127 ; CHECK-LE: xscvsxddp
   1128 ; CHECK-LE: xxmrghd
   1129 ; CHECK-LE: blr
   1130 }
   1131 
   1132 ; This gets scalarized so the code isn't great
   1133 define <2 x i32> @test80(i32 %v) {
   1134   %b1 = insertelement <2 x i32> undef, i32 %v, i32 0
   1135   %b2 = shufflevector <2 x i32> %b1, <2 x i32> undef, <2 x i32> zeroinitializer
   1136   %i = add <2 x i32> %b2, <i32 2, i32 3>
   1137   ret <2 x i32> %i
   1138 
   1139 ; CHECK-REG-LABEL: @test80
   1140 ; CHECK-REG-DAG: stw 3, -16(1)
   1141 ; CHECK-REG-DAG: addi [[R1:[0-9]+]], 1, -16
   1142 ; CHECK-REG: addis [[R2:[0-9]+]]
   1143 ; CHECK-REG-DAG: addi [[R2]], [[R2]]
   1144 ; CHECK-REG-DAG: lxvw4x [[VS1:[0-9]+]], 0, [[R1]]
   1145 ; CHECK-REG-DAG: lxvw4x 35, 0, [[R2]]
   1146 ; CHECK-REG: xxspltw 34, [[VS1]], 0
   1147 ; CHECK-REG: vadduwm 2, 2, 3
   1148 ; CHECK-REG-NOT: stxvw4x
   1149 ; CHECK-REG: blr
   1150 
   1151 ; CHECK-FISL-LABEL: @test80
   1152 ; CHECK-FISL: mr 4, 3
   1153 ; CHECK-FISL: stw 4, -16(1)
   1154 ; CHECK-FISL: addi [[R1:[0-9]+]], 1, -16
   1155 ; CHECK-FISL-DAG: lxvw4x [[VS1:[0-9]+]], 0, [[R1]]
   1156 ; CHECK-FISL-DAG: xxspltw {{[0-9]+}}, [[VS1]], 0
   1157 ; CHECK-FISL: addis [[R2:[0-9]+]]
   1158 ; CHECK-FISL: addi [[R2]], [[R2]]
   1159 ; CHECK-FISL-DAG: lxvw4x {{[0-9]+}}, 0, [[R2]]
   1160 ; CHECK-FISL: vadduwm
   1161 ; CHECK-FISL-NOT: stxvw4x
   1162 ; CHECK-FISL: blr
   1163 
   1164 ; CHECK-LE-LABEL: @test80
   1165 ; CHECK-LE-DAG: mtvsrd [[R1:[0-9]+]], 3
   1166 ; CHECK-LE-DAG: xxswapd  [[V1:[0-9]+]], [[R1]]
   1167 ; CHECK-LE-DAG: addi [[R2:[0-9]+]], {{[0-9]+}}, .LCPI
   1168 ; CHECK-LE-DAG: lvx 3, 0, [[R2]]
   1169 ; CHECK-LE-DAG: xxspltw 34, [[V1]]
   1170 ; CHECK-LE-NOT: xxswapd 35, [[V2]]
   1171 ; CHECK-LE: vadduwm 2, 2, 3
   1172 ; CHECK-LE: blr
   1173 }
   1174 
   1175 define <2 x double> @test81(<4 x float> %b) {
   1176   %w = bitcast <4 x float> %b to <2 x double>
   1177   ret <2 x double> %w
   1178 
   1179 ; CHECK-LABEL: @test81
   1180 ; CHECK: blr
   1181 
   1182 ; CHECK-LE-LABEL: @test81
   1183 ; CHECK-LE: blr
   1184 }
   1185 
   1186 define double @test82(double %a, double %b, double %c, double %d) {
   1187 entry:
   1188   %m = fcmp oeq double %c, %d
   1189   %v = select i1 %m, double %a, double %b
   1190   ret double %v
   1191 
   1192 ; CHECK-REG-LABEL: @test82
   1193 ; CHECK-REG: xscmpudp [[REG:[0-9]+]], 3, 4
   1194 ; CHECK-REG: beqlr [[REG]]
   1195 
   1196 ; CHECK-FISL-LABEL: @test82
   1197 ; CHECK-FISL: xscmpudp [[REG:[0-9]+]], 3, 4
   1198 ; CHECK-FISL: beq [[REG]], {{.*}}
   1199 
   1200 ; CHECK-LE-LABEL: @test82
   1201 ; CHECK-LE: xscmpudp [[REG:[0-9]+]], 3, 4
   1202 ; CHECK-LE: beqlr [[REG]]
   1203 }
   1204 
   1205 ; Function Attrs: nounwind readnone
   1206 define <4 x i32> @test83(i8* %a) {
   1207   entry:
   1208     %0 = tail call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(i8* %a)
   1209       ret <4 x i32> %0
   1210       ; CHECK-LABEL: test83
   1211       ; CHECK: lxvw4x 34, 0, 3
   1212       ; CHECK: blr
   1213 }
   1214 ; Function Attrs: nounwind readnone
   1215 declare <4 x i32> @llvm.ppc.vsx.lxvw4x.be(i8*)
   1216 
   1217 ; Function Attrs: nounwind readnone
   1218 define <2 x double> @test84(i8* %a) {
   1219   entry:
   1220     %0 = tail call <2 x double> @llvm.ppc.vsx.lxvd2x.be(i8* %a)
   1221       ret <2 x double> %0
   1222       ; CHECK-LABEL: test84
   1223       ; CHECK: lxvd2x 34, 0, 3
   1224       ; CHECK: blr
   1225 }
   1226 ; Function Attrs: nounwind readnone
   1227 declare <2 x double> @llvm.ppc.vsx.lxvd2x.be(i8*)
   1228 
   1229 ; Function Attrs: nounwind readnone
   1230 define void @test85(<4 x i32> %a, i8* %b) {
   1231   entry:
   1232     tail call void @llvm.ppc.vsx.stxvw4x.be(<4 x i32> %a, i8* %b)
   1233     ret void
   1234       ; CHECK-LABEL: test85
   1235       ; CHECK: stxvw4x 34, 0, 5
   1236       ; CHECK: blr
   1237 }
   1238 ; Function Attrs: nounwind readnone
   1239 declare void @llvm.ppc.vsx.stxvw4x.be(<4 x i32>, i8*)
   1240 
   1241 ; Function Attrs: nounwind readnone
   1242 define void @test86(<2 x double> %a, i8* %b) {
   1243   entry:
   1244     tail call void @llvm.ppc.vsx.stxvd2x.be(<2 x double> %a, i8* %b)
   1245     ret void
   1246       ; CHECK-LABEL: test86
   1247       ; CHECK: stxvd2x 34, 0, 5
   1248       ; CHECK: blr
   1249 }
   1250 ; Function Attrs: nounwind readnone
   1251 declare void @llvm.ppc.vsx.stxvd2x.be(<2 x double>, i8*)
   1252