318 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \3; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \4; RUN: --check-prefixes=CHECK,ZVFH5; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \6; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \7; RUN: --check-prefixes=CHECK,ZVFH8; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \9; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \10; RUN: --check-prefixes=CHECK,ZVFHMIN11; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \12; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \13; RUN: --check-prefixes=CHECK,ZVFHMIN14 15define <vscale x 1 x bfloat> @vfsqrt_nxv1bf16(<vscale x 1 x bfloat> %v) {16; CHECK-LABEL: vfsqrt_nxv1bf16:17; CHECK: # %bb.0:18; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma19; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v820; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma21; CHECK-NEXT: vfsqrt.v v9, v922; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma23; CHECK-NEXT: vfncvtbf16.f.f.w v8, v924; CHECK-NEXT: ret25 %r = call <vscale x 1 x bfloat> @llvm.sqrt.nxv1bf16(<vscale x 1 x bfloat> %v)26 ret <vscale x 1 x bfloat> %r27}28 29define <vscale x 2 x bfloat> @vfsqrt_nxv2bf16(<vscale x 2 x bfloat> %v) {30; CHECK-LABEL: vfsqrt_nxv2bf16:31; CHECK: # %bb.0:32; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma33; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v834; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma35; CHECK-NEXT: vfsqrt.v v9, v936; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma37; CHECK-NEXT: vfncvtbf16.f.f.w v8, v938; CHECK-NEXT: ret39 %r = call <vscale x 2 x bfloat> @llvm.sqrt.nxv2bf16(<vscale x 2 x bfloat> %v)40 ret <vscale x 2 x bfloat> %r41}42 43define <vscale x 4 x bfloat> @vfsqrt_nxv4bf16(<vscale x 4 x bfloat> %v) {44; CHECK-LABEL: vfsqrt_nxv4bf16:45; CHECK: # %bb.0:46; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma47; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v848; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma49; CHECK-NEXT: vfsqrt.v v10, v1050; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma51; CHECK-NEXT: vfncvtbf16.f.f.w v8, v1052; CHECK-NEXT: ret53 %r = call <vscale x 4 x bfloat> @llvm.sqrt.nxv4bf16(<vscale x 4 x bfloat> %v)54 ret <vscale x 4 x bfloat> %r55}56 57define <vscale x 8 x bfloat> @vfsqrt_nxv8bf16(<vscale x 8 x bfloat> %v) {58; CHECK-LABEL: vfsqrt_nxv8bf16:59; CHECK: # %bb.0:60; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma61; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v862; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma63; CHECK-NEXT: vfsqrt.v v12, v1264; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma65; CHECK-NEXT: vfncvtbf16.f.f.w v8, v1266; CHECK-NEXT: ret67 %r = call <vscale x 8 x bfloat> @llvm.sqrt.nxv8bf16(<vscale x 8 x bfloat> %v)68 ret <vscale x 8 x bfloat> %r69}70 71define <vscale x 16 x bfloat> @vfsqrt_nxv16bf16(<vscale x 16 x bfloat> %v) {72; CHECK-LABEL: vfsqrt_nxv16bf16:73; CHECK: # %bb.0:74; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma75; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v876; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma77; CHECK-NEXT: vfsqrt.v v16, v1678; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma79; CHECK-NEXT: vfncvtbf16.f.f.w v8, v1680; CHECK-NEXT: ret81 %r = call <vscale x 16 x bfloat> @llvm.sqrt.nxv16bf16(<vscale x 16 x bfloat> %v)82 ret <vscale x 16 x bfloat> %r83}84 85define <vscale x 32 x bfloat> @vfsqrt_nxv32bf16(<vscale x 32 x bfloat> %v) {86; CHECK-LABEL: vfsqrt_nxv32bf16:87; CHECK: # %bb.0:88; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma89; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v890; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma91; CHECK-NEXT: vfsqrt.v v16, v1692; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma93; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v1294; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma95; CHECK-NEXT: vfsqrt.v v24, v2496; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma97; CHECK-NEXT: vfncvtbf16.f.f.w v8, v1698; CHECK-NEXT: vfncvtbf16.f.f.w v12, v2499; CHECK-NEXT: ret100 %r = call <vscale x 32 x bfloat> @llvm.sqrt.nxv32bf16(<vscale x 32 x bfloat> %v)101 ret <vscale x 32 x bfloat> %r102}103 104define <vscale x 1 x half> @vfsqrt_nxv1f16(<vscale x 1 x half> %v) {105; ZVFH-LABEL: vfsqrt_nxv1f16:106; ZVFH: # %bb.0:107; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma108; ZVFH-NEXT: vfsqrt.v v8, v8109; ZVFH-NEXT: ret110;111; ZVFHMIN-LABEL: vfsqrt_nxv1f16:112; ZVFHMIN: # %bb.0:113; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma114; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8115; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma116; ZVFHMIN-NEXT: vfsqrt.v v9, v9117; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma118; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9119; ZVFHMIN-NEXT: ret120 %r = call <vscale x 1 x half> @llvm.sqrt.nxv1f16(<vscale x 1 x half> %v)121 ret <vscale x 1 x half> %r122}123 124define <vscale x 2 x half> @vfsqrt_nxv2f16(<vscale x 2 x half> %v) {125; ZVFH-LABEL: vfsqrt_nxv2f16:126; ZVFH: # %bb.0:127; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma128; ZVFH-NEXT: vfsqrt.v v8, v8129; ZVFH-NEXT: ret130;131; ZVFHMIN-LABEL: vfsqrt_nxv2f16:132; ZVFHMIN: # %bb.0:133; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma134; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8135; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma136; ZVFHMIN-NEXT: vfsqrt.v v9, v9137; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma138; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9139; ZVFHMIN-NEXT: ret140 %r = call <vscale x 2 x half> @llvm.sqrt.nxv2f16(<vscale x 2 x half> %v)141 ret <vscale x 2 x half> %r142}143 144define <vscale x 4 x half> @vfsqrt_nxv4f16(<vscale x 4 x half> %v) {145; ZVFH-LABEL: vfsqrt_nxv4f16:146; ZVFH: # %bb.0:147; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma148; ZVFH-NEXT: vfsqrt.v v8, v8149; ZVFH-NEXT: ret150;151; ZVFHMIN-LABEL: vfsqrt_nxv4f16:152; ZVFHMIN: # %bb.0:153; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma154; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8155; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma156; ZVFHMIN-NEXT: vfsqrt.v v10, v10157; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma158; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10159; ZVFHMIN-NEXT: ret160 %r = call <vscale x 4 x half> @llvm.sqrt.nxv4f16(<vscale x 4 x half> %v)161 ret <vscale x 4 x half> %r162}163 164define <vscale x 8 x half> @vfsqrt_nxv8f16(<vscale x 8 x half> %v) {165; ZVFH-LABEL: vfsqrt_nxv8f16:166; ZVFH: # %bb.0:167; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma168; ZVFH-NEXT: vfsqrt.v v8, v8169; ZVFH-NEXT: ret170;171; ZVFHMIN-LABEL: vfsqrt_nxv8f16:172; ZVFHMIN: # %bb.0:173; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma174; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8175; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma176; ZVFHMIN-NEXT: vfsqrt.v v12, v12177; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma178; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12179; ZVFHMIN-NEXT: ret180 %r = call <vscale x 8 x half> @llvm.sqrt.nxv8f16(<vscale x 8 x half> %v)181 ret <vscale x 8 x half> %r182}183 184define <vscale x 16 x half> @vfsqrt_nxv16f16(<vscale x 16 x half> %v) {185; ZVFH-LABEL: vfsqrt_nxv16f16:186; ZVFH: # %bb.0:187; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma188; ZVFH-NEXT: vfsqrt.v v8, v8189; ZVFH-NEXT: ret190;191; ZVFHMIN-LABEL: vfsqrt_nxv16f16:192; ZVFHMIN: # %bb.0:193; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma194; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8195; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma196; ZVFHMIN-NEXT: vfsqrt.v v16, v16197; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma198; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16199; ZVFHMIN-NEXT: ret200 %r = call <vscale x 16 x half> @llvm.sqrt.nxv16f16(<vscale x 16 x half> %v)201 ret <vscale x 16 x half> %r202}203 204define <vscale x 32 x half> @vfsqrt_nxv32f16(<vscale x 32 x half> %v) {205; ZVFH-LABEL: vfsqrt_nxv32f16:206; ZVFH: # %bb.0:207; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma208; ZVFH-NEXT: vfsqrt.v v8, v8209; ZVFH-NEXT: ret210;211; ZVFHMIN-LABEL: vfsqrt_nxv32f16:212; ZVFHMIN: # %bb.0:213; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma214; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8215; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma216; ZVFHMIN-NEXT: vfsqrt.v v16, v16217; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma218; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12219; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma220; ZVFHMIN-NEXT: vfsqrt.v v24, v24221; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma222; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16223; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v24224; ZVFHMIN-NEXT: ret225 %r = call <vscale x 32 x half> @llvm.sqrt.nxv32f16(<vscale x 32 x half> %v)226 ret <vscale x 32 x half> %r227}228 229define <vscale x 1 x float> @vfsqrt_nxv1f32(<vscale x 1 x float> %v) {230; CHECK-LABEL: vfsqrt_nxv1f32:231; CHECK: # %bb.0:232; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma233; CHECK-NEXT: vfsqrt.v v8, v8234; CHECK-NEXT: ret235 %r = call <vscale x 1 x float> @llvm.sqrt.nxv1f32(<vscale x 1 x float> %v)236 ret <vscale x 1 x float> %r237}238 239define <vscale x 2 x float> @vfsqrt_nxv2f32(<vscale x 2 x float> %v) {240; CHECK-LABEL: vfsqrt_nxv2f32:241; CHECK: # %bb.0:242; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma243; CHECK-NEXT: vfsqrt.v v8, v8244; CHECK-NEXT: ret245 %r = call <vscale x 2 x float> @llvm.sqrt.nxv2f32(<vscale x 2 x float> %v)246 ret <vscale x 2 x float> %r247}248 249define <vscale x 4 x float> @vfsqrt_nxv4f32(<vscale x 4 x float> %v) {250; CHECK-LABEL: vfsqrt_nxv4f32:251; CHECK: # %bb.0:252; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma253; CHECK-NEXT: vfsqrt.v v8, v8254; CHECK-NEXT: ret255 %r = call <vscale x 4 x float> @llvm.sqrt.nxv4f32(<vscale x 4 x float> %v)256 ret <vscale x 4 x float> %r257}258 259define <vscale x 8 x float> @vfsqrt_nxv8f32(<vscale x 8 x float> %v) {260; CHECK-LABEL: vfsqrt_nxv8f32:261; CHECK: # %bb.0:262; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma263; CHECK-NEXT: vfsqrt.v v8, v8264; CHECK-NEXT: ret265 %r = call <vscale x 8 x float> @llvm.sqrt.nxv8f32(<vscale x 8 x float> %v)266 ret <vscale x 8 x float> %r267}268 269define <vscale x 16 x float> @vfsqrt_nxv16f32(<vscale x 16 x float> %v) {270; CHECK-LABEL: vfsqrt_nxv16f32:271; CHECK: # %bb.0:272; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma273; CHECK-NEXT: vfsqrt.v v8, v8274; CHECK-NEXT: ret275 %r = call <vscale x 16 x float> @llvm.sqrt.nxv16f32(<vscale x 16 x float> %v)276 ret <vscale x 16 x float> %r277}278 279define <vscale x 1 x double> @vfsqrt_nxv1f64(<vscale x 1 x double> %v) {280; CHECK-LABEL: vfsqrt_nxv1f64:281; CHECK: # %bb.0:282; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma283; CHECK-NEXT: vfsqrt.v v8, v8284; CHECK-NEXT: ret285 %r = call <vscale x 1 x double> @llvm.sqrt.nxv1f64(<vscale x 1 x double> %v)286 ret <vscale x 1 x double> %r287}288 289define <vscale x 2 x double> @vfsqrt_nxv2f64(<vscale x 2 x double> %v) {290; CHECK-LABEL: vfsqrt_nxv2f64:291; CHECK: # %bb.0:292; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma293; CHECK-NEXT: vfsqrt.v v8, v8294; CHECK-NEXT: ret295 %r = call <vscale x 2 x double> @llvm.sqrt.nxv2f64(<vscale x 2 x double> %v)296 ret <vscale x 2 x double> %r297}298 299define <vscale x 4 x double> @vfsqrt_nxv4f64(<vscale x 4 x double> %v) {300; CHECK-LABEL: vfsqrt_nxv4f64:301; CHECK: # %bb.0:302; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma303; CHECK-NEXT: vfsqrt.v v8, v8304; CHECK-NEXT: ret305 %r = call <vscale x 4 x double> @llvm.sqrt.nxv4f64(<vscale x 4 x double> %v)306 ret <vscale x 4 x double> %r307}308 309define <vscale x 8 x double> @vfsqrt_nxv8f64(<vscale x 8 x double> %v) {310; CHECK-LABEL: vfsqrt_nxv8f64:311; CHECK: # %bb.0:312; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma313; CHECK-NEXT: vfsqrt.v v8, v8314; CHECK-NEXT: ret315 %r = call <vscale x 8 x double> @llvm.sqrt.nxv8f64(<vscale x 8 x double> %v)316 ret <vscale x 8 x double> %r317}318