937 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mattr=+sve,+bf16 < %s | FileCheck %s --check-prefixes=CHECK,NOB16B163; RUN: llc -mattr=+sve,+bf16,+sve-b16b16 < %s | FileCheck %s --check-prefixes=CHECK,B16B164 5target triple = "aarch64-unknown-linux-gnu"6 7;8; FABS9;10 11define <4 x bfloat> @fabs_v4bf16(<4 x bfloat> %a) {12; CHECK-LABEL: fabs_v4bf16:13; CHECK: // %bb.0:14; CHECK-NEXT: bic v0.4h, #128, lsl #815; CHECK-NEXT: ret16 %res = call <4 x bfloat> @llvm.fabs.v4bf16(<4 x bfloat> %a)17 ret <4 x bfloat> %res18}19 20define <8 x bfloat> @fabs_v8bf16(<8 x bfloat> %a) {21; CHECK-LABEL: fabs_v8bf16:22; CHECK: // %bb.0:23; CHECK-NEXT: bic v0.8h, #128, lsl #824; CHECK-NEXT: ret25 %res = call <8 x bfloat> @llvm.fabs.v8bf16(<8 x bfloat> %a)26 ret <8 x bfloat> %res27}28 29;30; FADD31;32 33define <4 x bfloat> @fadd_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b) {34; NOB16B16-LABEL: fadd_v4bf16:35; NOB16B16: // %bb.0:36; NOB16B16-NEXT: shll v1.4s, v1.4h, #1637; NOB16B16-NEXT: shll v0.4s, v0.4h, #1638; NOB16B16-NEXT: fadd v0.4s, v0.4s, v1.4s39; NOB16B16-NEXT: bfcvtn v0.4h, v0.4s40; NOB16B16-NEXT: ret41;42; B16B16-LABEL: fadd_v4bf16:43; B16B16: // %bb.0:44; B16B16-NEXT: ptrue p0.h, vl445; B16B16-NEXT: // kill: def $d0 killed $d0 def $z046; B16B16-NEXT: // kill: def $d1 killed $d1 def $z147; B16B16-NEXT: bfadd z0.h, p0/m, z0.h, z1.h48; B16B16-NEXT: // kill: def $d0 killed $d0 killed $z049; B16B16-NEXT: ret50 %res = fadd <4 x bfloat> %a, %b51 ret <4 x bfloat> %res52}53 54define <8 x bfloat> @fadd_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b) {55; NOB16B16-LABEL: fadd_v8bf16:56; NOB16B16: // %bb.0:57; NOB16B16-NEXT: shll v2.4s, v1.4h, #1658; NOB16B16-NEXT: shll v3.4s, v0.4h, #1659; NOB16B16-NEXT: shll2 v1.4s, v1.8h, #1660; NOB16B16-NEXT: shll2 v0.4s, v0.8h, #1661; NOB16B16-NEXT: fadd v2.4s, v3.4s, v2.4s62; NOB16B16-NEXT: fadd v1.4s, v0.4s, v1.4s63; NOB16B16-NEXT: bfcvtn v0.4h, v2.4s64; NOB16B16-NEXT: bfcvtn2 v0.8h, v1.4s65; NOB16B16-NEXT: ret66;67; B16B16-LABEL: fadd_v8bf16:68; B16B16: // %bb.0:69; B16B16-NEXT: ptrue p0.h, vl870; B16B16-NEXT: // kill: def $q0 killed $q0 def $z071; B16B16-NEXT: // kill: def $q1 killed $q1 def $z172; B16B16-NEXT: bfadd z0.h, p0/m, z0.h, z1.h73; B16B16-NEXT: // kill: def $q0 killed $q0 killed $z074; B16B16-NEXT: ret75 %res = fadd <8 x bfloat> %a, %b76 ret <8 x bfloat> %res77}78 79;80; FDIV81;82 83define <4 x bfloat> @fdiv_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b) {84; CHECK-LABEL: fdiv_v4bf16:85; CHECK: // %bb.0:86; CHECK-NEXT: shll v1.4s, v1.4h, #1687; CHECK-NEXT: shll v0.4s, v0.4h, #1688; CHECK-NEXT: fdiv v0.4s, v0.4s, v1.4s89; CHECK-NEXT: bfcvtn v0.4h, v0.4s90; CHECK-NEXT: ret91 %res = fdiv <4 x bfloat> %a, %b92 ret <4 x bfloat> %res93}94 95define <8 x bfloat> @fdiv_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b) {96; CHECK-LABEL: fdiv_v8bf16:97; CHECK: // %bb.0:98; CHECK-NEXT: shll v2.4s, v1.4h, #1699; CHECK-NEXT: shll v3.4s, v0.4h, #16100; CHECK-NEXT: shll2 v1.4s, v1.8h, #16101; CHECK-NEXT: shll2 v0.4s, v0.8h, #16102; CHECK-NEXT: fdiv v2.4s, v3.4s, v2.4s103; CHECK-NEXT: fdiv v1.4s, v0.4s, v1.4s104; CHECK-NEXT: bfcvtn v0.4h, v2.4s105; CHECK-NEXT: bfcvtn2 v0.8h, v1.4s106; CHECK-NEXT: ret107 %res = fdiv <8 x bfloat> %a, %b108 ret <8 x bfloat> %res109}110 111;112; FMAX113;114 115define <4 x bfloat> @fmax_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b) {116; NOB16B16-LABEL: fmax_v4bf16:117; NOB16B16: // %bb.0:118; NOB16B16-NEXT: // kill: def $d1 killed $d1 def $q1119; NOB16B16-NEXT: // kill: def $d0 killed $d0 def $q0120; NOB16B16-NEXT: mov h2, v1.h[1]121; NOB16B16-NEXT: mov h3, v0.h[1]122; NOB16B16-NEXT: mov h4, v1.h[2]123; NOB16B16-NEXT: shll v5.4s, v1.4h, #16124; NOB16B16-NEXT: shll v6.4s, v0.4h, #16125; NOB16B16-NEXT: mov h7, v0.h[2]126; NOB16B16-NEXT: mov h1, v1.h[3]127; NOB16B16-NEXT: shll v2.4s, v2.4h, #16128; NOB16B16-NEXT: shll v3.4s, v3.4h, #16129; NOB16B16-NEXT: shll v4.4s, v4.4h, #16130; NOB16B16-NEXT: shll v1.4s, v1.4h, #16131; NOB16B16-NEXT: fmax s2, s3, s2132; NOB16B16-NEXT: fmax s3, s6, s5133; NOB16B16-NEXT: shll v5.4s, v7.4h, #16134; NOB16B16-NEXT: mov h6, v0.h[3]135; NOB16B16-NEXT: fmax s4, s5, s4136; NOB16B16-NEXT: bfcvt h2, s2137; NOB16B16-NEXT: bfcvt h0, s3138; NOB16B16-NEXT: shll v3.4s, v6.4h, #16139; NOB16B16-NEXT: mov v0.h[1], v2.h[0]140; NOB16B16-NEXT: bfcvt h2, s4141; NOB16B16-NEXT: fmax s1, s3, s1142; NOB16B16-NEXT: mov v0.h[2], v2.h[0]143; NOB16B16-NEXT: bfcvt h1, s1144; NOB16B16-NEXT: mov v0.h[3], v1.h[0]145; NOB16B16-NEXT: // kill: def $d0 killed $d0 killed $q0146; NOB16B16-NEXT: ret147;148; B16B16-LABEL: fmax_v4bf16:149; B16B16: // %bb.0:150; B16B16-NEXT: ptrue p0.h, vl4151; B16B16-NEXT: // kill: def $d0 killed $d0 def $z0152; B16B16-NEXT: // kill: def $d1 killed $d1 def $z1153; B16B16-NEXT: bfmax z0.h, p0/m, z0.h, z1.h154; B16B16-NEXT: // kill: def $d0 killed $d0 killed $z0155; B16B16-NEXT: ret156 %res = call <4 x bfloat> @llvm.maximum.v4bf16(<4 x bfloat> %a, <4 x bfloat> %b)157 ret <4 x bfloat> %res158}159 160define <8 x bfloat> @fmax_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b) {161; NOB16B16-LABEL: fmax_v8bf16:162; NOB16B16: // %bb.0:163; NOB16B16-NEXT: mov h2, v1.h[1]164; NOB16B16-NEXT: mov h3, v0.h[1]165; NOB16B16-NEXT: shll v4.4s, v1.4h, #16166; NOB16B16-NEXT: shll v5.4s, v0.4h, #16167; NOB16B16-NEXT: mov h6, v1.h[2]168; NOB16B16-NEXT: mov h7, v0.h[2]169; NOB16B16-NEXT: mov h16, v1.h[3]170; NOB16B16-NEXT: shll v2.4s, v2.4h, #16171; NOB16B16-NEXT: shll v3.4s, v3.4h, #16172; NOB16B16-NEXT: fmax s4, s5, s4173; NOB16B16-NEXT: mov h5, v0.h[3]174; NOB16B16-NEXT: shll v6.4s, v6.4h, #16175; NOB16B16-NEXT: shll v7.4s, v7.4h, #16176; NOB16B16-NEXT: fmax s3, s3, s2177; NOB16B16-NEXT: bfcvt h2, s4178; NOB16B16-NEXT: fmax s4, s7, s6179; NOB16B16-NEXT: shll v6.4s, v16.4h, #16180; NOB16B16-NEXT: shll v5.4s, v5.4h, #16181; NOB16B16-NEXT: mov h7, v1.h[4]182; NOB16B16-NEXT: mov h16, v0.h[4]183; NOB16B16-NEXT: bfcvt h3, s3184; NOB16B16-NEXT: fmax s5, s5, s6185; NOB16B16-NEXT: bfcvt h4, s4186; NOB16B16-NEXT: mov h6, v0.h[5]187; NOB16B16-NEXT: shll v7.4s, v7.4h, #16188; NOB16B16-NEXT: shll v16.4s, v16.4h, #16189; NOB16B16-NEXT: mov v2.h[1], v3.h[0]190; NOB16B16-NEXT: mov h3, v1.h[5]191; NOB16B16-NEXT: bfcvt h5, s5192; NOB16B16-NEXT: fmax s7, s16, s7193; NOB16B16-NEXT: mov h16, v0.h[6]194; NOB16B16-NEXT: shll v6.4s, v6.4h, #16195; NOB16B16-NEXT: mov h0, v0.h[7]196; NOB16B16-NEXT: mov v2.h[2], v4.h[0]197; NOB16B16-NEXT: mov h4, v1.h[6]198; NOB16B16-NEXT: shll v3.4s, v3.4h, #16199; NOB16B16-NEXT: mov h1, v1.h[7]200; NOB16B16-NEXT: shll v0.4s, v0.4h, #16201; NOB16B16-NEXT: fmax s3, s6, s3202; NOB16B16-NEXT: shll v6.4s, v16.4h, #16203; NOB16B16-NEXT: mov v2.h[3], v5.h[0]204; NOB16B16-NEXT: bfcvt h5, s7205; NOB16B16-NEXT: shll v4.4s, v4.4h, #16206; NOB16B16-NEXT: shll v1.4s, v1.4h, #16207; NOB16B16-NEXT: fmax s4, s6, s4208; NOB16B16-NEXT: bfcvt h3, s3209; NOB16B16-NEXT: mov v2.h[4], v5.h[0]210; NOB16B16-NEXT: fmax s0, s0, s1211; NOB16B16-NEXT: mov v2.h[5], v3.h[0]212; NOB16B16-NEXT: bfcvt h3, s4213; NOB16B16-NEXT: bfcvt h0, s0214; NOB16B16-NEXT: mov v2.h[6], v3.h[0]215; NOB16B16-NEXT: mov v2.h[7], v0.h[0]216; NOB16B16-NEXT: mov v0.16b, v2.16b217; NOB16B16-NEXT: ret218;219; B16B16-LABEL: fmax_v8bf16:220; B16B16: // %bb.0:221; B16B16-NEXT: ptrue p0.h, vl8222; B16B16-NEXT: // kill: def $q0 killed $q0 def $z0223; B16B16-NEXT: // kill: def $q1 killed $q1 def $z1224; B16B16-NEXT: bfmax z0.h, p0/m, z0.h, z1.h225; B16B16-NEXT: // kill: def $q0 killed $q0 killed $z0226; B16B16-NEXT: ret227 %res = call <8 x bfloat> @llvm.maximum.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)228 ret <8 x bfloat> %res229}230 231;232; FMAXNM233;234 235define <4 x bfloat> @fmaxnm_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b) {236; NOB16B16-LABEL: fmaxnm_v4bf16:237; NOB16B16: // %bb.0:238; NOB16B16-NEXT: // kill: def $d1 killed $d1 def $q1239; NOB16B16-NEXT: // kill: def $d0 killed $d0 def $q0240; NOB16B16-NEXT: mov h2, v1.h[1]241; NOB16B16-NEXT: mov h3, v0.h[1]242; NOB16B16-NEXT: mov h4, v1.h[2]243; NOB16B16-NEXT: shll v5.4s, v1.4h, #16244; NOB16B16-NEXT: shll v6.4s, v0.4h, #16245; NOB16B16-NEXT: mov h7, v0.h[2]246; NOB16B16-NEXT: mov h1, v1.h[3]247; NOB16B16-NEXT: shll v2.4s, v2.4h, #16248; NOB16B16-NEXT: shll v3.4s, v3.4h, #16249; NOB16B16-NEXT: shll v4.4s, v4.4h, #16250; NOB16B16-NEXT: shll v1.4s, v1.4h, #16251; NOB16B16-NEXT: fmaxnm s2, s3, s2252; NOB16B16-NEXT: fmaxnm s3, s6, s5253; NOB16B16-NEXT: shll v5.4s, v7.4h, #16254; NOB16B16-NEXT: mov h6, v0.h[3]255; NOB16B16-NEXT: fmaxnm s4, s5, s4256; NOB16B16-NEXT: bfcvt h2, s2257; NOB16B16-NEXT: bfcvt h0, s3258; NOB16B16-NEXT: shll v3.4s, v6.4h, #16259; NOB16B16-NEXT: mov v0.h[1], v2.h[0]260; NOB16B16-NEXT: bfcvt h2, s4261; NOB16B16-NEXT: fmaxnm s1, s3, s1262; NOB16B16-NEXT: mov v0.h[2], v2.h[0]263; NOB16B16-NEXT: bfcvt h1, s1264; NOB16B16-NEXT: mov v0.h[3], v1.h[0]265; NOB16B16-NEXT: // kill: def $d0 killed $d0 killed $q0266; NOB16B16-NEXT: ret267;268; B16B16-LABEL: fmaxnm_v4bf16:269; B16B16: // %bb.0:270; B16B16-NEXT: ptrue p0.h, vl4271; B16B16-NEXT: // kill: def $d0 killed $d0 def $z0272; B16B16-NEXT: // kill: def $d1 killed $d1 def $z1273; B16B16-NEXT: bfmaxnm z0.h, p0/m, z0.h, z1.h274; B16B16-NEXT: // kill: def $d0 killed $d0 killed $z0275; B16B16-NEXT: ret276 %res = call <4 x bfloat> @llvm.maxnum.v4bf16(<4 x bfloat> %a, <4 x bfloat> %b)277 ret <4 x bfloat> %res278}279 280define <8 x bfloat> @fmaxnm_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b) {281; NOB16B16-LABEL: fmaxnm_v8bf16:282; NOB16B16: // %bb.0:283; NOB16B16-NEXT: mov h2, v1.h[1]284; NOB16B16-NEXT: mov h3, v0.h[1]285; NOB16B16-NEXT: shll v4.4s, v1.4h, #16286; NOB16B16-NEXT: shll v5.4s, v0.4h, #16287; NOB16B16-NEXT: mov h6, v1.h[2]288; NOB16B16-NEXT: mov h7, v0.h[2]289; NOB16B16-NEXT: mov h16, v1.h[3]290; NOB16B16-NEXT: shll v2.4s, v2.4h, #16291; NOB16B16-NEXT: shll v3.4s, v3.4h, #16292; NOB16B16-NEXT: fmaxnm s4, s5, s4293; NOB16B16-NEXT: mov h5, v0.h[3]294; NOB16B16-NEXT: shll v6.4s, v6.4h, #16295; NOB16B16-NEXT: shll v7.4s, v7.4h, #16296; NOB16B16-NEXT: fmaxnm s3, s3, s2297; NOB16B16-NEXT: bfcvt h2, s4298; NOB16B16-NEXT: fmaxnm s4, s7, s6299; NOB16B16-NEXT: shll v6.4s, v16.4h, #16300; NOB16B16-NEXT: shll v5.4s, v5.4h, #16301; NOB16B16-NEXT: mov h7, v1.h[4]302; NOB16B16-NEXT: mov h16, v0.h[4]303; NOB16B16-NEXT: bfcvt h3, s3304; NOB16B16-NEXT: fmaxnm s5, s5, s6305; NOB16B16-NEXT: bfcvt h4, s4306; NOB16B16-NEXT: mov h6, v0.h[5]307; NOB16B16-NEXT: shll v7.4s, v7.4h, #16308; NOB16B16-NEXT: shll v16.4s, v16.4h, #16309; NOB16B16-NEXT: mov v2.h[1], v3.h[0]310; NOB16B16-NEXT: mov h3, v1.h[5]311; NOB16B16-NEXT: bfcvt h5, s5312; NOB16B16-NEXT: fmaxnm s7, s16, s7313; NOB16B16-NEXT: mov h16, v0.h[6]314; NOB16B16-NEXT: shll v6.4s, v6.4h, #16315; NOB16B16-NEXT: mov h0, v0.h[7]316; NOB16B16-NEXT: mov v2.h[2], v4.h[0]317; NOB16B16-NEXT: mov h4, v1.h[6]318; NOB16B16-NEXT: shll v3.4s, v3.4h, #16319; NOB16B16-NEXT: mov h1, v1.h[7]320; NOB16B16-NEXT: shll v0.4s, v0.4h, #16321; NOB16B16-NEXT: fmaxnm s3, s6, s3322; NOB16B16-NEXT: shll v6.4s, v16.4h, #16323; NOB16B16-NEXT: mov v2.h[3], v5.h[0]324; NOB16B16-NEXT: bfcvt h5, s7325; NOB16B16-NEXT: shll v4.4s, v4.4h, #16326; NOB16B16-NEXT: shll v1.4s, v1.4h, #16327; NOB16B16-NEXT: fmaxnm s4, s6, s4328; NOB16B16-NEXT: bfcvt h3, s3329; NOB16B16-NEXT: mov v2.h[4], v5.h[0]330; NOB16B16-NEXT: fmaxnm s0, s0, s1331; NOB16B16-NEXT: mov v2.h[5], v3.h[0]332; NOB16B16-NEXT: bfcvt h3, s4333; NOB16B16-NEXT: bfcvt h0, s0334; NOB16B16-NEXT: mov v2.h[6], v3.h[0]335; NOB16B16-NEXT: mov v2.h[7], v0.h[0]336; NOB16B16-NEXT: mov v0.16b, v2.16b337; NOB16B16-NEXT: ret338;339; B16B16-LABEL: fmaxnm_v8bf16:340; B16B16: // %bb.0:341; B16B16-NEXT: ptrue p0.h, vl8342; B16B16-NEXT: // kill: def $q0 killed $q0 def $z0343; B16B16-NEXT: // kill: def $q1 killed $q1 def $z1344; B16B16-NEXT: bfmaxnm z0.h, p0/m, z0.h, z1.h345; B16B16-NEXT: // kill: def $q0 killed $q0 killed $z0346; B16B16-NEXT: ret347 %res = call <8 x bfloat> @llvm.maxnum.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)348 ret <8 x bfloat> %res349}350 351;352; FMIN353;354 355define <4 x bfloat> @fmin_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b) {356; NOB16B16-LABEL: fmin_v4bf16:357; NOB16B16: // %bb.0:358; NOB16B16-NEXT: // kill: def $d1 killed $d1 def $q1359; NOB16B16-NEXT: // kill: def $d0 killed $d0 def $q0360; NOB16B16-NEXT: mov h2, v1.h[1]361; NOB16B16-NEXT: mov h3, v0.h[1]362; NOB16B16-NEXT: mov h4, v1.h[2]363; NOB16B16-NEXT: shll v5.4s, v1.4h, #16364; NOB16B16-NEXT: shll v6.4s, v0.4h, #16365; NOB16B16-NEXT: mov h7, v0.h[2]366; NOB16B16-NEXT: mov h1, v1.h[3]367; NOB16B16-NEXT: shll v2.4s, v2.4h, #16368; NOB16B16-NEXT: shll v3.4s, v3.4h, #16369; NOB16B16-NEXT: shll v4.4s, v4.4h, #16370; NOB16B16-NEXT: shll v1.4s, v1.4h, #16371; NOB16B16-NEXT: fmin s2, s3, s2372; NOB16B16-NEXT: fmin s3, s6, s5373; NOB16B16-NEXT: shll v5.4s, v7.4h, #16374; NOB16B16-NEXT: mov h6, v0.h[3]375; NOB16B16-NEXT: fmin s4, s5, s4376; NOB16B16-NEXT: bfcvt h2, s2377; NOB16B16-NEXT: bfcvt h0, s3378; NOB16B16-NEXT: shll v3.4s, v6.4h, #16379; NOB16B16-NEXT: mov v0.h[1], v2.h[0]380; NOB16B16-NEXT: bfcvt h2, s4381; NOB16B16-NEXT: fmin s1, s3, s1382; NOB16B16-NEXT: mov v0.h[2], v2.h[0]383; NOB16B16-NEXT: bfcvt h1, s1384; NOB16B16-NEXT: mov v0.h[3], v1.h[0]385; NOB16B16-NEXT: // kill: def $d0 killed $d0 killed $q0386; NOB16B16-NEXT: ret387;388; B16B16-LABEL: fmin_v4bf16:389; B16B16: // %bb.0:390; B16B16-NEXT: ptrue p0.h, vl4391; B16B16-NEXT: // kill: def $d0 killed $d0 def $z0392; B16B16-NEXT: // kill: def $d1 killed $d1 def $z1393; B16B16-NEXT: bfmin z0.h, p0/m, z0.h, z1.h394; B16B16-NEXT: // kill: def $d0 killed $d0 killed $z0395; B16B16-NEXT: ret396 %res = call <4 x bfloat> @llvm.minimum.v4bf16(<4 x bfloat> %a, <4 x bfloat> %b)397 ret <4 x bfloat> %res398}399 400define <8 x bfloat> @fmin_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b) {401; NOB16B16-LABEL: fmin_v8bf16:402; NOB16B16: // %bb.0:403; NOB16B16-NEXT: mov h2, v1.h[1]404; NOB16B16-NEXT: mov h3, v0.h[1]405; NOB16B16-NEXT: shll v4.4s, v1.4h, #16406; NOB16B16-NEXT: shll v5.4s, v0.4h, #16407; NOB16B16-NEXT: mov h6, v1.h[2]408; NOB16B16-NEXT: mov h7, v0.h[2]409; NOB16B16-NEXT: mov h16, v1.h[3]410; NOB16B16-NEXT: shll v2.4s, v2.4h, #16411; NOB16B16-NEXT: shll v3.4s, v3.4h, #16412; NOB16B16-NEXT: fmin s4, s5, s4413; NOB16B16-NEXT: mov h5, v0.h[3]414; NOB16B16-NEXT: shll v6.4s, v6.4h, #16415; NOB16B16-NEXT: shll v7.4s, v7.4h, #16416; NOB16B16-NEXT: fmin s3, s3, s2417; NOB16B16-NEXT: bfcvt h2, s4418; NOB16B16-NEXT: fmin s4, s7, s6419; NOB16B16-NEXT: shll v6.4s, v16.4h, #16420; NOB16B16-NEXT: shll v5.4s, v5.4h, #16421; NOB16B16-NEXT: mov h7, v1.h[4]422; NOB16B16-NEXT: mov h16, v0.h[4]423; NOB16B16-NEXT: bfcvt h3, s3424; NOB16B16-NEXT: fmin s5, s5, s6425; NOB16B16-NEXT: bfcvt h4, s4426; NOB16B16-NEXT: mov h6, v0.h[5]427; NOB16B16-NEXT: shll v7.4s, v7.4h, #16428; NOB16B16-NEXT: shll v16.4s, v16.4h, #16429; NOB16B16-NEXT: mov v2.h[1], v3.h[0]430; NOB16B16-NEXT: mov h3, v1.h[5]431; NOB16B16-NEXT: bfcvt h5, s5432; NOB16B16-NEXT: fmin s7, s16, s7433; NOB16B16-NEXT: mov h16, v0.h[6]434; NOB16B16-NEXT: shll v6.4s, v6.4h, #16435; NOB16B16-NEXT: mov h0, v0.h[7]436; NOB16B16-NEXT: mov v2.h[2], v4.h[0]437; NOB16B16-NEXT: mov h4, v1.h[6]438; NOB16B16-NEXT: shll v3.4s, v3.4h, #16439; NOB16B16-NEXT: mov h1, v1.h[7]440; NOB16B16-NEXT: shll v0.4s, v0.4h, #16441; NOB16B16-NEXT: fmin s3, s6, s3442; NOB16B16-NEXT: shll v6.4s, v16.4h, #16443; NOB16B16-NEXT: mov v2.h[3], v5.h[0]444; NOB16B16-NEXT: bfcvt h5, s7445; NOB16B16-NEXT: shll v4.4s, v4.4h, #16446; NOB16B16-NEXT: shll v1.4s, v1.4h, #16447; NOB16B16-NEXT: fmin s4, s6, s4448; NOB16B16-NEXT: bfcvt h3, s3449; NOB16B16-NEXT: mov v2.h[4], v5.h[0]450; NOB16B16-NEXT: fmin s0, s0, s1451; NOB16B16-NEXT: mov v2.h[5], v3.h[0]452; NOB16B16-NEXT: bfcvt h3, s4453; NOB16B16-NEXT: bfcvt h0, s0454; NOB16B16-NEXT: mov v2.h[6], v3.h[0]455; NOB16B16-NEXT: mov v2.h[7], v0.h[0]456; NOB16B16-NEXT: mov v0.16b, v2.16b457; NOB16B16-NEXT: ret458;459; B16B16-LABEL: fmin_v8bf16:460; B16B16: // %bb.0:461; B16B16-NEXT: ptrue p0.h, vl8462; B16B16-NEXT: // kill: def $q0 killed $q0 def $z0463; B16B16-NEXT: // kill: def $q1 killed $q1 def $z1464; B16B16-NEXT: bfmin z0.h, p0/m, z0.h, z1.h465; B16B16-NEXT: // kill: def $q0 killed $q0 killed $z0466; B16B16-NEXT: ret467 %res = call <8 x bfloat> @llvm.minimum.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)468 ret <8 x bfloat> %res469}470 471;472; FMINNM473;474 475define <4 x bfloat> @fminnm_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b) {476; NOB16B16-LABEL: fminnm_v4bf16:477; NOB16B16: // %bb.0:478; NOB16B16-NEXT: // kill: def $d1 killed $d1 def $q1479; NOB16B16-NEXT: // kill: def $d0 killed $d0 def $q0480; NOB16B16-NEXT: mov h2, v1.h[1]481; NOB16B16-NEXT: mov h3, v0.h[1]482; NOB16B16-NEXT: mov h4, v1.h[2]483; NOB16B16-NEXT: shll v5.4s, v1.4h, #16484; NOB16B16-NEXT: shll v6.4s, v0.4h, #16485; NOB16B16-NEXT: mov h7, v0.h[2]486; NOB16B16-NEXT: mov h1, v1.h[3]487; NOB16B16-NEXT: shll v2.4s, v2.4h, #16488; NOB16B16-NEXT: shll v3.4s, v3.4h, #16489; NOB16B16-NEXT: shll v4.4s, v4.4h, #16490; NOB16B16-NEXT: shll v1.4s, v1.4h, #16491; NOB16B16-NEXT: fminnm s2, s3, s2492; NOB16B16-NEXT: fminnm s3, s6, s5493; NOB16B16-NEXT: shll v5.4s, v7.4h, #16494; NOB16B16-NEXT: mov h6, v0.h[3]495; NOB16B16-NEXT: fminnm s4, s5, s4496; NOB16B16-NEXT: bfcvt h2, s2497; NOB16B16-NEXT: bfcvt h0, s3498; NOB16B16-NEXT: shll v3.4s, v6.4h, #16499; NOB16B16-NEXT: mov v0.h[1], v2.h[0]500; NOB16B16-NEXT: bfcvt h2, s4501; NOB16B16-NEXT: fminnm s1, s3, s1502; NOB16B16-NEXT: mov v0.h[2], v2.h[0]503; NOB16B16-NEXT: bfcvt h1, s1504; NOB16B16-NEXT: mov v0.h[3], v1.h[0]505; NOB16B16-NEXT: // kill: def $d0 killed $d0 killed $q0506; NOB16B16-NEXT: ret507;508; B16B16-LABEL: fminnm_v4bf16:509; B16B16: // %bb.0:510; B16B16-NEXT: ptrue p0.h, vl4511; B16B16-NEXT: // kill: def $d0 killed $d0 def $z0512; B16B16-NEXT: // kill: def $d1 killed $d1 def $z1513; B16B16-NEXT: bfminnm z0.h, p0/m, z0.h, z1.h514; B16B16-NEXT: // kill: def $d0 killed $d0 killed $z0515; B16B16-NEXT: ret516 %res = call <4 x bfloat> @llvm.minnum.v4bf16(<4 x bfloat> %a, <4 x bfloat> %b)517 ret <4 x bfloat> %res518}519 520define <8 x bfloat> @fminnm_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b) {521; NOB16B16-LABEL: fminnm_v8bf16:522; NOB16B16: // %bb.0:523; NOB16B16-NEXT: mov h2, v1.h[1]524; NOB16B16-NEXT: mov h3, v0.h[1]525; NOB16B16-NEXT: shll v4.4s, v1.4h, #16526; NOB16B16-NEXT: shll v5.4s, v0.4h, #16527; NOB16B16-NEXT: mov h6, v1.h[2]528; NOB16B16-NEXT: mov h7, v0.h[2]529; NOB16B16-NEXT: mov h16, v1.h[3]530; NOB16B16-NEXT: shll v2.4s, v2.4h, #16531; NOB16B16-NEXT: shll v3.4s, v3.4h, #16532; NOB16B16-NEXT: fminnm s4, s5, s4533; NOB16B16-NEXT: mov h5, v0.h[3]534; NOB16B16-NEXT: shll v6.4s, v6.4h, #16535; NOB16B16-NEXT: shll v7.4s, v7.4h, #16536; NOB16B16-NEXT: fminnm s3, s3, s2537; NOB16B16-NEXT: bfcvt h2, s4538; NOB16B16-NEXT: fminnm s4, s7, s6539; NOB16B16-NEXT: shll v6.4s, v16.4h, #16540; NOB16B16-NEXT: shll v5.4s, v5.4h, #16541; NOB16B16-NEXT: mov h7, v1.h[4]542; NOB16B16-NEXT: mov h16, v0.h[4]543; NOB16B16-NEXT: bfcvt h3, s3544; NOB16B16-NEXT: fminnm s5, s5, s6545; NOB16B16-NEXT: bfcvt h4, s4546; NOB16B16-NEXT: mov h6, v0.h[5]547; NOB16B16-NEXT: shll v7.4s, v7.4h, #16548; NOB16B16-NEXT: shll v16.4s, v16.4h, #16549; NOB16B16-NEXT: mov v2.h[1], v3.h[0]550; NOB16B16-NEXT: mov h3, v1.h[5]551; NOB16B16-NEXT: bfcvt h5, s5552; NOB16B16-NEXT: fminnm s7, s16, s7553; NOB16B16-NEXT: mov h16, v0.h[6]554; NOB16B16-NEXT: shll v6.4s, v6.4h, #16555; NOB16B16-NEXT: mov h0, v0.h[7]556; NOB16B16-NEXT: mov v2.h[2], v4.h[0]557; NOB16B16-NEXT: mov h4, v1.h[6]558; NOB16B16-NEXT: shll v3.4s, v3.4h, #16559; NOB16B16-NEXT: mov h1, v1.h[7]560; NOB16B16-NEXT: shll v0.4s, v0.4h, #16561; NOB16B16-NEXT: fminnm s3, s6, s3562; NOB16B16-NEXT: shll v6.4s, v16.4h, #16563; NOB16B16-NEXT: mov v2.h[3], v5.h[0]564; NOB16B16-NEXT: bfcvt h5, s7565; NOB16B16-NEXT: shll v4.4s, v4.4h, #16566; NOB16B16-NEXT: shll v1.4s, v1.4h, #16567; NOB16B16-NEXT: fminnm s4, s6, s4568; NOB16B16-NEXT: bfcvt h3, s3569; NOB16B16-NEXT: mov v2.h[4], v5.h[0]570; NOB16B16-NEXT: fminnm s0, s0, s1571; NOB16B16-NEXT: mov v2.h[5], v3.h[0]572; NOB16B16-NEXT: bfcvt h3, s4573; NOB16B16-NEXT: bfcvt h0, s0574; NOB16B16-NEXT: mov v2.h[6], v3.h[0]575; NOB16B16-NEXT: mov v2.h[7], v0.h[0]576; NOB16B16-NEXT: mov v0.16b, v2.16b577; NOB16B16-NEXT: ret578;579; B16B16-LABEL: fminnm_v8bf16:580; B16B16: // %bb.0:581; B16B16-NEXT: ptrue p0.h, vl8582; B16B16-NEXT: // kill: def $q0 killed $q0 def $z0583; B16B16-NEXT: // kill: def $q1 killed $q1 def $z1584; B16B16-NEXT: bfminnm z0.h, p0/m, z0.h, z1.h585; B16B16-NEXT: // kill: def $q0 killed $q0 killed $z0586; B16B16-NEXT: ret587 %res = call <8 x bfloat> @llvm.minnum.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)588 ret <8 x bfloat> %res589}590 591;592; FMLA593;594 595define <4 x bfloat> @fmla_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b, <4 x bfloat> %c) {596; NOB16B16-LABEL: fmla_v4bf16:597; NOB16B16: // %bb.0:598; NOB16B16-NEXT: // kill: def $d2 killed $d2 def $q2599; NOB16B16-NEXT: // kill: def $d1 killed $d1 def $q1600; NOB16B16-NEXT: // kill: def $d0 killed $d0 def $q0601; NOB16B16-NEXT: mov h3, v2.h[1]602; NOB16B16-NEXT: mov h4, v1.h[1]603; NOB16B16-NEXT: mov h5, v0.h[1]604; NOB16B16-NEXT: shll v6.4s, v2.4h, #16605; NOB16B16-NEXT: shll v7.4s, v1.4h, #16606; NOB16B16-NEXT: shll v16.4s, v0.4h, #16607; NOB16B16-NEXT: mov h17, v2.h[2]608; NOB16B16-NEXT: mov h18, v1.h[2]609; NOB16B16-NEXT: mov h19, v0.h[2]610; NOB16B16-NEXT: mov h2, v2.h[3]611; NOB16B16-NEXT: mov h1, v1.h[3]612; NOB16B16-NEXT: fmadd s6, s16, s7, s6613; NOB16B16-NEXT: shll v3.4s, v3.4h, #16614; NOB16B16-NEXT: shll v4.4s, v4.4h, #16615; NOB16B16-NEXT: shll v5.4s, v5.4h, #16616; NOB16B16-NEXT: mov h16, v0.h[3]617; NOB16B16-NEXT: shll v7.4s, v19.4h, #16618; NOB16B16-NEXT: shll v2.4s, v2.4h, #16619; NOB16B16-NEXT: shll v1.4s, v1.4h, #16620; NOB16B16-NEXT: fmadd s3, s5, s4, s3621; NOB16B16-NEXT: shll v4.4s, v17.4h, #16622; NOB16B16-NEXT: shll v5.4s, v18.4h, #16623; NOB16B16-NEXT: bfcvt h0, s6624; NOB16B16-NEXT: fmadd s4, s7, s5, s4625; NOB16B16-NEXT: shll v5.4s, v16.4h, #16626; NOB16B16-NEXT: bfcvt h3, s3627; NOB16B16-NEXT: fmadd s1, s5, s1, s2628; NOB16B16-NEXT: mov v0.h[1], v3.h[0]629; NOB16B16-NEXT: bfcvt h3, s4630; NOB16B16-NEXT: bfcvt h1, s1631; NOB16B16-NEXT: mov v0.h[2], v3.h[0]632; NOB16B16-NEXT: mov v0.h[3], v1.h[0]633; NOB16B16-NEXT: // kill: def $d0 killed $d0 killed $q0634; NOB16B16-NEXT: ret635;636; B16B16-LABEL: fmla_v4bf16:637; B16B16: // %bb.0:638; B16B16-NEXT: ptrue p0.h, vl4639; B16B16-NEXT: // kill: def $d0 killed $d0 def $z0640; B16B16-NEXT: // kill: def $d2 killed $d2 def $z2641; B16B16-NEXT: // kill: def $d1 killed $d1 def $z1642; B16B16-NEXT: bfmla z0.h, p0/m, z1.h, z2.h643; B16B16-NEXT: // kill: def $d0 killed $d0 killed $z0644; B16B16-NEXT: ret645 %res = call <4 x bfloat> @llvm.fma.v4bf16(<4 x bfloat> %a, <4 x bfloat> %b, <4 x bfloat> %c)646 ret <4 x bfloat> %res647}648 649define <8 x bfloat> @fmla_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b, <8 x bfloat> %c) {650; NOB16B16-LABEL: fmla_v8bf16:651; NOB16B16: // %bb.0:652; NOB16B16-NEXT: mov h3, v2.h[1]653; NOB16B16-NEXT: mov h4, v1.h[1]654; NOB16B16-NEXT: mov h5, v0.h[1]655; NOB16B16-NEXT: shll v6.4s, v2.4h, #16656; NOB16B16-NEXT: shll v7.4s, v1.4h, #16657; NOB16B16-NEXT: shll v16.4s, v0.4h, #16658; NOB16B16-NEXT: mov h17, v2.h[2]659; NOB16B16-NEXT: mov h18, v1.h[2]660; NOB16B16-NEXT: mov h19, v0.h[2]661; NOB16B16-NEXT: mov h20, v2.h[3]662; NOB16B16-NEXT: mov h21, v1.h[3]663; NOB16B16-NEXT: fmadd s6, s16, s7, s6664; NOB16B16-NEXT: shll v3.4s, v3.4h, #16665; NOB16B16-NEXT: shll v4.4s, v4.4h, #16666; NOB16B16-NEXT: shll v5.4s, v5.4h, #16667; NOB16B16-NEXT: mov h7, v0.h[3]668; NOB16B16-NEXT: shll v16.4s, v19.4h, #16669; NOB16B16-NEXT: mov h19, v0.h[4]670; NOB16B16-NEXT: fmadd s4, s5, s4, s3671; NOB16B16-NEXT: shll v3.4s, v17.4h, #16672; NOB16B16-NEXT: shll v5.4s, v18.4h, #16673; NOB16B16-NEXT: mov h17, v2.h[4]674; NOB16B16-NEXT: mov h18, v1.h[4]675; NOB16B16-NEXT: shll v7.4s, v7.4h, #16676; NOB16B16-NEXT: shll v19.4s, v19.4h, #16677; NOB16B16-NEXT: fmadd s5, s16, s5, s3678; NOB16B16-NEXT: bfcvt h3, s6679; NOB16B16-NEXT: shll v6.4s, v20.4h, #16680; NOB16B16-NEXT: bfcvt h4, s4681; NOB16B16-NEXT: shll v16.4s, v21.4h, #16682; NOB16B16-NEXT: shll v17.4s, v17.4h, #16683; NOB16B16-NEXT: shll v18.4s, v18.4h, #16684; NOB16B16-NEXT: fmadd s6, s7, s16, s6685; NOB16B16-NEXT: bfcvt h5, s5686; NOB16B16-NEXT: mov h7, v1.h[5]687; NOB16B16-NEXT: mov v3.h[1], v4.h[0]688; NOB16B16-NEXT: mov h4, v2.h[5]689; NOB16B16-NEXT: mov h16, v0.h[5]690; NOB16B16-NEXT: fmadd s17, s19, s18, s17691; NOB16B16-NEXT: mov h18, v2.h[6]692; NOB16B16-NEXT: mov h19, v1.h[6]693; NOB16B16-NEXT: mov h2, v2.h[7]694; NOB16B16-NEXT: mov h1, v1.h[7]695; NOB16B16-NEXT: bfcvt h6, s6696; NOB16B16-NEXT: shll v7.4s, v7.4h, #16697; NOB16B16-NEXT: mov v3.h[2], v5.h[0]698; NOB16B16-NEXT: mov h5, v0.h[6]699; NOB16B16-NEXT: shll v4.4s, v4.4h, #16700; NOB16B16-NEXT: shll v16.4s, v16.4h, #16701; NOB16B16-NEXT: mov h0, v0.h[7]702; NOB16B16-NEXT: shll v2.4s, v2.4h, #16703; NOB16B16-NEXT: shll v1.4s, v1.4h, #16704; NOB16B16-NEXT: fmadd s4, s16, s7, s4705; NOB16B16-NEXT: mov v3.h[3], v6.h[0]706; NOB16B16-NEXT: bfcvt h6, s17707; NOB16B16-NEXT: shll v7.4s, v18.4h, #16708; NOB16B16-NEXT: shll v16.4s, v19.4h, #16709; NOB16B16-NEXT: shll v5.4s, v5.4h, #16710; NOB16B16-NEXT: shll v0.4s, v0.4h, #16711; NOB16B16-NEXT: fmadd s5, s5, s16, s7712; NOB16B16-NEXT: mov v3.h[4], v6.h[0]713; NOB16B16-NEXT: bfcvt h4, s4714; NOB16B16-NEXT: fmadd s0, s0, s1, s2715; NOB16B16-NEXT: mov v3.h[5], v4.h[0]716; NOB16B16-NEXT: bfcvt h4, s5717; NOB16B16-NEXT: bfcvt h0, s0718; NOB16B16-NEXT: mov v3.h[6], v4.h[0]719; NOB16B16-NEXT: mov v3.h[7], v0.h[0]720; NOB16B16-NEXT: mov v0.16b, v3.16b721; NOB16B16-NEXT: ret722;723; B16B16-LABEL: fmla_v8bf16:724; B16B16: // %bb.0:725; B16B16-NEXT: ptrue p0.h, vl8726; B16B16-NEXT: // kill: def $q0 killed $q0 def $z0727; B16B16-NEXT: // kill: def $q2 killed $q2 def $z2728; B16B16-NEXT: // kill: def $q1 killed $q1 def $z1729; B16B16-NEXT: bfmla z0.h, p0/m, z1.h, z2.h730; B16B16-NEXT: // kill: def $q0 killed $q0 killed $z0731; B16B16-NEXT: ret732 %res = call <8 x bfloat> @llvm.fma.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b, <8 x bfloat> %c)733 ret <8 x bfloat> %res734}735 736;737; FMUL738;739 740define <4 x bfloat> @fmul_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b) {741; NOB16B16-LABEL: fmul_v4bf16:742; NOB16B16: // %bb.0:743; NOB16B16-NEXT: shll v1.4s, v1.4h, #16744; NOB16B16-NEXT: shll v0.4s, v0.4h, #16745; NOB16B16-NEXT: fmul v0.4s, v0.4s, v1.4s746; NOB16B16-NEXT: bfcvtn v0.4h, v0.4s747; NOB16B16-NEXT: ret748;749; B16B16-LABEL: fmul_v4bf16:750; B16B16: // %bb.0:751; B16B16-NEXT: ptrue p0.h, vl4752; B16B16-NEXT: // kill: def $d0 killed $d0 def $z0753; B16B16-NEXT: // kill: def $d1 killed $d1 def $z1754; B16B16-NEXT: bfmul z0.h, p0/m, z0.h, z1.h755; B16B16-NEXT: // kill: def $d0 killed $d0 killed $z0756; B16B16-NEXT: ret757 %res = fmul <4 x bfloat> %a, %b758 ret <4 x bfloat> %res759}760 761define <8 x bfloat> @fmul_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b) {762; NOB16B16-LABEL: fmul_v8bf16:763; NOB16B16: // %bb.0:764; NOB16B16-NEXT: shll v2.4s, v1.4h, #16765; NOB16B16-NEXT: shll v3.4s, v0.4h, #16766; NOB16B16-NEXT: shll2 v1.4s, v1.8h, #16767; NOB16B16-NEXT: shll2 v0.4s, v0.8h, #16768; NOB16B16-NEXT: fmul v2.4s, v3.4s, v2.4s769; NOB16B16-NEXT: fmul v1.4s, v0.4s, v1.4s770; NOB16B16-NEXT: bfcvtn v0.4h, v2.4s771; NOB16B16-NEXT: bfcvtn2 v0.8h, v1.4s772; NOB16B16-NEXT: ret773;774; B16B16-LABEL: fmul_v8bf16:775; B16B16: // %bb.0:776; B16B16-NEXT: ptrue p0.h, vl8777; B16B16-NEXT: // kill: def $q0 killed $q0 def $z0778; B16B16-NEXT: // kill: def $q1 killed $q1 def $z1779; B16B16-NEXT: bfmul z0.h, p0/m, z0.h, z1.h780; B16B16-NEXT: // kill: def $q0 killed $q0 killed $z0781; B16B16-NEXT: ret782 %res = fmul <8 x bfloat> %a, %b783 ret <8 x bfloat> %res784}785 786;787; FNEG788;789 790define <4 x bfloat> @fneg_v4bf16(<4 x bfloat> %a) {791; CHECK-LABEL: fneg_v4bf16:792; CHECK: // %bb.0:793; CHECK-NEXT: movi v1.4h, #128, lsl #8794; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b795; CHECK-NEXT: ret796 %res = fneg <4 x bfloat> %a797 ret <4 x bfloat> %res798}799 800define <8 x bfloat> @fneg_v8bf16(<8 x bfloat> %a) {801; CHECK-LABEL: fneg_v8bf16:802; CHECK: // %bb.0:803; CHECK-NEXT: movi v1.8h, #128, lsl #8804; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b805; CHECK-NEXT: ret806 %res = fneg <8 x bfloat> %a807 ret <8 x bfloat> %res808}809 810;811; FSQRT812;813 814define <4 x bfloat> @fsqrt_v4bf16(<4 x bfloat> %a) {815; CHECK-LABEL: fsqrt_v4bf16:816; CHECK: // %bb.0:817; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0818; CHECK-NEXT: mov h1, v0.h[1]819; CHECK-NEXT: shll v2.4s, v0.4h, #16820; CHECK-NEXT: mov h3, v0.h[2]821; CHECK-NEXT: mov h0, v0.h[3]822; CHECK-NEXT: fsqrt s2, s2823; CHECK-NEXT: shll v1.4s, v1.4h, #16824; CHECK-NEXT: shll v3.4s, v3.4h, #16825; CHECK-NEXT: shll v0.4s, v0.4h, #16826; CHECK-NEXT: fsqrt s1, s1827; CHECK-NEXT: bfcvt h1, s1828; CHECK-NEXT: fsqrt s3, s3829; CHECK-NEXT: fsqrt s4, s0830; CHECK-NEXT: bfcvt h0, s2831; CHECK-NEXT: mov v0.h[1], v1.h[0]832; CHECK-NEXT: bfcvt h1, s3833; CHECK-NEXT: mov v0.h[2], v1.h[0]834; CHECK-NEXT: bfcvt h1, s4835; CHECK-NEXT: mov v0.h[3], v1.h[0]836; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0837; CHECK-NEXT: ret838 %res = call <4 x bfloat> @llvm.sqrt.v4bf16(<4 x bfloat> %a)839 ret <4 x bfloat> %res840}841 842define <8 x bfloat> @fsqrt_v8bf16(<8 x bfloat> %a) {843; CHECK-LABEL: fsqrt_v8bf16:844; CHECK: // %bb.0:845; CHECK-NEXT: mov h1, v0.h[1]846; CHECK-NEXT: shll v2.4s, v0.4h, #16847; CHECK-NEXT: mov h3, v0.h[2]848; CHECK-NEXT: mov h4, v0.h[3]849; CHECK-NEXT: mov h5, v0.h[4]850; CHECK-NEXT: mov h6, v0.h[5]851; CHECK-NEXT: mov h7, v0.h[6]852; CHECK-NEXT: mov h0, v0.h[7]853; CHECK-NEXT: fsqrt s2, s2854; CHECK-NEXT: shll v1.4s, v1.4h, #16855; CHECK-NEXT: shll v3.4s, v3.4h, #16856; CHECK-NEXT: shll v4.4s, v4.4h, #16857; CHECK-NEXT: shll v5.4s, v5.4h, #16858; CHECK-NEXT: shll v6.4s, v6.4h, #16859; CHECK-NEXT: shll v7.4s, v7.4h, #16860; CHECK-NEXT: shll v16.4s, v0.4h, #16861; CHECK-NEXT: bfcvt h0, s2862; CHECK-NEXT: fsqrt s1, s1863; CHECK-NEXT: bfcvt h1, s1864; CHECK-NEXT: mov v0.h[1], v1.h[0]865; CHECK-NEXT: fsqrt s3, s3866; CHECK-NEXT: bfcvt h1, s3867; CHECK-NEXT: mov v0.h[2], v1.h[0]868; CHECK-NEXT: fsqrt s4, s4869; CHECK-NEXT: bfcvt h1, s4870; CHECK-NEXT: mov v0.h[3], v1.h[0]871; CHECK-NEXT: fsqrt s5, s5872; CHECK-NEXT: bfcvt h1, s5873; CHECK-NEXT: mov v0.h[4], v1.h[0]874; CHECK-NEXT: fsqrt s6, s6875; CHECK-NEXT: bfcvt h1, s6876; CHECK-NEXT: mov v0.h[5], v1.h[0]877; CHECK-NEXT: fsqrt s7, s7878; CHECK-NEXT: bfcvt h1, s7879; CHECK-NEXT: mov v0.h[6], v1.h[0]880; CHECK-NEXT: fsqrt s2, s16881; CHECK-NEXT: bfcvt h1, s2882; CHECK-NEXT: mov v0.h[7], v1.h[0]883; CHECK-NEXT: ret884 %res = call <8 x bfloat> @llvm.sqrt.v8bf16(<8 x bfloat> %a)885 ret <8 x bfloat> %res886}887 888;889; FSUB890;891 892define <4 x bfloat> @fsub_v4bf16(<4 x bfloat> %a, <4 x bfloat> %b) {893; NOB16B16-LABEL: fsub_v4bf16:894; NOB16B16: // %bb.0:895; NOB16B16-NEXT: shll v1.4s, v1.4h, #16896; NOB16B16-NEXT: shll v0.4s, v0.4h, #16897; NOB16B16-NEXT: fsub v0.4s, v0.4s, v1.4s898; NOB16B16-NEXT: bfcvtn v0.4h, v0.4s899; NOB16B16-NEXT: ret900;901; B16B16-LABEL: fsub_v4bf16:902; B16B16: // %bb.0:903; B16B16-NEXT: ptrue p0.h, vl4904; B16B16-NEXT: // kill: def $d0 killed $d0 def $z0905; B16B16-NEXT: // kill: def $d1 killed $d1 def $z1906; B16B16-NEXT: bfsub z0.h, p0/m, z0.h, z1.h907; B16B16-NEXT: // kill: def $d0 killed $d0 killed $z0908; B16B16-NEXT: ret909 %res = fsub <4 x bfloat> %a, %b910 ret <4 x bfloat> %res911}912 913define <8 x bfloat> @fsub_v8bf16(<8 x bfloat> %a, <8 x bfloat> %b) {914; NOB16B16-LABEL: fsub_v8bf16:915; NOB16B16: // %bb.0:916; NOB16B16-NEXT: shll v2.4s, v1.4h, #16917; NOB16B16-NEXT: shll v3.4s, v0.4h, #16918; NOB16B16-NEXT: shll2 v1.4s, v1.8h, #16919; NOB16B16-NEXT: shll2 v0.4s, v0.8h, #16920; NOB16B16-NEXT: fsub v2.4s, v3.4s, v2.4s921; NOB16B16-NEXT: fsub v1.4s, v0.4s, v1.4s922; NOB16B16-NEXT: bfcvtn v0.4h, v2.4s923; NOB16B16-NEXT: bfcvtn2 v0.8h, v1.4s924; NOB16B16-NEXT: ret925;926; B16B16-LABEL: fsub_v8bf16:927; B16B16: // %bb.0:928; B16B16-NEXT: ptrue p0.h, vl8929; B16B16-NEXT: // kill: def $q0 killed $q0 def $z0930; B16B16-NEXT: // kill: def $q1 killed $q1 def $z1931; B16B16-NEXT: bfsub z0.h, p0/m, z0.h, z1.h932; B16B16-NEXT: // kill: def $q0 killed $q0 killed $z0933; B16B16-NEXT: ret934 %res = fsub <8 x bfloat> %a, %b935 ret <8 x bfloat> %res936}937