1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+experimental-zvfh,+v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+experimental-zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s 6 7declare <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half>, <vscale x 1 x half>) 8 9define <vscale x 1 x half> @vfcopysign_vv_nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %vs) { 10; CHECK-LABEL: vfcopysign_vv_nxv1f16: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 13; CHECK-NEXT: vfsgnj.vv v8, v8, v9 14; CHECK-NEXT: ret 15 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %vs) 16 ret <vscale x 1 x half> %r 17} 18 19define <vscale x 1 x half> @vfcopysign_vf_nxv1f16(<vscale x 1 x half> %vm, half %s) { 20; CHECK-LABEL: vfcopysign_vf_nxv1f16: 21; CHECK: # %bb.0: 22; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 23; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 24; CHECK-NEXT: ret 25 %head = insertelement <vscale x 1 x half> poison, half %s, i32 0 26 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 27 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %splat) 28 ret <vscale x 1 x half> %r 29} 30 31define <vscale x 1 x half> @vfcopynsign_vv_nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %vs) { 32; CHECK-LABEL: vfcopynsign_vv_nxv1f16: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 35; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 36; CHECK-NEXT: ret 37 %n = fneg <vscale x 1 x half> %vs 38 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %n) 39 ret <vscale x 1 x half> %r 40} 41 42define <vscale x 1 x half> @vfcopynsign_vf_nxv1f16(<vscale x 1 x half> %vm, half %s) { 43; CHECK-LABEL: vfcopynsign_vf_nxv1f16: 44; CHECK: # %bb.0: 45; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 46; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 47; CHECK-NEXT: ret 48 %head = insertelement <vscale x 1 x half> poison, half %s, i32 0 49 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 50 %n = fneg <vscale x 1 x half> %splat 51 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %n) 52 ret <vscale x 1 x half> %r 53} 54 55define <vscale x 1 x half> @vfcopysign_exttrunc_vv_nxv1f16_nxv1f32(<vscale x 1 x half> %vm, <vscale x 1 x float> %vs) { 56; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f16_nxv1f32: 57; CHECK: # %bb.0: 58; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 59; CHECK-NEXT: vfncvt.f.f.w v10, v9 60; CHECK-NEXT: vfsgnj.vv v8, v8, v10 61; CHECK-NEXT: ret 62 %e = fptrunc <vscale x 1 x float> %vs to <vscale x 1 x half> 63 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %e) 64 ret <vscale x 1 x half> %r 65} 66 67define <vscale x 1 x half> @vfcopysign_exttrunc_vf_nxv1f16_nxv1f32(<vscale x 1 x half> %vm, float %s) { 68; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f16_nxv1f32: 69; CHECK: # %bb.0: 70; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 71; CHECK-NEXT: vfmv.v.f v9, fa0 72; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 73; CHECK-NEXT: vfncvt.f.f.w v10, v9 74; CHECK-NEXT: vfsgnj.vv v8, v8, v10 75; CHECK-NEXT: ret 76 %head = insertelement <vscale x 1 x float> poison, float %s, i32 0 77 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 78 %esplat = fptrunc <vscale x 1 x float> %splat to <vscale x 1 x half> 79 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %esplat) 80 ret <vscale x 1 x half> %r 81} 82 83define <vscale x 1 x half> @vfcopynsign_exttrunc_vv_nxv1f16_nxv1f32(<vscale x 1 x half> %vm, <vscale x 1 x float> %vs) { 84; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f16_nxv1f32: 85; CHECK: # %bb.0: 86; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 87; CHECK-NEXT: vfncvt.f.f.w v10, v9 88; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 89; CHECK-NEXT: ret 90 %n = fneg <vscale x 1 x float> %vs 91 %eneg = fptrunc <vscale x 1 x float> %n to <vscale x 1 x half> 92 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %eneg) 93 ret <vscale x 1 x half> %r 94} 95 96define <vscale x 1 x half> @vfcopynsign_exttrunc_vf_nxv1f16_nxv1f32(<vscale x 1 x half> %vm, float %s) { 97; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f16_nxv1f32: 98; CHECK: # %bb.0: 99; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 100; CHECK-NEXT: vfmv.v.f v9, fa0 101; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 102; CHECK-NEXT: vfncvt.f.f.w v10, v9 103; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 104; CHECK-NEXT: ret 105 %head = insertelement <vscale x 1 x float> poison, float %s, i32 0 106 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 107 %n = fneg <vscale x 1 x float> %splat 108 %eneg = fptrunc <vscale x 1 x float> %n to <vscale x 1 x half> 109 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %eneg) 110 ret <vscale x 1 x half> %r 111} 112 113define <vscale x 1 x half> @vfcopysign_exttrunc_vv_nxv1f16_nxv1f64(<vscale x 1 x half> %vm, <vscale x 1 x double> %vs) { 114; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f16_nxv1f64: 115; CHECK: # %bb.0: 116; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 117; CHECK-NEXT: vfncvt.rod.f.f.w v10, v9 118; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 119; CHECK-NEXT: vfncvt.f.f.w v9, v10 120; CHECK-NEXT: vfsgnj.vv v8, v8, v9 121; CHECK-NEXT: ret 122 %e = fptrunc <vscale x 1 x double> %vs to <vscale x 1 x half> 123 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %e) 124 ret <vscale x 1 x half> %r 125} 126 127define <vscale x 1 x half> @vfcopysign_exttrunc_vf_nxv1f16_nxv1f64(<vscale x 1 x half> %vm, double %s) { 128; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f16_nxv1f64: 129; CHECK: # %bb.0: 130; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 131; CHECK-NEXT: vfmv.v.f v9, fa0 132; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 133; CHECK-NEXT: vfncvt.rod.f.f.w v10, v9 134; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 135; CHECK-NEXT: vfncvt.f.f.w v9, v10 136; CHECK-NEXT: vfsgnj.vv v8, v8, v9 137; CHECK-NEXT: ret 138 %head = insertelement <vscale x 1 x double> poison, double %s, i32 0 139 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 140 %esplat = fptrunc <vscale x 1 x double> %splat to <vscale x 1 x half> 141 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %esplat) 142 ret <vscale x 1 x half> %r 143} 144 145define <vscale x 1 x half> @vfcopynsign_exttrunc_vv_nxv1f16_nxv1f64(<vscale x 1 x half> %vm, <vscale x 1 x double> %vs) { 146; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f16_nxv1f64: 147; CHECK: # %bb.0: 148; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 149; CHECK-NEXT: vfncvt.rod.f.f.w v10, v9 150; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 151; CHECK-NEXT: vfncvt.f.f.w v9, v10 152; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 153; CHECK-NEXT: ret 154 %n = fneg <vscale x 1 x double> %vs 155 %eneg = fptrunc <vscale x 1 x double> %n to <vscale x 1 x half> 156 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %eneg) 157 ret <vscale x 1 x half> %r 158} 159 160define <vscale x 1 x half> @vfcopynsign_exttrunc_vf_nxv1f16_nxv1f64(<vscale x 1 x half> %vm, double %s) { 161; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f16_nxv1f64: 162; CHECK: # %bb.0: 163; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 164; CHECK-NEXT: vfmv.v.f v9, fa0 165; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 166; CHECK-NEXT: vfncvt.rod.f.f.w v10, v9 167; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 168; CHECK-NEXT: vfncvt.f.f.w v9, v10 169; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 170; CHECK-NEXT: ret 171 %head = insertelement <vscale x 1 x double> poison, double %s, i32 0 172 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 173 %n = fneg <vscale x 1 x double> %splat 174 %eneg = fptrunc <vscale x 1 x double> %n to <vscale x 1 x half> 175 %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %eneg) 176 ret <vscale x 1 x half> %r 177} 178 179declare <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half>, <vscale x 2 x half>) 180 181define <vscale x 2 x half> @vfcopysign_vv_nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %vs) { 182; CHECK-LABEL: vfcopysign_vv_nxv2f16: 183; CHECK: # %bb.0: 184; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 185; CHECK-NEXT: vfsgnj.vv v8, v8, v9 186; CHECK-NEXT: ret 187 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %vs) 188 ret <vscale x 2 x half> %r 189} 190 191define <vscale x 2 x half> @vfcopysign_vf_nxv2f16(<vscale x 2 x half> %vm, half %s) { 192; CHECK-LABEL: vfcopysign_vf_nxv2f16: 193; CHECK: # %bb.0: 194; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 195; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 196; CHECK-NEXT: ret 197 %head = insertelement <vscale x 2 x half> poison, half %s, i32 0 198 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 199 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %splat) 200 ret <vscale x 2 x half> %r 201} 202 203define <vscale x 2 x half> @vfcopynsign_vv_nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %vs) { 204; CHECK-LABEL: vfcopynsign_vv_nxv2f16: 205; CHECK: # %bb.0: 206; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 207; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 208; CHECK-NEXT: ret 209 %n = fneg <vscale x 2 x half> %vs 210 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %n) 211 ret <vscale x 2 x half> %r 212} 213 214define <vscale x 2 x half> @vfcopynsign_vf_nxv2f16(<vscale x 2 x half> %vm, half %s) { 215; CHECK-LABEL: vfcopynsign_vf_nxv2f16: 216; CHECK: # %bb.0: 217; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 218; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 219; CHECK-NEXT: ret 220 %head = insertelement <vscale x 2 x half> poison, half %s, i32 0 221 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 222 %n = fneg <vscale x 2 x half> %splat 223 %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %n) 224 ret <vscale x 2 x half> %r 225} 226 227declare <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>) 228 229define <vscale x 4 x half> @vfcopysign_vv_nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %vs) { 230; CHECK-LABEL: vfcopysign_vv_nxv4f16: 231; CHECK: # %bb.0: 232; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 233; CHECK-NEXT: vfsgnj.vv v8, v8, v9 234; CHECK-NEXT: ret 235 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %vs) 236 ret <vscale x 4 x half> %r 237} 238 239define <vscale x 4 x half> @vfcopysign_vf_nxv4f16(<vscale x 4 x half> %vm, half %s) { 240; CHECK-LABEL: vfcopysign_vf_nxv4f16: 241; CHECK: # %bb.0: 242; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 243; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 244; CHECK-NEXT: ret 245 %head = insertelement <vscale x 4 x half> poison, half %s, i32 0 246 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 247 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %splat) 248 ret <vscale x 4 x half> %r 249} 250 251define <vscale x 4 x half> @vfcopynsign_vv_nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %vs) { 252; CHECK-LABEL: vfcopynsign_vv_nxv4f16: 253; CHECK: # %bb.0: 254; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 255; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 256; CHECK-NEXT: ret 257 %n = fneg <vscale x 4 x half> %vs 258 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %n) 259 ret <vscale x 4 x half> %r 260} 261 262define <vscale x 4 x half> @vfcopynsign_vf_nxv4f16(<vscale x 4 x half> %vm, half %s) { 263; CHECK-LABEL: vfcopynsign_vf_nxv4f16: 264; CHECK: # %bb.0: 265; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 266; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 267; CHECK-NEXT: ret 268 %head = insertelement <vscale x 4 x half> poison, half %s, i32 0 269 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 270 %n = fneg <vscale x 4 x half> %splat 271 %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %n) 272 ret <vscale x 4 x half> %r 273} 274 275declare <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>) 276 277define <vscale x 8 x half> @vfcopysign_vv_nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %vs) { 278; CHECK-LABEL: vfcopysign_vv_nxv8f16: 279; CHECK: # %bb.0: 280; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 281; CHECK-NEXT: vfsgnj.vv v8, v8, v10 282; CHECK-NEXT: ret 283 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %vs) 284 ret <vscale x 8 x half> %r 285} 286 287define <vscale x 8 x half> @vfcopysign_vf_nxv8f16(<vscale x 8 x half> %vm, half %s) { 288; CHECK-LABEL: vfcopysign_vf_nxv8f16: 289; CHECK: # %bb.0: 290; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 291; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 292; CHECK-NEXT: ret 293 %head = insertelement <vscale x 8 x half> poison, half %s, i32 0 294 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 295 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %splat) 296 ret <vscale x 8 x half> %r 297} 298 299define <vscale x 8 x half> @vfcopynsign_vv_nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %vs) { 300; CHECK-LABEL: vfcopynsign_vv_nxv8f16: 301; CHECK: # %bb.0: 302; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 303; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 304; CHECK-NEXT: ret 305 %n = fneg <vscale x 8 x half> %vs 306 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %n) 307 ret <vscale x 8 x half> %r 308} 309 310define <vscale x 8 x half> @vfcopynsign_vf_nxv8f16(<vscale x 8 x half> %vm, half %s) { 311; CHECK-LABEL: vfcopynsign_vf_nxv8f16: 312; CHECK: # %bb.0: 313; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 314; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 315; CHECK-NEXT: ret 316 %head = insertelement <vscale x 8 x half> poison, half %s, i32 0 317 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 318 %n = fneg <vscale x 8 x half> %splat 319 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %n) 320 ret <vscale x 8 x half> %r 321} 322 323define <vscale x 8 x half> @vfcopysign_exttrunc_vv_nxv8f16_nxv8f32(<vscale x 8 x half> %vm, <vscale x 8 x float> %vs) { 324; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f16_nxv8f32: 325; CHECK: # %bb.0: 326; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 327; CHECK-NEXT: vfncvt.f.f.w v10, v12 328; CHECK-NEXT: vfsgnj.vv v8, v8, v10 329; CHECK-NEXT: ret 330 %e = fptrunc <vscale x 8 x float> %vs to <vscale x 8 x half> 331 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %e) 332 ret <vscale x 8 x half> %r 333} 334 335define <vscale x 8 x half> @vfcopysign_exttrunc_vf_nxv8f16_nxv8f32(<vscale x 8 x half> %vm, float %s) { 336; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f16_nxv8f32: 337; CHECK: # %bb.0: 338; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 339; CHECK-NEXT: vfmv.v.f v12, fa0 340; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 341; CHECK-NEXT: vfncvt.f.f.w v10, v12 342; CHECK-NEXT: vfsgnj.vv v8, v8, v10 343; CHECK-NEXT: ret 344 %head = insertelement <vscale x 8 x float> poison, float %s, i32 0 345 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 346 %esplat = fptrunc <vscale x 8 x float> %splat to <vscale x 8 x half> 347 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %esplat) 348 ret <vscale x 8 x half> %r 349} 350 351define <vscale x 8 x half> @vfcopynsign_exttrunc_vv_nxv8f16_nxv8f32(<vscale x 8 x half> %vm, <vscale x 8 x float> %vs) { 352; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f16_nxv8f32: 353; CHECK: # %bb.0: 354; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 355; CHECK-NEXT: vfncvt.f.f.w v10, v12 356; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 357; CHECK-NEXT: ret 358 %n = fneg <vscale x 8 x float> %vs 359 %eneg = fptrunc <vscale x 8 x float> %n to <vscale x 8 x half> 360 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %eneg) 361 ret <vscale x 8 x half> %r 362} 363 364define <vscale x 8 x half> @vfcopynsign_exttrunc_vf_nxv8f16_nxv8f32(<vscale x 8 x half> %vm, float %s) { 365; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f16_nxv8f32: 366; CHECK: # %bb.0: 367; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 368; CHECK-NEXT: vfmv.v.f v12, fa0 369; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 370; CHECK-NEXT: vfncvt.f.f.w v10, v12 371; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 372; CHECK-NEXT: ret 373 %head = insertelement <vscale x 8 x float> poison, float %s, i32 0 374 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 375 %n = fneg <vscale x 8 x float> %splat 376 %eneg = fptrunc <vscale x 8 x float> %n to <vscale x 8 x half> 377 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %eneg) 378 ret <vscale x 8 x half> %r 379} 380 381define <vscale x 8 x half> @vfcopysign_exttrunc_vv_nxv8f16_nxv8f64(<vscale x 8 x half> %vm, <vscale x 8 x double> %vs) { 382; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f16_nxv8f64: 383; CHECK: # %bb.0: 384; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 385; CHECK-NEXT: vfncvt.rod.f.f.w v12, v16 386; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 387; CHECK-NEXT: vfncvt.f.f.w v10, v12 388; CHECK-NEXT: vfsgnj.vv v8, v8, v10 389; CHECK-NEXT: ret 390 %e = fptrunc <vscale x 8 x double> %vs to <vscale x 8 x half> 391 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %e) 392 ret <vscale x 8 x half> %r 393} 394 395define <vscale x 8 x half> @vfcopysign_exttrunc_vf_nxv8f16_nxv8f64(<vscale x 8 x half> %vm, double %s) { 396; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f16_nxv8f64: 397; CHECK: # %bb.0: 398; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 399; CHECK-NEXT: vfmv.v.f v16, fa0 400; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 401; CHECK-NEXT: vfncvt.rod.f.f.w v12, v16 402; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 403; CHECK-NEXT: vfncvt.f.f.w v10, v12 404; CHECK-NEXT: vfsgnj.vv v8, v8, v10 405; CHECK-NEXT: ret 406 %head = insertelement <vscale x 8 x double> poison, double %s, i32 0 407 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 408 %esplat = fptrunc <vscale x 8 x double> %splat to <vscale x 8 x half> 409 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %esplat) 410 ret <vscale x 8 x half> %r 411} 412 413define <vscale x 8 x half> @vfcopynsign_exttrunc_vv_nxv8f16_nxv8f64(<vscale x 8 x half> %vm, <vscale x 8 x double> %vs) { 414; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f16_nxv8f64: 415; CHECK: # %bb.0: 416; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 417; CHECK-NEXT: vfncvt.rod.f.f.w v12, v16 418; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 419; CHECK-NEXT: vfncvt.f.f.w v10, v12 420; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 421; CHECK-NEXT: ret 422 %n = fneg <vscale x 8 x double> %vs 423 %eneg = fptrunc <vscale x 8 x double> %n to <vscale x 8 x half> 424 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %eneg) 425 ret <vscale x 8 x half> %r 426} 427 428define <vscale x 8 x half> @vfcopynsign_exttrunc_vf_nxv8f16_nxv8f64(<vscale x 8 x half> %vm, double %s) { 429; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f16_nxv8f64: 430; CHECK: # %bb.0: 431; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 432; CHECK-NEXT: vfmv.v.f v16, fa0 433; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 434; CHECK-NEXT: vfncvt.rod.f.f.w v12, v16 435; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 436; CHECK-NEXT: vfncvt.f.f.w v10, v12 437; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 438; CHECK-NEXT: ret 439 %head = insertelement <vscale x 8 x double> poison, double %s, i32 0 440 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 441 %n = fneg <vscale x 8 x double> %splat 442 %eneg = fptrunc <vscale x 8 x double> %n to <vscale x 8 x half> 443 %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %eneg) 444 ret <vscale x 8 x half> %r 445} 446 447declare <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half>, <vscale x 16 x half>) 448 449define <vscale x 16 x half> @vfcopysign_vv_nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %vs) { 450; CHECK-LABEL: vfcopysign_vv_nxv16f16: 451; CHECK: # %bb.0: 452; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 453; CHECK-NEXT: vfsgnj.vv v8, v8, v12 454; CHECK-NEXT: ret 455 %r = call <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %vs) 456 ret <vscale x 16 x half> %r 457} 458 459define <vscale x 16 x half> @vfcopysign_vf_nxv16f16(<vscale x 16 x half> %vm, half %s) { 460; CHECK-LABEL: vfcopysign_vf_nxv16f16: 461; CHECK: # %bb.0: 462; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 463; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 464; CHECK-NEXT: ret 465 %head = insertelement <vscale x 16 x half> poison, half %s, i32 0 466 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 467 %r = call <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %splat) 468 ret <vscale x 16 x half> %r 469} 470 471define <vscale x 16 x half> @vfcopynsign_vv_nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %vs) { 472; CHECK-LABEL: vfcopynsign_vv_nxv16f16: 473; CHECK: # %bb.0: 474; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 475; CHECK-NEXT: vfsgnjn.vv v8, v8, v12 476; CHECK-NEXT: ret 477 %n = fneg <vscale x 16 x half> %vs 478 %r = call <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %n) 479 ret <vscale x 16 x half> %r 480} 481 482define <vscale x 16 x half> @vfcopynsign_vf_nxv16f16(<vscale x 16 x half> %vm, half %s) { 483; CHECK-LABEL: vfcopynsign_vf_nxv16f16: 484; CHECK: # %bb.0: 485; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 486; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 487; CHECK-NEXT: ret 488 %head = insertelement <vscale x 16 x half> poison, half %s, i32 0 489 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 490 %n = fneg <vscale x 16 x half> %splat 491 %r = call <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %n) 492 ret <vscale x 16 x half> %r 493} 494 495declare <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half>, <vscale x 32 x half>) 496 497define <vscale x 32 x half> @vfcopysign_vv_nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %vs) { 498; CHECK-LABEL: vfcopysign_vv_nxv32f16: 499; CHECK: # %bb.0: 500; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, mu 501; CHECK-NEXT: vfsgnj.vv v8, v8, v16 502; CHECK-NEXT: ret 503 %r = call <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %vs) 504 ret <vscale x 32 x half> %r 505} 506 507define <vscale x 32 x half> @vfcopysign_vf_nxv32f16(<vscale x 32 x half> %vm, half %s) { 508; CHECK-LABEL: vfcopysign_vf_nxv32f16: 509; CHECK: # %bb.0: 510; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, mu 511; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 512; CHECK-NEXT: ret 513 %head = insertelement <vscale x 32 x half> poison, half %s, i32 0 514 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer 515 %r = call <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %splat) 516 ret <vscale x 32 x half> %r 517} 518 519define <vscale x 32 x half> @vfcopynsign_vv_nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %vs) { 520; CHECK-LABEL: vfcopynsign_vv_nxv32f16: 521; CHECK: # %bb.0: 522; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, mu 523; CHECK-NEXT: vfsgnjn.vv v8, v8, v16 524; CHECK-NEXT: ret 525 %n = fneg <vscale x 32 x half> %vs 526 %r = call <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %n) 527 ret <vscale x 32 x half> %r 528} 529 530define <vscale x 32 x half> @vfcopynsign_vf_nxv32f16(<vscale x 32 x half> %vm, half %s) { 531; CHECK-LABEL: vfcopynsign_vf_nxv32f16: 532; CHECK: # %bb.0: 533; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, mu 534; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 535; CHECK-NEXT: ret 536 %head = insertelement <vscale x 32 x half> poison, half %s, i32 0 537 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer 538 %n = fneg <vscale x 32 x half> %splat 539 %r = call <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %n) 540 ret <vscale x 32 x half> %r 541} 542 543declare <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>) 544 545define <vscale x 1 x float> @vfcopysign_vv_nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %vs) { 546; CHECK-LABEL: vfcopysign_vv_nxv1f32: 547; CHECK: # %bb.0: 548; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 549; CHECK-NEXT: vfsgnj.vv v8, v8, v9 550; CHECK-NEXT: ret 551 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %vs) 552 ret <vscale x 1 x float> %r 553} 554 555define <vscale x 1 x float> @vfcopysign_vf_nxv1f32(<vscale x 1 x float> %vm, float %s) { 556; CHECK-LABEL: vfcopysign_vf_nxv1f32: 557; CHECK: # %bb.0: 558; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 559; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 560; CHECK-NEXT: ret 561 %head = insertelement <vscale x 1 x float> poison, float %s, i32 0 562 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 563 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %splat) 564 ret <vscale x 1 x float> %r 565} 566 567define <vscale x 1 x float> @vfcopynsign_vv_nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %vs) { 568; CHECK-LABEL: vfcopynsign_vv_nxv1f32: 569; CHECK: # %bb.0: 570; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 571; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 572; CHECK-NEXT: ret 573 %n = fneg <vscale x 1 x float> %vs 574 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %n) 575 ret <vscale x 1 x float> %r 576} 577 578define <vscale x 1 x float> @vfcopynsign_vf_nxv1f32(<vscale x 1 x float> %vm, float %s) { 579; CHECK-LABEL: vfcopynsign_vf_nxv1f32: 580; CHECK: # %bb.0: 581; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 582; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 583; CHECK-NEXT: ret 584 %head = insertelement <vscale x 1 x float> poison, float %s, i32 0 585 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 586 %n = fneg <vscale x 1 x float> %splat 587 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %n) 588 ret <vscale x 1 x float> %r 589} 590 591define <vscale x 1 x float> @vfcopysign_exttrunc_vv_nxv1f32_nxv1f16(<vscale x 1 x float> %vm, <vscale x 1 x half> %vs) { 592; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f32_nxv1f16: 593; CHECK: # %bb.0: 594; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 595; CHECK-NEXT: vfwcvt.f.f.v v10, v9 596; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 597; CHECK-NEXT: vfsgnj.vv v8, v8, v10 598; CHECK-NEXT: ret 599 %e = fpext <vscale x 1 x half> %vs to <vscale x 1 x float> 600 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %e) 601 ret <vscale x 1 x float> %r 602} 603 604define <vscale x 1 x float> @vfcopysign_exttrunc_vf_nxv1f32_nxv1f16(<vscale x 1 x float> %vm, half %s) { 605; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f32_nxv1f16: 606; CHECK: # %bb.0: 607; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 608; CHECK-NEXT: vfmv.v.f v9, fa0 609; CHECK-NEXT: vfwcvt.f.f.v v10, v9 610; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 611; CHECK-NEXT: vfsgnj.vv v8, v8, v10 612; CHECK-NEXT: ret 613 %head = insertelement <vscale x 1 x half> poison, half %s, i32 0 614 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 615 %esplat = fpext <vscale x 1 x half> %splat to <vscale x 1 x float> 616 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %esplat) 617 ret <vscale x 1 x float> %r 618} 619 620define <vscale x 1 x float> @vfcopynsign_exttrunc_vv_nxv1f32_nxv1f16(<vscale x 1 x float> %vm, <vscale x 1 x half> %vs) { 621; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f32_nxv1f16: 622; CHECK: # %bb.0: 623; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 624; CHECK-NEXT: vfwcvt.f.f.v v10, v9 625; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 626; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 627; CHECK-NEXT: ret 628 %n = fneg <vscale x 1 x half> %vs 629 %eneg = fpext <vscale x 1 x half> %n to <vscale x 1 x float> 630 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %eneg) 631 ret <vscale x 1 x float> %r 632} 633 634define <vscale x 1 x float> @vfcopynsign_exttrunc_vf_nxv1f32_nxv1f16(<vscale x 1 x float> %vm, half %s) { 635; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f32_nxv1f16: 636; CHECK: # %bb.0: 637; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 638; CHECK-NEXT: vfmv.v.f v9, fa0 639; CHECK-NEXT: vfwcvt.f.f.v v10, v9 640; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 641; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 642; CHECK-NEXT: ret 643 %head = insertelement <vscale x 1 x half> poison, half %s, i32 0 644 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 645 %n = fneg <vscale x 1 x half> %splat 646 %eneg = fpext <vscale x 1 x half> %n to <vscale x 1 x float> 647 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %eneg) 648 ret <vscale x 1 x float> %r 649} 650 651define <vscale x 1 x float> @vfcopysign_exttrunc_vv_nxv1f32_nxv1f64(<vscale x 1 x float> %vm, <vscale x 1 x double> %vs) { 652; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f32_nxv1f64: 653; CHECK: # %bb.0: 654; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 655; CHECK-NEXT: vfncvt.f.f.w v10, v9 656; CHECK-NEXT: vfsgnj.vv v8, v8, v10 657; CHECK-NEXT: ret 658 %e = fptrunc <vscale x 1 x double> %vs to <vscale x 1 x float> 659 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %e) 660 ret <vscale x 1 x float> %r 661} 662 663define <vscale x 1 x float> @vfcopysign_exttrunc_vf_nxv1f32_nxv1f64(<vscale x 1 x float> %vm, double %s) { 664; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f32_nxv1f64: 665; CHECK: # %bb.0: 666; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 667; CHECK-NEXT: vfmv.v.f v9, fa0 668; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 669; CHECK-NEXT: vfncvt.f.f.w v10, v9 670; CHECK-NEXT: vfsgnj.vv v8, v8, v10 671; CHECK-NEXT: ret 672 %head = insertelement <vscale x 1 x double> poison, double %s, i32 0 673 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 674 %esplat = fptrunc <vscale x 1 x double> %splat to <vscale x 1 x float> 675 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %esplat) 676 ret <vscale x 1 x float> %r 677} 678 679define <vscale x 1 x float> @vfcopynsign_exttrunc_vv_nxv1f32_nxv1f64(<vscale x 1 x float> %vm, <vscale x 1 x double> %vs) { 680; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f32_nxv1f64: 681; CHECK: # %bb.0: 682; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 683; CHECK-NEXT: vfncvt.f.f.w v10, v9 684; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 685; CHECK-NEXT: ret 686 %n = fneg <vscale x 1 x double> %vs 687 %eneg = fptrunc <vscale x 1 x double> %n to <vscale x 1 x float> 688 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %eneg) 689 ret <vscale x 1 x float> %r 690} 691 692define <vscale x 1 x float> @vfcopynsign_exttrunc_vf_nxv1f32_nxv1f64(<vscale x 1 x float> %vm, double %s) { 693; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f32_nxv1f64: 694; CHECK: # %bb.0: 695; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 696; CHECK-NEXT: vfmv.v.f v9, fa0 697; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 698; CHECK-NEXT: vfncvt.f.f.w v10, v9 699; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 700; CHECK-NEXT: ret 701 %head = insertelement <vscale x 1 x double> poison, double %s, i32 0 702 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 703 %n = fneg <vscale x 1 x double> %splat 704 %eneg = fptrunc <vscale x 1 x double> %n to <vscale x 1 x float> 705 %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %eneg) 706 ret <vscale x 1 x float> %r 707} 708 709declare <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>) 710 711define <vscale x 2 x float> @vfcopysign_vv_nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %vs) { 712; CHECK-LABEL: vfcopysign_vv_nxv2f32: 713; CHECK: # %bb.0: 714; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 715; CHECK-NEXT: vfsgnj.vv v8, v8, v9 716; CHECK-NEXT: ret 717 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %vs) 718 ret <vscale x 2 x float> %r 719} 720 721define <vscale x 2 x float> @vfcopysign_vf_nxv2f32(<vscale x 2 x float> %vm, float %s) { 722; CHECK-LABEL: vfcopysign_vf_nxv2f32: 723; CHECK: # %bb.0: 724; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 725; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 726; CHECK-NEXT: ret 727 %head = insertelement <vscale x 2 x float> poison, float %s, i32 0 728 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 729 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %splat) 730 ret <vscale x 2 x float> %r 731} 732 733define <vscale x 2 x float> @vfcopynsign_vv_nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %vs) { 734; CHECK-LABEL: vfcopynsign_vv_nxv2f32: 735; CHECK: # %bb.0: 736; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 737; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 738; CHECK-NEXT: ret 739 %n = fneg <vscale x 2 x float> %vs 740 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %n) 741 ret <vscale x 2 x float> %r 742} 743 744define <vscale x 2 x float> @vfcopynsign_vf_nxv2f32(<vscale x 2 x float> %vm, float %s) { 745; CHECK-LABEL: vfcopynsign_vf_nxv2f32: 746; CHECK: # %bb.0: 747; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 748; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 749; CHECK-NEXT: ret 750 %head = insertelement <vscale x 2 x float> poison, float %s, i32 0 751 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 752 %n = fneg <vscale x 2 x float> %splat 753 %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %n) 754 ret <vscale x 2 x float> %r 755} 756 757declare <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>) 758 759define <vscale x 4 x float> @vfcopysign_vv_nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %vs) { 760; CHECK-LABEL: vfcopysign_vv_nxv4f32: 761; CHECK: # %bb.0: 762; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 763; CHECK-NEXT: vfsgnj.vv v8, v8, v10 764; CHECK-NEXT: ret 765 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %vs) 766 ret <vscale x 4 x float> %r 767} 768 769define <vscale x 4 x float> @vfcopysign_vf_nxv4f32(<vscale x 4 x float> %vm, float %s) { 770; CHECK-LABEL: vfcopysign_vf_nxv4f32: 771; CHECK: # %bb.0: 772; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 773; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 774; CHECK-NEXT: ret 775 %head = insertelement <vscale x 4 x float> poison, float %s, i32 0 776 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 777 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %splat) 778 ret <vscale x 4 x float> %r 779} 780 781define <vscale x 4 x float> @vfcopynsign_vv_nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %vs) { 782; CHECK-LABEL: vfcopynsign_vv_nxv4f32: 783; CHECK: # %bb.0: 784; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 785; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 786; CHECK-NEXT: ret 787 %n = fneg <vscale x 4 x float> %vs 788 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %n) 789 ret <vscale x 4 x float> %r 790} 791 792define <vscale x 4 x float> @vfcopynsign_vf_nxv4f32(<vscale x 4 x float> %vm, float %s) { 793; CHECK-LABEL: vfcopynsign_vf_nxv4f32: 794; CHECK: # %bb.0: 795; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 796; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 797; CHECK-NEXT: ret 798 %head = insertelement <vscale x 4 x float> poison, float %s, i32 0 799 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 800 %n = fneg <vscale x 4 x float> %splat 801 %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %n) 802 ret <vscale x 4 x float> %r 803} 804 805declare <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>) 806 807define <vscale x 8 x float> @vfcopysign_vv_nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %vs) { 808; CHECK-LABEL: vfcopysign_vv_nxv8f32: 809; CHECK: # %bb.0: 810; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 811; CHECK-NEXT: vfsgnj.vv v8, v8, v12 812; CHECK-NEXT: ret 813 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %vs) 814 ret <vscale x 8 x float> %r 815} 816 817define <vscale x 8 x float> @vfcopysign_vf_nxv8f32(<vscale x 8 x float> %vm, float %s) { 818; CHECK-LABEL: vfcopysign_vf_nxv8f32: 819; CHECK: # %bb.0: 820; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 821; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 822; CHECK-NEXT: ret 823 %head = insertelement <vscale x 8 x float> poison, float %s, i32 0 824 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 825 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %splat) 826 ret <vscale x 8 x float> %r 827} 828 829define <vscale x 8 x float> @vfcopynsign_vv_nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %vs) { 830; CHECK-LABEL: vfcopynsign_vv_nxv8f32: 831; CHECK: # %bb.0: 832; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 833; CHECK-NEXT: vfsgnjn.vv v8, v8, v12 834; CHECK-NEXT: ret 835 %n = fneg <vscale x 8 x float> %vs 836 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %n) 837 ret <vscale x 8 x float> %r 838} 839 840define <vscale x 8 x float> @vfcopynsign_vf_nxv8f32(<vscale x 8 x float> %vm, float %s) { 841; CHECK-LABEL: vfcopynsign_vf_nxv8f32: 842; CHECK: # %bb.0: 843; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 844; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 845; CHECK-NEXT: ret 846 %head = insertelement <vscale x 8 x float> poison, float %s, i32 0 847 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 848 %n = fneg <vscale x 8 x float> %splat 849 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %n) 850 ret <vscale x 8 x float> %r 851} 852 853define <vscale x 8 x float> @vfcopysign_exttrunc_vv_nxv8f32_nxv8f16(<vscale x 8 x float> %vm, <vscale x 8 x half> %vs) { 854; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f32_nxv8f16: 855; CHECK: # %bb.0: 856; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 857; CHECK-NEXT: vfwcvt.f.f.v v16, v12 858; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 859; CHECK-NEXT: vfsgnj.vv v8, v8, v16 860; CHECK-NEXT: ret 861 %e = fpext <vscale x 8 x half> %vs to <vscale x 8 x float> 862 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %e) 863 ret <vscale x 8 x float> %r 864} 865 866define <vscale x 8 x float> @vfcopysign_exttrunc_vf_nxv8f32_nxv8f16(<vscale x 8 x float> %vm, half %s) { 867; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f32_nxv8f16: 868; CHECK: # %bb.0: 869; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 870; CHECK-NEXT: vfmv.v.f v12, fa0 871; CHECK-NEXT: vfwcvt.f.f.v v16, v12 872; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 873; CHECK-NEXT: vfsgnj.vv v8, v8, v16 874; CHECK-NEXT: ret 875 %head = insertelement <vscale x 8 x half> poison, half %s, i32 0 876 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 877 %esplat = fpext <vscale x 8 x half> %splat to <vscale x 8 x float> 878 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %esplat) 879 ret <vscale x 8 x float> %r 880} 881 882define <vscale x 8 x float> @vfcopynsign_exttrunc_vv_nxv8f32_nxv8f16(<vscale x 8 x float> %vm, <vscale x 8 x half> %vs) { 883; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f32_nxv8f16: 884; CHECK: # %bb.0: 885; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 886; CHECK-NEXT: vfwcvt.f.f.v v16, v12 887; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 888; CHECK-NEXT: vfsgnjn.vv v8, v8, v16 889; CHECK-NEXT: ret 890 %n = fneg <vscale x 8 x half> %vs 891 %eneg = fpext <vscale x 8 x half> %n to <vscale x 8 x float> 892 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %eneg) 893 ret <vscale x 8 x float> %r 894} 895 896define <vscale x 8 x float> @vfcopynsign_exttrunc_vf_nxv8f32_nxv8f16(<vscale x 8 x float> %vm, half %s) { 897; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f32_nxv8f16: 898; CHECK: # %bb.0: 899; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 900; CHECK-NEXT: vfmv.v.f v12, fa0 901; CHECK-NEXT: vfwcvt.f.f.v v16, v12 902; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 903; CHECK-NEXT: vfsgnjn.vv v8, v8, v16 904; CHECK-NEXT: ret 905 %head = insertelement <vscale x 8 x half> poison, half %s, i32 0 906 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 907 %n = fneg <vscale x 8 x half> %splat 908 %eneg = fpext <vscale x 8 x half> %n to <vscale x 8 x float> 909 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %eneg) 910 ret <vscale x 8 x float> %r 911} 912 913define <vscale x 8 x float> @vfcopysign_exttrunc_vv_nxv8f32_nxv8f64(<vscale x 8 x float> %vm, <vscale x 8 x double> %vs) { 914; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f32_nxv8f64: 915; CHECK: # %bb.0: 916; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 917; CHECK-NEXT: vfncvt.f.f.w v12, v16 918; CHECK-NEXT: vfsgnj.vv v8, v8, v12 919; CHECK-NEXT: ret 920 %e = fptrunc <vscale x 8 x double> %vs to <vscale x 8 x float> 921 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %e) 922 ret <vscale x 8 x float> %r 923} 924 925define <vscale x 8 x float> @vfcopysign_exttrunc_vf_nxv8f32_nxv8f64(<vscale x 8 x float> %vm, double %s) { 926; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f32_nxv8f64: 927; CHECK: # %bb.0: 928; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 929; CHECK-NEXT: vfmv.v.f v16, fa0 930; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 931; CHECK-NEXT: vfncvt.f.f.w v12, v16 932; CHECK-NEXT: vfsgnj.vv v8, v8, v12 933; CHECK-NEXT: ret 934 %head = insertelement <vscale x 8 x double> poison, double %s, i32 0 935 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 936 %esplat = fptrunc <vscale x 8 x double> %splat to <vscale x 8 x float> 937 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %esplat) 938 ret <vscale x 8 x float> %r 939} 940 941define <vscale x 8 x float> @vfcopynsign_exttrunc_vv_nxv8f32_nxv8f64(<vscale x 8 x float> %vm, <vscale x 8 x double> %vs) { 942; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f32_nxv8f64: 943; CHECK: # %bb.0: 944; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 945; CHECK-NEXT: vfncvt.f.f.w v12, v16 946; CHECK-NEXT: vfsgnjn.vv v8, v8, v12 947; CHECK-NEXT: ret 948 %n = fneg <vscale x 8 x double> %vs 949 %eneg = fptrunc <vscale x 8 x double> %n to <vscale x 8 x float> 950 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %eneg) 951 ret <vscale x 8 x float> %r 952} 953 954define <vscale x 8 x float> @vfcopynsign_exttrunc_vf_nxv8f32_nxv8f64(<vscale x 8 x float> %vm, double %s) { 955; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f32_nxv8f64: 956; CHECK: # %bb.0: 957; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 958; CHECK-NEXT: vfmv.v.f v16, fa0 959; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 960; CHECK-NEXT: vfncvt.f.f.w v12, v16 961; CHECK-NEXT: vfsgnjn.vv v8, v8, v12 962; CHECK-NEXT: ret 963 %head = insertelement <vscale x 8 x double> poison, double %s, i32 0 964 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 965 %n = fneg <vscale x 8 x double> %splat 966 %eneg = fptrunc <vscale x 8 x double> %n to <vscale x 8 x float> 967 %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %eneg) 968 ret <vscale x 8 x float> %r 969} 970 971declare <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>) 972 973define <vscale x 16 x float> @vfcopysign_vv_nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %vs) { 974; CHECK-LABEL: vfcopysign_vv_nxv16f32: 975; CHECK: # %bb.0: 976; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 977; CHECK-NEXT: vfsgnj.vv v8, v8, v16 978; CHECK-NEXT: ret 979 %r = call <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %vs) 980 ret <vscale x 16 x float> %r 981} 982 983define <vscale x 16 x float> @vfcopysign_vf_nxv16f32(<vscale x 16 x float> %vm, float %s) { 984; CHECK-LABEL: vfcopysign_vf_nxv16f32: 985; CHECK: # %bb.0: 986; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 987; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 988; CHECK-NEXT: ret 989 %head = insertelement <vscale x 16 x float> poison, float %s, i32 0 990 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer 991 %r = call <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %splat) 992 ret <vscale x 16 x float> %r 993} 994 995define <vscale x 16 x float> @vfcopynsign_vv_nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %vs) { 996; CHECK-LABEL: vfcopynsign_vv_nxv16f32: 997; CHECK: # %bb.0: 998; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 999; CHECK-NEXT: vfsgnjn.vv v8, v8, v16 1000; CHECK-NEXT: ret 1001 %n = fneg <vscale x 16 x float> %vs 1002 %r = call <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %n) 1003 ret <vscale x 16 x float> %r 1004} 1005 1006define <vscale x 16 x float> @vfcopynsign_vf_nxv16f32(<vscale x 16 x float> %vm, float %s) { 1007; CHECK-LABEL: vfcopynsign_vf_nxv16f32: 1008; CHECK: # %bb.0: 1009; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 1010; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 1011; CHECK-NEXT: ret 1012 %head = insertelement <vscale x 16 x float> poison, float %s, i32 0 1013 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer 1014 %n = fneg <vscale x 16 x float> %splat 1015 %r = call <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %n) 1016 ret <vscale x 16 x float> %r 1017} 1018 1019declare <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>) 1020 1021define <vscale x 1 x double> @vfcopysign_vv_nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %vs) { 1022; CHECK-LABEL: vfcopysign_vv_nxv1f64: 1023; CHECK: # %bb.0: 1024; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 1025; CHECK-NEXT: vfsgnj.vv v8, v8, v9 1026; CHECK-NEXT: ret 1027 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %vs) 1028 ret <vscale x 1 x double> %r 1029} 1030 1031define <vscale x 1 x double> @vfcopysign_vf_nxv1f64(<vscale x 1 x double> %vm, double %s) { 1032; CHECK-LABEL: vfcopysign_vf_nxv1f64: 1033; CHECK: # %bb.0: 1034; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 1035; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 1036; CHECK-NEXT: ret 1037 %head = insertelement <vscale x 1 x double> poison, double %s, i32 0 1038 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 1039 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %splat) 1040 ret <vscale x 1 x double> %r 1041} 1042 1043define <vscale x 1 x double> @vfcopynsign_vv_nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %vs) { 1044; CHECK-LABEL: vfcopynsign_vv_nxv1f64: 1045; CHECK: # %bb.0: 1046; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 1047; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 1048; CHECK-NEXT: ret 1049 %n = fneg <vscale x 1 x double> %vs 1050 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %n) 1051 ret <vscale x 1 x double> %r 1052} 1053 1054define <vscale x 1 x double> @vfcopynsign_vf_nxv1f64(<vscale x 1 x double> %vm, double %s) { 1055; CHECK-LABEL: vfcopynsign_vf_nxv1f64: 1056; CHECK: # %bb.0: 1057; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 1058; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 1059; CHECK-NEXT: ret 1060 %head = insertelement <vscale x 1 x double> poison, double %s, i32 0 1061 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 1062 %n = fneg <vscale x 1 x double> %splat 1063 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %n) 1064 ret <vscale x 1 x double> %r 1065} 1066 1067define <vscale x 1 x double> @vfcopysign_exttrunc_vv_nxv1f64_nxv1f16(<vscale x 1 x double> %vm, <vscale x 1 x half> %vs) { 1068; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f64_nxv1f16: 1069; CHECK: # %bb.0: 1070; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 1071; CHECK-NEXT: vfwcvt.f.f.v v10, v9 1072; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 1073; CHECK-NEXT: vfwcvt.f.f.v v9, v10 1074; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1075; CHECK-NEXT: vfsgnj.vv v8, v8, v9 1076; CHECK-NEXT: ret 1077 %e = fpext <vscale x 1 x half> %vs to <vscale x 1 x double> 1078 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %e) 1079 ret <vscale x 1 x double> %r 1080} 1081 1082define <vscale x 1 x double> @vfcopysign_exttrunc_vf_nxv1f64_nxv1f16(<vscale x 1 x double> %vm, half %s) { 1083; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f64_nxv1f16: 1084; CHECK: # %bb.0: 1085; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 1086; CHECK-NEXT: vfmv.v.f v9, fa0 1087; CHECK-NEXT: vfwcvt.f.f.v v10, v9 1088; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 1089; CHECK-NEXT: vfwcvt.f.f.v v9, v10 1090; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1091; CHECK-NEXT: vfsgnj.vv v8, v8, v9 1092; CHECK-NEXT: ret 1093 %head = insertelement <vscale x 1 x half> poison, half %s, i32 0 1094 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 1095 %esplat = fpext <vscale x 1 x half> %splat to <vscale x 1 x double> 1096 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %esplat) 1097 ret <vscale x 1 x double> %r 1098} 1099 1100define <vscale x 1 x double> @vfcopynsign_exttrunc_vv_nxv1f64_nxv1f16(<vscale x 1 x double> %vm, <vscale x 1 x half> %vs) { 1101; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f64_nxv1f16: 1102; CHECK: # %bb.0: 1103; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 1104; CHECK-NEXT: vfwcvt.f.f.v v10, v9 1105; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 1106; CHECK-NEXT: vfwcvt.f.f.v v9, v10 1107; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1108; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 1109; CHECK-NEXT: ret 1110 %n = fneg <vscale x 1 x half> %vs 1111 %eneg = fpext <vscale x 1 x half> %n to <vscale x 1 x double> 1112 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %eneg) 1113 ret <vscale x 1 x double> %r 1114} 1115 1116define <vscale x 1 x double> @vfcopynsign_exttrunc_vf_nxv1f64_nxv1f16(<vscale x 1 x double> %vm, half %s) { 1117; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f64_nxv1f16: 1118; CHECK: # %bb.0: 1119; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 1120; CHECK-NEXT: vfmv.v.f v9, fa0 1121; CHECK-NEXT: vfwcvt.f.f.v v10, v9 1122; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 1123; CHECK-NEXT: vfwcvt.f.f.v v9, v10 1124; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1125; CHECK-NEXT: vfsgnjn.vv v8, v8, v9 1126; CHECK-NEXT: ret 1127 %head = insertelement <vscale x 1 x half> poison, half %s, i32 0 1128 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 1129 %n = fneg <vscale x 1 x half> %splat 1130 %eneg = fpext <vscale x 1 x half> %n to <vscale x 1 x double> 1131 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %eneg) 1132 ret <vscale x 1 x double> %r 1133} 1134 1135define <vscale x 1 x double> @vfcopysign_exttrunc_vv_nxv1f64_nxv1f32(<vscale x 1 x double> %vm, <vscale x 1 x float> %vs) { 1136; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f64_nxv1f32: 1137; CHECK: # %bb.0: 1138; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 1139; CHECK-NEXT: vfwcvt.f.f.v v10, v9 1140; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1141; CHECK-NEXT: vfsgnj.vv v8, v8, v10 1142; CHECK-NEXT: ret 1143 %e = fpext <vscale x 1 x float> %vs to <vscale x 1 x double> 1144 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %e) 1145 ret <vscale x 1 x double> %r 1146} 1147 1148define <vscale x 1 x double> @vfcopysign_exttrunc_vf_nxv1f64_nxv1f32(<vscale x 1 x double> %vm, float %s) { 1149; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f64_nxv1f32: 1150; CHECK: # %bb.0: 1151; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 1152; CHECK-NEXT: vfmv.v.f v9, fa0 1153; CHECK-NEXT: vfwcvt.f.f.v v10, v9 1154; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1155; CHECK-NEXT: vfsgnj.vv v8, v8, v10 1156; CHECK-NEXT: ret 1157 %head = insertelement <vscale x 1 x float> poison, float %s, i32 0 1158 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1159 %esplat = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 1160 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %esplat) 1161 ret <vscale x 1 x double> %r 1162} 1163 1164define <vscale x 1 x double> @vfcopynsign_exttrunc_vv_nxv1f64_nxv1f32(<vscale x 1 x double> %vm, <vscale x 1 x float> %vs) { 1165; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f64_nxv1f32: 1166; CHECK: # %bb.0: 1167; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 1168; CHECK-NEXT: vfwcvt.f.f.v v10, v9 1169; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1170; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 1171; CHECK-NEXT: ret 1172 %n = fneg <vscale x 1 x float> %vs 1173 %eneg = fpext <vscale x 1 x float> %n to <vscale x 1 x double> 1174 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %eneg) 1175 ret <vscale x 1 x double> %r 1176} 1177 1178define <vscale x 1 x double> @vfcopynsign_exttrunc_vf_nxv1f64_nxv1f32(<vscale x 1 x double> %vm, float %s) { 1179; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f64_nxv1f32: 1180; CHECK: # %bb.0: 1181; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 1182; CHECK-NEXT: vfmv.v.f v9, fa0 1183; CHECK-NEXT: vfwcvt.f.f.v v10, v9 1184; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1185; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 1186; CHECK-NEXT: ret 1187 %head = insertelement <vscale x 1 x float> poison, float %s, i32 0 1188 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1189 %n = fneg <vscale x 1 x float> %splat 1190 %eneg = fpext <vscale x 1 x float> %n to <vscale x 1 x double> 1191 %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %eneg) 1192 ret <vscale x 1 x double> %r 1193} 1194 1195declare <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>) 1196 1197define <vscale x 2 x double> @vfcopysign_vv_nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %vs) { 1198; CHECK-LABEL: vfcopysign_vv_nxv2f64: 1199; CHECK: # %bb.0: 1200; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, mu 1201; CHECK-NEXT: vfsgnj.vv v8, v8, v10 1202; CHECK-NEXT: ret 1203 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %vs) 1204 ret <vscale x 2 x double> %r 1205} 1206 1207define <vscale x 2 x double> @vfcopysign_vf_nxv2f64(<vscale x 2 x double> %vm, double %s) { 1208; CHECK-LABEL: vfcopysign_vf_nxv2f64: 1209; CHECK: # %bb.0: 1210; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, mu 1211; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 1212; CHECK-NEXT: ret 1213 %head = insertelement <vscale x 2 x double> poison, double %s, i32 0 1214 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer 1215 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %splat) 1216 ret <vscale x 2 x double> %r 1217} 1218 1219define <vscale x 2 x double> @vfcopynsign_vv_nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %vs) { 1220; CHECK-LABEL: vfcopynsign_vv_nxv2f64: 1221; CHECK: # %bb.0: 1222; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, mu 1223; CHECK-NEXT: vfsgnjn.vv v8, v8, v10 1224; CHECK-NEXT: ret 1225 %n = fneg <vscale x 2 x double> %vs 1226 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %n) 1227 ret <vscale x 2 x double> %r 1228} 1229 1230define <vscale x 2 x double> @vfcopynsign_vf_nxv2f64(<vscale x 2 x double> %vm, double %s) { 1231; CHECK-LABEL: vfcopynsign_vf_nxv2f64: 1232; CHECK: # %bb.0: 1233; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, mu 1234; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 1235; CHECK-NEXT: ret 1236 %head = insertelement <vscale x 2 x double> poison, double %s, i32 0 1237 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer 1238 %n = fneg <vscale x 2 x double> %splat 1239 %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %n) 1240 ret <vscale x 2 x double> %r 1241} 1242 1243declare <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>) 1244 1245define <vscale x 4 x double> @vfcopysign_vv_nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %vs) { 1246; CHECK-LABEL: vfcopysign_vv_nxv4f64: 1247; CHECK: # %bb.0: 1248; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 1249; CHECK-NEXT: vfsgnj.vv v8, v8, v12 1250; CHECK-NEXT: ret 1251 %r = call <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %vs) 1252 ret <vscale x 4 x double> %r 1253} 1254 1255define <vscale x 4 x double> @vfcopysign_vf_nxv4f64(<vscale x 4 x double> %vm, double %s) { 1256; CHECK-LABEL: vfcopysign_vf_nxv4f64: 1257; CHECK: # %bb.0: 1258; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 1259; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 1260; CHECK-NEXT: ret 1261 %head = insertelement <vscale x 4 x double> poison, double %s, i32 0 1262 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer 1263 %r = call <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %splat) 1264 ret <vscale x 4 x double> %r 1265} 1266 1267define <vscale x 4 x double> @vfcopynsign_vv_nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %vs) { 1268; CHECK-LABEL: vfcopynsign_vv_nxv4f64: 1269; CHECK: # %bb.0: 1270; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 1271; CHECK-NEXT: vfsgnjn.vv v8, v8, v12 1272; CHECK-NEXT: ret 1273 %n = fneg <vscale x 4 x double> %vs 1274 %r = call <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %n) 1275 ret <vscale x 4 x double> %r 1276} 1277 1278define <vscale x 4 x double> @vfcopynsign_vf_nxv4f64(<vscale x 4 x double> %vm, double %s) { 1279; CHECK-LABEL: vfcopynsign_vf_nxv4f64: 1280; CHECK: # %bb.0: 1281; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 1282; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 1283; CHECK-NEXT: ret 1284 %head = insertelement <vscale x 4 x double> poison, double %s, i32 0 1285 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer 1286 %n = fneg <vscale x 4 x double> %splat 1287 %r = call <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %n) 1288 ret <vscale x 4 x double> %r 1289} 1290 1291declare <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>) 1292 1293define <vscale x 8 x double> @vfcopysign_vv_nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %vs) { 1294; CHECK-LABEL: vfcopysign_vv_nxv8f64: 1295; CHECK: # %bb.0: 1296; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 1297; CHECK-NEXT: vfsgnj.vv v8, v8, v16 1298; CHECK-NEXT: ret 1299 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %vs) 1300 ret <vscale x 8 x double> %r 1301} 1302 1303define <vscale x 8 x double> @vfcopysign_vf_nxv8f64(<vscale x 8 x double> %vm, double %s) { 1304; CHECK-LABEL: vfcopysign_vf_nxv8f64: 1305; CHECK: # %bb.0: 1306; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 1307; CHECK-NEXT: vfsgnj.vf v8, v8, fa0 1308; CHECK-NEXT: ret 1309 %head = insertelement <vscale x 8 x double> poison, double %s, i32 0 1310 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 1311 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %splat) 1312 ret <vscale x 8 x double> %r 1313} 1314 1315define <vscale x 8 x double> @vfcopynsign_vv_nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %vs) { 1316; CHECK-LABEL: vfcopynsign_vv_nxv8f64: 1317; CHECK: # %bb.0: 1318; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 1319; CHECK-NEXT: vfsgnjn.vv v8, v8, v16 1320; CHECK-NEXT: ret 1321 %n = fneg <vscale x 8 x double> %vs 1322 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %n) 1323 ret <vscale x 8 x double> %r 1324} 1325 1326define <vscale x 8 x double> @vfcopynsign_vf_nxv8f64(<vscale x 8 x double> %vm, double %s) { 1327; CHECK-LABEL: vfcopynsign_vf_nxv8f64: 1328; CHECK: # %bb.0: 1329; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 1330; CHECK-NEXT: vfsgnjn.vf v8, v8, fa0 1331; CHECK-NEXT: ret 1332 %head = insertelement <vscale x 8 x double> poison, double %s, i32 0 1333 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 1334 %n = fneg <vscale x 8 x double> %splat 1335 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %n) 1336 ret <vscale x 8 x double> %r 1337} 1338 1339define <vscale x 8 x double> @vfcopysign_exttrunc_vv_nxv8f64_nxv8f16(<vscale x 8 x double> %vm, <vscale x 8 x half> %vs) { 1340; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f64_nxv8f16: 1341; CHECK: # %bb.0: 1342; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 1343; CHECK-NEXT: vfwcvt.f.f.v v20, v16 1344; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 1345; CHECK-NEXT: vfwcvt.f.f.v v24, v20 1346; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1347; CHECK-NEXT: vfsgnj.vv v8, v8, v24 1348; CHECK-NEXT: ret 1349 %e = fpext <vscale x 8 x half> %vs to <vscale x 8 x double> 1350 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %e) 1351 ret <vscale x 8 x double> %r 1352} 1353 1354define <vscale x 8 x double> @vfcopysign_exttrunc_vf_nxv8f64_nxv8f16(<vscale x 8 x double> %vm, half %s) { 1355; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f64_nxv8f16: 1356; CHECK: # %bb.0: 1357; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 1358; CHECK-NEXT: vfmv.v.f v16, fa0 1359; CHECK-NEXT: vfwcvt.f.f.v v20, v16 1360; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 1361; CHECK-NEXT: vfwcvt.f.f.v v24, v20 1362; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1363; CHECK-NEXT: vfsgnj.vv v8, v8, v24 1364; CHECK-NEXT: ret 1365 %head = insertelement <vscale x 8 x half> poison, half %s, i32 0 1366 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 1367 %esplat = fpext <vscale x 8 x half> %splat to <vscale x 8 x double> 1368 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %esplat) 1369 ret <vscale x 8 x double> %r 1370} 1371 1372define <vscale x 8 x double> @vfcopynsign_exttrunc_vv_nxv8f64_nxv8f16(<vscale x 8 x double> %vm, <vscale x 8 x half> %vs) { 1373; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f64_nxv8f16: 1374; CHECK: # %bb.0: 1375; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 1376; CHECK-NEXT: vfwcvt.f.f.v v20, v16 1377; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 1378; CHECK-NEXT: vfwcvt.f.f.v v24, v20 1379; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1380; CHECK-NEXT: vfsgnjn.vv v8, v8, v24 1381; CHECK-NEXT: ret 1382 %n = fneg <vscale x 8 x half> %vs 1383 %eneg = fpext <vscale x 8 x half> %n to <vscale x 8 x double> 1384 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %eneg) 1385 ret <vscale x 8 x double> %r 1386} 1387 1388define <vscale x 8 x double> @vfcopynsign_exttrunc_vf_nxv8f64_nxv8f16(<vscale x 8 x double> %vm, half %s) { 1389; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f64_nxv8f16: 1390; CHECK: # %bb.0: 1391; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 1392; CHECK-NEXT: vfmv.v.f v16, fa0 1393; CHECK-NEXT: vfwcvt.f.f.v v20, v16 1394; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 1395; CHECK-NEXT: vfwcvt.f.f.v v24, v20 1396; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1397; CHECK-NEXT: vfsgnjn.vv v8, v8, v24 1398; CHECK-NEXT: ret 1399 %head = insertelement <vscale x 8 x half> poison, half %s, i32 0 1400 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 1401 %n = fneg <vscale x 8 x half> %splat 1402 %eneg = fpext <vscale x 8 x half> %n to <vscale x 8 x double> 1403 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %eneg) 1404 ret <vscale x 8 x double> %r 1405} 1406 1407define <vscale x 8 x double> @vfcopysign_exttrunc_vv_nxv8f64_nxv8f32(<vscale x 8 x double> %vm, <vscale x 8 x float> %vs) { 1408; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f64_nxv8f32: 1409; CHECK: # %bb.0: 1410; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1411; CHECK-NEXT: vfwcvt.f.f.v v24, v16 1412; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1413; CHECK-NEXT: vfsgnj.vv v8, v8, v24 1414; CHECK-NEXT: ret 1415 %e = fpext <vscale x 8 x float> %vs to <vscale x 8 x double> 1416 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %e) 1417 ret <vscale x 8 x double> %r 1418} 1419 1420define <vscale x 8 x double> @vfcopysign_exttrunc_vf_nxv8f64_nxv8f32(<vscale x 8 x double> %vm, float %s) { 1421; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f64_nxv8f32: 1422; CHECK: # %bb.0: 1423; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1424; CHECK-NEXT: vfmv.v.f v16, fa0 1425; CHECK-NEXT: vfwcvt.f.f.v v24, v16 1426; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1427; CHECK-NEXT: vfsgnj.vv v8, v8, v24 1428; CHECK-NEXT: ret 1429 %head = insertelement <vscale x 8 x float> poison, float %s, i32 0 1430 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1431 %esplat = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 1432 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %esplat) 1433 ret <vscale x 8 x double> %r 1434} 1435 1436define <vscale x 8 x double> @vfcopynsign_exttrunc_vv_nxv8f64_nxv8f32(<vscale x 8 x double> %vm, <vscale x 8 x float> %vs) { 1437; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f64_nxv8f32: 1438; CHECK: # %bb.0: 1439; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1440; CHECK-NEXT: vfwcvt.f.f.v v24, v16 1441; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1442; CHECK-NEXT: vfsgnjn.vv v8, v8, v24 1443; CHECK-NEXT: ret 1444 %n = fneg <vscale x 8 x float> %vs 1445 %eneg = fpext <vscale x 8 x float> %n to <vscale x 8 x double> 1446 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %eneg) 1447 ret <vscale x 8 x double> %r 1448} 1449 1450define <vscale x 8 x double> @vfcopynsign_exttrunc_vf_nxv8f64_nxv8f32(<vscale x 8 x double> %vm, float %s) { 1451; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f64_nxv8f32: 1452; CHECK: # %bb.0: 1453; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1454; CHECK-NEXT: vfmv.v.f v16, fa0 1455; CHECK-NEXT: vfwcvt.f.f.v v24, v16 1456; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1457; CHECK-NEXT: vfsgnjn.vv v8, v8, v24 1458; CHECK-NEXT: ret 1459 %head = insertelement <vscale x 8 x float> poison, float %s, i32 0 1460 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1461 %n = fneg <vscale x 8 x float> %splat 1462 %eneg = fpext <vscale x 8 x float> %n to <vscale x 8 x double> 1463 %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %eneg) 1464 ret <vscale x 8 x double> %r 1465} 1466