571 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s --mattr=+mve.fp,+fp64 -o - | FileCheck %s3 4target triple = "thumbv8.1m.main-none-none-eabi"5 6; Expected to transform7define arm_aapcs_vfpcc <4 x float> @mul_mul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {8; CHECK-LABEL: mul_mul:9; CHECK: @ %bb.0: @ %entry10; CHECK-NEXT: vcmul.f32 q3, q0, q1, #011; CHECK-NEXT: vcmla.f32 q3, q0, q1, #9012; CHECK-NEXT: vcmul.f32 q0, q3, q2, #013; CHECK-NEXT: vcmla.f32 q0, q3, q2, #9014; CHECK-NEXT: bx lr15entry:16 %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>17 %strided.vec151 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>18 %strided.vec153 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>19 %strided.vec154 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>20 %0 = fmul fast <2 x float> %strided.vec154, %strided.vec15121 %1 = fmul fast <2 x float> %strided.vec153, %strided.vec22 %2 = fmul fast <2 x float> %strided.vec154, %strided.vec23 %3 = fmul fast <2 x float> %strided.vec153, %strided.vec15124 %4 = fadd fast <2 x float> %3, %225 %5 = fsub fast <2 x float> %1, %026 %strided.vec156 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>27 %strided.vec157 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>28 %6 = fmul fast <2 x float> %4, %strided.vec15629 %7 = fmul fast <2 x float> %5, %strided.vec15730 %8 = fadd fast <2 x float> %6, %731 %9 = fmul fast <2 x float> %strided.vec156, %532 %10 = fmul fast <2 x float> %4, %strided.vec15733 %11 = fsub fast <2 x float> %9, %1034 %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>35 ret <4 x float> %interleaved.vec36}37 38; Expected to not transform39define arm_aapcs_vfpcc <4 x float> @add_mul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {40; CHECK-LABEL: add_mul:41; CHECK: @ %bb.0: @ %entry42; CHECK-NEXT: .vsave {d8, d9}43; CHECK-NEXT: vpush {d8, d9}44; CHECK-NEXT: vsub.f32 q3, q1, q245; CHECK-NEXT: vsub.f32 q0, q1, q046; CHECK-NEXT: vmov.f32 s4, s947; CHECK-NEXT: vmov.f32 s13, s1448; CHECK-NEXT: vmov.f32 s5, s1149; CHECK-NEXT: vmov.f32 s0, s150; CHECK-NEXT: vmul.f32 q4, q3, q151; CHECK-NEXT: vmov.f32 s1, s352; CHECK-NEXT: vmov.f32 s9, s1053; CHECK-NEXT: vfma.f32 q4, q2, q054; CHECK-NEXT: vmul.f32 q0, q1, q055; CHECK-NEXT: vneg.f32 q1, q056; CHECK-NEXT: vmov.f32 s1, s1657; CHECK-NEXT: vfma.f32 q1, q2, q358; CHECK-NEXT: vmov.f32 s3, s1759; CHECK-NEXT: vmov.f32 s0, s460; CHECK-NEXT: vmov.f32 s2, s561; CHECK-NEXT: vpop {d8, d9}62; CHECK-NEXT: bx lr63entry:64 %0 = fsub fast <4 x float> %b, %c65 %1 = shufflevector <4 x float> %0, <4 x float> poison, <2 x i32> <i32 0, i32 2>66 %strided.vec58 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>67 %strided.vec59 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>68 %2 = fmul fast <2 x float> %1, %strided.vec5969 %3 = fsub fast <4 x float> %b, %a70 %4 = shufflevector <4 x float> %3, <4 x float> poison, <2 x i32> <i32 1, i32 3>71 %5 = fmul fast <2 x float> %strided.vec58, %472 %6 = fadd fast <2 x float> %5, %273 %7 = fmul fast <2 x float> %strided.vec58, %174 %8 = fmul fast <2 x float> %strided.vec59, %475 %9 = fsub fast <2 x float> %7, %876 %interleaved.vec = shufflevector <2 x float> %9, <2 x float> %6, <4 x i32> <i32 0, i32 2, i32 1, i32 3>77 ret <4 x float> %interleaved.vec78}79 80; Expected to not transform81define arm_aapcs_vfpcc <4 x float> @mul_mul270_mul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {82; CHECK-LABEL: mul_mul270_mul:83; CHECK: @ %bb.0: @ %entry84; CHECK-NEXT: .vsave {d8, d9, d10}85; CHECK-NEXT: vpush {d8, d9, d10}86; CHECK-NEXT: vmov.f32 s16, s887; CHECK-NEXT: vmov.f32 s20, s488; CHECK-NEXT: vmov.f32 s17, s1089; CHECK-NEXT: vmov.f32 s21, s690; CHECK-NEXT: vmul.f32 q3, q5, q491; CHECK-NEXT: vmov.f32 s4, s592; CHECK-NEXT: vmov.f32 s5, s793; CHECK-NEXT: vneg.f32 q3, q394; CHECK-NEXT: vmov.f32 s8, s995; CHECK-NEXT: vmul.f32 q4, q1, q496; CHECK-NEXT: vmov.f32 s9, s1197; CHECK-NEXT: vfma.f32 q3, q1, q298; CHECK-NEXT: vfma.f32 q4, q5, q299; CHECK-NEXT: vmov.f32 s8, s0100; CHECK-NEXT: vmov.f32 s9, s2101; CHECK-NEXT: vmov.f32 s0, s1102; CHECK-NEXT: vmul.f32 q1, q3, q2103; CHECK-NEXT: vmov.f32 s1, s3104; CHECK-NEXT: vfma.f32 q1, q4, q0105; CHECK-NEXT: vmul.f32 q0, q3, q0106; CHECK-NEXT: vneg.f32 q3, q0107; CHECK-NEXT: vmov.f32 s1, s4108; CHECK-NEXT: vfma.f32 q3, q4, q2109; CHECK-NEXT: vmov.f32 s3, s5110; CHECK-NEXT: vmov.f32 s0, s12111; CHECK-NEXT: vmov.f32 s2, s13112; CHECK-NEXT: vpop {d8, d9, d10}113; CHECK-NEXT: bx lr114entry:115 %strided.vec = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>116 %strided.vec81 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>117 %strided.vec83 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>118 %strided.vec84 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>119 %0 = fmul fast <2 x float> %strided.vec84, %strided.vec120 %1 = fmul fast <2 x float> %strided.vec83, %strided.vec81121 %2 = fadd fast <2 x float> %1, %0122 %strided.vec86 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>123 %strided.vec87 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>124 %3 = fmul fast <2 x float> %2, %strided.vec87125 %4 = fmul fast <2 x float> %strided.vec84, %strided.vec81126 %5 = fmul fast <2 x float> %strided.vec83, %strided.vec127 %6 = fsub fast <2 x float> %4, %5128 %7 = fmul fast <2 x float> %6, %strided.vec86129 %8 = fadd fast <2 x float> %3, %7130 %9 = fmul fast <2 x float> %2, %strided.vec86131 %10 = fmul fast <2 x float> %6, %strided.vec87132 %11 = fsub fast <2 x float> %9, %10133 %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>134 ret <4 x float> %interleaved.vec135}136 137; (a * b) * a138; Expected to transform139define arm_aapcs_vfpcc <4 x float> @mul_triangle(<4 x float> %a, <4 x float> %b) {140; CHECK-LABEL: mul_triangle:141; CHECK: @ %bb.0: @ %entry142; CHECK-NEXT: vcmul.f32 q2, q1, q0, #0143; CHECK-NEXT: vcmla.f32 q2, q1, q0, #90144; CHECK-NEXT: vcmul.f32 q1, q0, q2, #0145; CHECK-NEXT: vcmla.f32 q1, q0, q2, #90146; CHECK-NEXT: vmov q0, q1147; CHECK-NEXT: bx lr148entry:149 %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>150 %strided.vec35 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>151 %strided.vec37 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>152 %strided.vec38 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>153 %0 = fmul fast <2 x float> %strided.vec37, %strided.vec154 %1 = fmul fast <2 x float> %strided.vec38, %strided.vec35155 %2 = fsub fast <2 x float> %0, %1156 %3 = fmul fast <2 x float> %2, %strided.vec35157 %4 = fmul fast <2 x float> %strided.vec38, %strided.vec158 %5 = fmul fast <2 x float> %strided.vec35, %strided.vec37159 %6 = fadd fast <2 x float> %4, %5160 %7 = fmul fast <2 x float> %6, %strided.vec161 %8 = fadd fast <2 x float> %3, %7162 %9 = fmul fast <2 x float> %2, %strided.vec163 %10 = fmul fast <2 x float> %6, %strided.vec35164 %11 = fsub fast <2 x float> %9, %10165 %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>166 ret <4 x float> %interleaved.vec167}168 169 170; d * (b * a) * (c * a)171; Expected to transform172define arm_aapcs_vfpcc <4 x float> @mul_diamond(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {173; CHECK-LABEL: mul_diamond:174; CHECK: @ %bb.0: @ %entry175; CHECK-NEXT: .vsave {d8, d9}176; CHECK-NEXT: vpush {d8, d9}177; CHECK-NEXT: vcmul.f32 q4, q1, q0, #0178; CHECK-NEXT: vcmla.f32 q4, q1, q0, #90179; CHECK-NEXT: vcmul.f32 q1, q4, q3, #0180; CHECK-NEXT: vcmla.f32 q1, q4, q3, #90181; CHECK-NEXT: vcmul.f32 q3, q2, q0, #0182; CHECK-NEXT: vcmla.f32 q3, q2, q0, #90183; CHECK-NEXT: vcmul.f32 q0, q3, q1, #0184; CHECK-NEXT: vcmla.f32 q0, q3, q1, #90185; CHECK-NEXT: vpop {d8, d9}186; CHECK-NEXT: bx lr187entry:188 %a.real = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>189 %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>190 %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>191 %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>192 %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>193 %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>194 %d.real = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 0, i32 2>195 %d.imag = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 1, i32 3>196 %0 = fmul fast <2 x float> %a.imag, %b.real197 %1 = fmul fast <2 x float> %a.real, %b.imag198 %2 = fadd fast <2 x float> %1, %0199 %3 = fmul fast <2 x float> %a.real, %b.real200 %4 = fmul fast <2 x float> %b.imag, %a.imag201 %5 = fsub fast <2 x float> %3, %4202 %6 = fmul fast <2 x float> %d.real, %5203 %7 = fmul fast <2 x float> %2, %d.imag204 %8 = fmul fast <2 x float> %d.real, %2205 %9 = fmul fast <2 x float> %5, %d.imag206 %10 = fsub fast <2 x float> %6, %7207 %11 = fadd fast <2 x float> %8, %9208 %12 = fmul fast <2 x float> %c.real, %a.imag209 %13 = fmul fast <2 x float> %c.imag, %a.real210 %14 = fadd fast <2 x float> %13, %12211 %15 = fmul fast <2 x float> %14, %10212 %16 = fmul fast <2 x float> %c.real, %a.real213 %17 = fmul fast <2 x float> %c.imag, %a.imag214 %18 = fsub fast <2 x float> %16, %17215 %19 = fmul fast <2 x float> %18, %11216 %20 = fadd fast <2 x float> %15, %19217 %21 = fmul fast <2 x float> %18, %10218 %22 = fmul fast <2 x float> %14, %11219 %23 = fsub fast <2 x float> %21, %22220 %interleaved.vec = shufflevector <2 x float> %23, <2 x float> %20, <4 x i32> <i32 0, i32 2, i32 1, i32 3>221 ret <4 x float> %interleaved.vec222}223 224; Expected to transform225define arm_aapcs_vfpcc <4 x float> @mul_add90_mul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {226; CHECK-LABEL: mul_add90_mul:227; CHECK: @ %bb.0: @ %entry228; CHECK-NEXT: .vsave {d8, d9}229; CHECK-NEXT: vpush {d8, d9}230; CHECK-NEXT: vcmul.f32 q3, q2, q0, #0231; CHECK-NEXT: vcmul.f32 q4, q1, q0, #0232; CHECK-NEXT: vcmla.f32 q4, q1, q0, #90233; CHECK-NEXT: vcmla.f32 q3, q2, q0, #90234; CHECK-NEXT: vcadd.f32 q0, q3, q4, #90235; CHECK-NEXT: vpop {d8, d9}236; CHECK-NEXT: bx lr237entry:238 %ar = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>239 %ai = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>240 %br = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>241 %bi = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>242 %cr = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>243 %ci = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>244 245 %i6 = fmul fast <2 x float> %br, %ar246 %i7 = fmul fast <2 x float> %bi, %ai247 %xr = fsub fast <2 x float> %i6, %i7248 %i9 = fmul fast <2 x float> %bi, %ar249 %i10 = fmul fast <2 x float> %br, %ai250 %xi = fadd fast <2 x float> %i9, %i10251 252 %j6 = fmul fast <2 x float> %cr, %ar253 %j7 = fmul fast <2 x float> %ci, %ai254 %yr = fsub fast <2 x float> %j6, %j7255 %j9 = fmul fast <2 x float> %ci, %ar256 %j10 = fmul fast <2 x float> %cr, %ai257 %yi = fadd fast <2 x float> %j9, %j10258 259 %zr = fsub fast <2 x float> %yr, %xi260 %zi = fadd fast <2 x float> %yi, %xr261 %interleaved.vec = shufflevector <2 x float> %zr, <2 x float> %zi, <4 x i32> <i32 0, i32 2, i32 1, i32 3>262 ret <4 x float> %interleaved.vec263}264 265; Expected to not transform266define arm_aapcs_vfpcc <4 x float> @mul_triangle_addmul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {267; CHECK-LABEL: mul_triangle_addmul:268; CHECK: @ %bb.0: @ %entry269; CHECK-NEXT: .vsave {d8, d9, d10, d11, d12, d13, d14, d15}270; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13, d14, d15}271; CHECK-NEXT: vmov.f32 s16, s0272; CHECK-NEXT: vmov.f32 s20, s5273; CHECK-NEXT: vmov.f32 s17, s2274; CHECK-NEXT: vmov.f32 s21, s7275; CHECK-NEXT: vmov.f32 s5, s6276; CHECK-NEXT: vmul.f32 q3, q5, q4277; CHECK-NEXT: vmul.f32 q4, q1, q4278; CHECK-NEXT: vmov.f32 s0, s1279; CHECK-NEXT: vmov.f32 s1, s3280; CHECK-NEXT: vmov q6, q4281; CHECK-NEXT: vfms.f32 q6, q5, q0282; CHECK-NEXT: vmov q7, q3283; CHECK-NEXT: vfma.f32 q3, q1, q0284; CHECK-NEXT: vmov.f32 s20, s8285; CHECK-NEXT: vmov.f32 s21, s10286; CHECK-NEXT: vmov.f32 s4, s9287; CHECK-NEXT: vfma.f32 q7, q5, q0288; CHECK-NEXT: vmov.f32 s5, s11289; CHECK-NEXT: vadd.f32 q5, q7, q6290; CHECK-NEXT: vfms.f32 q4, q1, q0291; CHECK-NEXT: vmov.f32 s1, s20292; CHECK-NEXT: vsub.f32 q1, q4, q3293; CHECK-NEXT: vmov.f32 s3, s21294; CHECK-NEXT: vmov.f32 s0, s4295; CHECK-NEXT: vmov.f32 s2, s5296; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13, d14, d15}297; CHECK-NEXT: bx lr298entry:299 %ar = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>300 %ai = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>301 %br = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>302 %bi = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>303 %cr = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>304 %ci = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>305 306 %i6 = fmul fast <2 x float> %br, %ar307 %i7 = fmul fast <2 x float> %bi, %ai308 %xr = fsub fast <2 x float> %i6, %i7309 %i9 = fmul fast <2 x float> %bi, %ar310 %i10 = fmul fast <2 x float> %br, %ai311 %xi = fadd fast <2 x float> %i9, %i10312 313 ;%j6 = fmul fast <2 x float> %cr, %ar314 %j7 = fmul fast <2 x float> %ci, %ai315 %yr = fsub fast <2 x float> %i6, %j7316 ;%j9 = fmul fast <2 x float> %ci, %ar317 %j10 = fmul fast <2 x float> %cr, %ai318 %yi = fadd fast <2 x float> %i9, %j10319 320 %zr = fsub fast <2 x float> %yr, %xi321 %zi = fadd fast <2 x float> %yi, %xr322 %interleaved.vec = shufflevector <2 x float> %zr, <2 x float> %zi, <4 x i32> <i32 0, i32 2, i32 1, i32 3>323 ret <4 x float> %interleaved.vec324}325 326; Expected to not transform327define arm_aapcs_vfpcc <4 x float> @mul_triangle_multiuses(<4 x float> %a, <4 x float> %b, ptr %p) {328; CHECK-LABEL: mul_triangle_multiuses:329; CHECK: @ %bb.0: @ %entry330; CHECK-NEXT: .vsave {d8, d9}331; CHECK-NEXT: vpush {d8, d9}332; CHECK-NEXT: vmov.f32 s16, s4333; CHECK-NEXT: vmov.f32 s8, s1334; CHECK-NEXT: vmov.f32 s17, s6335; CHECK-NEXT: vmov.f32 s9, s3336; CHECK-NEXT: vmov.f32 s4, s5337; CHECK-NEXT: vmul.f32 q3, q2, q4338; CHECK-NEXT: vmov.f32 s1, s2339; CHECK-NEXT: vmov.f32 s5, s7340; CHECK-NEXT: vfma.f32 q3, q1, q0341; CHECK-NEXT: vmul.f32 q1, q1, q2342; CHECK-NEXT: vneg.f32 q1, q1343; CHECK-NEXT: vfma.f32 q1, q4, q0344; CHECK-NEXT: vmov.f32 s18, s12345; CHECK-NEXT: vmov.f32 s16, s4346; CHECK-NEXT: vmov.f32 s17, s5347; CHECK-NEXT: vmov.f32 s19, s13348; CHECK-NEXT: vstrw.32 q4, [r0]349; CHECK-NEXT: vmul.f32 q4, q3, q0350; CHECK-NEXT: vfma.f32 q4, q1, q2351; CHECK-NEXT: vmul.f32 q2, q3, q2352; CHECK-NEXT: vneg.f32 q2, q2353; CHECK-NEXT: vfma.f32 q2, q1, q0354; CHECK-NEXT: vmov.f32 s1, s16355; CHECK-NEXT: vmov.f32 s0, s8356; CHECK-NEXT: vmov.f32 s2, s9357; CHECK-NEXT: vmov.f32 s3, s17358; CHECK-NEXT: vpop {d8, d9}359; CHECK-NEXT: bx lr360entry:361 %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>362 %strided.vec35 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>363 %strided.vec37 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>364 %strided.vec38 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>365 %0 = fmul fast <2 x float> %strided.vec37, %strided.vec366 %1 = fmul fast <2 x float> %strided.vec38, %strided.vec35367 %2 = fsub fast <2 x float> %0, %1368 %3 = fmul fast <2 x float> %2, %strided.vec35369 %4 = fmul fast <2 x float> %strided.vec38, %strided.vec370 %5 = fmul fast <2 x float> %strided.vec35, %strided.vec37371 %6 = fadd fast <2 x float> %4, %5372 %otheruse = shufflevector <2 x float> %2, <2 x float> %6, <4 x i32> <i32 0, i32 1, i32 2, i32 3>373 store <4 x float> %otheruse, ptr %p374 %7 = fmul fast <2 x float> %6, %strided.vec375 %8 = fadd fast <2 x float> %3, %7376 %9 = fmul fast <2 x float> %2, %strided.vec377 %10 = fmul fast <2 x float> %6, %strided.vec35378 %11 = fsub fast <2 x float> %9, %10379 %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>380 ret <4 x float> %interleaved.vec381}382 383; Expected to transform384define <4 x float> @mul_addequal(<4 x float> %a, <4 x float> %b, <4 x float> %c) {385; CHECK-LABEL: mul_addequal:386; CHECK: @ %bb.0: @ %entry387; CHECK-NEXT: add.w r12, sp, #16388; CHECK-NEXT: vmov d0, r0, r1389; CHECK-NEXT: mov r0, sp390; CHECK-NEXT: vldrw.u32 q2, [r12]391; CHECK-NEXT: vldrw.u32 q1, [r0]392; CHECK-NEXT: vmov d1, r2, r3393; CHECK-NEXT: vcmla.f32 q2, q0, q1, #0394; CHECK-NEXT: vcmla.f32 q2, q0, q1, #90395; CHECK-NEXT: vmov r0, r1, d4396; CHECK-NEXT: vmov r2, r3, d5397; CHECK-NEXT: bx lr398entry:399 %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>400 %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>401 %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>402 %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>403 %0 = fmul fast <2 x float> %b.imag, %strided.vec404 %1 = fmul fast <2 x float> %b.real, %a.imag405 %2 = fadd fast <2 x float> %1, %0406 %3 = fmul fast <2 x float> %b.real, %strided.vec407 %4 = fmul fast <2 x float> %a.imag, %b.imag408 %5 = fsub fast <2 x float> %3, %4409 %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>410 %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>411 %6 = fadd fast <2 x float> %5, %c.real412 %7 = fadd fast <2 x float> %2, %c.imag413 %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>414 ret <4 x float> %interleaved.vec415}416 417; Expected to transform418define <4 x float> @mul_subequal(<4 x float> %a, <4 x float> %b, <4 x float> %c) {419; CHECK-LABEL: mul_subequal:420; CHECK: @ %bb.0: @ %entry421; CHECK-NEXT: vmov d0, r0, r1422; CHECK-NEXT: mov r1, sp423; CHECK-NEXT: vldrw.u32 q2, [r1]424; CHECK-NEXT: vmov d1, r2, r3425; CHECK-NEXT: add r0, sp, #16426; CHECK-NEXT: vcmul.f32 q3, q0, q2, #0427; CHECK-NEXT: vldrw.u32 q1, [r0]428; CHECK-NEXT: vcmla.f32 q3, q0, q2, #90429; CHECK-NEXT: vsub.f32 q0, q3, q1430; CHECK-NEXT: vmov r0, r1, d0431; CHECK-NEXT: vmov r2, r3, d1432; CHECK-NEXT: bx lr433entry:434 %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>435 %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>436 %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>437 %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>438 %0 = fmul fast <2 x float> %b.imag, %strided.vec439 %1 = fmul fast <2 x float> %b.real, %a.imag440 %2 = fadd fast <2 x float> %1, %0441 %3 = fmul fast <2 x float> %b.real, %strided.vec442 %4 = fmul fast <2 x float> %a.imag, %b.imag443 %5 = fsub fast <2 x float> %3, %4444 %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>445 %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>446 %6 = fsub fast <2 x float> %5, %c.real447 %7 = fsub fast <2 x float> %2, %c.imag448 %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>449 ret <4 x float> %interleaved.vec450}451 452 453; Expected to transform454define <4 x float> @mul_mulequal(<4 x float> %a, <4 x float> %b, <4 x float> %c) {455; CHECK-LABEL: mul_mulequal:456; CHECK: @ %bb.0: @ %entry457; CHECK-NEXT: vmov d0, r0, r1458; CHECK-NEXT: mov r1, sp459; CHECK-NEXT: vldrw.u32 q2, [r1]460; CHECK-NEXT: vmov d1, r2, r3461; CHECK-NEXT: add r0, sp, #16462; CHECK-NEXT: vcmul.f32 q3, q0, q2, #0463; CHECK-NEXT: vldrw.u32 q1, [r0]464; CHECK-NEXT: vcmla.f32 q3, q0, q2, #90465; CHECK-NEXT: vmul.f32 q0, q3, q1466; CHECK-NEXT: vmov r0, r1, d0467; CHECK-NEXT: vmov r2, r3, d1468; CHECK-NEXT: bx lr469entry:470 %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>471 %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>472 %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>473 %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>474 %0 = fmul fast <2 x float> %b.imag, %strided.vec475 %1 = fmul fast <2 x float> %b.real, %a.imag476 %2 = fadd fast <2 x float> %1, %0477 %3 = fmul fast <2 x float> %b.real, %strided.vec478 %4 = fmul fast <2 x float> %a.imag, %b.imag479 %5 = fsub fast <2 x float> %3, %4480 %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>481 %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>482 %6 = fmul fast <2 x float> %5, %c.real483 %7 = fmul fast <2 x float> %2, %c.imag484 %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>485 ret <4 x float> %interleaved.vec486}487 488; Expected to not transform489define <4 x float> @mul_divequal(<4 x float> %a, <4 x float> %b, <4 x float> %c) {490; CHECK-LABEL: mul_divequal:491; CHECK: @ %bb.0: @ %entry492; CHECK-NEXT: .vsave {d10, d11}493; CHECK-NEXT: vpush {d10, d11}494; CHECK-NEXT: .vsave {d8}495; CHECK-NEXT: vpush {d8}496; CHECK-NEXT: vmov d0, r0, r1497; CHECK-NEXT: add r0, sp, #24498; CHECK-NEXT: vldrw.u32 q1, [r0]499; CHECK-NEXT: vmov d1, r2, r3500; CHECK-NEXT: vmov.f32 s16, s1501; CHECK-NEXT: add.w r12, sp, #40502; CHECK-NEXT: vmov.f32 s12, s5503; CHECK-NEXT: vmov.f32 s13, s7504; CHECK-NEXT: vmov.f32 s1, s2505; CHECK-NEXT: vmov.f32 s8, s4506; CHECK-NEXT: vmul.f32 q5, q3, q0507; CHECK-NEXT: vmov.f32 s9, s6508; CHECK-NEXT: vldrw.u32 q1, [r12]509; CHECK-NEXT: vmov.f32 s17, s3510; CHECK-NEXT: vfma.f32 q5, q2, q4511; CHECK-NEXT: vmul.f32 q3, q4, q3512; CHECK-NEXT: vdiv.f32 s3, s21, s7513; CHECK-NEXT: vneg.f32 q3, q3514; CHECK-NEXT: vfma.f32 q3, q2, q0515; CHECK-NEXT: vdiv.f32 s1, s20, s5516; CHECK-NEXT: vdiv.f32 s2, s13, s6517; CHECK-NEXT: vdiv.f32 s0, s12, s4518; CHECK-NEXT: vmov r0, r1, d0519; CHECK-NEXT: vmov r2, r3, d1520; CHECK-NEXT: vpop {d8}521; CHECK-NEXT: vpop {d10, d11}522; CHECK-NEXT: bx lr523entry:524 %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>525 %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>526 %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>527 %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>528 %0 = fmul fast <2 x float> %b.imag, %strided.vec529 %1 = fmul fast <2 x float> %b.real, %a.imag530 %2 = fadd fast <2 x float> %1, %0531 %3 = fmul fast <2 x float> %b.real, %strided.vec532 %4 = fmul fast <2 x float> %a.imag, %b.imag533 %5 = fsub fast <2 x float> %3, %4534 %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>535 %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>536 %6 = fdiv fast <2 x float> %5, %c.real537 %7 = fdiv fast <2 x float> %2, %c.imag538 %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>539 ret <4 x float> %interleaved.vec540}541 542; Expected to transform543define <4 x float> @mul_negequal(<4 x float> %a, <4 x float> %b) {544; CHECK-LABEL: mul_negequal:545; CHECK: @ %bb.0: @ %entry546; CHECK-NEXT: vmov d0, r0, r1547; CHECK-NEXT: mov r0, sp548; CHECK-NEXT: vldrw.u32 q1, [r0]549; CHECK-NEXT: vmov d1, r2, r3550; CHECK-NEXT: vcmul.f32 q2, q0, q1, #180551; CHECK-NEXT: vcmla.f32 q2, q0, q1, #270552; CHECK-NEXT: vmov r0, r1, d4553; CHECK-NEXT: vmov r2, r3, d5554; CHECK-NEXT: bx lr555entry:556 %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>557 %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>558 %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>559 %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>560 %0 = fmul fast <2 x float> %b.imag, %strided.vec561 %1 = fmul fast <2 x float> %b.real, %a.imag562 %2 = fadd fast <2 x float> %1, %0563 %3 = fmul fast <2 x float> %b.real, %strided.vec564 %4 = fmul fast <2 x float> %a.imag, %b.imag565 %5 = fsub fast <2 x float> %3, %4566 %6 = fneg fast <2 x float> %5567 %7 = fneg fast <2 x float> %2568 %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>569 ret <4 x float> %interleaved.vec570}571