202 lines · plain
1; RUN: llc -mtriple=s390x-linux-gnu < %s | FileCheck -check-prefix=LINUX %s2; RUN: llc -mtriple=s390x-ibm-zos < %s | FileCheck -check-prefix=ZOS %s3 4; FIXME: half cases split out since they are broken on zos5 6; FIXME: Check ZOS function content7 8define { float, float } @test_sincos_f32(float %a) #0 {9; LINUX-LABEL: test_sincos_f32:10; LINUX: # %bb.0:11; LINUX-NEXT: stmg %r14, %r15, 112(%r15)12; LINUX-NEXT: aghi %r15, -16813; LINUX-NEXT: la %r2, 164(%r15)14; LINUX-NEXT: la %r3, 160(%r15)15; LINUX-NEXT: brasl %r14, sincosf@PLT16; LINUX-NEXT: le %f0, 164(%r15)17; LINUX-NEXT: le %f2, 160(%r15)18; LINUX-NEXT: lmg %r14, %r15, 280(%r15)19; LINUX-NEXT: br %r1420 %result = call { float, float } @llvm.sincos.f32(float %a)21 ret { float, float } %result22}23 24define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) #0 {25; LINUX-LABEL: test_sincos_v2f32:26; LINUX: # %bb.0:27; LINUX-NEXT: stmg %r14, %r15, 112(%r15)28; LINUX-NEXT: aghi %r15, -18429; LINUX-NEXT: std %f8, 176(%r15) # 8-byte Spill30; LINUX-NEXT: la %r2, 164(%r15)31; LINUX-NEXT: la %r3, 160(%r15)32; LINUX-NEXT: ler %f8, %f233; LINUX-NEXT: brasl %r14, sincosf@PLT34; LINUX-NEXT: la %r2, 172(%r15)35; LINUX-NEXT: la %r3, 168(%r15)36; LINUX-NEXT: ler %f0, %f837; LINUX-NEXT: brasl %r14, sincosf@PLT38; LINUX-NEXT: le %f0, 164(%r15)39; LINUX-NEXT: le %f2, 172(%r15)40; LINUX-NEXT: le %f4, 160(%r15)41; LINUX-NEXT: le %f6, 168(%r15)42; LINUX-NEXT: ld %f8, 176(%r15) # 8-byte Reload43; LINUX-NEXT: lmg %r14, %r15, 296(%r15)44; LINUX-NEXT: br %r1445 %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a)46 ret { <2 x float>, <2 x float> } %result47}48 49define { <3 x float>, <3 x float> } @test_sincos_v3f32(<3 x float> %a) #0 {50; LINUX-LABEL: test_sincos_v3f32:51; LINUX: # %bb.0:52; LINUX-NEXT: stmg %r13, %r15, 104(%r15)53; LINUX-NEXT: aghi %r15, -19254; LINUX-NEXT: std %f8, 184(%r15) # 8-byte Spill55; LINUX-NEXT: std %f9, 176(%r15) # 8-byte Spill56; LINUX-NEXT: lgr %r13, %r257; LINUX-NEXT: la %r2, 164(%r15)58; LINUX-NEXT: la %r3, 160(%r15)59; LINUX-NEXT: ler %f8, %f460; LINUX-NEXT: ler %f9, %f261; LINUX-NEXT: brasl %r14, sincosf@PLT62; LINUX-NEXT: la %r2, 172(%r15)63; LINUX-NEXT: la %r3, 168(%r15)64; LINUX-NEXT: ler %f0, %f965; LINUX-NEXT: brasl %r14, sincosf@PLT66; LINUX-NEXT: la %r2, 8(%r13)67; LINUX-NEXT: la %r3, 24(%r13)68; LINUX-NEXT: ler %f0, %f869; LINUX-NEXT: brasl %r14, sincosf@PLT70; LINUX-NEXT: le %f0, 164(%r15)71; LINUX-NEXT: le %f1, 172(%r15)72; LINUX-NEXT: le %f2, 160(%r15)73; LINUX-NEXT: lgdr %r0, %f074; LINUX-NEXT: lgdr %r1, %f175; LINUX-NEXT: lgdr %r2, %f276; LINUX-NEXT: le %f0, 168(%r15)77; LINUX-NEXT: nilf %r0, 078; LINUX-NEXT: srlg %r1, %r1, 3279; LINUX-NEXT: nilf %r2, 080; LINUX-NEXT: lgdr %r3, %f081; LINUX-NEXT: srlg %r3, %r3, 3282; LINUX-NEXT: lr %r0, %r183; LINUX-NEXT: lr %r2, %r384; LINUX-NEXT: stg %r2, 16(%r13)85; LINUX-NEXT: stg %r0, 0(%r13)86; LINUX-NEXT: ld %f8, 184(%r15) # 8-byte Reload87; LINUX-NEXT: ld %f9, 176(%r15) # 8-byte Reload88; LINUX-NEXT: lmg %r13, %r15, 296(%r15)89; LINUX-NEXT: br %r1490 %result = call { <3 x float>, <3 x float> } @llvm.sincos.v3f32(<3 x float> %a)91 ret { <3 x float>, <3 x float> } %result92}93 94define { double, double } @test_sincos_f64(double %a) #0 {95; LINUX-LABEL: test_sincos_f64:96; LINUX: # %bb.0:97; LINUX-NEXT: stmg %r14, %r15, 112(%r15)98; LINUX-NEXT: aghi %r15, -17699; LINUX-NEXT: la %r2, 168(%r15)100; LINUX-NEXT: la %r3, 160(%r15)101; LINUX-NEXT: brasl %r14, sincos@PLT102; LINUX-NEXT: ld %f0, 168(%r15)103; LINUX-NEXT: ld %f2, 160(%r15)104; LINUX-NEXT: lmg %r14, %r15, 288(%r15)105; LINUX-NEXT: br %r14106 %result = call { double, double } @llvm.sincos.f64(double %a)107 ret { double, double } %result108}109 110define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) #0 {111; LINUX-LABEL: test_sincos_v2f64:112; LINUX: # %bb.0:113; LINUX-NEXT: stmg %r14, %r15, 112(%r15)114; LINUX-NEXT: aghi %r15, -200115; LINUX-NEXT: std %f8, 192(%r15) # 8-byte Spill116; LINUX-NEXT: la %r2, 168(%r15)117; LINUX-NEXT: la %r3, 160(%r15)118; LINUX-NEXT: ldr %f8, %f2119; LINUX-NEXT: brasl %r14, sincos@PLT120; LINUX-NEXT: la %r2, 184(%r15)121; LINUX-NEXT: la %r3, 176(%r15)122; LINUX-NEXT: ldr %f0, %f8123; LINUX-NEXT: brasl %r14, sincos@PLT124; LINUX-NEXT: ld %f0, 168(%r15)125; LINUX-NEXT: ld %f2, 184(%r15)126; LINUX-NEXT: ld %f4, 160(%r15)127; LINUX-NEXT: ld %f6, 176(%r15)128; LINUX-NEXT: ld %f8, 192(%r15) # 8-byte Reload129; LINUX-NEXT: lmg %r14, %r15, 312(%r15)130; LINUX-NEXT: br %r14131 %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a)132 ret { <2 x double>, <2 x double> } %result133}134 135define { fp128, fp128 } @test_sincos_f128(fp128 %a) #0 {136; LINUX-LABEL: test_sincos_f128:137; LINUX: # %bb.0:138; LINUX-NEXT: stmg %r14, %r15, 112(%r15)139; LINUX-NEXT: aghi %r15, -176140; LINUX-NEXT: ld %f0, 0(%r3)141; LINUX-NEXT: ld %f2, 8(%r3)142; LINUX-NEXT: lgr %r3, %r2143; LINUX-NEXT: la %r4, 16(%r2)144; LINUX-NEXT: la %r2, 160(%r15)145; LINUX-NEXT: std %f0, 160(%r15)146; LINUX-NEXT: std %f2, 168(%r15)147; LINUX-NEXT: brasl %r14, sincosl@PLT148; LINUX-NEXT: lmg %r14, %r15, 288(%r15)149; LINUX-NEXT: br %r14150 %result = call { fp128, fp128 } @llvm.sincos.f128(fp128 %a)151 ret { fp128, fp128 } %result152}153 154define { <2 x fp128>, <2 x fp128> } @test_sincos_v2f128(<2 x fp128> %a) #0 {155; LINUX-LABEL: test_sincos_v2f128:156; LINUX: # %bb.0:157; LINUX-NEXT: stmg %r13, %r15, 104(%r15)158; LINUX-NEXT: aghi %r15, -208159; LINUX-NEXT: std %f8, 200(%r15) # 8-byte Spill160; LINUX-NEXT: std %f10, 192(%r15) # 8-byte Spill161; LINUX-NEXT: lgr %r13, %r2162; LINUX-NEXT: ld %f8, 0(%r3)163; LINUX-NEXT: ld %f10, 8(%r3)164; LINUX-NEXT: ld %f0, 16(%r3)165; LINUX-NEXT: ld %f2, 24(%r3)166; LINUX-NEXT: la %r2, 176(%r15)167; LINUX-NEXT: la %r3, 16(%r13)168; LINUX-NEXT: la %r4, 48(%r13)169; LINUX-NEXT: std %f0, 176(%r15)170; LINUX-NEXT: std %f2, 184(%r15)171; LINUX-NEXT: brasl %r14, sincosl@PLT172; LINUX-NEXT: la %r4, 32(%r13)173; LINUX-NEXT: la %r2, 160(%r15)174; LINUX-NEXT: std %f8, 160(%r15)175; LINUX-NEXT: std %f10, 168(%r15)176; LINUX-NEXT: lgr %r3, %r13177; LINUX-NEXT: brasl %r14, sincosl@PLT178; LINUX-NEXT: ld %f8, 200(%r15) # 8-byte Reload179; LINUX-NEXT: ld %f10, 192(%r15) # 8-byte Reload180; LINUX-NEXT: lmg %r13, %r15, 312(%r15)181; LINUX-NEXT: br %r14182 %result = call { <2 x fp128>, <2 x fp128> } @llvm.sincos.v2f128(<2 x fp128> %a)183 ret { <2 x fp128>, <2 x fp128> } %result184}185 186 187; ZOS: .quad R(@@FSIN@B) * Offset 0 function descriptor of @@FSIN@B188; ZOS: .quad V(@@FSIN@B)189; ZOS: .quad R(@@FCOS@B) * Offset 16 function descriptor of @@FCOS@B190; ZOS: .quad V(@@FCOS@B)191; ZOS: .quad R(@@SSIN@B) * Offset 32 function descriptor of @@SSIN@B192; ZOS: .quad V(@@SSIN@B)193; ZOS: .quad R(@@SCOS@B) * Offset 48 function descriptor of @@SCOS@B194; ZOS: .quad V(@@SCOS@B)195; ZOS: .quad R(@@LSIN@B) * Offset 64 function descriptor of @@LSIN@B196; ZOS: .quad V(@@LSIN@B)197; ZOS: .quad R(@@LCOS@B) * Offset 80 function descriptor of @@LCOS@B198; ZOS: .quad V(@@LCOS@B)199 200 201attributes #0 = { nounwind }202