726 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; Add the <8 x half> argument with itself and return it.8define <8 x half> @fun0(<8 x half> %Op) {9; NOVEC-LABEL: fun0:10; NOVEC: # %bb.0: # %entry11; NOVEC-NEXT: stmg %r13, %r15, 104(%r15)12; NOVEC-NEXT: .cfi_offset %r13, -5613; NOVEC-NEXT: .cfi_offset %r14, -4814; NOVEC-NEXT: .cfi_offset %r15, -4015; NOVEC-NEXT: aghi %r15, -22416; NOVEC-NEXT: .cfi_def_cfa_offset 38417; NOVEC-NEXT: std %f8, 216(%r15) # 8-byte Spill18; NOVEC-NEXT: std %f9, 208(%r15) # 8-byte Spill19; NOVEC-NEXT: std %f10, 200(%r15) # 8-byte Spill20; NOVEC-NEXT: std %f11, 192(%r15) # 8-byte Spill21; NOVEC-NEXT: std %f12, 184(%r15) # 8-byte Spill22; NOVEC-NEXT: std %f13, 176(%r15) # 8-byte Spill23; NOVEC-NEXT: std %f14, 168(%r15) # 8-byte Spill24; NOVEC-NEXT: std %f15, 160(%r15) # 8-byte Spill25; NOVEC-NEXT: .cfi_offset %f8, -16826; NOVEC-NEXT: .cfi_offset %f9, -17627; NOVEC-NEXT: .cfi_offset %f10, -18428; NOVEC-NEXT: .cfi_offset %f11, -19229; NOVEC-NEXT: .cfi_offset %f12, -20030; NOVEC-NEXT: .cfi_offset %f13, -20831; NOVEC-NEXT: .cfi_offset %f14, -21632; NOVEC-NEXT: .cfi_offset %f15, -22433; NOVEC-NEXT: lgh %r0, 414(%r15)34; NOVEC-NEXT: sllg %r0, %r0, 4835; NOVEC-NEXT: ldgr %f14, %r036; NOVEC-NEXT: lgh %r0, 406(%r15)37; NOVEC-NEXT: sllg %r0, %r0, 4838; NOVEC-NEXT: ldgr %f12, %r039; NOVEC-NEXT: lgh %r0, 398(%r15)40; NOVEC-NEXT: sllg %r0, %r0, 4841; NOVEC-NEXT: ldgr %f9, %r042; NOVEC-NEXT: lgh %r0, 390(%r15)43; NOVEC-NEXT: sllg %r0, %r0, 4844; NOVEC-NEXT: ler %f10, %f645; NOVEC-NEXT: ler %f11, %f446; NOVEC-NEXT: ler %f13, %f247; NOVEC-NEXT: ler %f15, %f048; NOVEC-NEXT: lgr %r13, %r249; NOVEC-NEXT: ldgr %f0, %r050; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d51; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT52; NOVEC-NEXT: aebr %f0, %f053; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT54; NOVEC-NEXT: ler %f8, %f055; NOVEC-NEXT: ler %f0, %f956; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT57; NOVEC-NEXT: aebr %f0, %f058; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT59; NOVEC-NEXT: ler %f9, %f060; NOVEC-NEXT: ler %f0, %f1261; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT62; NOVEC-NEXT: aebr %f0, %f063; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT64; NOVEC-NEXT: ler %f12, %f065; NOVEC-NEXT: ler %f0, %f1466; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT67; NOVEC-NEXT: aebr %f0, %f068; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT69; NOVEC-NEXT: ler %f14, %f070; NOVEC-NEXT: ler %f0, %f1571; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT72; NOVEC-NEXT: aebr %f0, %f073; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT74; NOVEC-NEXT: ler %f15, %f075; NOVEC-NEXT: ler %f0, %f1376; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT77; NOVEC-NEXT: aebr %f0, %f078; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT79; NOVEC-NEXT: ler %f13, %f080; NOVEC-NEXT: ler %f0, %f1181; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT82; NOVEC-NEXT: aebr %f0, %f083; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT84; NOVEC-NEXT: ler %f11, %f085; NOVEC-NEXT: ler %f0, %f1086; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT87; NOVEC-NEXT: aebr %f0, %f088; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT89; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d90; NOVEC-NEXT: lgdr %r0, %f091; NOVEC-NEXT: srlg %r0, %r0, 4892; NOVEC-NEXT: sth %r0, 6(%r13)93; NOVEC-NEXT: lgdr %r0, %f1194; NOVEC-NEXT: srlg %r0, %r0, 4895; NOVEC-NEXT: sth %r0, 4(%r13)96; NOVEC-NEXT: lgdr %r0, %f1397; NOVEC-NEXT: srlg %r0, %r0, 4898; NOVEC-NEXT: sth %r0, 2(%r13)99; NOVEC-NEXT: lgdr %r0, %f15100; NOVEC-NEXT: srlg %r0, %r0, 48101; NOVEC-NEXT: sth %r0, 0(%r13)102; NOVEC-NEXT: lgdr %r0, %f14103; NOVEC-NEXT: srlg %r0, %r0, 48104; NOVEC-NEXT: sth %r0, 14(%r13)105; NOVEC-NEXT: lgdr %r0, %f12106; NOVEC-NEXT: srlg %r0, %r0, 48107; NOVEC-NEXT: sth %r0, 12(%r13)108; NOVEC-NEXT: lgdr %r0, %f9109; NOVEC-NEXT: srlg %r0, %r0, 48110; NOVEC-NEXT: sth %r0, 10(%r13)111; NOVEC-NEXT: lgdr %r0, %f8112; NOVEC-NEXT: srlg %r0, %r0, 48113; NOVEC-NEXT: sth %r0, 8(%r13)114; NOVEC-NEXT: ld %f8, 216(%r15) # 8-byte Reload115; NOVEC-NEXT: ld %f9, 208(%r15) # 8-byte Reload116; NOVEC-NEXT: ld %f10, 200(%r15) # 8-byte Reload117; NOVEC-NEXT: ld %f11, 192(%r15) # 8-byte Reload118; NOVEC-NEXT: ld %f12, 184(%r15) # 8-byte Reload119; NOVEC-NEXT: ld %f13, 176(%r15) # 8-byte Reload120; NOVEC-NEXT: ld %f14, 168(%r15) # 8-byte Reload121; NOVEC-NEXT: ld %f15, 160(%r15) # 8-byte Reload122; NOVEC-NEXT: lmg %r13, %r15, 328(%r15)123; NOVEC-NEXT: br %r14124;125; VECTOR-LABEL: fun0:126; VECTOR: # %bb.0: # %entry127; VECTOR-NEXT: stmg %r13, %r15, 104(%r15)128; VECTOR-NEXT: .cfi_offset %r13, -56129; VECTOR-NEXT: .cfi_offset %r14, -48130; VECTOR-NEXT: .cfi_offset %r15, -40131; VECTOR-NEXT: aghi %r15, -224132; VECTOR-NEXT: .cfi_def_cfa_offset 384133; VECTOR-NEXT: std %f8, 216(%r15) # 8-byte Spill134; VECTOR-NEXT: std %f9, 208(%r15) # 8-byte Spill135; VECTOR-NEXT: std %f10, 200(%r15) # 8-byte Spill136; VECTOR-NEXT: std %f11, 192(%r15) # 8-byte Spill137; VECTOR-NEXT: std %f12, 184(%r15) # 8-byte Spill138; VECTOR-NEXT: std %f13, 176(%r15) # 8-byte Spill139; VECTOR-NEXT: std %f14, 168(%r15) # 8-byte Spill140; VECTOR-NEXT: std %f15, 160(%r15) # 8-byte Spill141; VECTOR-NEXT: .cfi_offset %f8, -168142; VECTOR-NEXT: .cfi_offset %f9, -176143; VECTOR-NEXT: .cfi_offset %f10, -184144; VECTOR-NEXT: .cfi_offset %f11, -192145; VECTOR-NEXT: .cfi_offset %f12, -200146; VECTOR-NEXT: .cfi_offset %f13, -208147; VECTOR-NEXT: .cfi_offset %f14, -216148; VECTOR-NEXT: .cfi_offset %f15, -224149; VECTOR-NEXT: vlreph %v11, 414(%r15)150; VECTOR-NEXT: vlreph %v12, 406(%r15)151; VECTOR-NEXT: vlreph %v13, 398(%r15)152; VECTOR-NEXT: vlreph %v14, 390(%r15)153; VECTOR-NEXT: ldr %f8, %f6154; VECTOR-NEXT: ldr %f9, %f4155; VECTOR-NEXT: ldr %f10, %f2156; VECTOR-NEXT: lgr %r13, %r2157; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT158; VECTOR-NEXT: aebr %f0, %f0159; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT160; VECTOR-NEXT: ldr %f15, %f0161; VECTOR-NEXT: ldr %f0, %f10162; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT163; VECTOR-NEXT: aebr %f0, %f0164; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT165; VECTOR-NEXT: ldr %f10, %f0166; VECTOR-NEXT: ldr %f0, %f9167; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT168; VECTOR-NEXT: aebr %f0, %f0169; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT170; VECTOR-NEXT: ldr %f9, %f0171; VECTOR-NEXT: ldr %f0, %f8172; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT173; VECTOR-NEXT: aebr %f0, %f0174; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT175; VECTOR-NEXT: ldr %f8, %f0176; VECTOR-NEXT: ldr %f0, %f14177; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT178; VECTOR-NEXT: aebr %f0, %f0179; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT180; VECTOR-NEXT: ldr %f14, %f0181; VECTOR-NEXT: ldr %f0, %f13182; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT183; VECTOR-NEXT: aebr %f0, %f0184; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT185; VECTOR-NEXT: ldr %f13, %f0186; VECTOR-NEXT: ldr %f0, %f12187; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT188; VECTOR-NEXT: aebr %f0, %f0189; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT190; VECTOR-NEXT: ldr %f12, %f0191; VECTOR-NEXT: ldr %f0, %f11192; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT193; VECTOR-NEXT: aebr %f0, %f0194; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT195; VECTOR-NEXT: vsteh %v0, 14(%r13), 0196; VECTOR-NEXT: vsteh %v12, 12(%r13), 0197; VECTOR-NEXT: vsteh %v13, 10(%r13), 0198; VECTOR-NEXT: vsteh %v14, 8(%r13), 0199; VECTOR-NEXT: vsteh %v8, 6(%r13), 0200; VECTOR-NEXT: vsteh %v9, 4(%r13), 0201; VECTOR-NEXT: vsteh %v10, 2(%r13), 0202; VECTOR-NEXT: vsteh %v15, 0(%r13), 0203; VECTOR-NEXT: ld %f8, 216(%r15) # 8-byte Reload204; VECTOR-NEXT: ld %f9, 208(%r15) # 8-byte Reload205; VECTOR-NEXT: ld %f10, 200(%r15) # 8-byte Reload206; VECTOR-NEXT: ld %f11, 192(%r15) # 8-byte Reload207; VECTOR-NEXT: ld %f12, 184(%r15) # 8-byte Reload208; VECTOR-NEXT: ld %f13, 176(%r15) # 8-byte Reload209; VECTOR-NEXT: ld %f14, 168(%r15) # 8-byte Reload210; VECTOR-NEXT: ld %f15, 160(%r15) # 8-byte Reload211; VECTOR-NEXT: lmg %r13, %r15, 328(%r15)212; VECTOR-NEXT: br %r14213entry:214 %Res = fadd <8 x half> %Op, %Op215 ret <8 x half> %Res216}217 218; Same, but with partial vector values.219define <4 x half> @fun1(<4 x half> %Op) {220; NOVEC-LABEL: fun1:221; NOVEC: # %bb.0: # %entry222; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)223; NOVEC-NEXT: .cfi_offset %r14, -48224; NOVEC-NEXT: .cfi_offset %r15, -40225; NOVEC-NEXT: aghi %r15, -192226; NOVEC-NEXT: .cfi_def_cfa_offset 352227; NOVEC-NEXT: std %f8, 184(%r15) # 8-byte Spill228; NOVEC-NEXT: std %f9, 176(%r15) # 8-byte Spill229; NOVEC-NEXT: std %f10, 168(%r15) # 8-byte Spill230; NOVEC-NEXT: std %f11, 160(%r15) # 8-byte Spill231; NOVEC-NEXT: .cfi_offset %f8, -168232; NOVEC-NEXT: .cfi_offset %f9, -176233; NOVEC-NEXT: .cfi_offset %f10, -184234; NOVEC-NEXT: .cfi_offset %f11, -192235; NOVEC-NEXT: ler %f8, %f6236; NOVEC-NEXT: ler %f9, %f4237; NOVEC-NEXT: ler %f10, %f2238; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT239; NOVEC-NEXT: aebr %f0, %f0240; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT241; NOVEC-NEXT: ler %f11, %f0242; NOVEC-NEXT: ler %f0, %f10243; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT244; NOVEC-NEXT: aebr %f0, %f0245; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT246; NOVEC-NEXT: ler %f10, %f0247; NOVEC-NEXT: ler %f0, %f9248; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT249; NOVEC-NEXT: aebr %f0, %f0250; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT251; NOVEC-NEXT: ler %f9, %f0252; NOVEC-NEXT: ler %f0, %f8253; NOVEC-NEXT: brasl %r14, __extendhfsf2@PLT254; NOVEC-NEXT: aebr %f0, %f0255; NOVEC-NEXT: brasl %r14, __truncsfhf2@PLT256; NOVEC-NEXT: ler %f6, %f0257; NOVEC-NEXT: ler %f0, %f11258; NOVEC-NEXT: ler %f2, %f10259; NOVEC-NEXT: ler %f4, %f9260; NOVEC-NEXT: ld %f8, 184(%r15) # 8-byte Reload261; NOVEC-NEXT: ld %f9, 176(%r15) # 8-byte Reload262; NOVEC-NEXT: ld %f10, 168(%r15) # 8-byte Reload263; NOVEC-NEXT: ld %f11, 160(%r15) # 8-byte Reload264; NOVEC-NEXT: lmg %r14, %r15, 304(%r15)265; NOVEC-NEXT: br %r14266;267; VECTOR-LABEL: fun1:268; VECTOR: # %bb.0: # %entry269; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)270; VECTOR-NEXT: .cfi_offset %r14, -48271; VECTOR-NEXT: .cfi_offset %r15, -40272; VECTOR-NEXT: aghi %r15, -192273; VECTOR-NEXT: .cfi_def_cfa_offset 352274; VECTOR-NEXT: std %f8, 184(%r15) # 8-byte Spill275; VECTOR-NEXT: std %f9, 176(%r15) # 8-byte Spill276; VECTOR-NEXT: std %f10, 168(%r15) # 8-byte Spill277; VECTOR-NEXT: std %f11, 160(%r15) # 8-byte Spill278; VECTOR-NEXT: .cfi_offset %f8, -168279; VECTOR-NEXT: .cfi_offset %f9, -176280; VECTOR-NEXT: .cfi_offset %f10, -184281; VECTOR-NEXT: .cfi_offset %f11, -192282; VECTOR-NEXT: ldr %f8, %f6283; VECTOR-NEXT: ldr %f9, %f4284; VECTOR-NEXT: ldr %f10, %f2285; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT286; VECTOR-NEXT: aebr %f0, %f0287; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT288; VECTOR-NEXT: ldr %f11, %f0289; VECTOR-NEXT: ldr %f0, %f10290; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT291; VECTOR-NEXT: aebr %f0, %f0292; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT293; VECTOR-NEXT: ldr %f10, %f0294; VECTOR-NEXT: ldr %f0, %f9295; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT296; VECTOR-NEXT: aebr %f0, %f0297; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT298; VECTOR-NEXT: ldr %f9, %f0299; VECTOR-NEXT: ldr %f0, %f8300; VECTOR-NEXT: brasl %r14, __extendhfsf2@PLT301; VECTOR-NEXT: aebr %f0, %f0302; VECTOR-NEXT: brasl %r14, __truncsfhf2@PLT303; VECTOR-NEXT: ldr %f6, %f0304; VECTOR-NEXT: ldr %f0, %f11305; VECTOR-NEXT: ldr %f2, %f10306; VECTOR-NEXT: ldr %f4, %f9307; VECTOR-NEXT: ld %f8, 184(%r15) # 8-byte Reload308; VECTOR-NEXT: ld %f9, 176(%r15) # 8-byte Reload309; VECTOR-NEXT: ld %f10, 168(%r15) # 8-byte Reload310; VECTOR-NEXT: ld %f11, 160(%r15) # 8-byte Reload311; VECTOR-NEXT: lmg %r14, %r15, 304(%r15)312; VECTOR-NEXT: br %r14313entry:314 %Res = fadd <4 x half> %Op, %Op315 ret <4 x half> %Res316}317 318; Test a vector extension.319define <2 x half> @fun2(<2 x half> %Op) {320; NOVEC-LABEL: fun2:321; NOVEC: # %bb.0: # %entry322; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)323; NOVEC-NEXT: .cfi_offset %r14, -48324; NOVEC-NEXT: .cfi_offset %r15, -40325; NOVEC-NEXT: aghi %r15, -176326; NOVEC-NEXT: .cfi_def_cfa_offset 336327; NOVEC-NEXT: std %f8, 168(%r15) # 8-byte Spill328; NOVEC-NEXT: std %f9, 160(%r15) # 8-byte Spill329; NOVEC-NEXT: .cfi_offset %f8, -168330; NOVEC-NEXT: .cfi_offset %f9, -176331; NOVEC-NEXT: ler %f8, %f2332; NOVEC-NEXT: brasl %r14, __extendhfdf2@PLT333; NOVEC-NEXT: ldr %f9, %f0334; NOVEC-NEXT: ler %f0, %f8335; NOVEC-NEXT: brasl %r14, __extendhfdf2@PLT336; NOVEC-NEXT: adbr %f9, %f9337; NOVEC-NEXT: ldr %f8, %f0338; NOVEC-NEXT: adbr %f8, %f0339; NOVEC-NEXT: ldr %f0, %f9340; NOVEC-NEXT: brasl %r14, __truncdfhf2@PLT341; NOVEC-NEXT: ler %f9, %f0342; NOVEC-NEXT: ldr %f0, %f8343; NOVEC-NEXT: brasl %r14, __truncdfhf2@PLT344; NOVEC-NEXT: ler %f2, %f0345; NOVEC-NEXT: ler %f0, %f9346; NOVEC-NEXT: ld %f8, 168(%r15) # 8-byte Reload347; NOVEC-NEXT: ld %f9, 160(%r15) # 8-byte Reload348; NOVEC-NEXT: lmg %r14, %r15, 288(%r15)349; NOVEC-NEXT: br %r14350;351; VECTOR-LABEL: fun2:352; VECTOR: # %bb.0: # %entry353; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)354; VECTOR-NEXT: .cfi_offset %r14, -48355; VECTOR-NEXT: .cfi_offset %r15, -40356; VECTOR-NEXT: aghi %r15, -184357; VECTOR-NEXT: .cfi_def_cfa_offset 344358; VECTOR-NEXT: std %f8, 176(%r15) # 8-byte Spill359; VECTOR-NEXT: .cfi_offset %f8, -168360; VECTOR-NEXT: ldr %f8, %f0361; VECTOR-NEXT: ldr %f0, %f2362; VECTOR-NEXT: brasl %r14, __extendhfdf2@PLT363; VECTOR-NEXT: # kill: def $f0d killed $f0d def $v0364; VECTOR-NEXT: vst %v0, 160(%r15), 3 # 16-byte Spill365; VECTOR-NEXT: ldr %f0, %f8366; VECTOR-NEXT: brasl %r14, __extendhfdf2@PLT367; VECTOR-NEXT: vl %v1, 160(%r15), 3 # 16-byte Reload368; VECTOR-NEXT: # kill: def $f0d killed $f0d def $v0369; VECTOR-NEXT: vmrhg %v0, %v0, %v1370; VECTOR-NEXT: vfadb %v0, %v0, %v0371; VECTOR-NEXT: vst %v0, 160(%r15), 3 # 16-byte Spill372; VECTOR-NEXT: # kill: def $f0d killed $f0d killed $v0373; VECTOR-NEXT: brasl %r14, __truncdfhf2@PLT374; VECTOR-NEXT: ldr %f8, %f0375; VECTOR-NEXT: vl %v0, 160(%r15), 3 # 16-byte Reload376; VECTOR-NEXT: vrepg %v0, %v0, 1377; VECTOR-NEXT: # kill: def $f0d killed $f0d killed $v0378; VECTOR-NEXT: brasl %r14, __truncdfhf2@PLT379; VECTOR-NEXT: ldr %f2, %f0380; VECTOR-NEXT: ldr %f0, %f8381; VECTOR-NEXT: ld %f8, 176(%r15) # 8-byte Reload382; VECTOR-NEXT: lmg %r14, %r15, 296(%r15)383; VECTOR-NEXT: br %r14384entry:385 %E = fpext <2 x half> %Op to <2 x double>386 %Add = fadd <2 x double> %E, %E387 %Res = fptrunc <2 x double> %Add to <2 x half>388 ret <2 x half> %Res389}390 391; Load and store an <8 x half> vector.392define void @fun3(ptr %Src, ptr %Dst) {393; NOVEC-LABEL: fun3:394; NOVEC: # %bb.0: # %entry395; NOVEC-NEXT: lgh %r0, 0(%r2)396; NOVEC-NEXT: sllg %r0, %r0, 48397; NOVEC-NEXT: ldgr %f0, %r0398; NOVEC-NEXT: lgh %r0, 2(%r2)399; NOVEC-NEXT: sllg %r0, %r0, 48400; NOVEC-NEXT: ldgr %f1, %r0401; NOVEC-NEXT: lgh %r0, 4(%r2)402; NOVEC-NEXT: sllg %r0, %r0, 48403; NOVEC-NEXT: ldgr %f2, %r0404; NOVEC-NEXT: lgh %r0, 6(%r2)405; NOVEC-NEXT: sllg %r0, %r0, 48406; NOVEC-NEXT: ldgr %f3, %r0407; NOVEC-NEXT: lgh %r0, 8(%r2)408; NOVEC-NEXT: sllg %r0, %r0, 48409; NOVEC-NEXT: ldgr %f4, %r0410; NOVEC-NEXT: lgh %r0, 10(%r2)411; NOVEC-NEXT: sllg %r0, %r0, 48412; NOVEC-NEXT: ldgr %f5, %r0413; NOVEC-NEXT: lgh %r0, 12(%r2)414; NOVEC-NEXT: sllg %r0, %r0, 48415; NOVEC-NEXT: ldgr %f6, %r0416; NOVEC-NEXT: lgh %r0, 14(%r2)417; NOVEC-NEXT: sllg %r0, %r0, 48418; NOVEC-NEXT: ldgr %f7, %r0419; NOVEC-NEXT: lgdr %r0, %f7420; NOVEC-NEXT: srlg %r0, %r0, 48421; NOVEC-NEXT: sth %r0, 14(%r3)422; NOVEC-NEXT: lgdr %r0, %f6423; NOVEC-NEXT: srlg %r0, %r0, 48424; NOVEC-NEXT: sth %r0, 12(%r3)425; NOVEC-NEXT: lgdr %r0, %f5426; NOVEC-NEXT: srlg %r0, %r0, 48427; NOVEC-NEXT: sth %r0, 10(%r3)428; NOVEC-NEXT: lgdr %r0, %f4429; NOVEC-NEXT: srlg %r0, %r0, 48430; NOVEC-NEXT: sth %r0, 8(%r3)431; NOVEC-NEXT: lgdr %r0, %f3432; NOVEC-NEXT: srlg %r0, %r0, 48433; NOVEC-NEXT: sth %r0, 6(%r3)434; NOVEC-NEXT: lgdr %r0, %f2435; NOVEC-NEXT: srlg %r0, %r0, 48436; NOVEC-NEXT: sth %r0, 4(%r3)437; NOVEC-NEXT: lgdr %r0, %f1438; NOVEC-NEXT: srlg %r0, %r0, 48439; NOVEC-NEXT: sth %r0, 2(%r3)440; NOVEC-NEXT: lgdr %r0, %f0441; NOVEC-NEXT: srlg %r0, %r0, 48442; NOVEC-NEXT: sth %r0, 0(%r3)443; NOVEC-NEXT: br %r14444;445; VECTOR-LABEL: fun3:446; VECTOR: # %bb.0: # %entry447; VECTOR-NEXT: vlreph %v0, 0(%r2)448; VECTOR-NEXT: vlreph %v1, 2(%r2)449; VECTOR-NEXT: vlreph %v2, 4(%r2)450; VECTOR-NEXT: vlreph %v3, 6(%r2)451; VECTOR-NEXT: vlreph %v4, 8(%r2)452; VECTOR-NEXT: vlreph %v5, 10(%r2)453; VECTOR-NEXT: vlreph %v6, 12(%r2)454; VECTOR-NEXT: vlreph %v7, 14(%r2)455; VECTOR-NEXT: vsteh %v7, 14(%r3), 0456; VECTOR-NEXT: vsteh %v6, 12(%r3), 0457; VECTOR-NEXT: vsteh %v5, 10(%r3), 0458; VECTOR-NEXT: vsteh %v4, 8(%r3), 0459; VECTOR-NEXT: vsteh %v3, 6(%r3), 0460; VECTOR-NEXT: vsteh %v2, 4(%r3), 0461; VECTOR-NEXT: vsteh %v1, 2(%r3), 0462; VECTOR-NEXT: vsteh %v0, 0(%r3), 0463; VECTOR-NEXT: br %r14464entry:465 %L = load <8 x half>, ptr %Src466 store <8 x half> %L, ptr %Dst467 ret void468}469 470; Call a function with <8 x half> argument and return values.471declare <8 x half> @foo(<8 x half>)472define void @fun4(ptr %Src, ptr %Dst) {473; NOVEC-LABEL: fun4:474; NOVEC: # %bb.0: # %entry475; NOVEC-NEXT: stmg %r13, %r15, 104(%r15)476; NOVEC-NEXT: .cfi_offset %r13, -56477; NOVEC-NEXT: .cfi_offset %r14, -48478; NOVEC-NEXT: .cfi_offset %r15, -40479; NOVEC-NEXT: aghi %r15, -208480; NOVEC-NEXT: .cfi_def_cfa_offset 368481; NOVEC-NEXT: lgh %r0, 0(%r2)482; NOVEC-NEXT: sllg %r0, %r0, 48483; NOVEC-NEXT: ldgr %f0, %r0484; NOVEC-NEXT: lgh %r0, 2(%r2)485; NOVEC-NEXT: sllg %r0, %r0, 48486; NOVEC-NEXT: ldgr %f2, %r0487; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d488; NOVEC-NEXT: # kill: def $f2h killed $f2h killed $f2d489; NOVEC-NEXT: lgh %r0, 4(%r2)490; NOVEC-NEXT: sllg %r0, %r0, 48491; NOVEC-NEXT: ldgr %f4, %r0492; NOVEC-NEXT: # kill: def $f4h killed $f4h killed $f4d493; NOVEC-NEXT: lgh %r0, 6(%r2)494; NOVEC-NEXT: sllg %r0, %r0, 48495; NOVEC-NEXT: ldgr %f6, %r0496; NOVEC-NEXT: # kill: def $f6h killed $f6h killed $f6d497; NOVEC-NEXT: lgh %r0, 8(%r2)498; NOVEC-NEXT: sllg %r0, %r0, 48499; NOVEC-NEXT: ldgr %f1, %r0500; NOVEC-NEXT: lgh %r0, 10(%r2)501; NOVEC-NEXT: sllg %r0, %r0, 48502; NOVEC-NEXT: ldgr %f3, %r0503; NOVEC-NEXT: lgh %r0, 12(%r2)504; NOVEC-NEXT: sllg %r0, %r0, 48505; NOVEC-NEXT: ldgr %f5, %r0506; NOVEC-NEXT: lgh %r0, 14(%r2)507; NOVEC-NEXT: sllg %r0, %r0, 48508; NOVEC-NEXT: ldgr %f7, %r0509; NOVEC-NEXT: lgdr %r0, %f7510; NOVEC-NEXT: srlg %r0, %r0, 48511; NOVEC-NEXT: sth %r0, 190(%r15)512; NOVEC-NEXT: lgdr %r0, %f5513; NOVEC-NEXT: srlg %r0, %r0, 48514; NOVEC-NEXT: sth %r0, 182(%r15)515; NOVEC-NEXT: lgdr %r0, %f3516; NOVEC-NEXT: srlg %r0, %r0, 48517; NOVEC-NEXT: sth %r0, 174(%r15)518; NOVEC-NEXT: lgdr %r0, %f1519; NOVEC-NEXT: srlg %r0, %r0, 48520; NOVEC-NEXT: la %r2, 192(%r15)521; NOVEC-NEXT: lgr %r13, %r3522; NOVEC-NEXT: sth %r0, 166(%r15)523; NOVEC-NEXT: brasl %r14, foo@PLT524; NOVEC-NEXT: lgh %r0, 192(%r15)525; NOVEC-NEXT: sllg %r0, %r0, 48526; NOVEC-NEXT: ldgr %f0, %r0527; NOVEC-NEXT: lgh %r0, 194(%r15)528; NOVEC-NEXT: sllg %r0, %r0, 48529; NOVEC-NEXT: ldgr %f1, %r0530; NOVEC-NEXT: lgh %r0, 196(%r15)531; NOVEC-NEXT: sllg %r0, %r0, 48532; NOVEC-NEXT: ldgr %f2, %r0533; NOVEC-NEXT: lgh %r0, 198(%r15)534; NOVEC-NEXT: sllg %r0, %r0, 48535; NOVEC-NEXT: ldgr %f3, %r0536; NOVEC-NEXT: lgh %r0, 200(%r15)537; NOVEC-NEXT: sllg %r0, %r0, 48538; NOVEC-NEXT: ldgr %f4, %r0539; NOVEC-NEXT: lgh %r0, 202(%r15)540; NOVEC-NEXT: sllg %r0, %r0, 48541; NOVEC-NEXT: ldgr %f5, %r0542; NOVEC-NEXT: lgh %r0, 204(%r15)543; NOVEC-NEXT: sllg %r0, %r0, 48544; NOVEC-NEXT: ldgr %f6, %r0545; NOVEC-NEXT: lgh %r0, 206(%r15)546; NOVEC-NEXT: sllg %r0, %r0, 48547; NOVEC-NEXT: ldgr %f7, %r0548; NOVEC-NEXT: lgdr %r0, %f7549; NOVEC-NEXT: srlg %r0, %r0, 48550; NOVEC-NEXT: sth %r0, 14(%r13)551; NOVEC-NEXT: lgdr %r0, %f6552; NOVEC-NEXT: srlg %r0, %r0, 48553; NOVEC-NEXT: sth %r0, 12(%r13)554; NOVEC-NEXT: lgdr %r0, %f5555; NOVEC-NEXT: srlg %r0, %r0, 48556; NOVEC-NEXT: sth %r0, 10(%r13)557; NOVEC-NEXT: lgdr %r0, %f4558; NOVEC-NEXT: srlg %r0, %r0, 48559; NOVEC-NEXT: sth %r0, 8(%r13)560; NOVEC-NEXT: lgdr %r0, %f3561; NOVEC-NEXT: srlg %r0, %r0, 48562; NOVEC-NEXT: sth %r0, 6(%r13)563; NOVEC-NEXT: lgdr %r0, %f2564; NOVEC-NEXT: srlg %r0, %r0, 48565; NOVEC-NEXT: sth %r0, 4(%r13)566; NOVEC-NEXT: lgdr %r0, %f1567; NOVEC-NEXT: srlg %r0, %r0, 48568; NOVEC-NEXT: sth %r0, 2(%r13)569; NOVEC-NEXT: lgdr %r0, %f0570; NOVEC-NEXT: srlg %r0, %r0, 48571; NOVEC-NEXT: sth %r0, 0(%r13)572; NOVEC-NEXT: lmg %r13, %r15, 312(%r15)573; NOVEC-NEXT: br %r14574;575; VECTOR-LABEL: fun4:576; VECTOR: # %bb.0: # %entry577; VECTOR-NEXT: stmg %r13, %r15, 104(%r15)578; VECTOR-NEXT: .cfi_offset %r13, -56579; VECTOR-NEXT: .cfi_offset %r14, -48580; VECTOR-NEXT: .cfi_offset %r15, -40581; VECTOR-NEXT: aghi %r15, -208582; VECTOR-NEXT: .cfi_def_cfa_offset 368583; VECTOR-NEXT: vlreph %v6, 6(%r2)584; VECTOR-NEXT: vlreph %v4, 4(%r2)585; VECTOR-NEXT: vlreph %v2, 2(%r2)586; VECTOR-NEXT: vlreph %v0, 0(%r2)587; VECTOR-NEXT: vlreph %v1, 8(%r2)588; VECTOR-NEXT: vlreph %v3, 10(%r2)589; VECTOR-NEXT: vlreph %v5, 12(%r2)590; VECTOR-NEXT: vlreph %v7, 14(%r2)591; VECTOR-NEXT: la %r2, 192(%r15)592; VECTOR-NEXT: lgr %r13, %r3593; VECTOR-NEXT: vsteh %v7, 190(%r15), 0594; VECTOR-NEXT: vsteh %v5, 182(%r15), 0595; VECTOR-NEXT: vsteh %v3, 174(%r15), 0596; VECTOR-NEXT: vsteh %v1, 166(%r15), 0597; VECTOR-NEXT: brasl %r14, foo@PLT598; VECTOR-NEXT: vlreph %v0, 192(%r15)599; VECTOR-NEXT: vlreph %v1, 194(%r15)600; VECTOR-NEXT: vlreph %v2, 196(%r15)601; VECTOR-NEXT: vlreph %v3, 198(%r15)602; VECTOR-NEXT: vlreph %v4, 200(%r15)603; VECTOR-NEXT: vlreph %v5, 202(%r15)604; VECTOR-NEXT: vlreph %v6, 204(%r15)605; VECTOR-NEXT: vlreph %v7, 206(%r15)606; VECTOR-NEXT: vsteh %v7, 14(%r13), 0607; VECTOR-NEXT: vsteh %v6, 12(%r13), 0608; VECTOR-NEXT: vsteh %v5, 10(%r13), 0609; VECTOR-NEXT: vsteh %v4, 8(%r13), 0610; VECTOR-NEXT: vsteh %v3, 6(%r13), 0611; VECTOR-NEXT: vsteh %v2, 4(%r13), 0612; VECTOR-NEXT: vsteh %v1, 2(%r13), 0613; VECTOR-NEXT: vsteh %v0, 0(%r13), 0614; VECTOR-NEXT: lmg %r13, %r15, 312(%r15)615; VECTOR-NEXT: br %r14616entry:617 %arg = load <8 x half>, ptr %Src618 %Res = call <8 x half> @foo(<8 x half> %arg)619 store <8 x half> %Res, ptr %Dst620 ret void621}622 623; Receive and pass argument fully on stack.624declare void @foo2(<4 x half> %dummy, <8 x half> %Arg5)625define void @fun5(<4 x half> %dummy, <8 x half> %Arg5) {626; NOVEC-LABEL: fun5:627; NOVEC: # %bb.0:628; NOVEC-NEXT: stmg %r14, %r15, 112(%r15)629; NOVEC-NEXT: .cfi_offset %r14, -48630; NOVEC-NEXT: .cfi_offset %r15, -40631; NOVEC-NEXT: aghi %r15, -256632; NOVEC-NEXT: .cfi_def_cfa_offset 416633; NOVEC-NEXT: std %f8, 248(%r15) # 8-byte Spill634; NOVEC-NEXT: std %f9, 240(%r15) # 8-byte Spill635; NOVEC-NEXT: std %f10, 232(%r15) # 8-byte Spill636; NOVEC-NEXT: std %f11, 224(%r15) # 8-byte Spill637; NOVEC-NEXT: .cfi_offset %f8, -168638; NOVEC-NEXT: .cfi_offset %f9, -176639; NOVEC-NEXT: .cfi_offset %f10, -184640; NOVEC-NEXT: .cfi_offset %f11, -192641; NOVEC-NEXT: lgh %r0, 422(%r15)642; NOVEC-NEXT: sllg %r0, %r0, 48643; NOVEC-NEXT: ldgr %f1, %r0644; NOVEC-NEXT: lgh %r0, 430(%r15)645; NOVEC-NEXT: sllg %r0, %r0, 48646; NOVEC-NEXT: ldgr %f3, %r0647; NOVEC-NEXT: lgh %r0, 438(%r15)648; NOVEC-NEXT: sllg %r0, %r0, 48649; NOVEC-NEXT: ldgr %f5, %r0650; NOVEC-NEXT: lgh %r0, 446(%r15)651; NOVEC-NEXT: sllg %r0, %r0, 48652; NOVEC-NEXT: ldgr %f7, %r0653; NOVEC-NEXT: lgh %r0, 454(%r15)654; NOVEC-NEXT: sllg %r0, %r0, 48655; NOVEC-NEXT: ldgr %f8, %r0656; NOVEC-NEXT: lgh %r0, 462(%r15)657; NOVEC-NEXT: sllg %r0, %r0, 48658; NOVEC-NEXT: ldgr %f9, %r0659; NOVEC-NEXT: lgh %r0, 470(%r15)660; NOVEC-NEXT: sllg %r0, %r0, 48661; NOVEC-NEXT: ldgr %f10, %r0662; NOVEC-NEXT: lgh %r0, 478(%r15)663; NOVEC-NEXT: sllg %r0, %r0, 48664; NOVEC-NEXT: ldgr %f11, %r0665; NOVEC-NEXT: lgdr %r0, %f11666; NOVEC-NEXT: srlg %r0, %r0, 48667; NOVEC-NEXT: sth %r0, 222(%r15)668; NOVEC-NEXT: lgdr %r0, %f10669; NOVEC-NEXT: srlg %r0, %r0, 48670; NOVEC-NEXT: sth %r0, 214(%r15)671; NOVEC-NEXT: lgdr %r0, %f9672; NOVEC-NEXT: srlg %r0, %r0, 48673; NOVEC-NEXT: sth %r0, 206(%r15)674; NOVEC-NEXT: lgdr %r0, %f8675; NOVEC-NEXT: srlg %r0, %r0, 48676; NOVEC-NEXT: sth %r0, 198(%r15)677; NOVEC-NEXT: lgdr %r0, %f7678; NOVEC-NEXT: srlg %r0, %r0, 48679; NOVEC-NEXT: sth %r0, 190(%r15)680; NOVEC-NEXT: lgdr %r0, %f5681; NOVEC-NEXT: srlg %r0, %r0, 48682; NOVEC-NEXT: sth %r0, 182(%r15)683; NOVEC-NEXT: lgdr %r0, %f3684; NOVEC-NEXT: srlg %r0, %r0, 48685; NOVEC-NEXT: sth %r0, 174(%r15)686; NOVEC-NEXT: lgdr %r0, %f1687; NOVEC-NEXT: srlg %r0, %r0, 48688; NOVEC-NEXT: sth %r0, 166(%r15)689; NOVEC-NEXT: brasl %r14, foo2@PLT690; NOVEC-NEXT: ld %f8, 248(%r15) # 8-byte Reload691; NOVEC-NEXT: ld %f9, 240(%r15) # 8-byte Reload692; NOVEC-NEXT: ld %f10, 232(%r15) # 8-byte Reload693; NOVEC-NEXT: ld %f11, 224(%r15) # 8-byte Reload694; NOVEC-NEXT: lmg %r14, %r15, 368(%r15)695; NOVEC-NEXT: br %r14696;697; VECTOR-LABEL: fun5:698; VECTOR: # %bb.0:699; VECTOR-NEXT: stmg %r14, %r15, 112(%r15)700; VECTOR-NEXT: .cfi_offset %r14, -48701; VECTOR-NEXT: .cfi_offset %r15, -40702; VECTOR-NEXT: aghi %r15, -224703; VECTOR-NEXT: .cfi_def_cfa_offset 384704; VECTOR-NEXT: vlreph %v1, 390(%r15)705; VECTOR-NEXT: vlreph %v3, 398(%r15)706; VECTOR-NEXT: vlreph %v5, 406(%r15)707; VECTOR-NEXT: vlreph %v7, 414(%r15)708; VECTOR-NEXT: vlreph %v16, 422(%r15)709; VECTOR-NEXT: vlreph %v17, 430(%r15)710; VECTOR-NEXT: vlreph %v18, 438(%r15)711; VECTOR-NEXT: vlreph %v19, 446(%r15)712; VECTOR-NEXT: vsteh %v19, 222(%r15), 0713; VECTOR-NEXT: vsteh %v18, 214(%r15), 0714; VECTOR-NEXT: vsteh %v17, 206(%r15), 0715; VECTOR-NEXT: vsteh %v16, 198(%r15), 0716; VECTOR-NEXT: vsteh %v7, 190(%r15), 0717; VECTOR-NEXT: vsteh %v5, 182(%r15), 0718; VECTOR-NEXT: vsteh %v3, 174(%r15), 0719; VECTOR-NEXT: vsteh %v1, 166(%r15), 0720; VECTOR-NEXT: brasl %r14, foo2@PLT721; VECTOR-NEXT: lmg %r14, %r15, 336(%r15)722; VECTOR-NEXT: br %r14723 call void @foo2(<4 x half> %dummy, <8 x half> %Arg5)724 ret void725}726