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