1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mattr=dsp < %s | FileCheck %s -check-prefix=R1 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mattr=dspr2 < %s | FileCheck %s -check-prefix=R2 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_lbux: 5*9880d681SAndroid Build Coastguard Worker; R1: lbux ${{[0-9]+}} 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @test_lbux(i8* nocapture %b, i32 %i) { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i8, i8* %b, i32 %i 10*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %add.ptr, align 1 11*9880d681SAndroid Build Coastguard Worker ret i8 %0 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_lhx: 15*9880d681SAndroid Build Coastguard Worker; R1: lhx ${{[0-9]+}} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine signext i16 @test_lhx(i16* nocapture %b, i32 %i) { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i16, i16* %b, i32 %i 20*9880d681SAndroid Build Coastguard Worker %0 = load i16, i16* %add.ptr, align 2 21*9880d681SAndroid Build Coastguard Worker ret i16 %0 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_lwx: 25*9880d681SAndroid Build Coastguard Worker; R1: lwx ${{[0-9]+}} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine i32 @test_lwx(i32* nocapture %b, i32 %i) { 28*9880d681SAndroid Build Coastguard Workerentry: 29*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %b, i32 %i 30*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %add.ptr, align 4 31*9880d681SAndroid Build Coastguard Worker ret i32 %0 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_add_v2q15_: 35*9880d681SAndroid Build Coastguard Worker; R1: addq.ph ${{[0-9]+}} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_add_v2q15_(i32 %a.coerce, i32 %b.coerce) { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <2 x i16> 40*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32 %b.coerce to <2 x i16> 41*9880d681SAndroid Build Coastguard Worker %add = add <2 x i16> %0, %1 42*9880d681SAndroid Build Coastguard Worker %2 = bitcast <2 x i16> %add to i32 43*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %2, 0 44*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_sub_v2q15_: 48*9880d681SAndroid Build Coastguard Worker; R1: subq.ph ${{[0-9]+}} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_sub_v2q15_(i32 %a.coerce, i32 %b.coerce) { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <2 x i16> 53*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32 %b.coerce to <2 x i16> 54*9880d681SAndroid Build Coastguard Worker %sub = sub <2 x i16> %0, %1 55*9880d681SAndroid Build Coastguard Worker %2 = bitcast <2 x i16> %sub to i32 56*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %2, 0 57*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; R2-LABEL: test_mul_v2q15_: 61*9880d681SAndroid Build Coastguard Worker; R2: mul.ph ${{[0-9]+}} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; mul.ph is an R2 instruction. Check that multiply node gets expanded. 64*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_mul_v2q15_: 65*9880d681SAndroid Build Coastguard Worker; R1: mul ${{[0-9]+}} 66*9880d681SAndroid Build Coastguard Worker; R1: mul ${{[0-9]+}} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_mul_v2q15_(i32 %a.coerce, i32 %b.coerce) { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <2 x i16> 71*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32 %b.coerce to <2 x i16> 72*9880d681SAndroid Build Coastguard Worker %mul = mul <2 x i16> %0, %1 73*9880d681SAndroid Build Coastguard Worker %2 = bitcast <2 x i16> %mul to i32 74*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %2, 0 75*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_add_v4i8_: 79*9880d681SAndroid Build Coastguard Worker; R1: addu.qb ${{[0-9]+}} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_add_v4i8_(i32 %a.coerce, i32 %b.coerce) { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <4 x i8> 84*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32 %b.coerce to <4 x i8> 85*9880d681SAndroid Build Coastguard Worker %add = add <4 x i8> %0, %1 86*9880d681SAndroid Build Coastguard Worker %2 = bitcast <4 x i8> %add to i32 87*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %2, 0 88*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_sub_v4i8_: 92*9880d681SAndroid Build Coastguard Worker; R1: subu.qb ${{[0-9]+}} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_sub_v4i8_(i32 %a.coerce, i32 %b.coerce) { 95*9880d681SAndroid Build Coastguard Workerentry: 96*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <4 x i8> 97*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32 %b.coerce to <4 x i8> 98*9880d681SAndroid Build Coastguard Worker %sub = sub <4 x i8> %0, %1 99*9880d681SAndroid Build Coastguard Worker %2 = bitcast <4 x i8> %sub to i32 100*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %2, 0 101*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; DSP-ASE doesn't have a v4i8 multiply instruction. Check that multiply node gets expanded. 105*9880d681SAndroid Build Coastguard Worker; R2-LABEL: test_mul_v4i8_: 106*9880d681SAndroid Build Coastguard Worker; R2: mul ${{[0-9]+}} 107*9880d681SAndroid Build Coastguard Worker; R2: mul ${{[0-9]+}} 108*9880d681SAndroid Build Coastguard Worker; R2: mul ${{[0-9]+}} 109*9880d681SAndroid Build Coastguard Worker; R2: mul ${{[0-9]+}} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_mul_v4i8_(i32 %a.coerce, i32 %b.coerce) { 112*9880d681SAndroid Build Coastguard Workerentry: 113*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <4 x i8> 114*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32 %b.coerce to <4 x i8> 115*9880d681SAndroid Build Coastguard Worker %mul = mul <4 x i8> %0, %1 116*9880d681SAndroid Build Coastguard Worker %2 = bitcast <4 x i8> %mul to i32 117*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %2, 0 118*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_addsc: 122*9880d681SAndroid Build Coastguard Worker; R1: addsc ${{[0-9]+}} 123*9880d681SAndroid Build Coastguard Worker; R1: addwc ${{[0-9]+}} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine i64 @test_addsc(i64 %a, i64 %b) { 126*9880d681SAndroid Build Coastguard Workerentry: 127*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %b, %a 128*9880d681SAndroid Build Coastguard Worker ret i64 %add 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; R1-LABEL: shift1_v2i16_shl_: 132*9880d681SAndroid Build Coastguard Worker; R1: shll.ph ${{[0-9]+}}, ${{[0-9]+}}, 15 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine { i32 } @shift1_v2i16_shl_(i32 %a0.coerce) { 135*9880d681SAndroid Build Coastguard Workerentry: 136*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a0.coerce to <2 x i16> 137*9880d681SAndroid Build Coastguard Worker %shl = shl <2 x i16> %0, <i16 15, i16 15> 138*9880d681SAndroid Build Coastguard Worker %1 = bitcast <2 x i16> %shl to i32 139*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 140*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; R1-LABEL: shift1_v2i16_sra_: 144*9880d681SAndroid Build Coastguard Worker; R1: shra.ph ${{[0-9]+}}, ${{[0-9]+}}, 15 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine { i32 } @shift1_v2i16_sra_(i32 %a0.coerce) { 147*9880d681SAndroid Build Coastguard Workerentry: 148*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a0.coerce to <2 x i16> 149*9880d681SAndroid Build Coastguard Worker %shr = ashr <2 x i16> %0, <i16 15, i16 15> 150*9880d681SAndroid Build Coastguard Worker %1 = bitcast <2 x i16> %shr to i32 151*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 152*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker; R1-LABEL: shift1_v2ui16_srl_: 156*9880d681SAndroid Build Coastguard Worker; R1-NOT: shrl.ph 157*9880d681SAndroid Build Coastguard Worker; R2-LABEL: shift1_v2ui16_srl_: 158*9880d681SAndroid Build Coastguard Worker; R2: shrl.ph ${{[0-9]+}}, ${{[0-9]+}}, 15 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine { i32 } @shift1_v2ui16_srl_(i32 %a0.coerce) { 161*9880d681SAndroid Build Coastguard Workerentry: 162*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a0.coerce to <2 x i16> 163*9880d681SAndroid Build Coastguard Worker %shr = lshr <2 x i16> %0, <i16 15, i16 15> 164*9880d681SAndroid Build Coastguard Worker %1 = bitcast <2 x i16> %shr to i32 165*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 166*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker; R1-LABEL: shift1_v4i8_shl_: 170*9880d681SAndroid Build Coastguard Worker; R1: shll.qb ${{[0-9]+}}, ${{[0-9]+}}, 7 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdefine { i32 } @shift1_v4i8_shl_(i32 %a0.coerce) { 173*9880d681SAndroid Build Coastguard Workerentry: 174*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a0.coerce to <4 x i8> 175*9880d681SAndroid Build Coastguard Worker %shl = shl <4 x i8> %0, <i8 7, i8 7, i8 7, i8 7> 176*9880d681SAndroid Build Coastguard Worker %1 = bitcast <4 x i8> %shl to i32 177*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 178*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker; R1-LABEL: shift1_v4i8_sra_: 182*9880d681SAndroid Build Coastguard Worker; R1-NOT: shra.qb 183*9880d681SAndroid Build Coastguard Worker; R2-LABEL: shift1_v4i8_sra_: 184*9880d681SAndroid Build Coastguard Worker; R2: shra.qb ${{[0-9]+}}, ${{[0-9]+}}, 7 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine { i32 } @shift1_v4i8_sra_(i32 %a0.coerce) { 187*9880d681SAndroid Build Coastguard Workerentry: 188*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a0.coerce to <4 x i8> 189*9880d681SAndroid Build Coastguard Worker %shr = ashr <4 x i8> %0, <i8 7, i8 7, i8 7, i8 7> 190*9880d681SAndroid Build Coastguard Worker %1 = bitcast <4 x i8> %shr to i32 191*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 192*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker; R1-LABEL: shift1_v4ui8_srl_: 196*9880d681SAndroid Build Coastguard Worker; R1: shrl.qb ${{[0-9]+}}, ${{[0-9]+}}, 7 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdefine { i32 } @shift1_v4ui8_srl_(i32 %a0.coerce) { 199*9880d681SAndroid Build Coastguard Workerentry: 200*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a0.coerce to <4 x i8> 201*9880d681SAndroid Build Coastguard Worker %shr = lshr <4 x i8> %0, <i8 7, i8 7, i8 7, i8 7> 202*9880d681SAndroid Build Coastguard Worker %1 = bitcast <4 x i8> %shr to i32 203*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 204*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; Check that shift node is expanded if splat element size is not 16-bit. 208*9880d681SAndroid Build Coastguard Worker; 209*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_vector_splat_imm_v2q15: 210*9880d681SAndroid Build Coastguard Worker; R1-NOT: shll.ph 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_vector_splat_imm_v2q15(i32 %a.coerce) { 213*9880d681SAndroid Build Coastguard Workerentry: 214*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <2 x i16> 215*9880d681SAndroid Build Coastguard Worker %shl = shl <2 x i16> %0, <i16 0, i16 2> 216*9880d681SAndroid Build Coastguard Worker %1 = bitcast <2 x i16> %shl to i32 217*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 218*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; Check that shift node is expanded if splat element size is not 8-bit. 222*9880d681SAndroid Build Coastguard Worker; 223*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_vector_splat_imm_v4i8: 224*9880d681SAndroid Build Coastguard Worker; R1-NOT: shll.qb 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_vector_splat_imm_v4i8(i32 %a.coerce) { 227*9880d681SAndroid Build Coastguard Workerentry: 228*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <4 x i8> 229*9880d681SAndroid Build Coastguard Worker %shl = shl <4 x i8> %0, <i8 0, i8 2, i8 0, i8 2> 230*9880d681SAndroid Build Coastguard Worker %1 = bitcast <4 x i8> %shl to i32 231*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 232*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 233*9880d681SAndroid Build Coastguard Worker} 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker; Check that shift node is expanded if shift amount doesn't fit in 4-bit sa field. 236*9880d681SAndroid Build Coastguard Worker; 237*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_shift_amount_v2q15: 238*9880d681SAndroid Build Coastguard Worker; R1-NOT: shll.ph 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_shift_amount_v2q15(i32 %a.coerce) { 241*9880d681SAndroid Build Coastguard Workerentry: 242*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <2 x i16> 243*9880d681SAndroid Build Coastguard Worker %shl = shl <2 x i16> %0, <i16 16, i16 16> 244*9880d681SAndroid Build Coastguard Worker %1 = bitcast <2 x i16> %shl to i32 245*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 246*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 247*9880d681SAndroid Build Coastguard Worker} 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker; Check that shift node is expanded if shift amount doesn't fit in 3-bit sa field. 250*9880d681SAndroid Build Coastguard Worker; 251*9880d681SAndroid Build Coastguard Worker; R1-LABEL: test_shift_amount_v4i8: 252*9880d681SAndroid Build Coastguard Worker; R1-NOT: shll.qb 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Workerdefine { i32 } @test_shift_amount_v4i8(i32 %a.coerce) { 255*9880d681SAndroid Build Coastguard Workerentry: 256*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32 %a.coerce to <4 x i8> 257*9880d681SAndroid Build Coastguard Worker %shl = shl <4 x i8> %0, <i8 8, i8 8, i8 8, i8 8> 258*9880d681SAndroid Build Coastguard Worker %1 = bitcast <4 x i8> %shl to i32 259*9880d681SAndroid Build Coastguard Worker %.fca.0.insert = insertvalue { i32 } undef, i32 %1, 0 260*9880d681SAndroid Build Coastguard Worker ret { i32 } %.fca.0.insert 261*9880d681SAndroid Build Coastguard Worker} 262