Home | History | Annotate | Download | only in msa
      1 ; Test the MSA intrinsics that are encoded with the 3R instruction format.
      2 ; There are lots of these so this covers those beginning with 's'
      3 
      4 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck %s
      5 ; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck %s
      6 
      7 @llvm_mips_sld_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
      8 @llvm_mips_sld_b_ARG2 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
      9 @llvm_mips_sld_b_ARG3 = global i32 10, align 16
     10 @llvm_mips_sld_b_RES  = 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>, align 16
     11 
     12 define void @llvm_mips_sld_b_test() nounwind {
     13 entry:
     14   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_sld_b_ARG1
     15   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_sld_b_ARG2
     16   %2 = load i32, i32* @llvm_mips_sld_b_ARG3
     17   %3 = tail call <16 x i8> @llvm.mips.sld.b(<16 x i8> %0, <16 x i8> %1, i32 %2)
     18   store <16 x i8> %3, <16 x i8>* @llvm_mips_sld_b_RES
     19   ret void
     20 }
     21 
     22 declare <16 x i8> @llvm.mips.sld.b(<16 x i8>, <16 x i8>, i32) nounwind
     23 
     24 ; CHECK: llvm_mips_sld_b_test:
     25 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sld_b_ARG1)
     26 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sld_b_ARG2)
     27 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_sld_b_ARG3)
     28 ; CHECK-DAG: ld.b [[WD:\$w[0-9]+]], 0([[R1]])
     29 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R2]])
     30 ; CHECK-DAG: lw [[RT:\$[0-9]+]], 0([[R3]])
     31 ; CHECK-DAG: sld.b [[WD]], [[WS]]{{\[}}[[RT]]{{\]}}
     32 ; CHECK-DAG: st.b [[WD]]
     33 ; CHECK: .size llvm_mips_sld_b_test
     34 ;
     35 @llvm_mips_sld_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
     36 @llvm_mips_sld_h_ARG2 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
     37 @llvm_mips_sld_h_ARG3 = global i32 10, align 16
     38 @llvm_mips_sld_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
     39 
     40 define void @llvm_mips_sld_h_test() nounwind {
     41 entry:
     42   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_sld_h_ARG1
     43   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_sld_h_ARG2
     44   %2 = load i32, i32* @llvm_mips_sld_h_ARG3
     45   %3 = tail call <8 x i16> @llvm.mips.sld.h(<8 x i16> %0, <8 x i16> %1, i32 %2)
     46   store <8 x i16> %3, <8 x i16>* @llvm_mips_sld_h_RES
     47   ret void
     48 }
     49 
     50 declare <8 x i16> @llvm.mips.sld.h(<8 x i16>, <8 x i16>, i32) nounwind
     51 
     52 ; CHECK: llvm_mips_sld_h_test:
     53 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sld_h_ARG1)
     54 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sld_h_ARG2)
     55 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_sld_h_ARG3)
     56 ; CHECK-DAG: ld.h [[WD:\$w[0-9]+]], 0([[R1]])
     57 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R2]])
     58 ; CHECK-DAG: lw [[RT:\$[0-9]+]], 0([[R3]])
     59 ; CHECK-DAG: sld.h [[WD]], [[WS]]{{\[}}[[RT]]{{\]}}
     60 ; CHECK-DAG: st.h [[WD]]
     61 ; CHECK: .size llvm_mips_sld_h_test
     62 ;
     63 @llvm_mips_sld_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
     64 @llvm_mips_sld_w_ARG2 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
     65 @llvm_mips_sld_w_ARG3 = global i32 10, align 16
     66 @llvm_mips_sld_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
     67 
     68 define void @llvm_mips_sld_w_test() nounwind {
     69 entry:
     70   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_sld_w_ARG1
     71   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_sld_w_ARG2
     72   %2 = load i32, i32* @llvm_mips_sld_w_ARG3
     73   %3 = tail call <4 x i32> @llvm.mips.sld.w(<4 x i32> %0, <4 x i32> %1, i32 %2)
     74   store <4 x i32> %3, <4 x i32>* @llvm_mips_sld_w_RES
     75   ret void
     76 }
     77 
     78 declare <4 x i32> @llvm.mips.sld.w(<4 x i32>, <4 x i32>, i32) nounwind
     79 
     80 ; CHECK: llvm_mips_sld_w_test:
     81 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sld_w_ARG1)
     82 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sld_w_ARG2)
     83 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_sld_w_ARG3)
     84 ; CHECK-DAG: ld.w [[WD:\$w[0-9]+]], 0([[R1]])
     85 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R2]])
     86 ; CHECK-DAG: lw [[RT:\$[0-9]+]], 0([[R3]])
     87 ; CHECK-DAG: sld.w [[WD]], [[WS]]{{\[}}[[RT]]{{\]}}
     88 ; CHECK-DAG: st.w [[WD]]
     89 ; CHECK: .size llvm_mips_sld_w_test
     90 ;
     91 @llvm_mips_sld_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
     92 @llvm_mips_sld_d_ARG2 = global <2 x i64> <i64 0, i64 1>, align 16
     93 @llvm_mips_sld_d_ARG3 = global i32 10, align 16
     94 @llvm_mips_sld_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
     95 
     96 define void @llvm_mips_sld_d_test() nounwind {
     97 entry:
     98   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_sld_d_ARG1
     99   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_sld_d_ARG2
    100   %2 = load i32, i32* @llvm_mips_sld_d_ARG3
    101   %3 = tail call <2 x i64> @llvm.mips.sld.d(<2 x i64> %0, <2 x i64> %1, i32 %2)
    102   store <2 x i64> %3, <2 x i64>* @llvm_mips_sld_d_RES
    103   ret void
    104 }
    105 
    106 declare <2 x i64> @llvm.mips.sld.d(<2 x i64>, <2 x i64>, i32) nounwind
    107 
    108 ; CHECK: llvm_mips_sld_d_test:
    109 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sld_d_ARG1)
    110 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sld_d_ARG2)
    111 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_sld_d_ARG3)
    112 ; CHECK-DAG: ld.d [[WD:\$w[0-9]+]], 0([[R1]])
    113 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R2]])
    114 ; CHECK-DAG: lw [[RT:\$[0-9]+]], 0([[R3]])
    115 ; CHECK-DAG: sld.d [[WD]], [[WS]]{{\[}}[[RT]]{{\]}}
    116 ; CHECK-DAG: st.d [[WD]]
    117 ; CHECK: .size llvm_mips_sld_d_test
    118 ;
    119 @llvm_mips_sll_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
    120 @llvm_mips_sll_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
    121 @llvm_mips_sll_b_RES  = 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>, align 16
    122 
    123 define void @llvm_mips_sll_b_test() nounwind {
    124 entry:
    125   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_sll_b_ARG1
    126   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_sll_b_ARG2
    127   %2 = tail call <16 x i8> @llvm.mips.sll.b(<16 x i8> %0, <16 x i8> %1)
    128   store <16 x i8> %2, <16 x i8>* @llvm_mips_sll_b_RES
    129   ret void
    130 }
    131 
    132 declare <16 x i8> @llvm.mips.sll.b(<16 x i8>, <16 x i8>) nounwind
    133 
    134 ; CHECK: llvm_mips_sll_b_test:
    135 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sll_b_ARG1)
    136 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sll_b_ARG2)
    137 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    138 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    139 ; CHECK-DAG: sll.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    140 ; CHECK-DAG: st.b [[WD]]
    141 ; CHECK: .size llvm_mips_sll_b_test
    142 ;
    143 @llvm_mips_sll_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
    144 @llvm_mips_sll_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
    145 @llvm_mips_sll_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
    146 
    147 define void @llvm_mips_sll_h_test() nounwind {
    148 entry:
    149   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_sll_h_ARG1
    150   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_sll_h_ARG2
    151   %2 = tail call <8 x i16> @llvm.mips.sll.h(<8 x i16> %0, <8 x i16> %1)
    152   store <8 x i16> %2, <8 x i16>* @llvm_mips_sll_h_RES
    153   ret void
    154 }
    155 
    156 declare <8 x i16> @llvm.mips.sll.h(<8 x i16>, <8 x i16>) nounwind
    157 
    158 ; CHECK: llvm_mips_sll_h_test:
    159 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sll_h_ARG1)
    160 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sll_h_ARG2)
    161 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    162 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    163 ; CHECK-DAG: sll.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    164 ; CHECK-DAG: st.h [[WD]]
    165 ; CHECK: .size llvm_mips_sll_h_test
    166 ;
    167 @llvm_mips_sll_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
    168 @llvm_mips_sll_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
    169 @llvm_mips_sll_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
    170 
    171 define void @llvm_mips_sll_w_test() nounwind {
    172 entry:
    173   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_sll_w_ARG1
    174   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_sll_w_ARG2
    175   %2 = tail call <4 x i32> @llvm.mips.sll.w(<4 x i32> %0, <4 x i32> %1)
    176   store <4 x i32> %2, <4 x i32>* @llvm_mips_sll_w_RES
    177   ret void
    178 }
    179 
    180 declare <4 x i32> @llvm.mips.sll.w(<4 x i32>, <4 x i32>) nounwind
    181 
    182 ; CHECK: llvm_mips_sll_w_test:
    183 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sll_w_ARG1)
    184 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sll_w_ARG2)
    185 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    186 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    187 ; CHECK-DAG: sll.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    188 ; CHECK-DAG: st.w [[WD]]
    189 ; CHECK: .size llvm_mips_sll_w_test
    190 ;
    191 @llvm_mips_sll_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
    192 @llvm_mips_sll_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
    193 @llvm_mips_sll_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
    194 
    195 define void @llvm_mips_sll_d_test() nounwind {
    196 entry:
    197   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_sll_d_ARG1
    198   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_sll_d_ARG2
    199   %2 = tail call <2 x i64> @llvm.mips.sll.d(<2 x i64> %0, <2 x i64> %1)
    200   store <2 x i64> %2, <2 x i64>* @llvm_mips_sll_d_RES
    201   ret void
    202 }
    203 
    204 declare <2 x i64> @llvm.mips.sll.d(<2 x i64>, <2 x i64>) nounwind
    205 
    206 ; CHECK: llvm_mips_sll_d_test:
    207 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sll_d_ARG1)
    208 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sll_d_ARG2)
    209 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    210 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    211 ; CHECK-DAG: sll.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    212 ; CHECK-DAG: st.d [[WD]]
    213 ; CHECK: .size llvm_mips_sll_d_test
    214 
    215 define void @sll_b_test() nounwind {
    216 entry:
    217   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_sll_b_ARG1
    218   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_sll_b_ARG2
    219   %2 = shl <16 x i8> %0, %1
    220   store <16 x i8> %2, <16 x i8>* @llvm_mips_sll_b_RES
    221   ret void
    222 }
    223 
    224 ; CHECK: sll_b_test:
    225 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sll_b_ARG1)
    226 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sll_b_ARG2)
    227 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    228 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    229 ; CHECK-DAG: sll.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    230 ; CHECK-DAG: st.b [[WD]]
    231 ; CHECK: .size sll_b_test
    232 
    233 define void @sll_h_test() nounwind {
    234 entry:
    235   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_sll_h_ARG1
    236   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_sll_h_ARG2
    237   %2 = shl <8 x i16> %0, %1
    238   store <8 x i16> %2, <8 x i16>* @llvm_mips_sll_h_RES
    239   ret void
    240 }
    241 
    242 ; CHECK: sll_h_test:
    243 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sll_h_ARG1)
    244 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sll_h_ARG2)
    245 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    246 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    247 ; CHECK-DAG: sll.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    248 ; CHECK-DAG: st.h [[WD]]
    249 ; CHECK: .size sll_h_test
    250 
    251 define void @sll_w_test() nounwind {
    252 entry:
    253   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_sll_w_ARG1
    254   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_sll_w_ARG2
    255   %2 = shl <4 x i32> %0, %1
    256   store <4 x i32> %2, <4 x i32>* @llvm_mips_sll_w_RES
    257   ret void
    258 }
    259 
    260 ; CHECK: sll_w_test:
    261 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sll_w_ARG1)
    262 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sll_w_ARG2)
    263 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    264 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    265 ; CHECK-DAG: sll.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    266 ; CHECK-DAG: st.w [[WD]]
    267 ; CHECK: .size sll_w_test
    268 
    269 define void @sll_d_test() nounwind {
    270 entry:
    271   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_sll_d_ARG1
    272   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_sll_d_ARG2
    273   %2 = shl <2 x i64> %0, %1
    274   store <2 x i64> %2, <2 x i64>* @llvm_mips_sll_d_RES
    275   ret void
    276 }
    277 
    278 ; CHECK: sll_d_test:
    279 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sll_d_ARG1)
    280 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sll_d_ARG2)
    281 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    282 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    283 ; CHECK-DAG: sll.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    284 ; CHECK-DAG: st.d [[WD]]
    285 ; CHECK: .size sll_d_test
    286 ;
    287 @llvm_mips_sra_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
    288 @llvm_mips_sra_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
    289 @llvm_mips_sra_b_RES  = 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>, align 16
    290 
    291 define void @llvm_mips_sra_b_test() nounwind {
    292 entry:
    293   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_sra_b_ARG1
    294   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_sra_b_ARG2
    295   %2 = tail call <16 x i8> @llvm.mips.sra.b(<16 x i8> %0, <16 x i8> %1)
    296   store <16 x i8> %2, <16 x i8>* @llvm_mips_sra_b_RES
    297   ret void
    298 }
    299 
    300 declare <16 x i8> @llvm.mips.sra.b(<16 x i8>, <16 x i8>) nounwind
    301 
    302 ; CHECK: llvm_mips_sra_b_test:
    303 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sra_b_ARG1)
    304 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sra_b_ARG2)
    305 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    306 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    307 ; CHECK-DAG: sra.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    308 ; CHECK-DAG: st.b [[WD]]
    309 ; CHECK: .size llvm_mips_sra_b_test
    310 ;
    311 @llvm_mips_sra_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
    312 @llvm_mips_sra_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
    313 @llvm_mips_sra_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
    314 
    315 define void @llvm_mips_sra_h_test() nounwind {
    316 entry:
    317   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_sra_h_ARG1
    318   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_sra_h_ARG2
    319   %2 = tail call <8 x i16> @llvm.mips.sra.h(<8 x i16> %0, <8 x i16> %1)
    320   store <8 x i16> %2, <8 x i16>* @llvm_mips_sra_h_RES
    321   ret void
    322 }
    323 
    324 declare <8 x i16> @llvm.mips.sra.h(<8 x i16>, <8 x i16>) nounwind
    325 
    326 ; CHECK: llvm_mips_sra_h_test:
    327 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sra_h_ARG1)
    328 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sra_h_ARG2)
    329 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    330 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    331 ; CHECK-DAG: sra.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    332 ; CHECK-DAG: st.h [[WD]]
    333 ; CHECK: .size llvm_mips_sra_h_test
    334 ;
    335 @llvm_mips_sra_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
    336 @llvm_mips_sra_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
    337 @llvm_mips_sra_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
    338 
    339 define void @llvm_mips_sra_w_test() nounwind {
    340 entry:
    341   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_sra_w_ARG1
    342   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_sra_w_ARG2
    343   %2 = tail call <4 x i32> @llvm.mips.sra.w(<4 x i32> %0, <4 x i32> %1)
    344   store <4 x i32> %2, <4 x i32>* @llvm_mips_sra_w_RES
    345   ret void
    346 }
    347 
    348 declare <4 x i32> @llvm.mips.sra.w(<4 x i32>, <4 x i32>) nounwind
    349 
    350 ; CHECK: llvm_mips_sra_w_test:
    351 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sra_w_ARG1)
    352 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sra_w_ARG2)
    353 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    354 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    355 ; CHECK-DAG: sra.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    356 ; CHECK-DAG: st.w [[WD]]
    357 ; CHECK: .size llvm_mips_sra_w_test
    358 ;
    359 @llvm_mips_sra_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
    360 @llvm_mips_sra_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
    361 @llvm_mips_sra_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
    362 
    363 define void @llvm_mips_sra_d_test() nounwind {
    364 entry:
    365   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_sra_d_ARG1
    366   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_sra_d_ARG2
    367   %2 = tail call <2 x i64> @llvm.mips.sra.d(<2 x i64> %0, <2 x i64> %1)
    368   store <2 x i64> %2, <2 x i64>* @llvm_mips_sra_d_RES
    369   ret void
    370 }
    371 
    372 declare <2 x i64> @llvm.mips.sra.d(<2 x i64>, <2 x i64>) nounwind
    373 
    374 ; CHECK: llvm_mips_sra_d_test:
    375 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sra_d_ARG1)
    376 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sra_d_ARG2)
    377 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    378 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    379 ; CHECK-DAG: sra.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    380 ; CHECK-DAG: st.d [[WD]]
    381 ; CHECK: .size llvm_mips_sra_d_test
    382 ;
    383 
    384 define void @sra_b_test() nounwind {
    385 entry:
    386   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_sra_b_ARG1
    387   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_sra_b_ARG2
    388   %2 = ashr <16 x i8> %0, %1
    389   store <16 x i8> %2, <16 x i8>* @llvm_mips_sra_b_RES
    390   ret void
    391 }
    392 
    393 ; CHECK: sra_b_test:
    394 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sra_b_ARG1)
    395 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sra_b_ARG2)
    396 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    397 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    398 ; CHECK-DAG: sra.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    399 ; CHECK-DAG: st.b [[WD]]
    400 ; CHECK: .size sra_b_test
    401 
    402 define void @sra_h_test() nounwind {
    403 entry:
    404   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_sra_h_ARG1
    405   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_sra_h_ARG2
    406   %2 = ashr <8 x i16> %0, %1
    407   store <8 x i16> %2, <8 x i16>* @llvm_mips_sra_h_RES
    408   ret void
    409 }
    410 
    411 ; CHECK: sra_h_test:
    412 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sra_h_ARG1)
    413 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sra_h_ARG2)
    414 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    415 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    416 ; CHECK-DAG: sra.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    417 ; CHECK-DAG: st.h [[WD]]
    418 ; CHECK: .size sra_h_test
    419 
    420 define void @sra_w_test() nounwind {
    421 entry:
    422   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_sra_w_ARG1
    423   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_sra_w_ARG2
    424   %2 = ashr <4 x i32> %0, %1
    425   store <4 x i32> %2, <4 x i32>* @llvm_mips_sra_w_RES
    426   ret void
    427 }
    428 
    429 ; CHECK: sra_w_test:
    430 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sra_w_ARG1)
    431 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sra_w_ARG2)
    432 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    433 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    434 ; CHECK-DAG: sra.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    435 ; CHECK-DAG: st.w [[WD]]
    436 ; CHECK: .size sra_w_test
    437 
    438 define void @sra_d_test() nounwind {
    439 entry:
    440   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_sra_d_ARG1
    441   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_sra_d_ARG2
    442   %2 = ashr <2 x i64> %0, %1
    443   store <2 x i64> %2, <2 x i64>* @llvm_mips_sra_d_RES
    444   ret void
    445 }
    446 
    447 ; CHECK: sra_d_test:
    448 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_sra_d_ARG1)
    449 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_sra_d_ARG2)
    450 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    451 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    452 ; CHECK-DAG: sra.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    453 ; CHECK-DAG: st.d [[WD]]
    454 ; CHECK: .size sra_d_test
    455 
    456 @llvm_mips_srar_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
    457 @llvm_mips_srar_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
    458 @llvm_mips_srar_b_RES  = 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>, align 16
    459 
    460 define void @llvm_mips_srar_b_test() nounwind {
    461 entry:
    462   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_srar_b_ARG1
    463   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_srar_b_ARG2
    464   %2 = tail call <16 x i8> @llvm.mips.srar.b(<16 x i8> %0, <16 x i8> %1)
    465   store <16 x i8> %2, <16 x i8>* @llvm_mips_srar_b_RES
    466   ret void
    467 }
    468 
    469 declare <16 x i8> @llvm.mips.srar.b(<16 x i8>, <16 x i8>) nounwind
    470 
    471 ; CHECK: llvm_mips_srar_b_test:
    472 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srar_b_ARG1)
    473 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srar_b_ARG2)
    474 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    475 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    476 ; CHECK-DAG: srar.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    477 ; CHECK-DAG: st.b [[WD]]
    478 ; CHECK: .size llvm_mips_srar_b_test
    479 ;
    480 @llvm_mips_srar_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
    481 @llvm_mips_srar_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
    482 @llvm_mips_srar_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
    483 
    484 define void @llvm_mips_srar_h_test() nounwind {
    485 entry:
    486   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_srar_h_ARG1
    487   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_srar_h_ARG2
    488   %2 = tail call <8 x i16> @llvm.mips.srar.h(<8 x i16> %0, <8 x i16> %1)
    489   store <8 x i16> %2, <8 x i16>* @llvm_mips_srar_h_RES
    490   ret void
    491 }
    492 
    493 declare <8 x i16> @llvm.mips.srar.h(<8 x i16>, <8 x i16>) nounwind
    494 
    495 ; CHECK: llvm_mips_srar_h_test:
    496 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srar_h_ARG1)
    497 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srar_h_ARG2)
    498 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    499 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    500 ; CHECK-DAG: srar.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    501 ; CHECK-DAG: st.h [[WD]]
    502 ; CHECK: .size llvm_mips_srar_h_test
    503 ;
    504 @llvm_mips_srar_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
    505 @llvm_mips_srar_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
    506 @llvm_mips_srar_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
    507 
    508 define void @llvm_mips_srar_w_test() nounwind {
    509 entry:
    510   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_srar_w_ARG1
    511   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_srar_w_ARG2
    512   %2 = tail call <4 x i32> @llvm.mips.srar.w(<4 x i32> %0, <4 x i32> %1)
    513   store <4 x i32> %2, <4 x i32>* @llvm_mips_srar_w_RES
    514   ret void
    515 }
    516 
    517 declare <4 x i32> @llvm.mips.srar.w(<4 x i32>, <4 x i32>) nounwind
    518 
    519 ; CHECK: llvm_mips_srar_w_test:
    520 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srar_w_ARG1)
    521 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srar_w_ARG2)
    522 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    523 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    524 ; CHECK-DAG: srar.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    525 ; CHECK-DAG: st.w [[WD]]
    526 ; CHECK: .size llvm_mips_srar_w_test
    527 ;
    528 @llvm_mips_srar_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
    529 @llvm_mips_srar_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
    530 @llvm_mips_srar_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
    531 
    532 define void @llvm_mips_srar_d_test() nounwind {
    533 entry:
    534   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_srar_d_ARG1
    535   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_srar_d_ARG2
    536   %2 = tail call <2 x i64> @llvm.mips.srar.d(<2 x i64> %0, <2 x i64> %1)
    537   store <2 x i64> %2, <2 x i64>* @llvm_mips_srar_d_RES
    538   ret void
    539 }
    540 
    541 declare <2 x i64> @llvm.mips.srar.d(<2 x i64>, <2 x i64>) nounwind
    542 
    543 ; CHECK: llvm_mips_srar_d_test:
    544 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srar_d_ARG1)
    545 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srar_d_ARG2)
    546 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    547 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    548 ; CHECK-DAG: srar.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    549 ; CHECK-DAG: st.d [[WD]]
    550 ; CHECK: .size llvm_mips_srar_d_test
    551 ;
    552 @llvm_mips_srl_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
    553 @llvm_mips_srl_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
    554 @llvm_mips_srl_b_RES  = 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>, align 16
    555 
    556 define void @llvm_mips_srl_b_test() nounwind {
    557 entry:
    558   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_srl_b_ARG1
    559   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_srl_b_ARG2
    560   %2 = tail call <16 x i8> @llvm.mips.srl.b(<16 x i8> %0, <16 x i8> %1)
    561   store <16 x i8> %2, <16 x i8>* @llvm_mips_srl_b_RES
    562   ret void
    563 }
    564 
    565 declare <16 x i8> @llvm.mips.srl.b(<16 x i8>, <16 x i8>) nounwind
    566 
    567 ; CHECK: llvm_mips_srl_b_test:
    568 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srl_b_ARG1)
    569 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srl_b_ARG2)
    570 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    571 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    572 ; CHECK-DAG: srl.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    573 ; CHECK-DAG: st.b [[WD]]
    574 ; CHECK: .size llvm_mips_srl_b_test
    575 ;
    576 @llvm_mips_srl_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
    577 @llvm_mips_srl_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
    578 @llvm_mips_srl_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
    579 
    580 define void @llvm_mips_srl_h_test() nounwind {
    581 entry:
    582   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_srl_h_ARG1
    583   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_srl_h_ARG2
    584   %2 = tail call <8 x i16> @llvm.mips.srl.h(<8 x i16> %0, <8 x i16> %1)
    585   store <8 x i16> %2, <8 x i16>* @llvm_mips_srl_h_RES
    586   ret void
    587 }
    588 
    589 declare <8 x i16> @llvm.mips.srl.h(<8 x i16>, <8 x i16>) nounwind
    590 
    591 ; CHECK: llvm_mips_srl_h_test:
    592 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srl_h_ARG1)
    593 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srl_h_ARG2)
    594 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    595 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    596 ; CHECK-DAG: srl.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    597 ; CHECK-DAG: st.h [[WD]]
    598 ; CHECK: .size llvm_mips_srl_h_test
    599 ;
    600 @llvm_mips_srl_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
    601 @llvm_mips_srl_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
    602 @llvm_mips_srl_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
    603 
    604 define void @llvm_mips_srl_w_test() nounwind {
    605 entry:
    606   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_srl_w_ARG1
    607   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_srl_w_ARG2
    608   %2 = tail call <4 x i32> @llvm.mips.srl.w(<4 x i32> %0, <4 x i32> %1)
    609   store <4 x i32> %2, <4 x i32>* @llvm_mips_srl_w_RES
    610   ret void
    611 }
    612 
    613 declare <4 x i32> @llvm.mips.srl.w(<4 x i32>, <4 x i32>) nounwind
    614 
    615 ; CHECK: llvm_mips_srl_w_test:
    616 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srl_w_ARG1)
    617 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srl_w_ARG2)
    618 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    619 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    620 ; CHECK-DAG: srl.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    621 ; CHECK-DAG: st.w [[WD]]
    622 ; CHECK: .size llvm_mips_srl_w_test
    623 ;
    624 @llvm_mips_srl_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
    625 @llvm_mips_srl_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
    626 @llvm_mips_srl_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
    627 
    628 define void @llvm_mips_srl_d_test() nounwind {
    629 entry:
    630   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_srl_d_ARG1
    631   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_srl_d_ARG2
    632   %2 = tail call <2 x i64> @llvm.mips.srl.d(<2 x i64> %0, <2 x i64> %1)
    633   store <2 x i64> %2, <2 x i64>* @llvm_mips_srl_d_RES
    634   ret void
    635 }
    636 
    637 declare <2 x i64> @llvm.mips.srl.d(<2 x i64>, <2 x i64>) nounwind
    638 
    639 ; CHECK: llvm_mips_srl_d_test:
    640 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srl_d_ARG1)
    641 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srl_d_ARG2)
    642 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    643 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    644 ; CHECK-DAG: srl.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    645 ; CHECK-DAG: st.d [[WD]]
    646 ; CHECK: .size llvm_mips_srl_d_test
    647 ;
    648 @llvm_mips_srlr_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
    649 @llvm_mips_srlr_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
    650 @llvm_mips_srlr_b_RES  = 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>, align 16
    651 
    652 define void @llvm_mips_srlr_b_test() nounwind {
    653 entry:
    654   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_srlr_b_ARG1
    655   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_srlr_b_ARG2
    656   %2 = tail call <16 x i8> @llvm.mips.srlr.b(<16 x i8> %0, <16 x i8> %1)
    657   store <16 x i8> %2, <16 x i8>* @llvm_mips_srlr_b_RES
    658   ret void
    659 }
    660 
    661 declare <16 x i8> @llvm.mips.srlr.b(<16 x i8>, <16 x i8>) nounwind
    662 
    663 ; CHECK: llvm_mips_srlr_b_test:
    664 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srlr_b_ARG1)
    665 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srlr_b_ARG2)
    666 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    667 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    668 ; CHECK-DAG: srlr.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    669 ; CHECK-DAG: st.b [[WD]]
    670 ; CHECK: .size llvm_mips_srlr_b_test
    671 ;
    672 @llvm_mips_srlr_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
    673 @llvm_mips_srlr_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
    674 @llvm_mips_srlr_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
    675 
    676 define void @llvm_mips_srlr_h_test() nounwind {
    677 entry:
    678   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_srlr_h_ARG1
    679   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_srlr_h_ARG2
    680   %2 = tail call <8 x i16> @llvm.mips.srlr.h(<8 x i16> %0, <8 x i16> %1)
    681   store <8 x i16> %2, <8 x i16>* @llvm_mips_srlr_h_RES
    682   ret void
    683 }
    684 
    685 declare <8 x i16> @llvm.mips.srlr.h(<8 x i16>, <8 x i16>) nounwind
    686 
    687 ; CHECK: llvm_mips_srlr_h_test:
    688 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srlr_h_ARG1)
    689 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srlr_h_ARG2)
    690 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    691 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    692 ; CHECK-DAG: srlr.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    693 ; CHECK-DAG: st.h [[WD]]
    694 ; CHECK: .size llvm_mips_srlr_h_test
    695 ;
    696 @llvm_mips_srlr_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
    697 @llvm_mips_srlr_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
    698 @llvm_mips_srlr_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
    699 
    700 define void @llvm_mips_srlr_w_test() nounwind {
    701 entry:
    702   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_srlr_w_ARG1
    703   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_srlr_w_ARG2
    704   %2 = tail call <4 x i32> @llvm.mips.srlr.w(<4 x i32> %0, <4 x i32> %1)
    705   store <4 x i32> %2, <4 x i32>* @llvm_mips_srlr_w_RES
    706   ret void
    707 }
    708 
    709 declare <4 x i32> @llvm.mips.srlr.w(<4 x i32>, <4 x i32>) nounwind
    710 
    711 ; CHECK: llvm_mips_srlr_w_test:
    712 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srlr_w_ARG1)
    713 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srlr_w_ARG2)
    714 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    715 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    716 ; CHECK-DAG: srlr.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    717 ; CHECK-DAG: st.w [[WD]]
    718 ; CHECK: .size llvm_mips_srlr_w_test
    719 ;
    720 @llvm_mips_srlr_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
    721 @llvm_mips_srlr_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
    722 @llvm_mips_srlr_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
    723 
    724 define void @llvm_mips_srlr_d_test() nounwind {
    725 entry:
    726   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_srlr_d_ARG1
    727   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_srlr_d_ARG2
    728   %2 = tail call <2 x i64> @llvm.mips.srlr.d(<2 x i64> %0, <2 x i64> %1)
    729   store <2 x i64> %2, <2 x i64>* @llvm_mips_srlr_d_RES
    730   ret void
    731 }
    732 
    733 declare <2 x i64> @llvm.mips.srlr.d(<2 x i64>, <2 x i64>) nounwind
    734 
    735 ; CHECK: llvm_mips_srlr_d_test:
    736 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srlr_d_ARG1)
    737 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srlr_d_ARG2)
    738 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    739 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    740 ; CHECK-DAG: srlr.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    741 ; CHECK-DAG: st.d [[WD]]
    742 ; CHECK: .size llvm_mips_srlr_d_test
    743 ;
    744 
    745 define void @srl_b_test() nounwind {
    746 entry:
    747   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_srl_b_ARG1
    748   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_srl_b_ARG2
    749   %2 = lshr <16 x i8> %0, %1
    750   store <16 x i8> %2, <16 x i8>* @llvm_mips_srl_b_RES
    751   ret void
    752 }
    753 
    754 ; CHECK: srl_b_test:
    755 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srl_b_ARG1)
    756 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srl_b_ARG2)
    757 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    758 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    759 ; CHECK-DAG: srl.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    760 ; CHECK-DAG: st.b [[WD]]
    761 ; CHECK: .size srl_b_test
    762 
    763 define void @srl_h_test() nounwind {
    764 entry:
    765   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_srl_h_ARG1
    766   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_srl_h_ARG2
    767   %2 = lshr <8 x i16> %0, %1
    768   store <8 x i16> %2, <8 x i16>* @llvm_mips_srl_h_RES
    769   ret void
    770 }
    771 
    772 ; CHECK: srl_h_test:
    773 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srl_h_ARG1)
    774 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srl_h_ARG2)
    775 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    776 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    777 ; CHECK-DAG: srl.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    778 ; CHECK-DAG: st.h [[WD]]
    779 ; CHECK: .size srl_h_test
    780 
    781 define void @srl_w_test() nounwind {
    782 entry:
    783   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_srl_w_ARG1
    784   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_srl_w_ARG2
    785   %2 = lshr <4 x i32> %0, %1
    786   store <4 x i32> %2, <4 x i32>* @llvm_mips_srl_w_RES
    787   ret void
    788 }
    789 
    790 ; CHECK: srl_w_test:
    791 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srl_w_ARG1)
    792 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srl_w_ARG2)
    793 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    794 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    795 ; CHECK-DAG: srl.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    796 ; CHECK-DAG: st.w [[WD]]
    797 ; CHECK: .size srl_w_test
    798 
    799 define void @srl_d_test() nounwind {
    800 entry:
    801   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_srl_d_ARG1
    802   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_srl_d_ARG2
    803   %2 = lshr <2 x i64> %0, %1
    804   store <2 x i64> %2, <2 x i64>* @llvm_mips_srl_d_RES
    805   ret void
    806 }
    807 
    808 ; CHECK: srl_d_test:
    809 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_srl_d_ARG1)
    810 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_srl_d_ARG2)
    811 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    812 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    813 ; CHECK-DAG: srl.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    814 ; CHECK-DAG: st.d [[WD]]
    815 ; CHECK: .size srl_d_test
    816 
    817 @llvm_mips_subs_s_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
    818 @llvm_mips_subs_s_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
    819 @llvm_mips_subs_s_b_RES  = 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>, align 16
    820 
    821 define void @llvm_mips_subs_s_b_test() nounwind {
    822 entry:
    823   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_subs_s_b_ARG1
    824   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_subs_s_b_ARG2
    825   %2 = tail call <16 x i8> @llvm.mips.subs.s.b(<16 x i8> %0, <16 x i8> %1)
    826   store <16 x i8> %2, <16 x i8>* @llvm_mips_subs_s_b_RES
    827   ret void
    828 }
    829 
    830 declare <16 x i8> @llvm.mips.subs.s.b(<16 x i8>, <16 x i8>) nounwind
    831 
    832 ; CHECK: llvm_mips_subs_s_b_test:
    833 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subs_s_b_ARG1)
    834 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subs_s_b_ARG2)
    835 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    836 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    837 ; CHECK-DAG: subs_s.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    838 ; CHECK-DAG: st.b [[WD]]
    839 ; CHECK: .size llvm_mips_subs_s_b_test
    840 ;
    841 @llvm_mips_subs_s_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
    842 @llvm_mips_subs_s_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
    843 @llvm_mips_subs_s_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
    844 
    845 define void @llvm_mips_subs_s_h_test() nounwind {
    846 entry:
    847   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_subs_s_h_ARG1
    848   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_subs_s_h_ARG2
    849   %2 = tail call <8 x i16> @llvm.mips.subs.s.h(<8 x i16> %0, <8 x i16> %1)
    850   store <8 x i16> %2, <8 x i16>* @llvm_mips_subs_s_h_RES
    851   ret void
    852 }
    853 
    854 declare <8 x i16> @llvm.mips.subs.s.h(<8 x i16>, <8 x i16>) nounwind
    855 
    856 ; CHECK: llvm_mips_subs_s_h_test:
    857 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subs_s_h_ARG1)
    858 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subs_s_h_ARG2)
    859 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    860 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    861 ; CHECK-DAG: subs_s.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    862 ; CHECK-DAG: st.h [[WD]]
    863 ; CHECK: .size llvm_mips_subs_s_h_test
    864 ;
    865 @llvm_mips_subs_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
    866 @llvm_mips_subs_s_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
    867 @llvm_mips_subs_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
    868 
    869 define void @llvm_mips_subs_s_w_test() nounwind {
    870 entry:
    871   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_subs_s_w_ARG1
    872   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_subs_s_w_ARG2
    873   %2 = tail call <4 x i32> @llvm.mips.subs.s.w(<4 x i32> %0, <4 x i32> %1)
    874   store <4 x i32> %2, <4 x i32>* @llvm_mips_subs_s_w_RES
    875   ret void
    876 }
    877 
    878 declare <4 x i32> @llvm.mips.subs.s.w(<4 x i32>, <4 x i32>) nounwind
    879 
    880 ; CHECK: llvm_mips_subs_s_w_test:
    881 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subs_s_w_ARG1)
    882 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subs_s_w_ARG2)
    883 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    884 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    885 ; CHECK-DAG: subs_s.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    886 ; CHECK-DAG: st.w [[WD]]
    887 ; CHECK: .size llvm_mips_subs_s_w_test
    888 ;
    889 @llvm_mips_subs_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
    890 @llvm_mips_subs_s_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
    891 @llvm_mips_subs_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
    892 
    893 define void @llvm_mips_subs_s_d_test() nounwind {
    894 entry:
    895   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_subs_s_d_ARG1
    896   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_subs_s_d_ARG2
    897   %2 = tail call <2 x i64> @llvm.mips.subs.s.d(<2 x i64> %0, <2 x i64> %1)
    898   store <2 x i64> %2, <2 x i64>* @llvm_mips_subs_s_d_RES
    899   ret void
    900 }
    901 
    902 declare <2 x i64> @llvm.mips.subs.s.d(<2 x i64>, <2 x i64>) nounwind
    903 
    904 ; CHECK: llvm_mips_subs_s_d_test:
    905 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subs_s_d_ARG1)
    906 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subs_s_d_ARG2)
    907 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
    908 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
    909 ; CHECK-DAG: subs_s.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    910 ; CHECK-DAG: st.d [[WD]]
    911 ; CHECK: .size llvm_mips_subs_s_d_test
    912 ;
    913 @llvm_mips_subs_u_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
    914 @llvm_mips_subs_u_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
    915 @llvm_mips_subs_u_b_RES  = 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>, align 16
    916 
    917 define void @llvm_mips_subs_u_b_test() nounwind {
    918 entry:
    919   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_subs_u_b_ARG1
    920   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_subs_u_b_ARG2
    921   %2 = tail call <16 x i8> @llvm.mips.subs.u.b(<16 x i8> %0, <16 x i8> %1)
    922   store <16 x i8> %2, <16 x i8>* @llvm_mips_subs_u_b_RES
    923   ret void
    924 }
    925 
    926 declare <16 x i8> @llvm.mips.subs.u.b(<16 x i8>, <16 x i8>) nounwind
    927 
    928 ; CHECK: llvm_mips_subs_u_b_test:
    929 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subs_u_b_ARG1)
    930 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subs_u_b_ARG2)
    931 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
    932 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
    933 ; CHECK-DAG: subs_u.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    934 ; CHECK-DAG: st.b [[WD]]
    935 ; CHECK: .size llvm_mips_subs_u_b_test
    936 ;
    937 @llvm_mips_subs_u_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
    938 @llvm_mips_subs_u_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
    939 @llvm_mips_subs_u_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
    940 
    941 define void @llvm_mips_subs_u_h_test() nounwind {
    942 entry:
    943   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_subs_u_h_ARG1
    944   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_subs_u_h_ARG2
    945   %2 = tail call <8 x i16> @llvm.mips.subs.u.h(<8 x i16> %0, <8 x i16> %1)
    946   store <8 x i16> %2, <8 x i16>* @llvm_mips_subs_u_h_RES
    947   ret void
    948 }
    949 
    950 declare <8 x i16> @llvm.mips.subs.u.h(<8 x i16>, <8 x i16>) nounwind
    951 
    952 ; CHECK: llvm_mips_subs_u_h_test:
    953 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subs_u_h_ARG1)
    954 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subs_u_h_ARG2)
    955 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
    956 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
    957 ; CHECK-DAG: subs_u.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    958 ; CHECK-DAG: st.h [[WD]]
    959 ; CHECK: .size llvm_mips_subs_u_h_test
    960 ;
    961 @llvm_mips_subs_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
    962 @llvm_mips_subs_u_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
    963 @llvm_mips_subs_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
    964 
    965 define void @llvm_mips_subs_u_w_test() nounwind {
    966 entry:
    967   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_subs_u_w_ARG1
    968   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_subs_u_w_ARG2
    969   %2 = tail call <4 x i32> @llvm.mips.subs.u.w(<4 x i32> %0, <4 x i32> %1)
    970   store <4 x i32> %2, <4 x i32>* @llvm_mips_subs_u_w_RES
    971   ret void
    972 }
    973 
    974 declare <4 x i32> @llvm.mips.subs.u.w(<4 x i32>, <4 x i32>) nounwind
    975 
    976 ; CHECK: llvm_mips_subs_u_w_test:
    977 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subs_u_w_ARG1)
    978 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subs_u_w_ARG2)
    979 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
    980 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
    981 ; CHECK-DAG: subs_u.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
    982 ; CHECK-DAG: st.w [[WD]]
    983 ; CHECK: .size llvm_mips_subs_u_w_test
    984 ;
    985 @llvm_mips_subs_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
    986 @llvm_mips_subs_u_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
    987 @llvm_mips_subs_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
    988 
    989 define void @llvm_mips_subs_u_d_test() nounwind {
    990 entry:
    991   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_subs_u_d_ARG1
    992   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_subs_u_d_ARG2
    993   %2 = tail call <2 x i64> @llvm.mips.subs.u.d(<2 x i64> %0, <2 x i64> %1)
    994   store <2 x i64> %2, <2 x i64>* @llvm_mips_subs_u_d_RES
    995   ret void
    996 }
    997 
    998 declare <2 x i64> @llvm.mips.subs.u.d(<2 x i64>, <2 x i64>) nounwind
    999 
   1000 ; CHECK: llvm_mips_subs_u_d_test:
   1001 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subs_u_d_ARG1)
   1002 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subs_u_d_ARG2)
   1003 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
   1004 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
   1005 ; CHECK-DAG: subs_u.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1006 ; CHECK-DAG: st.d [[WD]]
   1007 ; CHECK: .size llvm_mips_subs_u_d_test
   1008 ;
   1009 @llvm_mips_subsus_u_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
   1010 @llvm_mips_subsus_u_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
   1011 @llvm_mips_subsus_u_b_RES  = 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>, align 16
   1012 
   1013 define void @llvm_mips_subsus_u_b_test() nounwind {
   1014 entry:
   1015   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_subsus_u_b_ARG1
   1016   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_subsus_u_b_ARG2
   1017   %2 = tail call <16 x i8> @llvm.mips.subsus.u.b(<16 x i8> %0, <16 x i8> %1)
   1018   store <16 x i8> %2, <16 x i8>* @llvm_mips_subsus_u_b_RES
   1019   ret void
   1020 }
   1021 
   1022 declare <16 x i8> @llvm.mips.subsus.u.b(<16 x i8>, <16 x i8>) nounwind
   1023 
   1024 ; CHECK: llvm_mips_subsus_u_b_test:
   1025 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subsus_u_b_ARG1)
   1026 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subsus_u_b_ARG2)
   1027 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
   1028 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
   1029 ; CHECK-DAG: subsus_u.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1030 ; CHECK-DAG: st.b [[WD]]
   1031 ; CHECK: .size llvm_mips_subsus_u_b_test
   1032 ;
   1033 @llvm_mips_subsus_u_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
   1034 @llvm_mips_subsus_u_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
   1035 @llvm_mips_subsus_u_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
   1036 
   1037 define void @llvm_mips_subsus_u_h_test() nounwind {
   1038 entry:
   1039   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_subsus_u_h_ARG1
   1040   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_subsus_u_h_ARG2
   1041   %2 = tail call <8 x i16> @llvm.mips.subsus.u.h(<8 x i16> %0, <8 x i16> %1)
   1042   store <8 x i16> %2, <8 x i16>* @llvm_mips_subsus_u_h_RES
   1043   ret void
   1044 }
   1045 
   1046 declare <8 x i16> @llvm.mips.subsus.u.h(<8 x i16>, <8 x i16>) nounwind
   1047 
   1048 ; CHECK: llvm_mips_subsus_u_h_test:
   1049 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subsus_u_h_ARG1)
   1050 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subsus_u_h_ARG2)
   1051 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
   1052 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
   1053 ; CHECK-DAG: subsus_u.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1054 ; CHECK-DAG: st.h [[WD]]
   1055 ; CHECK: .size llvm_mips_subsus_u_h_test
   1056 ;
   1057 @llvm_mips_subsus_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
   1058 @llvm_mips_subsus_u_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
   1059 @llvm_mips_subsus_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
   1060 
   1061 define void @llvm_mips_subsus_u_w_test() nounwind {
   1062 entry:
   1063   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_subsus_u_w_ARG1
   1064   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_subsus_u_w_ARG2
   1065   %2 = tail call <4 x i32> @llvm.mips.subsus.u.w(<4 x i32> %0, <4 x i32> %1)
   1066   store <4 x i32> %2, <4 x i32>* @llvm_mips_subsus_u_w_RES
   1067   ret void
   1068 }
   1069 
   1070 declare <4 x i32> @llvm.mips.subsus.u.w(<4 x i32>, <4 x i32>) nounwind
   1071 
   1072 ; CHECK: llvm_mips_subsus_u_w_test:
   1073 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subsus_u_w_ARG1)
   1074 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subsus_u_w_ARG2)
   1075 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
   1076 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
   1077 ; CHECK-DAG: subsus_u.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1078 ; CHECK-DAG: st.w [[WD]]
   1079 ; CHECK: .size llvm_mips_subsus_u_w_test
   1080 ;
   1081 @llvm_mips_subsus_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
   1082 @llvm_mips_subsus_u_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
   1083 @llvm_mips_subsus_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
   1084 
   1085 define void @llvm_mips_subsus_u_d_test() nounwind {
   1086 entry:
   1087   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_subsus_u_d_ARG1
   1088   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_subsus_u_d_ARG2
   1089   %2 = tail call <2 x i64> @llvm.mips.subsus.u.d(<2 x i64> %0, <2 x i64> %1)
   1090   store <2 x i64> %2, <2 x i64>* @llvm_mips_subsus_u_d_RES
   1091   ret void
   1092 }
   1093 
   1094 declare <2 x i64> @llvm.mips.subsus.u.d(<2 x i64>, <2 x i64>) nounwind
   1095 
   1096 ; CHECK: llvm_mips_subsus_u_d_test:
   1097 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subsus_u_d_ARG1)
   1098 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subsus_u_d_ARG2)
   1099 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
   1100 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
   1101 ; CHECK-DAG: subsus_u.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1102 ; CHECK-DAG: st.d [[WD]]
   1103 ; CHECK: .size llvm_mips_subsus_u_d_test
   1104 ;
   1105 @llvm_mips_subsuu_s_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
   1106 @llvm_mips_subsuu_s_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
   1107 @llvm_mips_subsuu_s_b_RES  = 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>, align 16
   1108 
   1109 define void @llvm_mips_subsuu_s_b_test() nounwind {
   1110 entry:
   1111   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_subsuu_s_b_ARG1
   1112   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_subsuu_s_b_ARG2
   1113   %2 = tail call <16 x i8> @llvm.mips.subsuu.s.b(<16 x i8> %0, <16 x i8> %1)
   1114   store <16 x i8> %2, <16 x i8>* @llvm_mips_subsuu_s_b_RES
   1115   ret void
   1116 }
   1117 
   1118 declare <16 x i8> @llvm.mips.subsuu.s.b(<16 x i8>, <16 x i8>) nounwind
   1119 
   1120 ; CHECK: llvm_mips_subsuu_s_b_test:
   1121 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subsuu_s_b_ARG1)
   1122 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subsuu_s_b_ARG2)
   1123 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
   1124 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
   1125 ; CHECK-DAG: subsuu_s.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1126 ; CHECK-DAG: st.b [[WD]]
   1127 ; CHECK: .size llvm_mips_subsuu_s_b_test
   1128 ;
   1129 @llvm_mips_subsuu_s_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
   1130 @llvm_mips_subsuu_s_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
   1131 @llvm_mips_subsuu_s_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
   1132 
   1133 define void @llvm_mips_subsuu_s_h_test() nounwind {
   1134 entry:
   1135   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_subsuu_s_h_ARG1
   1136   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_subsuu_s_h_ARG2
   1137   %2 = tail call <8 x i16> @llvm.mips.subsuu.s.h(<8 x i16> %0, <8 x i16> %1)
   1138   store <8 x i16> %2, <8 x i16>* @llvm_mips_subsuu_s_h_RES
   1139   ret void
   1140 }
   1141 
   1142 declare <8 x i16> @llvm.mips.subsuu.s.h(<8 x i16>, <8 x i16>) nounwind
   1143 
   1144 ; CHECK: llvm_mips_subsuu_s_h_test:
   1145 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subsuu_s_h_ARG1)
   1146 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subsuu_s_h_ARG2)
   1147 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
   1148 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
   1149 ; CHECK-DAG: subsuu_s.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1150 ; CHECK-DAG: st.h [[WD]]
   1151 ; CHECK: .size llvm_mips_subsuu_s_h_test
   1152 ;
   1153 @llvm_mips_subsuu_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
   1154 @llvm_mips_subsuu_s_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
   1155 @llvm_mips_subsuu_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
   1156 
   1157 define void @llvm_mips_subsuu_s_w_test() nounwind {
   1158 entry:
   1159   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_subsuu_s_w_ARG1
   1160   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_subsuu_s_w_ARG2
   1161   %2 = tail call <4 x i32> @llvm.mips.subsuu.s.w(<4 x i32> %0, <4 x i32> %1)
   1162   store <4 x i32> %2, <4 x i32>* @llvm_mips_subsuu_s_w_RES
   1163   ret void
   1164 }
   1165 
   1166 declare <4 x i32> @llvm.mips.subsuu.s.w(<4 x i32>, <4 x i32>) nounwind
   1167 
   1168 ; CHECK: llvm_mips_subsuu_s_w_test:
   1169 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subsuu_s_w_ARG1)
   1170 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subsuu_s_w_ARG2)
   1171 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
   1172 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
   1173 ; CHECK-DAG: subsuu_s.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1174 ; CHECK-DAG: st.w [[WD]]
   1175 ; CHECK: .size llvm_mips_subsuu_s_w_test
   1176 ;
   1177 @llvm_mips_subsuu_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
   1178 @llvm_mips_subsuu_s_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
   1179 @llvm_mips_subsuu_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
   1180 
   1181 define void @llvm_mips_subsuu_s_d_test() nounwind {
   1182 entry:
   1183   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_subsuu_s_d_ARG1
   1184   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_subsuu_s_d_ARG2
   1185   %2 = tail call <2 x i64> @llvm.mips.subsuu.s.d(<2 x i64> %0, <2 x i64> %1)
   1186   store <2 x i64> %2, <2 x i64>* @llvm_mips_subsuu_s_d_RES
   1187   ret void
   1188 }
   1189 
   1190 declare <2 x i64> @llvm.mips.subsuu.s.d(<2 x i64>, <2 x i64>) nounwind
   1191 
   1192 ; CHECK: llvm_mips_subsuu_s_d_test:
   1193 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subsuu_s_d_ARG1)
   1194 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subsuu_s_d_ARG2)
   1195 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
   1196 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
   1197 ; CHECK-DAG: subsuu_s.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1198 ; CHECK-DAG: st.d [[WD]]
   1199 ; CHECK: .size llvm_mips_subsuu_s_d_test
   1200 ;
   1201 @llvm_mips_subv_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
   1202 @llvm_mips_subv_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
   1203 @llvm_mips_subv_b_RES  = 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>, align 16
   1204 
   1205 define void @llvm_mips_subv_b_test() nounwind {
   1206 entry:
   1207   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_subv_b_ARG1
   1208   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_subv_b_ARG2
   1209   %2 = tail call <16 x i8> @llvm.mips.subv.b(<16 x i8> %0, <16 x i8> %1)
   1210   store <16 x i8> %2, <16 x i8>* @llvm_mips_subv_b_RES
   1211   ret void
   1212 }
   1213 
   1214 declare <16 x i8> @llvm.mips.subv.b(<16 x i8>, <16 x i8>) nounwind
   1215 
   1216 ; CHECK: llvm_mips_subv_b_test:
   1217 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subv_b_ARG1)
   1218 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subv_b_ARG2)
   1219 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
   1220 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
   1221 ; CHECK-DAG: subv.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1222 ; CHECK-DAG: st.b [[WD]]
   1223 ; CHECK: .size llvm_mips_subv_b_test
   1224 ;
   1225 @llvm_mips_subv_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
   1226 @llvm_mips_subv_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
   1227 @llvm_mips_subv_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
   1228 
   1229 define void @llvm_mips_subv_h_test() nounwind {
   1230 entry:
   1231   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_subv_h_ARG1
   1232   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_subv_h_ARG2
   1233   %2 = tail call <8 x i16> @llvm.mips.subv.h(<8 x i16> %0, <8 x i16> %1)
   1234   store <8 x i16> %2, <8 x i16>* @llvm_mips_subv_h_RES
   1235   ret void
   1236 }
   1237 
   1238 declare <8 x i16> @llvm.mips.subv.h(<8 x i16>, <8 x i16>) nounwind
   1239 
   1240 ; CHECK: llvm_mips_subv_h_test:
   1241 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subv_h_ARG1)
   1242 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subv_h_ARG2)
   1243 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
   1244 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
   1245 ; CHECK-DAG: subv.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1246 ; CHECK-DAG: st.h [[WD]]
   1247 ; CHECK: .size llvm_mips_subv_h_test
   1248 ;
   1249 @llvm_mips_subv_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
   1250 @llvm_mips_subv_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
   1251 @llvm_mips_subv_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
   1252 
   1253 define void @llvm_mips_subv_w_test() nounwind {
   1254 entry:
   1255   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_subv_w_ARG1
   1256   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_subv_w_ARG2
   1257   %2 = tail call <4 x i32> @llvm.mips.subv.w(<4 x i32> %0, <4 x i32> %1)
   1258   store <4 x i32> %2, <4 x i32>* @llvm_mips_subv_w_RES
   1259   ret void
   1260 }
   1261 
   1262 declare <4 x i32> @llvm.mips.subv.w(<4 x i32>, <4 x i32>) nounwind
   1263 
   1264 ; CHECK: llvm_mips_subv_w_test:
   1265 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subv_w_ARG1)
   1266 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subv_w_ARG2)
   1267 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
   1268 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
   1269 ; CHECK-DAG: subv.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1270 ; CHECK-DAG: st.w [[WD]]
   1271 ; CHECK: .size llvm_mips_subv_w_test
   1272 ;
   1273 @llvm_mips_subv_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
   1274 @llvm_mips_subv_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
   1275 @llvm_mips_subv_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
   1276 
   1277 define void @llvm_mips_subv_d_test() nounwind {
   1278 entry:
   1279   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_subv_d_ARG1
   1280   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_subv_d_ARG2
   1281   %2 = tail call <2 x i64> @llvm.mips.subv.d(<2 x i64> %0, <2 x i64> %1)
   1282   store <2 x i64> %2, <2 x i64>* @llvm_mips_subv_d_RES
   1283   ret void
   1284 }
   1285 
   1286 declare <2 x i64> @llvm.mips.subv.d(<2 x i64>, <2 x i64>) nounwind
   1287 
   1288 ; CHECK: llvm_mips_subv_d_test:
   1289 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subv_d_ARG1)
   1290 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subv_d_ARG2)
   1291 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
   1292 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
   1293 ; CHECK-DAG: subv.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1294 ; CHECK-DAG: st.d [[WD]]
   1295 ; CHECK: .size llvm_mips_subv_d_test
   1296 ;
   1297 
   1298 define void @subv_b_test() nounwind {
   1299 entry:
   1300   %0 = load <16 x i8>, <16 x i8>* @llvm_mips_subv_b_ARG1
   1301   %1 = load <16 x i8>, <16 x i8>* @llvm_mips_subv_b_ARG2
   1302   %2 = sub <16 x i8> %0, %1
   1303   store <16 x i8> %2, <16 x i8>* @llvm_mips_subv_b_RES
   1304   ret void
   1305 }
   1306 
   1307 ; CHECK: subv_b_test:
   1308 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subv_b_ARG1)
   1309 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subv_b_ARG2)
   1310 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
   1311 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
   1312 ; CHECK-DAG: subv.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1313 ; CHECK-DAG: st.b [[WD]]
   1314 ; CHECK: .size subv_b_test
   1315 
   1316 define void @subv_h_test() nounwind {
   1317 entry:
   1318   %0 = load <8 x i16>, <8 x i16>* @llvm_mips_subv_h_ARG1
   1319   %1 = load <8 x i16>, <8 x i16>* @llvm_mips_subv_h_ARG2
   1320   %2 = sub <8 x i16> %0, %1
   1321   store <8 x i16> %2, <8 x i16>* @llvm_mips_subv_h_RES
   1322   ret void
   1323 }
   1324 
   1325 ; CHECK: subv_h_test:
   1326 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subv_h_ARG1)
   1327 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subv_h_ARG2)
   1328 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
   1329 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
   1330 ; CHECK-DAG: subv.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1331 ; CHECK-DAG: st.h [[WD]]
   1332 ; CHECK: .size subv_h_test
   1333 
   1334 define void @subv_w_test() nounwind {
   1335 entry:
   1336   %0 = load <4 x i32>, <4 x i32>* @llvm_mips_subv_w_ARG1
   1337   %1 = load <4 x i32>, <4 x i32>* @llvm_mips_subv_w_ARG2
   1338   %2 = sub <4 x i32> %0, %1
   1339   store <4 x i32> %2, <4 x i32>* @llvm_mips_subv_w_RES
   1340   ret void
   1341 }
   1342 
   1343 ; CHECK: subv_w_test:
   1344 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subv_w_ARG1)
   1345 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subv_w_ARG2)
   1346 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
   1347 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
   1348 ; CHECK-DAG: subv.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1349 ; CHECK-DAG: st.w [[WD]]
   1350 ; CHECK: .size subv_w_test
   1351 
   1352 define void @subv_d_test() nounwind {
   1353 entry:
   1354   %0 = load <2 x i64>, <2 x i64>* @llvm_mips_subv_d_ARG1
   1355   %1 = load <2 x i64>, <2 x i64>* @llvm_mips_subv_d_ARG2
   1356   %2 = sub <2 x i64> %0, %1
   1357   store <2 x i64> %2, <2 x i64>* @llvm_mips_subv_d_RES
   1358   ret void
   1359 }
   1360 
   1361 ; CHECK: subv_d_test:
   1362 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_subv_d_ARG1)
   1363 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_subv_d_ARG2)
   1364 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
   1365 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
   1366 ; CHECK-DAG: subv.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
   1367 ; CHECK-DAG: st.d [[WD]]
   1368 ; CHECK: .size subv_d_test
   1369 ;
   1370