Home | History | Annotate | Download | only in msa
      1 ; RUN: llc -march=mips -mattr=+msa,+fp64 -relocation-model=pic < %s | FileCheck %s -check-prefixes=CHECK,MSA32
      2 ; RUN: llc -march=mips64 -mattr=+msa,+fp64 -relocation-model=pic -target-abi n32 < %s \
      3 ; RUN:      | FileCheck %s -check-prefixes=CHECK,MSA64,MSA64N32
      4 ; RUN: llc -march=mips64 -mattr=+msa,+fp64 -relocation-model=pic -target-abi n64 < %s \
      5 ; RUN:      | FileCheck %s -check-prefixes=CHECK,MSA64,MSA64N64
      6 
      7 ; Test that the immediate intrinsics don't crash LLVM.
      8 
      9 ; Some of the intrinsics lower to equivalent forms.
     10 
     11 define void @addvi_b(<16 x i8> * %ptr) {
     12 entry:
     13 ; CHECK-LABEL: addvi_b:
     14 ; CHECK: addvi.b
     15   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
     16   %r = call <16 x i8> @llvm.mips.addvi.b(<16 x i8> %a, i32 25)
     17   store <16 x i8> %r, <16 x i8> * %ptr, align 16
     18   ret void
     19 }
     20 
     21 define void @andi_b(<16 x i8> * %ptr) {
     22 entry:
     23 ; CHECK-LABEL: andi_b:
     24 ; CHECK: andi.b
     25   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
     26   %r = call <16 x i8> @llvm.mips.andi.b(<16 x i8> %a, i32 25)
     27   store <16 x i8> %r, <16 x i8> * %ptr, align 16
     28   ret void
     29 }
     30 
     31 define void @bclri_b(<16 x i8> * %ptr) {
     32 entry:
     33 ; CHECK-LABEL: bclri_b:
     34 ; CHECK: andi.b
     35   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
     36   %r = call <16 x i8> @llvm.mips.bclri.b(<16 x i8> %a, i32 3)
     37   store <16 x i8> %r, <16 x i8> * %ptr, align 16
     38   ret void
     39 }
     40 
     41 define void @binsli_b(<16 x i8> * %ptr, <16 x i8> * %ptr2) {
     42 entry:
     43 ; CHECK-LABEL: binsli_b:
     44 ; CHECK: binsli.b
     45   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
     46   %b = load <16 x i8>, <16 x i8> * %ptr2, align 16
     47   %r = call <16 x i8> @llvm.mips.binsli.b(<16 x i8> %a, <16 x i8> %b, i32 3)
     48   store <16 x i8> %r, <16 x i8> * %ptr, align 16
     49   ret void
     50 }
     51 
     52 define void @binsri_b(<16 x i8> * %ptr, <16 x i8> * %ptr2) {
     53 entry:
     54 ; CHECK-LABEL: binsri_b:
     55 ; CHECK: binsri.b
     56   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
     57   %b = load <16 x i8>, <16 x i8> * %ptr2, align 16
     58   %r = call <16 x i8> @llvm.mips.binsri.b(<16 x i8> %a, <16 x i8> %b, i32 5)
     59   store <16 x i8> %r, <16 x i8> * %ptr, align 16
     60   ret void
     61 }
     62 
     63 define void @bmnzi_b(<16 x i8> * %ptr, <16 x i8> * %ptr2) {
     64 entry:
     65 ; CHECK-LABEL: bmnzi_b:
     66 ; CHECK: bmnzi.b
     67   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
     68   %b = load <16 x i8>, <16 x i8> * %ptr2, align 16
     69   %r = call <16 x i8> @llvm.mips.bmnzi.b(<16 x i8> %a, <16 x i8> %b, i32 25)
     70   store <16 x i8> %r, <16 x i8> * %ptr, align 16
     71   ret void
     72 }
     73 
     74 define void @bmzi_b(<16 x i8> * %ptr, <16 x i8> * %ptr2) {
     75 entry:
     76 ; CHECK-LABEL: bmzi_b:
     77 ; CHECK: bmnzi.b
     78   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
     79   %b = load <16 x i8>, <16 x i8> * %ptr2, align 16
     80   %r = call <16 x i8> @llvm.mips.bmzi.b(<16 x i8> %a, <16 x i8> %b, i32 25)
     81   store <16 x i8> %r, <16 x i8> * %ptr, align 16
     82   ret void
     83 }
     84 
     85 define void @bnegi_b(<16 x i8> * %ptr) {
     86 entry:
     87 ; CHECK-LABEL: bnegi_b:
     88 ; CHECK: bnegi.b
     89   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
     90   %r = call <16 x i8> @llvm.mips.bnegi.b(<16 x i8> %a, i32 6)
     91   store <16 x i8> %r, <16 x i8> * %ptr, align 16
     92   ret void
     93 }
     94 
     95 define void @bseli_b(<16 x i8> * %ptr) {
     96 entry:
     97 ; CHECK-LABEL: bseli_b:
     98 ; CHECK: bseli.b
     99   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    100   %r = call <16 x i8> @llvm.mips.bseli.b(<16 x i8> %a, <16 x i8> %a, i32 25)
    101   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    102   ret void
    103 }
    104 
    105 define void @bseti_b(<16 x i8> * %ptr) {
    106 entry:
    107 ; CHECK-LABEL: bseti_b:
    108 ; CHECK: bseti.b
    109   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    110   %r = call <16 x i8> @llvm.mips.bseti.b(<16 x i8> %a, i32 5)
    111   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    112   ret void
    113 }
    114 
    115 define void @clei_s_b(<16 x i8> * %ptr) {
    116 entry:
    117 ; CHECK-LABEL: clei_s_b:
    118 ; CHECK: clei_s.b
    119   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    120   %r = call <16 x i8> @llvm.mips.clei.s.b(<16 x i8> %a, i32 12)
    121   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    122   ret void
    123 }
    124 
    125 define void @clei_u_b(<16 x i8> * %ptr) {
    126 entry:
    127 ; CHECK-LABEL: clei_u_b:
    128 ; CHECK: clei_u.b
    129   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    130   %r = call <16 x i8> @llvm.mips.clei.u.b(<16 x i8> %a, i32 25)
    131   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    132   ret void
    133 }
    134 
    135 define void @clti_s_b(<16 x i8> * %ptr) {
    136 entry:
    137 ; CHECK-LABEL: clti_s_b:
    138 ; CHECK: clti_s.b
    139   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    140   %r = call <16 x i8> @llvm.mips.clti.s.b(<16 x i8> %a, i32 15)
    141   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    142   ret void
    143 }
    144 
    145 define void @clti_u_b(<16 x i8> * %ptr) {
    146 entry:
    147 ; CHECK-LABEL: clti_u_b:
    148 ; CHECK: clti_u.b
    149   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    150   %r = call <16 x i8> @llvm.mips.clti.u.b(<16 x i8> %a, i32 25)
    151   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    152   ret void
    153 }
    154 
    155 define void @ldi_b(<16 x i8> * %ptr) {
    156 entry:
    157 ; CHECK-LABEL: ldi_b:
    158 ; CHECK: ldi.b
    159   %r = call <16 x i8> @llvm.mips.ldi.b(i32 3)
    160   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    161   ret void
    162 }
    163 
    164 define void @maxi_s_b(<16 x i8> * %ptr) {
    165 entry:
    166 ; CHECK-LABEL: maxi_s_b:
    167 ; CHECK: maxi_s.b
    168   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    169   %r = call <16 x i8> @llvm.mips.maxi.s.b(<16 x i8> %a, i32 2)
    170   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    171   ret void
    172 }
    173 
    174 define void @maxi_u_b(<16 x i8> * %ptr) {
    175 entry:
    176 ; CHECK-LABEL: maxi_u_b:
    177 ; CHECK: maxi_u.b
    178   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    179   %r = call <16 x i8> @llvm.mips.maxi.u.b(<16 x i8> %a, i32 2)
    180   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    181   ret void
    182 }
    183 
    184 define void @mini_s_b(<16 x i8> * %ptr) {
    185 entry:
    186 ; CHECK-LABEL: mini_s_b:
    187 ; CHECK: mini_s.b
    188   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    189   %r = call <16 x i8> @llvm.mips.mini.s.b(<16 x i8> %a, i32 2)
    190   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    191   ret void
    192 }
    193 
    194 define void @mini_u_b(<16 x i8> * %ptr) {
    195 entry:
    196 ; CHECK-LABEL: mini_u_b:
    197 ; CHECK: mini_u.b
    198   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    199   %r = call <16 x i8> @llvm.mips.mini.u.b(<16 x i8> %a, i32 2)
    200   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    201   ret void
    202 }
    203 
    204 define void @nori_b(<16 x i8> * %ptr) {
    205 entry:
    206 ; CHECK-LABEL: nori_b:
    207 ; CHECK: nori.b
    208   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    209   %r = call <16 x i8> @llvm.mips.nori.b(<16 x i8> %a, i32 25)
    210   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    211   ret void
    212 }
    213 
    214 define void @ori_b(<16 x i8> * %ptr) {
    215 entry:
    216 ; CHECK-LABEL: ori_b:
    217 ; CHECK: ori.b
    218   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    219   %r = call <16 x i8> @llvm.mips.ori.b(<16 x i8> %a, i32 25)
    220   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    221   ret void
    222 }
    223 
    224 define void @sldi_b(<16 x i8> * %ptr) {
    225 entry:
    226 ; CHECK-LABEL: sldi_b:
    227 ; CHECK: sldi.b
    228   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    229   %r = call <16 x i8> @llvm.mips.sldi.b(<16 x i8> %a, <16 x i8> %a, i32 7)
    230   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    231   ret void
    232 }
    233 
    234 define void @slli_b(<16 x i8> * %ptr) {
    235 entry:
    236 ; CHECK-LABEL: slli_b:
    237 ; CHECK: slli.b
    238   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    239   %r = call <16 x i8> @llvm.mips.slli.b(<16 x i8> %a, i32 3)
    240   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    241   ret void
    242 }
    243 
    244 define void @splati_b(<16 x i8> * %ptr) {
    245 entry:
    246 ; CHECK-LABEL: splati_b:
    247 ; CHECK: splati.b
    248   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    249   %r = call <16 x i8> @llvm.mips.splati.b(<16 x i8> %a, i32 3)
    250   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    251   ret void
    252 }
    253 
    254 define void @srai_b(<16 x i8> * %ptr) {
    255 entry:
    256 ; CHECK-LABEL: srai_b:
    257 ; CHECK: srai.b
    258   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    259   %r = call <16 x i8> @llvm.mips.srai.b(<16 x i8> %a, i32 3)
    260   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    261   ret void
    262 }
    263 
    264 define void @srari_b(<16 x i8> * %ptr) {
    265 entry:
    266 ; CHECK-LABEL: srari_b:
    267 ; CHECK: srari.b
    268   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    269   %r = call <16 x i8> @llvm.mips.srari.b(<16 x i8> %a, i32 3)
    270   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    271   ret void
    272 }
    273 
    274 define void @srli_b(<16 x i8> * %ptr) {
    275 entry:
    276 ; CHECK-LABEL: srli_b:
    277 ; CHECK: srli.b
    278   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    279   %r = call <16 x i8> @llvm.mips.srli.b(<16 x i8> %a, i32 3)
    280   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    281   ret void
    282 }
    283 
    284 define void @srlri_b(<16 x i8> * %ptr) {
    285 entry:
    286 ; CHECK-LABEL: srlri_b:
    287 ; CHECK: srlri.b
    288   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    289   %r = call <16 x i8> @llvm.mips.srlri.b(<16 x i8> %a, i32 3)
    290   store <16 x i8> %r, <16 x i8> * %ptr, align 16
    291   ret void
    292 }
    293 
    294 define void @ld_b(<16 x i8> * %ptr, i8 * %ldptr, i32 %offset) {
    295 entry:
    296 ; CHECK-LABEL: ld_b
    297 ; MSA32: addu $[[R0:[0-9]]], $5, $6
    298 
    299 ; MSA64N32-DAG: sll $[[R2:[0-9]]], $6, 0
    300 ; MSA64N32-DAG: sll $[[R1:[0-9]]], $5, 0
    301 ; MSA64N32: addu $[[R0:[0-9]]], $[[R1]], $[[R2]]
    302 
    303 ; MSA64N64: sll $[[R1:[0-9]]], $6, 0
    304 ; MSA64N64: daddu $[[R0:[0-9]]], $5, $[[R1]]
    305 
    306 ; CHECK:    ld.b $w{{[0-9]+}}, 0($[[R0]])
    307   %a = call <16 x i8> @llvm.mips.ld.b(i8* %ldptr, i32 %offset)
    308   store <16 x i8> %a, <16 x i8> * %ptr, align 16
    309   ret void
    310 }
    311 
    312 define void @st_b(<16 x i8> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
    313 entry:
    314 ; CHECK-LABEL: st_b
    315 ; MSA32: addu $[[R0:[0-9]]], $7, $6
    316 
    317 ; MSA64N32: sll $[[R1:[0-9]]], $6, 0
    318 ; MSA64N32: sll $[[R2:[0-9]]], $7, 0
    319 ; MSA64N32: addu $[[R0:[0-9]]], $[[R2]], $[[R1]]
    320 
    321 ; MSA64N64: sll $[[R1:[0-9]]], $6, 0
    322 ; MSA64N64: daddu $[[R0:[0-9]]], $7, $[[R1]]
    323 ; CHECK: st.b $w{{[0-9]+}}, 0($[[R0]])
    324   %a = call <16 x i8> @llvm.mips.ld.b(i8* %ldptr, i32 0)
    325   call void @llvm.mips.st.b(<16 x i8> %a, i8* %stptr, i32 %offset)
    326   ret void
    327 }
    328 
    329 define void @addvi_w(<4 x i32> * %ptr) {
    330 entry:
    331 ; CHECK-LABEL: addvi_w:
    332 ; CHECK: addvi.w
    333   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    334   %r = call <4 x i32> @llvm.mips.addvi.w(<4 x i32> %a, i32 25)
    335   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    336   ret void
    337 }
    338 
    339 define void @bclri_w(<4 x i32> * %ptr) {
    340 entry:
    341 ; CHECK-LABEL: bclri_w:
    342 ; CHECK: bclri.w
    343   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    344   %r = call <4 x i32> @llvm.mips.bclri.w(<4 x i32> %a, i32 25)
    345   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    346   ret void
    347 }
    348 
    349 define void @binsli_w(<4 x i32> * %ptr, <4 x i32> * %ptr2) {
    350 entry:
    351 ; CHECK-LABEL: binsli_w:
    352 ; CHECK: binsli.w
    353   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    354   %b = load <4 x i32>, <4 x i32> * %ptr2, align 16
    355   %r = call <4 x i32> @llvm.mips.binsli.w(<4 x i32> %a, <4 x i32> %b, i32 25)
    356   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    357   ret void
    358 }
    359 
    360 define void @binsri_w(<4 x i32> * %ptr, <4 x i32> * %ptr2) {
    361 entry:
    362 ; CHECK-LABEL: binsri_w:
    363 ; CHECK: binsri.w
    364   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    365   %b = load <4 x i32>, <4 x i32> * %ptr2, align 16
    366   %r = call <4 x i32> @llvm.mips.binsri.w(<4 x i32> %a, <4 x i32> %b, i32 25)
    367   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    368   ret void
    369 }
    370 
    371 define void @bnegi_w(<4 x i32> * %ptr) {
    372 entry:
    373 ; CHECK-LABEL: bnegi_w:
    374 ; CHECK: bnegi.w
    375   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    376   %r = call <4 x i32> @llvm.mips.bnegi.w(<4 x i32> %a, i32 25)
    377   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    378   ret void
    379 }
    380 
    381 define void @bseti_w(<4 x i32> * %ptr) {
    382 entry:
    383 ; CHECK-LABEL: bseti_w:
    384 ; CHECK: bseti.w
    385   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    386   %r = call <4 x i32> @llvm.mips.bseti.w(<4 x i32> %a, i32 25)
    387   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    388   ret void
    389 }
    390 
    391 define void @clei_s_w(<4 x i32> * %ptr) {
    392 entry:
    393 ; CHECK-LABEL: clei_s_w:
    394 ; CHECK: clei_s.w
    395   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    396   %r = call <4 x i32> @llvm.mips.clei.s.w(<4 x i32> %a, i32 14)
    397   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    398   ret void
    399 }
    400 
    401 define void @clei_u_w(<4 x i32> * %ptr) {
    402 entry:
    403 ; CHECK-LABEL: clei_u_w:
    404 ; CHECK: clei_u.w
    405   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    406   %r = call <4 x i32> @llvm.mips.clei.u.w(<4 x i32> %a, i32 25)
    407   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    408   ret void
    409 }
    410 
    411 define void @clti_s_w(<4 x i32> * %ptr) {
    412 entry:
    413 ; CHECK-LABEL: clti_s_w:
    414 ; CHECK: clti_s.w
    415   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    416   %r = call <4 x i32> @llvm.mips.clti.s.w(<4 x i32> %a, i32 15)
    417   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    418   ret void
    419 }
    420 
    421 define void @clti_u_w(<4 x i32> * %ptr) {
    422 entry:
    423 ; CHECK-LABEL: clti_u_w:
    424 ; CHECK: clti_u.w
    425   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    426   %r = call <4 x i32> @llvm.mips.clti.u.w(<4 x i32> %a, i32 25)
    427   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    428   ret void
    429 }
    430 
    431 define void @maxi_s_w(<4 x i32> * %ptr) {
    432 entry:
    433 ; CHECK-LABEL: maxi_s_w:
    434 ; CHECK: maxi_s.w
    435   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    436   %r = call <4 x i32> @llvm.mips.maxi.s.w(<4 x i32> %a, i32 2)
    437   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    438   ret void
    439 }
    440 
    441 define void @maxi_u_w(<4 x i32> * %ptr) {
    442 entry:
    443 ; CHECK-LABEL: maxi_u_w:
    444 ; CHECK: maxi_u.w
    445   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    446   %r = call <4 x i32> @llvm.mips.maxi.u.w(<4 x i32> %a, i32 2)
    447   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    448   ret void
    449 }
    450 
    451 define void @mini_s_w(<4 x i32> * %ptr) {
    452 entry:
    453 ; CHECK-LABEL: mini_s_w:
    454 ; CHECK: mini_s.w
    455   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    456   %r = call <4 x i32> @llvm.mips.mini.s.w(<4 x i32> %a, i32 2)
    457   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    458   ret void
    459 }
    460 
    461 define void @mini_u_w(<4 x i32> * %ptr) {
    462 entry:
    463 ; CHECK-LABEL: mini_u_w:
    464 ; CHECK: mini_u.w
    465   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    466   %r = call <4 x i32> @llvm.mips.mini.u.w(<4 x i32> %a, i32 2)
    467   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    468   ret void
    469 }
    470 
    471 define void @ldi_w(<4 x i32> * %ptr) {
    472 entry:
    473 ; CHECK-LABEL: ldi_w:
    474 ; CHECK: ldi.w
    475   %r = call <4 x i32> @llvm.mips.ldi.w(i32 3)
    476   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    477   ret void
    478 }
    479 
    480 define void @sldi_w(<4 x i32> * %ptr) {
    481 entry:
    482 ; CHECK-LABEL: sldi_w:
    483 ; CHECK: sldi.w
    484   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    485   %r = call <4 x i32> @llvm.mips.sldi.w(<4 x i32> %a, <4 x i32> %a, i32 2)
    486   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    487   ret void
    488 }
    489 
    490 define void @slli_w(<4 x i32> * %ptr) {
    491 entry:
    492 ; CHECK-LABEL: slli_w:
    493 ; CHECK: slli.w
    494   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    495   %r = call <4 x i32> @llvm.mips.slli.w(<4 x i32> %a, i32 3)
    496   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    497   ret void
    498 }
    499 
    500 define void @splati_w(<4 x i32> * %ptr) {
    501 entry:
    502 ; CHECK-LABEL: splati_w:
    503 ; CHECK: splati.w
    504   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    505   %r = call <4 x i32> @llvm.mips.splati.w(<4 x i32> %a, i32 3)
    506   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    507   ret void
    508 }
    509 
    510 define void @srai_w(<4 x i32> * %ptr) {
    511 entry:
    512 ; CHECK-LABEL: srai_w:
    513 ; CHECK: srai.w
    514   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    515   %r = call <4 x i32> @llvm.mips.srai.w(<4 x i32> %a, i32 3)
    516   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    517   ret void
    518 }
    519 
    520 define void @srari_w(<4 x i32> * %ptr) {
    521 entry:
    522 ; CHECK-LABEL: srari_w:
    523 ; CHECK: srari.w
    524   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    525   %r = call <4 x i32> @llvm.mips.srari.w(<4 x i32> %a, i32 3)
    526   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    527   ret void
    528 }
    529 
    530 define void @srli_w(<4 x i32> * %ptr) {
    531 entry:
    532 ; CHECK-LABEL: srli_w:
    533 ; CHECK: srli.w
    534   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    535   %r = call <4 x i32> @llvm.mips.srli.w(<4 x i32> %a, i32 3)
    536   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    537   ret void
    538 }
    539 
    540 define void @srlri_w(<4 x i32> * %ptr) {
    541 entry:
    542 ; CHECK-LABEL: srlri_w:
    543 ; CHECK: srlri.w
    544   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    545   %r = call <4 x i32> @llvm.mips.srlri.w(<4 x i32> %a, i32 3)
    546   store <4 x i32> %r, <4 x i32> * %ptr, align 16
    547   ret void
    548 }
    549 
    550 define void @ld_w(<4 x i32> * %ptr, i8 * %ldptr, i32 %offset) {
    551 entry:
    552 ; CHECK-LABEL: ld_w
    553 ; MSA32: addu $[[R0:[0-9]]], $5, $6
    554 ; MSA64N32: sll $[[R2:[0-9]]], $6, 0
    555 ; MSA64N32: sll $[[R1:[0-9]]], $5, 0
    556 ; MSA64N32: addu $[[R0:[0-9]]], $[[R1]], $[[R2]]
    557 ; MSA64N64: sll $[[R1:[0-9]]], $6, 0
    558 ; MSA64N64: daddu $[[R0:[0-9]]], $5, $[[R1]]
    559 ; CHECK: ld.w $w{{[0-9]+}}, 0($[[R0]])
    560   %a = call <4 x i32> @llvm.mips.ld.w(i8* %ldptr, i32 %offset)
    561   store <4 x i32> %a, <4 x i32> * %ptr, align 16
    562   ret void
    563 }
    564 
    565 define void @st_w(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
    566 entry:
    567 ; CHECK-LABEL: st_w
    568 ; MSA32: addu $[[R0:[0-9]]], $7, $6
    569 
    570 ; MSA64N32: sll $[[R1:[0-9]+]], $6, 0
    571 ; MSA64N32: sll $[[R2:[0-9]+]], $7, 0
    572 ; MSA64N32: addu $[[R0:[0-9]+]], $[[R2]], $[[R1]]
    573 
    574 ; MSA64N64: sll $[[R1:[0-9]]], $6, 0
    575 ; MSA64N64: daddu $[[R0:[0-9]]], $7, $[[R1]]
    576 ; CHECK: st.w $w{{[0-9]+}}, 0($[[R0]])
    577   %a = call <4 x i32> @llvm.mips.ld.w(i8* %ldptr, i32 0)
    578   call void @llvm.mips.st.w(<4 x i32> %a, i8* %stptr, i32 %offset)
    579   ret void
    580 }
    581 
    582 define void @addvi_h(<8 x i16> * %ptr) {
    583 entry:
    584 ; CHECK-LABEL: addvi_h:
    585 ; CHECK: addvi.h
    586   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    587   %r = call <8 x i16> @llvm.mips.addvi.h(<8 x i16> %a, i32 25)
    588   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    589   ret void
    590 }
    591 
    592 define void @bclri_h(<8 x i16> * %ptr) {
    593 entry:
    594 ; CHECK-LABEL: bclri_h:
    595 ; CHECK: bclri.h
    596   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    597   %r = call <8 x i16> @llvm.mips.bclri.h(<8 x i16> %a, i32 8)
    598   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    599   ret void
    600 }
    601 
    602 define void @binsli_h(<8 x i16> * %ptr, <8 x i16> * %ptr2) {
    603 entry:
    604 ; CHECK-LABEL: binsli_h:
    605 ; CHECK: binsli.h
    606   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    607   %b = load <8 x i16>, <8 x i16> * %ptr2, align 16
    608   %r = call <8 x i16> @llvm.mips.binsli.h(<8 x i16> %a, <8 x i16> %b, i32 8)
    609   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    610   ret void
    611 }
    612 
    613 define void @binsri_h(<8 x i16> * %ptr, <8 x i16> * %ptr2) {
    614 entry:
    615 ; CHECK-LABEL: binsri_h:
    616 ; CHECK: binsri.h
    617   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    618   %b = load <8 x i16>, <8 x i16> * %ptr2, align 16
    619   %r = call <8 x i16> @llvm.mips.binsri.h(<8 x i16> %a, <8 x i16> %b, i32 14)
    620   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    621   ret void
    622 }
    623 
    624 define void @bnegi_h(<8 x i16> * %ptr) {
    625 entry:
    626 ; CHECK-LABEL: bnegi_h:
    627 ; CHECK: bnegi.h
    628   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    629   %r = call <8 x i16> @llvm.mips.bnegi.h(<8 x i16> %a, i32 14)
    630   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    631   ret void
    632 }
    633 
    634 define void @bseti_h(<8 x i16> * %ptr) {
    635 entry:
    636 ; CHECK-LABEL: bseti_h:
    637 ; CHECK: bseti.h
    638   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    639   %r = call <8 x i16> @llvm.mips.bseti.h(<8 x i16> %a, i32 15)
    640   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    641   ret void
    642 }
    643 
    644 define void @clei_s_h(<8 x i16> * %ptr) {
    645 entry:
    646 ; CHECK-LABEL: clei_s_h:
    647 ; CHECK: clei_s.h
    648   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    649   %r = call <8 x i16> @llvm.mips.clei.s.h(<8 x i16> %a, i32 13)
    650   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    651   ret void
    652 }
    653 
    654 define void @clei_u_h(<8 x i16> * %ptr) {
    655 entry:
    656 ; CHECK-LABEL: clei_u_h:
    657 ; CHECK: clei_u.h
    658   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    659   %r = call <8 x i16> @llvm.mips.clei.u.h(<8 x i16> %a, i32 25)
    660   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    661   ret void
    662 }
    663 
    664 define void @clti_s_h(<8 x i16> * %ptr) {
    665 entry:
    666 ; CHECK-LABEL: clti_s_h:
    667 ; CHECK: clti_s.h
    668   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    669   %r = call <8 x i16> @llvm.mips.clti.s.h(<8 x i16> %a, i32 15)
    670   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    671   ret void
    672 }
    673 
    674 define void @clti_u_h(<8 x i16> * %ptr) {
    675 entry:
    676 ; CHECK-LABEL: clti_u_h:
    677 ; CHECK: clti_u.h
    678   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    679   %r = call <8 x i16> @llvm.mips.clti.u.h(<8 x i16> %a, i32 25)
    680   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    681   ret void
    682 }
    683 
    684 define void @maxi_s_h(<8 x i16> * %ptr) {
    685 entry:
    686 ; CHECK-LABEL: maxi_s_h:
    687 ; CHECK: maxi_s.h
    688   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    689   %r = call <8 x i16> @llvm.mips.maxi.s.h(<8 x i16> %a, i32 2)
    690   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    691   ret void
    692 }
    693 
    694 define void @maxi_u_h(<8 x i16> * %ptr) {
    695 entry:
    696 ; CHECK-LABEL: maxi_u_h:
    697 ; CHECK: maxi_u.h
    698   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    699   %r = call <8 x i16> @llvm.mips.maxi.u.h(<8 x i16> %a, i32 2)
    700   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    701   ret void
    702 }
    703 
    704 define void @mini_s_h(<8 x i16> * %ptr) {
    705 entry:
    706 ; CHECK-LABEL: mini_s_h:
    707 ; CHECK: mini_s.h
    708   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    709   %r = call <8 x i16> @llvm.mips.mini.s.h(<8 x i16> %a, i32 2)
    710   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    711   ret void
    712 }
    713 
    714 define void @mini_u_h(<8 x i16> * %ptr) {
    715 entry:
    716 ; CHECK-LABEL: mini_u_h:
    717 ; CHECK: mini_u.h
    718   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    719   %r = call <8 x i16> @llvm.mips.mini.u.h(<8 x i16> %a, i32 2)
    720   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    721   ret void
    722 }
    723 
    724 define void @ldi_h(<8 x i16> * %ptr) {
    725 entry:
    726 ; CHECK-LABEL: ldi_h:
    727 ; CHECK: ldi.h
    728   %r = call <8 x i16> @llvm.mips.ldi.h(i32 3)
    729   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    730   ret void
    731 }
    732 
    733 define void @sldi_h(<8 x i16> * %ptr) {
    734 entry:
    735 ; CHECK-LABEL: sldi_h:
    736 ; CHECK: sldi.h
    737   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    738   %r = call <8 x i16> @llvm.mips.sldi.h(<8 x i16> %a, <8 x i16> %a, i32 3)
    739   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    740   ret void
    741 }
    742 
    743 define void @slli_h(<8 x i16> * %ptr) {
    744 entry:
    745 ; CHECK-LABEL: slli_h:
    746 ; CHECK: slli.h
    747   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    748   %r = call <8 x i16> @llvm.mips.slli.h(<8 x i16> %a, i32 3)
    749   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    750   ret void
    751 }
    752 
    753 define void @splati_h(<8 x i16> * %ptr) {
    754 entry:
    755 ; CHECK-LABEL: splati_h:
    756 ; CHECK: splati.h
    757   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    758   %r = call <8 x i16> @llvm.mips.splati.h(<8 x i16> %a, i32 3)
    759   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    760   ret void
    761 }
    762 
    763 define void @srai_h(<8 x i16> * %ptr) {
    764 entry:
    765 ; CHECK-LABEL: srai_h:
    766 ; CHECK: srai.h
    767   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    768   %r = call <8 x i16> @llvm.mips.srai.h(<8 x i16> %a, i32 3)
    769   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    770   ret void
    771 }
    772 
    773 define void @srari_h(<8 x i16> * %ptr) {
    774 entry:
    775 ; CHECK-LABEL: srari_h:
    776 ; CHECK: srari.h
    777   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    778   %r = call <8 x i16> @llvm.mips.srari.h(<8 x i16> %a, i32 3)
    779   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    780   ret void
    781 }
    782 
    783 define void @srli_h(<8 x i16> * %ptr) {
    784 entry:
    785 ; CHECK-LABEL: srli_h:
    786 ; CHECK: srli.h
    787   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    788   %r = call <8 x i16> @llvm.mips.srli.h(<8 x i16> %a, i32 3)
    789   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    790   ret void
    791 }
    792 
    793 define void @srlri_h(<8 x i16> * %ptr) {
    794 entry:
    795 ; CHECK-LABEL: srlri_h:
    796 ; CHECK: srlri.h
    797   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    798   %r = call <8 x i16> @llvm.mips.srlri.h(<8 x i16> %a, i32 3)
    799   store <8 x i16> %r, <8 x i16> * %ptr, align 16
    800   ret void
    801 }
    802 
    803 define void @ld_h(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset) {
    804 entry:
    805 ; CHECK-LABEL: ld_h
    806 ; MSA32: addu $[[R0:[0-9]]], $5, $6
    807 
    808 ; MSA64N32-DAG: sll $[[R2:[0-9]]], $6, 0
    809 ; MSA64N32-DAG: sll $[[R1:[0-9]]], $5, 0
    810 ; MSA64N32: addu $[[R0:[0-9]]], $[[R1]], $[[R2]]
    811 
    812 ; MSA64N64: sll $[[R1:[0-9]]], $6, 0
    813 ; MSA64N64: daddu $[[R0:[0-9]]], $5, $[[R1]]
    814 
    815 ; CHECK:    ld.h $w{{[0-9]+}}, 0($[[R0]])
    816   %a = call <8 x i16> @llvm.mips.ld.h(i8* %ldptr, i32 %offset)
    817   store <8 x i16> %a, <8 x i16> * %ptr, align 16
    818   ret void
    819 }
    820 
    821 define void @st_h(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
    822 entry:
    823 ; CHECK-LABEL: st_h
    824 ; MSA32: addu $[[R0:[0-9]]], $7, $6
    825 
    826 ; MSA64N32-DAG: sll $[[R1:[0-9]+]], $6, 0
    827 ; MSA64N32-DAG: sll $[[R2:[0-9]+]], $7, 0
    828 ; MSA64N32: addu $[[R0:[0-9]+]], $[[R2]], $[[R1]]
    829 
    830 ; MSA64N64: sll $[[R1:[0-9]]], $6, 0
    831 ; MSA64N64: daddu $[[R0:[0-9]]], $7, $[[R1]]
    832 ; CHECK: st.h $w{{[0-9]+}}, 0($[[R0]])
    833   %a = call <8 x i16> @llvm.mips.ld.h(i8* %ldptr, i32 0)
    834   call void @llvm.mips.st.h(<8 x i16> %a, i8* %stptr, i32 %offset)
    835   ret void
    836 }
    837 
    838 define i32 @copy_s_b(<16 x i8> * %ptr) {
    839 entry:
    840 ; CHECK-LABEL: copy_s_b:
    841 ; CHECK: copy_s.b
    842   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    843   %r = call i32 @llvm.mips.copy.s.b(<16 x i8> %a, i32 1)
    844   ret i32 %r
    845 }
    846 define i32 @copy_s_h(<8 x i16> * %ptr) {
    847 entry:
    848 ; CHECK-LABEL: copy_s_h:
    849 ; CHECK: copy_s.h
    850   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    851   %r = call i32 @llvm.mips.copy.s.h(<8 x i16> %a, i32 1)
    852   ret i32 %r
    853 }
    854 define i32 @copy_s_w(<4 x i32> * %ptr) {
    855 entry:
    856 ; CHECK-LABEL: copy_s_w:
    857 ; CHECK: copy_s.w
    858   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    859   %r = call i32 @llvm.mips.copy.s.w(<4 x i32> %a, i32 1)
    860   ret i32 %r
    861 }
    862 define i32 @copy_u_b(<16 x i8> * %ptr) {
    863 entry:
    864 ; CHECK-LABEL: copy_u_b:
    865 ; CHECK: copy_u.b
    866   %a = load <16 x i8>, <16 x i8> * %ptr, align 16
    867   %r = call i32 @llvm.mips.copy.u.b(<16 x i8> %a, i32 1)
    868   ret i32 %r
    869 }
    870 define i32 @copy_u_h(<8 x i16> * %ptr) {
    871 entry:
    872 ; CHECK-LABEL: copy_u_h:
    873 ; CHECK: copy_u.h
    874   %a = load <8 x i16>, <8 x i16> * %ptr, align 16
    875   %r = call i32 @llvm.mips.copy.u.h(<8 x i16> %a, i32 1)
    876   ret i32 %r
    877 }
    878 define i32 @copy_u_w(<4 x i32> * %ptr) {
    879 entry:
    880 ; CHECK-LABEL: copy_u_w:
    881 ; MSA32: copy_s.w
    882 ; MSA64: copy_u.w
    883   %a = load <4 x i32>, <4 x i32> * %ptr, align 16
    884   %r = call i32 @llvm.mips.copy.u.w(<4 x i32> %a, i32 1)
    885   ret i32 %r
    886 }
    887 
    888 define i64 @copy_s_d(<2 x i64> * %ptr) {
    889 entry:
    890 ; CHECK-LABEL: copy_s_d:
    891 ; MSA32: copy_s.w
    892 ; MSA32: copy_s.w
    893 ; MSA64: copy_s.d
    894   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    895   %r = call i64 @llvm.mips.copy.s.d(<2 x i64> %a, i32 1)
    896   ret i64 %r
    897 }
    898 
    899 define i64 @copy_u_d(<2 x i64> * %ptr) {
    900 entry:
    901 ; CHECK-LABEL: copy_u_d:
    902 ; MSA32: copy_s.w
    903 ; MSA32: copy_s.w
    904 ; MSA64: copy_s.d
    905   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    906   %r = call i64 @llvm.mips.copy.u.d(<2 x i64> %a, i32 1)
    907   ret i64 %r
    908 }
    909 
    910 define void @addvi_d(<2 x i64> * %ptr) {
    911 entry:
    912 ; CHECK-LABEL: addvi_d:
    913 ; CHECK: addvi.d
    914   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    915   %r = call <2 x i64> @llvm.mips.addvi.d(<2 x i64> %a, i32 25)
    916   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    917   ret void
    918 }
    919 
    920 define void @bclri_d(<2 x i64> * %ptr) {
    921 entry:
    922 ; CHECK-LABEL: bclri_d:
    923 ; CHECK: bclri.d
    924   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    925   %r = call <2 x i64> @llvm.mips.bclri.d(<2 x i64> %a, i32 16)
    926   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    927   ret void
    928 }
    929 
    930 define void @binsli_d(<2 x i64> * %ptr, <2 x i64> * %ptr2) {
    931 entry:
    932 ; CHECK-LABEL: binsli_d:
    933 ; CHECK: binsli.d
    934   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    935   %b = load <2 x i64>, <2 x i64> * %ptr2, align 16
    936   %r = call <2 x i64> @llvm.mips.binsli.d(<2 x i64> %a, <2 x i64> %b, i32 4)
    937   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    938   ret void
    939 }
    940 
    941 define void @binsri_d(<2 x i64> * %ptr, <2 x i64> * %ptr2) {
    942 entry:
    943 ; CHECK-LABEL: binsri_d:
    944 ; CHECK: binsri.d
    945   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    946   %b = load <2 x i64>, <2 x i64> * %ptr2, align 16
    947   %r = call <2 x i64> @llvm.mips.binsri.d(<2 x i64> %a, <2 x i64> %b, i32 5)
    948   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    949   ret void
    950 }
    951 
    952 define void @bnegi_d(<2 x i64> * %ptr) {
    953 entry:
    954 ; CHECK-LABEL: bnegi_d:
    955 ; CHECK: bnegi.d
    956   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    957   %r = call <2 x i64> @llvm.mips.bnegi.d(<2 x i64> %a, i32 9)
    958   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    959   ret void
    960 }
    961 
    962 define void @bseti_d(<2 x i64> * %ptr) {
    963 entry:
    964 ; CHECK-LABEL: bseti_d:
    965 ; CHECK: bseti.d
    966   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    967   %r = call <2 x i64> @llvm.mips.bseti.d(<2 x i64> %a, i32 25)
    968   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    969   ret void
    970 }
    971 
    972 define void @clei_s_d(<2 x i64> * %ptr) {
    973 entry:
    974 ; CHECK-LABEL: clei_s_d:
    975 ; CHECK: clei_s.d
    976   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    977   %r = call <2 x i64> @llvm.mips.clei.s.d(<2 x i64> %a, i32 15)
    978   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    979   ret void
    980 }
    981 
    982 define void @clei_u_d(<2 x i64> * %ptr) {
    983 entry:
    984 ; CHECK-LABEL: clei_u_d:
    985 ; CHECK: clei_u.d
    986   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    987   %r = call <2 x i64> @llvm.mips.clei.u.d(<2 x i64> %a, i32 25)
    988   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    989   ret void
    990 }
    991 
    992 define void @clti_s_d(<2 x i64> * %ptr) {
    993 entry:
    994 ; CHECK-LABEL: clti_s_d:
    995 ; CHECK: clti_s.d
    996   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
    997   %r = call <2 x i64> @llvm.mips.clti.s.d(<2 x i64> %a, i32 15)
    998   store <2 x i64> %r, <2 x i64> * %ptr, align 16
    999   ret void
   1000 }
   1001 
   1002 define void @clti_u_d(<2 x i64> * %ptr) {
   1003 entry:
   1004 ; CHECK-LABEL: clti_u_d:
   1005 ; CHECK: clti_u.d
   1006   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1007   %r = call <2 x i64> @llvm.mips.clti.u.d(<2 x i64> %a, i32 25)
   1008   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1009   ret void
   1010 }
   1011 
   1012 define void @ldi_d(<2 x i64> * %ptr) {
   1013 entry:
   1014 ; CHECK-LABEL: ldi_d:
   1015 ; CHECK: ldi.d
   1016   %r = call <2 x i64> @llvm.mips.ldi.d(i32 3)
   1017   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1018   ret void
   1019 }
   1020 
   1021 define void @maxi_s_d(<2 x i64> * %ptr) {
   1022 entry:
   1023 ; CHECK-LABEL: maxi_s_d:
   1024 ; CHECK: maxi_s.d
   1025   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1026   %r = call <2 x i64> @llvm.mips.maxi.s.d(<2 x i64> %a, i32 2)
   1027   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1028   ret void
   1029 }
   1030 
   1031 define void @maxi_u_d(<2 x i64> * %ptr) {
   1032 entry:
   1033 ; CHECK-LABEL: maxi_u_d:
   1034 ; CHECK: maxi_u.d
   1035   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1036   %r = call <2 x i64> @llvm.mips.maxi.u.d(<2 x i64> %a, i32 2)
   1037   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1038   ret void
   1039 }
   1040 
   1041 define void @mini_s_d(<2 x i64> * %ptr) {
   1042 entry:
   1043 ; CHECK-LABEL: mini_s_d:
   1044 ; CHECK: mini_s.d
   1045   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1046   %r = call <2 x i64> @llvm.mips.mini.s.d(<2 x i64> %a, i32 2)
   1047   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1048   ret void
   1049 }
   1050 
   1051 define void @mini_u_d(<2 x i64> * %ptr) {
   1052 entry:
   1053 ; CHECK-LABEL: mini_u_d:
   1054 ; CHECK: mini_u.d
   1055   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1056   %r = call <2 x i64> @llvm.mips.mini.u.d(<2 x i64> %a, i32 2)
   1057   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1058   ret void
   1059 }
   1060 
   1061 define void @sldi_d(<2 x i64> * %ptr) {
   1062 entry:
   1063 ; CHECK-LABEL: sldi_d:
   1064 ; CHECK: sldi.d
   1065   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1066   %r = call <2 x i64> @llvm.mips.sldi.d(<2 x i64> %a, <2 x i64> %a, i32 1)
   1067   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1068   ret void
   1069 }
   1070 
   1071 define void @slli_d(<2 x i64> * %ptr) {
   1072 entry:
   1073 ; CHECK-LABEL: slli_d:
   1074 ; CHECK: slli.d
   1075   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1076   %r = call <2 x i64> @llvm.mips.slli.d(<2 x i64> %a, i32 3)
   1077   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1078   ret void
   1079 }
   1080 
   1081 define void @srai_d(<2 x i64> * %ptr) {
   1082 entry:
   1083 ; CHECK-LABEL: srai_d:
   1084 ; CHECK: srai.d
   1085   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1086   %r = call <2 x i64> @llvm.mips.srai.d(<2 x i64> %a, i32 3)
   1087   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1088   ret void
   1089 }
   1090 
   1091 define void @srari_d(<2 x i64> * %ptr) {
   1092 entry:
   1093 ; CHECK-LABEL: srari_d:
   1094 ; CHECK: srari.d
   1095   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1096   %r = call <2 x i64> @llvm.mips.srari.d(<2 x i64> %a, i32 3)
   1097   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1098   ret void
   1099 }
   1100 
   1101 define void @srli_d(<2 x i64> * %ptr) {
   1102 entry:
   1103 ; CHECK-LABEL: srli_d:
   1104 ; CHECK: srli.d
   1105   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1106   %r = call <2 x i64> @llvm.mips.srli.d(<2 x i64> %a, i32 3)
   1107   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1108   ret void
   1109 }
   1110 
   1111 define void @srlri_d(<2 x i64> * %ptr) {
   1112 entry:
   1113 ; CHECK-LABEL: srlri_d:
   1114 ; CHECK: srlri.d
   1115   %a = load <2 x i64>, <2 x i64> * %ptr, align 16
   1116   %r = call <2 x i64> @llvm.mips.srlri.d(<2 x i64> %a, i32 3)
   1117   store <2 x i64> %r, <2 x i64> * %ptr, align 16
   1118   ret void
   1119 }
   1120 
   1121 define void @ld_d(<2 x i64> * %ptr, i8 * %ldptr, i32 %offset) {
   1122 entry:
   1123 ; CHECK-LABEL: ld_d
   1124 ; MSA32: addu $[[R0:[0-9]]], $5, $6
   1125 ; MSA64N32: sll $[[R2:[0-9]]], $6, 0
   1126 ; MSA64N32: sll $[[R1:[0-9]]], $5, 0
   1127 ; MSA64N32: addu $[[R0:[0-9]]], $[[R1]], $[[R2]]
   1128 ; MSA64N64: sll $[[R1:[0-9]]], $6, 0
   1129 ; MSA64N64: daddu $[[R0:[0-9]]], $5, $[[R1]]
   1130 ; CHECK: ld.d $w{{[0-9]+}}, 0($[[R0]])
   1131   %a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 %offset)
   1132   store <2 x i64> %a, <2 x i64> * %ptr, align 16
   1133   ret void
   1134 }
   1135 
   1136 define void @ld_d2(<2 x i64> * %ptr, i8 * %ldptr) {
   1137 entry:
   1138 ; CHECK-LABEL: ld_d2
   1139 ; MSA32: addiu $[[R0:[0-9]]], $5, 4096
   1140 ; MSA64N32: sll $[[R1:[0-9]]], $5, 0
   1141 ; MSA64N32: addiu $[[R0:[0-9]]], $[[R1]], 4096
   1142 ; MSA64N64: daddiu $[[R0:[0-9]]], $5, 4096
   1143 ; CHECK: ld.d $w{{[0-9]+}}, 0($[[R0]])
   1144   %a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 4096)
   1145   store <2 x i64> %a, <2 x i64> * %ptr, align 16
   1146   ret void
   1147 }
   1148 
   1149 define void @st_d(<2 x i64> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
   1150 entry:
   1151 ; CHECK-LABEL: st_d
   1152 ; MSA32: addu $[[R0:[0-9]]], $7, $6
   1153 
   1154 ; MSA64N32-DAG: sll $[[R1:[0-9]]], $6, 0
   1155 ; MSA64N32-DAG: sll $[[R2:[0-9]+]], $7, 0
   1156 ; MSA64N32: addu $[[R0:[0-9]+]], $[[R2]], $[[R1]]
   1157 
   1158 ; MSA64N64: sll $[[R1:[0-9]]], $6, 0
   1159 ; MSA64N64: daddu $[[R0:[0-9]]], $7, $[[R1]]
   1160 ; CHECK: st.d $w{{[0-9]+}}, 0($[[R0]])
   1161   %a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 0)
   1162   call void @llvm.mips.st.d(<2 x i64> %a, i8* %stptr, i32 %offset)
   1163   ret void
   1164 }
   1165 
   1166 
   1167 declare <8 x i16> @llvm.mips.ldi.h(i32)
   1168 declare <8 x i16> @llvm.mips.addvi.h(<8 x i16>, i32)
   1169 declare <8 x i16> @llvm.mips.bclri.h(<8 x i16>, i32)
   1170 declare <8 x i16> @llvm.mips.binsli.h(<8 x i16>, <8 x i16>, i32)
   1171 declare <8 x i16> @llvm.mips.binsri.h(<8 x i16>, <8 x i16>, i32)
   1172 declare <8 x i16> @llvm.mips.bnegi.h(<8 x i16>, i32)
   1173 declare <8 x i16> @llvm.mips.bseti.h(<8 x i16>, i32)
   1174 declare <8 x i16> @llvm.mips.clei.s.h(<8 x i16>, i32)
   1175 declare <8 x i16> @llvm.mips.clei.u.h(<8 x i16>, i32)
   1176 declare <8 x i16> @llvm.mips.clti.s.h(<8 x i16>, i32)
   1177 declare <8 x i16> @llvm.mips.clti.u.h(<8 x i16>, i32)
   1178 declare <8 x i16> @llvm.mips.maxi.s.h(<8 x i16>, i32)
   1179 declare <8 x i16> @llvm.mips.maxi.u.h(<8 x i16>, i32)
   1180 declare <8 x i16> @llvm.mips.mini.s.h(<8 x i16>, i32)
   1181 declare <8 x i16> @llvm.mips.mini.u.h(<8 x i16>, i32)
   1182 declare <8 x i16> @llvm.mips.sldi.h(<8 x i16>, <8 x i16>, i32)
   1183 declare <8 x i16> @llvm.mips.slli.h(<8 x i16>, i32)
   1184 declare <8 x i16> @llvm.mips.splati.h(<8 x i16>, i32)
   1185 declare <8 x i16> @llvm.mips.srai.h(<8 x i16>, i32)
   1186 declare <8 x i16> @llvm.mips.srari.h(<8 x i16>, i32)
   1187 declare <8 x i16> @llvm.mips.srli.h(<8 x i16>, i32)
   1188 declare <8 x i16> @llvm.mips.srlri.h(<8 x i16>, i32)
   1189 declare <4 x i32> @llvm.mips.addvi.w(<4 x i32>, i32)
   1190 declare <4 x i32> @llvm.mips.bclri.w(<4 x i32>, i32)
   1191 declare <4 x i32> @llvm.mips.binsli.w(<4 x i32>, <4 x i32>, i32)
   1192 declare <4 x i32> @llvm.mips.binsri.w(<4 x i32>, <4 x i32>, i32)
   1193 declare <4 x i32> @llvm.mips.bnegi.w(<4 x i32>, i32)
   1194 declare <4 x i32> @llvm.mips.bseti.w(<4 x i32>, i32)
   1195 declare <4 x i32> @llvm.mips.ldi.w(i32)
   1196 declare <4 x i32> @llvm.mips.clei.s.w(<4 x i32>, i32)
   1197 declare <4 x i32> @llvm.mips.clei.u.w(<4 x i32>, i32)
   1198 declare <4 x i32> @llvm.mips.clti.s.w(<4 x i32>, i32)
   1199 declare <4 x i32> @llvm.mips.clti.u.w(<4 x i32>, i32)
   1200 declare <4 x i32> @llvm.mips.maxi.s.w(<4 x i32>, i32)
   1201 declare <4 x i32> @llvm.mips.maxi.u.w(<4 x i32>, i32)
   1202 declare <4 x i32> @llvm.mips.mini.s.w(<4 x i32>, i32)
   1203 declare <4 x i32> @llvm.mips.mini.u.w(<4 x i32>, i32)
   1204 declare <4 x i32> @llvm.mips.sldi.w(<4 x i32>, <4 x i32>, i32)
   1205 declare <4 x i32> @llvm.mips.slli.w(<4 x i32>, i32)
   1206 declare <4 x i32> @llvm.mips.splati.w(<4 x i32>, i32)
   1207 declare <4 x i32> @llvm.mips.srai.w(<4 x i32>, i32)
   1208 declare <4 x i32> @llvm.mips.srari.w(<4 x i32>, i32)
   1209 declare <4 x i32> @llvm.mips.srli.w(<4 x i32>, i32)
   1210 declare <4 x i32> @llvm.mips.srlri.w(<4 x i32>, i32)
   1211 declare <2 x i64> @llvm.mips.ldi.d(i32)
   1212 declare <2 x i64> @llvm.mips.addvi.d(<2 x i64>, i32)
   1213 declare <2 x i64> @llvm.mips.bclri.d(<2 x i64>, i32)
   1214 declare <2 x i64> @llvm.mips.binsli.d(<2 x i64>, <2 x i64>, i32)
   1215 declare <2 x i64> @llvm.mips.binsri.d(<2 x i64>, <2 x i64>, i32)
   1216 declare <2 x i64> @llvm.mips.bnegi.d(<2 x i64>, i32)
   1217 declare <2 x i64> @llvm.mips.bseti.d(<2 x i64>, i32)
   1218 declare <2 x i64> @llvm.mips.clei.s.d(<2 x i64>, i32)
   1219 declare <2 x i64> @llvm.mips.clei.u.d(<2 x i64>, i32)
   1220 declare <2 x i64> @llvm.mips.clti.s.d(<2 x i64>, i32)
   1221 declare <2 x i64> @llvm.mips.clti.u.d(<2 x i64>, i32)
   1222 declare <2 x i64> @llvm.mips.maxi.s.d(<2 x i64>, i32)
   1223 declare <2 x i64> @llvm.mips.maxi.u.d(<2 x i64>, i32)
   1224 declare <2 x i64> @llvm.mips.mini.s.d(<2 x i64>, i32)
   1225 declare <2 x i64> @llvm.mips.mini.u.d(<2 x i64>, i32)
   1226 declare <2 x i64> @llvm.mips.sldi.d(<2 x i64>, <2 x i64>, i32)
   1227 declare <2 x i64> @llvm.mips.slli.d(<2 x i64>, i32)
   1228 declare <2 x i64> @llvm.mips.splati.d(<2 x i64>, i32)
   1229 declare <2 x i64> @llvm.mips.srai.d(<2 x i64>, i32)
   1230 declare <2 x i64> @llvm.mips.srari.d(<2 x i64>, i32)
   1231 declare <2 x i64> @llvm.mips.srli.d(<2 x i64>, i32)
   1232 declare <2 x i64> @llvm.mips.srlri.d(<2 x i64>, i32)
   1233 declare <16 x i8> @llvm.mips.ldi.b(i32)
   1234 declare <16 x i8> @llvm.mips.addvi.b(<16 x i8>, i32)
   1235 declare <16 x i8> @llvm.mips.andi.b(<16 x i8>, i32)
   1236 declare <16 x i8> @llvm.mips.bclri.b(<16 x i8>, i32)
   1237 declare <16 x i8> @llvm.mips.binsli.b(<16 x i8>, <16 x i8>, i32)
   1238 declare <16 x i8> @llvm.mips.binsri.b(<16 x i8>, <16 x i8>, i32)
   1239 declare <16 x i8> @llvm.mips.bmnzi.b(<16 x i8>, <16 x i8>, i32)
   1240 declare <16 x i8> @llvm.mips.bnegi.b(<16 x i8>, i32)
   1241 declare <16 x i8> @llvm.mips.bseli.b(<16 x i8>, <16 x i8>, i32)
   1242 declare <16 x i8> @llvm.mips.bseti.b(<16 x i8>, i32)
   1243 declare <16 x i8> @llvm.mips.clei.s.b(<16 x i8>, i32)
   1244 declare <16 x i8> @llvm.mips.clei.u.b(<16 x i8>, i32)
   1245 declare <16 x i8> @llvm.mips.clti.s.b(<16 x i8>, i32)
   1246 declare <16 x i8> @llvm.mips.clti.u.b(<16 x i8>, i32)
   1247 declare <16 x i8> @llvm.mips.maxi.s.b(<16 x i8>, i32)
   1248 declare <16 x i8> @llvm.mips.maxi.u.b(<16 x i8>, i32)
   1249 declare <16 x i8> @llvm.mips.mini.s.b(<16 x i8>, i32)
   1250 declare <16 x i8> @llvm.mips.mini.u.b(<16 x i8>, i32)
   1251 declare <16 x i8> @llvm.mips.nori.b(<16 x i8>, i32)
   1252 declare <16 x i8> @llvm.mips.ori.b(<16 x i8>, i32)
   1253 declare <16 x i8> @llvm.mips.sldi.b(<16 x i8>, <16 x i8>, i32)
   1254 declare <16 x i8> @llvm.mips.slli.b(<16 x i8>, i32)
   1255 declare <16 x i8> @llvm.mips.splati.b(<16 x i8>, i32)
   1256 declare <16 x i8> @llvm.mips.srai.b(<16 x i8>, i32)
   1257 declare <16 x i8> @llvm.mips.srari.b(<16 x i8>, i32)
   1258 declare <16 x i8> @llvm.mips.srli.b(<16 x i8>, i32)
   1259 declare <16 x i8> @llvm.mips.srlri.b(<16 x i8>, i32)
   1260 declare i32 @llvm.mips.copy.s.h(<8 x i16>, i32)
   1261 declare i32 @llvm.mips.copy.u.h(<8 x i16>, i32)
   1262 declare i32 @llvm.mips.copy.s.w(<4 x i32>, i32)
   1263 declare i32 @llvm.mips.copy.u.w(<4 x i32>, i32)
   1264 declare i64 @llvm.mips.copy.s.d(<2 x i64>, i32)
   1265 declare i64 @llvm.mips.copy.u.d(<2 x i64>, i32)
   1266 declare i32 @llvm.mips.copy.s.b(<16 x i8>, i32)
   1267 declare i32 @llvm.mips.copy.u.b(<16 x i8>, i32)
   1268 declare <16 x i8> @llvm.mips.bmzi.b(<16 x i8>, <16 x i8>, i32)
   1269 declare <16 x i8> @llvm.mips.ld.b(i8*, i32)
   1270 declare <8 x i16> @llvm.mips.ld.h(i8*, i32)
   1271 declare <4 x i32> @llvm.mips.ld.w(i8*, i32)
   1272 declare <2 x i64> @llvm.mips.ld.d(i8*, i32)
   1273 declare void @llvm.mips.st.b(<16 x i8>, i8*, i32)
   1274 declare void @llvm.mips.st.h(<8 x i16>, i8*, i32)
   1275 declare void @llvm.mips.st.w(<4 x i32>, i8*, i32)
   1276 declare void @llvm.mips.st.d(<2 x i64>, i8*, i32)
   1277