684 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zvfh,+zvfbfmin,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,ZVFH323; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zvfh,+zvfbfmin,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,ZVFH644; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zvfhmin,+zvfbfmin,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,ZVFHMIN325; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zvfhmin,+zvfbfmin,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,ZVFHMIN646 7define void @si2fp_v2i32_v2f32(ptr %x, ptr %y) {8; CHECK-LABEL: si2fp_v2i32_v2f32:9; CHECK: # %bb.0:10; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma11; CHECK-NEXT: vle32.v v8, (a0)12; CHECK-NEXT: vfcvt.f.x.v v8, v813; CHECK-NEXT: vse32.v v8, (a1)14; CHECK-NEXT: ret15 %a = load <2 x i32>, ptr %x16 %d = sitofp <2 x i32> %a to <2 x float>17 store <2 x float> %d, ptr %y18 ret void19}20 21define void @ui2fp_v2i32_v2f32(ptr %x, ptr %y) {22; CHECK-LABEL: ui2fp_v2i32_v2f32:23; CHECK: # %bb.0:24; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma25; CHECK-NEXT: vle32.v v8, (a0)26; CHECK-NEXT: vfcvt.f.xu.v v8, v827; CHECK-NEXT: vse32.v v8, (a1)28; CHECK-NEXT: ret29 %a = load <2 x i32>, ptr %x30 %d = uitofp <2 x i32> %a to <2 x float>31 store <2 x float> %d, ptr %y32 ret void33}34 35define <2 x float> @si2fp_v2i1_v2f32(<2 x i1> %x) {36; CHECK-LABEL: si2fp_v2i1_v2f32:37; CHECK: # %bb.0:38; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma39; CHECK-NEXT: vmv.v.i v8, 040; CHECK-NEXT: vmerge.vim v9, v8, -1, v041; CHECK-NEXT: vfwcvt.f.x.v v8, v942; CHECK-NEXT: ret43 %z = sitofp <2 x i1> %x to <2 x float>44 ret <2 x float> %z45}46 47define <2 x float> @si2fp_v2i7_v2f32(<2 x i7> %x) {48; CHECK-LABEL: si2fp_v2i7_v2f32:49; CHECK: # %bb.0:50; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma51; CHECK-NEXT: vadd.vv v8, v8, v852; CHECK-NEXT: vsra.vi v8, v8, 153; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma54; CHECK-NEXT: vsext.vf2 v9, v855; CHECK-NEXT: vfwcvt.f.x.v v8, v956; CHECK-NEXT: ret57 %z = sitofp <2 x i7> %x to <2 x float>58 ret <2 x float> %z59}60 61define <2 x float> @ui2fp_v2i7_v2f32(<2 x i7> %x) {62; CHECK-LABEL: ui2fp_v2i7_v2f32:63; CHECK: # %bb.0:64; CHECK-NEXT: li a0, 12765; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma66; CHECK-NEXT: vand.vx v8, v8, a067; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma68; CHECK-NEXT: vzext.vf2 v9, v869; CHECK-NEXT: vfwcvt.f.xu.v v8, v970; CHECK-NEXT: ret71 %z = uitofp <2 x i7> %x to <2 x float>72 ret <2 x float> %z73}74 75define <2 x float> @ui2fp_v2i1_v2f32(<2 x i1> %x) {76; CHECK-LABEL: ui2fp_v2i1_v2f32:77; CHECK: # %bb.0:78; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma79; CHECK-NEXT: vmv.v.i v8, 080; CHECK-NEXT: vmerge.vim v9, v8, 1, v081; CHECK-NEXT: vfwcvt.f.xu.v v8, v982; CHECK-NEXT: ret83 %z = uitofp <2 x i1> %x to <2 x float>84 ret <2 x float> %z85}86 87define void @si2fp_v3i32_v3f32(ptr %x, ptr %y) {88; CHECK-LABEL: si2fp_v3i32_v3f32:89; CHECK: # %bb.0:90; CHECK-NEXT: vsetivli zero, 3, e32, m1, ta, ma91; CHECK-NEXT: vle32.v v8, (a0)92; CHECK-NEXT: vfcvt.f.x.v v8, v893; CHECK-NEXT: vse32.v v8, (a1)94; CHECK-NEXT: ret95 %a = load <3 x i32>, ptr %x96 %d = sitofp <3 x i32> %a to <3 x float>97 store <3 x float> %d, ptr %y98 ret void99}100 101define void @ui2fp_v3i32_v3f32(ptr %x, ptr %y) {102; CHECK-LABEL: ui2fp_v3i32_v3f32:103; CHECK: # %bb.0:104; CHECK-NEXT: vsetivli zero, 3, e32, m1, ta, ma105; CHECK-NEXT: vle32.v v8, (a0)106; CHECK-NEXT: vfcvt.f.xu.v v8, v8107; CHECK-NEXT: vse32.v v8, (a1)108; CHECK-NEXT: ret109 %a = load <3 x i32>, ptr %x110 %d = uitofp <3 x i32> %a to <3 x float>111 store <3 x float> %d, ptr %y112 ret void113}114 115define <3 x float> @si2fp_v3i1_v3f32(<3 x i1> %x) {116; CHECK-LABEL: si2fp_v3i1_v3f32:117; CHECK: # %bb.0:118; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma119; CHECK-NEXT: vmv.v.i v8, 0120; CHECK-NEXT: vmerge.vim v9, v8, -1, v0121; CHECK-NEXT: vfwcvt.f.x.v v8, v9122; CHECK-NEXT: ret123 %z = sitofp <3 x i1> %x to <3 x float>124 ret <3 x float> %z125}126 127; FIXME: This gets expanded instead of widened + promoted128define <3 x float> @si2fp_v3i7_v3f32(<3 x i7> %x) {129; ZVFH32-LABEL: si2fp_v3i7_v3f32:130; ZVFH32: # %bb.0:131; ZVFH32-NEXT: lw a1, 0(a0)132; ZVFH32-NEXT: lw a2, 4(a0)133; ZVFH32-NEXT: lw a0, 8(a0)134; ZVFH32-NEXT: vsetivli zero, 4, e8, mf4, ta, ma135; ZVFH32-NEXT: vmv.v.x v8, a1136; ZVFH32-NEXT: vslide1down.vx v8, v8, a2137; ZVFH32-NEXT: vslide1down.vx v8, v8, a0138; ZVFH32-NEXT: vslidedown.vi v8, v8, 1139; ZVFH32-NEXT: vadd.vv v8, v8, v8140; ZVFH32-NEXT: vsra.vi v8, v8, 1141; ZVFH32-NEXT: vsetvli zero, zero, e16, mf2, ta, ma142; ZVFH32-NEXT: vsext.vf2 v9, v8143; ZVFH32-NEXT: vfwcvt.f.x.v v8, v9144; ZVFH32-NEXT: ret145;146; ZVFH64-LABEL: si2fp_v3i7_v3f32:147; ZVFH64: # %bb.0:148; ZVFH64-NEXT: ld a1, 0(a0)149; ZVFH64-NEXT: ld a2, 8(a0)150; ZVFH64-NEXT: ld a0, 16(a0)151; ZVFH64-NEXT: vsetivli zero, 4, e8, mf4, ta, ma152; ZVFH64-NEXT: vmv.v.x v8, a1153; ZVFH64-NEXT: vslide1down.vx v8, v8, a2154; ZVFH64-NEXT: vslide1down.vx v8, v8, a0155; ZVFH64-NEXT: vslidedown.vi v8, v8, 1156; ZVFH64-NEXT: vadd.vv v8, v8, v8157; ZVFH64-NEXT: vsra.vi v8, v8, 1158; ZVFH64-NEXT: vsetvli zero, zero, e16, mf2, ta, ma159; ZVFH64-NEXT: vsext.vf2 v9, v8160; ZVFH64-NEXT: vfwcvt.f.x.v v8, v9161; ZVFH64-NEXT: ret162;163; ZVFHMIN32-LABEL: si2fp_v3i7_v3f32:164; ZVFHMIN32: # %bb.0:165; ZVFHMIN32-NEXT: lw a1, 0(a0)166; ZVFHMIN32-NEXT: lw a2, 4(a0)167; ZVFHMIN32-NEXT: lw a0, 8(a0)168; ZVFHMIN32-NEXT: vsetivli zero, 4, e8, mf4, ta, ma169; ZVFHMIN32-NEXT: vmv.v.x v8, a1170; ZVFHMIN32-NEXT: vslide1down.vx v8, v8, a2171; ZVFHMIN32-NEXT: vslide1down.vx v8, v8, a0172; ZVFHMIN32-NEXT: vslidedown.vi v8, v8, 1173; ZVFHMIN32-NEXT: vadd.vv v8, v8, v8174; ZVFHMIN32-NEXT: vsra.vi v8, v8, 1175; ZVFHMIN32-NEXT: vsetvli zero, zero, e16, mf2, ta, ma176; ZVFHMIN32-NEXT: vsext.vf2 v9, v8177; ZVFHMIN32-NEXT: vfwcvt.f.x.v v8, v9178; ZVFHMIN32-NEXT: ret179;180; ZVFHMIN64-LABEL: si2fp_v3i7_v3f32:181; ZVFHMIN64: # %bb.0:182; ZVFHMIN64-NEXT: ld a1, 0(a0)183; ZVFHMIN64-NEXT: ld a2, 8(a0)184; ZVFHMIN64-NEXT: ld a0, 16(a0)185; ZVFHMIN64-NEXT: vsetivli zero, 4, e8, mf4, ta, ma186; ZVFHMIN64-NEXT: vmv.v.x v8, a1187; ZVFHMIN64-NEXT: vslide1down.vx v8, v8, a2188; ZVFHMIN64-NEXT: vslide1down.vx v8, v8, a0189; ZVFHMIN64-NEXT: vslidedown.vi v8, v8, 1190; ZVFHMIN64-NEXT: vadd.vv v8, v8, v8191; ZVFHMIN64-NEXT: vsra.vi v8, v8, 1192; ZVFHMIN64-NEXT: vsetvli zero, zero, e16, mf2, ta, ma193; ZVFHMIN64-NEXT: vsext.vf2 v9, v8194; ZVFHMIN64-NEXT: vfwcvt.f.x.v v8, v9195; ZVFHMIN64-NEXT: ret196 %z = sitofp <3 x i7> %x to <3 x float>197 ret <3 x float> %z198}199 200; FIXME: This gets expanded instead of widened + promoted201define <3 x float> @ui2fp_v3i7_v3f32(<3 x i7> %x) {202; ZVFH32-LABEL: ui2fp_v3i7_v3f32:203; ZVFH32: # %bb.0:204; ZVFH32-NEXT: lw a1, 0(a0)205; ZVFH32-NEXT: lw a2, 4(a0)206; ZVFH32-NEXT: lw a0, 8(a0)207; ZVFH32-NEXT: vsetivli zero, 4, e8, mf4, ta, ma208; ZVFH32-NEXT: vmv.v.x v8, a1209; ZVFH32-NEXT: vslide1down.vx v8, v8, a2210; ZVFH32-NEXT: vslide1down.vx v8, v8, a0211; ZVFH32-NEXT: vslidedown.vi v8, v8, 1212; ZVFH32-NEXT: li a0, 127213; ZVFH32-NEXT: vand.vx v8, v8, a0214; ZVFH32-NEXT: vsetvli zero, zero, e16, mf2, ta, ma215; ZVFH32-NEXT: vzext.vf2 v9, v8216; ZVFH32-NEXT: vfwcvt.f.xu.v v8, v9217; ZVFH32-NEXT: ret218;219; ZVFH64-LABEL: ui2fp_v3i7_v3f32:220; ZVFH64: # %bb.0:221; ZVFH64-NEXT: ld a1, 0(a0)222; ZVFH64-NEXT: ld a2, 8(a0)223; ZVFH64-NEXT: ld a0, 16(a0)224; ZVFH64-NEXT: vsetivli zero, 4, e8, mf4, ta, ma225; ZVFH64-NEXT: vmv.v.x v8, a1226; ZVFH64-NEXT: vslide1down.vx v8, v8, a2227; ZVFH64-NEXT: vslide1down.vx v8, v8, a0228; ZVFH64-NEXT: vslidedown.vi v8, v8, 1229; ZVFH64-NEXT: li a0, 127230; ZVFH64-NEXT: vand.vx v8, v8, a0231; ZVFH64-NEXT: vsetvli zero, zero, e16, mf2, ta, ma232; ZVFH64-NEXT: vzext.vf2 v9, v8233; ZVFH64-NEXT: vfwcvt.f.xu.v v8, v9234; ZVFH64-NEXT: ret235;236; ZVFHMIN32-LABEL: ui2fp_v3i7_v3f32:237; ZVFHMIN32: # %bb.0:238; ZVFHMIN32-NEXT: lw a1, 0(a0)239; ZVFHMIN32-NEXT: lw a2, 4(a0)240; ZVFHMIN32-NEXT: lw a0, 8(a0)241; ZVFHMIN32-NEXT: vsetivli zero, 4, e8, mf4, ta, ma242; ZVFHMIN32-NEXT: vmv.v.x v8, a1243; ZVFHMIN32-NEXT: vslide1down.vx v8, v8, a2244; ZVFHMIN32-NEXT: vslide1down.vx v8, v8, a0245; ZVFHMIN32-NEXT: vslidedown.vi v8, v8, 1246; ZVFHMIN32-NEXT: li a0, 127247; ZVFHMIN32-NEXT: vand.vx v8, v8, a0248; ZVFHMIN32-NEXT: vsetvli zero, zero, e16, mf2, ta, ma249; ZVFHMIN32-NEXT: vzext.vf2 v9, v8250; ZVFHMIN32-NEXT: vfwcvt.f.xu.v v8, v9251; ZVFHMIN32-NEXT: ret252;253; ZVFHMIN64-LABEL: ui2fp_v3i7_v3f32:254; ZVFHMIN64: # %bb.0:255; ZVFHMIN64-NEXT: ld a1, 0(a0)256; ZVFHMIN64-NEXT: ld a2, 8(a0)257; ZVFHMIN64-NEXT: ld a0, 16(a0)258; ZVFHMIN64-NEXT: vsetivli zero, 4, e8, mf4, ta, ma259; ZVFHMIN64-NEXT: vmv.v.x v8, a1260; ZVFHMIN64-NEXT: vslide1down.vx v8, v8, a2261; ZVFHMIN64-NEXT: vslide1down.vx v8, v8, a0262; ZVFHMIN64-NEXT: vslidedown.vi v8, v8, 1263; ZVFHMIN64-NEXT: li a0, 127264; ZVFHMIN64-NEXT: vand.vx v8, v8, a0265; ZVFHMIN64-NEXT: vsetvli zero, zero, e16, mf2, ta, ma266; ZVFHMIN64-NEXT: vzext.vf2 v9, v8267; ZVFHMIN64-NEXT: vfwcvt.f.xu.v v8, v9268; ZVFHMIN64-NEXT: ret269 %z = uitofp <3 x i7> %x to <3 x float>270 ret <3 x float> %z271}272 273define <3 x float> @ui2fp_v3i1_v3f32(<3 x i1> %x) {274; CHECK-LABEL: ui2fp_v3i1_v3f32:275; CHECK: # %bb.0:276; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma277; CHECK-NEXT: vmv.v.i v8, 0278; CHECK-NEXT: vmerge.vim v9, v8, 1, v0279; CHECK-NEXT: vfwcvt.f.xu.v v8, v9280; CHECK-NEXT: ret281 %z = uitofp <3 x i1> %x to <3 x float>282 ret <3 x float> %z283}284 285define void @si2fp_v8i32_v8f32(ptr %x, ptr %y) {286; CHECK-LABEL: si2fp_v8i32_v8f32:287; CHECK: # %bb.0:288; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma289; CHECK-NEXT: vle32.v v8, (a0)290; CHECK-NEXT: vfcvt.f.x.v v8, v8291; CHECK-NEXT: vse32.v v8, (a1)292; CHECK-NEXT: ret293 %a = load <8 x i32>, ptr %x294 %d = sitofp <8 x i32> %a to <8 x float>295 store <8 x float> %d, ptr %y296 ret void297}298 299define void @ui2fp_v8i32_v8f32(ptr %x, ptr %y) {300; CHECK-LABEL: ui2fp_v8i32_v8f32:301; CHECK: # %bb.0:302; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma303; CHECK-NEXT: vle32.v v8, (a0)304; CHECK-NEXT: vfcvt.f.xu.v v8, v8305; CHECK-NEXT: vse32.v v8, (a1)306; CHECK-NEXT: ret307 %a = load <8 x i32>, ptr %x308 %d = uitofp <8 x i32> %a to <8 x float>309 store <8 x float> %d, ptr %y310 ret void311}312 313define <8 x float> @si2fp_v8i1_v8f32(<8 x i1> %x) {314; CHECK-LABEL: si2fp_v8i1_v8f32:315; CHECK: # %bb.0:316; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma317; CHECK-NEXT: vmv.v.i v8, 0318; CHECK-NEXT: vmerge.vim v10, v8, -1, v0319; CHECK-NEXT: vfwcvt.f.x.v v8, v10320; CHECK-NEXT: ret321 %z = sitofp <8 x i1> %x to <8 x float>322 ret <8 x float> %z323}324 325define <8 x float> @ui2fp_v8i1_v8f32(<8 x i1> %x) {326; CHECK-LABEL: ui2fp_v8i1_v8f32:327; CHECK: # %bb.0:328; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma329; CHECK-NEXT: vmv.v.i v8, 0330; CHECK-NEXT: vmerge.vim v10, v8, 1, v0331; CHECK-NEXT: vfwcvt.f.xu.v v8, v10332; CHECK-NEXT: ret333 %z = uitofp <8 x i1> %x to <8 x float>334 ret <8 x float> %z335}336 337define void @si2fp_v2i16_v2f64(ptr %x, ptr %y) {338; CHECK-LABEL: si2fp_v2i16_v2f64:339; CHECK: # %bb.0:340; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma341; CHECK-NEXT: vle16.v v8, (a0)342; CHECK-NEXT: vsext.vf2 v9, v8343; CHECK-NEXT: vfwcvt.f.x.v v8, v9344; CHECK-NEXT: vse64.v v8, (a1)345; CHECK-NEXT: ret346 %a = load <2 x i16>, ptr %x347 %d = sitofp <2 x i16> %a to <2 x double>348 store <2 x double> %d, ptr %y349 ret void350}351 352define void @ui2fp_v2i16_v2f64(ptr %x, ptr %y) {353; CHECK-LABEL: ui2fp_v2i16_v2f64:354; CHECK: # %bb.0:355; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma356; CHECK-NEXT: vle16.v v8, (a0)357; CHECK-NEXT: vzext.vf2 v9, v8358; CHECK-NEXT: vfwcvt.f.xu.v v8, v9359; CHECK-NEXT: vse64.v v8, (a1)360; CHECK-NEXT: ret361 %a = load <2 x i16>, ptr %x362 %d = uitofp <2 x i16> %a to <2 x double>363 store <2 x double> %d, ptr %y364 ret void365}366 367define void @si2fp_v8i16_v8f64(ptr %x, ptr %y) {368; CHECK-LABEL: si2fp_v8i16_v8f64:369; CHECK: # %bb.0:370; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma371; CHECK-NEXT: vle16.v v8, (a0)372; CHECK-NEXT: vsext.vf2 v12, v8373; CHECK-NEXT: vfwcvt.f.x.v v8, v12374; CHECK-NEXT: vse64.v v8, (a1)375; CHECK-NEXT: ret376 %a = load <8 x i16>, ptr %x377 %d = sitofp <8 x i16> %a to <8 x double>378 store <8 x double> %d, ptr %y379 ret void380}381 382define void @ui2fp_v8i16_v8f64(ptr %x, ptr %y) {383; CHECK-LABEL: ui2fp_v8i16_v8f64:384; CHECK: # %bb.0:385; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma386; CHECK-NEXT: vle16.v v8, (a0)387; CHECK-NEXT: vzext.vf2 v12, v8388; CHECK-NEXT: vfwcvt.f.xu.v v8, v12389; CHECK-NEXT: vse64.v v8, (a1)390; CHECK-NEXT: ret391 %a = load <8 x i16>, ptr %x392 %d = uitofp <8 x i16> %a to <8 x double>393 store <8 x double> %d, ptr %y394 ret void395}396 397define <8 x double> @si2fp_v8i1_v8f64(<8 x i1> %x) {398; CHECK-LABEL: si2fp_v8i1_v8f64:399; CHECK: # %bb.0:400; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma401; CHECK-NEXT: vmv.v.i v8, 0402; CHECK-NEXT: vmerge.vim v12, v8, -1, v0403; CHECK-NEXT: vfwcvt.f.x.v v8, v12404; CHECK-NEXT: ret405 %z = sitofp <8 x i1> %x to <8 x double>406 ret <8 x double> %z407}408 409define <8 x double> @ui2fp_v8i1_v8f64(<8 x i1> %x) {410; CHECK-LABEL: ui2fp_v8i1_v8f64:411; CHECK: # %bb.0:412; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma413; CHECK-NEXT: vmv.v.i v8, 0414; CHECK-NEXT: vmerge.vim v12, v8, 1, v0415; CHECK-NEXT: vfwcvt.f.xu.v v8, v12416; CHECK-NEXT: ret417 %z = uitofp <8 x i1> %x to <8 x double>418 ret <8 x double> %z419}420 421define void @si2fp_v2i64_v2bf16(ptr %x, ptr %y) {422; CHECK-LABEL: si2fp_v2i64_v2bf16:423; CHECK: # %bb.0:424; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma425; CHECK-NEXT: vle64.v v8, (a0)426; CHECK-NEXT: vfncvt.f.x.w v9, v8427; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma428; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9429; CHECK-NEXT: vse16.v v8, (a1)430; CHECK-NEXT: ret431 %a = load <2 x i64>, ptr %x432 %d = sitofp <2 x i64> %a to <2 x bfloat>433 store <2 x bfloat> %d, ptr %y434 ret void435}436 437define void @ui2fp_v2i64_v2bf16(ptr %x, ptr %y) {438; CHECK-LABEL: ui2fp_v2i64_v2bf16:439; CHECK: # %bb.0:440; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma441; CHECK-NEXT: vle64.v v8, (a0)442; CHECK-NEXT: vfncvt.f.xu.w v9, v8443; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma444; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9445; CHECK-NEXT: vse16.v v8, (a1)446; CHECK-NEXT: ret447 %a = load <2 x i64>, ptr %x448 %d = uitofp <2 x i64> %a to <2 x bfloat>449 store <2 x bfloat> %d, ptr %y450 ret void451}452 453define <2 x bfloat> @si2fp_v2i1_v2bf16(<2 x i1> %x) {454; CHECK-LABEL: si2fp_v2i1_v2bf16:455; CHECK: # %bb.0:456; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma457; CHECK-NEXT: vmv.v.i v8, 0458; CHECK-NEXT: vmerge.vim v8, v8, -1, v0459; CHECK-NEXT: vfwcvt.f.x.v v9, v8460; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9461; CHECK-NEXT: ret462 %z = sitofp <2 x i1> %x to <2 x bfloat>463 ret <2 x bfloat> %z464}465 466define <2 x bfloat> @ui2fp_v2i1_v2bf16(<2 x i1> %x) {467; CHECK-LABEL: ui2fp_v2i1_v2bf16:468; CHECK: # %bb.0:469; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma470; CHECK-NEXT: vmv.v.i v8, 0471; CHECK-NEXT: vmerge.vim v8, v8, 1, v0472; CHECK-NEXT: vfwcvt.f.xu.v v9, v8473; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9474; CHECK-NEXT: ret475 %z = uitofp <2 x i1> %x to <2 x bfloat>476 ret <2 x bfloat> %z477}478 479define void @si2fp_v8i64_v8bf16(ptr %x, ptr %y) {480; CHECK-LABEL: si2fp_v8i64_v8bf16:481; CHECK: # %bb.0:482; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma483; CHECK-NEXT: vle64.v v8, (a0)484; CHECK-NEXT: vfncvt.f.x.w v12, v8485; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma486; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12487; CHECK-NEXT: vse16.v v8, (a1)488; CHECK-NEXT: ret489 %a = load <8 x i64>, ptr %x490 %d = sitofp <8 x i64> %a to <8 x bfloat>491 store <8 x bfloat> %d, ptr %y492 ret void493}494 495define void @ui2fp_v8i64_v8bf16(ptr %x, ptr %y) {496; CHECK-LABEL: ui2fp_v8i64_v8bf16:497; CHECK: # %bb.0:498; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma499; CHECK-NEXT: vle64.v v8, (a0)500; CHECK-NEXT: vfncvt.f.xu.w v12, v8501; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma502; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12503; CHECK-NEXT: vse16.v v8, (a1)504; CHECK-NEXT: ret505 %a = load <8 x i64>, ptr %x506 %d = uitofp <8 x i64> %a to <8 x bfloat>507 store <8 x bfloat> %d, ptr %y508 ret void509}510 511define <8 x bfloat> @si2fp_v8i1_v8bf16(<8 x i1> %x) {512; CHECK-LABEL: si2fp_v8i1_v8bf16:513; CHECK: # %bb.0:514; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma515; CHECK-NEXT: vmv.v.i v8, 0516; CHECK-NEXT: vmerge.vim v8, v8, -1, v0517; CHECK-NEXT: vfwcvt.f.x.v v10, v8518; CHECK-NEXT: vfncvtbf16.f.f.w v8, v10519; CHECK-NEXT: ret520 %z = sitofp <8 x i1> %x to <8 x bfloat>521 ret <8 x bfloat> %z522}523 524define <8 x bfloat> @ui2fp_v8i1_v8bf16(<8 x i1> %x) {525; CHECK-LABEL: ui2fp_v8i1_v8bf16:526; CHECK: # %bb.0:527; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma528; CHECK-NEXT: vmv.v.i v8, 0529; CHECK-NEXT: vmerge.vim v8, v8, 1, v0530; CHECK-NEXT: vfwcvt.f.xu.v v10, v8531; CHECK-NEXT: vfncvtbf16.f.f.w v8, v10532; CHECK-NEXT: ret533 %z = uitofp <8 x i1> %x to <8 x bfloat>534 ret <8 x bfloat> %z535}536 537define void @si2fp_v2i64_v2f16(ptr %x, ptr %y) {538; CHECK-LABEL: si2fp_v2i64_v2f16:539; CHECK: # %bb.0:540; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma541; CHECK-NEXT: vle64.v v8, (a0)542; CHECK-NEXT: vfncvt.f.x.w v9, v8543; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma544; CHECK-NEXT: vfncvt.f.f.w v8, v9545; CHECK-NEXT: vse16.v v8, (a1)546; CHECK-NEXT: ret547 %a = load <2 x i64>, ptr %x548 %d = sitofp <2 x i64> %a to <2 x half>549 store <2 x half> %d, ptr %y550 ret void551}552 553define void @ui2fp_v2i64_v2f16(ptr %x, ptr %y) {554; CHECK-LABEL: ui2fp_v2i64_v2f16:555; CHECK: # %bb.0:556; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma557; CHECK-NEXT: vle64.v v8, (a0)558; CHECK-NEXT: vfncvt.f.xu.w v9, v8559; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma560; CHECK-NEXT: vfncvt.f.f.w v8, v9561; CHECK-NEXT: vse16.v v8, (a1)562; CHECK-NEXT: ret563 %a = load <2 x i64>, ptr %x564 %d = uitofp <2 x i64> %a to <2 x half>565 store <2 x half> %d, ptr %y566 ret void567}568 569define <2 x half> @si2fp_v2i1_v2f16(<2 x i1> %x) {570; ZVFH-LABEL: si2fp_v2i1_v2f16:571; ZVFH: # %bb.0:572; ZVFH-NEXT: vsetivli zero, 2, e8, mf8, ta, ma573; ZVFH-NEXT: vmv.v.i v8, 0574; ZVFH-NEXT: vmerge.vim v9, v8, -1, v0575; ZVFH-NEXT: vfwcvt.f.x.v v8, v9576; ZVFH-NEXT: ret577;578; ZVFHMIN-LABEL: si2fp_v2i1_v2f16:579; ZVFHMIN: # %bb.0:580; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma581; ZVFHMIN-NEXT: vmv.v.i v8, 0582; ZVFHMIN-NEXT: vmerge.vim v8, v8, -1, v0583; ZVFHMIN-NEXT: vfwcvt.f.x.v v9, v8584; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9585; ZVFHMIN-NEXT: ret586 %z = sitofp <2 x i1> %x to <2 x half>587 ret <2 x half> %z588}589 590define <2 x half> @ui2fp_v2i1_v2f16(<2 x i1> %x) {591; ZVFH-LABEL: ui2fp_v2i1_v2f16:592; ZVFH: # %bb.0:593; ZVFH-NEXT: vsetivli zero, 2, e8, mf8, ta, ma594; ZVFH-NEXT: vmv.v.i v8, 0595; ZVFH-NEXT: vmerge.vim v9, v8, 1, v0596; ZVFH-NEXT: vfwcvt.f.xu.v v8, v9597; ZVFH-NEXT: ret598;599; ZVFHMIN-LABEL: ui2fp_v2i1_v2f16:600; ZVFHMIN: # %bb.0:601; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma602; ZVFHMIN-NEXT: vmv.v.i v8, 0603; ZVFHMIN-NEXT: vmerge.vim v8, v8, 1, v0604; ZVFHMIN-NEXT: vfwcvt.f.xu.v v9, v8605; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9606; ZVFHMIN-NEXT: ret607 %z = uitofp <2 x i1> %x to <2 x half>608 ret <2 x half> %z609}610 611define void @si2fp_v8i64_v8f16(ptr %x, ptr %y) {612; CHECK-LABEL: si2fp_v8i64_v8f16:613; CHECK: # %bb.0:614; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma615; CHECK-NEXT: vle64.v v8, (a0)616; CHECK-NEXT: vfncvt.f.x.w v12, v8617; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma618; CHECK-NEXT: vfncvt.f.f.w v8, v12619; CHECK-NEXT: vse16.v v8, (a1)620; CHECK-NEXT: ret621 %a = load <8 x i64>, ptr %x622 %d = sitofp <8 x i64> %a to <8 x half>623 store <8 x half> %d, ptr %y624 ret void625}626 627define void @ui2fp_v8i64_v8f16(ptr %x, ptr %y) {628; CHECK-LABEL: ui2fp_v8i64_v8f16:629; CHECK: # %bb.0:630; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma631; CHECK-NEXT: vle64.v v8, (a0)632; CHECK-NEXT: vfncvt.f.xu.w v12, v8633; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma634; CHECK-NEXT: vfncvt.f.f.w v8, v12635; CHECK-NEXT: vse16.v v8, (a1)636; CHECK-NEXT: ret637 %a = load <8 x i64>, ptr %x638 %d = uitofp <8 x i64> %a to <8 x half>639 store <8 x half> %d, ptr %y640 ret void641}642 643define <8 x half> @si2fp_v8i1_v8f16(<8 x i1> %x) {644; ZVFH-LABEL: si2fp_v8i1_v8f16:645; ZVFH: # %bb.0:646; ZVFH-NEXT: vsetivli zero, 8, e8, mf2, ta, ma647; ZVFH-NEXT: vmv.v.i v8, 0648; ZVFH-NEXT: vmerge.vim v9, v8, -1, v0649; ZVFH-NEXT: vfwcvt.f.x.v v8, v9650; ZVFH-NEXT: ret651;652; ZVFHMIN-LABEL: si2fp_v8i1_v8f16:653; ZVFHMIN: # %bb.0:654; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma655; ZVFHMIN-NEXT: vmv.v.i v8, 0656; ZVFHMIN-NEXT: vmerge.vim v8, v8, -1, v0657; ZVFHMIN-NEXT: vfwcvt.f.x.v v10, v8658; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10659; ZVFHMIN-NEXT: ret660 %z = sitofp <8 x i1> %x to <8 x half>661 ret <8 x half> %z662}663 664define <8 x half> @ui2fp_v8i1_v8f16(<8 x i1> %x) {665; ZVFH-LABEL: ui2fp_v8i1_v8f16:666; ZVFH: # %bb.0:667; ZVFH-NEXT: vsetivli zero, 8, e8, mf2, ta, ma668; ZVFH-NEXT: vmv.v.i v8, 0669; ZVFH-NEXT: vmerge.vim v9, v8, 1, v0670; ZVFH-NEXT: vfwcvt.f.xu.v v8, v9671; ZVFH-NEXT: ret672;673; ZVFHMIN-LABEL: ui2fp_v8i1_v8f16:674; ZVFHMIN: # %bb.0:675; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma676; ZVFHMIN-NEXT: vmv.v.i v8, 0677; ZVFHMIN-NEXT: vmerge.vim v8, v8, 1, v0678; ZVFHMIN-NEXT: vfwcvt.f.xu.v v10, v8679; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10680; ZVFHMIN-NEXT: ret681 %z = uitofp <8 x i1> %x to <8 x half>682 ret <8 x half> %z683}684