406 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --default-march s390x-unknown-linux-gnu --version 52; RUN: llc -mtriple=s390x-linux-gnu -mcpu=z16 < %s | FileCheck %s -check-prefixes=Z163 4define half @canonicalize_fp16(half %a) nounwind {5; Z16-LABEL: canonicalize_fp16:6; Z16: # %bb.0:7; Z16-NEXT: stmg %r14, %r15, 112(%r15)8; Z16-NEXT: aghi %r15, -1609; Z16-NEXT: brasl %r14, __extendhfsf2@PLT10; Z16-NEXT: vgmf %v1, 2, 811; Z16-NEXT: meebr %f0, %f112; Z16-NEXT: brasl %r14, __truncsfhf2@PLT13; Z16-NEXT: lmg %r14, %r15, 272(%r15)14; Z16-NEXT: br %r1415 %canonicalized = call half @llvm.canonicalize.f16(half %a)16 ret half %canonicalized17}18define float @canonicalize_fp32(float %a) {19; Z16-LABEL: canonicalize_fp32:20; Z16: # %bb.0:21; Z16-NEXT: vgmf %v1, 2, 822; Z16-NEXT: meebr %f0, %f123; Z16-NEXT: br %r1424 %canonicalized = call float @llvm.canonicalize.f32(float %a)25 ret float %canonicalized26}27 28define double @canonicalize_fp64(double %a) {29; Z16-LABEL: canonicalize_fp64:30; Z16: # %bb.0:31; Z16-NEXT: vgmg %v1, 2, 1132; Z16-NEXT: mdbr %f0, %f133; Z16-NEXT: br %r1434 %canonicalized = call double @llvm.canonicalize.f64(double %a)35 ret double %canonicalized36}37 38define fp128 @canonicalize_fp128(fp128 %a) {39; Z16-LABEL: canonicalize_fp128:40; Z16: # %bb.0:41; Z16-NEXT: larl %r1, .LCPI3_042; Z16-NEXT: vl %v0, 0(%r3), 343; Z16-NEXT: vl %v1, 0(%r1), 344; Z16-NEXT: wfmxb %v0, %v0, %v145; Z16-NEXT: vst %v0, 0(%r2), 346; Z16-NEXT: br %r1447 %canonicalized = call fp128 @llvm.canonicalize.f128(fp128 %a)48 ret fp128 %canonicalized49}50 51define void @canonicalize_ptr_f16(ptr %out) nounwind {52; Z16-LABEL: canonicalize_ptr_f16:53; Z16: # %bb.0:54; Z16-NEXT: stmg %r13, %r15, 104(%r15)55; Z16-NEXT: aghi %r15, -16056; Z16-NEXT: vlreph %v0, 0(%r2)57; Z16-NEXT: lgr %r13, %r258; Z16-NEXT: brasl %r14, __extendhfsf2@PLT59; Z16-NEXT: vgmf %v1, 2, 860; Z16-NEXT: meebr %f0, %f161; Z16-NEXT: brasl %r14, __truncsfhf2@PLT62; Z16-NEXT: vsteh %v0, 0(%r13), 063; Z16-NEXT: lmg %r13, %r15, 264(%r15)64; Z16-NEXT: br %r1465 %val = load half, ptr %out66 %canonicalized = call half @llvm.canonicalize.f16(half %val)67 store half %canonicalized, ptr %out68 ret void69}70 71define void @canonicalize_ptr_f32(ptr %out) {72; Z16-LABEL: canonicalize_ptr_f32:73; Z16: # %bb.0:74; Z16-NEXT: vgmf %v0, 2, 875; Z16-NEXT: meeb %f0, 0(%r2)76; Z16-NEXT: ste %f0, 0(%r2)77; Z16-NEXT: br %r1478 %val = load float, ptr %out79 %canonicalized = call float @llvm.canonicalize.f32(float %val)80 store float %canonicalized, ptr %out81 ret void82}83 84define void @canonicalize_ptr_f64(ptr %out) {85; Z16-LABEL: canonicalize_ptr_f64:86; Z16: # %bb.0:87; Z16-NEXT: vgmg %v0, 2, 1188; Z16-NEXT: mdb %f0, 0(%r2)89; Z16-NEXT: std %f0, 0(%r2)90; Z16-NEXT: br %r1491 %val = load double, ptr %out92 %canonicalized = call double @llvm.canonicalize.f64(double %val)93 store double %canonicalized, ptr %out94 ret void95}96 97define void @canonicalize_ptr_f128(ptr %out) {98; Z16-LABEL: canonicalize_ptr_f128:99; Z16: # %bb.0:100; Z16-NEXT: larl %r1, .LCPI7_0101; Z16-NEXT: vl %v0, 0(%r2), 3102; Z16-NEXT: vl %v1, 0(%r1), 3103; Z16-NEXT: wfmxb %v0, %v0, %v1104; Z16-NEXT: vst %v0, 0(%r2), 3105; Z16-NEXT: br %r14106 %val = load fp128, ptr %out107 %canonicalized = call fp128 @llvm.canonicalize.f128(fp128 %val)108 store fp128 %canonicalized, ptr %out109 ret void110}111define <8 x half> @canonicalize_v8f16(<8 x half> %a) nounwind {112; Z16-LABEL: canonicalize_v8f16:113; Z16: # %bb.0:114; Z16-NEXT: stmg %r13, %r15, 104(%r15)115; Z16-NEXT: aghi %r15, -224116; Z16-NEXT: std %f8, 216(%r15) # 8-byte Spill117; Z16-NEXT: std %f9, 208(%r15) # 8-byte Spill118; Z16-NEXT: std %f10, 200(%r15) # 8-byte Spill119; Z16-NEXT: std %f11, 192(%r15) # 8-byte Spill120; Z16-NEXT: std %f12, 184(%r15) # 8-byte Spill121; Z16-NEXT: std %f13, 176(%r15) # 8-byte Spill122; Z16-NEXT: std %f14, 168(%r15) # 8-byte Spill123; Z16-NEXT: std %f15, 160(%r15) # 8-byte Spill124; Z16-NEXT: vlreph %v11, 414(%r15)125; Z16-NEXT: vlreph %v12, 406(%r15)126; Z16-NEXT: vlreph %v13, 398(%r15)127; Z16-NEXT: vlreph %v14, 390(%r15)128; Z16-NEXT: ldr %f8, %f6129; Z16-NEXT: ldr %f9, %f4130; Z16-NEXT: ldr %f10, %f2131; Z16-NEXT: lgr %r13, %r2132; Z16-NEXT: brasl %r14, __extendhfsf2@PLT133; Z16-NEXT: vgmf %v1, 2, 8134; Z16-NEXT: meebr %f0, %f1135; Z16-NEXT: brasl %r14, __truncsfhf2@PLT136; Z16-NEXT: ldr %f15, %f0137; Z16-NEXT: ldr %f0, %f10138; Z16-NEXT: brasl %r14, __extendhfsf2@PLT139; Z16-NEXT: vgmf %v1, 2, 8140; Z16-NEXT: meebr %f0, %f1141; Z16-NEXT: brasl %r14, __truncsfhf2@PLT142; Z16-NEXT: ldr %f10, %f0143; Z16-NEXT: ldr %f0, %f9144; Z16-NEXT: brasl %r14, __extendhfsf2@PLT145; Z16-NEXT: vgmf %v1, 2, 8146; Z16-NEXT: meebr %f0, %f1147; Z16-NEXT: brasl %r14, __truncsfhf2@PLT148; Z16-NEXT: ldr %f9, %f0149; Z16-NEXT: ldr %f0, %f8150; Z16-NEXT: brasl %r14, __extendhfsf2@PLT151; Z16-NEXT: vgmf %v1, 2, 8152; Z16-NEXT: meebr %f0, %f1153; Z16-NEXT: brasl %r14, __truncsfhf2@PLT154; Z16-NEXT: ldr %f8, %f0155; Z16-NEXT: ldr %f0, %f14156; Z16-NEXT: brasl %r14, __extendhfsf2@PLT157; Z16-NEXT: vgmf %v1, 2, 8158; Z16-NEXT: meebr %f0, %f1159; Z16-NEXT: brasl %r14, __truncsfhf2@PLT160; Z16-NEXT: ldr %f14, %f0161; Z16-NEXT: ldr %f0, %f13162; Z16-NEXT: brasl %r14, __extendhfsf2@PLT163; Z16-NEXT: vgmf %v1, 2, 8164; Z16-NEXT: meebr %f0, %f1165; Z16-NEXT: brasl %r14, __truncsfhf2@PLT166; Z16-NEXT: ldr %f13, %f0167; Z16-NEXT: ldr %f0, %f12168; Z16-NEXT: brasl %r14, __extendhfsf2@PLT169; Z16-NEXT: vgmf %v1, 2, 8170; Z16-NEXT: meebr %f0, %f1171; Z16-NEXT: brasl %r14, __truncsfhf2@PLT172; Z16-NEXT: ldr %f12, %f0173; Z16-NEXT: ldr %f0, %f11174; Z16-NEXT: brasl %r14, __extendhfsf2@PLT175; Z16-NEXT: vgmf %v1, 2, 8176; Z16-NEXT: meebr %f0, %f1177; Z16-NEXT: brasl %r14, __truncsfhf2@PLT178; Z16-NEXT: vsteh %v0, 14(%r13), 0179; Z16-NEXT: vsteh %v12, 12(%r13), 0180; Z16-NEXT: vsteh %v13, 10(%r13), 0181; Z16-NEXT: vsteh %v14, 8(%r13), 0182; Z16-NEXT: vsteh %v8, 6(%r13), 0183; Z16-NEXT: vsteh %v9, 4(%r13), 0184; Z16-NEXT: vsteh %v10, 2(%r13), 0185; Z16-NEXT: vsteh %v15, 0(%r13), 0186; Z16-NEXT: ld %f8, 216(%r15) # 8-byte Reload187; Z16-NEXT: ld %f9, 208(%r15) # 8-byte Reload188; Z16-NEXT: ld %f10, 200(%r15) # 8-byte Reload189; Z16-NEXT: ld %f11, 192(%r15) # 8-byte Reload190; Z16-NEXT: ld %f12, 184(%r15) # 8-byte Reload191; Z16-NEXT: ld %f13, 176(%r15) # 8-byte Reload192; Z16-NEXT: ld %f14, 168(%r15) # 8-byte Reload193; Z16-NEXT: ld %f15, 160(%r15) # 8-byte Reload194; Z16-NEXT: lmg %r13, %r15, 328(%r15)195; Z16-NEXT: br %r14196 %canonicalized = call <8 x half> @llvm.canonicalize.v8f16(<8 x half> %a)197 ret <8 x half> %canonicalized198}199define <4 x float> @canonicalize_v4f32(<4 x float> %a) {200; Z16-LABEL: canonicalize_v4f32:201; Z16: # %bb.0:202; Z16-NEXT: vrepf %v0, %v24, 3203; Z16-NEXT: vgmf %v1, 2, 8204; Z16-NEXT: vrepf %v2, %v24, 2205; Z16-NEXT: meebr %f0, %f1206; Z16-NEXT: meebr %f2, %f1207; Z16-NEXT: vrepf %v3, %v24, 1208; Z16-NEXT: vmrhf %v0, %v2, %v0209; Z16-NEXT: wfmsb %f2, %v24, %f1210; Z16-NEXT: wfmsb %f1, %f3, %f1211; Z16-NEXT: vmrhf %v1, %v2, %v1212; Z16-NEXT: vmrhg %v24, %v1, %v0213; Z16-NEXT: br %r14214 %canonicalized = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %a)215 ret <4 x float> %canonicalized216}217 218define <4 x double> @canonicalize_v4f64(<4 x double> %a) {219; Z16-LABEL: canonicalize_v4f64:220; Z16: # %bb.0:221; Z16-NEXT: vgmg %v0, 2, 11222; Z16-NEXT: vrepg %v2, %v24, 1223; Z16-NEXT: wfmdb %f1, %v24, %f0224; Z16-NEXT: mdbr %f2, %f0225; Z16-NEXT: vmrhg %v24, %v1, %v2226; Z16-NEXT: vrepg %v2, %v26, 1227; Z16-NEXT: wfmdb %f1, %v26, %f0228; Z16-NEXT: wfmdb %f0, %f2, %f0229; Z16-NEXT: vmrhg %v26, %v1, %v0230; Z16-NEXT: br %r14231 %canonicalized = call <4 x double> @llvm.canonicalize.v4f64(<4 x double> %a)232 ret <4 x double> %canonicalized233}234 235define <2 x fp128> @canonicalize_v2f128(<2 x fp128> %a) {236; Z16-LABEL: canonicalize_v2f128:237; Z16: # %bb.0:238; Z16-NEXT: larl %r1, .LCPI11_0239; Z16-NEXT: vl %v0, 16(%r3), 3240; Z16-NEXT: vl %v1, 0(%r3), 3241; Z16-NEXT: vl %v2, 0(%r1), 3242; Z16-NEXT: wfmxb %v1, %v1, %v2243; Z16-NEXT: wfmxb %v0, %v0, %v2244; Z16-NEXT: vst %v0, 16(%r2), 4245; Z16-NEXT: vst %v1, 0(%r2), 4246; Z16-NEXT: br %r14247 %canonicalized = call <2 x fp128> @llvm.canonicalize.v2f128(<2 x fp128> %a)248 ret <2 x fp128> %canonicalized249}250 251define void @canonicalize_ptr_v8f16(ptr %out) nounwind {252; Z16-LABEL: canonicalize_ptr_v8f16:253; Z16: # %bb.0:254; Z16-NEXT: stmg %r13, %r15, 104(%r15)255; Z16-NEXT: aghi %r15, -224256; Z16-NEXT: std %f8, 216(%r15) # 8-byte Spill257; Z16-NEXT: std %f9, 208(%r15) # 8-byte Spill258; Z16-NEXT: std %f10, 200(%r15) # 8-byte Spill259; Z16-NEXT: std %f11, 192(%r15) # 8-byte Spill260; Z16-NEXT: std %f12, 184(%r15) # 8-byte Spill261; Z16-NEXT: std %f13, 176(%r15) # 8-byte Spill262; Z16-NEXT: std %f14, 168(%r15) # 8-byte Spill263; Z16-NEXT: std %f15, 160(%r15) # 8-byte Spill264; Z16-NEXT: vlreph %v0, 0(%r2)265; Z16-NEXT: vlreph %v8, 14(%r2)266; Z16-NEXT: vlreph %v9, 12(%r2)267; Z16-NEXT: vlreph %v10, 10(%r2)268; Z16-NEXT: lgr %r13, %r2269; Z16-NEXT: vlreph %v11, 8(%r2)270; Z16-NEXT: vlreph %v12, 6(%r2)271; Z16-NEXT: vlreph %v13, 4(%r2)272; Z16-NEXT: vlreph %v14, 2(%r2)273; Z16-NEXT: brasl %r14, __extendhfsf2@PLT274; Z16-NEXT: vgmf %v1, 2, 8275; Z16-NEXT: meebr %f0, %f1276; Z16-NEXT: brasl %r14, __truncsfhf2@PLT277; Z16-NEXT: ldr %f15, %f0278; Z16-NEXT: ldr %f0, %f14279; Z16-NEXT: brasl %r14, __extendhfsf2@PLT280; Z16-NEXT: vgmf %v1, 2, 8281; Z16-NEXT: meebr %f0, %f1282; Z16-NEXT: brasl %r14, __truncsfhf2@PLT283; Z16-NEXT: ldr %f14, %f0284; Z16-NEXT: ldr %f0, %f13285; Z16-NEXT: brasl %r14, __extendhfsf2@PLT286; Z16-NEXT: vgmf %v1, 2, 8287; Z16-NEXT: meebr %f0, %f1288; Z16-NEXT: brasl %r14, __truncsfhf2@PLT289; Z16-NEXT: ldr %f13, %f0290; Z16-NEXT: ldr %f0, %f12291; Z16-NEXT: brasl %r14, __extendhfsf2@PLT292; Z16-NEXT: vgmf %v1, 2, 8293; Z16-NEXT: meebr %f0, %f1294; Z16-NEXT: brasl %r14, __truncsfhf2@PLT295; Z16-NEXT: ldr %f12, %f0296; Z16-NEXT: ldr %f0, %f11297; Z16-NEXT: brasl %r14, __extendhfsf2@PLT298; Z16-NEXT: vgmf %v1, 2, 8299; Z16-NEXT: meebr %f0, %f1300; Z16-NEXT: brasl %r14, __truncsfhf2@PLT301; Z16-NEXT: ldr %f11, %f0302; Z16-NEXT: ldr %f0, %f10303; Z16-NEXT: brasl %r14, __extendhfsf2@PLT304; Z16-NEXT: vgmf %v1, 2, 8305; Z16-NEXT: meebr %f0, %f1306; Z16-NEXT: brasl %r14, __truncsfhf2@PLT307; Z16-NEXT: ldr %f10, %f0308; Z16-NEXT: ldr %f0, %f9309; Z16-NEXT: brasl %r14, __extendhfsf2@PLT310; Z16-NEXT: vgmf %v1, 2, 8311; Z16-NEXT: meebr %f0, %f1312; Z16-NEXT: brasl %r14, __truncsfhf2@PLT313; Z16-NEXT: ldr %f9, %f0314; Z16-NEXT: ldr %f0, %f8315; Z16-NEXT: brasl %r14, __extendhfsf2@PLT316; Z16-NEXT: vgmf %v1, 2, 8317; Z16-NEXT: meebr %f0, %f1318; Z16-NEXT: brasl %r14, __truncsfhf2@PLT319; Z16-NEXT: vsteh %v9, 12(%r13), 0320; Z16-NEXT: vsteh %v10, 10(%r13), 0321; Z16-NEXT: vsteh %v11, 8(%r13), 0322; Z16-NEXT: vsteh %v12, 6(%r13), 0323; Z16-NEXT: vsteh %v13, 4(%r13), 0324; Z16-NEXT: vsteh %v14, 2(%r13), 0325; Z16-NEXT: vsteh %v15, 0(%r13), 0326; Z16-NEXT: ld %f8, 216(%r15) # 8-byte Reload327; Z16-NEXT: ld %f9, 208(%r15) # 8-byte Reload328; Z16-NEXT: ld %f10, 200(%r15) # 8-byte Reload329; Z16-NEXT: ld %f11, 192(%r15) # 8-byte Reload330; Z16-NEXT: ld %f12, 184(%r15) # 8-byte Reload331; Z16-NEXT: ld %f13, 176(%r15) # 8-byte Reload332; Z16-NEXT: ld %f14, 168(%r15) # 8-byte Reload333; Z16-NEXT: ld %f15, 160(%r15) # 8-byte Reload334; Z16-NEXT: vsteh %v0, 14(%r13), 0335; Z16-NEXT: lmg %r13, %r15, 328(%r15)336; Z16-NEXT: br %r14337 %val = load <8 x half>, ptr %out338 %canonicalized = call <8 x half> @llvm.canonicalize.v8f16(<8 x half> %val)339 store <8 x half> %canonicalized, ptr %out340 ret void341}342 343define void @canonicalize_ptr_v4f32(ptr %out) {344; Z16-LABEL: canonicalize_ptr_v4f32:345; Z16: # %bb.0:346; Z16-NEXT: vl %v0, 0(%r2), 3347; Z16-NEXT: vrepf %v1, %v0, 3348; Z16-NEXT: vgmf %v2, 2, 8349; Z16-NEXT: vrepf %v3, %v0, 2350; Z16-NEXT: meebr %f1, %f2351; Z16-NEXT: meebr %f3, %f2352; Z16-NEXT: vmrhf %v1, %v3, %v1353; Z16-NEXT: wfmsb %f3, %f0, %f2354; Z16-NEXT: vrepf %v0, %v0, 1355; Z16-NEXT: meebr %f0, %f2356; Z16-NEXT: vmrhf %v0, %v3, %v0357; Z16-NEXT: vmrhg %v0, %v0, %v1358; Z16-NEXT: vst %v0, 0(%r2), 3359; Z16-NEXT: br %r14360 %val = load <4 x float>, ptr %out361 %canonicalized = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %val)362 store <4 x float> %canonicalized, ptr %out363 ret void364}365 366define void @canonicalize_ptr_v4f64(ptr %out) {367; Z16-LABEL: canonicalize_ptr_v4f64:368; Z16: # %bb.0:369; Z16-NEXT: vl %v1, 16(%r2), 4370; Z16-NEXT: vgmg %v2, 2, 11371; Z16-NEXT: wfmdb %f3, %f1, %f2372; Z16-NEXT: vrepg %v1, %v1, 1373; Z16-NEXT: mdbr %f1, %f2374; Z16-NEXT: vl %v0, 0(%r2), 4375; Z16-NEXT: vmrhg %v1, %v3, %v1376; Z16-NEXT: wfmdb %f3, %f0, %f2377; Z16-NEXT: vrepg %v0, %v0, 1378; Z16-NEXT: mdbr %f0, %f2379; Z16-NEXT: vmrhg %v0, %v3, %v0380; Z16-NEXT: vst %v0, 0(%r2), 4381; Z16-NEXT: vst %v1, 16(%r2), 4382; Z16-NEXT: br %r14383 %val = load <4 x double>, ptr %out384 %canonicalized = call <4 x double> @llvm.canonicalize.v4f64(<4 x double> %val)385 store <4 x double> %canonicalized, ptr %out386 ret void387}388 389define void @canonicalize_ptr_v2f128(ptr %out) {390; Z16-LABEL: canonicalize_ptr_v2f128:391; Z16: # %bb.0:392; Z16-NEXT: larl %r1, .LCPI15_0393; Z16-NEXT: vl %v0, 16(%r2), 4394; Z16-NEXT: vl %v1, 0(%r2), 4395; Z16-NEXT: vl %v2, 0(%r1), 3396; Z16-NEXT: wfmxb %v1, %v1, %v2397; Z16-NEXT: wfmxb %v0, %v0, %v2398; Z16-NEXT: vst %v0, 16(%r2), 4399; Z16-NEXT: vst %v1, 0(%r2), 4400; Z16-NEXT: br %r14401 %val = load <2 x fp128>, ptr %out402 %canonicalized = call <2 x fp128> @llvm.canonicalize.v2f128(<2 x fp128> %val)403 store <2 x fp128> %canonicalized, ptr %out404 ret void405}406