253 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8define i32 @f16_to_s32(half %x) {9; CHECK-LABEL: f16_to_s32:10; CHECK: // %bb.0: // %entry11; CHECK-NEXT: ptrue p0.s12; CHECK-NEXT: // kill: def $h0 killed $h0 def $z013; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h14; CHECK-NEXT: fmov w0, s015; CHECK-NEXT: ret16;17; NONEON-NOSVE-LABEL: f16_to_s32:18; NONEON-NOSVE: // %bb.0: // %entry19; NONEON-NOSVE-NEXT: fcvt s0, h020; NONEON-NOSVE-NEXT: fcvtzs w0, s021; NONEON-NOSVE-NEXT: ret22 entry:23 %cvt = fptosi half %x to i3224 ret i32 %cvt25}26 27define i64 @f16_to_s64(half %x) {28; CHECK-LABEL: f16_to_s64:29; CHECK: // %bb.0: // %entry30; CHECK-NEXT: ptrue p0.d31; CHECK-NEXT: // kill: def $h0 killed $h0 def $z032; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h33; CHECK-NEXT: fmov x0, d034; CHECK-NEXT: ret35;36; NONEON-NOSVE-LABEL: f16_to_s64:37; NONEON-NOSVE: // %bb.0: // %entry38; NONEON-NOSVE-NEXT: fcvt s0, h039; NONEON-NOSVE-NEXT: fcvtzs x0, s040; NONEON-NOSVE-NEXT: ret41 entry:42 %cvt = fptosi half %x to i6443 ret i64 %cvt44}45 46define i32 @f32_to_s32(float %x) {47; CHECK-LABEL: f32_to_s32:48; CHECK: // %bb.0: // %entry49; CHECK-NEXT: ptrue p0.s50; CHECK-NEXT: // kill: def $s0 killed $s0 def $z051; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s52; CHECK-NEXT: fmov w0, s053; CHECK-NEXT: ret54;55; NONEON-NOSVE-LABEL: f32_to_s32:56; NONEON-NOSVE: // %bb.0: // %entry57; NONEON-NOSVE-NEXT: fcvtzs w0, s058; NONEON-NOSVE-NEXT: ret59 entry:60 %cvt = fptosi float %x to i3261 ret i32 %cvt62}63 64define i64 @f32_to_s64(float %x) {65; CHECK-LABEL: f32_to_s64:66; CHECK: // %bb.0: // %entry67; CHECK-NEXT: ptrue p0.d68; CHECK-NEXT: // kill: def $s0 killed $s0 def $z069; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.s70; CHECK-NEXT: fmov x0, d071; CHECK-NEXT: ret72;73; NONEON-NOSVE-LABEL: f32_to_s64:74; NONEON-NOSVE: // %bb.0: // %entry75; NONEON-NOSVE-NEXT: fcvtzs x0, s076; NONEON-NOSVE-NEXT: ret77 entry:78 %cvt = fptosi float %x to i6479 ret i64 %cvt80}81 82define i32 @f64_to_s32(double %x) {83; CHECK-LABEL: f64_to_s32:84; CHECK: // %bb.0: // %entry85; CHECK-NEXT: fcvtzs w0, d086; CHECK-NEXT: ret87;88; NONEON-NOSVE-LABEL: f64_to_s32:89; NONEON-NOSVE: // %bb.0: // %entry90; NONEON-NOSVE-NEXT: fcvtzs w0, d091; NONEON-NOSVE-NEXT: ret92 entry:93 %cvt = fptosi double %x to i3294 ret i32 %cvt95}96 97define i64 @f64_to_s64(double %x) {98; CHECK-LABEL: f64_to_s64:99; CHECK: // %bb.0: // %entry100; CHECK-NEXT: ptrue p0.d101; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0102; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d103; CHECK-NEXT: fmov x0, d0104; CHECK-NEXT: ret105;106; NONEON-NOSVE-LABEL: f64_to_s64:107; NONEON-NOSVE: // %bb.0: // %entry108; NONEON-NOSVE-NEXT: fcvtzs x0, d0109; NONEON-NOSVE-NEXT: ret110 entry:111 %cvt = fptosi double %x to i64112 ret i64 %cvt113}114 115define i32 @f16_to_u32(half %x) {116; CHECK-LABEL: f16_to_u32:117; CHECK: // %bb.0: // %entry118; CHECK-NEXT: ptrue p0.s119; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0120; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h121; CHECK-NEXT: fmov w0, s0122; CHECK-NEXT: ret123;124; NONEON-NOSVE-LABEL: f16_to_u32:125; NONEON-NOSVE: // %bb.0: // %entry126; NONEON-NOSVE-NEXT: fcvt s0, h0127; NONEON-NOSVE-NEXT: fcvtzu w0, s0128; NONEON-NOSVE-NEXT: ret129 entry:130 %cvt = fptoui half %x to i32131 ret i32 %cvt132}133 134define i64 @f16_to_u64(half %x) {135; CHECK-LABEL: f16_to_u64:136; CHECK: // %bb.0: // %entry137; CHECK-NEXT: ptrue p0.d138; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0139; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h140; CHECK-NEXT: fmov x0, d0141; CHECK-NEXT: ret142;143; NONEON-NOSVE-LABEL: f16_to_u64:144; NONEON-NOSVE: // %bb.0: // %entry145; NONEON-NOSVE-NEXT: fcvt s0, h0146; NONEON-NOSVE-NEXT: fcvtzu x0, s0147; NONEON-NOSVE-NEXT: ret148 entry:149 %cvt = fptoui half %x to i64150 ret i64 %cvt151}152 153define i32 @f32_to_u32(float %x) {154; CHECK-LABEL: f32_to_u32:155; CHECK: // %bb.0: // %entry156; CHECK-NEXT: ptrue p0.s157; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0158; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s159; CHECK-NEXT: fmov w0, s0160; CHECK-NEXT: ret161;162; NONEON-NOSVE-LABEL: f32_to_u32:163; NONEON-NOSVE: // %bb.0: // %entry164; NONEON-NOSVE-NEXT: fcvtzu w0, s0165; NONEON-NOSVE-NEXT: ret166 entry:167 %cvt = fptoui float %x to i32168 ret i32 %cvt169}170 171define i64 @f32_to_u64(float %x) {172; CHECK-LABEL: f32_to_u64:173; CHECK: // %bb.0: // %entry174; CHECK-NEXT: ptrue p0.d175; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0176; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.s177; CHECK-NEXT: fmov x0, d0178; CHECK-NEXT: ret179;180; NONEON-NOSVE-LABEL: f32_to_u64:181; NONEON-NOSVE: // %bb.0: // %entry182; NONEON-NOSVE-NEXT: fcvtzu x0, s0183; NONEON-NOSVE-NEXT: ret184 entry:185 %cvt = fptoui float %x to i64186 ret i64 %cvt187}188 189define i32 @f64_to_u32(double %x) {190; CHECK-LABEL: f64_to_u32:191; CHECK: // %bb.0: // %entry192; CHECK-NEXT: fcvtzu w0, d0193; CHECK-NEXT: ret194;195; NONEON-NOSVE-LABEL: f64_to_u32:196; NONEON-NOSVE: // %bb.0: // %entry197; NONEON-NOSVE-NEXT: fcvtzu w0, d0198; NONEON-NOSVE-NEXT: ret199 entry:200 %cvt = fptoui double %x to i32201 ret i32 %cvt202}203 204define i64 @f64_to_u64(double %x) {205; CHECK-LABEL: f64_to_u64:206; CHECK: // %bb.0: // %entry207; CHECK-NEXT: ptrue p0.d208; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0209; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d210; CHECK-NEXT: fmov x0, d0211; CHECK-NEXT: ret212;213; NONEON-NOSVE-LABEL: f64_to_u64:214; NONEON-NOSVE: // %bb.0: // %entry215; NONEON-NOSVE-NEXT: fcvtzu x0, d0216; NONEON-NOSVE-NEXT: ret217 entry:218 %cvt = fptoui double %x to i64219 ret i64 %cvt220}221 222define i32 @strict_convert_signed(double %x) {223; CHECK-LABEL: strict_convert_signed:224; CHECK: // %bb.0: // %entry225; CHECK-NEXT: fcvtzs w0, d0226; CHECK-NEXT: ret227;228; NONEON-NOSVE-LABEL: strict_convert_signed:229; NONEON-NOSVE: // %bb.0: // %entry230; NONEON-NOSVE-NEXT: fcvtzs w0, d0231; NONEON-NOSVE-NEXT: ret232 entry:233 %cvt = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %x, metadata !"fpexcept.strict") #0234 ret i32 %cvt235}236 237define i32 @strict_convert_unsigned(float %x) {238; CHECK-LABEL: strict_convert_unsigned:239; CHECK: // %bb.0: // %entry240; CHECK-NEXT: fcvtzu w0, s0241; CHECK-NEXT: ret242;243; NONEON-NOSVE-LABEL: strict_convert_unsigned:244; NONEON-NOSVE: // %bb.0: // %entry245; NONEON-NOSVE-NEXT: fcvtzu w0, s0246; NONEON-NOSVE-NEXT: ret247 entry:248 %cvt = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %x, metadata !"fpexcept.strict") #0249 ret i32 %cvt250}251 252attributes #0 = { strictfp }253