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@i64 = global i64 0 10 11define void @const_v16i8() nounwind { 12 ; MIPS32-AE: const_v16i8: 13 14 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 15 ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0 16 17 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 18 ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1 19 20 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 21 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 22 ; MIPS32-AE: ld.b [[R1:\$w[0-9]+]], 0([[G_PTR]]) 23 24 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 25 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 26 ; MIPS32-AE: ld.b [[R1:\$w[0-9]+]], 0([[G_PTR]]) 27 28 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 29 ; MIPS32-BE: ldi.h [[R1:\$w[0-9]+]], 256 30 ; MIPS32-LE: ldi.h [[R1:\$w[0-9]+]], 1 31 32 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 33 ; MIPS32-BE-DAG: lui [[R2:\$[0-9]+]], 258 34 ; MIPS32-LE-DAG: lui [[R2:\$[0-9]+]], 1027 35 ; MIPS32-BE-DAG: ori [[R2]], [[R2]], 772 36 ; MIPS32-LE-DAG: ori [[R2]], [[R2]], 513 37 ; MIPS32-AE-DAG: fill.w [[R1:\$w[0-9]+]], [[R2]] 38 39 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 40 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 41 ; MIPS32-AE: ld.b [[R1:\$w[0-9]+]], 0([[G_PTR]]) 42 43 ret void 44 ; MIPS32-AE: .size const_v16i8 45} 46 47define void @const_v8i16() nounwind { 48 ; MIPS32-AE: const_v8i16: 49 50 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 51 ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0 52 53 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 54 ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1 55 56 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 57 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 58 ; MIPS32-AE: ld.h [[R1:\$w[0-9]+]], 0([[G_PTR]]) 59 60 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 61 ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 4 62 63 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 64 ; MIPS32-BE-DAG: lui [[R2:\$[0-9]+]], 1 65 ; MIPS32-LE-DAG: lui [[R2:\$[0-9]+]], 2 66 ; MIPS32-BE-DAG: ori [[R2]], [[R2]], 2 67 ; MIPS32-LE-DAG: ori [[R2]], [[R2]], 1 68 ; MIPS32-AE-DAG: fill.w [[R1:\$w[0-9]+]], [[R2]] 69 70 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 71 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 72 ; MIPS32-AE: ld.h [[R1:\$w[0-9]+]], 0([[G_PTR]]) 73 74 ret void 75 ; MIPS32-AE: .size const_v8i16 76} 77 78define void @const_v4i32() nounwind { 79 ; MIPS32-AE: const_v4i32: 80 81 store volatile <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32>*@v4i32 82 ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0 83 84 store volatile <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32>*@v4i32 85 ; MIPS32-AE: ldi.w [[R1:\$w[0-9]+]], 1 86 87 store volatile <4 x i32> <i32 1, i32 1, i32 1, i32 31>, <4 x i32>*@v4i32 88 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 89 ; MIPS32-AE: ld.w [[R1:\$w[0-9]+]], 0([[G_PTR]]) 90 91 store volatile <4 x i32> <i32 16843009, i32 16843009, i32 16843009, i32 16843009>, <4 x i32>*@v4i32 92 ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1 93 94 store volatile <4 x i32> <i32 65537, i32 65537, i32 65537, i32 65537>, <4 x i32>*@v4i32 95 ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1 96 97 store volatile <4 x i32> <i32 1, i32 2, i32 1, i32 2>, <4 x i32>*@v4i32 98 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 99 ; MIPS32-AE: ld.w [[R1:\$w[0-9]+]], 0([[G_PTR]]) 100 101 store volatile <4 x i32> <i32 3, i32 4, i32 5, i32 6>, <4 x i32>*@v4i32 102 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 103 ; MIPS32-AE: ld.w [[R1:\$w[0-9]+]], 0([[G_PTR]]) 104 105 ret void 106 ; MIPS32-AE: .size const_v4i32 107} 108 109define void @const_v2i64() nounwind { 110 ; MIPS32-AE: const_v2i64: 111 112 store volatile <2 x i64> <i64 0, i64 0>, <2 x i64>*@v2i64 113 ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0 114 115 store volatile <2 x i64> <i64 72340172838076673, i64 72340172838076673>, <2 x i64>*@v2i64 116 ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1 117 118 store volatile <2 x i64> <i64 281479271743489, i64 281479271743489>, <2 x i64>*@v2i64 119 ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1 120 121 store volatile <2 x i64> <i64 4294967297, i64 4294967297>, <2 x i64>*@v2i64 122 ; MIPS32-AE: ldi.w [[R1:\$w[0-9]+]], 1 123 124 store volatile <2 x i64> <i64 1, i64 1>, <2 x i64>*@v2i64 125 ; MIPS32-AE: ldi.d [[R1:\$w[0-9]+]], 1 126 127 store volatile <2 x i64> <i64 1, i64 31>, <2 x i64>*@v2i64 128 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 129 ; MIPS32-AE: ld.w [[R1:\$w[0-9]+]], 0([[G_PTR]]) 130 131 store volatile <2 x i64> <i64 3, i64 4>, <2 x i64>*@v2i64 132 ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($ 133 ; MIPS32-AE: ld.w [[R1:\$w[0-9]+]], 0([[G_PTR]]) 134 135 ret void 136 ; MIPS32-AE: .size const_v2i64 137} 138 139define void @nonconst_v16i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f, i8 %g, i8 %h) nounwind { 140 ; MIPS32-AE: nonconst_v16i8: 141 142 %1 = insertelement <16 x i8> undef, i8 %a, i32 0 143 %2 = insertelement <16 x i8> %1, i8 %b, i32 1 144 %3 = insertelement <16 x i8> %2, i8 %c, i32 2 145 %4 = insertelement <16 x i8> %3, i8 %d, i32 3 146 %5 = insertelement <16 x i8> %4, i8 %e, i32 4 147 %6 = insertelement <16 x i8> %5, i8 %f, i32 5 148 %7 = insertelement <16 x i8> %6, i8 %g, i32 6 149 %8 = insertelement <16 x i8> %7, i8 %h, i32 7 150 %9 = insertelement <16 x i8> %8, i8 %h, i32 8 151 %10 = insertelement <16 x i8> %9, i8 %h, i32 9 152 %11 = insertelement <16 x i8> %10, i8 %h, i32 10 153 %12 = insertelement <16 x i8> %11, i8 %h, i32 11 154 %13 = insertelement <16 x i8> %12, i8 %h, i32 12 155 %14 = insertelement <16 x i8> %13, i8 %h, i32 13 156 %15 = insertelement <16 x i8> %14, i8 %h, i32 14 157 %16 = insertelement <16 x i8> %15, i8 %h, i32 15 158 ; MIPS32-AE-DAG: insert.b [[R1:\$w[0-9]+]][0], $4 159 ; MIPS32-AE-DAG: insert.b [[R1]][1], $5 160 ; MIPS32-AE-DAG: insert.b [[R1]][2], $6 161 ; MIPS32-AE-DAG: insert.b [[R1]][3], $7 162 ; MIPS32-BE-DAG: lbu [[R2:\$[0-9]+]], 19($sp) 163 ; MIPS32-LE-DAG: lbu [[R2:\$[0-9]+]], 16($sp) 164 ; MIPS32-AE-DAG: insert.b [[R1]][4], [[R2]] 165 ; MIPS32-BE-DAG: lbu [[R3:\$[0-9]+]], 23($sp) 166 ; MIPS32-LE-DAG: lbu [[R3:\$[0-9]+]], 20($sp) 167 ; MIPS32-AE-DAG: insert.b [[R1]][5], [[R3]] 168 ; MIPS32-BE-DAG: lbu [[R4:\$[0-9]+]], 27($sp) 169 ; MIPS32-LE-DAG: lbu [[R4:\$[0-9]+]], 24($sp) 170 ; MIPS32-AE-DAG: insert.b [[R1]][6], [[R4]] 171 ; MIPS32-BE-DAG: lbu [[R5:\$[0-9]+]], 31($sp) 172 ; MIPS32-LE-DAG: lbu [[R5:\$[0-9]+]], 28($sp) 173 ; MIPS32-AE-DAG: insert.b [[R1]][7], [[R5]] 174 ; MIPS32-AE-DAG: insert.b [[R1]][8], [[R5]] 175 ; MIPS32-AE-DAG: insert.b [[R1]][9], [[R5]] 176 ; MIPS32-AE-DAG: insert.b [[R1]][10], [[R5]] 177 ; MIPS32-AE-DAG: insert.b [[R1]][11], [[R5]] 178 ; MIPS32-AE-DAG: insert.b [[R1]][12], [[R5]] 179 ; MIPS32-AE-DAG: insert.b [[R1]][13], [[R5]] 180 ; MIPS32-AE-DAG: insert.b [[R1]][14], [[R5]] 181 ; MIPS32-AE-DAG: insert.b [[R1]][15], [[R5]] 182 183 store volatile <16 x i8> %16, <16 x i8>*@v16i8 184 185 ret void 186 ; MIPS32-AE: .size nonconst_v16i8 187} 188 189define void @nonconst_v8i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g, i16 %h) nounwind { 190 ; MIPS32-AE: nonconst_v8i16: 191 192 %1 = insertelement <8 x i16> undef, i16 %a, i32 0 193 %2 = insertelement <8 x i16> %1, i16 %b, i32 1 194 %3 = insertelement <8 x i16> %2, i16 %c, i32 2 195 %4 = insertelement <8 x i16> %3, i16 %d, i32 3 196 %5 = insertelement <8 x i16> %4, i16 %e, i32 4 197 %6 = insertelement <8 x i16> %5, i16 %f, i32 5 198 %7 = insertelement <8 x i16> %6, i16 %g, i32 6 199 %8 = insertelement <8 x i16> %7, i16 %h, i32 7 200 ; MIPS32-AE-DAG: insert.h [[R1:\$w[0-9]+]][0], $4 201 ; MIPS32-AE-DAG: insert.h [[R1]][1], $5 202 ; MIPS32-AE-DAG: insert.h [[R1]][2], $6 203 ; MIPS32-AE-DAG: insert.h [[R1]][3], $7 204 ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 18($sp) 205 ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 16($sp) 206 ; MIPS32-AE-DAG: insert.h [[R1]][4], [[R2]] 207 ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 22($sp) 208 ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 20($sp) 209 ; MIPS32-AE-DAG: insert.h [[R1]][5], [[R2]] 210 ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 26($sp) 211 ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 24($sp) 212 ; MIPS32-AE-DAG: insert.h [[R1]][6], [[R2]] 213 ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 30($sp) 214 ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 28($sp) 215 ; MIPS32-AE-DAG: insert.h [[R1]][7], [[R2]] 216 217 store volatile <8 x i16> %8, <8 x i16>*@v8i16 218 219 ret void 220 ; MIPS32-AE: .size nonconst_v8i16 221} 222 223define void @nonconst_v4i32(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { 224 ; MIPS32-AE: nonconst_v4i32: 225 226 %1 = insertelement <4 x i32> undef, i32 %a, i32 0 227 %2 = insertelement <4 x i32> %1, i32 %b, i32 1 228 %3 = insertelement <4 x i32> %2, i32 %c, i32 2 229 %4 = insertelement <4 x i32> %3, i32 %d, i32 3 230 ; MIPS32-AE: insert.w [[R1:\$w[0-9]+]][0], $4 231 ; MIPS32-AE: insert.w [[R1]][1], $5 232 ; MIPS32-AE: insert.w [[R1]][2], $6 233 ; MIPS32-AE: insert.w [[R1]][3], $7 234 235 store volatile <4 x i32> %4, <4 x i32>*@v4i32 236 237 ret void 238 ; MIPS32-AE: .size nonconst_v4i32 239} 240 241define void @nonconst_v2i64(i64 %a, i64 %b) nounwind { 242 ; MIPS32-AE: nonconst_v2i64: 243 244 %1 = insertelement <2 x i64> undef, i64 %a, i32 0 245 %2 = insertelement <2 x i64> %1, i64 %b, i32 1 246 ; MIPS32-AE: insert.w [[R1:\$w[0-9]+]][0], $4 247 ; MIPS32-AE: insert.w [[R1]][1], $5 248 ; MIPS32-AE: insert.w [[R1]][2], $6 249 ; MIPS32-AE: insert.w [[R1]][3], $7 250 251 store volatile <2 x i64> %2, <2 x i64>*@v2i64 252 253 ret void 254 ; MIPS32-AE: .size nonconst_v2i64 255} 256 257define i32 @extract_sext_v16i8() nounwind { 258 ; MIPS32-AE: extract_sext_v16i8: 259 260 %1 = load <16 x i8>* @v16i8 261 ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]], 262 263 %2 = add <16 x i8> %1, %1 264 ; MIPS32-AE-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]] 265 266 %3 = extractelement <16 x i8> %2, i32 1 267 %4 = sext i8 %3 to i32 268 ; MIPS32-AE-DAG: copy_s.b [[R3:\$[0-9]+]], [[R1]][1] 269 ; MIPS32-AE-NOT: sll 270 ; MIPS32-AE-NOT: sra 271 272 ret i32 %4 273 ; MIPS32-AE: .size extract_sext_v16i8 274} 275 276define i32 @extract_sext_v8i16() nounwind { 277 ; MIPS32-AE: extract_sext_v8i16: 278 279 %1 = load <8 x i16>* @v8i16 280 ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]], 281 282 %2 = add <8 x i16> %1, %1 283 ; MIPS32-AE-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]] 284 285 %3 = extractelement <8 x i16> %2, i32 1 286 %4 = sext i16 %3 to i32 287 ; MIPS32-AE-DAG: copy_s.h [[R3:\$[0-9]+]], [[R1]][1] 288 ; MIPS32-AE-NOT: sll 289 ; MIPS32-AE-NOT: sra 290 291 ret i32 %4 292 ; MIPS32-AE: .size extract_sext_v8i16 293} 294 295define i32 @extract_sext_v4i32() nounwind { 296 ; MIPS32-AE: extract_sext_v4i32: 297 298 %1 = load <4 x i32>* @v4i32 299 ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]], 300 301 %2 = add <4 x i32> %1, %1 302 ; MIPS32-AE-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]] 303 304 %3 = extractelement <4 x i32> %2, i32 1 305 ; MIPS32-AE-DAG: copy_s.w [[R3:\$[0-9]+]], [[R1]][1] 306 307 ret i32 %3 308 ; MIPS32-AE: .size extract_sext_v4i32 309} 310 311define i64 @extract_sext_v2i64() nounwind { 312 ; MIPS32-AE: extract_sext_v2i64: 313 314 %1 = load <2 x i64>* @v2i64 315 ; MIPS32-AE-DAG: ld.d [[R1:\$w[0-9]+]], 316 317 %2 = add <2 x i64> %1, %1 318 ; MIPS32-AE-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]] 319 320 %3 = extractelement <2 x i64> %2, i32 1 321 ; MIPS32-AE-DAG: copy_s.w [[R3:\$[0-9]+]], [[R1]][2] 322 ; MIPS32-AE-DAG: copy_s.w [[R4:\$[0-9]+]], [[R1]][3] 323 ; MIPS32-AE-NOT: sll 324 ; MIPS32-AE-NOT: sra 325 326 ret i64 %3 327 ; MIPS32-AE: .size extract_sext_v2i64 328} 329 330define i32 @extract_zext_v16i8() nounwind { 331 ; MIPS32-AE: extract_zext_v16i8: 332 333 %1 = load <16 x i8>* @v16i8 334 ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]], 335 336 %2 = add <16 x i8> %1, %1 337 ; MIPS32-AE-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]] 338 339 %3 = extractelement <16 x i8> %2, i32 1 340 %4 = zext i8 %3 to i32 341 ; MIPS32-AE-DAG: copy_u.b [[R3:\$[0-9]+]], [[R1]][1] 342 ; MIPS32-AE-NOT: andi 343 344 ret i32 %4 345 ; MIPS32-AE: .size extract_zext_v16i8 346} 347 348define i32 @extract_zext_v8i16() nounwind { 349 ; MIPS32-AE: extract_zext_v8i16: 350 351 %1 = load <8 x i16>* @v8i16 352 ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]], 353 354 %2 = add <8 x i16> %1, %1 355 ; MIPS32-AE-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]] 356 357 %3 = extractelement <8 x i16> %2, i32 1 358 %4 = zext i16 %3 to i32 359 ; MIPS32-AE-DAG: copy_u.h [[R3:\$[0-9]+]], [[R1]][1] 360 ; MIPS32-AE-NOT: andi 361 362 ret i32 %4 363 ; MIPS32-AE: .size extract_zext_v8i16 364} 365 366define i32 @extract_zext_v4i32() nounwind { 367 ; MIPS32-AE: extract_zext_v4i32: 368 369 %1 = load <4 x i32>* @v4i32 370 ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]], 371 372 %2 = add <4 x i32> %1, %1 373 ; MIPS32-AE-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]] 374 375 %3 = extractelement <4 x i32> %2, i32 1 376 ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R3:\$[0-9]+]], [[R1]][1] 377 378 ret i32 %3 379 ; MIPS32-AE: .size extract_zext_v4i32 380} 381 382define i64 @extract_zext_v2i64() nounwind { 383 ; MIPS32-AE: extract_zext_v2i64: 384 385 %1 = load <2 x i64>* @v2i64 386 ; MIPS32-AE-DAG: ld.d [[R1:\$w[0-9]+]], 387 388 %2 = add <2 x i64> %1, %1 389 ; MIPS32-AE-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]] 390 391 %3 = extractelement <2 x i64> %2, i32 1 392 ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R3:\$[0-9]+]], [[R1]][2] 393 ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R4:\$[0-9]+]], [[R1]][3] 394 ; MIPS32-AE-NOT: andi 395 396 ret i64 %3 397 ; MIPS32-AE: .size extract_zext_v2i64 398} 399 400define void @insert_v16i8(i32 %a) nounwind { 401 ; MIPS32-AE: insert_v16i8: 402 403 %1 = load <16 x i8>* @v16i8 404 ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]], 405 406 %a2 = trunc i32 %a to i8 407 %a3 = sext i8 %a2 to i32 408 %a4 = trunc i32 %a3 to i8 409 ; MIPS32-AE-NOT: andi 410 ; MIPS32-AE-NOT: sra 411 412 %2 = insertelement <16 x i8> %1, i8 %a4, i32 1 413 ; MIPS32-AE-DAG: insert.b [[R1]][1], $4 414 415 store <16 x i8> %2, <16 x i8>* @v16i8 416 ; MIPS32-AE-DAG: st.b [[R1]] 417 418 ret void 419 ; MIPS32-AE: .size insert_v16i8 420} 421 422define void @insert_v8i16(i32 %a) nounwind { 423 ; MIPS32-AE: insert_v8i16: 424 425 %1 = load <8 x i16>* @v8i16 426 ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]], 427 428 %a2 = trunc i32 %a to i16 429 %a3 = sext i16 %a2 to i32 430 %a4 = trunc i32 %a3 to i16 431 ; MIPS32-AE-NOT: andi 432 ; MIPS32-AE-NOT: sra 433 434 %2 = insertelement <8 x i16> %1, i16 %a4, i32 1 435 ; MIPS32-AE-DAG: insert.h [[R1]][1], $4 436 437 store <8 x i16> %2, <8 x i16>* @v8i16 438 ; MIPS32-AE-DAG: st.h [[R1]] 439 440 ret void 441 ; MIPS32-AE: .size insert_v8i16 442} 443 444define void @insert_v4i32(i32 %a) nounwind { 445 ; MIPS32-AE: insert_v4i32: 446 447 %1 = load <4 x i32>* @v4i32 448 ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]], 449 450 ; MIPS32-AE-NOT: andi 451 ; MIPS32-AE-NOT: sra 452 453 %2 = insertelement <4 x i32> %1, i32 %a, i32 1 454 ; MIPS32-AE-DAG: insert.w [[R1]][1], $4 455 456 store <4 x i32> %2, <4 x i32>* @v4i32 457 ; MIPS32-AE-DAG: st.w [[R1]] 458 459 ret void 460 ; MIPS32-AE: .size insert_v4i32 461} 462 463define void @insert_v2i64(i64 %a) nounwind { 464 ; MIPS32-AE: insert_v2i64: 465 466 %1 = load <2 x i64>* @v2i64 467 ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]], 468 469 ; MIPS32-AE-NOT: andi 470 ; MIPS32-AE-NOT: sra 471 472 %2 = insertelement <2 x i64> %1, i64 %a, i32 1 473 ; MIPS32-AE-DAG: insert.w [[R1]][2], $4 474 ; MIPS32-AE-DAG: insert.w [[R1]][3], $5 475 476 store <2 x i64> %2, <2 x i64>* @v2i64 477 ; MIPS32-AE-DAG: st.w [[R1]] 478 479 ret void 480 ; MIPS32-AE: .size insert_v2i64 481} 482 483define void @truncstore() nounwind { 484 ; MIPS32-AE: truncstore: 485 486 store volatile <4 x i8> <i8 -1, i8 -1, i8 -1, i8 -1>, <4 x i8>*@v4i8 487 ; TODO: What code should be emitted? 488 489 ret void 490 ; MIPS32-AE: .size truncstore 491} 492