442 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve2,+bf16 < %s -o - | FileCheck %s3 4target triple = "aarch64-unknown-linux-gnu"5 6;7; llvm.copysign.nxv2f168;9 10define <vscale x 2 x half> @copysign_nxv2f16_nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b) {11; CHECK-LABEL: copysign_nxv2f16_nxv2f16:12; CHECK: // %bb.0:13; CHECK-NEXT: mov z2.h, #32767 // =0x7fff14; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d15; CHECK-NEXT: ret16 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b)17 ret <vscale x 2 x half> %r18}19 20define <vscale x 2 x half> @copysign_nxv2f16_nxv2f32(<vscale x 2 x half> %a, <vscale x 2 x float> %b) {21; CHECK-LABEL: copysign_nxv2f16_nxv2f32:22; CHECK: // %bb.0:23; CHECK-NEXT: ptrue p0.d24; CHECK-NEXT: mov z2.h, #32767 // =0x7fff25; CHECK-NEXT: fcvt z1.h, p0/m, z1.s26; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d27; CHECK-NEXT: ret28 %b.trunc = fptrunc <vscale x 2 x float> %b to <vscale x 2 x half>29 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b.trunc)30 ret <vscale x 2 x half> %r31}32 33define <vscale x 2 x half> @copysign_nxv2f16_nxv2f64(<vscale x 2 x half> %a, <vscale x 2 x double> %b) {34; CHECK-LABEL: copysign_nxv2f16_nxv2f64:35; CHECK: // %bb.0:36; CHECK-NEXT: ptrue p0.d37; CHECK-NEXT: mov z2.h, #32767 // =0x7fff38; CHECK-NEXT: fcvt z1.h, p0/m, z1.d39; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d40; CHECK-NEXT: ret41 %b.trunc = fptrunc <vscale x 2 x double> %b to <vscale x 2 x half>42 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b.trunc)43 ret <vscale x 2 x half> %r44}45 46;47; llvm.copysign.nxv4f1648;49 50define <vscale x 4 x half> @copysign_nxv4f16_nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {51; CHECK-LABEL: copysign_nxv4f16_nxv4f16:52; CHECK: // %bb.0:53; CHECK-NEXT: mov z2.h, #32767 // =0x7fff54; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d55; CHECK-NEXT: ret56 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b)57 ret <vscale x 4 x half> %r58}59 60define <vscale x 4 x half> @copysign_nxv4f16_nxv4f32(<vscale x 4 x half> %a, <vscale x 4 x float> %b) {61; CHECK-LABEL: copysign_nxv4f16_nxv4f32:62; CHECK: // %bb.0:63; CHECK-NEXT: ptrue p0.s64; CHECK-NEXT: mov z2.h, #32767 // =0x7fff65; CHECK-NEXT: fcvt z1.h, p0/m, z1.s66; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d67; CHECK-NEXT: ret68 %b.trunc = fptrunc <vscale x 4 x float> %b to <vscale x 4 x half>69 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b.trunc)70 ret <vscale x 4 x half> %r71}72 73define <vscale x 4 x half> @copysign_nxv4f16_nxv4f64(<vscale x 4 x half> %a, <vscale x 4 x double> %b) {74; CHECK-LABEL: copysign_nxv4f16_nxv4f64:75; CHECK: // %bb.0:76; CHECK-NEXT: ptrue p0.d77; CHECK-NEXT: mov z3.h, #32767 // =0x7fff78; CHECK-NEXT: fcvt z2.h, p0/m, z2.d79; CHECK-NEXT: fcvt z1.h, p0/m, z1.d80; CHECK-NEXT: uzp1 z1.s, z1.s, z2.s81; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z3.d82; CHECK-NEXT: ret83 %b.trunc = fptrunc <vscale x 4 x double> %b to <vscale x 4 x half>84 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b.trunc)85 ret <vscale x 4 x half> %r86}87 88;89; llvm.copysign.nxv8f1690;91 92define <vscale x 8 x half> @copysign_nxv8f16_nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {93; CHECK-LABEL: copysign_nxv8f16_nxv8f16:94; CHECK: // %bb.0:95; CHECK-NEXT: mov z2.h, #32767 // =0x7fff96; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d97; CHECK-NEXT: ret98 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b)99 ret <vscale x 8 x half> %r100}101 102define <vscale x 8 x half> @copysign_nxv8f16_nxv8f32(<vscale x 8 x half> %a, <vscale x 8 x float> %b) {103; CHECK-LABEL: copysign_nxv8f16_nxv8f32:104; CHECK: // %bb.0:105; CHECK-NEXT: ptrue p0.s106; CHECK-NEXT: mov z3.h, #32767 // =0x7fff107; CHECK-NEXT: fcvt z2.h, p0/m, z2.s108; CHECK-NEXT: fcvt z1.h, p0/m, z1.s109; CHECK-NEXT: uzp1 z1.h, z1.h, z2.h110; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z3.d111; CHECK-NEXT: ret112 %b.trunc = fptrunc <vscale x 8 x float> %b to <vscale x 8 x half>113 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b.trunc)114 ret <vscale x 8 x half> %r115}116 117define <vscale x 8 x half> @copysign_nxv8f16_nxv8f64(<vscale x 8 x half> %a, <vscale x 8 x double> %b) {118; CHECK-LABEL: copysign_nxv8f16_nxv8f64:119; CHECK: // %bb.0:120; CHECK-NEXT: ptrue p0.d121; CHECK-NEXT: fcvt z4.h, p0/m, z4.d122; CHECK-NEXT: fcvt z3.h, p0/m, z3.d123; CHECK-NEXT: fcvt z2.h, p0/m, z2.d124; CHECK-NEXT: fcvt z1.h, p0/m, z1.d125; CHECK-NEXT: uzp1 z3.s, z3.s, z4.s126; CHECK-NEXT: uzp1 z1.s, z1.s, z2.s127; CHECK-NEXT: mov z2.h, #32767 // =0x7fff128; CHECK-NEXT: uzp1 z1.h, z1.h, z3.h129; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d130; CHECK-NEXT: ret131 %b.trunc = fptrunc <vscale x 8 x double> %b to <vscale x 8 x half>132 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b.trunc)133 ret <vscale x 8 x half> %r134}135 136;137; llvm.copysign.nxv2f32138;139 140define <vscale x 2 x float> @copysign_nxv2f32_nxv2f16(<vscale x 2 x float> %a, <vscale x 2 x half> %b) {141; CHECK-LABEL: copysign_nxv2f32_nxv2f16:142; CHECK: // %bb.0:143; CHECK-NEXT: ptrue p0.d144; CHECK-NEXT: mov z2.s, #0x7fffffff145; CHECK-NEXT: fcvt z1.s, p0/m, z1.h146; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d147; CHECK-NEXT: ret148 %b.ext = fpext <vscale x 2 x half> %b to <vscale x 2 x float>149 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b.ext)150 ret <vscale x 2 x float> %r151}152 153define <vscale x 2 x float> @copysign_nxv2f32_nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {154; CHECK-LABEL: copysign_nxv2f32_nxv2f32:155; CHECK: // %bb.0:156; CHECK-NEXT: mov z2.s, #0x7fffffff157; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d158; CHECK-NEXT: ret159 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b)160 ret <vscale x 2 x float> %r161}162 163define <vscale x 2 x float> @copysign_nxv2f32_nxv2f64(<vscale x 2 x float> %a, <vscale x 2 x double> %b) {164; CHECK-LABEL: copysign_nxv2f32_nxv2f64:165; CHECK: // %bb.0:166; CHECK-NEXT: ptrue p0.d167; CHECK-NEXT: mov z2.s, #0x7fffffff168; CHECK-NEXT: fcvt z1.s, p0/m, z1.d169; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d170; CHECK-NEXT: ret171 %b.trunc = fptrunc <vscale x 2 x double> %b to <vscale x 2 x float>172 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b.trunc)173 ret <vscale x 2 x float> %r174}175 176define <vscale x 2 x float> @copysign_nxv2f32_nxv2bf16(<vscale x 2 x float> %a, <vscale x 2 x bfloat> %b) {177; CHECK-LABEL: copysign_nxv2f32_nxv2bf16:178; CHECK: // %bb.0:179; CHECK-NEXT: mov z2.s, #0x7fffffff180; CHECK-NEXT: lsl z1.s, z1.s, #16181; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d182; CHECK-NEXT: ret183 %tmp0 = fpext <vscale x 2 x bfloat> %b to <vscale x 2 x float>184 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %tmp0)185 ret <vscale x 2 x float> %r186}187 188;189; llvm.copysign.nxv4f32190;191 192define <vscale x 4 x float> @copysign_nxv4f32_nxv4f16(<vscale x 4 x float> %a, <vscale x 4 x half> %b) {193; CHECK-LABEL: copysign_nxv4f32_nxv4f16:194; CHECK: // %bb.0:195; CHECK-NEXT: ptrue p0.s196; CHECK-NEXT: mov z2.s, #0x7fffffff197; CHECK-NEXT: fcvt z1.s, p0/m, z1.h198; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d199; CHECK-NEXT: ret200 %b.ext = fpext <vscale x 4 x half> %b to <vscale x 4 x float>201 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b.ext)202 ret <vscale x 4 x float> %r203}204 205define <vscale x 4 x float> @copysign_nxv4f32_nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {206; CHECK-LABEL: copysign_nxv4f32_nxv4f32:207; CHECK: // %bb.0:208; CHECK-NEXT: mov z2.s, #0x7fffffff209; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d210; CHECK-NEXT: ret211 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b)212 ret <vscale x 4 x float> %r213}214 215define <vscale x 4 x float> @copysign_nxv4f32_nxv4f64(<vscale x 4 x float> %a, <vscale x 4 x double> %b) {216; CHECK-LABEL: copysign_nxv4f32_nxv4f64:217; CHECK: // %bb.0:218; CHECK-NEXT: ptrue p0.d219; CHECK-NEXT: mov z3.s, #0x7fffffff220; CHECK-NEXT: fcvt z2.s, p0/m, z2.d221; CHECK-NEXT: fcvt z1.s, p0/m, z1.d222; CHECK-NEXT: uzp1 z1.s, z1.s, z2.s223; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z3.d224; CHECK-NEXT: ret225 %b.trunc = fptrunc <vscale x 4 x double> %b to <vscale x 4 x float>226 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b.trunc)227 ret <vscale x 4 x float> %r228}229 230define <vscale x 4 x float> @copysign_nxv4f32_nxv4bf16(<vscale x 4 x float> %a, <vscale x 4 x bfloat> %b) {231; CHECK-LABEL: copysign_nxv4f32_nxv4bf16:232; CHECK: // %bb.0:233; CHECK-NEXT: mov z2.s, #0x7fffffff234; CHECK-NEXT: lsl z1.s, z1.s, #16235; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d236; CHECK-NEXT: ret237 %tmp0 = fpext <vscale x 4 x bfloat> %b to <vscale x 4 x float>238 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %tmp0)239 ret <vscale x 4 x float> %r240}241 242;243; llvm.copysign.nxv2f64244;245 246define <vscale x 2 x double> @copysign_nxv2f64_nxv2f16(<vscale x 2 x double> %a, <vscale x 2 x half> %b) {247; CHECK-LABEL: copysign_nxv2f64_nxv2f16:248; CHECK: // %bb.0:249; CHECK-NEXT: ptrue p0.d250; CHECK-NEXT: mov z2.d, #0x7fffffffffffffff251; CHECK-NEXT: fcvt z1.d, p0/m, z1.h252; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d253; CHECK-NEXT: ret254 %b.ext = fpext <vscale x 2 x half> %b to <vscale x 2 x double>255 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b.ext)256 ret <vscale x 2 x double> %r257}258 259define <vscale x 2 x double> @copysign_nxv2f64_nxv2f32(<vscale x 2 x double> %a, <vscale x 2 x float> %b) {260; CHECK-LABEL: copysign_nxv2f64_nxv2f32:261; CHECK: // %bb.0:262; CHECK-NEXT: ptrue p0.d263; CHECK-NEXT: mov z2.d, #0x7fffffffffffffff264; CHECK-NEXT: fcvt z1.d, p0/m, z1.s265; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d266; CHECK-NEXT: ret267 %b.ext = fpext <vscale x 2 x float> %b to <vscale x 2 x double>268 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b.ext)269 ret <vscale x 2 x double> %r270}271 272define <vscale x 2 x double> @copysign_nxv2f64_nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {273; CHECK-LABEL: copysign_nxv2f64_nxv2f64:274; CHECK: // %bb.0:275; CHECK-NEXT: mov z2.d, #0x7fffffffffffffff276; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d277; CHECK-NEXT: ret278 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b)279 ret <vscale x 2 x double> %r280}281 282define <vscale x 2 x double> @copysign_nxv2f64_nxv2bf16(<vscale x 2 x double> %a, <vscale x 2 x bfloat> %b) {283; CHECK-LABEL: copysign_nxv2f64_nxv2bf16:284; CHECK: // %bb.0:285; CHECK-NEXT: lsl z1.s, z1.s, #16286; CHECK-NEXT: ptrue p0.d287; CHECK-NEXT: mov z2.d, #0x7fffffffffffffff288; CHECK-NEXT: fcvt z1.d, p0/m, z1.s289; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d290; CHECK-NEXT: ret291 %b.ext = fpext <vscale x 2 x bfloat> %b to <vscale x 2 x double>292 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b.ext)293 ret <vscale x 2 x double> %r294}295 296;297; llvm.copysign.nxv2bf16298;299 300define <vscale x 2 x bfloat> @copysign_nxv2bf16_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {301; CHECK-LABEL: copysign_nxv2bf16_nxv2bf16:302; CHECK: // %bb.0:303; CHECK-NEXT: mov z2.h, #32767 // =0x7fff304; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d305; CHECK-NEXT: ret306 %r = call <vscale x 2 x bfloat> @llvm.copysign.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b)307 ret <vscale x 2 x bfloat> %r308}309 310define <vscale x 2 x bfloat> @copysign_nxv2bf16_nxv2f32(<vscale x 2 x bfloat> %a, <vscale x 2 x float> %b) {311; CHECK-LABEL: copysign_nxv2bf16_nxv2f32:312; CHECK: // %bb.0:313; CHECK-NEXT: ptrue p0.d314; CHECK-NEXT: mov z2.h, #32767 // =0x7fff315; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s316; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d317; CHECK-NEXT: ret318 %tmp0 = fptrunc <vscale x 2 x float> %b to <vscale x 2 x bfloat>319 %r = call <vscale x 2 x bfloat> @llvm.copysign.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %tmp0)320 ret <vscale x 2 x bfloat> %r321}322 323define <vscale x 2 x bfloat> @copysign_nxv2bf16_nxv2f64(<vscale x 2 x bfloat> %a, <vscale x 2 x double> %b) {324; CHECK-LABEL: copysign_nxv2bf16_nxv2f64:325; CHECK: // %bb.0:326; CHECK-NEXT: ptrue p0.d327; CHECK-NEXT: mov z2.h, #32767 // =0x7fff328; CHECK-NEXT: fcvtx z1.s, p0/m, z1.d329; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s330; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d331; CHECK-NEXT: ret332 %tmp0 = fptrunc <vscale x 2 x double> %b to <vscale x 2 x bfloat>333 %r = call <vscale x 2 x bfloat> @llvm.copysign.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %tmp0)334 ret <vscale x 2 x bfloat> %r335}336 337;338; llvm.copysign.nxv2bf16339;340 341define <vscale x 4 x bfloat> @copysign_nxv4bf16_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {342; CHECK-LABEL: copysign_nxv4bf16_nxv4bf16:343; CHECK: // %bb.0:344; CHECK-NEXT: mov z2.h, #32767 // =0x7fff345; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d346; CHECK-NEXT: ret347 %r = call <vscale x 4 x bfloat> @llvm.copysign.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b)348 ret <vscale x 4 x bfloat> %r349}350 351define <vscale x 4 x bfloat> @copysign_nxv4bf16_nxv4f32(<vscale x 4 x bfloat> %a, <vscale x 4 x float> %b) {352; CHECK-LABEL: copysign_nxv4bf16_nxv4f32:353; CHECK: // %bb.0:354; CHECK-NEXT: ptrue p0.s355; CHECK-NEXT: mov z2.h, #32767 // =0x7fff356; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s357; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d358; CHECK-NEXT: ret359 %b.trunc = fptrunc <vscale x 4 x float> %b to <vscale x 4 x bfloat>360 %r = call <vscale x 4 x bfloat> @llvm.copysign.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b.trunc)361 ret <vscale x 4 x bfloat> %r362}363 364define <vscale x 4 x bfloat> @copysign_nxv4bf16_nxv4f64(<vscale x 4 x bfloat> %a, <vscale x 4 x double> %b) {365; CHECK-LABEL: copysign_nxv4bf16_nxv4f64:366; CHECK: // %bb.0:367; CHECK-NEXT: ptrue p0.d368; CHECK-NEXT: mov z3.h, #32767 // =0x7fff369; CHECK-NEXT: fcvtx z2.s, p0/m, z2.d370; CHECK-NEXT: fcvtx z1.s, p0/m, z1.d371; CHECK-NEXT: bfcvt z2.h, p0/m, z2.s372; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s373; CHECK-NEXT: uzp1 z1.s, z1.s, z2.s374; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z3.d375; CHECK-NEXT: ret376 %b.trunc = fptrunc <vscale x 4 x double> %b to <vscale x 4 x bfloat>377 %r = call <vscale x 4 x bfloat> @llvm.copysign.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b.trunc)378 ret <vscale x 4 x bfloat> %r379}380 381;382; llvm.copysign.nxv8bf16383;384 385define <vscale x 8 x bfloat> @copysign_nxv8bf16_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {386; CHECK-LABEL: copysign_nxv8bf16_nxv8bf16:387; CHECK: // %bb.0:388; CHECK-NEXT: mov z2.h, #32767 // =0x7fff389; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d390; CHECK-NEXT: ret391 %r = call <vscale x 8 x bfloat> @llvm.copysign.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b)392 ret <vscale x 8 x bfloat> %r393}394 395define <vscale x 8 x bfloat> @copysign_nxv8bf16_nxv8f32(<vscale x 8 x bfloat> %a, <vscale x 8 x float> %b) {396; CHECK-LABEL: copysign_nxv8bf16_nxv8f32:397; CHECK: // %bb.0:398; CHECK-NEXT: ptrue p0.s399; CHECK-NEXT: mov z3.h, #32767 // =0x7fff400; CHECK-NEXT: bfcvt z2.h, p0/m, z2.s401; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s402; CHECK-NEXT: uzp1 z1.h, z1.h, z2.h403; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z3.d404; CHECK-NEXT: ret405 %b.trunc = fptrunc <vscale x 8 x float> %b to <vscale x 8 x bfloat>406 %r = call <vscale x 8 x bfloat> @llvm.copysign.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b.trunc)407 ret <vscale x 8 x bfloat> %r408}409 410define <vscale x 8 x bfloat> @copysign_nxv8bf16_nxv8f64(<vscale x 8 x bfloat> %a, <vscale x 8 x double> %b) {411; CHECK-LABEL: copysign_nxv8bf16_nxv8f64:412; CHECK: // %bb.0:413; CHECK-NEXT: ptrue p0.d414; CHECK-NEXT: fcvtx z4.s, p0/m, z4.d415; CHECK-NEXT: fcvtx z3.s, p0/m, z3.d416; CHECK-NEXT: fcvtx z2.s, p0/m, z2.d417; CHECK-NEXT: fcvtx z1.s, p0/m, z1.d418; CHECK-NEXT: bfcvt z4.h, p0/m, z4.s419; CHECK-NEXT: bfcvt z3.h, p0/m, z3.s420; CHECK-NEXT: bfcvt z2.h, p0/m, z2.s421; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s422; CHECK-NEXT: uzp1 z3.s, z3.s, z4.s423; CHECK-NEXT: uzp1 z1.s, z1.s, z2.s424; CHECK-NEXT: mov z2.h, #32767 // =0x7fff425; CHECK-NEXT: uzp1 z1.h, z1.h, z3.h426; CHECK-NEXT: bsl z0.d, z0.d, z1.d, z2.d427; CHECK-NEXT: ret428 %b.trunc = fptrunc <vscale x 8 x double> %b to <vscale x 8 x bfloat>429 %r = call <vscale x 8 x bfloat> @llvm.copysign.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b.trunc)430 ret <vscale x 8 x bfloat> %r431}432 433declare <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b)434declare <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b)435declare <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b)436declare <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b)437declare <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b)438declare <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b)439declare <vscale x 2 x bfloat> @llvm.copysign.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b)440declare <vscale x 4 x bfloat> @llvm.copysign.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b)441declare <vscale x 8 x bfloat> @llvm.copysign.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b)442