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