1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=arm < %s | FileCheck %s -check-prefix=SOFT-FLOAT 3; RUN: llc -mtriple=arm -mattr=+vfp4d16sp < %s | FileCheck %s -check-prefix=SOFT-FLOAT-VFP32 4; RUN: llc -mtriple=arm -mattr=+vfp4d16sp,+fp64 < %s | FileCheck %s -check-prefix=SOFT-FLOAT-VFP64 5 6define float @fmuladd_intrinsic_f32(float %a, float %b, float %c) #0 { 7; SOFT-FLOAT-LABEL: fmuladd_intrinsic_f32: 8; SOFT-FLOAT: @ %bb.0: 9; SOFT-FLOAT-NEXT: push {r4, lr} 10; SOFT-FLOAT-NEXT: mov r4, r2 11; SOFT-FLOAT-NEXT: bl __mulsf3 12; SOFT-FLOAT-NEXT: mov r1, r4 13; SOFT-FLOAT-NEXT: bl __addsf3 14; SOFT-FLOAT-NEXT: pop {r4, lr} 15; SOFT-FLOAT-NEXT: mov pc, lr 16; 17; SOFT-FLOAT-VFP32-LABEL: fmuladd_intrinsic_f32: 18; SOFT-FLOAT-VFP32: @ %bb.0: 19; SOFT-FLOAT-VFP32-NEXT: push {r4, lr} 20; SOFT-FLOAT-VFP32-NEXT: mov r4, r2 21; SOFT-FLOAT-VFP32-NEXT: bl __mulsf3 22; SOFT-FLOAT-VFP32-NEXT: mov r1, r4 23; SOFT-FLOAT-VFP32-NEXT: bl __addsf3 24; SOFT-FLOAT-VFP32-NEXT: pop {r4, lr} 25; SOFT-FLOAT-VFP32-NEXT: mov pc, lr 26; 27; SOFT-FLOAT-VFP64-LABEL: fmuladd_intrinsic_f32: 28; SOFT-FLOAT-VFP64: @ %bb.0: 29; SOFT-FLOAT-VFP64-NEXT: push {r4, lr} 30; SOFT-FLOAT-VFP64-NEXT: mov r4, r2 31; SOFT-FLOAT-VFP64-NEXT: bl __mulsf3 32; SOFT-FLOAT-VFP64-NEXT: mov r1, r4 33; SOFT-FLOAT-VFP64-NEXT: bl __addsf3 34; SOFT-FLOAT-VFP64-NEXT: pop {r4, lr} 35; SOFT-FLOAT-VFP64-NEXT: mov pc, lr 36 %result = call float @llvm.fmuladd.f32(float %a, float %b, float %c) 37 ret float %result 38} 39 40define double @fmuladd_intrinsic_f64(double %a, double %b, double %c) #0 { 41; SOFT-FLOAT-LABEL: fmuladd_intrinsic_f64: 42; SOFT-FLOAT: @ %bb.0: 43; SOFT-FLOAT-NEXT: push {r11, lr} 44; SOFT-FLOAT-NEXT: bl __muldf3 45; SOFT-FLOAT-NEXT: ldr r2, [sp, #8] 46; SOFT-FLOAT-NEXT: ldr r3, [sp, #12] 47; SOFT-FLOAT-NEXT: bl __adddf3 48; SOFT-FLOAT-NEXT: pop {r11, lr} 49; SOFT-FLOAT-NEXT: mov pc, lr 50; 51; SOFT-FLOAT-VFP32-LABEL: fmuladd_intrinsic_f64: 52; SOFT-FLOAT-VFP32: @ %bb.0: 53; SOFT-FLOAT-VFP32-NEXT: push {r11, lr} 54; SOFT-FLOAT-VFP32-NEXT: bl __muldf3 55; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #8] 56; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #12] 57; SOFT-FLOAT-VFP32-NEXT: bl __adddf3 58; SOFT-FLOAT-VFP32-NEXT: pop {r11, lr} 59; SOFT-FLOAT-VFP32-NEXT: mov pc, lr 60; 61; SOFT-FLOAT-VFP64-LABEL: fmuladd_intrinsic_f64: 62; SOFT-FLOAT-VFP64: @ %bb.0: 63; SOFT-FLOAT-VFP64-NEXT: push {r11, lr} 64; SOFT-FLOAT-VFP64-NEXT: bl __muldf3 65; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #8] 66; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #12] 67; SOFT-FLOAT-VFP64-NEXT: bl __adddf3 68; SOFT-FLOAT-VFP64-NEXT: pop {r11, lr} 69; SOFT-FLOAT-VFP64-NEXT: mov pc, lr 70 %result = call double @llvm.fmuladd.f64(double %a, double %b, double %c) 71 ret double %result 72} 73 74define float @fmuladd_contract_f32(float %a, float %b, float %c) #0 { 75; SOFT-FLOAT-LABEL: fmuladd_contract_f32: 76; SOFT-FLOAT: @ %bb.0: 77; SOFT-FLOAT-NEXT: push {r4, lr} 78; SOFT-FLOAT-NEXT: mov r4, r2 79; SOFT-FLOAT-NEXT: bl __mulsf3 80; SOFT-FLOAT-NEXT: mov r1, r4 81; SOFT-FLOAT-NEXT: bl __addsf3 82; SOFT-FLOAT-NEXT: pop {r4, lr} 83; SOFT-FLOAT-NEXT: mov pc, lr 84; 85; SOFT-FLOAT-VFP32-LABEL: fmuladd_contract_f32: 86; SOFT-FLOAT-VFP32: @ %bb.0: 87; SOFT-FLOAT-VFP32-NEXT: push {r4, lr} 88; SOFT-FLOAT-VFP32-NEXT: mov r4, r2 89; SOFT-FLOAT-VFP32-NEXT: bl __mulsf3 90; SOFT-FLOAT-VFP32-NEXT: mov r1, r4 91; SOFT-FLOAT-VFP32-NEXT: bl __addsf3 92; SOFT-FLOAT-VFP32-NEXT: pop {r4, lr} 93; SOFT-FLOAT-VFP32-NEXT: mov pc, lr 94; 95; SOFT-FLOAT-VFP64-LABEL: fmuladd_contract_f32: 96; SOFT-FLOAT-VFP64: @ %bb.0: 97; SOFT-FLOAT-VFP64-NEXT: push {r4, lr} 98; SOFT-FLOAT-VFP64-NEXT: mov r4, r2 99; SOFT-FLOAT-VFP64-NEXT: bl __mulsf3 100; SOFT-FLOAT-VFP64-NEXT: mov r1, r4 101; SOFT-FLOAT-VFP64-NEXT: bl __addsf3 102; SOFT-FLOAT-VFP64-NEXT: pop {r4, lr} 103; SOFT-FLOAT-VFP64-NEXT: mov pc, lr 104 %product = fmul contract float %a, %b 105 %result = fadd contract float %product, %c 106 ret float %result 107} 108 109define double @fmuladd_contract_f64(double %a, double %b, double %c) #0 { 110; SOFT-FLOAT-LABEL: fmuladd_contract_f64: 111; SOFT-FLOAT: @ %bb.0: 112; SOFT-FLOAT-NEXT: push {r11, lr} 113; SOFT-FLOAT-NEXT: bl __muldf3 114; SOFT-FLOAT-NEXT: ldr r2, [sp, #8] 115; SOFT-FLOAT-NEXT: ldr r3, [sp, #12] 116; SOFT-FLOAT-NEXT: bl __adddf3 117; SOFT-FLOAT-NEXT: pop {r11, lr} 118; SOFT-FLOAT-NEXT: mov pc, lr 119; 120; SOFT-FLOAT-VFP32-LABEL: fmuladd_contract_f64: 121; SOFT-FLOAT-VFP32: @ %bb.0: 122; SOFT-FLOAT-VFP32-NEXT: push {r11, lr} 123; SOFT-FLOAT-VFP32-NEXT: bl __muldf3 124; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #8] 125; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #12] 126; SOFT-FLOAT-VFP32-NEXT: bl __adddf3 127; SOFT-FLOAT-VFP32-NEXT: pop {r11, lr} 128; SOFT-FLOAT-VFP32-NEXT: mov pc, lr 129; 130; SOFT-FLOAT-VFP64-LABEL: fmuladd_contract_f64: 131; SOFT-FLOAT-VFP64: @ %bb.0: 132; SOFT-FLOAT-VFP64-NEXT: push {r11, lr} 133; SOFT-FLOAT-VFP64-NEXT: bl __muldf3 134; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #8] 135; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #12] 136; SOFT-FLOAT-VFP64-NEXT: bl __adddf3 137; SOFT-FLOAT-VFP64-NEXT: pop {r11, lr} 138; SOFT-FLOAT-VFP64-NEXT: mov pc, lr 139 %product = fmul contract double %a, %b 140 %result = fadd contract double %product, %c 141 ret double %result 142} 143 144define <4 x float> @fmuladd_contract_v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c) #0 { 145; SOFT-FLOAT-LABEL: fmuladd_contract_v4f32: 146; SOFT-FLOAT: @ %bb.0: 147; SOFT-FLOAT-NEXT: push {r4, r5, r6, r7, r11, lr} 148; SOFT-FLOAT-NEXT: mov r7, r1 149; SOFT-FLOAT-NEXT: ldr r1, [sp, #24] 150; SOFT-FLOAT-NEXT: mov r4, r3 151; SOFT-FLOAT-NEXT: mov r6, r2 152; SOFT-FLOAT-NEXT: bl __mulsf3 153; SOFT-FLOAT-NEXT: ldr r1, [sp, #40] 154; SOFT-FLOAT-NEXT: bl __addsf3 155; SOFT-FLOAT-NEXT: ldr r1, [sp, #28] 156; SOFT-FLOAT-NEXT: mov r5, r0 157; SOFT-FLOAT-NEXT: mov r0, r7 158; SOFT-FLOAT-NEXT: bl __mulsf3 159; SOFT-FLOAT-NEXT: ldr r1, [sp, #44] 160; SOFT-FLOAT-NEXT: bl __addsf3 161; SOFT-FLOAT-NEXT: ldr r1, [sp, #32] 162; SOFT-FLOAT-NEXT: mov r7, r0 163; SOFT-FLOAT-NEXT: mov r0, r6 164; SOFT-FLOAT-NEXT: bl __mulsf3 165; SOFT-FLOAT-NEXT: ldr r1, [sp, #48] 166; SOFT-FLOAT-NEXT: bl __addsf3 167; SOFT-FLOAT-NEXT: ldr r1, [sp, #36] 168; SOFT-FLOAT-NEXT: mov r6, r0 169; SOFT-FLOAT-NEXT: mov r0, r4 170; SOFT-FLOAT-NEXT: bl __mulsf3 171; SOFT-FLOAT-NEXT: ldr r1, [sp, #52] 172; SOFT-FLOAT-NEXT: bl __addsf3 173; SOFT-FLOAT-NEXT: mov r3, r0 174; SOFT-FLOAT-NEXT: mov r0, r5 175; SOFT-FLOAT-NEXT: mov r1, r7 176; SOFT-FLOAT-NEXT: mov r2, r6 177; SOFT-FLOAT-NEXT: pop {r4, r5, r6, r7, r11, lr} 178; SOFT-FLOAT-NEXT: mov pc, lr 179; 180; SOFT-FLOAT-VFP32-LABEL: fmuladd_contract_v4f32: 181; SOFT-FLOAT-VFP32: @ %bb.0: 182; SOFT-FLOAT-VFP32-NEXT: push {r4, r5, r6, r7, r11, lr} 183; SOFT-FLOAT-VFP32-NEXT: mov r7, r1 184; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #24] 185; SOFT-FLOAT-VFP32-NEXT: mov r4, r3 186; SOFT-FLOAT-VFP32-NEXT: mov r6, r2 187; SOFT-FLOAT-VFP32-NEXT: bl __mulsf3 188; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #40] 189; SOFT-FLOAT-VFP32-NEXT: bl __addsf3 190; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #28] 191; SOFT-FLOAT-VFP32-NEXT: mov r5, r0 192; SOFT-FLOAT-VFP32-NEXT: mov r0, r7 193; SOFT-FLOAT-VFP32-NEXT: bl __mulsf3 194; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #44] 195; SOFT-FLOAT-VFP32-NEXT: bl __addsf3 196; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #32] 197; SOFT-FLOAT-VFP32-NEXT: mov r7, r0 198; SOFT-FLOAT-VFP32-NEXT: mov r0, r6 199; SOFT-FLOAT-VFP32-NEXT: bl __mulsf3 200; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #48] 201; SOFT-FLOAT-VFP32-NEXT: bl __addsf3 202; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #36] 203; SOFT-FLOAT-VFP32-NEXT: mov r6, r0 204; SOFT-FLOAT-VFP32-NEXT: mov r0, r4 205; SOFT-FLOAT-VFP32-NEXT: bl __mulsf3 206; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #52] 207; SOFT-FLOAT-VFP32-NEXT: bl __addsf3 208; SOFT-FLOAT-VFP32-NEXT: mov r3, r0 209; SOFT-FLOAT-VFP32-NEXT: mov r0, r5 210; SOFT-FLOAT-VFP32-NEXT: mov r1, r7 211; SOFT-FLOAT-VFP32-NEXT: mov r2, r6 212; SOFT-FLOAT-VFP32-NEXT: pop {r4, r5, r6, r7, r11, lr} 213; SOFT-FLOAT-VFP32-NEXT: mov pc, lr 214; 215; SOFT-FLOAT-VFP64-LABEL: fmuladd_contract_v4f32: 216; SOFT-FLOAT-VFP64: @ %bb.0: 217; SOFT-FLOAT-VFP64-NEXT: push {r4, r5, r6, r7, r11, lr} 218; SOFT-FLOAT-VFP64-NEXT: mov r7, r1 219; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #24] 220; SOFT-FLOAT-VFP64-NEXT: mov r4, r3 221; SOFT-FLOAT-VFP64-NEXT: mov r6, r2 222; SOFT-FLOAT-VFP64-NEXT: bl __mulsf3 223; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #40] 224; SOFT-FLOAT-VFP64-NEXT: bl __addsf3 225; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #28] 226; SOFT-FLOAT-VFP64-NEXT: mov r5, r0 227; SOFT-FLOAT-VFP64-NEXT: mov r0, r7 228; SOFT-FLOAT-VFP64-NEXT: bl __mulsf3 229; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #44] 230; SOFT-FLOAT-VFP64-NEXT: bl __addsf3 231; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #32] 232; SOFT-FLOAT-VFP64-NEXT: mov r7, r0 233; SOFT-FLOAT-VFP64-NEXT: mov r0, r6 234; SOFT-FLOAT-VFP64-NEXT: bl __mulsf3 235; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #48] 236; SOFT-FLOAT-VFP64-NEXT: bl __addsf3 237; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #36] 238; SOFT-FLOAT-VFP64-NEXT: mov r6, r0 239; SOFT-FLOAT-VFP64-NEXT: mov r0, r4 240; SOFT-FLOAT-VFP64-NEXT: bl __mulsf3 241; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #52] 242; SOFT-FLOAT-VFP64-NEXT: bl __addsf3 243; SOFT-FLOAT-VFP64-NEXT: mov r3, r0 244; SOFT-FLOAT-VFP64-NEXT: mov r0, r5 245; SOFT-FLOAT-VFP64-NEXT: mov r1, r7 246; SOFT-FLOAT-VFP64-NEXT: mov r2, r6 247; SOFT-FLOAT-VFP64-NEXT: pop {r4, r5, r6, r7, r11, lr} 248; SOFT-FLOAT-VFP64-NEXT: mov pc, lr 249 %product = fmul contract <4 x float> %a, %b 250 %result = fadd contract <4 x float> %product, %c 251 ret <4 x float> %result 252} 253 254define <4 x double> @fmuladd_contract_v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c) #0 { 255; SOFT-FLOAT-LABEL: fmuladd_contract_v4f64: 256; SOFT-FLOAT: @ %bb.0: 257; SOFT-FLOAT-NEXT: push {r4, r5, r6, lr} 258; SOFT-FLOAT-NEXT: mov r5, r3 259; SOFT-FLOAT-NEXT: mov r6, r2 260; SOFT-FLOAT-NEXT: mov r4, r0 261; SOFT-FLOAT-NEXT: ldr r0, [sp, #32] 262; SOFT-FLOAT-NEXT: ldr r1, [sp, #36] 263; SOFT-FLOAT-NEXT: ldr r2, [sp, #64] 264; SOFT-FLOAT-NEXT: ldr r3, [sp, #68] 265; SOFT-FLOAT-NEXT: bl __muldf3 266; SOFT-FLOAT-NEXT: ldr r2, [sp, #96] 267; SOFT-FLOAT-NEXT: ldr r3, [sp, #100] 268; SOFT-FLOAT-NEXT: bl __adddf3 269; SOFT-FLOAT-NEXT: str r0, [r4, #24] 270; SOFT-FLOAT-NEXT: str r1, [r4, #28] 271; SOFT-FLOAT-NEXT: ldr r0, [sp, #24] 272; SOFT-FLOAT-NEXT: ldr r1, [sp, #28] 273; SOFT-FLOAT-NEXT: ldr r2, [sp, #56] 274; SOFT-FLOAT-NEXT: ldr r3, [sp, #60] 275; SOFT-FLOAT-NEXT: bl __muldf3 276; SOFT-FLOAT-NEXT: ldr r2, [sp, #88] 277; SOFT-FLOAT-NEXT: ldr r3, [sp, #92] 278; SOFT-FLOAT-NEXT: bl __adddf3 279; SOFT-FLOAT-NEXT: str r0, [r4, #16] 280; SOFT-FLOAT-NEXT: str r1, [r4, #20] 281; SOFT-FLOAT-NEXT: ldr r0, [sp, #16] 282; SOFT-FLOAT-NEXT: ldr r1, [sp, #20] 283; SOFT-FLOAT-NEXT: ldr r2, [sp, #48] 284; SOFT-FLOAT-NEXT: ldr r3, [sp, #52] 285; SOFT-FLOAT-NEXT: bl __muldf3 286; SOFT-FLOAT-NEXT: ldr r2, [sp, #80] 287; SOFT-FLOAT-NEXT: ldr r3, [sp, #84] 288; SOFT-FLOAT-NEXT: bl __adddf3 289; SOFT-FLOAT-NEXT: ldr r2, [sp, #40] 290; SOFT-FLOAT-NEXT: ldr r3, [sp, #44] 291; SOFT-FLOAT-NEXT: str r0, [r4, #8] 292; SOFT-FLOAT-NEXT: mov r0, r6 293; SOFT-FLOAT-NEXT: str r1, [r4, #12] 294; SOFT-FLOAT-NEXT: mov r1, r5 295; SOFT-FLOAT-NEXT: bl __muldf3 296; SOFT-FLOAT-NEXT: ldr r2, [sp, #72] 297; SOFT-FLOAT-NEXT: ldr r3, [sp, #76] 298; SOFT-FLOAT-NEXT: bl __adddf3 299; SOFT-FLOAT-NEXT: stm r4, {r0, r1} 300; SOFT-FLOAT-NEXT: pop {r4, r5, r6, lr} 301; SOFT-FLOAT-NEXT: mov pc, lr 302; 303; SOFT-FLOAT-VFP32-LABEL: fmuladd_contract_v4f64: 304; SOFT-FLOAT-VFP32: @ %bb.0: 305; SOFT-FLOAT-VFP32-NEXT: push {r4, r5, r6, lr} 306; SOFT-FLOAT-VFP32-NEXT: mov r5, r3 307; SOFT-FLOAT-VFP32-NEXT: mov r6, r2 308; SOFT-FLOAT-VFP32-NEXT: mov r4, r0 309; SOFT-FLOAT-VFP32-NEXT: ldr r0, [sp, #32] 310; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #36] 311; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #64] 312; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #68] 313; SOFT-FLOAT-VFP32-NEXT: bl __muldf3 314; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #96] 315; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #100] 316; SOFT-FLOAT-VFP32-NEXT: bl __adddf3 317; SOFT-FLOAT-VFP32-NEXT: str r0, [r4, #24] 318; SOFT-FLOAT-VFP32-NEXT: str r1, [r4, #28] 319; SOFT-FLOAT-VFP32-NEXT: ldr r0, [sp, #24] 320; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #28] 321; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #56] 322; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #60] 323; SOFT-FLOAT-VFP32-NEXT: bl __muldf3 324; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #88] 325; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #92] 326; SOFT-FLOAT-VFP32-NEXT: bl __adddf3 327; SOFT-FLOAT-VFP32-NEXT: str r0, [r4, #16] 328; SOFT-FLOAT-VFP32-NEXT: str r1, [r4, #20] 329; SOFT-FLOAT-VFP32-NEXT: ldr r0, [sp, #16] 330; SOFT-FLOAT-VFP32-NEXT: ldr r1, [sp, #20] 331; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #48] 332; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #52] 333; SOFT-FLOAT-VFP32-NEXT: bl __muldf3 334; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #80] 335; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #84] 336; SOFT-FLOAT-VFP32-NEXT: bl __adddf3 337; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #40] 338; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #44] 339; SOFT-FLOAT-VFP32-NEXT: str r0, [r4, #8] 340; SOFT-FLOAT-VFP32-NEXT: mov r0, r6 341; SOFT-FLOAT-VFP32-NEXT: str r1, [r4, #12] 342; SOFT-FLOAT-VFP32-NEXT: mov r1, r5 343; SOFT-FLOAT-VFP32-NEXT: bl __muldf3 344; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #72] 345; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #76] 346; SOFT-FLOAT-VFP32-NEXT: bl __adddf3 347; SOFT-FLOAT-VFP32-NEXT: stm r4, {r0, r1} 348; SOFT-FLOAT-VFP32-NEXT: pop {r4, r5, r6, lr} 349; SOFT-FLOAT-VFP32-NEXT: mov pc, lr 350; 351; SOFT-FLOAT-VFP64-LABEL: fmuladd_contract_v4f64: 352; SOFT-FLOAT-VFP64: @ %bb.0: 353; SOFT-FLOAT-VFP64-NEXT: push {r4, r5, r6, lr} 354; SOFT-FLOAT-VFP64-NEXT: mov r5, r3 355; SOFT-FLOAT-VFP64-NEXT: mov r6, r2 356; SOFT-FLOAT-VFP64-NEXT: mov r4, r0 357; SOFT-FLOAT-VFP64-NEXT: ldr r0, [sp, #32] 358; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #36] 359; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #64] 360; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #68] 361; SOFT-FLOAT-VFP64-NEXT: bl __muldf3 362; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #96] 363; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #100] 364; SOFT-FLOAT-VFP64-NEXT: bl __adddf3 365; SOFT-FLOAT-VFP64-NEXT: str r0, [r4, #24] 366; SOFT-FLOAT-VFP64-NEXT: str r1, [r4, #28] 367; SOFT-FLOAT-VFP64-NEXT: ldr r0, [sp, #24] 368; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #28] 369; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #56] 370; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #60] 371; SOFT-FLOAT-VFP64-NEXT: bl __muldf3 372; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #88] 373; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #92] 374; SOFT-FLOAT-VFP64-NEXT: bl __adddf3 375; SOFT-FLOAT-VFP64-NEXT: str r0, [r4, #16] 376; SOFT-FLOAT-VFP64-NEXT: str r1, [r4, #20] 377; SOFT-FLOAT-VFP64-NEXT: ldr r0, [sp, #16] 378; SOFT-FLOAT-VFP64-NEXT: ldr r1, [sp, #20] 379; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #48] 380; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #52] 381; SOFT-FLOAT-VFP64-NEXT: bl __muldf3 382; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #80] 383; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #84] 384; SOFT-FLOAT-VFP64-NEXT: bl __adddf3 385; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #40] 386; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #44] 387; SOFT-FLOAT-VFP64-NEXT: str r0, [r4, #8] 388; SOFT-FLOAT-VFP64-NEXT: mov r0, r6 389; SOFT-FLOAT-VFP64-NEXT: str r1, [r4, #12] 390; SOFT-FLOAT-VFP64-NEXT: mov r1, r5 391; SOFT-FLOAT-VFP64-NEXT: bl __muldf3 392; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #72] 393; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #76] 394; SOFT-FLOAT-VFP64-NEXT: bl __adddf3 395; SOFT-FLOAT-VFP64-NEXT: stm r4, {r0, r1} 396; SOFT-FLOAT-VFP64-NEXT: pop {r4, r5, r6, lr} 397; SOFT-FLOAT-VFP64-NEXT: mov pc, lr 398 %product = fmul contract <4 x double> %a, %b 399 %result = fadd contract <4 x double> %product, %c 400 ret <4 x double> %result 401} 402 403attributes #0 = { "use-soft-float"="true" } 404 405declare float @llvm.fmuladd.f32(float %a, float %b, float %c) 406declare double @llvm.fmuladd.f64(double %a, double %b, double %c) 407