Home | History | Annotate | Download | only in msa
      1 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=MIPS32-AE -check-prefix=MIPS32-BE %s
      2 ; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=MIPS32-AE -check-prefix=MIPS32-LE %s
      3 
      4 @v4i8 = global <4 x i8> <i8 0, i8 0, i8 0, i8 0>
      5 @v16i8 = global <16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
      6 @v8i16 = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
      7 @v4i32 = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>
      8 @v2i64 = global <2 x i64> <i64 0, i64 0>
      9 @i32 = global i32 0
     10 @i64 = global i64 0
     11 
     12 define void @const_v16i8() nounwind {
     13   ; MIPS32-AE-LABEL: const_v16i8:
     14 
     15   store volatile <16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>, <16 x i8>*@v16i8
     16   ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0
     17 
     18   store volatile <16 x i8> <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>, <16 x i8>*@v16i8
     19   ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1
     20 
     21   store volatile <16 x i8> <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 31>, <16 x i8>*@v16i8
     22   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
     23   ; MIPS32-AE: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
     24 
     25   store volatile <16 x i8> <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6>, <16 x i8>*@v16i8
     26   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
     27   ; MIPS32-AE: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
     28 
     29   store volatile <16 x i8> <i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0>, <16 x i8>*@v16i8
     30   ; MIPS32-BE: ldi.h [[R1:\$w[0-9]+]], 256
     31   ; MIPS32-LE: ldi.h [[R1:\$w[0-9]+]], 1
     32 
     33   store volatile <16 x i8> <i8 1, i8 2, i8 3, i8 4, i8 1, i8 2, i8 3, i8 4, i8 1, i8 2, i8 3, i8 4, i8 1, i8 2, i8 3, i8 4>, <16 x i8>*@v16i8
     34   ; MIPS32-BE-DAG: lui [[R2:\$[0-9]+]], 258
     35   ; MIPS32-LE-DAG: lui [[R2:\$[0-9]+]], 1027
     36   ; MIPS32-BE-DAG: ori [[R2]], [[R2]], 772
     37   ; MIPS32-LE-DAG: ori [[R2]], [[R2]], 513
     38   ; MIPS32-AE-DAG: fill.w [[R1:\$w[0-9]+]], [[R2]]
     39 
     40   store volatile <16 x i8> <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8>, <16 x i8>*@v16i8
     41   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
     42   ; MIPS32-AE: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
     43 
     44   ret void
     45   ; MIPS32-AE: .size const_v16i8
     46 }
     47 
     48 define void @const_v8i16() nounwind {
     49   ; MIPS32-AE-LABEL: const_v8i16:
     50 
     51   store volatile <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16>*@v8i16
     52   ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0
     53 
     54   store volatile <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16>*@v8i16
     55   ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1
     56 
     57   store volatile <8 x i16> <i16 1, i16 1, i16 1, i16 2, i16 1, i16 1, i16 1, i16 31>, <8 x i16>*@v8i16
     58   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
     59   ; MIPS32-AE: ld.h  [[R1:\$w[0-9]+]], 0([[G_PTR]])
     60 
     61   store volatile <8 x i16> <i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028>, <8 x i16>*@v8i16
     62   ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 4
     63 
     64   store volatile <8 x i16> <i16 1, i16 2, i16 1, i16 2, i16 1, i16 2, i16 1, i16 2>, <8 x i16>*@v8i16
     65   ; MIPS32-BE-DAG: lui [[R2:\$[0-9]+]], 1
     66   ; MIPS32-LE-DAG: lui [[R2:\$[0-9]+]], 2
     67   ; MIPS32-BE-DAG: ori [[R2]], [[R2]], 2
     68   ; MIPS32-LE-DAG: ori [[R2]], [[R2]], 1
     69   ; MIPS32-AE-DAG: fill.w [[R1:\$w[0-9]+]], [[R2]]
     70 
     71   store volatile <8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 1, i16 2, i16 3, i16 4>, <8 x i16>*@v8i16
     72   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
     73   ; MIPS32-AE: ld.h  [[R1:\$w[0-9]+]], 0([[G_PTR]])
     74 
     75   ret void
     76   ; MIPS32-AE: .size const_v8i16
     77 }
     78 
     79 define void @const_v4i32() nounwind {
     80   ; MIPS32-AE-LABEL: const_v4i32:
     81 
     82   store volatile <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32>*@v4i32
     83   ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0
     84 
     85   store volatile <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32>*@v4i32
     86   ; MIPS32-AE: ldi.w [[R1:\$w[0-9]+]], 1
     87 
     88   store volatile <4 x i32> <i32 1, i32 1, i32 1, i32 31>, <4 x i32>*@v4i32
     89   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
     90   ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
     91 
     92   store volatile <4 x i32> <i32 16843009, i32 16843009, i32 16843009, i32 16843009>, <4 x i32>*@v4i32
     93   ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1
     94 
     95   store volatile <4 x i32> <i32 65537, i32 65537, i32 65537, i32 65537>, <4 x i32>*@v4i32
     96   ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1
     97 
     98   store volatile <4 x i32> <i32 1, i32 2, i32 1, i32 2>, <4 x i32>*@v4i32
     99   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
    100   ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
    101 
    102   store volatile <4 x i32> <i32 3, i32 4, i32 5, i32 6>, <4 x i32>*@v4i32
    103   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
    104   ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
    105 
    106   ret void
    107   ; MIPS32-AE: .size const_v4i32
    108 }
    109 
    110 define void @const_v2i64() nounwind {
    111   ; MIPS32-AE-LABEL: const_v2i64:
    112 
    113   store volatile <2 x i64> <i64 0, i64 0>, <2 x i64>*@v2i64
    114   ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0
    115 
    116   store volatile <2 x i64> <i64 72340172838076673, i64 72340172838076673>, <2 x i64>*@v2i64
    117   ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1
    118 
    119   store volatile <2 x i64> <i64 281479271743489, i64 281479271743489>, <2 x i64>*@v2i64
    120   ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1
    121 
    122   store volatile <2 x i64> <i64 4294967297, i64 4294967297>, <2 x i64>*@v2i64
    123   ; MIPS32-AE: ldi.w [[R1:\$w[0-9]+]], 1
    124 
    125   store volatile <2 x i64> <i64 1, i64 1>, <2 x i64>*@v2i64
    126   ; MIPS32-AE: ldi.d [[R1:\$w[0-9]+]], 1
    127 
    128   store volatile <2 x i64> <i64 1, i64 31>, <2 x i64>*@v2i64
    129   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
    130   ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
    131 
    132   store volatile <2 x i64> <i64 3, i64 4>, <2 x i64>*@v2i64
    133   ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
    134   ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
    135 
    136   ret void
    137   ; MIPS32-AE: .size const_v2i64
    138 }
    139 
    140 define void @nonconst_v16i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f, i8 %g, i8 %h) nounwind {
    141   ; MIPS32-AE-LABEL: nonconst_v16i8:
    142 
    143   %1 = insertelement <16 x i8> undef, i8 %a, i32 0
    144   %2 = insertelement <16 x i8> %1, i8 %b, i32 1
    145   %3 = insertelement <16 x i8> %2, i8 %c, i32 2
    146   %4 = insertelement <16 x i8> %3, i8 %d, i32 3
    147   %5 = insertelement <16 x i8> %4, i8 %e, i32 4
    148   %6 = insertelement <16 x i8> %5, i8 %f, i32 5
    149   %7 = insertelement <16 x i8> %6, i8 %g, i32 6
    150   %8 = insertelement <16 x i8> %7, i8 %h, i32 7
    151   %9 = insertelement <16 x i8> %8, i8 %h, i32 8
    152   %10 = insertelement <16 x i8> %9, i8 %h, i32 9
    153   %11 = insertelement <16 x i8> %10, i8 %h, i32 10
    154   %12 = insertelement <16 x i8> %11, i8 %h, i32 11
    155   %13 = insertelement <16 x i8> %12, i8 %h, i32 12
    156   %14 = insertelement <16 x i8> %13, i8 %h, i32 13
    157   %15 = insertelement <16 x i8> %14, i8 %h, i32 14
    158   %16 = insertelement <16 x i8> %15, i8 %h, i32 15
    159   ; MIPS32-AE-DAG: insert.b [[R1:\$w[0-9]+]][0], $4
    160   ; MIPS32-AE-DAG: insert.b [[R1]][1], $5
    161   ; MIPS32-AE-DAG: insert.b [[R1]][2], $6
    162   ; MIPS32-AE-DAG: insert.b [[R1]][3], $7
    163   ; MIPS32-BE-DAG: lbu [[R2:\$[0-9]+]], 19($sp)
    164   ; MIPS32-LE-DAG: lbu [[R2:\$[0-9]+]], 16($sp)
    165   ; MIPS32-AE-DAG: insert.b [[R1]][4], [[R2]]
    166   ; MIPS32-BE-DAG: lbu [[R3:\$[0-9]+]], 23($sp)
    167   ; MIPS32-LE-DAG: lbu [[R3:\$[0-9]+]], 20($sp)
    168   ; MIPS32-AE-DAG: insert.b [[R1]][5], [[R3]]
    169   ; MIPS32-BE-DAG: lbu [[R4:\$[0-9]+]], 27($sp)
    170   ; MIPS32-LE-DAG: lbu [[R4:\$[0-9]+]], 24($sp)
    171   ; MIPS32-AE-DAG: insert.b [[R1]][6], [[R4]]
    172   ; MIPS32-BE-DAG: lbu [[R5:\$[0-9]+]], 31($sp)
    173   ; MIPS32-LE-DAG: lbu [[R5:\$[0-9]+]], 28($sp)
    174   ; MIPS32-AE-DAG: insert.b [[R1]][7], [[R5]]
    175   ; MIPS32-AE-DAG: insert.b [[R1]][8], [[R5]]
    176   ; MIPS32-AE-DAG: insert.b [[R1]][9], [[R5]]
    177   ; MIPS32-AE-DAG: insert.b [[R1]][10], [[R5]]
    178   ; MIPS32-AE-DAG: insert.b [[R1]][11], [[R5]]
    179   ; MIPS32-AE-DAG: insert.b [[R1]][12], [[R5]]
    180   ; MIPS32-AE-DAG: insert.b [[R1]][13], [[R5]]
    181   ; MIPS32-AE-DAG: insert.b [[R1]][14], [[R5]]
    182   ; MIPS32-AE-DAG: insert.b [[R1]][15], [[R5]]
    183 
    184   store volatile <16 x i8> %16, <16 x i8>*@v16i8
    185 
    186   ret void
    187   ; MIPS32-AE: .size nonconst_v16i8
    188 }
    189 
    190 define void @nonconst_v8i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g, i16 %h) nounwind {
    191   ; MIPS32-AE-LABEL: nonconst_v8i16:
    192 
    193   %1 = insertelement <8 x i16> undef, i16 %a, i32 0
    194   %2 = insertelement <8 x i16> %1, i16 %b, i32 1
    195   %3 = insertelement <8 x i16> %2, i16 %c, i32 2
    196   %4 = insertelement <8 x i16> %3, i16 %d, i32 3
    197   %5 = insertelement <8 x i16> %4, i16 %e, i32 4
    198   %6 = insertelement <8 x i16> %5, i16 %f, i32 5
    199   %7 = insertelement <8 x i16> %6, i16 %g, i32 6
    200   %8 = insertelement <8 x i16> %7, i16 %h, i32 7
    201   ; MIPS32-AE-DAG: insert.h [[R1:\$w[0-9]+]][0], $4
    202   ; MIPS32-AE-DAG: insert.h [[R1]][1], $5
    203   ; MIPS32-AE-DAG: insert.h [[R1]][2], $6
    204   ; MIPS32-AE-DAG: insert.h [[R1]][3], $7
    205   ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 18($sp)
    206   ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 16($sp)
    207   ; MIPS32-AE-DAG: insert.h [[R1]][4], [[R2]]
    208   ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 22($sp)
    209   ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 20($sp)
    210   ; MIPS32-AE-DAG: insert.h [[R1]][5], [[R2]]
    211   ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 26($sp)
    212   ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 24($sp)
    213   ; MIPS32-AE-DAG: insert.h [[R1]][6], [[R2]]
    214   ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 30($sp)
    215   ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 28($sp)
    216   ; MIPS32-AE-DAG: insert.h [[R1]][7], [[R2]]
    217 
    218   store volatile <8 x i16> %8, <8 x i16>*@v8i16
    219 
    220   ret void
    221   ; MIPS32-AE: .size nonconst_v8i16
    222 }
    223 
    224 define void @nonconst_v4i32(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
    225   ; MIPS32-AE-LABEL: nonconst_v4i32:
    226 
    227   %1 = insertelement <4 x i32> undef, i32 %a, i32 0
    228   %2 = insertelement <4 x i32> %1, i32 %b, i32 1
    229   %3 = insertelement <4 x i32> %2, i32 %c, i32 2
    230   %4 = insertelement <4 x i32> %3, i32 %d, i32 3
    231   ; MIPS32-AE: insert.w [[R1:\$w[0-9]+]][0], $4
    232   ; MIPS32-AE: insert.w [[R1]][1], $5
    233   ; MIPS32-AE: insert.w [[R1]][2], $6
    234   ; MIPS32-AE: insert.w [[R1]][3], $7
    235 
    236   store volatile <4 x i32> %4, <4 x i32>*@v4i32
    237 
    238   ret void
    239   ; MIPS32-AE: .size nonconst_v4i32
    240 }
    241 
    242 define void @nonconst_v2i64(i64 %a, i64 %b) nounwind {
    243   ; MIPS32-AE-LABEL: nonconst_v2i64:
    244 
    245   %1 = insertelement <2 x i64> undef, i64 %a, i32 0
    246   %2 = insertelement <2 x i64> %1, i64 %b, i32 1
    247   ; MIPS32-AE: insert.w [[R1:\$w[0-9]+]][0], $4
    248   ; MIPS32-AE: insert.w [[R1]][1], $5
    249   ; MIPS32-AE: insert.w [[R1]][2], $6
    250   ; MIPS32-AE: insert.w [[R1]][3], $7
    251 
    252   store volatile <2 x i64> %2, <2 x i64>*@v2i64
    253 
    254   ret void
    255   ; MIPS32-AE: .size nonconst_v2i64
    256 }
    257 
    258 define i32 @extract_sext_v16i8() nounwind {
    259   ; MIPS32-AE-LABEL: extract_sext_v16i8:
    260 
    261   %1 = load <16 x i8>* @v16i8
    262   ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]],
    263 
    264   %2 = add <16 x i8> %1, %1
    265   ; MIPS32-AE-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    266 
    267   %3 = extractelement <16 x i8> %2, i32 1
    268   %4 = sext i8 %3 to i32
    269   ; MIPS32-AE-DAG: copy_s.b [[R3:\$[0-9]+]], [[R1]][1]
    270   ; MIPS32-AE-NOT: sll
    271   ; MIPS32-AE-NOT: sra
    272 
    273   ret i32 %4
    274   ; MIPS32-AE: .size extract_sext_v16i8
    275 }
    276 
    277 define i32 @extract_sext_v8i16() nounwind {
    278   ; MIPS32-AE-LABEL: extract_sext_v8i16:
    279 
    280   %1 = load <8 x i16>* @v8i16
    281   ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]],
    282 
    283   %2 = add <8 x i16> %1, %1
    284   ; MIPS32-AE-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    285 
    286   %3 = extractelement <8 x i16> %2, i32 1
    287   %4 = sext i16 %3 to i32
    288   ; MIPS32-AE-DAG: copy_s.h [[R3:\$[0-9]+]], [[R1]][1]
    289   ; MIPS32-AE-NOT: sll
    290   ; MIPS32-AE-NOT: sra
    291 
    292   ret i32 %4
    293   ; MIPS32-AE: .size extract_sext_v8i16
    294 }
    295 
    296 define i32 @extract_sext_v4i32() nounwind {
    297   ; MIPS32-AE-LABEL: extract_sext_v4i32:
    298 
    299   %1 = load <4 x i32>* @v4i32
    300   ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
    301 
    302   %2 = add <4 x i32> %1, %1
    303   ; MIPS32-AE-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    304 
    305   %3 = extractelement <4 x i32> %2, i32 1
    306   ; MIPS32-AE-DAG: copy_s.w [[R3:\$[0-9]+]], [[R1]][1]
    307 
    308   ret i32 %3
    309   ; MIPS32-AE: .size extract_sext_v4i32
    310 }
    311 
    312 define i64 @extract_sext_v2i64() nounwind {
    313   ; MIPS32-AE-LABEL: extract_sext_v2i64:
    314 
    315   %1 = load <2 x i64>* @v2i64
    316   ; MIPS32-AE-DAG: ld.d [[R1:\$w[0-9]+]],
    317 
    318   %2 = add <2 x i64> %1, %1
    319   ; MIPS32-AE-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    320 
    321   %3 = extractelement <2 x i64> %2, i32 1
    322   ; MIPS32-AE-DAG: copy_s.w [[R3:\$[0-9]+]], [[R1]][2]
    323   ; MIPS32-AE-DAG: copy_s.w [[R4:\$[0-9]+]], [[R1]][3]
    324   ; MIPS32-AE-NOT: sll
    325   ; MIPS32-AE-NOT: sra
    326 
    327   ret i64 %3
    328   ; MIPS32-AE: .size extract_sext_v2i64
    329 }
    330 
    331 define i32 @extract_zext_v16i8() nounwind {
    332   ; MIPS32-AE-LABEL: extract_zext_v16i8:
    333 
    334   %1 = load <16 x i8>* @v16i8
    335   ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]],
    336 
    337   %2 = add <16 x i8> %1, %1
    338   ; MIPS32-AE-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    339 
    340   %3 = extractelement <16 x i8> %2, i32 1
    341   %4 = zext i8 %3 to i32
    342   ; MIPS32-AE-DAG: copy_u.b [[R3:\$[0-9]+]], [[R1]][1]
    343   ; MIPS32-AE-NOT: andi
    344 
    345   ret i32 %4
    346   ; MIPS32-AE: .size extract_zext_v16i8
    347 }
    348 
    349 define i32 @extract_zext_v8i16() nounwind {
    350   ; MIPS32-AE-LABEL: extract_zext_v8i16:
    351 
    352   %1 = load <8 x i16>* @v8i16
    353   ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]],
    354 
    355   %2 = add <8 x i16> %1, %1
    356   ; MIPS32-AE-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    357 
    358   %3 = extractelement <8 x i16> %2, i32 1
    359   %4 = zext i16 %3 to i32
    360   ; MIPS32-AE-DAG: copy_u.h [[R3:\$[0-9]+]], [[R1]][1]
    361   ; MIPS32-AE-NOT: andi
    362 
    363   ret i32 %4
    364   ; MIPS32-AE: .size extract_zext_v8i16
    365 }
    366 
    367 define i32 @extract_zext_v4i32() nounwind {
    368   ; MIPS32-AE-LABEL: extract_zext_v4i32:
    369 
    370   %1 = load <4 x i32>* @v4i32
    371   ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
    372 
    373   %2 = add <4 x i32> %1, %1
    374   ; MIPS32-AE-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    375 
    376   %3 = extractelement <4 x i32> %2, i32 1
    377   ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R3:\$[0-9]+]], [[R1]][1]
    378 
    379   ret i32 %3
    380   ; MIPS32-AE: .size extract_zext_v4i32
    381 }
    382 
    383 define i64 @extract_zext_v2i64() nounwind {
    384   ; MIPS32-AE-LABEL: extract_zext_v2i64:
    385 
    386   %1 = load <2 x i64>* @v2i64
    387   ; MIPS32-AE-DAG: ld.d [[R1:\$w[0-9]+]],
    388 
    389   %2 = add <2 x i64> %1, %1
    390   ; MIPS32-AE-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    391 
    392   %3 = extractelement <2 x i64> %2, i32 1
    393   ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R3:\$[0-9]+]], [[R1]][2]
    394   ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R4:\$[0-9]+]], [[R1]][3]
    395   ; MIPS32-AE-NOT: andi
    396 
    397   ret i64 %3
    398   ; MIPS32-AE: .size extract_zext_v2i64
    399 }
    400 
    401 define i32 @extract_sext_v16i8_vidx() nounwind {
    402   ; MIPS32-AE-LABEL: extract_sext_v16i8_vidx:
    403 
    404   %1 = load <16 x i8>* @v16i8
    405   ; MIPS32-AE-DAG: lw [[PTR_V:\$[0-9]+]], %got(v16i8)(
    406   ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]], 0([[PTR_V]])
    407 
    408   %2 = add <16 x i8> %1, %1
    409   ; MIPS32-AE-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    410 
    411   %3 = load i32* @i32
    412   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    413   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    414 
    415   %4 = extractelement <16 x i8> %2, i32 %3
    416   %5 = sext i8 %4 to i32
    417   ; MIPS32-AE-DAG: splat.b $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    418   ; MIPS32-AE-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
    419   ; MIPS32-AE-DAG: sra [[R6:\$[0-9]+]], [[R5]], 24
    420 
    421   ret i32 %5
    422   ; MIPS32-AE: .size extract_sext_v16i8_vidx
    423 }
    424 
    425 define i32 @extract_sext_v8i16_vidx() nounwind {
    426   ; MIPS32-AE-LABEL: extract_sext_v8i16_vidx:
    427 
    428   %1 = load <8 x i16>* @v8i16
    429   ; MIPS32-AE-DAG: lw [[PTR_V:\$[0-9]+]], %got(v8i16)(
    430   ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]], 0([[PTR_V]])
    431 
    432   %2 = add <8 x i16> %1, %1
    433   ; MIPS32-AE-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    434 
    435   %3 = load i32* @i32
    436   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    437   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    438 
    439   %4 = extractelement <8 x i16> %2, i32 %3
    440   %5 = sext i16 %4 to i32
    441   ; MIPS32-AE-DAG: splat.h $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    442   ; MIPS32-AE-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
    443   ; MIPS32-AE-DAG: sra [[R6:\$[0-9]+]], [[R5]], 16
    444 
    445   ret i32 %5
    446   ; MIPS32-AE: .size extract_sext_v8i16_vidx
    447 }
    448 
    449 define i32 @extract_sext_v4i32_vidx() nounwind {
    450   ; MIPS32-AE-LABEL: extract_sext_v4i32_vidx:
    451 
    452   %1 = load <4 x i32>* @v4i32
    453   ; MIPS32-AE-DAG: lw [[PTR_V:\$[0-9]+]], %got(v4i32)(
    454   ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]], 0([[PTR_V]])
    455 
    456   %2 = add <4 x i32> %1, %1
    457   ; MIPS32-AE-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    458 
    459   %3 = load i32* @i32
    460   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    461   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    462 
    463   %4 = extractelement <4 x i32> %2, i32 %3
    464   ; MIPS32-AE-DAG: splat.w $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    465   ; MIPS32-AE-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
    466   ; MIPS32-AE-NOT: sra
    467 
    468   ret i32 %4
    469   ; MIPS32-AE: .size extract_sext_v4i32_vidx
    470 }
    471 
    472 define i64 @extract_sext_v2i64_vidx() nounwind {
    473   ; MIPS32-AE-LABEL: extract_sext_v2i64_vidx:
    474 
    475   %1 = load <2 x i64>* @v2i64
    476   ; MIPS32-AE-DAG: lw [[PTR_V:\$[0-9]+]], %got(v2i64)(
    477   ; MIPS32-AE-DAG: ld.d [[R1:\$w[0-9]+]], 0([[PTR_V]])
    478 
    479   %2 = add <2 x i64> %1, %1
    480   ; MIPS32-AE-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    481 
    482   %3 = load i32* @i32
    483   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    484   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    485 
    486   %4 = extractelement <2 x i64> %2, i32 %3
    487   ; MIPS32-AE-DAG: splat.w $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    488   ; MIPS32-AE-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
    489   ; MIPS32-AE-DAG: splat.w $w[[R4:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    490   ; MIPS32-AE-DAG: mfc1 [[R6:\$[0-9]+]], $f[[R4]]
    491   ; MIPS32-AE-NOT: sra
    492 
    493   ret i64 %4
    494   ; MIPS32-AE: .size extract_sext_v2i64_vidx
    495 }
    496 
    497 define i32 @extract_zext_v16i8_vidx() nounwind {
    498   ; MIPS32-AE-LABEL: extract_zext_v16i8_vidx:
    499 
    500   %1 = load <16 x i8>* @v16i8
    501   ; MIPS32-AE-DAG: lw [[PTR_V:\$[0-9]+]], %got(v16i8)(
    502   ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]], 0([[PTR_V]])
    503 
    504   %2 = add <16 x i8> %1, %1
    505   ; MIPS32-AE-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    506 
    507   %3 = load i32* @i32
    508   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    509   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    510 
    511   %4 = extractelement <16 x i8> %2, i32 %3
    512   %5 = zext i8 %4 to i32
    513   ; MIPS32-AE-DAG: splat.b $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    514   ; MIPS32-AE-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
    515   ; MIPS32-AE-DAG: srl [[R6:\$[0-9]+]], [[R5]], 24
    516 
    517   ret i32 %5
    518   ; MIPS32-AE: .size extract_zext_v16i8_vidx
    519 }
    520 
    521 define i32 @extract_zext_v8i16_vidx() nounwind {
    522   ; MIPS32-AE-LABEL: extract_zext_v8i16_vidx:
    523 
    524   %1 = load <8 x i16>* @v8i16
    525   ; MIPS32-AE-DAG: lw [[PTR_V:\$[0-9]+]], %got(v8i16)(
    526   ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]], 0([[PTR_V]])
    527 
    528   %2 = add <8 x i16> %1, %1
    529   ; MIPS32-AE-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    530 
    531   %3 = load i32* @i32
    532   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    533   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    534 
    535   %4 = extractelement <8 x i16> %2, i32 %3
    536   %5 = zext i16 %4 to i32
    537   ; MIPS32-AE-DAG: splat.h $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    538   ; MIPS32-AE-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
    539   ; MIPS32-AE-DAG: srl [[R6:\$[0-9]+]], [[R5]], 16
    540 
    541   ret i32 %5
    542   ; MIPS32-AE: .size extract_zext_v8i16_vidx
    543 }
    544 
    545 define i32 @extract_zext_v4i32_vidx() nounwind {
    546   ; MIPS32-AE-LABEL: extract_zext_v4i32_vidx:
    547 
    548   %1 = load <4 x i32>* @v4i32
    549   ; MIPS32-AE-DAG: lw [[PTR_V:\$[0-9]+]], %got(v4i32)(
    550   ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]], 0([[PTR_V]])
    551 
    552   %2 = add <4 x i32> %1, %1
    553   ; MIPS32-AE-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    554 
    555   %3 = load i32* @i32
    556   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    557   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    558 
    559   %4 = extractelement <4 x i32> %2, i32 %3
    560   ; MIPS32-AE-DAG: splat.w $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    561   ; MIPS32-AE-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
    562   ; MIPS32-AE-NOT: srl
    563 
    564   ret i32 %4
    565   ; MIPS32-AE: .size extract_zext_v4i32_vidx
    566 }
    567 
    568 define i64 @extract_zext_v2i64_vidx() nounwind {
    569   ; MIPS32-AE-LABEL: extract_zext_v2i64_vidx:
    570 
    571   %1 = load <2 x i64>* @v2i64
    572   ; MIPS32-AE-DAG: lw [[PTR_V:\$[0-9]+]], %got(v2i64)(
    573   ; MIPS32-AE-DAG: ld.d [[R1:\$w[0-9]+]], 0([[PTR_V]])
    574 
    575   %2 = add <2 x i64> %1, %1
    576   ; MIPS32-AE-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
    577 
    578   %3 = load i32* @i32
    579   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    580   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    581 
    582   %4 = extractelement <2 x i64> %2, i32 %3
    583   ; MIPS32-AE-DAG: splat.w $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    584   ; MIPS32-AE-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
    585   ; MIPS32-AE-DAG: splat.w $w[[R4:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
    586   ; MIPS32-AE-DAG: mfc1 [[R6:\$[0-9]+]], $f[[R4]]
    587   ; MIPS32-AE-NOT: srl
    588 
    589   ret i64 %4
    590   ; MIPS32-AE: .size extract_zext_v2i64_vidx
    591 }
    592 
    593 define void @insert_v16i8(i32 %a) nounwind {
    594   ; MIPS32-AE-LABEL: insert_v16i8:
    595 
    596   %1 = load <16 x i8>* @v16i8
    597   ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]],
    598 
    599   %a2 = trunc i32 %a to i8
    600   %a3 = sext i8 %a2 to i32
    601   %a4 = trunc i32 %a3 to i8
    602   ; MIPS32-AE-NOT: andi
    603   ; MIPS32-AE-NOT: sra
    604 
    605   %2 = insertelement <16 x i8> %1, i8 %a4, i32 1
    606   ; MIPS32-AE-DAG: insert.b [[R1]][1], $4
    607 
    608   store <16 x i8> %2, <16 x i8>* @v16i8
    609   ; MIPS32-AE-DAG: st.b [[R1]]
    610 
    611   ret void
    612   ; MIPS32-AE: .size insert_v16i8
    613 }
    614 
    615 define void @insert_v8i16(i32 %a) nounwind {
    616   ; MIPS32-AE-LABEL: insert_v8i16:
    617 
    618   %1 = load <8 x i16>* @v8i16
    619   ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]],
    620 
    621   %a2 = trunc i32 %a to i16
    622   %a3 = sext i16 %a2 to i32
    623   %a4 = trunc i32 %a3 to i16
    624   ; MIPS32-AE-NOT: andi
    625   ; MIPS32-AE-NOT: sra
    626 
    627   %2 = insertelement <8 x i16> %1, i16 %a4, i32 1
    628   ; MIPS32-AE-DAG: insert.h [[R1]][1], $4
    629 
    630   store <8 x i16> %2, <8 x i16>* @v8i16
    631   ; MIPS32-AE-DAG: st.h [[R1]]
    632 
    633   ret void
    634   ; MIPS32-AE: .size insert_v8i16
    635 }
    636 
    637 define void @insert_v4i32(i32 %a) nounwind {
    638   ; MIPS32-AE-LABEL: insert_v4i32:
    639 
    640   %1 = load <4 x i32>* @v4i32
    641   ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
    642 
    643   ; MIPS32-AE-NOT: andi
    644   ; MIPS32-AE-NOT: sra
    645 
    646   %2 = insertelement <4 x i32> %1, i32 %a, i32 1
    647   ; MIPS32-AE-DAG: insert.w [[R1]][1], $4
    648 
    649   store <4 x i32> %2, <4 x i32>* @v4i32
    650   ; MIPS32-AE-DAG: st.w [[R1]]
    651 
    652   ret void
    653   ; MIPS32-AE: .size insert_v4i32
    654 }
    655 
    656 define void @insert_v2i64(i64 %a) nounwind {
    657   ; MIPS32-AE-LABEL: insert_v2i64:
    658 
    659   %1 = load <2 x i64>* @v2i64
    660   ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
    661 
    662   ; MIPS32-AE-NOT: andi
    663   ; MIPS32-AE-NOT: sra
    664 
    665   %2 = insertelement <2 x i64> %1, i64 %a, i32 1
    666   ; MIPS32-AE-DAG: insert.w [[R1]][2], $4
    667   ; MIPS32-AE-DAG: insert.w [[R1]][3], $5
    668 
    669   store <2 x i64> %2, <2 x i64>* @v2i64
    670   ; MIPS32-AE-DAG: st.w [[R1]]
    671 
    672   ret void
    673   ; MIPS32-AE: .size insert_v2i64
    674 }
    675 
    676 define void @insert_v16i8_vidx(i32 %a) nounwind {
    677   ; MIPS32-AE: insert_v16i8_vidx:
    678 
    679   %1 = load <16 x i8>* @v16i8
    680   ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]],
    681 
    682   %2 = load i32* @i32
    683   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    684   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    685 
    686   %a2 = trunc i32 %a to i8
    687   %a3 = sext i8 %a2 to i32
    688   %a4 = trunc i32 %a3 to i8
    689   ; MIPS32-AE-NOT: andi
    690   ; MIPS32-AE-NOT: sra
    691 
    692   %3 = insertelement <16 x i8> %1, i8 %a4, i32 %2
    693   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[IDX]]]
    694   ; MIPS32-AE-DAG: insert.b [[R1]][0], $4
    695   ; MIPS32-AE-DAG: neg [[NIDX:\$[0-9]+]], [[IDX]]
    696   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
    697 
    698   store <16 x i8> %3, <16 x i8>* @v16i8
    699   ; MIPS32-AE-DAG: st.b [[R1]]
    700 
    701   ret void
    702   ; MIPS32-AE: .size insert_v16i8_vidx
    703 }
    704 
    705 define void @insert_v8i16_vidx(i32 %a) nounwind {
    706   ; MIPS32-AE: insert_v8i16_vidx:
    707 
    708   %1 = load <8 x i16>* @v8i16
    709   ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]],
    710 
    711   %2 = load i32* @i32
    712   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    713   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    714 
    715   %a2 = trunc i32 %a to i16
    716   %a3 = sext i16 %a2 to i32
    717   %a4 = trunc i32 %a3 to i16
    718   ; MIPS32-AE-NOT: andi
    719   ; MIPS32-AE-NOT: sra
    720 
    721   %3 = insertelement <8 x i16> %1, i16 %a4, i32 %2
    722   ; MIPS32-AE-DAG: sll [[BIDX:\$[0-9]+]], [[IDX]], 1
    723   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
    724   ; MIPS32-AE-DAG: insert.h [[R1]][0], $4
    725   ; MIPS32-AE-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
    726   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
    727 
    728   store <8 x i16> %3, <8 x i16>* @v8i16
    729   ; MIPS32-AE-DAG: st.h [[R1]]
    730 
    731   ret void
    732   ; MIPS32-AE: .size insert_v8i16_vidx
    733 }
    734 
    735 define void @insert_v4i32_vidx(i32 %a) nounwind {
    736   ; MIPS32-AE: insert_v4i32_vidx:
    737 
    738   %1 = load <4 x i32>* @v4i32
    739   ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
    740 
    741   %2 = load i32* @i32
    742   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    743   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    744 
    745   ; MIPS32-AE-NOT: andi
    746   ; MIPS32-AE-NOT: sra
    747 
    748   %3 = insertelement <4 x i32> %1, i32 %a, i32 %2
    749   ; MIPS32-AE-DAG: sll [[BIDX:\$[0-9]+]], [[IDX]], 2
    750   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
    751   ; MIPS32-AE-DAG: insert.w [[R1]][0], $4
    752   ; MIPS32-AE-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
    753   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
    754 
    755   store <4 x i32> %3, <4 x i32>* @v4i32
    756   ; MIPS32-AE-DAG: st.w [[R1]]
    757 
    758   ret void
    759   ; MIPS32-AE: .size insert_v4i32_vidx
    760 }
    761 
    762 define void @insert_v2i64_vidx(i64 %a) nounwind {
    763   ; MIPS32-AE: insert_v2i64_vidx:
    764 
    765   %1 = load <2 x i64>* @v2i64
    766   ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
    767 
    768   %2 = load i32* @i32
    769   ; MIPS32-AE-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
    770   ; MIPS32-AE-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
    771 
    772   ; MIPS32-AE-NOT: andi
    773   ; MIPS32-AE-NOT: sra
    774 
    775   %3 = insertelement <2 x i64> %1, i64 %a, i32 %2
    776   ; TODO: This code could be a lot better but it works. The legalizer splits
    777   ; 64-bit inserts into two 32-bit inserts because there is no i64 type on
    778   ; MIPS32. The obvious optimisation is to perform both insert.w's at once while
    779   ; the vector is rotated.
    780   ; MIPS32-AE-DAG: sll [[BIDX:\$[0-9]+]], [[IDX]], 2
    781   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
    782   ; MIPS32-AE-DAG: insert.w [[R1]][0], $4
    783   ; MIPS32-AE-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
    784   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
    785   ; MIPS32-AE-DAG: addiu [[IDX2:\$[0-9]+]], [[IDX]], 1
    786   ; MIPS32-AE-DAG: sll [[BIDX:\$[0-9]+]], [[IDX2]], 2
    787   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
    788   ; MIPS32-AE-DAG: insert.w [[R1]][0], $5
    789   ; MIPS32-AE-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
    790   ; MIPS32-AE-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
    791 
    792   store <2 x i64> %3, <2 x i64>* @v2i64
    793   ; MIPS32-AE-DAG: st.w [[R1]]
    794 
    795   ret void
    796   ; MIPS32-AE: .size insert_v2i64_vidx
    797 }
    798 
    799 define void @truncstore() nounwind {
    800   ; MIPS32-AE-LABEL: truncstore:
    801 
    802   store volatile <4 x i8> <i8 -1, i8 -1, i8 -1, i8 -1>, <4 x i8>*@v4i8
    803   ; TODO: What code should be emitted?
    804 
    805   ret void
    806   ; MIPS32-AE: .size truncstore
    807 }
    808