brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.3 KiB · 7813d7f Raw
381 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \3; RUN:     -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV32 %s4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \5; RUN:     -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV64 %s6 7define <1 x half> @trunc_v1f16(<1 x half> %x) strictfp {8; CHECK-LABEL: trunc_v1f16:9; CHECK:       # %bb.0:10; CHECK-NEXT:    vsetivli zero, 1, e16, mf4, ta, mu11; CHECK-NEXT:    vmfne.vv v0, v8, v812; CHECK-NEXT:    li a0, 2513; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t14; CHECK-NEXT:    slli a0, a0, 1015; CHECK-NEXT:    vfabs.v v9, v816; CHECK-NEXT:    fmv.h.x fa5, a017; CHECK-NEXT:    vmflt.vf v0, v9, fa518; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma19; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t20; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t21; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu22; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t23; CHECK-NEXT:    ret24  %a = call <1 x half> @llvm.experimental.constrained.trunc.v1f16(<1 x half> %x, metadata !"fpexcept.strict")25  ret <1 x half> %a26}27 28define <2 x half> @trunc_v2f16(<2 x half> %x) strictfp {29; CHECK-LABEL: trunc_v2f16:30; CHECK:       # %bb.0:31; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, mu32; CHECK-NEXT:    vmfne.vv v0, v8, v833; CHECK-NEXT:    li a0, 2534; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t35; CHECK-NEXT:    slli a0, a0, 1036; CHECK-NEXT:    vfabs.v v9, v837; CHECK-NEXT:    fmv.h.x fa5, a038; CHECK-NEXT:    vmflt.vf v0, v9, fa539; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma40; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t41; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t42; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu43; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t44; CHECK-NEXT:    ret45  %a = call <2 x half> @llvm.experimental.constrained.trunc.v2f16(<2 x half> %x, metadata !"fpexcept.strict")46  ret <2 x half> %a47}48 49define <4 x half> @trunc_v4f16(<4 x half> %x) strictfp {50; CHECK-LABEL: trunc_v4f16:51; CHECK:       # %bb.0:52; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, mu53; CHECK-NEXT:    vmfne.vv v0, v8, v854; CHECK-NEXT:    li a0, 2555; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t56; CHECK-NEXT:    slli a0, a0, 1057; CHECK-NEXT:    vfabs.v v9, v858; CHECK-NEXT:    fmv.h.x fa5, a059; CHECK-NEXT:    vmflt.vf v0, v9, fa560; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma61; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t62; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t63; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu64; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t65; CHECK-NEXT:    ret66  %a = call <4 x half> @llvm.experimental.constrained.trunc.v4f16(<4 x half> %x, metadata !"fpexcept.strict")67  ret <4 x half> %a68}69 70define <8 x half> @trunc_v8f16(<8 x half> %x) strictfp {71; CHECK-LABEL: trunc_v8f16:72; CHECK:       # %bb.0:73; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, mu74; CHECK-NEXT:    vmfne.vv v0, v8, v875; CHECK-NEXT:    li a0, 2576; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t77; CHECK-NEXT:    slli a0, a0, 1078; CHECK-NEXT:    vfabs.v v9, v879; CHECK-NEXT:    fmv.h.x fa5, a080; CHECK-NEXT:    vmflt.vf v0, v9, fa581; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma82; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t83; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t84; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu85; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t86; CHECK-NEXT:    ret87  %a = call <8 x half> @llvm.experimental.constrained.trunc.v8f16(<8 x half> %x, metadata !"fpexcept.strict")88  ret <8 x half> %a89}90 91define <16 x half> @trunc_v16f16(<16 x half> %x) strictfp {92; CHECK-LABEL: trunc_v16f16:93; CHECK:       # %bb.0:94; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, mu95; CHECK-NEXT:    vmfne.vv v0, v8, v896; CHECK-NEXT:    li a0, 2597; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t98; CHECK-NEXT:    slli a0, a0, 1099; CHECK-NEXT:    vfabs.v v10, v8100; CHECK-NEXT:    fmv.h.x fa5, a0101; CHECK-NEXT:    vmflt.vf v0, v10, fa5102; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma103; CHECK-NEXT:    vfcvt.rtz.x.f.v v10, v8, v0.t104; CHECK-NEXT:    vfcvt.f.x.v v10, v10, v0.t105; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu106; CHECK-NEXT:    vfsgnj.vv v8, v10, v8, v0.t107; CHECK-NEXT:    ret108  %a = call <16 x half> @llvm.experimental.constrained.trunc.v16f16(<16 x half> %x, metadata !"fpexcept.strict")109  ret <16 x half> %a110}111 112define <32 x half> @trunc_v32f16(<32 x half> %x) strictfp {113; CHECK-LABEL: trunc_v32f16:114; CHECK:       # %bb.0:115; CHECK-NEXT:    li a0, 32116; CHECK-NEXT:    li a1, 25117; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, mu118; CHECK-NEXT:    vmfne.vv v0, v8, v8119; CHECK-NEXT:    slli a1, a1, 10120; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t121; CHECK-NEXT:    fmv.h.x fa5, a1122; CHECK-NEXT:    vfabs.v v12, v8123; CHECK-NEXT:    vmflt.vf v0, v12, fa5124; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma125; CHECK-NEXT:    vfcvt.rtz.x.f.v v12, v8, v0.t126; CHECK-NEXT:    vfcvt.f.x.v v12, v12, v0.t127; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, mu128; CHECK-NEXT:    vfsgnj.vv v8, v12, v8, v0.t129; CHECK-NEXT:    ret130  %a = call <32 x half> @llvm.experimental.constrained.trunc.v32f16(<32 x half> %x, metadata !"fpexcept.strict")131  ret <32 x half> %a132}133 134define <1 x float> @trunc_v1f32(<1 x float> %x) strictfp {135; CHECK-LABEL: trunc_v1f32:136; CHECK:       # %bb.0:137; CHECK-NEXT:    vsetivli zero, 1, e32, mf2, ta, mu138; CHECK-NEXT:    vmfne.vv v0, v8, v8139; CHECK-NEXT:    lui a0, 307200140; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t141; CHECK-NEXT:    fmv.w.x fa5, a0142; CHECK-NEXT:    vfabs.v v9, v8143; CHECK-NEXT:    vmflt.vf v0, v9, fa5144; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma145; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t146; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t147; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu148; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t149; CHECK-NEXT:    ret150  %a = call <1 x float> @llvm.experimental.constrained.trunc.v1f32(<1 x float> %x, metadata !"fpexcept.strict")151  ret <1 x float> %a152}153 154define <2 x float> @trunc_v2f32(<2 x float> %x) strictfp {155; CHECK-LABEL: trunc_v2f32:156; CHECK:       # %bb.0:157; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu158; CHECK-NEXT:    vmfne.vv v0, v8, v8159; CHECK-NEXT:    lui a0, 307200160; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t161; CHECK-NEXT:    fmv.w.x fa5, a0162; CHECK-NEXT:    vfabs.v v9, v8163; CHECK-NEXT:    vmflt.vf v0, v9, fa5164; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma165; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t166; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t167; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu168; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t169; CHECK-NEXT:    ret170  %a = call <2 x float> @llvm.experimental.constrained.trunc.v2f32(<2 x float> %x, metadata !"fpexcept.strict")171  ret <2 x float> %a172}173 174define <4 x float> @trunc_v4f32(<4 x float> %x) strictfp {175; CHECK-LABEL: trunc_v4f32:176; CHECK:       # %bb.0:177; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, mu178; CHECK-NEXT:    vmfne.vv v0, v8, v8179; CHECK-NEXT:    lui a0, 307200180; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t181; CHECK-NEXT:    fmv.w.x fa5, a0182; CHECK-NEXT:    vfabs.v v9, v8183; CHECK-NEXT:    vmflt.vf v0, v9, fa5184; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma185; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t186; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t187; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, mu188; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t189; CHECK-NEXT:    ret190  %a = call <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float> %x, metadata !"fpexcept.strict")191  ret <4 x float> %a192}193 194define <8 x float> @trunc_v8f32(<8 x float> %x) strictfp {195; CHECK-LABEL: trunc_v8f32:196; CHECK:       # %bb.0:197; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, mu198; CHECK-NEXT:    vmfne.vv v0, v8, v8199; CHECK-NEXT:    lui a0, 307200200; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t201; CHECK-NEXT:    fmv.w.x fa5, a0202; CHECK-NEXT:    vfabs.v v10, v8203; CHECK-NEXT:    vmflt.vf v0, v10, fa5204; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma205; CHECK-NEXT:    vfcvt.rtz.x.f.v v10, v8, v0.t206; CHECK-NEXT:    vfcvt.f.x.v v10, v10, v0.t207; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, mu208; CHECK-NEXT:    vfsgnj.vv v8, v10, v8, v0.t209; CHECK-NEXT:    ret210  %a = call <8 x float> @llvm.experimental.constrained.trunc.v8f32(<8 x float> %x, metadata !"fpexcept.strict")211  ret <8 x float> %a212}213 214define <16 x float> @trunc_v16f32(<16 x float> %x) strictfp {215; CHECK-LABEL: trunc_v16f32:216; CHECK:       # %bb.0:217; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, mu218; CHECK-NEXT:    vmfne.vv v0, v8, v8219; CHECK-NEXT:    lui a0, 307200220; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t221; CHECK-NEXT:    fmv.w.x fa5, a0222; CHECK-NEXT:    vfabs.v v12, v8223; CHECK-NEXT:    vmflt.vf v0, v12, fa5224; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma225; CHECK-NEXT:    vfcvt.rtz.x.f.v v12, v8, v0.t226; CHECK-NEXT:    vfcvt.f.x.v v12, v12, v0.t227; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu228; CHECK-NEXT:    vfsgnj.vv v8, v12, v8, v0.t229; CHECK-NEXT:    ret230  %a = call <16 x float> @llvm.experimental.constrained.trunc.v16f32(<16 x float> %x, metadata !"fpexcept.strict")231  ret <16 x float> %a232}233 234define <1 x double> @trunc_v1f64(<1 x double> %x) strictfp {235; RV32-LABEL: trunc_v1f64:236; RV32:       # %bb.0:237; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, mu238; RV32-NEXT:    vmfne.vv v0, v8, v8239; RV32-NEXT:    lui a0, %hi(.LCPI11_0)240; RV32-NEXT:    fld fa5, %lo(.LCPI11_0)(a0)241; RV32-NEXT:    vfadd.vv v8, v8, v8, v0.t242; RV32-NEXT:    vfabs.v v9, v8243; RV32-NEXT:    vmflt.vf v0, v9, fa5244; RV32-NEXT:    vsetvli zero, zero, e64, m1, ta, ma245; RV32-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t246; RV32-NEXT:    vfcvt.f.x.v v9, v9, v0.t247; RV32-NEXT:    vsetvli zero, zero, e64, m1, ta, mu248; RV32-NEXT:    vfsgnj.vv v8, v9, v8, v0.t249; RV32-NEXT:    ret250;251; RV64-LABEL: trunc_v1f64:252; RV64:       # %bb.0:253; RV64-NEXT:    vsetivli zero, 1, e64, m1, ta, mu254; RV64-NEXT:    vmfne.vv v0, v8, v8255; RV64-NEXT:    li a0, 1075256; RV64-NEXT:    vfadd.vv v8, v8, v8, v0.t257; RV64-NEXT:    slli a0, a0, 52258; RV64-NEXT:    vfabs.v v9, v8259; RV64-NEXT:    fmv.d.x fa5, a0260; RV64-NEXT:    vmflt.vf v0, v9, fa5261; RV64-NEXT:    vsetvli zero, zero, e64, m1, ta, ma262; RV64-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t263; RV64-NEXT:    vfcvt.f.x.v v9, v9, v0.t264; RV64-NEXT:    vsetvli zero, zero, e64, m1, ta, mu265; RV64-NEXT:    vfsgnj.vv v8, v9, v8, v0.t266; RV64-NEXT:    ret267  %a = call <1 x double> @llvm.experimental.constrained.trunc.v1f64(<1 x double> %x, metadata !"fpexcept.strict")268  ret <1 x double> %a269}270 271define <2 x double> @trunc_v2f64(<2 x double> %x) strictfp {272; RV32-LABEL: trunc_v2f64:273; RV32:       # %bb.0:274; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu275; RV32-NEXT:    vmfne.vv v0, v8, v8276; RV32-NEXT:    lui a0, %hi(.LCPI12_0)277; RV32-NEXT:    fld fa5, %lo(.LCPI12_0)(a0)278; RV32-NEXT:    vfadd.vv v8, v8, v8, v0.t279; RV32-NEXT:    vfabs.v v9, v8280; RV32-NEXT:    vmflt.vf v0, v9, fa5281; RV32-NEXT:    vsetvli zero, zero, e64, m1, ta, ma282; RV32-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t283; RV32-NEXT:    vfcvt.f.x.v v9, v9, v0.t284; RV32-NEXT:    vsetvli zero, zero, e64, m1, ta, mu285; RV32-NEXT:    vfsgnj.vv v8, v9, v8, v0.t286; RV32-NEXT:    ret287;288; RV64-LABEL: trunc_v2f64:289; RV64:       # %bb.0:290; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, mu291; RV64-NEXT:    vmfne.vv v0, v8, v8292; RV64-NEXT:    li a0, 1075293; RV64-NEXT:    vfadd.vv v8, v8, v8, v0.t294; RV64-NEXT:    slli a0, a0, 52295; RV64-NEXT:    vfabs.v v9, v8296; RV64-NEXT:    fmv.d.x fa5, a0297; RV64-NEXT:    vmflt.vf v0, v9, fa5298; RV64-NEXT:    vsetvli zero, zero, e64, m1, ta, ma299; RV64-NEXT:    vfcvt.rtz.x.f.v v9, v8, v0.t300; RV64-NEXT:    vfcvt.f.x.v v9, v9, v0.t301; RV64-NEXT:    vsetvli zero, zero, e64, m1, ta, mu302; RV64-NEXT:    vfsgnj.vv v8, v9, v8, v0.t303; RV64-NEXT:    ret304  %a = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double> %x, metadata !"fpexcept.strict")305  ret <2 x double> %a306}307 308define <4 x double> @trunc_v4f64(<4 x double> %x) strictfp {309; RV32-LABEL: trunc_v4f64:310; RV32:       # %bb.0:311; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, mu312; RV32-NEXT:    vmfne.vv v0, v8, v8313; RV32-NEXT:    lui a0, %hi(.LCPI13_0)314; RV32-NEXT:    fld fa5, %lo(.LCPI13_0)(a0)315; RV32-NEXT:    vfadd.vv v8, v8, v8, v0.t316; RV32-NEXT:    vfabs.v v10, v8317; RV32-NEXT:    vmflt.vf v0, v10, fa5318; RV32-NEXT:    vsetvli zero, zero, e64, m2, ta, ma319; RV32-NEXT:    vfcvt.rtz.x.f.v v10, v8, v0.t320; RV32-NEXT:    vfcvt.f.x.v v10, v10, v0.t321; RV32-NEXT:    vsetvli zero, zero, e64, m2, ta, mu322; RV32-NEXT:    vfsgnj.vv v8, v10, v8, v0.t323; RV32-NEXT:    ret324;325; RV64-LABEL: trunc_v4f64:326; RV64:       # %bb.0:327; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, mu328; RV64-NEXT:    vmfne.vv v0, v8, v8329; RV64-NEXT:    li a0, 1075330; RV64-NEXT:    vfadd.vv v8, v8, v8, v0.t331; RV64-NEXT:    slli a0, a0, 52332; RV64-NEXT:    vfabs.v v10, v8333; RV64-NEXT:    fmv.d.x fa5, a0334; RV64-NEXT:    vmflt.vf v0, v10, fa5335; RV64-NEXT:    vsetvli zero, zero, e64, m2, ta, ma336; RV64-NEXT:    vfcvt.rtz.x.f.v v10, v8, v0.t337; RV64-NEXT:    vfcvt.f.x.v v10, v10, v0.t338; RV64-NEXT:    vsetvli zero, zero, e64, m2, ta, mu339; RV64-NEXT:    vfsgnj.vv v8, v10, v8, v0.t340; RV64-NEXT:    ret341  %a = call <4 x double> @llvm.experimental.constrained.trunc.v4f64(<4 x double> %x, metadata !"fpexcept.strict")342  ret <4 x double> %a343}344 345define <8 x double> @trunc_v8f64(<8 x double> %x) strictfp {346; RV32-LABEL: trunc_v8f64:347; RV32:       # %bb.0:348; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, mu349; RV32-NEXT:    vmfne.vv v0, v8, v8350; RV32-NEXT:    lui a0, %hi(.LCPI14_0)351; RV32-NEXT:    fld fa5, %lo(.LCPI14_0)(a0)352; RV32-NEXT:    vfadd.vv v8, v8, v8, v0.t353; RV32-NEXT:    vfabs.v v12, v8354; RV32-NEXT:    vmflt.vf v0, v12, fa5355; RV32-NEXT:    vsetvli zero, zero, e64, m4, ta, ma356; RV32-NEXT:    vfcvt.rtz.x.f.v v12, v8, v0.t357; RV32-NEXT:    vfcvt.f.x.v v12, v12, v0.t358; RV32-NEXT:    vsetvli zero, zero, e64, m4, ta, mu359; RV32-NEXT:    vfsgnj.vv v8, v12, v8, v0.t360; RV32-NEXT:    ret361;362; RV64-LABEL: trunc_v8f64:363; RV64:       # %bb.0:364; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, mu365; RV64-NEXT:    vmfne.vv v0, v8, v8366; RV64-NEXT:    li a0, 1075367; RV64-NEXT:    vfadd.vv v8, v8, v8, v0.t368; RV64-NEXT:    slli a0, a0, 52369; RV64-NEXT:    vfabs.v v12, v8370; RV64-NEXT:    fmv.d.x fa5, a0371; RV64-NEXT:    vmflt.vf v0, v12, fa5372; RV64-NEXT:    vsetvli zero, zero, e64, m4, ta, ma373; RV64-NEXT:    vfcvt.rtz.x.f.v v12, v8, v0.t374; RV64-NEXT:    vfcvt.f.x.v v12, v12, v0.t375; RV64-NEXT:    vsetvli zero, zero, e64, m4, ta, mu376; RV64-NEXT:    vfsgnj.vv v8, v12, v8, v0.t377; RV64-NEXT:    ret378  %a = call <8 x double> @llvm.experimental.constrained.trunc.v8f64(<8 x double> %x, metadata !"fpexcept.strict")379  ret <8 x double> %a380}381