1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s 2 3 define <8 x i8> @vmlsi8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8> * %C) nounwind { 4 ;CHECK: vmlsi8: 5 ;CHECK: vmls.i8 6 %tmp1 = load <8 x i8>* %A 7 %tmp2 = load <8 x i8>* %B 8 %tmp3 = load <8 x i8>* %C 9 %tmp4 = mul <8 x i8> %tmp2, %tmp3 10 %tmp5 = sub <8 x i8> %tmp1, %tmp4 11 ret <8 x i8> %tmp5 12 } 13 14 define <4 x i16> @vmlsi16(<4 x i16>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind { 15 ;CHECK: vmlsi16: 16 ;CHECK: vmls.i16 17 %tmp1 = load <4 x i16>* %A 18 %tmp2 = load <4 x i16>* %B 19 %tmp3 = load <4 x i16>* %C 20 %tmp4 = mul <4 x i16> %tmp2, %tmp3 21 %tmp5 = sub <4 x i16> %tmp1, %tmp4 22 ret <4 x i16> %tmp5 23 } 24 25 define <2 x i32> @vmlsi32(<2 x i32>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind { 26 ;CHECK: vmlsi32: 27 ;CHECK: vmls.i32 28 %tmp1 = load <2 x i32>* %A 29 %tmp2 = load <2 x i32>* %B 30 %tmp3 = load <2 x i32>* %C 31 %tmp4 = mul <2 x i32> %tmp2, %tmp3 32 %tmp5 = sub <2 x i32> %tmp1, %tmp4 33 ret <2 x i32> %tmp5 34 } 35 36 define <2 x float> @vmlsf32(<2 x float>* %A, <2 x float>* %B, <2 x float>* %C) nounwind { 37 ;CHECK: vmlsf32: 38 ;CHECK: vmls.f32 39 %tmp1 = load <2 x float>* %A 40 %tmp2 = load <2 x float>* %B 41 %tmp3 = load <2 x float>* %C 42 %tmp4 = fmul <2 x float> %tmp2, %tmp3 43 %tmp5 = fsub <2 x float> %tmp1, %tmp4 44 ret <2 x float> %tmp5 45 } 46 47 define <16 x i8> @vmlsQi8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8> * %C) nounwind { 48 ;CHECK: vmlsQi8: 49 ;CHECK: vmls.i8 50 %tmp1 = load <16 x i8>* %A 51 %tmp2 = load <16 x i8>* %B 52 %tmp3 = load <16 x i8>* %C 53 %tmp4 = mul <16 x i8> %tmp2, %tmp3 54 %tmp5 = sub <16 x i8> %tmp1, %tmp4 55 ret <16 x i8> %tmp5 56 } 57 58 define <8 x i16> @vmlsQi16(<8 x i16>* %A, <8 x i16>* %B, <8 x i16>* %C) nounwind { 59 ;CHECK: vmlsQi16: 60 ;CHECK: vmls.i16 61 %tmp1 = load <8 x i16>* %A 62 %tmp2 = load <8 x i16>* %B 63 %tmp3 = load <8 x i16>* %C 64 %tmp4 = mul <8 x i16> %tmp2, %tmp3 65 %tmp5 = sub <8 x i16> %tmp1, %tmp4 66 ret <8 x i16> %tmp5 67 } 68 69 define <4 x i32> @vmlsQi32(<4 x i32>* %A, <4 x i32>* %B, <4 x i32>* %C) nounwind { 70 ;CHECK: vmlsQi32: 71 ;CHECK: vmls.i32 72 %tmp1 = load <4 x i32>* %A 73 %tmp2 = load <4 x i32>* %B 74 %tmp3 = load <4 x i32>* %C 75 %tmp4 = mul <4 x i32> %tmp2, %tmp3 76 %tmp5 = sub <4 x i32> %tmp1, %tmp4 77 ret <4 x i32> %tmp5 78 } 79 80 define <4 x float> @vmlsQf32(<4 x float>* %A, <4 x float>* %B, <4 x float>* %C) nounwind { 81 ;CHECK: vmlsQf32: 82 ;CHECK: vmls.f32 83 %tmp1 = load <4 x float>* %A 84 %tmp2 = load <4 x float>* %B 85 %tmp3 = load <4 x float>* %C 86 %tmp4 = fmul <4 x float> %tmp2, %tmp3 87 %tmp5 = fsub <4 x float> %tmp1, %tmp4 88 ret <4 x float> %tmp5 89 } 90 91 define <8 x i16> @vmlsls8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind { 92 ;CHECK: vmlsls8: 93 ;CHECK: vmlsl.s8 94 %tmp1 = load <8 x i16>* %A 95 %tmp2 = load <8 x i8>* %B 96 %tmp3 = load <8 x i8>* %C 97 %tmp4 = sext <8 x i8> %tmp2 to <8 x i16> 98 %tmp5 = sext <8 x i8> %tmp3 to <8 x i16> 99 %tmp6 = mul <8 x i16> %tmp4, %tmp5 100 %tmp7 = sub <8 x i16> %tmp1, %tmp6 101 ret <8 x i16> %tmp7 102 } 103 104 define <4 x i32> @vmlsls16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind { 105 ;CHECK: vmlsls16: 106 ;CHECK: vmlsl.s16 107 %tmp1 = load <4 x i32>* %A 108 %tmp2 = load <4 x i16>* %B 109 %tmp3 = load <4 x i16>* %C 110 %tmp4 = sext <4 x i16> %tmp2 to <4 x i32> 111 %tmp5 = sext <4 x i16> %tmp3 to <4 x i32> 112 %tmp6 = mul <4 x i32> %tmp4, %tmp5 113 %tmp7 = sub <4 x i32> %tmp1, %tmp6 114 ret <4 x i32> %tmp7 115 } 116 117 define <2 x i64> @vmlsls32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind { 118 ;CHECK: vmlsls32: 119 ;CHECK: vmlsl.s32 120 %tmp1 = load <2 x i64>* %A 121 %tmp2 = load <2 x i32>* %B 122 %tmp3 = load <2 x i32>* %C 123 %tmp4 = sext <2 x i32> %tmp2 to <2 x i64> 124 %tmp5 = sext <2 x i32> %tmp3 to <2 x i64> 125 %tmp6 = mul <2 x i64> %tmp4, %tmp5 126 %tmp7 = sub <2 x i64> %tmp1, %tmp6 127 ret <2 x i64> %tmp7 128 } 129 130 define <8 x i16> @vmlslu8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind { 131 ;CHECK: vmlslu8: 132 ;CHECK: vmlsl.u8 133 %tmp1 = load <8 x i16>* %A 134 %tmp2 = load <8 x i8>* %B 135 %tmp3 = load <8 x i8>* %C 136 %tmp4 = zext <8 x i8> %tmp2 to <8 x i16> 137 %tmp5 = zext <8 x i8> %tmp3 to <8 x i16> 138 %tmp6 = mul <8 x i16> %tmp4, %tmp5 139 %tmp7 = sub <8 x i16> %tmp1, %tmp6 140 ret <8 x i16> %tmp7 141 } 142 143 define <4 x i32> @vmlslu16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind { 144 ;CHECK: vmlslu16: 145 ;CHECK: vmlsl.u16 146 %tmp1 = load <4 x i32>* %A 147 %tmp2 = load <4 x i16>* %B 148 %tmp3 = load <4 x i16>* %C 149 %tmp4 = zext <4 x i16> %tmp2 to <4 x i32> 150 %tmp5 = zext <4 x i16> %tmp3 to <4 x i32> 151 %tmp6 = mul <4 x i32> %tmp4, %tmp5 152 %tmp7 = sub <4 x i32> %tmp1, %tmp6 153 ret <4 x i32> %tmp7 154 } 155 156 define <2 x i64> @vmlslu32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind { 157 ;CHECK: vmlslu32: 158 ;CHECK: vmlsl.u32 159 %tmp1 = load <2 x i64>* %A 160 %tmp2 = load <2 x i32>* %B 161 %tmp3 = load <2 x i32>* %C 162 %tmp4 = zext <2 x i32> %tmp2 to <2 x i64> 163 %tmp5 = zext <2 x i32> %tmp3 to <2 x i64> 164 %tmp6 = mul <2 x i64> %tmp4, %tmp5 165 %tmp7 = sub <2 x i64> %tmp1, %tmp6 166 ret <2 x i64> %tmp7 167 } 168 169 define arm_aapcs_vfpcc <4 x i32> @test_vmlsl_lanes16(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %arg2_int16x4_t) nounwind readnone { 170 entry: 171 ; CHECK: test_vmlsl_lanes16 172 ; CHECK: vmlsl.s16 q0, d2, d3[1] 173 %0 = shufflevector <4 x i16> %arg2_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1] 174 %1 = sext <4 x i16> %arg1_int16x4_t to <4 x i32> 175 %2 = sext <4 x i16> %0 to <4 x i32> 176 %3 = mul <4 x i32> %1, %2 177 %4 = sub <4 x i32> %arg0_int32x4_t, %3 178 ret <4 x i32> %4 179 } 180 181 define arm_aapcs_vfpcc <2 x i64> @test_vmlsl_lanes32(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %arg2_int32x2_t) nounwind readnone { 182 entry: 183 ; CHECK: test_vmlsl_lanes32 184 ; CHECK: vmlsl.s32 q0, d2, d3[1] 185 %0 = shufflevector <2 x i32> %arg2_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1] 186 %1 = sext <2 x i32> %arg1_int32x2_t to <2 x i64> 187 %2 = sext <2 x i32> %0 to <2 x i64> 188 %3 = mul <2 x i64> %1, %2 189 %4 = sub <2 x i64> %arg0_int64x2_t, %3 190 ret <2 x i64> %4 191 } 192 193 define arm_aapcs_vfpcc <4 x i32> @test_vmlsl_laneu16(<4 x i32> %arg0_uint32x4_t, <4 x i16> %arg1_uint16x4_t, <4 x i16> %arg2_uint16x4_t) nounwind readnone { 194 entry: 195 ; CHECK: test_vmlsl_laneu16 196 ; CHECK: vmlsl.u16 q0, d2, d3[1] 197 %0 = shufflevector <4 x i16> %arg2_uint16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1] 198 %1 = zext <4 x i16> %arg1_uint16x4_t to <4 x i32> 199 %2 = zext <4 x i16> %0 to <4 x i32> 200 %3 = mul <4 x i32> %1, %2 201 %4 = sub <4 x i32> %arg0_uint32x4_t, %3 202 ret <4 x i32> %4 203 } 204 205 define arm_aapcs_vfpcc <2 x i64> @test_vmlsl_laneu32(<2 x i64> %arg0_uint64x2_t, <2 x i32> %arg1_uint32x2_t, <2 x i32> %arg2_uint32x2_t) nounwind readnone { 206 entry: 207 ; CHECK: test_vmlsl_laneu32 208 ; CHECK: vmlsl.u32 q0, d2, d3[1] 209 %0 = shufflevector <2 x i32> %arg2_uint32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1] 210 %1 = zext <2 x i32> %arg1_uint32x2_t to <2 x i64> 211 %2 = zext <2 x i32> %0 to <2 x i64> 212 %3 = mul <2 x i64> %1, %2 213 %4 = sub <2 x i64> %arg0_uint64x2_t, %3 214 ret <2 x i64> %4 215 } 216