1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+experimental-zfh,+experimental-v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=RV32 4; RUN: llc -mtriple=riscv64 -mattr=+d,+experimental-zfh,+experimental-v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=RV64 6 7define <vscale x 1 x half> @vfptrunc_nxv1f32_nxv1f16(<vscale x 1 x float> %va) { 8; 9; RV32-LABEL: vfptrunc_nxv1f32_nxv1f16: 10; RV32: # %bb.0: 11; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 12; RV32-NEXT: vfncvt.f.f.w v25, v8 13; RV32-NEXT: vmv1r.v v8, v25 14; RV32-NEXT: ret 15; 16; RV64-LABEL: vfptrunc_nxv1f32_nxv1f16: 17; RV64: # %bb.0: 18; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 19; RV64-NEXT: vfncvt.f.f.w v25, v8 20; RV64-NEXT: vmv1r.v v8, v25 21; RV64-NEXT: ret 22 %evec = fptrunc <vscale x 1 x float> %va to <vscale x 1 x half> 23 ret <vscale x 1 x half> %evec 24} 25 26define <vscale x 2 x half> @vfptrunc_nxv2f32_nxv2f16(<vscale x 2 x float> %va) { 27; 28; RV32-LABEL: vfptrunc_nxv2f32_nxv2f16: 29; RV32: # %bb.0: 30; RV32-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 31; RV32-NEXT: vfncvt.f.f.w v25, v8 32; RV32-NEXT: vmv1r.v v8, v25 33; RV32-NEXT: ret 34; 35; RV64-LABEL: vfptrunc_nxv2f32_nxv2f16: 36; RV64: # %bb.0: 37; RV64-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 38; RV64-NEXT: vfncvt.f.f.w v25, v8 39; RV64-NEXT: vmv1r.v v8, v25 40; RV64-NEXT: ret 41 %evec = fptrunc <vscale x 2 x float> %va to <vscale x 2 x half> 42 ret <vscale x 2 x half> %evec 43} 44 45define <vscale x 4 x half> @vfptrunc_nxv4f32_nxv4f16(<vscale x 4 x float> %va) { 46; 47; RV32-LABEL: vfptrunc_nxv4f32_nxv4f16: 48; RV32: # %bb.0: 49; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, mu 50; RV32-NEXT: vfncvt.f.f.w v25, v8 51; RV32-NEXT: vmv1r.v v8, v25 52; RV32-NEXT: ret 53; 54; RV64-LABEL: vfptrunc_nxv4f32_nxv4f16: 55; RV64: # %bb.0: 56; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, mu 57; RV64-NEXT: vfncvt.f.f.w v25, v8 58; RV64-NEXT: vmv1r.v v8, v25 59; RV64-NEXT: ret 60 %evec = fptrunc <vscale x 4 x float> %va to <vscale x 4 x half> 61 ret <vscale x 4 x half> %evec 62} 63 64define <vscale x 8 x half> @vfptrunc_nxv8f32_nxv8f16(<vscale x 8 x float> %va) { 65; 66; RV32-LABEL: vfptrunc_nxv8f32_nxv8f16: 67; RV32: # %bb.0: 68; RV32-NEXT: vsetvli a0, zero, e16, m2, ta, mu 69; RV32-NEXT: vfncvt.f.f.w v26, v8 70; RV32-NEXT: vmv2r.v v8, v26 71; RV32-NEXT: ret 72; 73; RV64-LABEL: vfptrunc_nxv8f32_nxv8f16: 74; RV64: # %bb.0: 75; RV64-NEXT: vsetvli a0, zero, e16, m2, ta, mu 76; RV64-NEXT: vfncvt.f.f.w v26, v8 77; RV64-NEXT: vmv2r.v v8, v26 78; RV64-NEXT: ret 79 %evec = fptrunc <vscale x 8 x float> %va to <vscale x 8 x half> 80 ret <vscale x 8 x half> %evec 81} 82 83define <vscale x 16 x half> @vfptrunc_nxv16f32_nxv16f16(<vscale x 16 x float> %va) { 84; 85; RV32-LABEL: vfptrunc_nxv16f32_nxv16f16: 86; RV32: # %bb.0: 87; RV32-NEXT: vsetvli a0, zero, e16, m4, ta, mu 88; RV32-NEXT: vfncvt.f.f.w v28, v8 89; RV32-NEXT: vmv4r.v v8, v28 90; RV32-NEXT: ret 91; 92; RV64-LABEL: vfptrunc_nxv16f32_nxv16f16: 93; RV64: # %bb.0: 94; RV64-NEXT: vsetvli a0, zero, e16, m4, ta, mu 95; RV64-NEXT: vfncvt.f.f.w v28, v8 96; RV64-NEXT: vmv4r.v v8, v28 97; RV64-NEXT: ret 98 %evec = fptrunc <vscale x 16 x float> %va to <vscale x 16 x half> 99 ret <vscale x 16 x half> %evec 100} 101 102define <vscale x 1 x half> @vfptrunc_nxv1f64_nxv1f16(<vscale x 1 x double> %va) { 103; 104; RV32-LABEL: vfptrunc_nxv1f64_nxv1f16: 105; RV32: # %bb.0: 106; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 107; RV32-NEXT: vfncvt.rod.f.f.w v25, v8 108; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 109; RV32-NEXT: vfncvt.f.f.w v8, v25 110; RV32-NEXT: ret 111; 112; RV64-LABEL: vfptrunc_nxv1f64_nxv1f16: 113; RV64: # %bb.0: 114; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 115; RV64-NEXT: vfncvt.rod.f.f.w v25, v8 116; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 117; RV64-NEXT: vfncvt.f.f.w v8, v25 118; RV64-NEXT: ret 119 %evec = fptrunc <vscale x 1 x double> %va to <vscale x 1 x half> 120 ret <vscale x 1 x half> %evec 121} 122 123define <vscale x 1 x float> @vfptrunc_nxv1f64_nxv1f32(<vscale x 1 x double> %va) { 124; 125; RV32-LABEL: vfptrunc_nxv1f64_nxv1f32: 126; RV32: # %bb.0: 127; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 128; RV32-NEXT: vfncvt.f.f.w v25, v8 129; RV32-NEXT: vmv1r.v v8, v25 130; RV32-NEXT: ret 131; 132; RV64-LABEL: vfptrunc_nxv1f64_nxv1f32: 133; RV64: # %bb.0: 134; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 135; RV64-NEXT: vfncvt.f.f.w v25, v8 136; RV64-NEXT: vmv1r.v v8, v25 137; RV64-NEXT: ret 138 %evec = fptrunc <vscale x 1 x double> %va to <vscale x 1 x float> 139 ret <vscale x 1 x float> %evec 140} 141 142define <vscale x 2 x half> @vfptrunc_nxv2f64_nxv2f16(<vscale x 2 x double> %va) { 143; 144; RV32-LABEL: vfptrunc_nxv2f64_nxv2f16: 145; RV32: # %bb.0: 146; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, mu 147; RV32-NEXT: vfncvt.rod.f.f.w v25, v8 148; RV32-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 149; RV32-NEXT: vfncvt.f.f.w v8, v25 150; RV32-NEXT: ret 151; 152; RV64-LABEL: vfptrunc_nxv2f64_nxv2f16: 153; RV64: # %bb.0: 154; RV64-NEXT: vsetvli a0, zero, e32, m1, ta, mu 155; RV64-NEXT: vfncvt.rod.f.f.w v25, v8 156; RV64-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 157; RV64-NEXT: vfncvt.f.f.w v8, v25 158; RV64-NEXT: ret 159 %evec = fptrunc <vscale x 2 x double> %va to <vscale x 2 x half> 160 ret <vscale x 2 x half> %evec 161} 162 163define <vscale x 2 x float> @vfptrunc_nxv2f64_nxv2f32(<vscale x 2 x double> %va) { 164; 165; RV32-LABEL: vfptrunc_nxv2f64_nxv2f32: 166; RV32: # %bb.0: 167; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, mu 168; RV32-NEXT: vfncvt.f.f.w v25, v8 169; RV32-NEXT: vmv1r.v v8, v25 170; RV32-NEXT: ret 171; 172; RV64-LABEL: vfptrunc_nxv2f64_nxv2f32: 173; RV64: # %bb.0: 174; RV64-NEXT: vsetvli a0, zero, e32, m1, ta, mu 175; RV64-NEXT: vfncvt.f.f.w v25, v8 176; RV64-NEXT: vmv1r.v v8, v25 177; RV64-NEXT: ret 178 %evec = fptrunc <vscale x 2 x double> %va to <vscale x 2 x float> 179 ret <vscale x 2 x float> %evec 180} 181 182define <vscale x 4 x half> @vfptrunc_nxv4f64_nxv4f16(<vscale x 4 x double> %va) { 183; 184; RV32-LABEL: vfptrunc_nxv4f64_nxv4f16: 185; RV32: # %bb.0: 186; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, mu 187; RV32-NEXT: vfncvt.rod.f.f.w v26, v8 188; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, mu 189; RV32-NEXT: vfncvt.f.f.w v8, v26 190; RV32-NEXT: ret 191; 192; RV64-LABEL: vfptrunc_nxv4f64_nxv4f16: 193; RV64: # %bb.0: 194; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, mu 195; RV64-NEXT: vfncvt.rod.f.f.w v26, v8 196; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, mu 197; RV64-NEXT: vfncvt.f.f.w v8, v26 198; RV64-NEXT: ret 199 %evec = fptrunc <vscale x 4 x double> %va to <vscale x 4 x half> 200 ret <vscale x 4 x half> %evec 201} 202 203define <vscale x 4 x float> @vfptrunc_nxv4f64_nxv4f32(<vscale x 4 x double> %va) { 204; 205; RV32-LABEL: vfptrunc_nxv4f64_nxv4f32: 206; RV32: # %bb.0: 207; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, mu 208; RV32-NEXT: vfncvt.f.f.w v26, v8 209; RV32-NEXT: vmv2r.v v8, v26 210; RV32-NEXT: ret 211; 212; RV64-LABEL: vfptrunc_nxv4f64_nxv4f32: 213; RV64: # %bb.0: 214; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, mu 215; RV64-NEXT: vfncvt.f.f.w v26, v8 216; RV64-NEXT: vmv2r.v v8, v26 217; RV64-NEXT: ret 218 %evec = fptrunc <vscale x 4 x double> %va to <vscale x 4 x float> 219 ret <vscale x 4 x float> %evec 220} 221 222define <vscale x 8 x half> @vfptrunc_nxv8f64_nxv8f16(<vscale x 8 x double> %va) { 223; 224; RV32-LABEL: vfptrunc_nxv8f64_nxv8f16: 225; RV32: # %bb.0: 226; RV32-NEXT: vsetvli a0, zero, e32, m4, ta, mu 227; RV32-NEXT: vfncvt.rod.f.f.w v28, v8 228; RV32-NEXT: vsetvli zero, zero, e16, m2, ta, mu 229; RV32-NEXT: vfncvt.f.f.w v8, v28 230; RV32-NEXT: ret 231; 232; RV64-LABEL: vfptrunc_nxv8f64_nxv8f16: 233; RV64: # %bb.0: 234; RV64-NEXT: vsetvli a0, zero, e32, m4, ta, mu 235; RV64-NEXT: vfncvt.rod.f.f.w v28, v8 236; RV64-NEXT: vsetvli zero, zero, e16, m2, ta, mu 237; RV64-NEXT: vfncvt.f.f.w v8, v28 238; RV64-NEXT: ret 239 %evec = fptrunc <vscale x 8 x double> %va to <vscale x 8 x half> 240 ret <vscale x 8 x half> %evec 241} 242 243define <vscale x 8 x float> @vfptrunc_nxv8f64_nxv8f32(<vscale x 8 x double> %va) { 244; 245; RV32-LABEL: vfptrunc_nxv8f64_nxv8f32: 246; RV32: # %bb.0: 247; RV32-NEXT: vsetvli a0, zero, e32, m4, ta, mu 248; RV32-NEXT: vfncvt.f.f.w v28, v8 249; RV32-NEXT: vmv4r.v v8, v28 250; RV32-NEXT: ret 251; 252; RV64-LABEL: vfptrunc_nxv8f64_nxv8f32: 253; RV64: # %bb.0: 254; RV64-NEXT: vsetvli a0, zero, e32, m4, ta, mu 255; RV64-NEXT: vfncvt.f.f.w v28, v8 256; RV64-NEXT: vmv4r.v v8, v28 257; RV64-NEXT: ret 258 %evec = fptrunc <vscale x 8 x double> %va to <vscale x 8 x float> 259 ret <vscale x 8 x float> %evec 260} 261 262