1*e943329bSJonas Paulsson; RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 -mattr=soft-float -O3 < %s | FileCheck %s 2563e8479SJonas Paulsson; 3563e8479SJonas Paulsson; Test that arguments and return values of fp/vector types are always handled 4563e8479SJonas Paulsson; with gprs with soft-float. 5563e8479SJonas Paulsson 6563e8479SJonas Paulssondefine double @f1(double %arg) { 7563e8479SJonas Paulsson; CHECK-LABEL: f1: 8563e8479SJonas Paulsson; CHECK-NOT: %r2 9563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 10563e8479SJonas Paulsson; CHECK: llihh %r3, 16368 11563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __adddf3@PLT 12563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 272(%r15) 13563e8479SJonas Paulsson; CHECK-NEXT: br %r14 14563e8479SJonas Paulsson %res = fadd double %arg, 1.0 15563e8479SJonas Paulsson ret double %res 16563e8479SJonas Paulsson} 17563e8479SJonas Paulsson 18563e8479SJonas Paulssondefine float @f2(float %arg) { 19563e8479SJonas Paulsson; CHECK-LABEL: f2: 20563e8479SJonas Paulsson; CHECK-NOT: %r2 21563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 22563e8479SJonas Paulsson; CHECK: llgfr %r2, %r2 23563e8479SJonas Paulsson; CHECK-NEXT: llilh %r3, 16256 24563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __addsf3@PLT 25563e8479SJonas Paulsson; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 26563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 272(%r15) 27563e8479SJonas Paulsson; CHECK-NEXT: br %r14 28563e8479SJonas Paulsson %res = fadd float %arg, 1.0 29563e8479SJonas Paulsson ret float %res 30563e8479SJonas Paulsson} 31563e8479SJonas Paulsson 32563e8479SJonas Paulssondefine fp128 @f2_fp128(fp128 %arg) { 33563e8479SJonas Paulsson; CHECK-LABEL: f2_fp128: 34563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 35563e8479SJonas Paulsson; CHECK: aghi %r15, -208 36563e8479SJonas Paulsson; CHECK-NEXT: .cfi_def_cfa_offset 368 37563e8479SJonas Paulsson; CHECK-NEXT: lg %r0, 0(%r2) 38563e8479SJonas Paulsson; CHECK-NEXT: lg %r1, 8(%r2) 39563e8479SJonas Paulsson; CHECK-NEXT: llihf %r2, 1073823744 40563e8479SJonas Paulsson; CHECK-NEXT: stg %r2, 160(%r15) 41563e8479SJonas Paulsson; CHECK-NEXT: la %r2, 192(%r15) 42563e8479SJonas Paulsson; CHECK-NEXT: la %r3, 176(%r15) 43563e8479SJonas Paulsson; CHECK-NEXT: la %r4, 160(%r15) 44563e8479SJonas Paulsson; CHECK-NEXT: stg %r1, 184(%r15) 45563e8479SJonas Paulsson; CHECK-NEXT: stg %r0, 176(%r15) 46563e8479SJonas Paulsson; CHECK-NEXT: mvghi 168(%r15), 0 47563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __addtf3@PLT 48563e8479SJonas Paulsson; CHECK-NEXT: lg %r2, 192(%r15) 49563e8479SJonas Paulsson; CHECK-NEXT: lg %r3, 200(%r15) 50563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 320(%r15) 51563e8479SJonas Paulsson; CHECK-NEXT: br %r14 52563e8479SJonas Paulsson %res = fadd fp128 %arg, 0xL00000000000000004001400000000000 53563e8479SJonas Paulsson ret fp128 %res 54563e8479SJonas Paulsson} 55563e8479SJonas Paulsson 56563e8479SJonas Paulssondefine <2 x double> @f3(<2 x double> %arg) { 57563e8479SJonas Paulsson; CHECK-LABEL: f3: 58563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 59563e8479SJonas Paulsson; CHECK: lg %r13, 8(%r2) 60563e8479SJonas Paulsson; CHECK-NEXT: lg %r2, 0(%r2) 61563e8479SJonas Paulsson; CHECK-NEXT: llihh %r3, 16368 62563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __adddf3@PLT 63563e8479SJonas Paulsson; CHECK-NEXT: lgr %r12, %r2 64563e8479SJonas Paulsson; CHECK-NEXT: lgr %r2, %r13 65563e8479SJonas Paulsson; CHECK-NEXT: llihh %r3, 16368 66563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __adddf3@PLT 67563e8479SJonas Paulsson; CHECK-NEXT: lgr %r3, %r2 68563e8479SJonas Paulsson; CHECK-NEXT: lgr %r2, %r12 69563e8479SJonas Paulsson; CHECK-NEXT: lmg %r12, %r15, 256(%r15) 70563e8479SJonas Paulsson; CHECK-NEXT: br %r14 71563e8479SJonas Paulsson %res = fadd <2 x double> %arg, <double 1.000000e+00, double 1.000000e+00> 72563e8479SJonas Paulsson ret <2 x double> %res 73563e8479SJonas Paulsson} 74563e8479SJonas Paulsson 75563e8479SJonas Paulssondefine <2 x float> @f4(<2 x float> %arg) { 76563e8479SJonas Paulsson; CHECK-LABEL: f4: 77563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 78563e8479SJonas Paulsson; CHECK: lr %r13, %r3 79563e8479SJonas Paulsson; CHECK-NEXT: llgfr %r2, %r2 80563e8479SJonas Paulsson; CHECK-NEXT: llilh %r3, 16256 81563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __addsf3@PLT 82563e8479SJonas Paulsson; CHECK-NEXT: lgr %r12, %r2 83563e8479SJonas Paulsson; CHECK-NEXT: llgfr %r2, %r13 84563e8479SJonas Paulsson; CHECK-NEXT: llilh %r3, 16256 85563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __addsf3@PLT 86563e8479SJonas Paulsson; CHECK-NEXT: lgr %r3, %r2 87563e8479SJonas Paulsson; CHECK-NEXT: lr %r2, %r12 88563e8479SJonas Paulsson; CHECK-NEXT: # kill: def $r3l killed $r3l killed $r3d 89563e8479SJonas Paulsson; CHECK-NEXT: lmg %r12, %r15, 256(%r15) 90563e8479SJonas Paulsson; CHECK-NEXT: br %r14 91563e8479SJonas Paulsson %res = fadd <2 x float> %arg, <float 1.000000e+00, float 1.000000e+00> 92563e8479SJonas Paulsson ret <2 x float> %res 93563e8479SJonas Paulsson} 94563e8479SJonas Paulsson 95563e8479SJonas Paulssondefine <2 x i64> @f5(<2 x i64> %arg) { 96563e8479SJonas Paulsson; CHECK-LABEL: f5: 97563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 98563e8479SJonas Paulsson; CHECK: lghi %r0, 1 99563e8479SJonas Paulsson; CHECK-NEXT: ag %r0, 0(%r2) 100563e8479SJonas Paulsson; CHECK-NEXT: lghi %r3, 1 101563e8479SJonas Paulsson; CHECK-NEXT: ag %r3, 8(%r2) 102563e8479SJonas Paulsson; CHECK-NEXT: lgr %r2, %r0 103563e8479SJonas Paulsson; CHECK-NEXT: br %r14 104563e8479SJonas Paulsson %res = add <2 x i64> %arg, <i64 1, i64 1> 105563e8479SJonas Paulsson ret <2 x i64> %res 106563e8479SJonas Paulsson} 107563e8479SJonas Paulsson 108563e8479SJonas Paulssondefine <2 x i32> @f6(<2 x i32> %arg) { 109563e8479SJonas Paulsson; CHECK-LABEL: f6: 110563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 111563e8479SJonas Paulsson; CHECK: ahi %r2, 1 112563e8479SJonas Paulsson; CHECK-NEXT: ahi %r3, 1 113563e8479SJonas Paulsson; CHECK-NEXT: br %r14 114563e8479SJonas Paulsson %res = add <2 x i32> %arg, <i32 1, i32 1> 115563e8479SJonas Paulsson ret <2 x i32> %res 116563e8479SJonas Paulsson} 117563e8479SJonas Paulsson 118563e8479SJonas Paulsson;; Stack arguments 119563e8479SJonas Paulsson 120563e8479SJonas Paulssondefine double @f7(double %A, double %B, double %C, double %D, double %E, 121563e8479SJonas Paulsson double %F) { 122563e8479SJonas Paulsson; CHECK-LABEL: f7: 123563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 124563e8479SJonas Paulsson; CHECK: aghi %r15, -160 125563e8479SJonas Paulsson; CHECK-NEXT: .cfi_def_cfa_offset 320 126563e8479SJonas Paulsson; CHECK-NEXT: lg %r3, 320(%r15) 127563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __adddf3@PLT 128563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 272(%r15) 129563e8479SJonas Paulsson; CHECK-NEXT: br %r14 130563e8479SJonas Paulsson 131563e8479SJonas Paulsson %res = fadd double %A, %F 132563e8479SJonas Paulsson ret double %res 133563e8479SJonas Paulsson} 134563e8479SJonas Paulsson 135563e8479SJonas Paulssondefine float @f8(float %A, float %B, float %C, float %D, float %E, 136563e8479SJonas Paulsson float %F) { 137563e8479SJonas Paulsson; CHECK-LABEL: f8: 138563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 139563e8479SJonas Paulsson; CHECK: aghi %r15, -160 140563e8479SJonas Paulsson; CHECK-NEXT: .cfi_def_cfa_offset 320 141563e8479SJonas Paulsson; CHECK-NEXT: llgf %r3, 324(%r15) 142563e8479SJonas Paulsson; CHECK-NEXT: llgfr %r2, %r2 143563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __addsf3@PLT 144563e8479SJonas Paulsson; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 145563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 272(%r15) 146563e8479SJonas Paulsson; CHECK-NEXT: br %r14 147563e8479SJonas Paulsson %res = fadd float %A, %F 148563e8479SJonas Paulsson ret float %res 149563e8479SJonas Paulsson} 150563e8479SJonas Paulsson 151563e8479SJonas Paulssondefine <2 x double> @f9(<2 x double> %A, <2 x double> %B, <2 x double> %C, 152563e8479SJonas Paulsson <2 x double> %D, <2 x double> %E, <2 x double> %F, 153563e8479SJonas Paulsson <2 x double> %G, <2 x double> %H, <2 x double> %I) { 154563e8479SJonas Paulsson; CHECK-LABEL: f9: 155563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 156563e8479SJonas Paulsson; CHECK: aghi %r15, -160 157563e8479SJonas Paulsson; CHECK-NEXT: .cfi_def_cfa_offset 320 158563e8479SJonas Paulsson; CHECK-NEXT: lg %r1, 344(%r15) 159563e8479SJonas Paulsson; CHECK-NEXT: lg %r13, 8(%r2) 160563e8479SJonas Paulsson; CHECK-NEXT: lg %r2, 0(%r2) 161563e8479SJonas Paulsson; CHECK-NEXT: lg %r3, 0(%r1) 162563e8479SJonas Paulsson; CHECK-NEXT: lg %r12, 8(%r1) 163563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __adddf3@PLT 164563e8479SJonas Paulsson; CHECK-NEXT: lgr %r11, %r2 165563e8479SJonas Paulsson; CHECK-NEXT: lgr %r2, %r13 166563e8479SJonas Paulsson; CHECK-NEXT: lgr %r3, %r12 167563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __adddf3@PLT 168563e8479SJonas Paulsson; CHECK-NEXT: lgr %r3, %r2 169563e8479SJonas Paulsson; CHECK-NEXT: lgr %r2, %r11 170563e8479SJonas Paulsson; CHECK-NEXT: lmg %r11, %r15, 248(%r15) 171563e8479SJonas Paulsson; CHECK-NEXT: br %r14 172563e8479SJonas Paulsson %res = fadd <2 x double> %A, %I 173563e8479SJonas Paulsson ret <2 x double> %res 174563e8479SJonas Paulsson} 175563e8479SJonas Paulsson 176563e8479SJonas Paulssondefine <2 x float> @f10(<2 x float> %A, <2 x float> %B, <2 x float> %C, 177563e8479SJonas Paulsson <2 x float> %D, <2 x float> %E, <2 x float> %F, 178563e8479SJonas Paulsson <2 x float> %G, <2 x float> %H, <2 x float> %I) { 179563e8479SJonas Paulsson; CHECK-LABEL: f10: 180563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 181563e8479SJonas Paulsson; CHECK: aghi %r15, -160 182563e8479SJonas Paulsson; CHECK-NEXT: .cfi_def_cfa_offset 320 183563e8479SJonas Paulsson; CHECK-NEXT: lr %r13, %r3 184563e8479SJonas Paulsson; CHECK-NEXT: llgf %r3, 412(%r15) 185563e8479SJonas Paulsson; CHECK-NEXT: llgf %r12, 420(%r15) 186563e8479SJonas Paulsson; CHECK-NEXT: llgfr %r2, %r2 187563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __addsf3@PLT 188563e8479SJonas Paulsson; CHECK-NEXT: lgr %r11, %r2 189563e8479SJonas Paulsson; CHECK-NEXT: llgfr %r2, %r13 190563e8479SJonas Paulsson; CHECK-NEXT: lgr %r3, %r12 191563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, __addsf3@PLT 192563e8479SJonas Paulsson; CHECK-NEXT: lgr %r3, %r2 193563e8479SJonas Paulsson; CHECK-NEXT: lr %r2, %r11 194563e8479SJonas Paulsson; CHECK-NEXT: # kill: def $r3l killed $r3l killed $r3d 195563e8479SJonas Paulsson; CHECK-NEXT: lmg %r11, %r15, 248(%r15) 196563e8479SJonas Paulsson; CHECK-NEXT: br %r14 197563e8479SJonas Paulsson 198563e8479SJonas Paulsson %res = fadd <2 x float> %A, %I 199563e8479SJonas Paulsson ret <2 x float> %res 200563e8479SJonas Paulsson} 201563e8479SJonas Paulsson 202563e8479SJonas Paulssondefine <2 x i64> @f11(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, 203563e8479SJonas Paulsson <2 x i64> %D, <2 x i64> %E, <2 x i64> %F, 204563e8479SJonas Paulsson <2 x i64> %G, <2 x i64> %H, <2 x i64> %I) { 205563e8479SJonas Paulsson; CHECK-LABEL: f11: 206563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 207563e8479SJonas Paulsson; CHECK: lg %r1, 184(%r15) 208563e8479SJonas Paulsson; CHECK-NEXT: lg %r3, 8(%r2) 209563e8479SJonas Paulsson; CHECK-NEXT: lg %r2, 0(%r2) 210563e8479SJonas Paulsson; CHECK-NEXT: ag %r2, 0(%r1) 211563e8479SJonas Paulsson; CHECK-NEXT: ag %r3, 8(%r1) 212563e8479SJonas Paulsson; CHECK-NEXT: br %r14 213563e8479SJonas Paulsson %res = add <2 x i64> %A, %I 214563e8479SJonas Paulsson ret <2 x i64> %res 215563e8479SJonas Paulsson} 216563e8479SJonas Paulsson 217563e8479SJonas Paulsson;; calls 218563e8479SJonas Paulsson 219563e8479SJonas Paulssondeclare double @bar_double(double %arg); 220563e8479SJonas Paulssondefine double @f12(double %arg, double %arg2) { 221563e8479SJonas Paulsson; CHECK-LABEL: f12: 222563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 223563e8479SJonas Paulsson; CHECK-NOT: %r{{[23]}} 224563e8479SJonas Paulsson; CHECK: lgr %r2, %r3 225563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, bar_double@PLT 226563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 272(%r15) 227563e8479SJonas Paulsson; CHECK-NEXT: br %r14 228563e8479SJonas Paulsson %res = call double @bar_double(double %arg2) 229563e8479SJonas Paulsson ret double %res 230563e8479SJonas Paulsson} 231563e8479SJonas Paulsson 232563e8479SJonas Paulssondeclare float @bar_float(float %arg); 233563e8479SJonas Paulssondefine float @f13(float %arg, float %arg2) { 234563e8479SJonas Paulsson; CHECK-LABEL: f13: 235563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 236563e8479SJonas Paulsson; CHECK-NOT: %r{{[23]}} 237563e8479SJonas Paulsson; CHECK: lr %r2, %r3 238563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, bar_float@PLT 239563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 272(%r15) 240563e8479SJonas Paulsson; CHECK-NEXT: br %r14 241563e8479SJonas Paulsson %res = call float @bar_float(float %arg2) 242563e8479SJonas Paulsson ret float %res 243563e8479SJonas Paulsson} 244563e8479SJonas Paulsson 245563e8479SJonas Paulssondeclare fp128 @bar_fp128(fp128 %arg); 246563e8479SJonas Paulssondefine fp128 @f14(fp128 %arg, fp128 %arg2) { 247563e8479SJonas Paulsson; CHECK-LABEL: f14: 248563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 249563e8479SJonas Paulsson; CHECK-NOT: %r3 250563e8479SJonas Paulsson; CHECK: lg %r0, 0(%r3) 251563e8479SJonas Paulsson; CHECK-NEXT: lg %r1, 8(%r3) 252563e8479SJonas Paulsson; CHECK-NEXT: la %r2, 160(%r15) 253563e8479SJonas Paulsson; CHECK-NEXT: stg %r1, 168(%r15) 254563e8479SJonas Paulsson; CHECK-NEXT: stg %r0, 160(%r15) 255563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, bar_fp128@PLT 256563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 288(%r15) 257563e8479SJonas Paulsson; CHECK-NEXT: br %r14 258563e8479SJonas Paulsson %res = call fp128 @bar_fp128(fp128 %arg2) 259563e8479SJonas Paulsson ret fp128 %res 260563e8479SJonas Paulsson} 261563e8479SJonas Paulsson 262563e8479SJonas Paulssondeclare <2 x double> @bar_v2f64(<2 x double> %arg); 263563e8479SJonas Paulssondefine <2 x double> @f15(<2 x double> %arg, <2 x double> %arg2) { 264563e8479SJonas Paulsson; CHECK-LABEL: f15: 265563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 266563e8479SJonas Paulsson; CHECK-NOT: %r3 267563e8479SJonas Paulsson; CHECK: lg %r0, 0(%r3) 268563e8479SJonas Paulsson; CHECK-NEXT: lg %r1, 8(%r3) 269563e8479SJonas Paulsson; CHECK-NEXT: la %r2, 160(%r15) 270563e8479SJonas Paulsson; CHECK-NEXT: stg %r1, 168(%r15) 271563e8479SJonas Paulsson; CHECK-NEXT: stg %r0, 160(%r15) 272563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, bar_v2f64@PLT 273563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 288(%r15) 274563e8479SJonas Paulsson; CHECK-NEXT: br %r14 275563e8479SJonas Paulsson %res = call <2 x double> @bar_v2f64(<2 x double> %arg2) 276563e8479SJonas Paulsson ret <2 x double> %res 277563e8479SJonas Paulsson} 278563e8479SJonas Paulsson 279563e8479SJonas Paulssondeclare <2 x float> @bar_v2f32(<2 x float> %arg); 280563e8479SJonas Paulssondefine <2 x float> @f16(<2 x float> %arg, <2 x float> %arg2) { 281563e8479SJonas Paulsson; CHECK-LABEL: f16: 282563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 283563e8479SJonas Paulsson; CHECK-NOT: %r{{[2345]}} 284563e8479SJonas Paulsson; CHECK: lr %r3, %r5 285563e8479SJonas Paulsson; CHECK-NEXT: lr %r2, %r4 286563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, bar_v2f32@PLT 287563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 272(%r15) 288563e8479SJonas Paulsson; CHECK-NEXT: br %r14 289563e8479SJonas Paulsson %res = call <2 x float> @bar_v2f32(<2 x float> %arg2) 290563e8479SJonas Paulsson ret <2 x float> %res 291563e8479SJonas Paulsson} 292563e8479SJonas Paulsson 293563e8479SJonas Paulssondeclare <2 x i64> @bar_v2i64(<2 x i64> %arg); 294563e8479SJonas Paulssondefine <2 x i64> @f17(<2 x i64> %arg, <2 x i64> %arg2) { 295563e8479SJonas Paulsson; CHECK-LABEL: f17: 296563e8479SJonas Paulsson; CHECK-NOT: %{{[fv]}} 297563e8479SJonas Paulsson; CHECK-NOT: %r3 298563e8479SJonas Paulsson; CHECK: lg %r0, 0(%r3) 299563e8479SJonas Paulsson; CHECK-NEXT: lg %r1, 8(%r3) 300563e8479SJonas Paulsson; CHECK-NEXT: la %r2, 160(%r15) 301563e8479SJonas Paulsson; CHECK-NEXT: stg %r1, 168(%r15) 302563e8479SJonas Paulsson; CHECK-NEXT: stg %r0, 160(%r15) 303563e8479SJonas Paulsson; CHECK-NEXT: brasl %r14, bar_v2i64@PLT 304563e8479SJonas Paulsson; CHECK-NEXT: lmg %r14, %r15, 288(%r15) 305563e8479SJonas Paulsson; CHECK-NEXT: br %r14 306563e8479SJonas Paulsson %res = call <2 x i64> @bar_v2i64(<2 x i64> %arg2) 307563e8479SJonas Paulsson ret <2 x i64> %res 308563e8479SJonas Paulsson} 309