brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.7 KiB · 8510f16 Raw
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