613 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=zEC12 -verify-machineinstrs \3; RUN: | FileCheck %s --check-prefix=NOVEC4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z16 -verify-machineinstrs \5; RUN: | FileCheck %s --check-prefix=VECTOR6;7; Tests for 16-bit floating point (half).8 9; Incoming half arguments added together and returned.10define half @fun0(half %Op0, half %Op1) {11; NOVEC-LABEL: fun0:12; NOVEC: # %bb.0: # %entry13; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)14; NOVEC-NEXT: .cfi_offset %r14, -4815; NOVEC-NEXT: .cfi_offset %r15, -4016; NOVEC-NEXT: aghi %r15, -17617; NOVEC-NEXT: .cfi_def_cfa_offset 33618; NOVEC-NEXT: std %f8, 168(%r15) # 8-byte Spill19; NOVEC-NEXT: std %f9, 160(%r15) # 8-byte Spill20; NOVEC-NEXT: .cfi_offset %f8, -16821; NOVEC-NEXT: .cfi_offset %f9, -17622; NOVEC-NEXT: ler %f8, %f023; NOVEC-NEXT: ler %f0, %f224; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT25; NOVEC-NEXT: ler %f9, %f026; NOVEC-NEXT: ler %f0, %f827; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT28; NOVEC-NEXT: aebr %f0, %f929; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT30; NOVEC-NEXT: ld %f8, 168(%r15) # 8-byte Reload31; NOVEC-NEXT: ld %f9, 160(%r15) # 8-byte Reload32; NOVEC-NEXT: lmg %r14, %r15, 288(%r15)33; NOVEC-NEXT: br %r1434;35; VECTOR-LABEL: fun0:36; VECTOR: # %bb.0: # %entry37; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)38; VECTOR-NEXT: .cfi_offset %r14, -4839; VECTOR-NEXT: .cfi_offset %r15, -4040; VECTOR-NEXT: aghi %r15, -17641; VECTOR-NEXT: .cfi_def_cfa_offset 33642; VECTOR-NEXT: std %f8, 168(%r15) # 8-byte Spill43; VECTOR-NEXT: std %f9, 160(%r15) # 8-byte Spill44; VECTOR-NEXT: .cfi_offset %f8, -16845; VECTOR-NEXT: .cfi_offset %f9, -17646; VECTOR-NEXT: ldr %f8, %f047; VECTOR-NEXT: ldr %f0, %f248; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT49; VECTOR-NEXT: ldr %f9, %f050; VECTOR-NEXT: ldr %f0, %f851; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT52; VECTOR-NEXT: aebr %f0, %f953; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT54; VECTOR-NEXT: ld %f8, 168(%r15) # 8-byte Reload55; VECTOR-NEXT: ld %f9, 160(%r15) # 8-byte Reload56; VECTOR-NEXT: lmg %r14, %r15, 288(%r15)57; VECTOR-NEXT: br %r1458entry:59 %Res = fadd half %Op0, %Op160 ret half %Res61}62 63define half @fun1(half %Op0, half %Op1) {64; NOVEC-LABEL: fun1:65; NOVEC: # %bb.0: # %entry66; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)67; NOVEC-NEXT: .cfi_offset %r14, -4868; NOVEC-NEXT: .cfi_offset %r15, -4069; NOVEC-NEXT: aghi %r15, -17670; NOVEC-NEXT: .cfi_def_cfa_offset 33671; NOVEC-NEXT: std %f8, 168(%r15) # 8-byte Spill72; NOVEC-NEXT: std %f9, 160(%r15) # 8-byte Spill73; NOVEC-NEXT: .cfi_offset %f8, -16874; NOVEC-NEXT: .cfi_offset %f9, -17675; NOVEC-NEXT: ler %f8, %f276; NOVEC-NEXT: brasl %r14, __extendhfdf2@PLT77; NOVEC-NEXT: ldr %f9, %f078; NOVEC-NEXT: ler %f0, %f879; NOVEC-NEXT: brasl %r14, __extendhfdf2@PLT80; NOVEC-NEXT: adbr %f0, %f981; NOVEC-NEXT: brasl %r14, __truncdfhf2@PLT82; NOVEC-NEXT: ld %f8, 168(%r15) # 8-byte Reload83; NOVEC-NEXT: ld %f9, 160(%r15) # 8-byte Reload84; NOVEC-NEXT: lmg %r14, %r15, 288(%r15)85; NOVEC-NEXT: br %r1486;87; VECTOR-LABEL: fun1:88; VECTOR: # %bb.0: # %entry89; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)90; VECTOR-NEXT: .cfi_offset %r14, -4891; VECTOR-NEXT: .cfi_offset %r15, -4092; VECTOR-NEXT: aghi %r15, -17693; VECTOR-NEXT: .cfi_def_cfa_offset 33694; VECTOR-NEXT: std %f8, 168(%r15) # 8-byte Spill95; VECTOR-NEXT: std %f9, 160(%r15) # 8-byte Spill96; VECTOR-NEXT: .cfi_offset %f8, -16897; VECTOR-NEXT: .cfi_offset %f9, -17698; VECTOR-NEXT: ldr %f8, %f299; VECTOR-NEXT: brasl %r14, __extendhfdf2@PLT100; VECTOR-NEXT: ldr %f9, %f0101; VECTOR-NEXT: ldr %f0, %f8102; VECTOR-NEXT: brasl %r14, __extendhfdf2@PLT103; VECTOR-NEXT: wfadb %f0, %f9, %f0104; VECTOR-NEXT: brasl %r14, __truncdfhf2@PLT105; VECTOR-NEXT: ld %f8, 168(%r15) # 8-byte Reload106; VECTOR-NEXT: ld %f9, 160(%r15) # 8-byte Reload107; VECTOR-NEXT: lmg %r14, %r15, 288(%r15)108; VECTOR-NEXT: br %r14109entry:110 %E0 = fpext half %Op0 to double111 %E1 = fpext half %Op1 to double112 %Add = fadd double %E0, %E1113 %Res = fptrunc double %Add to half114 ret half %Res115}116 117define half @fun2(half %Op0, half %Op1) {118; NOVEC-LABEL: fun2:119; NOVEC: # %bb.0: # %entry120; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)121; NOVEC-NEXT: .cfi_offset %r14, -48122; NOVEC-NEXT: .cfi_offset %r15, -40123; NOVEC-NEXT: aghi %r15, -232124; NOVEC-NEXT: .cfi_def_cfa_offset 392125; NOVEC-NEXT: std %f8, 224(%r15) # 8-byte Spill126; NOVEC-NEXT: std %f9, 216(%r15) # 8-byte Spill127; NOVEC-NEXT: std %f11, 208(%r15) # 8-byte Spill128; NOVEC-NEXT: .cfi_offset %f8, -168129; NOVEC-NEXT: .cfi_offset %f9, -176130; NOVEC-NEXT: .cfi_offset %f11, -184131; NOVEC-NEXT: la %r2, 160(%r15)132; NOVEC-NEXT: ler %f8, %f2133; NOVEC-NEXT: brasl %r14, __extendhftf2@PLT134; NOVEC-NEXT: ld %f9, 160(%r15)135; NOVEC-NEXT: ld %f11, 168(%r15)136; NOVEC-NEXT: la %r2, 176(%r15)137; NOVEC-NEXT: ler %f0, %f8138; NOVEC-NEXT: brasl %r14, __extendhftf2@PLT139; NOVEC-NEXT: ld %f0, 176(%r15)140; NOVEC-NEXT: ld %f2, 184(%r15)141; NOVEC-NEXT: la %r2, 192(%r15)142; NOVEC-NEXT: axbr %f0, %f9143; NOVEC-NEXT: std %f0, 192(%r15)144; NOVEC-NEXT: std %f2, 200(%r15)145; NOVEC-NEXT: brasl %r14, __trunctfhf2@PLT146; NOVEC-NEXT: ld %f8, 224(%r15) # 8-byte Reload147; NOVEC-NEXT: ld %f9, 216(%r15) # 8-byte Reload148; NOVEC-NEXT: ld %f11, 208(%r15) # 8-byte Reload149; NOVEC-NEXT: lmg %r14, %r15, 344(%r15)150; NOVEC-NEXT: br %r14151;152; VECTOR-LABEL: fun2:153; VECTOR: # %bb.0: # %entry154; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)155; VECTOR-NEXT: .cfi_offset %r14, -48156; VECTOR-NEXT: .cfi_offset %r15, -40157; VECTOR-NEXT: aghi %r15, -232158; VECTOR-NEXT: .cfi_def_cfa_offset 392159; VECTOR-NEXT: std %f8, 224(%r15) # 8-byte Spill160; VECTOR-NEXT: .cfi_offset %f8, -168161; VECTOR-NEXT: la %r2, 176(%r15)162; VECTOR-NEXT: ldr %f8, %f2163; VECTOR-NEXT: brasl %r14, __extendhftf2@PLT164; VECTOR-NEXT: mvc 160(16,%r15), 176(%r15)165; VECTOR-NEXT: la %r2, 192(%r15)166; VECTOR-NEXT: ldr %f0, %f8167; VECTOR-NEXT: brasl %r14, __extendhftf2@PLT168; VECTOR-NEXT: vl %v0, 192(%r15), 3169; VECTOR-NEXT: vl %v1, 160(%r15), 3 # 16-byte Reload170; VECTOR-NEXT: wfaxb %v0, %v1, %v0171; VECTOR-NEXT: la %r2, 208(%r15)172; VECTOR-NEXT: vst %v0, 208(%r15), 3173; VECTOR-NEXT: brasl %r14, __trunctfhf2@PLT174; VECTOR-NEXT: ld %f8, 224(%r15) # 8-byte Reload175; VECTOR-NEXT: lmg %r14, %r15, 344(%r15)176; VECTOR-NEXT: br %r14177entry:178 %E0 = fpext half %Op0 to fp128179 %E1 = fpext half %Op1 to fp128180 %Add = fadd fp128 %E0, %E1181 %Res = fptrunc fp128 %Add to half182 ret half %Res183}184 185; Test loading and storing a half value.186define void @fun3(ptr %Src, ptr %Dst) {187; NOVEC-LABEL: fun3:188; NOVEC: # %bb.0: # %entry189; NOVEC-NEXT: lgh %r0, 0(%r2)190; NOVEC-NEXT: sllg %r0, %r0, 48191; NOVEC-NEXT: ldgr %f0, %r0192; NOVEC-NEXT: lgdr %r0, %f0193; NOVEC-NEXT: srlg %r0, %r0, 48194; NOVEC-NEXT: sth %r0, 0(%r3)195; NOVEC-NEXT: br %r14196;197; VECTOR-LABEL: fun3:198; VECTOR: # %bb.0: # %entry199; VECTOR-NEXT: vlreph %v0, 0(%r2)200; VECTOR-NEXT: vsteh %v0, 0(%r3), 0201; VECTOR-NEXT: br %r14202entry:203 %L = load half, ptr %Src, align 2204 store half %L, ptr %Dst, align 2205 ret void206}207 208define void @fun4(ptr %Src, ptr %Dst) {209; NOVEC-LABEL: fun4:210; NOVEC: # %bb.0: # %entry211; NOVEC-NEXT: stmg %r13, %r15, 104(%r15)212; NOVEC-NEXT: .cfi_offset %r13, -56213; NOVEC-NEXT: .cfi_offset %r14, -48214; NOVEC-NEXT: .cfi_offset %r15, -40215; NOVEC-NEXT: aghi %r15, -160216; NOVEC-NEXT: .cfi_def_cfa_offset 320217; NOVEC-NEXT: lgh %r0, 0(%r2)218; NOVEC-NEXT: sllg %r0, %r0, 48219; NOVEC-NEXT: lgr %r13, %r3220; NOVEC-NEXT: ldgr %f0, %r0221; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d222; NOVEC-NEXT: brasl %r14, __extendhfdf2@PLT223; NOVEC-NEXT: adbr %f0, %f0224; NOVEC-NEXT: brasl %r14, __truncdfhf2@PLT225; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d226; NOVEC-NEXT: lgdr %r0, %f0227; NOVEC-NEXT: srlg %r0, %r0, 48228; NOVEC-NEXT: sth %r0, 0(%r13)229; NOVEC-NEXT: lmg %r13, %r15, 264(%r15)230; NOVEC-NEXT: br %r14231;232; VECTOR-LABEL: fun4:233; VECTOR: # %bb.0: # %entry234; VECTOR-NEXT: stmg %r13, %r15, 104(%r15)235; VECTOR-NEXT: .cfi_offset %r13, -56236; VECTOR-NEXT: .cfi_offset %r14, -48237; VECTOR-NEXT: .cfi_offset %r15, -40238; VECTOR-NEXT: aghi %r15, -160239; VECTOR-NEXT: .cfi_def_cfa_offset 320240; VECTOR-NEXT: vlreph %v0, 0(%r2)241; VECTOR-NEXT: lgr %r13, %r3242; VECTOR-NEXT: brasl %r14, __extendhfdf2@PLT243; VECTOR-NEXT: adbr %f0, %f0244; VECTOR-NEXT: brasl %r14, __truncdfhf2@PLT245; VECTOR-NEXT: vsteh %v0, 0(%r13), 0246; VECTOR-NEXT: lmg %r13, %r15, 264(%r15)247; VECTOR-NEXT: br %r14248entry:249 %Op0 = load half, ptr %Src, align 2250 %E0 = fpext half %Op0 to double251 %Add = fadd double %E0, %E0252 %Res = fptrunc double %Add to half253 store half %Res, ptr %Dst, align 2254 ret void255}256 257define void @fun5(ptr %Src, ptr %Dst) {258; NOVEC-LABEL: fun5:259; NOVEC: # %bb.0: # %entry260; NOVEC-NEXT: stmg %r13, %r15, 104(%r15)261; NOVEC-NEXT: .cfi_offset %r13, -56262; NOVEC-NEXT: .cfi_offset %r14, -48263; NOVEC-NEXT: .cfi_offset %r15, -40264; NOVEC-NEXT: aghi %r15, -192265; NOVEC-NEXT: .cfi_def_cfa_offset 352266; NOVEC-NEXT: lgh %r0, 0(%r2)267; NOVEC-NEXT: sllg %r0, %r0, 48268; NOVEC-NEXT: la %r2, 160(%r15)269; NOVEC-NEXT: lgr %r13, %r3270; NOVEC-NEXT: ldgr %f0, %r0271; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d272; NOVEC-NEXT: brasl %r14, __extendhftf2@PLT273; NOVEC-NEXT: ld %f0, 160(%r15)274; NOVEC-NEXT: ld %f2, 168(%r15)275; NOVEC-NEXT: la %r2, 176(%r15)276; NOVEC-NEXT: axbr %f0, %f0277; NOVEC-NEXT: std %f0, 176(%r15)278; NOVEC-NEXT: std %f2, 184(%r15)279; NOVEC-NEXT: brasl %r14, __trunctfhf2@PLT280; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d281; NOVEC-NEXT: lgdr %r0, %f0282; NOVEC-NEXT: srlg %r0, %r0, 48283; NOVEC-NEXT: sth %r0, 0(%r13)284; NOVEC-NEXT: lmg %r13, %r15, 296(%r15)285; NOVEC-NEXT: br %r14286;287; VECTOR-LABEL: fun5:288; VECTOR: # %bb.0: # %entry289; VECTOR-NEXT: stmg %r13, %r15, 104(%r15)290; VECTOR-NEXT: .cfi_offset %r13, -56291; VECTOR-NEXT: .cfi_offset %r14, -48292; VECTOR-NEXT: .cfi_offset %r15, -40293; VECTOR-NEXT: aghi %r15, -192294; VECTOR-NEXT: .cfi_def_cfa_offset 352295; VECTOR-NEXT: vlreph %v0, 0(%r2)296; VECTOR-NEXT: la %r2, 160(%r15)297; VECTOR-NEXT: lgr %r13, %r3298; VECTOR-NEXT: brasl %r14, __extendhftf2@PLT299; VECTOR-NEXT: vl %v0, 160(%r15), 3300; VECTOR-NEXT: wfaxb %v0, %v0, %v0301; VECTOR-NEXT: la %r2, 176(%r15)302; VECTOR-NEXT: vst %v0, 176(%r15), 3303; VECTOR-NEXT: brasl %r14, __trunctfhf2@PLT304; VECTOR-NEXT: vsteh %v0, 0(%r13), 0305; VECTOR-NEXT: lmg %r13, %r15, 296(%r15)306; VECTOR-NEXT: br %r14307entry:308 %Op0 = load half, ptr %Src, align 2309 %E0 = fpext half %Op0 to fp128310 %Add = fadd fp128 %E0, %E0311 %Res = fptrunc fp128 %Add to half312 store half %Res, ptr %Dst, align 2313 ret void314}315 316; Test a chain of half operations which should have each operation surrounded317; by conversions to/from fp32 for proper emulation.318define half @fun6(half %Op0, half %Op1, half %Op2) {319; NOVEC-LABEL: fun6:320; NOVEC: # %bb.0: # %entry321; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)322; NOVEC-NEXT: .cfi_offset %r14, -48323; NOVEC-NEXT: .cfi_offset %r15, -40324; NOVEC-NEXT: aghi %r15, -184325; NOVEC-NEXT: .cfi_def_cfa_offset 344326; NOVEC-NEXT: std %f8, 176(%r15) # 8-byte Spill327; NOVEC-NEXT: std %f9, 168(%r15) # 8-byte Spill328; NOVEC-NEXT: std %f10, 160(%r15) # 8-byte Spill329; NOVEC-NEXT: .cfi_offset %f8, -168330; NOVEC-NEXT: .cfi_offset %f9, -176331; NOVEC-NEXT: .cfi_offset %f10, -184332; NOVEC-NEXT: ler %f9, %f0333; NOVEC-NEXT: ler %f0, %f2334; NOVEC-NEXT: ler %f8, %f4335; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT336; NOVEC-NEXT: ler %f10, %f0337; NOVEC-NEXT: ler %f0, %f9338; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT339; NOVEC-NEXT: aebr %f0, %f10340; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT341; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT342; NOVEC-NEXT: ler %f9, %f0343; NOVEC-NEXT: ler %f0, %f8344; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT345; NOVEC-NEXT: aebr %f0, %f9346; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT347; NOVEC-NEXT: ld %f8, 176(%r15) # 8-byte Reload348; NOVEC-NEXT: ld %f9, 168(%r15) # 8-byte Reload349; NOVEC-NEXT: ld %f10, 160(%r15) # 8-byte Reload350; NOVEC-NEXT: lmg %r14, %r15, 296(%r15)351; NOVEC-NEXT: br %r14352;353; VECTOR-LABEL: fun6:354; VECTOR: # %bb.0: # %entry355; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)356; VECTOR-NEXT: .cfi_offset %r14, -48357; VECTOR-NEXT: .cfi_offset %r15, -40358; VECTOR-NEXT: aghi %r15, -184359; VECTOR-NEXT: .cfi_def_cfa_offset 344360; VECTOR-NEXT: std %f8, 176(%r15) # 8-byte Spill361; VECTOR-NEXT: std %f9, 168(%r15) # 8-byte Spill362; VECTOR-NEXT: std %f10, 160(%r15) # 8-byte Spill363; VECTOR-NEXT: .cfi_offset %f8, -168364; VECTOR-NEXT: .cfi_offset %f9, -176365; VECTOR-NEXT: .cfi_offset %f10, -184366; VECTOR-NEXT: ldr %f9, %f0367; VECTOR-NEXT: ldr %f0, %f2368; VECTOR-NEXT: ldr %f8, %f4369; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT370; VECTOR-NEXT: ldr %f10, %f0371; VECTOR-NEXT: ldr %f0, %f9372; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT373; VECTOR-NEXT: aebr %f0, %f10374; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT375; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT376; VECTOR-NEXT: ldr %f9, %f0377; VECTOR-NEXT: ldr %f0, %f8378; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT379; VECTOR-NEXT: wfasb %f0, %f9, %f0380; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT381; VECTOR-NEXT: ld %f8, 176(%r15) # 8-byte Reload382; VECTOR-NEXT: ld %f9, 168(%r15) # 8-byte Reload383; VECTOR-NEXT: ld %f10, 160(%r15) # 8-byte Reload384; VECTOR-NEXT: lmg %r14, %r15, 296(%r15)385; VECTOR-NEXT: br %r14386entry:387 %A0 = fadd half %Op0, %Op1388 %Res = fadd half %A0, %Op2389 ret half %Res390}391 392; Store an incoming half argument and return a loaded one.393define half @fun7(half %Op0, ptr %Dst, ptr %Src) {394; NOVEC-LABEL: fun7:395; NOVEC: # %bb.0: # %entry396; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d397; NOVEC-NEXT: lgdr %r0, %f0398; NOVEC-NEXT: srlg %r0, %r0, 48399; NOVEC-NEXT: sth %r0, 0(%r2)400; NOVEC-NEXT: lgh %r0, 0(%r3)401; NOVEC-NEXT: sllg %r0, %r0, 48402; NOVEC-NEXT: ldgr %f0, %r0403; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d404; NOVEC-NEXT: br %r14405;406; VECTOR-LABEL: fun7:407; VECTOR: # %bb.0: # %entry408; VECTOR-NEXT: vsteh %v0, 0(%r2), 0409; VECTOR-NEXT: vlreph %v0, 0(%r3)410; VECTOR-NEXT: br %r14411entry:412 store half %Op0, ptr %Dst413 %Res = load half, ptr %Src414 ret half %Res415}416 417; Call a function with half argument and return values.418declare half @foo(half)419define void @fun8(ptr %Src, ptr %Dst) {420; NOVEC-LABEL: fun8:421; NOVEC: # %bb.0: # %entry422; NOVEC-NEXT: stmg %r13, %r15, 104(%r15)423; NOVEC-NEXT: .cfi_offset %r13, -56424; NOVEC-NEXT: .cfi_offset %r14, -48425; NOVEC-NEXT: .cfi_offset %r15, -40426; NOVEC-NEXT: aghi %r15, -160427; NOVEC-NEXT: .cfi_def_cfa_offset 320428; NOVEC-NEXT: lgh %r0, 0(%r2)429; NOVEC-NEXT: sllg %r0, %r0, 48430; NOVEC-NEXT: lgr %r13, %r3431; NOVEC-NEXT: ldgr %f0, %r0432; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d433; NOVEC-NEXT: brasl %r14, foo@PLT434; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d435; NOVEC-NEXT: lgdr %r0, %f0436; NOVEC-NEXT: srlg %r0, %r0, 48437; NOVEC-NEXT: sth %r0, 0(%r13)438; NOVEC-NEXT: lmg %r13, %r15, 264(%r15)439; NOVEC-NEXT: br %r14440;441; VECTOR-LABEL: fun8:442; VECTOR: # %bb.0: # %entry443; VECTOR-NEXT: stmg %r13, %r15, 104(%r15)444; VECTOR-NEXT: .cfi_offset %r13, -56445; VECTOR-NEXT: .cfi_offset %r14, -48446; VECTOR-NEXT: .cfi_offset %r15, -40447; VECTOR-NEXT: aghi %r15, -160448; VECTOR-NEXT: .cfi_def_cfa_offset 320449; VECTOR-NEXT: vlreph %v0, 0(%r2)450; VECTOR-NEXT: lgr %r13, %r3451; VECTOR-NEXT: brasl %r14, foo@PLT452; VECTOR-NEXT: vsteh %v0, 0(%r13), 0453; VECTOR-NEXT: lmg %r13, %r15, 264(%r15)454; VECTOR-NEXT: br %r14455entry:456 %arg = load half, ptr %Src457 %Res = call half @foo(half %arg)458 store half %Res, ptr %Dst459 ret void460}461 462; Receive stack argument.463define half @fun9(half %Arg0, half %Arg1, half %Arg2, half %Arg3, half %Arg4) {464; NOVEC-LABEL: fun9:465; NOVEC: # %bb.0:466; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)467; NOVEC-NEXT: .cfi_offset %r14, -48468; NOVEC-NEXT: .cfi_offset %r15, -40469; NOVEC-NEXT: aghi %r15, -176470; NOVEC-NEXT: .cfi_def_cfa_offset 336471; NOVEC-NEXT: std %f8, 168(%r15) # 8-byte Spill472; NOVEC-NEXT: std %f9, 160(%r15) # 8-byte Spill473; NOVEC-NEXT: .cfi_offset %f8, -168474; NOVEC-NEXT: .cfi_offset %f9, -176475; NOVEC-NEXT: lgh %r0, 342(%r15)476; NOVEC-NEXT: sllg %r0, %r0, 48477; NOVEC-NEXT: ler %f8, %f6478; NOVEC-NEXT: ldgr %f0, %r0479; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d480; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT481; NOVEC-NEXT: ler %f9, %f0482; NOVEC-NEXT: ler %f0, %f8483; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT484; NOVEC-NEXT: aebr %f0, %f9485; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT486; NOVEC-NEXT: ld %f8, 168(%r15) # 8-byte Reload487; NOVEC-NEXT: ld %f9, 160(%r15) # 8-byte Reload488; NOVEC-NEXT: lmg %r14, %r15, 288(%r15)489; NOVEC-NEXT: br %r14490;491; VECTOR-LABEL: fun9:492; VECTOR: # %bb.0:493; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)494; VECTOR-NEXT: .cfi_offset %r14, -48495; VECTOR-NEXT: .cfi_offset %r15, -40496; VECTOR-NEXT: aghi %r15, -176497; VECTOR-NEXT: .cfi_def_cfa_offset 336498; VECTOR-NEXT: std %f8, 168(%r15) # 8-byte Spill499; VECTOR-NEXT: std %f9, 160(%r15) # 8-byte Spill500; VECTOR-NEXT: .cfi_offset %f8, -168501; VECTOR-NEXT: .cfi_offset %f9, -176502; VECTOR-NEXT: vlreph %v0, 342(%r15)503; VECTOR-NEXT: ldr %f8, %f6504; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT505; VECTOR-NEXT: ldr %f9, %f0506; VECTOR-NEXT: ldr %f0, %f8507; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT508; VECTOR-NEXT: aebr %f0, %f9509; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT510; VECTOR-NEXT: ld %f8, 168(%r15) # 8-byte Reload511; VECTOR-NEXT: ld %f9, 160(%r15) # 8-byte Reload512; VECTOR-NEXT: lmg %r14, %r15, 288(%r15)513; VECTOR-NEXT: br %r14514 %A0 = fadd half %Arg3, %Arg4515 ret half %A0516}517 518; Pass stack argument.519define void @fun10(half %Arg0) {520; NOVEC-LABEL: fun10:521; NOVEC: # %bb.0:522; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)523; NOVEC-NEXT: .cfi_offset %r14, -48524; NOVEC-NEXT: .cfi_offset %r15, -40525; NOVEC-NEXT: aghi %r15, -168526; NOVEC-NEXT: .cfi_def_cfa_offset 328527; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d528; NOVEC-NEXT: lgdr %r0, %f0529; NOVEC-NEXT: srlg %r0, %r0, 48530; NOVEC-NEXT: ler %f2, %f0531; NOVEC-NEXT: ler %f4, %f0532; NOVEC-NEXT: ler %f6, %f0533; NOVEC-NEXT: sth %r0, 166(%r15)534; NOVEC-NEXT: brasl %r14, fun9@PLT535; NOVEC-NEXT: lmg %r14, %r15, 280(%r15)536; NOVEC-NEXT: br %r14537;538; VECTOR-LABEL: fun10:539; VECTOR: # %bb.0:540; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)541; VECTOR-NEXT: .cfi_offset %r14, -48542; VECTOR-NEXT: .cfi_offset %r15, -40543; VECTOR-NEXT: aghi %r15, -168544; VECTOR-NEXT: .cfi_def_cfa_offset 328545; VECTOR-NEXT: ldr %f2, %f0546; VECTOR-NEXT: ldr %f4, %f0547; VECTOR-NEXT: ldr %f6, %f0548; VECTOR-NEXT: vsteh %v0, 166(%r15), 0549; VECTOR-NEXT: brasl %r14, fun9@PLT550; VECTOR-NEXT: lmg %r14, %r15, 280(%r15)551; VECTOR-NEXT: br %r14552 call void @fun9(half %Arg0, half %Arg0, half %Arg0, half %Arg0, half %Arg0)553 ret void554}555 556; Test loading some immediates from the Constant Pool.557declare void @foo2(half, half, half, half)558define void @fun11() {559; NOVEC-LABEL: fun11:560; NOVEC: # %bb.0: # %entry561; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)562; NOVEC-NEXT: .cfi_offset %r14, -48563; NOVEC-NEXT: .cfi_offset %r15, -40564; NOVEC-NEXT: aghi %r15, -160565; NOVEC-NEXT: .cfi_def_cfa_offset 320566; NOVEC-NEXT: lghrl %r0, .LCPI11_0567; NOVEC-NEXT: sllg %r0, %r0, 48568; NOVEC-NEXT: ldgr %f4, %r0569; NOVEC-NEXT: lghrl %r0, .LCPI11_1570; NOVEC-NEXT: lzer %f2571; NOVEC-NEXT: lcdfr %f0, %f2572; NOVEC-NEXT: # kill: def $f4h killed $f4h killed $f4d573; NOVEC-NEXT: sllg %r0, %r0, 48574; NOVEC-NEXT: ldgr %f6, %r0575; NOVEC-NEXT: # kill: def $f6h killed $f6h killed $f6d576; NOVEC-NEXT: brasl %r14, foo2@PLT577; NOVEC-NEXT: lmg %r14, %r15, 272(%r15)578; NOVEC-NEXT: br %r14579;580; VECTOR-LABEL: fun11:581; VECTOR: # %bb.0: # %entry582; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)583; VECTOR-NEXT: .cfi_offset %r14, -48584; VECTOR-NEXT: .cfi_offset %r15, -40585; VECTOR-NEXT: aghi %r15, -160586; VECTOR-NEXT: .cfi_def_cfa_offset 320587; VECTOR-NEXT: lzer %f2588; VECTOR-NEXT: vrepih %v4, 13824589; VECTOR-NEXT: vrepih %v6, 15360590; VECTOR-NEXT: lcdfr %f0, %f2591; VECTOR-NEXT: brasl %r14, foo2@PLT592; VECTOR-NEXT: lmg %r14, %r15, 272(%r15)593; VECTOR-NEXT: br %r14594entry:595 call void @foo2(half -0.0, half 0.0, half 0.375, half 1.0)596 ret void597}598 599; Test a tail call.600declare void @foo3(half)601define void @fun12(half %Arg0) {602; NOVEC-LABEL: fun12:603; NOVEC: # %bb.0: # %entry604; NOVEC-NEXT: jg foo3@PLT605;606; VECTOR-LABEL: fun12:607; VECTOR: # %bb.0: # %entry608; VECTOR-NEXT: jg foo3@PLT609entry:610 tail call void @foo3(half %Arg0)611 ret void612}613