436 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve,+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: and z1.h, z1.h, #0x800014; CHECK-NEXT: and z0.h, z0.h, #0x7fff15; CHECK-NEXT: orr z0.d, z0.d, z1.d16; CHECK-NEXT: ret17 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b)18 ret <vscale x 2 x half> %r19}20 21define <vscale x 2 x half> @copysign_nxv2f16_nxv2f32(<vscale x 2 x half> %a, <vscale x 2 x float> %b) {22; CHECK-LABEL: copysign_nxv2f16_nxv2f32:23; CHECK: // %bb.0:24; CHECK-NEXT: ptrue p0.d25; CHECK-NEXT: and z0.h, z0.h, #0x7fff26; CHECK-NEXT: fcvt z1.h, p0/m, z1.s27; CHECK-NEXT: and z1.h, z1.h, #0x800028; CHECK-NEXT: orr z0.d, z0.d, z1.d29; CHECK-NEXT: ret30 %b.trunc = fptrunc <vscale x 2 x float> %b to <vscale x 2 x half>31 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b.trunc)32 ret <vscale x 2 x half> %r33}34 35define <vscale x 2 x half> @copysign_nxv2f16_nxv2f64(<vscale x 2 x half> %a, <vscale x 2 x double> %b) {36; CHECK-LABEL: copysign_nxv2f16_nxv2f64:37; CHECK: // %bb.0:38; CHECK-NEXT: ptrue p0.d39; CHECK-NEXT: and z0.h, z0.h, #0x7fff40; CHECK-NEXT: fcvt z1.h, p0/m, z1.d41; CHECK-NEXT: and z1.h, z1.h, #0x800042; CHECK-NEXT: orr z0.d, z0.d, z1.d43; CHECK-NEXT: ret44 %b.trunc = fptrunc <vscale x 2 x double> %b to <vscale x 2 x half>45 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b.trunc)46 ret <vscale x 2 x half> %r47}48 49;50; llvm.copysign.nxv4f1651;52 53define <vscale x 4 x half> @copysign_nxv4f16_nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {54; CHECK-LABEL: copysign_nxv4f16_nxv4f16:55; CHECK: // %bb.0:56; CHECK-NEXT: and z1.h, z1.h, #0x800057; CHECK-NEXT: and z0.h, z0.h, #0x7fff58; CHECK-NEXT: orr z0.d, z0.d, z1.d59; CHECK-NEXT: ret60 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b)61 ret <vscale x 4 x half> %r62}63 64define <vscale x 4 x half> @copysign_nxv4f16_nxv4f32(<vscale x 4 x half> %a, <vscale x 4 x float> %b) {65; CHECK-LABEL: copysign_nxv4f16_nxv4f32:66; CHECK: // %bb.0:67; CHECK-NEXT: ptrue p0.s68; CHECK-NEXT: and z0.h, z0.h, #0x7fff69; CHECK-NEXT: fcvt z1.h, p0/m, z1.s70; CHECK-NEXT: and z1.h, z1.h, #0x800071; CHECK-NEXT: orr z0.d, z0.d, z1.d72; CHECK-NEXT: ret73 %b.trunc = fptrunc <vscale x 4 x float> %b to <vscale x 4 x half>74 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b.trunc)75 ret <vscale x 4 x half> %r76}77 78define <vscale x 4 x half> @copysign_nxv4f16_nxv4f64(<vscale x 4 x half> %a, <vscale x 4 x double> %b) {79; CHECK-LABEL: copysign_nxv4f16_nxv4f64:80; CHECK: // %bb.0:81; CHECK-NEXT: ptrue p0.d82; CHECK-NEXT: and z0.h, z0.h, #0x7fff83; CHECK-NEXT: fcvt z2.h, p0/m, z2.d84; CHECK-NEXT: fcvt z1.h, p0/m, z1.d85; CHECK-NEXT: uzp1 z1.s, z1.s, z2.s86; CHECK-NEXT: and z1.h, z1.h, #0x800087; CHECK-NEXT: orr z0.d, z0.d, z1.d88; CHECK-NEXT: ret89 %b.trunc = fptrunc <vscale x 4 x double> %b to <vscale x 4 x half>90 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b.trunc)91 ret <vscale x 4 x half> %r92}93 94;95; llvm.copysign.nxv8f1696;97 98define <vscale x 8 x half> @copysign_nxv8f16_nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {99; CHECK-LABEL: copysign_nxv8f16_nxv8f16:100; CHECK: // %bb.0:101; CHECK-NEXT: and z1.h, z1.h, #0x8000102; CHECK-NEXT: and z0.h, z0.h, #0x7fff103; CHECK-NEXT: orr z0.d, z0.d, z1.d104; CHECK-NEXT: ret105 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b)106 ret <vscale x 8 x half> %r107}108 109define <vscale x 8 x half> @copysign_nxv8f16_nxv8f32(<vscale x 8 x half> %a, <vscale x 8 x float> %b) {110; CHECK-LABEL: copysign_nxv8f16_nxv8f32:111; CHECK: // %bb.0:112; CHECK-NEXT: ptrue p0.s113; CHECK-NEXT: and z0.h, z0.h, #0x7fff114; CHECK-NEXT: fcvt z2.h, p0/m, z2.s115; CHECK-NEXT: fcvt z1.h, p0/m, z1.s116; CHECK-NEXT: uzp1 z1.h, z1.h, z2.h117; CHECK-NEXT: and z1.h, z1.h, #0x8000118; CHECK-NEXT: orr z0.d, z0.d, z1.d119; CHECK-NEXT: ret120 %b.trunc = fptrunc <vscale x 8 x float> %b to <vscale x 8 x half>121 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b.trunc)122 ret <vscale x 8 x half> %r123}124 125define <vscale x 8 x half> @copysign_nxv8f16_nxv8f64(<vscale x 8 x half> %a, <vscale x 8 x double> %b) {126; CHECK-LABEL: copysign_nxv8f16_nxv8f64:127; CHECK: // %bb.0:128; CHECK-NEXT: ptrue p0.d129; CHECK-NEXT: and z0.h, z0.h, #0x7fff130; CHECK-NEXT: fcvt z4.h, p0/m, z4.d131; CHECK-NEXT: fcvt z3.h, p0/m, z3.d132; CHECK-NEXT: fcvt z2.h, p0/m, z2.d133; CHECK-NEXT: fcvt z1.h, p0/m, z1.d134; CHECK-NEXT: uzp1 z3.s, z3.s, z4.s135; CHECK-NEXT: uzp1 z1.s, z1.s, z2.s136; CHECK-NEXT: uzp1 z1.h, z1.h, z3.h137; CHECK-NEXT: and z1.h, z1.h, #0x8000138; CHECK-NEXT: orr z0.d, z0.d, z1.d139; CHECK-NEXT: ret140 %b.trunc = fptrunc <vscale x 8 x double> %b to <vscale x 8 x half>141 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b.trunc)142 ret <vscale x 8 x half> %r143}144 145;146; llvm.copysign.nxv2f32147;148 149define <vscale x 2 x float> @copysign_nxv2f32_nxv2f16(<vscale x 2 x float> %a, <vscale x 2 x half> %b) {150; CHECK-LABEL: copysign_nxv2f32_nxv2f16:151; CHECK: // %bb.0:152; CHECK-NEXT: ptrue p0.d153; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff154; CHECK-NEXT: fcvt z1.s, p0/m, z1.h155; CHECK-NEXT: and z1.s, z1.s, #0x80000000156; CHECK-NEXT: orr z0.d, z0.d, z1.d157; CHECK-NEXT: ret158 %b.ext = fpext <vscale x 2 x half> %b to <vscale x 2 x float>159 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b.ext)160 ret <vscale x 2 x float> %r161}162 163define <vscale x 2 x float> @copysign_nxv2f32_nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {164; CHECK-LABEL: copysign_nxv2f32_nxv2f32:165; CHECK: // %bb.0:166; CHECK-NEXT: and z1.s, z1.s, #0x80000000167; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff168; CHECK-NEXT: orr z0.d, z0.d, z1.d169; CHECK-NEXT: ret170 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b)171 ret <vscale x 2 x float> %r172}173 174define <vscale x 2 x float> @copysign_nxv2f32_nxv2f64(<vscale x 2 x float> %a, <vscale x 2 x double> %b) {175; CHECK-LABEL: copysign_nxv2f32_nxv2f64:176; CHECK: // %bb.0:177; CHECK-NEXT: ptrue p0.d178; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff179; CHECK-NEXT: fcvt z1.s, p0/m, z1.d180; CHECK-NEXT: and z1.s, z1.s, #0x80000000181; CHECK-NEXT: orr z0.d, z0.d, z1.d182; CHECK-NEXT: ret183 %b.trunc = fptrunc <vscale x 2 x double> %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> %b.trunc)185 ret <vscale x 2 x float> %r186}187 188define <vscale x 2 x float> @copysign_nxv2f32_nxv2bf16(<vscale x 2 x float> %a, <vscale x 2 x bfloat> %b) {189; CHECK-LABEL: copysign_nxv2f32_nxv2bf16:190; CHECK: // %bb.0:191; CHECK-NEXT: lsl z1.s, z1.s, #16192; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff193; CHECK-NEXT: and z1.s, z1.s, #0x80000000194; CHECK-NEXT: orr z0.d, z0.d, z1.d195; CHECK-NEXT: ret196 %tmp0 = fpext <vscale x 2 x bfloat> %b to <vscale x 2 x float>197 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %tmp0)198 ret <vscale x 2 x float> %r199}200 201;202; llvm.copysign.nxv4f32203;204 205define <vscale x 4 x float> @copysign_nxv4f32_nxv4f16(<vscale x 4 x float> %a, <vscale x 4 x half> %b) {206; CHECK-LABEL: copysign_nxv4f32_nxv4f16:207; CHECK: // %bb.0:208; CHECK-NEXT: ptrue p0.s209; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff210; CHECK-NEXT: fcvt z1.s, p0/m, z1.h211; CHECK-NEXT: and z1.s, z1.s, #0x80000000212; CHECK-NEXT: orr z0.d, z0.d, z1.d213; CHECK-NEXT: ret214 %b.ext = fpext <vscale x 4 x half> %b to <vscale x 4 x float>215 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b.ext)216 ret <vscale x 4 x float> %r217}218 219define <vscale x 4 x float> @copysign_nxv4f32_nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {220; CHECK-LABEL: copysign_nxv4f32_nxv4f32:221; CHECK: // %bb.0:222; CHECK-NEXT: and z1.s, z1.s, #0x80000000223; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff224; CHECK-NEXT: orr z0.d, z0.d, z1.d225; CHECK-NEXT: ret226 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b)227 ret <vscale x 4 x float> %r228}229 230define <vscale x 4 x float> @copysign_nxv4f32_nxv4f64(<vscale x 4 x float> %a, <vscale x 4 x double> %b) {231; CHECK-LABEL: copysign_nxv4f32_nxv4f64:232; CHECK: // %bb.0:233; CHECK-NEXT: ptrue p0.d234; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff235; CHECK-NEXT: fcvt z2.s, p0/m, z2.d236; CHECK-NEXT: fcvt z1.s, p0/m, z1.d237; CHECK-NEXT: uzp1 z1.s, z1.s, z2.s238; CHECK-NEXT: and z1.s, z1.s, #0x80000000239; CHECK-NEXT: orr z0.d, z0.d, z1.d240; CHECK-NEXT: ret241 %b.trunc = fptrunc <vscale x 4 x double> %b to <vscale x 4 x float>242 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b.trunc)243 ret <vscale x 4 x float> %r244}245 246define <vscale x 4 x float> @copysign_nxv4f32_nxv4bf16(<vscale x 4 x float> %a, <vscale x 4 x bfloat> %b) {247; CHECK-LABEL: copysign_nxv4f32_nxv4bf16:248; CHECK: // %bb.0:249; CHECK-NEXT: lsl z1.s, z1.s, #16250; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff251; CHECK-NEXT: and z1.s, z1.s, #0x80000000252; CHECK-NEXT: orr z0.d, z0.d, z1.d253; CHECK-NEXT: ret254 %tmp0 = fpext <vscale x 4 x bfloat> %b to <vscale x 4 x float>255 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %tmp0)256 ret <vscale x 4 x float> %r257}258 259;260; llvm.copysign.nxv2f64261;262 263define <vscale x 2 x double> @copysign_nxv2f64_nxv2f16(<vscale x 2 x double> %a, <vscale x 2 x half> %b) {264; CHECK-LABEL: copysign_nxv2f64_nxv2f16:265; CHECK: // %bb.0:266; CHECK-NEXT: ptrue p0.d267; CHECK-NEXT: and z0.d, z0.d, #0x7fffffffffffffff268; CHECK-NEXT: fcvt z1.d, p0/m, z1.h269; CHECK-NEXT: and z1.d, z1.d, #0x8000000000000000270; CHECK-NEXT: orr z0.d, z0.d, z1.d271; CHECK-NEXT: ret272 %b.ext = fpext <vscale x 2 x half> %b to <vscale x 2 x double>273 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b.ext)274 ret <vscale x 2 x double> %r275}276 277define <vscale x 2 x double> @copysign_nxv2f64_nxv2f32(<vscale x 2 x double> %a, <vscale x 2 x float> %b) {278; CHECK-LABEL: copysign_nxv2f64_nxv2f32:279; CHECK: // %bb.0:280; CHECK-NEXT: ptrue p0.d281; CHECK-NEXT: and z0.d, z0.d, #0x7fffffffffffffff282; CHECK-NEXT: fcvt z1.d, p0/m, z1.s283; CHECK-NEXT: and z1.d, z1.d, #0x8000000000000000284; CHECK-NEXT: orr z0.d, z0.d, z1.d285; CHECK-NEXT: ret286 %b.ext = fpext <vscale x 2 x float> %b to <vscale x 2 x double>287 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b.ext)288 ret <vscale x 2 x double> %r289}290 291define <vscale x 2 x double> @copysign_nxv2f64_nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {292; CHECK-LABEL: copysign_nxv2f64_nxv2f64:293; CHECK: // %bb.0:294; CHECK-NEXT: and z1.d, z1.d, #0x8000000000000000295; CHECK-NEXT: and z0.d, z0.d, #0x7fffffffffffffff296; CHECK-NEXT: orr z0.d, z0.d, z1.d297; CHECK-NEXT: ret298 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b)299 ret <vscale x 2 x double> %r300}301 302define <vscale x 2 x double> @copysign_nxv2f64_nxv2bf16(<vscale x 2 x double> %a, <vscale x 2 x bfloat> %b) {303; CHECK-LABEL: copysign_nxv2f64_nxv2bf16:304; CHECK: // %bb.0:305; CHECK-NEXT: lsl z1.s, z1.s, #16306; CHECK-NEXT: ptrue p0.d307; CHECK-NEXT: and z0.d, z0.d, #0x7fffffffffffffff308; CHECK-NEXT: fcvt z1.d, p0/m, z1.s309; CHECK-NEXT: and z1.d, z1.d, #0x8000000000000000310; CHECK-NEXT: orr z0.d, z0.d, z1.d311; CHECK-NEXT: ret312 %b.ext = fpext <vscale x 2 x bfloat> %b to <vscale x 2 x double>313 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b.ext)314 ret <vscale x 2 x double> %r315}316 317;318; llvm.copysign.nxv2bf16319;320 321define <vscale x 2 x bfloat> @copysign_nxv2bf16_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {322; CHECK-LABEL: copysign_nxv2bf16_nxv2bf16:323; CHECK: // %bb.0:324; CHECK-NEXT: and z1.h, z1.h, #0x8000325; CHECK-NEXT: and z0.h, z0.h, #0x7fff326; CHECK-NEXT: orr z0.d, z0.d, z1.d327; CHECK-NEXT: ret328 %r = call <vscale x 2 x bfloat> @llvm.copysign.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b)329 ret <vscale x 2 x bfloat> %r330}331 332define <vscale x 2 x bfloat> @copysign_nxv2bf16_nxv2f32(<vscale x 2 x bfloat> %a, <vscale x 2 x float> %b) {333; CHECK-LABEL: copysign_nxv2bf16_nxv2f32:334; CHECK: // %bb.0:335; CHECK-NEXT: ptrue p0.d336; CHECK-NEXT: and z0.h, z0.h, #0x7fff337; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s338; CHECK-NEXT: and z1.h, z1.h, #0x8000339; CHECK-NEXT: orr z0.d, z0.d, z1.d340; CHECK-NEXT: ret341 %tmp0 = fptrunc <vscale x 2 x float> %b to <vscale x 2 x bfloat>342 %r = call <vscale x 2 x bfloat> @llvm.copysign.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %tmp0)343 ret <vscale x 2 x bfloat> %r344}345 346; TODO: Cannot downconvert from double to bfloat347;define <vscale x 2 x bfloat> @copysign_nxv2bf16_nxv2f64(<vscale x 2 x bfloat> %a, <vscale x 2 x double> %b) {348; %tmp0 = fptrunc <vscale x 2 x double> %b to <vscale x 2 x bfloat>349; %r = call <vscale x 2 x bfloat> @llvm.copysign.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %tmp0)350; ret <vscale x 2 x bfloat> %r351;}352 353;354; llvm.copysign.nxv2bf16355;356 357define <vscale x 4 x bfloat> @copysign_nxv4bf16_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {358; CHECK-LABEL: copysign_nxv4bf16_nxv4bf16:359; CHECK: // %bb.0:360; CHECK-NEXT: and z1.h, z1.h, #0x8000361; CHECK-NEXT: and z0.h, z0.h, #0x7fff362; CHECK-NEXT: orr z0.d, z0.d, z1.d363; CHECK-NEXT: ret364 %r = call <vscale x 4 x bfloat> @llvm.copysign.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b)365 ret <vscale x 4 x bfloat> %r366}367 368define <vscale x 4 x bfloat> @copysign_nxv4bf16_nxv4f32(<vscale x 4 x bfloat> %a, <vscale x 4 x float> %b) {369; CHECK-LABEL: copysign_nxv4bf16_nxv4f32:370; CHECK: // %bb.0:371; CHECK-NEXT: ptrue p0.s372; CHECK-NEXT: and z0.h, z0.h, #0x7fff373; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s374; CHECK-NEXT: and z1.h, z1.h, #0x8000375; CHECK-NEXT: orr z0.d, z0.d, z1.d376; CHECK-NEXT: ret377 %b.trunc = fptrunc <vscale x 4 x float> %b to <vscale x 4 x bfloat>378 %r = call <vscale x 4 x bfloat> @llvm.copysign.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b.trunc)379 ret <vscale x 4 x bfloat> %r380}381 382; TODO: Cannot downconvert from double to bfloat383;define <vscale x 4 x bfloat> @copysign_nxv4bf16_nxv4f64(<vscale x 4 x bfloat> %a, <vscale x 4 x double> %b) {384; %b.trunc = fptrunc <vscale x 4 x double> %b to <vscale x 4 x bfloat>385; %r = call <vscale x 4 x bfloat> @llvm.copysign.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b.trunc)386; ret <vscale x 4 x bfloat> %r387;}388 389;390; llvm.copysign.nxv8bf16391;392 393define <vscale x 8 x bfloat> @copysign_nxv8bf16_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {394; CHECK-LABEL: copysign_nxv8bf16_nxv8bf16:395; CHECK: // %bb.0:396; CHECK-NEXT: and z1.h, z1.h, #0x8000397; CHECK-NEXT: and z0.h, z0.h, #0x7fff398; CHECK-NEXT: orr z0.d, z0.d, z1.d399; CHECK-NEXT: ret400 %r = call <vscale x 8 x bfloat> @llvm.copysign.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b)401 ret <vscale x 8 x bfloat> %r402}403 404define <vscale x 8 x bfloat> @copysign_nxv8bf16_nxv8f32(<vscale x 8 x bfloat> %a, <vscale x 8 x float> %b) {405; CHECK-LABEL: copysign_nxv8bf16_nxv8f32:406; CHECK: // %bb.0:407; CHECK-NEXT: ptrue p0.s408; CHECK-NEXT: and z0.h, z0.h, #0x7fff409; CHECK-NEXT: bfcvt z2.h, p0/m, z2.s410; CHECK-NEXT: bfcvt z1.h, p0/m, z1.s411; CHECK-NEXT: uzp1 z1.h, z1.h, z2.h412; CHECK-NEXT: and z1.h, z1.h, #0x8000413; CHECK-NEXT: orr z0.d, z0.d, z1.d414; CHECK-NEXT: ret415 %b.trunc = fptrunc <vscale x 8 x float> %b to <vscale x 8 x bfloat>416 %r = call <vscale x 8 x bfloat> @llvm.copysign.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b.trunc)417 ret <vscale x 8 x bfloat> %r418}419 420; TODO: Cannot downconvert from double to bfloat421;define <vscale x 8 x bfloat> @copysign_nxv8bf16_nxv8f64(<vscale x 8 x bfloat> %a, <vscale x 8 x double> %b) {422; %b.trunc = fptrunc <vscale x 8 x double> %b to <vscale x 8 x bfloat>423; %r = call <vscale x 8 x bfloat> @llvm.copysign.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b.trunc)424; ret <vscale x 8 x bfloat> %r425;}426 427declare <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b)428declare <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b)429declare <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b)430declare <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b)431declare <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b)432declare <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b)433declare <vscale x 2 x bfloat> @llvm.copysign.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b)434declare <vscale x 4 x bfloat> @llvm.copysign.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b)435declare <vscale x 8 x bfloat> @llvm.copysign.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b)436