1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=s390x-linux < %s | FileCheck %s -check-prefix=SOFT-FLOAT 3 4define float @fmuladd_intrinsic_f32(float %a, float %b, float %c) #0 { 5; SOFT-FLOAT-LABEL: fmuladd_intrinsic_f32: 6; SOFT-FLOAT: # %bb.0: 7; SOFT-FLOAT-NEXT: stmg %r13, %r15, 104(%r15) 8; SOFT-FLOAT-NEXT: .cfi_offset %r13, -56 9; SOFT-FLOAT-NEXT: .cfi_offset %r14, -48 10; SOFT-FLOAT-NEXT: .cfi_offset %r15, -40 11; SOFT-FLOAT-NEXT: aghi %r15, -160 12; SOFT-FLOAT-NEXT: .cfi_def_cfa_offset 320 13; SOFT-FLOAT-NEXT: llgfr %r2, %r2 14; SOFT-FLOAT-NEXT: llgfr %r3, %r3 15; SOFT-FLOAT-NEXT: lr %r13, %r4 16; SOFT-FLOAT-NEXT: brasl %r14, __mulsf3@PLT 17; SOFT-FLOAT-NEXT: llgfr %r3, %r13 18; SOFT-FLOAT-NEXT: brasl %r14, __addsf3@PLT 19; SOFT-FLOAT-NEXT: # kill: def $r2l killed $r2l killed $r2d 20; SOFT-FLOAT-NEXT: lmg %r13, %r15, 264(%r15) 21; SOFT-FLOAT-NEXT: br %r14 22 %result = call float @llvm.fmuladd.f32(float %a, float %b, float %c) 23 ret float %result 24} 25 26define double @fmuladd_intrinsic_f64(double %a, double %b, double %c) #0 { 27; SOFT-FLOAT-LABEL: fmuladd_intrinsic_f64: 28; SOFT-FLOAT: # %bb.0: 29; SOFT-FLOAT-NEXT: stmg %r13, %r15, 104(%r15) 30; SOFT-FLOAT-NEXT: .cfi_offset %r13, -56 31; SOFT-FLOAT-NEXT: .cfi_offset %r14, -48 32; SOFT-FLOAT-NEXT: .cfi_offset %r15, -40 33; SOFT-FLOAT-NEXT: aghi %r15, -160 34; SOFT-FLOAT-NEXT: .cfi_def_cfa_offset 320 35; SOFT-FLOAT-NEXT: lgr %r13, %r4 36; SOFT-FLOAT-NEXT: brasl %r14, __muldf3@PLT 37; SOFT-FLOAT-NEXT: lgr %r3, %r13 38; SOFT-FLOAT-NEXT: brasl %r14, __adddf3@PLT 39; SOFT-FLOAT-NEXT: lmg %r13, %r15, 264(%r15) 40; SOFT-FLOAT-NEXT: br %r14 41 %result = call double @llvm.fmuladd.f64(double %a, double %b, double %c) 42 ret double %result 43} 44 45define float @fmuladd_contract_f32(float %a, float %b, float %c) #0 { 46; SOFT-FLOAT-LABEL: fmuladd_contract_f32: 47; SOFT-FLOAT: # %bb.0: 48; SOFT-FLOAT-NEXT: stmg %r13, %r15, 104(%r15) 49; SOFT-FLOAT-NEXT: .cfi_offset %r13, -56 50; SOFT-FLOAT-NEXT: .cfi_offset %r14, -48 51; SOFT-FLOAT-NEXT: .cfi_offset %r15, -40 52; SOFT-FLOAT-NEXT: aghi %r15, -160 53; SOFT-FLOAT-NEXT: .cfi_def_cfa_offset 320 54; SOFT-FLOAT-NEXT: llgfr %r2, %r2 55; SOFT-FLOAT-NEXT: llgfr %r3, %r3 56; SOFT-FLOAT-NEXT: lr %r13, %r4 57; SOFT-FLOAT-NEXT: brasl %r14, __mulsf3@PLT 58; SOFT-FLOAT-NEXT: llgfr %r3, %r13 59; SOFT-FLOAT-NEXT: brasl %r14, __addsf3@PLT 60; SOFT-FLOAT-NEXT: # kill: def $r2l killed $r2l killed $r2d 61; SOFT-FLOAT-NEXT: lmg %r13, %r15, 264(%r15) 62; SOFT-FLOAT-NEXT: br %r14 63 %product = fmul contract float %a, %b 64 %result = fadd contract float %product, %c 65 ret float %result 66} 67 68define double @fmuladd_contract_f64(double %a, double %b, double %c) #0 { 69; SOFT-FLOAT-LABEL: fmuladd_contract_f64: 70; SOFT-FLOAT: # %bb.0: 71; SOFT-FLOAT-NEXT: stmg %r13, %r15, 104(%r15) 72; SOFT-FLOAT-NEXT: .cfi_offset %r13, -56 73; SOFT-FLOAT-NEXT: .cfi_offset %r14, -48 74; SOFT-FLOAT-NEXT: .cfi_offset %r15, -40 75; SOFT-FLOAT-NEXT: aghi %r15, -160 76; SOFT-FLOAT-NEXT: .cfi_def_cfa_offset 320 77; SOFT-FLOAT-NEXT: lgr %r13, %r4 78; SOFT-FLOAT-NEXT: brasl %r14, __muldf3@PLT 79; SOFT-FLOAT-NEXT: lgr %r3, %r13 80; SOFT-FLOAT-NEXT: brasl %r14, __adddf3@PLT 81; SOFT-FLOAT-NEXT: lmg %r13, %r15, 264(%r15) 82; SOFT-FLOAT-NEXT: br %r14 83 %product = fmul contract double %a, %b 84 %result = fadd contract double %product, %c 85 ret double %result 86} 87 88define <4 x float> @fmuladd_contract_v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c) #0 { 89; SOFT-FLOAT-LABEL: fmuladd_contract_v4f32: 90; SOFT-FLOAT: # %bb.0: 91; SOFT-FLOAT-NEXT: stmg %r7, %r15, 56(%r15) 92; SOFT-FLOAT-NEXT: .cfi_offset %r7, -104 93; SOFT-FLOAT-NEXT: .cfi_offset %r8, -96 94; SOFT-FLOAT-NEXT: .cfi_offset %r9, -88 95; SOFT-FLOAT-NEXT: .cfi_offset %r10, -80 96; SOFT-FLOAT-NEXT: .cfi_offset %r11, -72 97; SOFT-FLOAT-NEXT: .cfi_offset %r12, -64 98; SOFT-FLOAT-NEXT: .cfi_offset %r13, -56 99; SOFT-FLOAT-NEXT: .cfi_offset %r14, -48 100; SOFT-FLOAT-NEXT: .cfi_offset %r15, -40 101; SOFT-FLOAT-NEXT: aghi %r15, -176 102; SOFT-FLOAT-NEXT: .cfi_def_cfa_offset 336 103; SOFT-FLOAT-NEXT: llgf %r0, 388(%r15) 104; SOFT-FLOAT-NEXT: stg %r0, 168(%r15) # 8-byte Folded Spill 105; SOFT-FLOAT-NEXT: llgf %r0, 380(%r15) 106; SOFT-FLOAT-NEXT: stg %r0, 160(%r15) # 8-byte Folded Spill 107; SOFT-FLOAT-NEXT: llgf %r11, 372(%r15) 108; SOFT-FLOAT-NEXT: llgf %r10, 364(%r15) 109; SOFT-FLOAT-NEXT: llgf %r8, 340(%r15) 110; SOFT-FLOAT-NEXT: llgf %r0, 356(%r15) 111; SOFT-FLOAT-NEXT: llgf %r7, 348(%r15) 112; SOFT-FLOAT-NEXT: llgfr %r1, %r5 113; SOFT-FLOAT-NEXT: lr %r9, %r4 114; SOFT-FLOAT-NEXT: lr %r13, %r3 115; SOFT-FLOAT-NEXT: lr %r12, %r2 116; SOFT-FLOAT-NEXT: lgr %r2, %r1 117; SOFT-FLOAT-NEXT: lgr %r3, %r0 118; SOFT-FLOAT-NEXT: brasl %r14, __mulsf3@PLT 119; SOFT-FLOAT-NEXT: llgfr %r0, %r9 120; SOFT-FLOAT-NEXT: lgr %r9, %r2 121; SOFT-FLOAT-NEXT: lgr %r2, %r0 122; SOFT-FLOAT-NEXT: lgr %r3, %r7 123; SOFT-FLOAT-NEXT: brasl %r14, __mulsf3@PLT 124; SOFT-FLOAT-NEXT: llgfr %r0, %r13 125; SOFT-FLOAT-NEXT: lgr %r13, %r2 126; SOFT-FLOAT-NEXT: lgr %r2, %r0 127; SOFT-FLOAT-NEXT: lgr %r3, %r8 128; SOFT-FLOAT-NEXT: brasl %r14, __mulsf3@PLT 129; SOFT-FLOAT-NEXT: llgfr %r0, %r12 130; SOFT-FLOAT-NEXT: llgfr %r3, %r6 131; SOFT-FLOAT-NEXT: lgr %r12, %r2 132; SOFT-FLOAT-NEXT: lgr %r2, %r0 133; SOFT-FLOAT-NEXT: brasl %r14, __mulsf3@PLT 134; SOFT-FLOAT-NEXT: lgr %r3, %r10 135; SOFT-FLOAT-NEXT: brasl %r14, __addsf3@PLT 136; SOFT-FLOAT-NEXT: lgr %r10, %r2 137; SOFT-FLOAT-NEXT: lgr %r2, %r12 138; SOFT-FLOAT-NEXT: lgr %r3, %r11 139; SOFT-FLOAT-NEXT: brasl %r14, __addsf3@PLT 140; SOFT-FLOAT-NEXT: lgr %r12, %r2 141; SOFT-FLOAT-NEXT: lgr %r2, %r13 142; SOFT-FLOAT-NEXT: lg %r3, 160(%r15) # 8-byte Folded Reload 143; SOFT-FLOAT-NEXT: brasl %r14, __addsf3@PLT 144; SOFT-FLOAT-NEXT: lgr %r13, %r2 145; SOFT-FLOAT-NEXT: lgr %r2, %r9 146; SOFT-FLOAT-NEXT: lg %r3, 168(%r15) # 8-byte Folded Reload 147; SOFT-FLOAT-NEXT: brasl %r14, __addsf3@PLT 148; SOFT-FLOAT-NEXT: lgr %r5, %r2 149; SOFT-FLOAT-NEXT: lr %r2, %r10 150; SOFT-FLOAT-NEXT: lr %r3, %r12 151; SOFT-FLOAT-NEXT: lr %r4, %r13 152; SOFT-FLOAT-NEXT: # kill: def $r5l killed $r5l killed $r5d 153; SOFT-FLOAT-NEXT: lmg %r7, %r15, 232(%r15) 154; SOFT-FLOAT-NEXT: br %r14 155 %product = fmul contract <4 x float> %a, %b 156 %result = fadd contract <4 x float> %product, %c 157 ret <4 x float> %result 158} 159 160define <4 x double> @fmuladd_contract_v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c) #0 { 161; SOFT-FLOAT-LABEL: fmuladd_contract_v4f64: 162; SOFT-FLOAT: # %bb.0: 163; SOFT-FLOAT-NEXT: stmg %r6, %r15, 48(%r15) 164; SOFT-FLOAT-NEXT: .cfi_offset %r6, -112 165; SOFT-FLOAT-NEXT: .cfi_offset %r7, -104 166; SOFT-FLOAT-NEXT: .cfi_offset %r8, -96 167; SOFT-FLOAT-NEXT: .cfi_offset %r9, -88 168; SOFT-FLOAT-NEXT: .cfi_offset %r10, -80 169; SOFT-FLOAT-NEXT: .cfi_offset %r11, -72 170; SOFT-FLOAT-NEXT: .cfi_offset %r12, -64 171; SOFT-FLOAT-NEXT: .cfi_offset %r13, -56 172; SOFT-FLOAT-NEXT: .cfi_offset %r14, -48 173; SOFT-FLOAT-NEXT: .cfi_offset %r15, -40 174; SOFT-FLOAT-NEXT: aghi %r15, -184 175; SOFT-FLOAT-NEXT: .cfi_def_cfa_offset 344 176; SOFT-FLOAT-NEXT: mvc 176(8,%r15), 24(%r4) # 8-byte Folded Spill 177; SOFT-FLOAT-NEXT: mvc 168(8,%r15), 16(%r4) # 8-byte Folded Spill 178; SOFT-FLOAT-NEXT: mvc 160(8,%r15), 8(%r4) # 8-byte Folded Spill 179; SOFT-FLOAT-NEXT: lg %r10, 0(%r4) 180; SOFT-FLOAT-NEXT: lg %r9, 0(%r2) 181; SOFT-FLOAT-NEXT: lg %r8, 0(%r3) 182; SOFT-FLOAT-NEXT: lg %r7, 8(%r2) 183; SOFT-FLOAT-NEXT: lg %r6, 8(%r3) 184; SOFT-FLOAT-NEXT: lg %r13, 16(%r2) 185; SOFT-FLOAT-NEXT: lg %r2, 24(%r2) 186; SOFT-FLOAT-NEXT: lg %r0, 24(%r3) 187; SOFT-FLOAT-NEXT: lg %r12, 16(%r3) 188; SOFT-FLOAT-NEXT: lgr %r3, %r0 189; SOFT-FLOAT-NEXT: brasl %r14, __muldf3@PLT 190; SOFT-FLOAT-NEXT: lgr %r11, %r2 191; SOFT-FLOAT-NEXT: lgr %r2, %r13 192; SOFT-FLOAT-NEXT: lgr %r3, %r12 193; SOFT-FLOAT-NEXT: brasl %r14, __muldf3@PLT 194; SOFT-FLOAT-NEXT: lgr %r13, %r2 195; SOFT-FLOAT-NEXT: lgr %r2, %r7 196; SOFT-FLOAT-NEXT: lgr %r3, %r6 197; SOFT-FLOAT-NEXT: brasl %r14, __muldf3@PLT 198; SOFT-FLOAT-NEXT: lgr %r12, %r2 199; SOFT-FLOAT-NEXT: lgr %r2, %r9 200; SOFT-FLOAT-NEXT: lgr %r3, %r8 201; SOFT-FLOAT-NEXT: brasl %r14, __muldf3@PLT 202; SOFT-FLOAT-NEXT: lgr %r3, %r10 203; SOFT-FLOAT-NEXT: brasl %r14, __adddf3@PLT 204; SOFT-FLOAT-NEXT: lgr %r10, %r2 205; SOFT-FLOAT-NEXT: lgr %r2, %r12 206; SOFT-FLOAT-NEXT: lg %r3, 160(%r15) # 8-byte Folded Reload 207; SOFT-FLOAT-NEXT: brasl %r14, __adddf3@PLT 208; SOFT-FLOAT-NEXT: lgr %r12, %r2 209; SOFT-FLOAT-NEXT: lgr %r2, %r13 210; SOFT-FLOAT-NEXT: lg %r3, 168(%r15) # 8-byte Folded Reload 211; SOFT-FLOAT-NEXT: brasl %r14, __adddf3@PLT 212; SOFT-FLOAT-NEXT: lgr %r13, %r2 213; SOFT-FLOAT-NEXT: lgr %r2, %r11 214; SOFT-FLOAT-NEXT: lg %r3, 176(%r15) # 8-byte Folded Reload 215; SOFT-FLOAT-NEXT: brasl %r14, __adddf3@PLT 216; SOFT-FLOAT-NEXT: lgr %r5, %r2 217; SOFT-FLOAT-NEXT: lgr %r2, %r10 218; SOFT-FLOAT-NEXT: lgr %r3, %r12 219; SOFT-FLOAT-NEXT: lgr %r4, %r13 220; SOFT-FLOAT-NEXT: lmg %r6, %r15, 232(%r15) 221; SOFT-FLOAT-NEXT: br %r14 222 %product = fmul contract <4 x double> %a, %b 223 %result = fadd contract <4 x double> %product, %c 224 ret <4 x double> %result 225} 226 227attributes #0 = { "use-soft-float"="true" } 228 229declare float @llvm.fmuladd.f32(float %a, float %b, float %c) 230declare double @llvm.fmuladd.f64(double %a, double %b, double %c) 231