5176 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-CVT,CHECK-SD-CVT3; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-FP16,CHECK-SD-FP164; RUN: llc < %s -mtriple=aarch64 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-CVT,CHECK-GI-CVT5; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-FP16,CHECK-GI-FP166 7; CHECK-GI: warning: Instruction selection used fallback path for test_signed_v4f32_v4i508; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_signed_v4f16_v4i509; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_signed_v8f16_v8i1910; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_signed_v8f16_v8i5011; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_signed_v8f16_v8i10012 13;14; Float to signed 32-bit -- Vector size variation15;16 17declare <1 x i32> @llvm.fptosi.sat.v1f32.v1i32 (<1 x float>)18declare <2 x i32> @llvm.fptosi.sat.v2f32.v2i32 (<2 x float>)19declare <3 x i32> @llvm.fptosi.sat.v3f32.v3i32 (<3 x float>)20declare <4 x i32> @llvm.fptosi.sat.v4f32.v4i32 (<4 x float>)21declare <5 x i32> @llvm.fptosi.sat.v5f32.v5i32 (<5 x float>)22declare <6 x i32> @llvm.fptosi.sat.v6f32.v6i32 (<6 x float>)23declare <7 x i32> @llvm.fptosi.sat.v7f32.v7i32 (<7 x float>)24declare <8 x i32> @llvm.fptosi.sat.v8f32.v8i32 (<8 x float>)25 26define <1 x i32> @test_signed_v1f32_v1i32(<1 x float> %f) {27; CHECK-SD-LABEL: test_signed_v1f32_v1i32:28; CHECK-SD: // %bb.0:29; CHECK-SD-NEXT: fcvtzs v0.2s, v0.2s30; CHECK-SD-NEXT: ret31;32; CHECK-GI-LABEL: test_signed_v1f32_v1i32:33; CHECK-GI: // %bb.0:34; CHECK-GI-NEXT: fcvtzs s0, s035; CHECK-GI-NEXT: ret36 %x = call <1 x i32> @llvm.fptosi.sat.v1f32.v1i32(<1 x float> %f)37 ret <1 x i32> %x38}39 40define <2 x i32> @test_signed_v2f32_v2i32(<2 x float> %f) {41; CHECK-LABEL: test_signed_v2f32_v2i32:42; CHECK: // %bb.0:43; CHECK-NEXT: fcvtzs v0.2s, v0.2s44; CHECK-NEXT: ret45 %x = call <2 x i32> @llvm.fptosi.sat.v2f32.v2i32(<2 x float> %f)46 ret <2 x i32> %x47}48 49define <3 x i32> @test_signed_v3f32_v3i32(<3 x float> %f) {50; CHECK-LABEL: test_signed_v3f32_v3i32:51; CHECK: // %bb.0:52; CHECK-NEXT: fcvtzs v0.4s, v0.4s53; CHECK-NEXT: ret54 %x = call <3 x i32> @llvm.fptosi.sat.v3f32.v3i32(<3 x float> %f)55 ret <3 x i32> %x56}57 58define <4 x i32> @test_signed_v4f32_v4i32(<4 x float> %f) {59; CHECK-LABEL: test_signed_v4f32_v4i32:60; CHECK: // %bb.0:61; CHECK-NEXT: fcvtzs v0.4s, v0.4s62; CHECK-NEXT: ret63 %x = call <4 x i32> @llvm.fptosi.sat.v4f32.v4i32(<4 x float> %f)64 ret <4 x i32> %x65}66 67define <5 x i32> @test_signed_v5f32_v5i32(<5 x float> %f) {68; CHECK-SD-LABEL: test_signed_v5f32_v5i32:69; CHECK-SD: // %bb.0:70; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q071; CHECK-SD-NEXT: // kill: def $s1 killed $s1 def $q172; CHECK-SD-NEXT: // kill: def $s2 killed $s2 def $q273; CHECK-SD-NEXT: // kill: def $s3 killed $s3 def $q374; CHECK-SD-NEXT: // kill: def $s4 killed $s4 def $q475; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]76; CHECK-SD-NEXT: fcvtzs v4.4s, v4.4s77; CHECK-SD-NEXT: mov v0.s[2], v2.s[0]78; CHECK-SD-NEXT: fmov w4, s479; CHECK-SD-NEXT: mov v0.s[3], v3.s[0]80; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s81; CHECK-SD-NEXT: mov w1, v0.s[1]82; CHECK-SD-NEXT: mov w2, v0.s[2]83; CHECK-SD-NEXT: mov w3, v0.s[3]84; CHECK-SD-NEXT: fmov w0, s085; CHECK-SD-NEXT: ret86;87; CHECK-GI-LABEL: test_signed_v5f32_v5i32:88; CHECK-GI: // %bb.0:89; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q090; CHECK-GI-NEXT: // kill: def $s1 killed $s1 def $q191; CHECK-GI-NEXT: // kill: def $s2 killed $s2 def $q292; CHECK-GI-NEXT: // kill: def $s3 killed $s3 def $q393; CHECK-GI-NEXT: // kill: def $s4 killed $s4 def $q494; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]95; CHECK-GI-NEXT: fcvtzs v1.4s, v4.4s96; CHECK-GI-NEXT: mov v0.s[2], v2.s[0]97; CHECK-GI-NEXT: fmov w4, s198; CHECK-GI-NEXT: mov v0.s[3], v3.s[0]99; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s100; CHECK-GI-NEXT: mov s2, v0.s[1]101; CHECK-GI-NEXT: mov s3, v0.s[2]102; CHECK-GI-NEXT: mov s4, v0.s[3]103; CHECK-GI-NEXT: fmov w0, s0104; CHECK-GI-NEXT: fmov w1, s2105; CHECK-GI-NEXT: fmov w2, s3106; CHECK-GI-NEXT: fmov w3, s4107; CHECK-GI-NEXT: ret108 %x = call <5 x i32> @llvm.fptosi.sat.v5f32.v5i32(<5 x float> %f)109 ret <5 x i32> %x110}111 112define <6 x i32> @test_signed_v6f32_v6i32(<6 x float> %f) {113; CHECK-SD-LABEL: test_signed_v6f32_v6i32:114; CHECK-SD: // %bb.0:115; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0116; CHECK-SD-NEXT: // kill: def $s1 killed $s1 def $q1117; CHECK-SD-NEXT: // kill: def $s2 killed $s2 def $q2118; CHECK-SD-NEXT: // kill: def $s4 killed $s4 def $q4119; CHECK-SD-NEXT: // kill: def $s5 killed $s5 def $q5120; CHECK-SD-NEXT: // kill: def $s3 killed $s3 def $q3121; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]122; CHECK-SD-NEXT: mov v4.s[1], v5.s[0]123; CHECK-SD-NEXT: mov v0.s[2], v2.s[0]124; CHECK-SD-NEXT: fcvtzs v1.4s, v4.4s125; CHECK-SD-NEXT: mov v0.s[3], v3.s[0]126; CHECK-SD-NEXT: mov w5, v1.s[1]127; CHECK-SD-NEXT: fmov w4, s1128; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s129; CHECK-SD-NEXT: mov w1, v0.s[1]130; CHECK-SD-NEXT: mov w2, v0.s[2]131; CHECK-SD-NEXT: mov w3, v0.s[3]132; CHECK-SD-NEXT: fmov w0, s0133; CHECK-SD-NEXT: ret134;135; CHECK-GI-LABEL: test_signed_v6f32_v6i32:136; CHECK-GI: // %bb.0:137; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0138; CHECK-GI-NEXT: // kill: def $s1 killed $s1 def $q1139; CHECK-GI-NEXT: // kill: def $s2 killed $s2 def $q2140; CHECK-GI-NEXT: // kill: def $s4 killed $s4 def $q4141; CHECK-GI-NEXT: // kill: def $s3 killed $s3 def $q3142; CHECK-GI-NEXT: // kill: def $s5 killed $s5 def $q5143; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]144; CHECK-GI-NEXT: mov v4.s[1], v5.s[0]145; CHECK-GI-NEXT: mov v0.s[2], v2.s[0]146; CHECK-GI-NEXT: fcvtzs v1.4s, v4.4s147; CHECK-GI-NEXT: mov v0.s[3], v3.s[0]148; CHECK-GI-NEXT: mov s4, v1.s[1]149; CHECK-GI-NEXT: fmov w4, s1150; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s151; CHECK-GI-NEXT: fmov w5, s4152; CHECK-GI-NEXT: mov s2, v0.s[1]153; CHECK-GI-NEXT: mov s3, v0.s[2]154; CHECK-GI-NEXT: mov s5, v0.s[3]155; CHECK-GI-NEXT: fmov w0, s0156; CHECK-GI-NEXT: fmov w1, s2157; CHECK-GI-NEXT: fmov w2, s3158; CHECK-GI-NEXT: fmov w3, s5159; CHECK-GI-NEXT: ret160 %x = call <6 x i32> @llvm.fptosi.sat.v6f32.v6i32(<6 x float> %f)161 ret <6 x i32> %x162}163 164define <7 x i32> @test_signed_v7f32_v7i32(<7 x float> %f) {165; CHECK-SD-LABEL: test_signed_v7f32_v7i32:166; CHECK-SD: // %bb.0:167; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0168; CHECK-SD-NEXT: // kill: def $s1 killed $s1 def $q1169; CHECK-SD-NEXT: // kill: def $s4 killed $s4 def $q4170; CHECK-SD-NEXT: // kill: def $s5 killed $s5 def $q5171; CHECK-SD-NEXT: // kill: def $s2 killed $s2 def $q2172; CHECK-SD-NEXT: // kill: def $s6 killed $s6 def $q6173; CHECK-SD-NEXT: // kill: def $s3 killed $s3 def $q3174; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]175; CHECK-SD-NEXT: mov v4.s[1], v5.s[0]176; CHECK-SD-NEXT: mov v0.s[2], v2.s[0]177; CHECK-SD-NEXT: mov v4.s[2], v6.s[0]178; CHECK-SD-NEXT: mov v0.s[3], v3.s[0]179; CHECK-SD-NEXT: fcvtzs v1.4s, v4.4s180; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s181; CHECK-SD-NEXT: mov w5, v1.s[1]182; CHECK-SD-NEXT: mov w6, v1.s[2]183; CHECK-SD-NEXT: fmov w4, s1184; CHECK-SD-NEXT: mov w1, v0.s[1]185; CHECK-SD-NEXT: mov w2, v0.s[2]186; CHECK-SD-NEXT: mov w3, v0.s[3]187; CHECK-SD-NEXT: fmov w0, s0188; CHECK-SD-NEXT: ret189;190; CHECK-GI-LABEL: test_signed_v7f32_v7i32:191; CHECK-GI: // %bb.0:192; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0193; CHECK-GI-NEXT: // kill: def $s1 killed $s1 def $q1194; CHECK-GI-NEXT: // kill: def $s4 killed $s4 def $q4195; CHECK-GI-NEXT: // kill: def $s2 killed $s2 def $q2196; CHECK-GI-NEXT: // kill: def $s5 killed $s5 def $q5197; CHECK-GI-NEXT: // kill: def $s3 killed $s3 def $q3198; CHECK-GI-NEXT: // kill: def $s6 killed $s6 def $q6199; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]200; CHECK-GI-NEXT: mov v4.s[1], v5.s[0]201; CHECK-GI-NEXT: mov v0.s[2], v2.s[0]202; CHECK-GI-NEXT: mov v4.s[2], v6.s[0]203; CHECK-GI-NEXT: mov v0.s[3], v3.s[0]204; CHECK-GI-NEXT: fcvtzs v1.4s, v4.4s205; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s206; CHECK-GI-NEXT: mov s5, v1.s[1]207; CHECK-GI-NEXT: mov s6, v1.s[2]208; CHECK-GI-NEXT: fmov w4, s1209; CHECK-GI-NEXT: mov s2, v0.s[1]210; CHECK-GI-NEXT: mov s3, v0.s[2]211; CHECK-GI-NEXT: mov s4, v0.s[3]212; CHECK-GI-NEXT: fmov w0, s0213; CHECK-GI-NEXT: fmov w5, s5214; CHECK-GI-NEXT: fmov w6, s6215; CHECK-GI-NEXT: fmov w1, s2216; CHECK-GI-NEXT: fmov w2, s3217; CHECK-GI-NEXT: fmov w3, s4218; CHECK-GI-NEXT: ret219 %x = call <7 x i32> @llvm.fptosi.sat.v7f32.v7i32(<7 x float> %f)220 ret <7 x i32> %x221}222 223define <8 x i32> @test_signed_v8f32_v8i32(<8 x float> %f) {224; CHECK-LABEL: test_signed_v8f32_v8i32:225; CHECK: // %bb.0:226; CHECK-NEXT: fcvtzs v0.4s, v0.4s227; CHECK-NEXT: fcvtzs v1.4s, v1.4s228; CHECK-NEXT: ret229 %x = call <8 x i32> @llvm.fptosi.sat.v8f32.v8i32(<8 x float> %f)230 ret <8 x i32> %x231}232 233;234; Double to signed 32-bit -- Vector size variation235;236 237declare <1 x i32> @llvm.fptosi.sat.v1f64.v1i32 (<1 x double>)238declare <2 x i32> @llvm.fptosi.sat.v2f64.v2i32 (<2 x double>)239declare <3 x i32> @llvm.fptosi.sat.v3f64.v3i32 (<3 x double>)240declare <4 x i32> @llvm.fptosi.sat.v4f64.v4i32 (<4 x double>)241declare <5 x i32> @llvm.fptosi.sat.v5f64.v5i32 (<5 x double>)242declare <6 x i32> @llvm.fptosi.sat.v6f64.v6i32 (<6 x double>)243 244define <1 x i32> @test_signed_v1f64_v1i32(<1 x double> %f) {245; CHECK-LABEL: test_signed_v1f64_v1i32:246; CHECK: // %bb.0:247; CHECK-NEXT: fcvtzs w8, d0248; CHECK-NEXT: fmov s0, w8249; CHECK-NEXT: ret250 %x = call <1 x i32> @llvm.fptosi.sat.v1f64.v1i32(<1 x double> %f)251 ret <1 x i32> %x252}253 254define <2 x i32> @test_signed_v2f64_v2i32(<2 x double> %f) {255; CHECK-SD-LABEL: test_signed_v2f64_v2i32:256; CHECK-SD: // %bb.0:257; CHECK-SD-NEXT: mov d1, v0.d[1]258; CHECK-SD-NEXT: fcvtzs w8, d0259; CHECK-SD-NEXT: fcvtzs w9, d1260; CHECK-SD-NEXT: fmov s0, w8261; CHECK-SD-NEXT: mov v0.s[1], w9262; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0263; CHECK-SD-NEXT: ret264;265; CHECK-GI-LABEL: test_signed_v2f64_v2i32:266; CHECK-GI: // %bb.0:267; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d268; CHECK-GI-NEXT: adrp x8, .LCPI9_1269; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI9_1]270; CHECK-GI-NEXT: adrp x8, .LCPI9_0271; CHECK-GI-NEXT: cmgt v2.2d, v1.2d, v0.2d272; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b273; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI9_0]274; CHECK-GI-NEXT: cmgt v2.2d, v0.2d, v1.2d275; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b276; CHECK-GI-NEXT: xtn v0.2s, v0.2d277; CHECK-GI-NEXT: ret278 %x = call <2 x i32> @llvm.fptosi.sat.v2f64.v2i32(<2 x double> %f)279 ret <2 x i32> %x280}281 282define <3 x i32> @test_signed_v3f64_v3i32(<3 x double> %f) {283; CHECK-SD-LABEL: test_signed_v3f64_v3i32:284; CHECK-SD: // %bb.0:285; CHECK-SD-NEXT: fcvtzs w8, d0286; CHECK-SD-NEXT: fcvtzs w9, d1287; CHECK-SD-NEXT: fmov s0, w8288; CHECK-SD-NEXT: fcvtzs w8, d2289; CHECK-SD-NEXT: mov v0.s[1], w9290; CHECK-SD-NEXT: mov v0.s[2], w8291; CHECK-SD-NEXT: fcvtzs w8, d0292; CHECK-SD-NEXT: mov v0.s[3], w8293; CHECK-SD-NEXT: ret294;295; CHECK-GI-LABEL: test_signed_v3f64_v3i32:296; CHECK-GI: // %bb.0:297; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0298; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1299; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2300; CHECK-GI-NEXT: adrp x8, .LCPI10_1301; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]302; CHECK-GI-NEXT: fcvtzs v1.2d, v2.2d303; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI10_1]304; CHECK-GI-NEXT: adrp x8, .LCPI10_0305; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d306; CHECK-GI-NEXT: cmgt v4.2d, v2.2d, v1.2d307; CHECK-GI-NEXT: bif v1.16b, v2.16b, v4.16b308; CHECK-GI-NEXT: cmgt v3.2d, v2.2d, v0.2d309; CHECK-GI-NEXT: bif v0.16b, v2.16b, v3.16b310; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI10_0]311; CHECK-GI-NEXT: cmgt v4.2d, v1.2d, v2.2d312; CHECK-GI-NEXT: cmgt v3.2d, v0.2d, v2.2d313; CHECK-GI-NEXT: bif v1.16b, v2.16b, v4.16b314; CHECK-GI-NEXT: bif v0.16b, v2.16b, v3.16b315; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s316; CHECK-GI-NEXT: ret317 %x = call <3 x i32> @llvm.fptosi.sat.v3f64.v3i32(<3 x double> %f)318 ret <3 x i32> %x319}320 321define <4 x i32> @test_signed_v4f64_v4i32(<4 x double> %f) {322; CHECK-SD-LABEL: test_signed_v4f64_v4i32:323; CHECK-SD: // %bb.0:324; CHECK-SD-NEXT: mov d2, v0.d[1]325; CHECK-SD-NEXT: fcvtzs w8, d0326; CHECK-SD-NEXT: fcvtzs w9, d2327; CHECK-SD-NEXT: fmov s0, w8328; CHECK-SD-NEXT: fcvtzs w8, d1329; CHECK-SD-NEXT: mov d1, v1.d[1]330; CHECK-SD-NEXT: mov v0.s[1], w9331; CHECK-SD-NEXT: mov v0.s[2], w8332; CHECK-SD-NEXT: fcvtzs w8, d1333; CHECK-SD-NEXT: mov v0.s[3], w8334; CHECK-SD-NEXT: ret335;336; CHECK-GI-LABEL: test_signed_v4f64_v4i32:337; CHECK-GI: // %bb.0:338; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d339; CHECK-GI-NEXT: fcvtzs v1.2d, v1.2d340; CHECK-GI-NEXT: adrp x8, .LCPI11_1341; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI11_1]342; CHECK-GI-NEXT: adrp x8, .LCPI11_0343; CHECK-GI-NEXT: cmgt v3.2d, v2.2d, v0.2d344; CHECK-GI-NEXT: cmgt v4.2d, v2.2d, v1.2d345; CHECK-GI-NEXT: bif v0.16b, v2.16b, v3.16b346; CHECK-GI-NEXT: bif v1.16b, v2.16b, v4.16b347; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI11_0]348; CHECK-GI-NEXT: cmgt v3.2d, v0.2d, v2.2d349; CHECK-GI-NEXT: cmgt v4.2d, v1.2d, v2.2d350; CHECK-GI-NEXT: bif v0.16b, v2.16b, v3.16b351; CHECK-GI-NEXT: bif v1.16b, v2.16b, v4.16b352; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s353; CHECK-GI-NEXT: ret354 %x = call <4 x i32> @llvm.fptosi.sat.v4f64.v4i32(<4 x double> %f)355 ret <4 x i32> %x356}357 358define <5 x i32> @test_signed_v5f64_v5i32(<5 x double> %f) {359; CHECK-SD-LABEL: test_signed_v5f64_v5i32:360; CHECK-SD: // %bb.0:361; CHECK-SD-NEXT: fcvtzs w0, d0362; CHECK-SD-NEXT: fcvtzs w1, d1363; CHECK-SD-NEXT: fcvtzs w2, d2364; CHECK-SD-NEXT: fcvtzs w3, d3365; CHECK-SD-NEXT: fcvtzs w4, d4366; CHECK-SD-NEXT: ret367;368; CHECK-GI-LABEL: test_signed_v5f64_v5i32:369; CHECK-GI: // %bb.0:370; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0371; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2372; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1373; CHECK-GI-NEXT: // kill: def $d3 killed $d3 def $q3374; CHECK-GI-NEXT: adrp x8, .LCPI12_1375; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4376; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]377; CHECK-GI-NEXT: mov v2.d[1], v3.d[0]378; CHECK-GI-NEXT: fcvtzs v3.2d, v4.2d379; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d380; CHECK-GI-NEXT: fcvtzs v1.2d, v2.2d381; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI12_1]382; CHECK-GI-NEXT: adrp x8, .LCPI12_0383; CHECK-GI-NEXT: cmgt v6.2d, v2.2d, v3.2d384; CHECK-GI-NEXT: cmgt v4.2d, v2.2d, v0.2d385; CHECK-GI-NEXT: cmgt v5.2d, v2.2d, v1.2d386; CHECK-GI-NEXT: bif v0.16b, v2.16b, v4.16b387; CHECK-GI-NEXT: bif v1.16b, v2.16b, v5.16b388; CHECK-GI-NEXT: ldr q4, [x8, :lo12:.LCPI12_0]389; CHECK-GI-NEXT: bit v2.16b, v3.16b, v6.16b390; CHECK-GI-NEXT: cmgt v3.2d, v0.2d, v4.2d391; CHECK-GI-NEXT: cmgt v5.2d, v1.2d, v4.2d392; CHECK-GI-NEXT: cmgt v6.2d, v2.2d, v4.2d393; CHECK-GI-NEXT: bif v0.16b, v4.16b, v3.16b394; CHECK-GI-NEXT: bif v1.16b, v4.16b, v5.16b395; CHECK-GI-NEXT: bif v2.16b, v4.16b, v6.16b396; CHECK-GI-NEXT: mov d3, v0.d[1]397; CHECK-GI-NEXT: mov d4, v1.d[1]398; CHECK-GI-NEXT: fmov x0, d0399; CHECK-GI-NEXT: fmov x4, d2400; CHECK-GI-NEXT: fmov x2, d1401; CHECK-GI-NEXT: // kill: def $w0 killed $w0 killed $x0402; CHECK-GI-NEXT: // kill: def $w2 killed $w2 killed $x2403; CHECK-GI-NEXT: // kill: def $w4 killed $w4 killed $x4404; CHECK-GI-NEXT: fmov x1, d3405; CHECK-GI-NEXT: fmov x3, d4406; CHECK-GI-NEXT: // kill: def $w1 killed $w1 killed $x1407; CHECK-GI-NEXT: // kill: def $w3 killed $w3 killed $x3408; CHECK-GI-NEXT: ret409 %x = call <5 x i32> @llvm.fptosi.sat.v5f64.v5i32(<5 x double> %f)410 ret <5 x i32> %x411}412 413define <6 x i32> @test_signed_v6f64_v6i32(<6 x double> %f) {414; CHECK-SD-LABEL: test_signed_v6f64_v6i32:415; CHECK-SD: // %bb.0:416; CHECK-SD-NEXT: fcvtzs w0, d0417; CHECK-SD-NEXT: fcvtzs w1, d1418; CHECK-SD-NEXT: fcvtzs w2, d2419; CHECK-SD-NEXT: fcvtzs w3, d3420; CHECK-SD-NEXT: fcvtzs w4, d4421; CHECK-SD-NEXT: fcvtzs w5, d5422; CHECK-SD-NEXT: ret423;424; CHECK-GI-LABEL: test_signed_v6f64_v6i32:425; CHECK-GI: // %bb.0:426; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0427; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2428; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4429; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1430; CHECK-GI-NEXT: // kill: def $d3 killed $d3 def $q3431; CHECK-GI-NEXT: // kill: def $d5 killed $d5 def $q5432; CHECK-GI-NEXT: adrp x8, .LCPI13_1433; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]434; CHECK-GI-NEXT: mov v2.d[1], v3.d[0]435; CHECK-GI-NEXT: mov v4.d[1], v5.d[0]436; CHECK-GI-NEXT: ldr q3, [x8, :lo12:.LCPI13_1]437; CHECK-GI-NEXT: adrp x8, .LCPI13_0438; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d439; CHECK-GI-NEXT: fcvtzs v1.2d, v2.2d440; CHECK-GI-NEXT: fcvtzs v2.2d, v4.2d441; CHECK-GI-NEXT: cmgt v4.2d, v3.2d, v0.2d442; CHECK-GI-NEXT: cmgt v5.2d, v3.2d, v1.2d443; CHECK-GI-NEXT: cmgt v6.2d, v3.2d, v2.2d444; CHECK-GI-NEXT: bif v0.16b, v3.16b, v4.16b445; CHECK-GI-NEXT: bif v1.16b, v3.16b, v5.16b446; CHECK-GI-NEXT: bif v2.16b, v3.16b, v6.16b447; CHECK-GI-NEXT: ldr q3, [x8, :lo12:.LCPI13_0]448; CHECK-GI-NEXT: cmgt v4.2d, v0.2d, v3.2d449; CHECK-GI-NEXT: cmgt v5.2d, v1.2d, v3.2d450; CHECK-GI-NEXT: cmgt v6.2d, v2.2d, v3.2d451; CHECK-GI-NEXT: bif v0.16b, v3.16b, v4.16b452; CHECK-GI-NEXT: bif v1.16b, v3.16b, v5.16b453; CHECK-GI-NEXT: bif v2.16b, v3.16b, v6.16b454; CHECK-GI-NEXT: mov d3, v0.d[1]455; CHECK-GI-NEXT: mov d4, v1.d[1]456; CHECK-GI-NEXT: mov d5, v2.d[1]457; CHECK-GI-NEXT: fmov x0, d0458; CHECK-GI-NEXT: fmov x2, d1459; CHECK-GI-NEXT: fmov x4, d2460; CHECK-GI-NEXT: // kill: def $w0 killed $w0 killed $x0461; CHECK-GI-NEXT: // kill: def $w2 killed $w2 killed $x2462; CHECK-GI-NEXT: // kill: def $w4 killed $w4 killed $x4463; CHECK-GI-NEXT: fmov x1, d3464; CHECK-GI-NEXT: fmov x3, d4465; CHECK-GI-NEXT: fmov x5, d5466; CHECK-GI-NEXT: // kill: def $w1 killed $w1 killed $x1467; CHECK-GI-NEXT: // kill: def $w3 killed $w3 killed $x3468; CHECK-GI-NEXT: // kill: def $w5 killed $w5 killed $x5469; CHECK-GI-NEXT: ret470 %x = call <6 x i32> @llvm.fptosi.sat.v6f64.v6i32(<6 x double> %f)471 ret <6 x i32> %x472}473 474;475; FP128 to signed 32-bit -- Vector size variation476;477 478declare <1 x i32> @llvm.fptosi.sat.v1f128.v1i32 (<1 x fp128>)479declare <2 x i32> @llvm.fptosi.sat.v2f128.v2i32 (<2 x fp128>)480declare <3 x i32> @llvm.fptosi.sat.v3f128.v3i32 (<3 x fp128>)481declare <4 x i32> @llvm.fptosi.sat.v4f128.v4i32 (<4 x fp128>)482 483define <1 x i32> @test_signed_v1f128_v1i32(<1 x fp128> %f) {484; CHECK-SD-LABEL: test_signed_v1f128_v1i32:485; CHECK-SD: // %bb.0:486; CHECK-SD-NEXT: sub sp, sp, #32487; CHECK-SD-NEXT: stp x30, x19, [sp, #16] // 16-byte Folded Spill488; CHECK-SD-NEXT: .cfi_def_cfa_offset 32489; CHECK-SD-NEXT: .cfi_offset w19, -8490; CHECK-SD-NEXT: .cfi_offset w30, -16491; CHECK-SD-NEXT: adrp x8, .LCPI14_0492; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill493; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI14_0]494; CHECK-SD-NEXT: bl __getf2495; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload496; CHECK-SD-NEXT: mov w19, w0497; CHECK-SD-NEXT: bl __fixtfsi498; CHECK-SD-NEXT: cmp w19, #0499; CHECK-SD-NEXT: mov w8, #-2147483648 // =0x80000000500; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload501; CHECK-SD-NEXT: csel w19, w8, w0, mi502; CHECK-SD-NEXT: adrp x8, .LCPI14_1503; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI14_1]504; CHECK-SD-NEXT: bl __gttf2505; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload506; CHECK-SD-NEXT: mov w8, #2147483647 // =0x7fffffff507; CHECK-SD-NEXT: cmp w0, #0508; CHECK-SD-NEXT: csel w19, w8, w19, gt509; CHECK-SD-NEXT: mov v1.16b, v0.16b510; CHECK-SD-NEXT: bl __unordtf2511; CHECK-SD-NEXT: cmp w0, #0512; CHECK-SD-NEXT: csel w8, wzr, w19, ne513; CHECK-SD-NEXT: ldp x30, x19, [sp, #16] // 16-byte Folded Reload514; CHECK-SD-NEXT: fmov s0, w8515; CHECK-SD-NEXT: add sp, sp, #32516; CHECK-SD-NEXT: ret517;518; CHECK-GI-LABEL: test_signed_v1f128_v1i32:519; CHECK-GI: // %bb.0:520; CHECK-GI-NEXT: sub sp, sp, #48521; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Spill522; CHECK-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill523; CHECK-GI-NEXT: .cfi_def_cfa_offset 48524; CHECK-GI-NEXT: .cfi_offset w19, -8525; CHECK-GI-NEXT: .cfi_offset w20, -16526; CHECK-GI-NEXT: .cfi_offset w30, -32527; CHECK-GI-NEXT: adrp x8, .LCPI14_1528; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill529; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI14_1]530; CHECK-GI-NEXT: bl __gttf2531; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload532; CHECK-GI-NEXT: cmp w0, #0533; CHECK-GI-NEXT: mov x9, #-4603241769126068224 // =0xc01e000000000000534; CHECK-GI-NEXT: fmov x8, d0535; CHECK-GI-NEXT: csel x19, x8, xzr, gt536; CHECK-GI-NEXT: mov x8, v0.d[1]537; CHECK-GI-NEXT: mov v0.d[0], x19538; CHECK-GI-NEXT: csel x20, x8, x9, gt539; CHECK-GI-NEXT: adrp x8, .LCPI14_0540; CHECK-GI-NEXT: mov v0.d[1], x20541; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI14_0]542; CHECK-GI-NEXT: bl __lttf2543; CHECK-GI-NEXT: cmp w0, #0544; CHECK-GI-NEXT: csel x8, x19, xzr, mi545; CHECK-GI-NEXT: mov v0.d[0], x8546; CHECK-GI-NEXT: mov x8, #281474976448512 // =0xfffffffc0000547; CHECK-GI-NEXT: movk x8, #16413, lsl #48548; CHECK-GI-NEXT: csel x8, x20, x8, mi549; CHECK-GI-NEXT: mov v0.d[1], x8550; CHECK-GI-NEXT: bl __fixtfsi551; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload552; CHECK-GI-NEXT: mov w19, w0553; CHECK-GI-NEXT: mov v1.16b, v0.16b554; CHECK-GI-NEXT: bl __unordtf2555; CHECK-GI-NEXT: cmp w0, #0556; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Reload557; CHECK-GI-NEXT: csel w8, wzr, w19, ne558; CHECK-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload559; CHECK-GI-NEXT: fmov s0, w8560; CHECK-GI-NEXT: add sp, sp, #48561; CHECK-GI-NEXT: ret562 %x = call <1 x i32> @llvm.fptosi.sat.v1f128.v1i32(<1 x fp128> %f)563 ret <1 x i32> %x564}565 566define <2 x i32> @test_signed_v2f128_v2i32(<2 x fp128> %f) {567; CHECK-SD-LABEL: test_signed_v2f128_v2i32:568; CHECK-SD: // %bb.0:569; CHECK-SD-NEXT: sub sp, sp, #112570; CHECK-SD-NEXT: str x30, [sp, #64] // 8-byte Spill571; CHECK-SD-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill572; CHECK-SD-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill573; CHECK-SD-NEXT: .cfi_def_cfa_offset 112574; CHECK-SD-NEXT: .cfi_offset w19, -8575; CHECK-SD-NEXT: .cfi_offset w20, -16576; CHECK-SD-NEXT: .cfi_offset w21, -24577; CHECK-SD-NEXT: .cfi_offset w22, -32578; CHECK-SD-NEXT: .cfi_offset w30, -48579; CHECK-SD-NEXT: mov v2.16b, v1.16b580; CHECK-SD-NEXT: stp q1, q0, [sp, #32] // 32-byte Folded Spill581; CHECK-SD-NEXT: adrp x8, .LCPI15_0582; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI15_0]583; CHECK-SD-NEXT: mov v0.16b, v2.16b584; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill585; CHECK-SD-NEXT: bl __getf2586; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload587; CHECK-SD-NEXT: mov w19, w0588; CHECK-SD-NEXT: bl __fixtfsi589; CHECK-SD-NEXT: adrp x8, .LCPI15_1590; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload591; CHECK-SD-NEXT: cmp w19, #0592; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI15_1]593; CHECK-SD-NEXT: mov w20, #-2147483648 // =0x80000000594; CHECK-SD-NEXT: csel w19, w20, w0, mi595; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill596; CHECK-SD-NEXT: bl __gttf2597; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload598; CHECK-SD-NEXT: mov w21, #2147483647 // =0x7fffffff599; CHECK-SD-NEXT: cmp w0, #0600; CHECK-SD-NEXT: csel w19, w21, w19, gt601; CHECK-SD-NEXT: mov v1.16b, v0.16b602; CHECK-SD-NEXT: bl __unordtf2603; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload604; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload605; CHECK-SD-NEXT: cmp w0, #0606; CHECK-SD-NEXT: csel w22, wzr, w19, ne607; CHECK-SD-NEXT: bl __getf2608; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload609; CHECK-SD-NEXT: mov w19, w0610; CHECK-SD-NEXT: bl __fixtfsi611; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload612; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload613; CHECK-SD-NEXT: cmp w19, #0614; CHECK-SD-NEXT: csel w19, w20, w0, mi615; CHECK-SD-NEXT: bl __gttf2616; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload617; CHECK-SD-NEXT: cmp w0, #0618; CHECK-SD-NEXT: csel w19, w21, w19, gt619; CHECK-SD-NEXT: mov v1.16b, v0.16b620; CHECK-SD-NEXT: bl __unordtf2621; CHECK-SD-NEXT: cmp w0, #0622; CHECK-SD-NEXT: ldr x30, [sp, #64] // 8-byte Reload623; CHECK-SD-NEXT: csel w8, wzr, w19, ne624; CHECK-SD-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload625; CHECK-SD-NEXT: fmov s0, w8626; CHECK-SD-NEXT: mov v0.s[1], w22627; CHECK-SD-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload628; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0629; CHECK-SD-NEXT: add sp, sp, #112630; CHECK-SD-NEXT: ret631;632; CHECK-GI-LABEL: test_signed_v2f128_v2i32:633; CHECK-GI: // %bb.0:634; CHECK-GI-NEXT: sub sp, sp, #112635; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Spill636; CHECK-GI-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill637; CHECK-GI-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill638; CHECK-GI-NEXT: .cfi_def_cfa_offset 112639; CHECK-GI-NEXT: .cfi_offset w19, -8640; CHECK-GI-NEXT: .cfi_offset w20, -16641; CHECK-GI-NEXT: .cfi_offset w21, -24642; CHECK-GI-NEXT: .cfi_offset w22, -32643; CHECK-GI-NEXT: .cfi_offset w30, -48644; CHECK-GI-NEXT: adrp x8, .LCPI15_1645; CHECK-GI-NEXT: str q1, [sp, #48] // 16-byte Spill646; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI15_1]647; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill648; CHECK-GI-NEXT: mov v1.16b, v2.16b649; CHECK-GI-NEXT: str q2, [sp, #16] // 16-byte Spill650; CHECK-GI-NEXT: bl __gttf2651; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload652; CHECK-GI-NEXT: cmp w0, #0653; CHECK-GI-NEXT: mov x20, #-4603241769126068224 // =0xc01e000000000000654; CHECK-GI-NEXT: fmov x8, d0655; CHECK-GI-NEXT: csel x19, x8, xzr, gt656; CHECK-GI-NEXT: mov x8, v0.d[1]657; CHECK-GI-NEXT: mov v0.d[0], x19658; CHECK-GI-NEXT: csel x21, x8, x20, gt659; CHECK-GI-NEXT: adrp x8, .LCPI15_0660; CHECK-GI-NEXT: mov v0.d[1], x21661; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI15_0]662; CHECK-GI-NEXT: str q1, [sp] // 16-byte Spill663; CHECK-GI-NEXT: bl __lttf2664; CHECK-GI-NEXT: cmp w0, #0665; CHECK-GI-NEXT: mov x22, #281474976448512 // =0xfffffffc0000666; CHECK-GI-NEXT: csel x8, x19, xzr, mi667; CHECK-GI-NEXT: movk x22, #16413, lsl #48668; CHECK-GI-NEXT: mov v0.d[0], x8669; CHECK-GI-NEXT: csel x8, x21, x22, mi670; CHECK-GI-NEXT: mov v0.d[1], x8671; CHECK-GI-NEXT: bl __fixtfsi672; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload673; CHECK-GI-NEXT: mov w19, w0674; CHECK-GI-NEXT: mov v1.16b, v0.16b675; CHECK-GI-NEXT: bl __unordtf2676; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload677; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Reload678; CHECK-GI-NEXT: cmp w0, #0679; CHECK-GI-NEXT: csel w21, wzr, w19, ne680; CHECK-GI-NEXT: bl __gttf2681; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload682; CHECK-GI-NEXT: cmp w0, #0683; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload684; CHECK-GI-NEXT: fmov x8, d0685; CHECK-GI-NEXT: csel x19, x8, xzr, gt686; CHECK-GI-NEXT: mov x8, v0.d[1]687; CHECK-GI-NEXT: mov v0.d[0], x19688; CHECK-GI-NEXT: csel x20, x8, x20, gt689; CHECK-GI-NEXT: mov v0.d[1], x20690; CHECK-GI-NEXT: bl __lttf2691; CHECK-GI-NEXT: cmp w0, #0692; CHECK-GI-NEXT: csel x8, x19, xzr, mi693; CHECK-GI-NEXT: mov v0.d[0], x8694; CHECK-GI-NEXT: csel x8, x20, x22, mi695; CHECK-GI-NEXT: mov v0.d[1], x8696; CHECK-GI-NEXT: bl __fixtfsi697; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload698; CHECK-GI-NEXT: mov w19, w0699; CHECK-GI-NEXT: mov v1.16b, v0.16b700; CHECK-GI-NEXT: bl __unordtf2701; CHECK-GI-NEXT: fmov s0, w21702; CHECK-GI-NEXT: cmp w0, #0703; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Reload704; CHECK-GI-NEXT: csel w8, wzr, w19, ne705; CHECK-GI-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload706; CHECK-GI-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload707; CHECK-GI-NEXT: mov v0.s[1], w8708; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0709; CHECK-GI-NEXT: add sp, sp, #112710; CHECK-GI-NEXT: ret711 %x = call <2 x i32> @llvm.fptosi.sat.v2f128.v2i32(<2 x fp128> %f)712 ret <2 x i32> %x713}714 715define <3 x i32> @test_signed_v3f128_v3i32(<3 x fp128> %f) {716; CHECK-SD-LABEL: test_signed_v3f128_v3i32:717; CHECK-SD: // %bb.0:718; CHECK-SD-NEXT: sub sp, sp, #128719; CHECK-SD-NEXT: stp x30, x23, [sp, #80] // 16-byte Folded Spill720; CHECK-SD-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill721; CHECK-SD-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill722; CHECK-SD-NEXT: .cfi_def_cfa_offset 128723; CHECK-SD-NEXT: .cfi_offset w19, -8724; CHECK-SD-NEXT: .cfi_offset w20, -16725; CHECK-SD-NEXT: .cfi_offset w21, -24726; CHECK-SD-NEXT: .cfi_offset w22, -32727; CHECK-SD-NEXT: .cfi_offset w23, -40728; CHECK-SD-NEXT: .cfi_offset w30, -48729; CHECK-SD-NEXT: str q0, [sp, #64] // 16-byte Spill730; CHECK-SD-NEXT: adrp x8, .LCPI16_0731; CHECK-SD-NEXT: mov v0.16b, v2.16b732; CHECK-SD-NEXT: stp q2, q1, [sp, #32] // 32-byte Folded Spill733; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI16_0]734; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill735; CHECK-SD-NEXT: bl __getf2736; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload737; CHECK-SD-NEXT: mov w19, w0738; CHECK-SD-NEXT: bl __fixtfsi739; CHECK-SD-NEXT: adrp x8, .LCPI16_1740; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload741; CHECK-SD-NEXT: cmp w19, #0742; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI16_1]743; CHECK-SD-NEXT: mov w20, #-2147483648 // =0x80000000744; CHECK-SD-NEXT: csel w19, w20, w0, mi745; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill746; CHECK-SD-NEXT: bl __gttf2747; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload748; CHECK-SD-NEXT: mov w22, #2147483647 // =0x7fffffff749; CHECK-SD-NEXT: cmp w0, #0750; CHECK-SD-NEXT: csel w19, w22, w19, gt751; CHECK-SD-NEXT: mov v1.16b, v0.16b752; CHECK-SD-NEXT: bl __unordtf2753; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload754; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload755; CHECK-SD-NEXT: cmp w0, #0756; CHECK-SD-NEXT: csel w21, wzr, w19, ne757; CHECK-SD-NEXT: bl __getf2758; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload759; CHECK-SD-NEXT: mov w19, w0760; CHECK-SD-NEXT: bl __fixtfsi761; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload762; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload763; CHECK-SD-NEXT: cmp w19, #0764; CHECK-SD-NEXT: csel w19, w20, w0, mi765; CHECK-SD-NEXT: bl __gttf2766; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload767; CHECK-SD-NEXT: cmp w0, #0768; CHECK-SD-NEXT: csel w19, w22, w19, gt769; CHECK-SD-NEXT: mov v1.16b, v0.16b770; CHECK-SD-NEXT: bl __unordtf2771; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Reload772; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload773; CHECK-SD-NEXT: cmp w0, #0774; CHECK-SD-NEXT: csel w23, wzr, w19, ne775; CHECK-SD-NEXT: bl __getf2776; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Reload777; CHECK-SD-NEXT: mov w19, w0778; CHECK-SD-NEXT: bl __fixtfsi779; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Reload780; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload781; CHECK-SD-NEXT: cmp w19, #0782; CHECK-SD-NEXT: csel w19, w20, w0, mi783; CHECK-SD-NEXT: bl __gttf2784; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Reload785; CHECK-SD-NEXT: cmp w0, #0786; CHECK-SD-NEXT: csel w19, w22, w19, gt787; CHECK-SD-NEXT: mov v1.16b, v0.16b788; CHECK-SD-NEXT: bl __unordtf2789; CHECK-SD-NEXT: cmp w0, #0790; CHECK-SD-NEXT: csel w8, wzr, w19, ne791; CHECK-SD-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload792; CHECK-SD-NEXT: fmov s0, w8793; CHECK-SD-NEXT: mov v0.s[1], w23794; CHECK-SD-NEXT: ldp x30, x23, [sp, #80] // 16-byte Folded Reload795; CHECK-SD-NEXT: mov v0.s[2], w21796; CHECK-SD-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload797; CHECK-SD-NEXT: add sp, sp, #128798; CHECK-SD-NEXT: ret799;800; CHECK-GI-LABEL: test_signed_v3f128_v3i32:801; CHECK-GI: // %bb.0:802; CHECK-GI-NEXT: sub sp, sp, #128803; CHECK-GI-NEXT: stp x30, x23, [sp, #80] // 16-byte Folded Spill804; CHECK-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill805; CHECK-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill806; CHECK-GI-NEXT: .cfi_def_cfa_offset 128807; CHECK-GI-NEXT: .cfi_offset w19, -8808; CHECK-GI-NEXT: .cfi_offset w20, -16809; CHECK-GI-NEXT: .cfi_offset w21, -24810; CHECK-GI-NEXT: .cfi_offset w22, -32811; CHECK-GI-NEXT: .cfi_offset w23, -40812; CHECK-GI-NEXT: .cfi_offset w30, -48813; CHECK-GI-NEXT: adrp x8, .LCPI16_1814; CHECK-GI-NEXT: str q1, [sp, #48] // 16-byte Spill815; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI16_1]816; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill817; CHECK-GI-NEXT: str q2, [sp, #64] // 16-byte Spill818; CHECK-GI-NEXT: str q1, [sp, #32] // 16-byte Spill819; CHECK-GI-NEXT: bl __gttf2820; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload821; CHECK-GI-NEXT: cmp w0, #0822; CHECK-GI-NEXT: mov x20, #-4603241769126068224 // =0xc01e000000000000823; CHECK-GI-NEXT: fmov x8, d0824; CHECK-GI-NEXT: csel x19, x8, xzr, gt825; CHECK-GI-NEXT: mov x8, v0.d[1]826; CHECK-GI-NEXT: mov v0.d[0], x19827; CHECK-GI-NEXT: csel x21, x8, x20, gt828; CHECK-GI-NEXT: adrp x8, .LCPI16_0829; CHECK-GI-NEXT: mov v0.d[1], x21830; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI16_0]831; CHECK-GI-NEXT: str q1, [sp, #16] // 16-byte Spill832; CHECK-GI-NEXT: bl __lttf2833; CHECK-GI-NEXT: cmp w0, #0834; CHECK-GI-NEXT: mov x22, #281474976448512 // =0xfffffffc0000835; CHECK-GI-NEXT: csel x8, x19, xzr, mi836; CHECK-GI-NEXT: movk x22, #16413, lsl #48837; CHECK-GI-NEXT: mov v0.d[0], x8838; CHECK-GI-NEXT: csel x8, x21, x22, mi839; CHECK-GI-NEXT: mov v0.d[1], x8840; CHECK-GI-NEXT: bl __fixtfsi841; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload842; CHECK-GI-NEXT: mov w19, w0843; CHECK-GI-NEXT: mov v1.16b, v0.16b844; CHECK-GI-NEXT: bl __unordtf2845; CHECK-GI-NEXT: ldp q1, q0, [sp, #32] // 32-byte Folded Reload846; CHECK-GI-NEXT: cmp w0, #0847; CHECK-GI-NEXT: csel w21, wzr, w19, ne848; CHECK-GI-NEXT: bl __gttf2849; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload850; CHECK-GI-NEXT: cmp w0, #0851; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Reload852; CHECK-GI-NEXT: fmov x8, d0853; CHECK-GI-NEXT: csel x19, x8, xzr, gt854; CHECK-GI-NEXT: mov x8, v0.d[1]855; CHECK-GI-NEXT: mov v0.d[0], x19856; CHECK-GI-NEXT: csel x23, x8, x20, gt857; CHECK-GI-NEXT: mov v0.d[1], x23858; CHECK-GI-NEXT: bl __lttf2859; CHECK-GI-NEXT: cmp w0, #0860; CHECK-GI-NEXT: csel x8, x19, xzr, mi861; CHECK-GI-NEXT: mov v0.d[0], x8862; CHECK-GI-NEXT: csel x8, x23, x22, mi863; CHECK-GI-NEXT: mov v0.d[1], x8864; CHECK-GI-NEXT: bl __fixtfsi865; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload866; CHECK-GI-NEXT: mov w19, w0867; CHECK-GI-NEXT: mov v1.16b, v0.16b868; CHECK-GI-NEXT: bl __unordtf2869; CHECK-GI-NEXT: ldr q0, [sp, #64] // 16-byte Reload870; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Reload871; CHECK-GI-NEXT: cmp w0, #0872; CHECK-GI-NEXT: csel w23, wzr, w19, ne873; CHECK-GI-NEXT: bl __gttf2874; CHECK-GI-NEXT: ldr q0, [sp, #64] // 16-byte Reload875; CHECK-GI-NEXT: cmp w0, #0876; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Reload877; CHECK-GI-NEXT: fmov x8, d0878; CHECK-GI-NEXT: csel x19, x8, xzr, gt879; CHECK-GI-NEXT: mov x8, v0.d[1]880; CHECK-GI-NEXT: mov v0.d[0], x19881; CHECK-GI-NEXT: csel x20, x8, x20, gt882; CHECK-GI-NEXT: mov v0.d[1], x20883; CHECK-GI-NEXT: bl __lttf2884; CHECK-GI-NEXT: cmp w0, #0885; CHECK-GI-NEXT: csel x8, x19, xzr, mi886; CHECK-GI-NEXT: mov v0.d[0], x8887; CHECK-GI-NEXT: csel x8, x20, x22, mi888; CHECK-GI-NEXT: mov v0.d[1], x8889; CHECK-GI-NEXT: bl __fixtfsi890; CHECK-GI-NEXT: ldr q0, [sp, #64] // 16-byte Reload891; CHECK-GI-NEXT: mov w19, w0892; CHECK-GI-NEXT: mov v1.16b, v0.16b893; CHECK-GI-NEXT: bl __unordtf2894; CHECK-GI-NEXT: fmov s0, w21895; CHECK-GI-NEXT: cmp w0, #0896; CHECK-GI-NEXT: csel w8, wzr, w19, ne897; CHECK-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload898; CHECK-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload899; CHECK-GI-NEXT: mov v0.s[1], w23900; CHECK-GI-NEXT: ldp x30, x23, [sp, #80] // 16-byte Folded Reload901; CHECK-GI-NEXT: mov v0.s[2], w8902; CHECK-GI-NEXT: add sp, sp, #128903; CHECK-GI-NEXT: ret904 %x = call <3 x i32> @llvm.fptosi.sat.v3f128.v3i32(<3 x fp128> %f)905 ret <3 x i32> %x906}907 908define <4 x i32> @test_signed_v4f128_v4i32(<4 x fp128> %f) {909; CHECK-SD-LABEL: test_signed_v4f128_v4i32:910; CHECK-SD: // %bb.0:911; CHECK-SD-NEXT: sub sp, sp, #144912; CHECK-SD-NEXT: str x30, [sp, #96] // 8-byte Spill913; CHECK-SD-NEXT: stp x22, x21, [sp, #112] // 16-byte Folded Spill914; CHECK-SD-NEXT: stp x20, x19, [sp, #128] // 16-byte Folded Spill915; CHECK-SD-NEXT: .cfi_def_cfa_offset 144916; CHECK-SD-NEXT: .cfi_offset w19, -8917; CHECK-SD-NEXT: .cfi_offset w20, -16918; CHECK-SD-NEXT: .cfi_offset w21, -24919; CHECK-SD-NEXT: .cfi_offset w22, -32920; CHECK-SD-NEXT: .cfi_offset w30, -48921; CHECK-SD-NEXT: stp q2, q3, [sp, #64] // 32-byte Folded Spill922; CHECK-SD-NEXT: mov v2.16b, v1.16b923; CHECK-SD-NEXT: adrp x8, .LCPI17_0924; CHECK-SD-NEXT: str q0, [sp, #48] // 16-byte Spill925; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill926; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI17_0]927; CHECK-SD-NEXT: mov v0.16b, v2.16b928; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill929; CHECK-SD-NEXT: bl __getf2930; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload931; CHECK-SD-NEXT: mov w19, w0932; CHECK-SD-NEXT: bl __fixtfsi933; CHECK-SD-NEXT: adrp x8, .LCPI17_1934; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload935; CHECK-SD-NEXT: cmp w19, #0936; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI17_1]937; CHECK-SD-NEXT: mov w20, #-2147483648 // =0x80000000938; CHECK-SD-NEXT: csel w19, w20, w0, mi939; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill940; CHECK-SD-NEXT: bl __gttf2941; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload942; CHECK-SD-NEXT: mov w21, #2147483647 // =0x7fffffff943; CHECK-SD-NEXT: cmp w0, #0944; CHECK-SD-NEXT: csel w19, w21, w19, gt945; CHECK-SD-NEXT: mov v1.16b, v0.16b946; CHECK-SD-NEXT: bl __unordtf2947; CHECK-SD-NEXT: ldp q1, q0, [sp, #32] // 32-byte Folded Reload948; CHECK-SD-NEXT: cmp w0, #0949; CHECK-SD-NEXT: csel w22, wzr, w19, ne950; CHECK-SD-NEXT: bl __getf2951; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload952; CHECK-SD-NEXT: mov w19, w0953; CHECK-SD-NEXT: bl __fixtfsi954; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload955; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload956; CHECK-SD-NEXT: cmp w19, #0957; CHECK-SD-NEXT: csel w19, w20, w0, mi958; CHECK-SD-NEXT: bl __gttf2959; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload960; CHECK-SD-NEXT: cmp w0, #0961; CHECK-SD-NEXT: csel w19, w21, w19, gt962; CHECK-SD-NEXT: mov v1.16b, v0.16b963; CHECK-SD-NEXT: bl __unordtf2964; CHECK-SD-NEXT: cmp w0, #0965; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload966; CHECK-SD-NEXT: csel w8, wzr, w19, ne967; CHECK-SD-NEXT: fmov s0, w8968; CHECK-SD-NEXT: mov v0.s[1], w22969; CHECK-SD-NEXT: str q0, [sp, #48] // 16-byte Spill970; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Reload971; CHECK-SD-NEXT: bl __getf2972; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Reload973; CHECK-SD-NEXT: mov w19, w0974; CHECK-SD-NEXT: bl __fixtfsi975; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Reload976; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload977; CHECK-SD-NEXT: cmp w19, #0978; CHECK-SD-NEXT: csel w19, w20, w0, mi979; CHECK-SD-NEXT: bl __gttf2980; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Reload981; CHECK-SD-NEXT: cmp w0, #0982; CHECK-SD-NEXT: csel w19, w21, w19, gt983; CHECK-SD-NEXT: mov v1.16b, v0.16b984; CHECK-SD-NEXT: bl __unordtf2985; CHECK-SD-NEXT: ldp q1, q0, [sp, #32] // 32-byte Folded Reload986; CHECK-SD-NEXT: cmp w0, #0987; CHECK-SD-NEXT: csel w8, wzr, w19, ne988; CHECK-SD-NEXT: mov v0.s[2], w8989; CHECK-SD-NEXT: str q0, [sp, #48] // 16-byte Spill990; CHECK-SD-NEXT: ldr q0, [sp, #80] // 16-byte Reload991; CHECK-SD-NEXT: bl __getf2992; CHECK-SD-NEXT: ldr q0, [sp, #80] // 16-byte Reload993; CHECK-SD-NEXT: mov w19, w0994; CHECK-SD-NEXT: bl __fixtfsi995; CHECK-SD-NEXT: ldr q0, [sp, #80] // 16-byte Reload996; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload997; CHECK-SD-NEXT: cmp w19, #0998; CHECK-SD-NEXT: csel w19, w20, w0, mi999; CHECK-SD-NEXT: bl __gttf21000; CHECK-SD-NEXT: ldr q0, [sp, #80] // 16-byte Reload1001; CHECK-SD-NEXT: cmp w0, #01002; CHECK-SD-NEXT: csel w19, w21, w19, gt1003; CHECK-SD-NEXT: mov v1.16b, v0.16b1004; CHECK-SD-NEXT: bl __unordtf21005; CHECK-SD-NEXT: cmp w0, #01006; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload1007; CHECK-SD-NEXT: ldr x30, [sp, #96] // 8-byte Reload1008; CHECK-SD-NEXT: csel w8, wzr, w19, ne1009; CHECK-SD-NEXT: ldp x20, x19, [sp, #128] // 16-byte Folded Reload1010; CHECK-SD-NEXT: ldp x22, x21, [sp, #112] // 16-byte Folded Reload1011; CHECK-SD-NEXT: mov v0.s[3], w81012; CHECK-SD-NEXT: add sp, sp, #1441013; CHECK-SD-NEXT: ret1014;1015; CHECK-GI-LABEL: test_signed_v4f128_v4i32:1016; CHECK-GI: // %bb.0:1017; CHECK-GI-NEXT: sub sp, sp, #1601018; CHECK-GI-NEXT: str x30, [sp, #96] // 8-byte Spill1019; CHECK-GI-NEXT: stp x24, x23, [sp, #112] // 16-byte Folded Spill1020; CHECK-GI-NEXT: stp x22, x21, [sp, #128] // 16-byte Folded Spill1021; CHECK-GI-NEXT: stp x20, x19, [sp, #144] // 16-byte Folded Spill1022; CHECK-GI-NEXT: .cfi_def_cfa_offset 1601023; CHECK-GI-NEXT: .cfi_offset w19, -81024; CHECK-GI-NEXT: .cfi_offset w20, -161025; CHECK-GI-NEXT: .cfi_offset w21, -241026; CHECK-GI-NEXT: .cfi_offset w22, -321027; CHECK-GI-NEXT: .cfi_offset w23, -401028; CHECK-GI-NEXT: .cfi_offset w24, -481029; CHECK-GI-NEXT: .cfi_offset w30, -641030; CHECK-GI-NEXT: adrp x8, .LCPI17_11031; CHECK-GI-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill1032; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI17_1]1033; CHECK-GI-NEXT: str q2, [sp, #32] // 16-byte Spill1034; CHECK-GI-NEXT: stp q1, q3, [sp, #64] // 32-byte Folded Spill1035; CHECK-GI-NEXT: bl __gttf21036; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload1037; CHECK-GI-NEXT: cmp w0, #01038; CHECK-GI-NEXT: mov x20, #-4603241769126068224 // =0xc01e0000000000001039; CHECK-GI-NEXT: fmov x8, d01040; CHECK-GI-NEXT: csel x19, x8, xzr, gt1041; CHECK-GI-NEXT: mov x8, v0.d[1]1042; CHECK-GI-NEXT: mov v0.d[0], x191043; CHECK-GI-NEXT: csel x21, x8, x20, gt1044; CHECK-GI-NEXT: adrp x8, .LCPI17_01045; CHECK-GI-NEXT: mov v0.d[1], x211046; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI17_0]1047; CHECK-GI-NEXT: str q1, [sp, #48] // 16-byte Spill1048; CHECK-GI-NEXT: bl __lttf21049; CHECK-GI-NEXT: cmp w0, #01050; CHECK-GI-NEXT: mov x22, #281474976448512 // =0xfffffffc00001051; CHECK-GI-NEXT: csel x8, x19, xzr, mi1052; CHECK-GI-NEXT: movk x22, #16413, lsl #481053; CHECK-GI-NEXT: mov v0.d[0], x81054; CHECK-GI-NEXT: csel x8, x21, x22, mi1055; CHECK-GI-NEXT: mov v0.d[1], x81056; CHECK-GI-NEXT: bl __fixtfsi1057; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload1058; CHECK-GI-NEXT: mov w19, w01059; CHECK-GI-NEXT: mov v1.16b, v0.16b1060; CHECK-GI-NEXT: bl __unordtf21061; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Reload1062; CHECK-GI-NEXT: ldr q1, [sp, #64] // 16-byte Reload1063; CHECK-GI-NEXT: cmp w0, #01064; CHECK-GI-NEXT: csel w21, wzr, w19, ne1065; CHECK-GI-NEXT: bl __gttf21066; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Reload1067; CHECK-GI-NEXT: cmp w0, #01068; CHECK-GI-NEXT: ldr q1, [sp, #48] // 16-byte Reload1069; CHECK-GI-NEXT: fmov x8, d01070; CHECK-GI-NEXT: csel x19, x8, xzr, gt1071; CHECK-GI-NEXT: mov x8, v0.d[1]1072; CHECK-GI-NEXT: mov v0.d[0], x191073; CHECK-GI-NEXT: csel x23, x8, x20, gt1074; CHECK-GI-NEXT: mov v0.d[1], x231075; CHECK-GI-NEXT: bl __lttf21076; CHECK-GI-NEXT: cmp w0, #01077; CHECK-GI-NEXT: csel x8, x19, xzr, mi1078; CHECK-GI-NEXT: mov v0.d[0], x81079; CHECK-GI-NEXT: csel x8, x23, x22, mi1080; CHECK-GI-NEXT: mov v0.d[1], x81081; CHECK-GI-NEXT: bl __fixtfsi1082; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Reload1083; CHECK-GI-NEXT: mov w19, w01084; CHECK-GI-NEXT: mov v1.16b, v0.16b1085; CHECK-GI-NEXT: bl __unordtf21086; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload1087; CHECK-GI-NEXT: ldr q1, [sp, #64] // 16-byte Reload1088; CHECK-GI-NEXT: cmp w0, #01089; CHECK-GI-NEXT: csel w23, wzr, w19, ne1090; CHECK-GI-NEXT: bl __gttf21091; CHECK-GI-NEXT: ldp q0, q1, [sp, #32] // 32-byte Folded Reload1092; CHECK-GI-NEXT: cmp w0, #01093; CHECK-GI-NEXT: fmov x8, d01094; CHECK-GI-NEXT: csel x19, x8, xzr, gt1095; CHECK-GI-NEXT: mov x8, v0.d[1]1096; CHECK-GI-NEXT: mov v0.d[0], x191097; CHECK-GI-NEXT: csel x24, x8, x20, gt1098; CHECK-GI-NEXT: mov v0.d[1], x241099; CHECK-GI-NEXT: bl __lttf21100; CHECK-GI-NEXT: cmp w0, #01101; CHECK-GI-NEXT: csel x8, x19, xzr, mi1102; CHECK-GI-NEXT: mov v0.d[0], x81103; CHECK-GI-NEXT: csel x8, x24, x22, mi1104; CHECK-GI-NEXT: mov v0.d[1], x81105; CHECK-GI-NEXT: bl __fixtfsi1106; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload1107; CHECK-GI-NEXT: mov w19, w01108; CHECK-GI-NEXT: mov v1.16b, v0.16b1109; CHECK-GI-NEXT: bl __unordtf21110; CHECK-GI-NEXT: ldp q1, q0, [sp, #64] // 32-byte Folded Reload1111; CHECK-GI-NEXT: cmp w0, #01112; CHECK-GI-NEXT: csel w24, wzr, w19, ne1113; CHECK-GI-NEXT: bl __gttf21114; CHECK-GI-NEXT: ldr q0, [sp, #80] // 16-byte Reload1115; CHECK-GI-NEXT: cmp w0, #01116; CHECK-GI-NEXT: ldr q1, [sp, #48] // 16-byte Reload1117; CHECK-GI-NEXT: fmov x8, d01118; CHECK-GI-NEXT: csel x19, x8, xzr, gt1119; CHECK-GI-NEXT: mov x8, v0.d[1]1120; CHECK-GI-NEXT: mov v0.d[0], x191121; CHECK-GI-NEXT: csel x20, x8, x20, gt1122; CHECK-GI-NEXT: mov v0.d[1], x201123; CHECK-GI-NEXT: bl __lttf21124; CHECK-GI-NEXT: cmp w0, #01125; CHECK-GI-NEXT: csel x8, x19, xzr, mi1126; CHECK-GI-NEXT: mov v0.d[0], x81127; CHECK-GI-NEXT: csel x8, x20, x22, mi1128; CHECK-GI-NEXT: mov v0.d[1], x81129; CHECK-GI-NEXT: bl __fixtfsi1130; CHECK-GI-NEXT: ldr q0, [sp, #80] // 16-byte Reload1131; CHECK-GI-NEXT: mov w19, w01132; CHECK-GI-NEXT: mov v1.16b, v0.16b1133; CHECK-GI-NEXT: bl __unordtf21134; CHECK-GI-NEXT: fmov s0, w211135; CHECK-GI-NEXT: cmp w0, #01136; CHECK-GI-NEXT: ldr x30, [sp, #96] // 8-byte Reload1137; CHECK-GI-NEXT: csel w8, wzr, w19, ne1138; CHECK-GI-NEXT: ldp x20, x19, [sp, #144] // 16-byte Folded Reload1139; CHECK-GI-NEXT: ldp x22, x21, [sp, #128] // 16-byte Folded Reload1140; CHECK-GI-NEXT: mov v0.s[1], w231141; CHECK-GI-NEXT: mov v0.s[2], w241142; CHECK-GI-NEXT: ldp x24, x23, [sp, #112] // 16-byte Folded Reload1143; CHECK-GI-NEXT: mov v0.s[3], w81144; CHECK-GI-NEXT: add sp, sp, #1601145; CHECK-GI-NEXT: ret1146 %x = call <4 x i32> @llvm.fptosi.sat.v4f128.v4i32(<4 x fp128> %f)1147 ret <4 x i32> %x1148}1149 1150;1151; FP16 to signed 32-bit -- Vector size variation1152;1153 1154declare <1 x i32> @llvm.fptosi.sat.v1f16.v1i32 (<1 x half>)1155declare <2 x i32> @llvm.fptosi.sat.v2f16.v2i32 (<2 x half>)1156declare <3 x i32> @llvm.fptosi.sat.v3f16.v3i32 (<3 x half>)1157declare <4 x i32> @llvm.fptosi.sat.v4f16.v4i32 (<4 x half>)1158declare <5 x i32> @llvm.fptosi.sat.v5f16.v5i32 (<5 x half>)1159declare <6 x i32> @llvm.fptosi.sat.v6f16.v6i32 (<6 x half>)1160declare <7 x i32> @llvm.fptosi.sat.v7f16.v7i32 (<7 x half>)1161declare <8 x i32> @llvm.fptosi.sat.v8f16.v8i32 (<8 x half>)1162 1163define <1 x i32> @test_signed_v1f16_v1i32(<1 x half> %f) {1164; CHECK-SD-CVT-LABEL: test_signed_v1f16_v1i32:1165; CHECK-SD-CVT: // %bb.0:1166; CHECK-SD-CVT-NEXT: fcvt s0, h01167; CHECK-SD-CVT-NEXT: fcvtzs w8, s01168; CHECK-SD-CVT-NEXT: fmov s0, w81169; CHECK-SD-CVT-NEXT: ret1170;1171; CHECK-FP16-LABEL: test_signed_v1f16_v1i32:1172; CHECK-FP16: // %bb.0:1173; CHECK-FP16-NEXT: fcvtzs w8, h01174; CHECK-FP16-NEXT: fmov s0, w81175; CHECK-FP16-NEXT: ret1176;1177; CHECK-GI-CVT-LABEL: test_signed_v1f16_v1i32:1178; CHECK-GI-CVT: // %bb.0:1179; CHECK-GI-CVT-NEXT: fcvt s0, h01180; CHECK-GI-CVT-NEXT: fcvtzs s0, s01181; CHECK-GI-CVT-NEXT: ret1182 %x = call <1 x i32> @llvm.fptosi.sat.v1f16.v1i32(<1 x half> %f)1183 ret <1 x i32> %x1184}1185 1186define <2 x i32> @test_signed_v2f16_v2i32(<2 x half> %f) {1187; CHECK-SD-LABEL: test_signed_v2f16_v2i32:1188; CHECK-SD: // %bb.0:1189; CHECK-SD-NEXT: fcvtl v0.4s, v0.4h1190; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s1191; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q01192; CHECK-SD-NEXT: ret1193;1194; CHECK-GI-LABEL: test_signed_v2f16_v2i32:1195; CHECK-GI: // %bb.0:1196; CHECK-GI-NEXT: fcvtl v0.4s, v0.4h1197; CHECK-GI-NEXT: fcvtzs v0.2s, v0.2s1198; CHECK-GI-NEXT: ret1199 %x = call <2 x i32> @llvm.fptosi.sat.v2f16.v2i32(<2 x half> %f)1200 ret <2 x i32> %x1201}1202 1203define <3 x i32> @test_signed_v3f16_v3i32(<3 x half> %f) {1204; CHECK-LABEL: test_signed_v3f16_v3i32:1205; CHECK: // %bb.0:1206; CHECK-NEXT: fcvtl v0.4s, v0.4h1207; CHECK-NEXT: fcvtzs v0.4s, v0.4s1208; CHECK-NEXT: ret1209 %x = call <3 x i32> @llvm.fptosi.sat.v3f16.v3i32(<3 x half> %f)1210 ret <3 x i32> %x1211}1212 1213define <4 x i32> @test_signed_v4f16_v4i32(<4 x half> %f) {1214; CHECK-LABEL: test_signed_v4f16_v4i32:1215; CHECK: // %bb.0:1216; CHECK-NEXT: fcvtl v0.4s, v0.4h1217; CHECK-NEXT: fcvtzs v0.4s, v0.4s1218; CHECK-NEXT: ret1219 %x = call <4 x i32> @llvm.fptosi.sat.v4f16.v4i32(<4 x half> %f)1220 ret <4 x i32> %x1221}1222 1223define <5 x i32> @test_signed_v5f16_v5i32(<5 x half> %f) {1224; CHECK-SD-LABEL: test_signed_v5f16_v5i32:1225; CHECK-SD: // %bb.0:1226; CHECK-SD-NEXT: fcvtl v1.4s, v0.4h1227; CHECK-SD-NEXT: fcvtl2 v0.4s, v0.8h1228; CHECK-SD-NEXT: fcvtzs v1.4s, v1.4s1229; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s1230; CHECK-SD-NEXT: mov w1, v1.s[1]1231; CHECK-SD-NEXT: mov w2, v1.s[2]1232; CHECK-SD-NEXT: mov w3, v1.s[3]1233; CHECK-SD-NEXT: fmov w0, s11234; CHECK-SD-NEXT: fmov w4, s01235; CHECK-SD-NEXT: ret1236;1237; CHECK-GI-LABEL: test_signed_v5f16_v5i32:1238; CHECK-GI: // %bb.0:1239; CHECK-GI-NEXT: fcvtl v1.4s, v0.4h1240; CHECK-GI-NEXT: mov v0.h[0], v0.h[4]1241; CHECK-GI-NEXT: fcvtzs v1.4s, v1.4s1242; CHECK-GI-NEXT: fcvtl v0.4s, v0.4h1243; CHECK-GI-NEXT: mov s2, v1.s[1]1244; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s1245; CHECK-GI-NEXT: mov s3, v1.s[2]1246; CHECK-GI-NEXT: mov s4, v1.s[3]1247; CHECK-GI-NEXT: fmov w0, s11248; CHECK-GI-NEXT: fmov w1, s21249; CHECK-GI-NEXT: fmov w2, s31250; CHECK-GI-NEXT: fmov w4, s01251; CHECK-GI-NEXT: fmov w3, s41252; CHECK-GI-NEXT: ret1253 %x = call <5 x i32> @llvm.fptosi.sat.v5f16.v5i32(<5 x half> %f)1254 ret <5 x i32> %x1255}1256 1257define <6 x i32> @test_signed_v6f16_v6i32(<6 x half> %f) {1258; CHECK-SD-LABEL: test_signed_v6f16_v6i32:1259; CHECK-SD: // %bb.0:1260; CHECK-SD-NEXT: fcvtl v1.4s, v0.4h1261; CHECK-SD-NEXT: fcvtl2 v0.4s, v0.8h1262; CHECK-SD-NEXT: fcvtzs v1.4s, v1.4s1263; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s1264; CHECK-SD-NEXT: mov w1, v1.s[1]1265; CHECK-SD-NEXT: mov w2, v1.s[2]1266; CHECK-SD-NEXT: mov w5, v0.s[1]1267; CHECK-SD-NEXT: mov w3, v1.s[3]1268; CHECK-SD-NEXT: fmov w4, s01269; CHECK-SD-NEXT: fmov w0, s11270; CHECK-SD-NEXT: ret1271;1272; CHECK-GI-LABEL: test_signed_v6f16_v6i32:1273; CHECK-GI: // %bb.0:1274; CHECK-GI-NEXT: mov v1.h[0], v0.h[4]1275; CHECK-GI-NEXT: mov v1.h[1], v0.h[5]1276; CHECK-GI-NEXT: fcvtl v0.4s, v0.4h1277; CHECK-GI-NEXT: fcvtl v1.4s, v1.4h1278; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s1279; CHECK-GI-NEXT: fcvtzs v1.4s, v1.4s1280; CHECK-GI-NEXT: mov s2, v0.s[1]1281; CHECK-GI-NEXT: mov s3, v0.s[2]1282; CHECK-GI-NEXT: mov s4, v0.s[3]1283; CHECK-GI-NEXT: fmov w0, s01284; CHECK-GI-NEXT: mov s5, v1.s[1]1285; CHECK-GI-NEXT: fmov w1, s21286; CHECK-GI-NEXT: fmov w2, s31287; CHECK-GI-NEXT: fmov w3, s41288; CHECK-GI-NEXT: fmov w4, s11289; CHECK-GI-NEXT: fmov w5, s51290; CHECK-GI-NEXT: ret1291 %x = call <6 x i32> @llvm.fptosi.sat.v6f16.v6i32(<6 x half> %f)1292 ret <6 x i32> %x1293}1294 1295define <7 x i32> @test_signed_v7f16_v7i32(<7 x half> %f) {1296; CHECK-SD-LABEL: test_signed_v7f16_v7i32:1297; CHECK-SD: // %bb.0:1298; CHECK-SD-NEXT: fcvtl v1.4s, v0.4h1299; CHECK-SD-NEXT: fcvtl2 v0.4s, v0.8h1300; CHECK-SD-NEXT: fcvtzs v1.4s, v1.4s1301; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s1302; CHECK-SD-NEXT: mov w1, v1.s[1]1303; CHECK-SD-NEXT: mov w2, v1.s[2]1304; CHECK-SD-NEXT: mov w3, v1.s[3]1305; CHECK-SD-NEXT: mov w5, v0.s[1]1306; CHECK-SD-NEXT: mov w6, v0.s[2]1307; CHECK-SD-NEXT: fmov w0, s11308; CHECK-SD-NEXT: fmov w4, s01309; CHECK-SD-NEXT: ret1310;1311; CHECK-GI-LABEL: test_signed_v7f16_v7i32:1312; CHECK-GI: // %bb.0:1313; CHECK-GI-NEXT: mov v1.h[0], v0.h[4]1314; CHECK-GI-NEXT: mov v1.h[1], v0.h[5]1315; CHECK-GI-NEXT: mov v1.h[2], v0.h[6]1316; CHECK-GI-NEXT: fcvtl v0.4s, v0.4h1317; CHECK-GI-NEXT: fcvtl v1.4s, v1.4h1318; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s1319; CHECK-GI-NEXT: fcvtzs v1.4s, v1.4s1320; CHECK-GI-NEXT: mov s2, v0.s[1]1321; CHECK-GI-NEXT: mov s3, v0.s[2]1322; CHECK-GI-NEXT: mov s4, v0.s[3]1323; CHECK-GI-NEXT: fmov w0, s01324; CHECK-GI-NEXT: mov s5, v1.s[1]1325; CHECK-GI-NEXT: mov s6, v1.s[2]1326; CHECK-GI-NEXT: fmov w1, s21327; CHECK-GI-NEXT: fmov w2, s31328; CHECK-GI-NEXT: fmov w3, s41329; CHECK-GI-NEXT: fmov w4, s11330; CHECK-GI-NEXT: fmov w5, s51331; CHECK-GI-NEXT: fmov w6, s61332; CHECK-GI-NEXT: ret1333 %x = call <7 x i32> @llvm.fptosi.sat.v7f16.v7i32(<7 x half> %f)1334 ret <7 x i32> %x1335}1336 1337define <8 x i32> @test_signed_v8f16_v8i32(<8 x half> %f) {1338; CHECK-SD-LABEL: test_signed_v8f16_v8i32:1339; CHECK-SD: // %bb.0:1340; CHECK-SD-NEXT: fcvtl2 v1.4s, v0.8h1341; CHECK-SD-NEXT: fcvtl v0.4s, v0.4h1342; CHECK-SD-NEXT: fcvtzs v1.4s, v1.4s1343; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s1344; CHECK-SD-NEXT: ret1345;1346; CHECK-GI-LABEL: test_signed_v8f16_v8i32:1347; CHECK-GI: // %bb.0:1348; CHECK-GI-NEXT: fcvtl v1.4s, v0.4h1349; CHECK-GI-NEXT: fcvtl2 v2.4s, v0.8h1350; CHECK-GI-NEXT: fcvtzs v0.4s, v1.4s1351; CHECK-GI-NEXT: fcvtzs v1.4s, v2.4s1352; CHECK-GI-NEXT: ret1353 %x = call <8 x i32> @llvm.fptosi.sat.v8f16.v8i32(<8 x half> %f)1354 ret <8 x i32> %x1355}1356 1357;1358; 2-Vector float to signed integer -- result size variation1359;1360 1361declare <2 x i1> @llvm.fptosi.sat.v2f32.v2i1 (<2 x float>)1362declare <2 x i8> @llvm.fptosi.sat.v2f32.v2i8 (<2 x float>)1363declare <2 x i13> @llvm.fptosi.sat.v2f32.v2i13 (<2 x float>)1364declare <2 x i16> @llvm.fptosi.sat.v2f32.v2i16 (<2 x float>)1365declare <2 x i19> @llvm.fptosi.sat.v2f32.v2i19 (<2 x float>)1366declare <2 x i50> @llvm.fptosi.sat.v2f32.v2i50 (<2 x float>)1367declare <2 x i64> @llvm.fptosi.sat.v2f32.v2i64 (<2 x float>)1368declare <2 x i100> @llvm.fptosi.sat.v2f32.v2i100(<2 x float>)1369declare <2 x i128> @llvm.fptosi.sat.v2f32.v2i128(<2 x float>)1370 1371define <2 x i1> @test_signed_v2f32_v2i1(<2 x float> %f) {1372; CHECK-SD-LABEL: test_signed_v2f32_v2i1:1373; CHECK-SD: // %bb.0:1374; CHECK-SD-NEXT: movi v1.2d, #00000000000000001375; CHECK-SD-NEXT: fcvtzs v0.2s, v0.2s1376; CHECK-SD-NEXT: movi v2.2d, #0xffffffffffffffff1377; CHECK-SD-NEXT: smin v0.2s, v0.2s, v1.2s1378; CHECK-SD-NEXT: smax v0.2s, v0.2s, v2.2s1379; CHECK-SD-NEXT: ret1380;1381; CHECK-GI-LABEL: test_signed_v2f32_v2i1:1382; CHECK-GI: // %bb.0:1383; CHECK-GI-NEXT: movi v1.2d, #00000000000000001384; CHECK-GI-NEXT: fcvtzs v0.2s, v0.2s1385; CHECK-GI-NEXT: movi d2, #0xffffffffffffffff1386; CHECK-GI-NEXT: smin v0.2s, v0.2s, v1.2s1387; CHECK-GI-NEXT: smax v0.2s, v0.2s, v2.2s1388; CHECK-GI-NEXT: ret1389 %x = call <2 x i1> @llvm.fptosi.sat.v2f32.v2i1(<2 x float> %f)1390 ret <2 x i1> %x1391}1392 1393define <2 x i8> @test_signed_v2f32_v2i8(<2 x float> %f) {1394; CHECK-SD-LABEL: test_signed_v2f32_v2i8:1395; CHECK-SD: // %bb.0:1396; CHECK-SD-NEXT: movi v1.2s, #1271397; CHECK-SD-NEXT: fcvtzs v0.2s, v0.2s1398; CHECK-SD-NEXT: smin v0.2s, v0.2s, v1.2s1399; CHECK-SD-NEXT: mvni v1.2s, #1271400; CHECK-SD-NEXT: smax v0.2s, v0.2s, v1.2s1401; CHECK-SD-NEXT: ret1402;1403; CHECK-GI-LABEL: test_signed_v2f32_v2i8:1404; CHECK-GI: // %bb.0:1405; CHECK-GI-NEXT: movi v1.2s, #1271406; CHECK-GI-NEXT: fcvtzs v0.2s, v0.2s1407; CHECK-GI-NEXT: mvni v2.2s, #1271408; CHECK-GI-NEXT: smin v0.2s, v0.2s, v1.2s1409; CHECK-GI-NEXT: smax v0.2s, v0.2s, v2.2s1410; CHECK-GI-NEXT: ret1411 %x = call <2 x i8> @llvm.fptosi.sat.v2f32.v2i8(<2 x float> %f)1412 ret <2 x i8> %x1413}1414 1415define <2 x i13> @test_signed_v2f32_v2i13(<2 x float> %f) {1416; CHECK-SD-LABEL: test_signed_v2f32_v2i13:1417; CHECK-SD: // %bb.0:1418; CHECK-SD-NEXT: movi v1.2s, #15, msl #81419; CHECK-SD-NEXT: fcvtzs v0.2s, v0.2s1420; CHECK-SD-NEXT: smin v0.2s, v0.2s, v1.2s1421; CHECK-SD-NEXT: mvni v1.2s, #15, msl #81422; CHECK-SD-NEXT: smax v0.2s, v0.2s, v1.2s1423; CHECK-SD-NEXT: ret1424;1425; CHECK-GI-LABEL: test_signed_v2f32_v2i13:1426; CHECK-GI: // %bb.0:1427; CHECK-GI-NEXT: movi v1.2s, #15, msl #81428; CHECK-GI-NEXT: fcvtzs v0.2s, v0.2s1429; CHECK-GI-NEXT: mvni v2.2s, #15, msl #81430; CHECK-GI-NEXT: smin v0.2s, v0.2s, v1.2s1431; CHECK-GI-NEXT: smax v0.2s, v0.2s, v2.2s1432; CHECK-GI-NEXT: ret1433 %x = call <2 x i13> @llvm.fptosi.sat.v2f32.v2i13(<2 x float> %f)1434 ret <2 x i13> %x1435}1436 1437define <2 x i16> @test_signed_v2f32_v2i16(<2 x float> %f) {1438; CHECK-SD-LABEL: test_signed_v2f32_v2i16:1439; CHECK-SD: // %bb.0:1440; CHECK-SD-NEXT: movi v1.2s, #127, msl #81441; CHECK-SD-NEXT: fcvtzs v0.2s, v0.2s1442; CHECK-SD-NEXT: smin v0.2s, v0.2s, v1.2s1443; CHECK-SD-NEXT: mvni v1.2s, #127, msl #81444; CHECK-SD-NEXT: smax v0.2s, v0.2s, v1.2s1445; CHECK-SD-NEXT: ret1446;1447; CHECK-GI-LABEL: test_signed_v2f32_v2i16:1448; CHECK-GI: // %bb.0:1449; CHECK-GI-NEXT: movi v1.2s, #127, msl #81450; CHECK-GI-NEXT: fcvtzs v0.2s, v0.2s1451; CHECK-GI-NEXT: mvni v2.2s, #127, msl #81452; CHECK-GI-NEXT: smin v0.2s, v0.2s, v1.2s1453; CHECK-GI-NEXT: smax v0.2s, v0.2s, v2.2s1454; CHECK-GI-NEXT: ret1455 %x = call <2 x i16> @llvm.fptosi.sat.v2f32.v2i16(<2 x float> %f)1456 ret <2 x i16> %x1457}1458 1459define <2 x i19> @test_signed_v2f32_v2i19(<2 x float> %f) {1460; CHECK-SD-LABEL: test_signed_v2f32_v2i19:1461; CHECK-SD: // %bb.0:1462; CHECK-SD-NEXT: movi v1.2s, #3, msl #161463; CHECK-SD-NEXT: fcvtzs v0.2s, v0.2s1464; CHECK-SD-NEXT: smin v0.2s, v0.2s, v1.2s1465; CHECK-SD-NEXT: mvni v1.2s, #3, msl #161466; CHECK-SD-NEXT: smax v0.2s, v0.2s, v1.2s1467; CHECK-SD-NEXT: ret1468;1469; CHECK-GI-LABEL: test_signed_v2f32_v2i19:1470; CHECK-GI: // %bb.0:1471; CHECK-GI-NEXT: movi v1.2s, #3, msl #161472; CHECK-GI-NEXT: fcvtzs v0.2s, v0.2s1473; CHECK-GI-NEXT: mvni v2.2s, #3, msl #161474; CHECK-GI-NEXT: smin v0.2s, v0.2s, v1.2s1475; CHECK-GI-NEXT: smax v0.2s, v0.2s, v2.2s1476; CHECK-GI-NEXT: ret1477 %x = call <2 x i19> @llvm.fptosi.sat.v2f32.v2i19(<2 x float> %f)1478 ret <2 x i19> %x1479}1480 1481define <2 x i32> @test_signed_v2f32_v2i32_duplicate(<2 x float> %f) {1482; CHECK-LABEL: test_signed_v2f32_v2i32_duplicate:1483; CHECK: // %bb.0:1484; CHECK-NEXT: fcvtzs v0.2s, v0.2s1485; CHECK-NEXT: ret1486 %x = call <2 x i32> @llvm.fptosi.sat.v2f32.v2i32(<2 x float> %f)1487 ret <2 x i32> %x1488}1489 1490define <2 x i50> @test_signed_v2f32_v2i50(<2 x float> %f) {1491; CHECK-SD-LABEL: test_signed_v2f32_v2i50:1492; CHECK-SD: // %bb.0:1493; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01494; CHECK-SD-NEXT: mov s1, v0.s[1]1495; CHECK-SD-NEXT: mov x8, #562949953421311 // =0x1ffffffffffff1496; CHECK-SD-NEXT: fcvtzs x10, s01497; CHECK-SD-NEXT: mov x11, #-562949953421312 // =0xfffe0000000000001498; CHECK-SD-NEXT: fcvtzs x9, s11499; CHECK-SD-NEXT: cmp x9, x81500; CHECK-SD-NEXT: csel x9, x9, x8, lt1501; CHECK-SD-NEXT: cmp x9, x111502; CHECK-SD-NEXT: csel x9, x9, x11, gt1503; CHECK-SD-NEXT: cmp x10, x81504; CHECK-SD-NEXT: csel x8, x10, x8, lt1505; CHECK-SD-NEXT: cmp x8, x111506; CHECK-SD-NEXT: csel x8, x8, x11, gt1507; CHECK-SD-NEXT: fmov d0, x81508; CHECK-SD-NEXT: mov v0.d[1], x91509; CHECK-SD-NEXT: ret1510;1511; CHECK-GI-LABEL: test_signed_v2f32_v2i50:1512; CHECK-GI: // %bb.0:1513; CHECK-GI-NEXT: fcvtl v0.2d, v0.2s1514; CHECK-GI-NEXT: adrp x8, .LCPI32_11515; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI32_1]1516; CHECK-GI-NEXT: adrp x8, .LCPI32_01517; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d1518; CHECK-GI-NEXT: cmgt v2.2d, v1.2d, v0.2d1519; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b1520; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI32_0]1521; CHECK-GI-NEXT: cmgt v2.2d, v0.2d, v1.2d1522; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b1523; CHECK-GI-NEXT: ret1524 %x = call <2 x i50> @llvm.fptosi.sat.v2f32.v2i50(<2 x float> %f)1525 ret <2 x i50> %x1526}1527 1528define <2 x i64> @test_signed_v2f32_v2i64(<2 x float> %f) {1529; CHECK-LABEL: test_signed_v2f32_v2i64:1530; CHECK: // %bb.0:1531; CHECK-NEXT: fcvtl v0.2d, v0.2s1532; CHECK-NEXT: fcvtzs v0.2d, v0.2d1533; CHECK-NEXT: ret1534 %x = call <2 x i64> @llvm.fptosi.sat.v2f32.v2i64(<2 x float> %f)1535 ret <2 x i64> %x1536}1537 1538define <2 x i100> @test_signed_v2f32_v2i100(<2 x float> %f) {1539; CHECK-SD-LABEL: test_signed_v2f32_v2i100:1540; CHECK-SD: // %bb.0:1541; CHECK-SD-NEXT: sub sp, sp, #801542; CHECK-SD-NEXT: str d10, [sp, #16] // 8-byte Spill1543; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill1544; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Spill1545; CHECK-SD-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill1546; CHECK-SD-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill1547; CHECK-SD-NEXT: .cfi_def_cfa_offset 801548; CHECK-SD-NEXT: .cfi_offset w19, -81549; CHECK-SD-NEXT: .cfi_offset w20, -161550; CHECK-SD-NEXT: .cfi_offset w21, -241551; CHECK-SD-NEXT: .cfi_offset w22, -321552; CHECK-SD-NEXT: .cfi_offset w30, -401553; CHECK-SD-NEXT: .cfi_offset b8, -481554; CHECK-SD-NEXT: .cfi_offset b9, -561555; CHECK-SD-NEXT: .cfi_offset b10, -641556; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01557; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1558; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01559; CHECK-SD-NEXT: bl __fixsfti1560; CHECK-SD-NEXT: movi v9.2s, #241, lsl #241561; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1562; CHECK-SD-NEXT: mov w8, #1895825407 // =0x70ffffff1563; CHECK-SD-NEXT: fmov s10, w81564; CHECK-SD-NEXT: mov x21, #-34359738368 // =0xfffffff8000000001565; CHECK-SD-NEXT: mov x22, #34359738367 // =0x7ffffffff1566; CHECK-SD-NEXT: mov s8, v0.s[1]1567; CHECK-SD-NEXT: fcmp s0, s91568; CHECK-SD-NEXT: csel x8, xzr, x0, lt1569; CHECK-SD-NEXT: csel x9, x21, x1, lt1570; CHECK-SD-NEXT: fcmp s0, s101571; CHECK-SD-NEXT: csel x9, x22, x9, gt1572; CHECK-SD-NEXT: csinv x8, x8, xzr, le1573; CHECK-SD-NEXT: fcmp s0, s01574; CHECK-SD-NEXT: fmov s0, s81575; CHECK-SD-NEXT: csel x19, xzr, x8, vs1576; CHECK-SD-NEXT: csel x20, xzr, x9, vs1577; CHECK-SD-NEXT: bl __fixsfti1578; CHECK-SD-NEXT: fcmp s8, s91579; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Reload1580; CHECK-SD-NEXT: csel x8, xzr, x0, lt1581; CHECK-SD-NEXT: csel x9, x21, x1, lt1582; CHECK-SD-NEXT: fcmp s8, s101583; CHECK-SD-NEXT: mov x0, x191584; CHECK-SD-NEXT: mov x1, x201585; CHECK-SD-NEXT: ldr d10, [sp, #16] // 8-byte Reload1586; CHECK-SD-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload1587; CHECK-SD-NEXT: csel x9, x22, x9, gt1588; CHECK-SD-NEXT: csinv x8, x8, xzr, le1589; CHECK-SD-NEXT: fcmp s8, s81590; CHECK-SD-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload1591; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload1592; CHECK-SD-NEXT: csel x2, xzr, x8, vs1593; CHECK-SD-NEXT: csel x3, xzr, x9, vs1594; CHECK-SD-NEXT: add sp, sp, #801595; CHECK-SD-NEXT: ret1596;1597; CHECK-GI-LABEL: test_signed_v2f32_v2i100:1598; CHECK-GI: // %bb.0:1599; CHECK-GI-NEXT: sub sp, sp, #801600; CHECK-GI-NEXT: str d10, [sp, #16] // 8-byte Spill1601; CHECK-GI-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill1602; CHECK-GI-NEXT: str x30, [sp, #40] // 8-byte Spill1603; CHECK-GI-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill1604; CHECK-GI-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill1605; CHECK-GI-NEXT: .cfi_def_cfa_offset 801606; CHECK-GI-NEXT: .cfi_offset w19, -81607; CHECK-GI-NEXT: .cfi_offset w20, -161608; CHECK-GI-NEXT: .cfi_offset w21, -241609; CHECK-GI-NEXT: .cfi_offset w22, -321610; CHECK-GI-NEXT: .cfi_offset w30, -401611; CHECK-GI-NEXT: .cfi_offset b8, -481612; CHECK-GI-NEXT: .cfi_offset b9, -561613; CHECK-GI-NEXT: .cfi_offset b10, -641614; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01615; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1616; CHECK-GI-NEXT: mov s8, v0.s[1]1617; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q01618; CHECK-GI-NEXT: bl __fixsfti1619; CHECK-GI-NEXT: movi v9.2s, #241, lsl #241620; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload1621; CHECK-GI-NEXT: mov w8, #1895825407 // =0x70ffffff1622; CHECK-GI-NEXT: fmov s10, w81623; CHECK-GI-NEXT: mov x21, #34359738368 // =0x8000000001624; CHECK-GI-NEXT: mov x22, #34359738367 // =0x7ffffffff1625; CHECK-GI-NEXT: fcmp s0, s91626; CHECK-GI-NEXT: csel x8, xzr, x0, lt1627; CHECK-GI-NEXT: csel x9, x21, x1, lt1628; CHECK-GI-NEXT: fcmp s0, s101629; CHECK-GI-NEXT: csinv x8, x8, xzr, le1630; CHECK-GI-NEXT: csel x9, x22, x9, gt1631; CHECK-GI-NEXT: fcmp s0, s01632; CHECK-GI-NEXT: fmov s0, s81633; CHECK-GI-NEXT: csel x19, xzr, x8, vs1634; CHECK-GI-NEXT: csel x20, xzr, x9, vs1635; CHECK-GI-NEXT: bl __fixsfti1636; CHECK-GI-NEXT: fcmp s8, s91637; CHECK-GI-NEXT: ldr x30, [sp, #40] // 8-byte Reload1638; CHECK-GI-NEXT: csel x8, xzr, x0, lt1639; CHECK-GI-NEXT: csel x9, x21, x1, lt1640; CHECK-GI-NEXT: fcmp s8, s101641; CHECK-GI-NEXT: mov x0, x191642; CHECK-GI-NEXT: mov x1, x201643; CHECK-GI-NEXT: ldr d10, [sp, #16] // 8-byte Reload1644; CHECK-GI-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload1645; CHECK-GI-NEXT: csinv x8, x8, xzr, le1646; CHECK-GI-NEXT: csel x9, x22, x9, gt1647; CHECK-GI-NEXT: fcmp s8, s81648; CHECK-GI-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload1649; CHECK-GI-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload1650; CHECK-GI-NEXT: csel x2, xzr, x8, vs1651; CHECK-GI-NEXT: csel x3, xzr, x9, vs1652; CHECK-GI-NEXT: add sp, sp, #801653; CHECK-GI-NEXT: ret1654 %x = call <2 x i100> @llvm.fptosi.sat.v2f32.v2i100(<2 x float> %f)1655 ret <2 x i100> %x1656}1657 1658define <2 x i128> @test_signed_v2f32_v2i128(<2 x float> %f) {1659; CHECK-SD-LABEL: test_signed_v2f32_v2i128:1660; CHECK-SD: // %bb.0:1661; CHECK-SD-NEXT: sub sp, sp, #801662; CHECK-SD-NEXT: str d10, [sp, #16] // 8-byte Spill1663; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill1664; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Spill1665; CHECK-SD-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill1666; CHECK-SD-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill1667; CHECK-SD-NEXT: .cfi_def_cfa_offset 801668; CHECK-SD-NEXT: .cfi_offset w19, -81669; CHECK-SD-NEXT: .cfi_offset w20, -161670; CHECK-SD-NEXT: .cfi_offset w21, -241671; CHECK-SD-NEXT: .cfi_offset w22, -321672; CHECK-SD-NEXT: .cfi_offset w30, -401673; CHECK-SD-NEXT: .cfi_offset b8, -481674; CHECK-SD-NEXT: .cfi_offset b9, -561675; CHECK-SD-NEXT: .cfi_offset b10, -641676; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01677; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1678; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01679; CHECK-SD-NEXT: bl __fixsfti1680; CHECK-SD-NEXT: movi v9.2s, #255, lsl #241681; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1682; CHECK-SD-NEXT: mov w8, #2130706431 // =0x7effffff1683; CHECK-SD-NEXT: fmov s10, w81684; CHECK-SD-NEXT: mov x21, #-9223372036854775808 // =0x80000000000000001685; CHECK-SD-NEXT: mov x22, #9223372036854775807 // =0x7fffffffffffffff1686; CHECK-SD-NEXT: mov s8, v0.s[1]1687; CHECK-SD-NEXT: fcmp s0, s91688; CHECK-SD-NEXT: csel x8, xzr, x0, lt1689; CHECK-SD-NEXT: csel x9, x21, x1, lt1690; CHECK-SD-NEXT: fcmp s0, s101691; CHECK-SD-NEXT: csel x9, x22, x9, gt1692; CHECK-SD-NEXT: csinv x8, x8, xzr, le1693; CHECK-SD-NEXT: fcmp s0, s01694; CHECK-SD-NEXT: fmov s0, s81695; CHECK-SD-NEXT: csel x19, xzr, x8, vs1696; CHECK-SD-NEXT: csel x20, xzr, x9, vs1697; CHECK-SD-NEXT: bl __fixsfti1698; CHECK-SD-NEXT: fcmp s8, s91699; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Reload1700; CHECK-SD-NEXT: csel x8, xzr, x0, lt1701; CHECK-SD-NEXT: csel x9, x21, x1, lt1702; CHECK-SD-NEXT: fcmp s8, s101703; CHECK-SD-NEXT: mov x0, x191704; CHECK-SD-NEXT: mov x1, x201705; CHECK-SD-NEXT: ldr d10, [sp, #16] // 8-byte Reload1706; CHECK-SD-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload1707; CHECK-SD-NEXT: csel x9, x22, x9, gt1708; CHECK-SD-NEXT: csinv x8, x8, xzr, le1709; CHECK-SD-NEXT: fcmp s8, s81710; CHECK-SD-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload1711; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload1712; CHECK-SD-NEXT: csel x2, xzr, x8, vs1713; CHECK-SD-NEXT: csel x3, xzr, x9, vs1714; CHECK-SD-NEXT: add sp, sp, #801715; CHECK-SD-NEXT: ret1716;1717; CHECK-GI-LABEL: test_signed_v2f32_v2i128:1718; CHECK-GI: // %bb.0:1719; CHECK-GI-NEXT: sub sp, sp, #801720; CHECK-GI-NEXT: str d10, [sp, #16] // 8-byte Spill1721; CHECK-GI-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill1722; CHECK-GI-NEXT: str x30, [sp, #40] // 8-byte Spill1723; CHECK-GI-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill1724; CHECK-GI-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill1725; CHECK-GI-NEXT: .cfi_def_cfa_offset 801726; CHECK-GI-NEXT: .cfi_offset w19, -81727; CHECK-GI-NEXT: .cfi_offset w20, -161728; CHECK-GI-NEXT: .cfi_offset w21, -241729; CHECK-GI-NEXT: .cfi_offset w22, -321730; CHECK-GI-NEXT: .cfi_offset w30, -401731; CHECK-GI-NEXT: .cfi_offset b8, -481732; CHECK-GI-NEXT: .cfi_offset b9, -561733; CHECK-GI-NEXT: .cfi_offset b10, -641734; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01735; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1736; CHECK-GI-NEXT: mov s8, v0.s[1]1737; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q01738; CHECK-GI-NEXT: bl __fixsfti1739; CHECK-GI-NEXT: movi v9.2s, #255, lsl #241740; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload1741; CHECK-GI-NEXT: mov w8, #2130706431 // =0x7effffff1742; CHECK-GI-NEXT: fmov s10, w81743; CHECK-GI-NEXT: mov x21, #-9223372036854775808 // =0x80000000000000001744; CHECK-GI-NEXT: mov x22, #9223372036854775807 // =0x7fffffffffffffff1745; CHECK-GI-NEXT: fcmp s0, s91746; CHECK-GI-NEXT: csel x8, xzr, x0, lt1747; CHECK-GI-NEXT: csel x9, x21, x1, lt1748; CHECK-GI-NEXT: fcmp s0, s101749; CHECK-GI-NEXT: csinv x8, x8, xzr, le1750; CHECK-GI-NEXT: csel x9, x22, x9, gt1751; CHECK-GI-NEXT: fcmp s0, s01752; CHECK-GI-NEXT: fmov s0, s81753; CHECK-GI-NEXT: csel x19, xzr, x8, vs1754; CHECK-GI-NEXT: csel x20, xzr, x9, vs1755; CHECK-GI-NEXT: bl __fixsfti1756; CHECK-GI-NEXT: fcmp s8, s91757; CHECK-GI-NEXT: ldr x30, [sp, #40] // 8-byte Reload1758; CHECK-GI-NEXT: csel x8, xzr, x0, lt1759; CHECK-GI-NEXT: csel x9, x21, x1, lt1760; CHECK-GI-NEXT: fcmp s8, s101761; CHECK-GI-NEXT: mov x0, x191762; CHECK-GI-NEXT: mov x1, x201763; CHECK-GI-NEXT: ldr d10, [sp, #16] // 8-byte Reload1764; CHECK-GI-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload1765; CHECK-GI-NEXT: csinv x8, x8, xzr, le1766; CHECK-GI-NEXT: csel x9, x22, x9, gt1767; CHECK-GI-NEXT: fcmp s8, s81768; CHECK-GI-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload1769; CHECK-GI-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload1770; CHECK-GI-NEXT: csel x2, xzr, x8, vs1771; CHECK-GI-NEXT: csel x3, xzr, x9, vs1772; CHECK-GI-NEXT: add sp, sp, #801773; CHECK-GI-NEXT: ret1774 %x = call <2 x i128> @llvm.fptosi.sat.v2f32.v2i128(<2 x float> %f)1775 ret <2 x i128> %x1776}1777 1778;1779; 4-Vector float to signed integer -- result size variation1780;1781 1782declare <4 x i1> @llvm.fptosi.sat.v4f32.v4i1 (<4 x float>)1783declare <4 x i8> @llvm.fptosi.sat.v4f32.v4i8 (<4 x float>)1784declare <4 x i13> @llvm.fptosi.sat.v4f32.v4i13 (<4 x float>)1785declare <4 x i16> @llvm.fptosi.sat.v4f32.v4i16 (<4 x float>)1786declare <4 x i19> @llvm.fptosi.sat.v4f32.v4i19 (<4 x float>)1787declare <4 x i50> @llvm.fptosi.sat.v4f32.v4i50 (<4 x float>)1788declare <4 x i64> @llvm.fptosi.sat.v4f32.v4i64 (<4 x float>)1789declare <4 x i100> @llvm.fptosi.sat.v4f32.v4i100(<4 x float>)1790declare <4 x i128> @llvm.fptosi.sat.v4f32.v4i128(<4 x float>)1791 1792define <4 x i1> @test_signed_v4f32_v4i1(<4 x float> %f) {1793; CHECK-SD-LABEL: test_signed_v4f32_v4i1:1794; CHECK-SD: // %bb.0:1795; CHECK-SD-NEXT: movi v1.2d, #00000000000000001796; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s1797; CHECK-SD-NEXT: smin v0.4s, v0.4s, v1.4s1798; CHECK-SD-NEXT: movi v1.2d, #0xffffffffffffffff1799; CHECK-SD-NEXT: smax v0.4s, v0.4s, v1.4s1800; CHECK-SD-NEXT: xtn v0.4h, v0.4s1801; CHECK-SD-NEXT: ret1802;1803; CHECK-GI-LABEL: test_signed_v4f32_v4i1:1804; CHECK-GI: // %bb.0:1805; CHECK-GI-NEXT: movi v1.2d, #00000000000000001806; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s1807; CHECK-GI-NEXT: movi v2.2d, #0xffffffffffffffff1808; CHECK-GI-NEXT: smin v0.4s, v0.4s, v1.4s1809; CHECK-GI-NEXT: smax v0.4s, v0.4s, v2.4s1810; CHECK-GI-NEXT: xtn v0.4h, v0.4s1811; CHECK-GI-NEXT: ret1812 %x = call <4 x i1> @llvm.fptosi.sat.v4f32.v4i1(<4 x float> %f)1813 ret <4 x i1> %x1814}1815 1816define <4 x i8> @test_signed_v4f32_v4i8(<4 x float> %f) {1817; CHECK-LABEL: test_signed_v4f32_v4i8:1818; CHECK: // %bb.0:1819; CHECK-NEXT: movi v1.4s, #1271820; CHECK-NEXT: fcvtzs v0.4s, v0.4s1821; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s1822; CHECK-NEXT: mvni v1.4s, #1271823; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s1824; CHECK-NEXT: xtn v0.4h, v0.4s1825; CHECK-NEXT: ret1826 %x = call <4 x i8> @llvm.fptosi.sat.v4f32.v4i8(<4 x float> %f)1827 ret <4 x i8> %x1828}1829 1830define <4 x i13> @test_signed_v4f32_v4i13(<4 x float> %f) {1831; CHECK-LABEL: test_signed_v4f32_v4i13:1832; CHECK: // %bb.0:1833; CHECK-NEXT: movi v1.4s, #15, msl #81834; CHECK-NEXT: fcvtzs v0.4s, v0.4s1835; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s1836; CHECK-NEXT: mvni v1.4s, #15, msl #81837; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s1838; CHECK-NEXT: xtn v0.4h, v0.4s1839; CHECK-NEXT: ret1840 %x = call <4 x i13> @llvm.fptosi.sat.v4f32.v4i13(<4 x float> %f)1841 ret <4 x i13> %x1842}1843 1844define <4 x i16> @test_signed_v4f32_v4i16(<4 x float> %f) {1845; CHECK-LABEL: test_signed_v4f32_v4i16:1846; CHECK: // %bb.0:1847; CHECK-NEXT: fcvtzs v0.4s, v0.4s1848; CHECK-NEXT: sqxtn v0.4h, v0.4s1849; CHECK-NEXT: ret1850 %x = call <4 x i16> @llvm.fptosi.sat.v4f32.v4i16(<4 x float> %f)1851 ret <4 x i16> %x1852}1853 1854define <4 x i19> @test_signed_v4f32_v4i19(<4 x float> %f) {1855; CHECK-LABEL: test_signed_v4f32_v4i19:1856; CHECK: // %bb.0:1857; CHECK-NEXT: movi v1.4s, #3, msl #161858; CHECK-NEXT: fcvtzs v0.4s, v0.4s1859; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s1860; CHECK-NEXT: mvni v1.4s, #3, msl #161861; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s1862; CHECK-NEXT: ret1863 %x = call <4 x i19> @llvm.fptosi.sat.v4f32.v4i19(<4 x float> %f)1864 ret <4 x i19> %x1865}1866 1867define <4 x i32> @test_signed_v4f32_v4i32_duplicate(<4 x float> %f) {1868; CHECK-LABEL: test_signed_v4f32_v4i32_duplicate:1869; CHECK: // %bb.0:1870; CHECK-NEXT: fcvtzs v0.4s, v0.4s1871; CHECK-NEXT: ret1872 %x = call <4 x i32> @llvm.fptosi.sat.v4f32.v4i32(<4 x float> %f)1873 ret <4 x i32> %x1874}1875 1876define <4 x i50> @test_signed_v4f32_v4i50(<4 x float> %f) {1877; CHECK-LABEL: test_signed_v4f32_v4i50:1878; CHECK: // %bb.0:1879; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #81880; CHECK-NEXT: mov x8, #562949953421311 // =0x1ffffffffffff1881; CHECK-NEXT: mov x11, #-562949953421312 // =0xfffe0000000000001882; CHECK-NEXT: fcvtzs x12, s01883; CHECK-NEXT: mov s2, v1.s[1]1884; CHECK-NEXT: fcvtzs x9, s11885; CHECK-NEXT: mov s1, v0.s[1]1886; CHECK-NEXT: fcvtzs x10, s21887; CHECK-NEXT: cmp x9, x81888; CHECK-NEXT: csel x9, x9, x8, lt1889; CHECK-NEXT: cmp x9, x111890; CHECK-NEXT: csel x2, x9, x11, gt1891; CHECK-NEXT: cmp x10, x81892; CHECK-NEXT: csel x9, x10, x8, lt1893; CHECK-NEXT: fcvtzs x10, s11894; CHECK-NEXT: cmp x9, x111895; CHECK-NEXT: csel x3, x9, x11, gt1896; CHECK-NEXT: cmp x12, x81897; CHECK-NEXT: csel x9, x12, x8, lt1898; CHECK-NEXT: cmp x9, x111899; CHECK-NEXT: csel x0, x9, x11, gt1900; CHECK-NEXT: cmp x10, x81901; CHECK-NEXT: csel x8, x10, x8, lt1902; CHECK-NEXT: cmp x8, x111903; CHECK-NEXT: csel x1, x8, x11, gt1904; CHECK-NEXT: ret1905 %x = call <4 x i50> @llvm.fptosi.sat.v4f32.v4i50(<4 x float> %f)1906 ret <4 x i50> %x1907}1908 1909define <4 x i64> @test_signed_v4f32_v4i64(<4 x float> %f) {1910; CHECK-SD-LABEL: test_signed_v4f32_v4i64:1911; CHECK-SD: // %bb.0:1912; CHECK-SD-NEXT: fcvtl2 v1.2d, v0.4s1913; CHECK-SD-NEXT: fcvtl v0.2d, v0.2s1914; CHECK-SD-NEXT: fcvtzs v1.2d, v1.2d1915; CHECK-SD-NEXT: fcvtzs v0.2d, v0.2d1916; CHECK-SD-NEXT: ret1917;1918; CHECK-GI-LABEL: test_signed_v4f32_v4i64:1919; CHECK-GI: // %bb.0:1920; CHECK-GI-NEXT: fcvtl v1.2d, v0.2s1921; CHECK-GI-NEXT: fcvtl2 v2.2d, v0.4s1922; CHECK-GI-NEXT: fcvtzs v0.2d, v1.2d1923; CHECK-GI-NEXT: fcvtzs v1.2d, v2.2d1924; CHECK-GI-NEXT: ret1925 %x = call <4 x i64> @llvm.fptosi.sat.v4f32.v4i64(<4 x float> %f)1926 ret <4 x i64> %x1927}1928 1929define <4 x i100> @test_signed_v4f32_v4i100(<4 x float> %f) {1930; CHECK-SD-LABEL: test_signed_v4f32_v4i100:1931; CHECK-SD: // %bb.0:1932; CHECK-SD-NEXT: sub sp, sp, #1121933; CHECK-SD-NEXT: str d10, [sp, #16] // 8-byte Spill1934; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill1935; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Spill1936; CHECK-SD-NEXT: stp x26, x25, [sp, #48] // 16-byte Folded Spill1937; CHECK-SD-NEXT: stp x24, x23, [sp, #64] // 16-byte Folded Spill1938; CHECK-SD-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill1939; CHECK-SD-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill1940; CHECK-SD-NEXT: .cfi_def_cfa_offset 1121941; CHECK-SD-NEXT: .cfi_offset w19, -81942; CHECK-SD-NEXT: .cfi_offset w20, -161943; CHECK-SD-NEXT: .cfi_offset w21, -241944; CHECK-SD-NEXT: .cfi_offset w22, -321945; CHECK-SD-NEXT: .cfi_offset w23, -401946; CHECK-SD-NEXT: .cfi_offset w24, -481947; CHECK-SD-NEXT: .cfi_offset w25, -561948; CHECK-SD-NEXT: .cfi_offset w26, -641949; CHECK-SD-NEXT: .cfi_offset w30, -721950; CHECK-SD-NEXT: .cfi_offset b8, -801951; CHECK-SD-NEXT: .cfi_offset b9, -881952; CHECK-SD-NEXT: .cfi_offset b10, -961953; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1954; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01955; CHECK-SD-NEXT: bl __fixsfti1956; CHECK-SD-NEXT: movi v9.2s, #241, lsl #241957; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1958; CHECK-SD-NEXT: mov w8, #1895825407 // =0x70ffffff1959; CHECK-SD-NEXT: fmov s10, w81960; CHECK-SD-NEXT: mov x25, #-34359738368 // =0xfffffff8000000001961; CHECK-SD-NEXT: mov x26, #34359738367 // =0x7ffffffff1962; CHECK-SD-NEXT: mov s8, v0.s[1]1963; CHECK-SD-NEXT: fcmp s0, s91964; CHECK-SD-NEXT: csel x8, xzr, x0, lt1965; CHECK-SD-NEXT: csel x9, x25, x1, lt1966; CHECK-SD-NEXT: fcmp s0, s101967; CHECK-SD-NEXT: csel x9, x26, x9, gt1968; CHECK-SD-NEXT: csinv x8, x8, xzr, le1969; CHECK-SD-NEXT: fcmp s0, s01970; CHECK-SD-NEXT: fmov s0, s81971; CHECK-SD-NEXT: csel x19, xzr, x8, vs1972; CHECK-SD-NEXT: csel x20, xzr, x9, vs1973; CHECK-SD-NEXT: bl __fixsfti1974; CHECK-SD-NEXT: fcmp s8, s91975; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1976; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #81977; CHECK-SD-NEXT: csel x8, xzr, x0, lt1978; CHECK-SD-NEXT: csel x9, x25, x1, lt1979; CHECK-SD-NEXT: fcmp s8, s101980; CHECK-SD-NEXT: csel x9, x26, x9, gt1981; CHECK-SD-NEXT: csinv x8, x8, xzr, le1982; CHECK-SD-NEXT: fcmp s8, s81983; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1984; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01985; CHECK-SD-NEXT: csel x21, xzr, x8, vs1986; CHECK-SD-NEXT: csel x22, xzr, x9, vs1987; CHECK-SD-NEXT: bl __fixsfti1988; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1989; CHECK-SD-NEXT: fcmp s0, s91990; CHECK-SD-NEXT: mov s8, v0.s[1]1991; CHECK-SD-NEXT: csel x8, xzr, x0, lt1992; CHECK-SD-NEXT: csel x9, x25, x1, lt1993; CHECK-SD-NEXT: fcmp s0, s101994; CHECK-SD-NEXT: csel x9, x26, x9, gt1995; CHECK-SD-NEXT: csinv x8, x8, xzr, le1996; CHECK-SD-NEXT: fcmp s0, s01997; CHECK-SD-NEXT: fmov s0, s81998; CHECK-SD-NEXT: csel x23, xzr, x8, vs1999; CHECK-SD-NEXT: csel x24, xzr, x9, vs2000; CHECK-SD-NEXT: bl __fixsfti2001; CHECK-SD-NEXT: fcmp s8, s92002; CHECK-SD-NEXT: mov x2, x212003; CHECK-SD-NEXT: mov x3, x222004; CHECK-SD-NEXT: mov x4, x232005; CHECK-SD-NEXT: mov x5, x242006; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Reload2007; CHECK-SD-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload2008; CHECK-SD-NEXT: csel x8, xzr, x0, lt2009; CHECK-SD-NEXT: csel x9, x25, x1, lt2010; CHECK-SD-NEXT: fcmp s8, s102011; CHECK-SD-NEXT: mov x0, x192012; CHECK-SD-NEXT: mov x1, x202013; CHECK-SD-NEXT: ldr d10, [sp, #16] // 8-byte Reload2014; CHECK-SD-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload2015; CHECK-SD-NEXT: csel x9, x26, x9, gt2016; CHECK-SD-NEXT: csinv x8, x8, xzr, le2017; CHECK-SD-NEXT: fcmp s8, s82018; CHECK-SD-NEXT: ldp x24, x23, [sp, #64] // 16-byte Folded Reload2019; CHECK-SD-NEXT: ldp x26, x25, [sp, #48] // 16-byte Folded Reload2020; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload2021; CHECK-SD-NEXT: csel x6, xzr, x8, vs2022; CHECK-SD-NEXT: csel x7, xzr, x9, vs2023; CHECK-SD-NEXT: add sp, sp, #1122024; CHECK-SD-NEXT: ret2025;2026; CHECK-GI-LABEL: test_signed_v4f32_v4i100:2027; CHECK-GI: // %bb.0:2028; CHECK-GI-NEXT: sub sp, sp, #1282029; CHECK-GI-NEXT: str d12, [sp, #16] // 8-byte Spill2030; CHECK-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill2031; CHECK-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill2032; CHECK-GI-NEXT: str x30, [sp, #56] // 8-byte Spill2033; CHECK-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill2034; CHECK-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill2035; CHECK-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill2036; CHECK-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill2037; CHECK-GI-NEXT: .cfi_def_cfa_offset 1282038; CHECK-GI-NEXT: .cfi_offset w19, -82039; CHECK-GI-NEXT: .cfi_offset w20, -162040; CHECK-GI-NEXT: .cfi_offset w21, -242041; CHECK-GI-NEXT: .cfi_offset w22, -322042; CHECK-GI-NEXT: .cfi_offset w23, -402043; CHECK-GI-NEXT: .cfi_offset w24, -482044; CHECK-GI-NEXT: .cfi_offset w25, -562045; CHECK-GI-NEXT: .cfi_offset w26, -642046; CHECK-GI-NEXT: .cfi_offset w30, -722047; CHECK-GI-NEXT: .cfi_offset b8, -802048; CHECK-GI-NEXT: .cfi_offset b9, -882049; CHECK-GI-NEXT: .cfi_offset b10, -962050; CHECK-GI-NEXT: .cfi_offset b11, -1042051; CHECK-GI-NEXT: .cfi_offset b12, -1122052; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2053; CHECK-GI-NEXT: mov s9, v0.s[1]2054; CHECK-GI-NEXT: mov s10, v0.s[2]2055; CHECK-GI-NEXT: mov s8, v0.s[3]2056; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q02057; CHECK-GI-NEXT: bl __fixsfti2058; CHECK-GI-NEXT: movi v11.2s, #241, lsl #242059; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload2060; CHECK-GI-NEXT: mov w8, #1895825407 // =0x70ffffff2061; CHECK-GI-NEXT: fmov s12, w82062; CHECK-GI-NEXT: mov x25, #34359738368 // =0x8000000002063; CHECK-GI-NEXT: mov x26, #34359738367 // =0x7ffffffff2064; CHECK-GI-NEXT: fcmp s0, s112065; CHECK-GI-NEXT: csel x8, xzr, x0, lt2066; CHECK-GI-NEXT: csel x9, x25, x1, lt2067; CHECK-GI-NEXT: fcmp s0, s122068; CHECK-GI-NEXT: csinv x8, x8, xzr, le2069; CHECK-GI-NEXT: csel x9, x26, x9, gt2070; CHECK-GI-NEXT: fcmp s0, s02071; CHECK-GI-NEXT: fmov s0, s92072; CHECK-GI-NEXT: csel x19, xzr, x8, vs2073; CHECK-GI-NEXT: csel x20, xzr, x9, vs2074; CHECK-GI-NEXT: bl __fixsfti2075; CHECK-GI-NEXT: fcmp s9, s112076; CHECK-GI-NEXT: fmov s0, s102077; CHECK-GI-NEXT: csel x8, xzr, x0, lt2078; CHECK-GI-NEXT: csel x9, x25, x1, lt2079; CHECK-GI-NEXT: fcmp s9, s122080; CHECK-GI-NEXT: csinv x8, x8, xzr, le2081; CHECK-GI-NEXT: csel x9, x26, x9, gt2082; CHECK-GI-NEXT: fcmp s9, s92083; CHECK-GI-NEXT: csel x21, xzr, x8, vs2084; CHECK-GI-NEXT: csel x22, xzr, x9, vs2085; CHECK-GI-NEXT: bl __fixsfti2086; CHECK-GI-NEXT: fcmp s10, s112087; CHECK-GI-NEXT: fmov s0, s82088; CHECK-GI-NEXT: csel x8, xzr, x0, lt2089; CHECK-GI-NEXT: csel x9, x25, x1, lt2090; CHECK-GI-NEXT: fcmp s10, s122091; CHECK-GI-NEXT: csinv x8, x8, xzr, le2092; CHECK-GI-NEXT: csel x9, x26, x9, gt2093; CHECK-GI-NEXT: fcmp s10, s102094; CHECK-GI-NEXT: csel x23, xzr, x8, vs2095; CHECK-GI-NEXT: csel x24, xzr, x9, vs2096; CHECK-GI-NEXT: bl __fixsfti2097; CHECK-GI-NEXT: fcmp s8, s112098; CHECK-GI-NEXT: mov x2, x212099; CHECK-GI-NEXT: mov x3, x222100; CHECK-GI-NEXT: mov x4, x232101; CHECK-GI-NEXT: mov x5, x242102; CHECK-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload2103; CHECK-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload2104; CHECK-GI-NEXT: csel x8, xzr, x0, lt2105; CHECK-GI-NEXT: csel x9, x25, x1, lt2106; CHECK-GI-NEXT: fcmp s8, s122107; CHECK-GI-NEXT: mov x0, x192108; CHECK-GI-NEXT: mov x1, x202109; CHECK-GI-NEXT: ldr d12, [sp, #16] // 8-byte Reload2110; CHECK-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload2111; CHECK-GI-NEXT: csinv x8, x8, xzr, le2112; CHECK-GI-NEXT: csel x9, x26, x9, gt2113; CHECK-GI-NEXT: fcmp s8, s82114; CHECK-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload2115; CHECK-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload2116; CHECK-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload2117; CHECK-GI-NEXT: csel x6, xzr, x8, vs2118; CHECK-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload2119; CHECK-GI-NEXT: csel x7, xzr, x9, vs2120; CHECK-GI-NEXT: add sp, sp, #1282121; CHECK-GI-NEXT: ret2122 %x = call <4 x i100> @llvm.fptosi.sat.v4f32.v4i100(<4 x float> %f)2123 ret <4 x i100> %x2124}2125 2126define <4 x i128> @test_signed_v4f32_v4i128(<4 x float> %f) {2127; CHECK-SD-LABEL: test_signed_v4f32_v4i128:2128; CHECK-SD: // %bb.0:2129; CHECK-SD-NEXT: sub sp, sp, #1122130; CHECK-SD-NEXT: str d10, [sp, #16] // 8-byte Spill2131; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill2132; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Spill2133; CHECK-SD-NEXT: stp x26, x25, [sp, #48] // 16-byte Folded Spill2134; CHECK-SD-NEXT: stp x24, x23, [sp, #64] // 16-byte Folded Spill2135; CHECK-SD-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill2136; CHECK-SD-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill2137; CHECK-SD-NEXT: .cfi_def_cfa_offset 1122138; CHECK-SD-NEXT: .cfi_offset w19, -82139; CHECK-SD-NEXT: .cfi_offset w20, -162140; CHECK-SD-NEXT: .cfi_offset w21, -242141; CHECK-SD-NEXT: .cfi_offset w22, -322142; CHECK-SD-NEXT: .cfi_offset w23, -402143; CHECK-SD-NEXT: .cfi_offset w24, -482144; CHECK-SD-NEXT: .cfi_offset w25, -562145; CHECK-SD-NEXT: .cfi_offset w26, -642146; CHECK-SD-NEXT: .cfi_offset w30, -722147; CHECK-SD-NEXT: .cfi_offset b8, -802148; CHECK-SD-NEXT: .cfi_offset b9, -882149; CHECK-SD-NEXT: .cfi_offset b10, -962150; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2151; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q02152; CHECK-SD-NEXT: bl __fixsfti2153; CHECK-SD-NEXT: movi v9.2s, #255, lsl #242154; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2155; CHECK-SD-NEXT: mov w8, #2130706431 // =0x7effffff2156; CHECK-SD-NEXT: fmov s10, w82157; CHECK-SD-NEXT: mov x25, #-9223372036854775808 // =0x80000000000000002158; CHECK-SD-NEXT: mov x26, #9223372036854775807 // =0x7fffffffffffffff2159; CHECK-SD-NEXT: mov s8, v0.s[1]2160; CHECK-SD-NEXT: fcmp s0, s92161; CHECK-SD-NEXT: csel x8, xzr, x0, lt2162; CHECK-SD-NEXT: csel x9, x25, x1, lt2163; CHECK-SD-NEXT: fcmp s0, s102164; CHECK-SD-NEXT: csel x9, x26, x9, gt2165; CHECK-SD-NEXT: csinv x8, x8, xzr, le2166; CHECK-SD-NEXT: fcmp s0, s02167; CHECK-SD-NEXT: fmov s0, s82168; CHECK-SD-NEXT: csel x19, xzr, x8, vs2169; CHECK-SD-NEXT: csel x20, xzr, x9, vs2170; CHECK-SD-NEXT: bl __fixsfti2171; CHECK-SD-NEXT: fcmp s8, s92172; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2173; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #82174; CHECK-SD-NEXT: csel x8, xzr, x0, lt2175; CHECK-SD-NEXT: csel x9, x25, x1, lt2176; CHECK-SD-NEXT: fcmp s8, s102177; CHECK-SD-NEXT: csel x9, x26, x9, gt2178; CHECK-SD-NEXT: csinv x8, x8, xzr, le2179; CHECK-SD-NEXT: fcmp s8, s82180; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2181; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q02182; CHECK-SD-NEXT: csel x21, xzr, x8, vs2183; CHECK-SD-NEXT: csel x22, xzr, x9, vs2184; CHECK-SD-NEXT: bl __fixsfti2185; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2186; CHECK-SD-NEXT: fcmp s0, s92187; CHECK-SD-NEXT: mov s8, v0.s[1]2188; CHECK-SD-NEXT: csel x8, xzr, x0, lt2189; CHECK-SD-NEXT: csel x9, x25, x1, lt2190; CHECK-SD-NEXT: fcmp s0, s102191; CHECK-SD-NEXT: csel x9, x26, x9, gt2192; CHECK-SD-NEXT: csinv x8, x8, xzr, le2193; CHECK-SD-NEXT: fcmp s0, s02194; CHECK-SD-NEXT: fmov s0, s82195; CHECK-SD-NEXT: csel x23, xzr, x8, vs2196; CHECK-SD-NEXT: csel x24, xzr, x9, vs2197; CHECK-SD-NEXT: bl __fixsfti2198; CHECK-SD-NEXT: fcmp s8, s92199; CHECK-SD-NEXT: mov x2, x212200; CHECK-SD-NEXT: mov x3, x222201; CHECK-SD-NEXT: mov x4, x232202; CHECK-SD-NEXT: mov x5, x242203; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Reload2204; CHECK-SD-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload2205; CHECK-SD-NEXT: csel x8, xzr, x0, lt2206; CHECK-SD-NEXT: csel x9, x25, x1, lt2207; CHECK-SD-NEXT: fcmp s8, s102208; CHECK-SD-NEXT: mov x0, x192209; CHECK-SD-NEXT: mov x1, x202210; CHECK-SD-NEXT: ldr d10, [sp, #16] // 8-byte Reload2211; CHECK-SD-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload2212; CHECK-SD-NEXT: csel x9, x26, x9, gt2213; CHECK-SD-NEXT: csinv x8, x8, xzr, le2214; CHECK-SD-NEXT: fcmp s8, s82215; CHECK-SD-NEXT: ldp x24, x23, [sp, #64] // 16-byte Folded Reload2216; CHECK-SD-NEXT: ldp x26, x25, [sp, #48] // 16-byte Folded Reload2217; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload2218; CHECK-SD-NEXT: csel x6, xzr, x8, vs2219; CHECK-SD-NEXT: csel x7, xzr, x9, vs2220; CHECK-SD-NEXT: add sp, sp, #1122221; CHECK-SD-NEXT: ret2222;2223; CHECK-GI-LABEL: test_signed_v4f32_v4i128:2224; CHECK-GI: // %bb.0:2225; CHECK-GI-NEXT: sub sp, sp, #1282226; CHECK-GI-NEXT: str d12, [sp, #16] // 8-byte Spill2227; CHECK-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill2228; CHECK-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill2229; CHECK-GI-NEXT: str x30, [sp, #56] // 8-byte Spill2230; CHECK-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill2231; CHECK-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill2232; CHECK-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill2233; CHECK-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill2234; CHECK-GI-NEXT: .cfi_def_cfa_offset 1282235; CHECK-GI-NEXT: .cfi_offset w19, -82236; CHECK-GI-NEXT: .cfi_offset w20, -162237; CHECK-GI-NEXT: .cfi_offset w21, -242238; CHECK-GI-NEXT: .cfi_offset w22, -322239; CHECK-GI-NEXT: .cfi_offset w23, -402240; CHECK-GI-NEXT: .cfi_offset w24, -482241; CHECK-GI-NEXT: .cfi_offset w25, -562242; CHECK-GI-NEXT: .cfi_offset w26, -642243; CHECK-GI-NEXT: .cfi_offset w30, -722244; CHECK-GI-NEXT: .cfi_offset b8, -802245; CHECK-GI-NEXT: .cfi_offset b9, -882246; CHECK-GI-NEXT: .cfi_offset b10, -962247; CHECK-GI-NEXT: .cfi_offset b11, -1042248; CHECK-GI-NEXT: .cfi_offset b12, -1122249; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2250; CHECK-GI-NEXT: mov s9, v0.s[1]2251; CHECK-GI-NEXT: mov s10, v0.s[2]2252; CHECK-GI-NEXT: mov s8, v0.s[3]2253; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q02254; CHECK-GI-NEXT: bl __fixsfti2255; CHECK-GI-NEXT: movi v11.2s, #255, lsl #242256; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload2257; CHECK-GI-NEXT: mov w8, #2130706431 // =0x7effffff2258; CHECK-GI-NEXT: fmov s12, w82259; CHECK-GI-NEXT: mov x25, #-9223372036854775808 // =0x80000000000000002260; CHECK-GI-NEXT: mov x26, #9223372036854775807 // =0x7fffffffffffffff2261; CHECK-GI-NEXT: fcmp s0, s112262; CHECK-GI-NEXT: csel x8, xzr, x0, lt2263; CHECK-GI-NEXT: csel x9, x25, x1, lt2264; CHECK-GI-NEXT: fcmp s0, s122265; CHECK-GI-NEXT: csinv x8, x8, xzr, le2266; CHECK-GI-NEXT: csel x9, x26, x9, gt2267; CHECK-GI-NEXT: fcmp s0, s02268; CHECK-GI-NEXT: fmov s0, s92269; CHECK-GI-NEXT: csel x19, xzr, x8, vs2270; CHECK-GI-NEXT: csel x20, xzr, x9, vs2271; CHECK-GI-NEXT: bl __fixsfti2272; CHECK-GI-NEXT: fcmp s9, s112273; CHECK-GI-NEXT: fmov s0, s102274; CHECK-GI-NEXT: csel x8, xzr, x0, lt2275; CHECK-GI-NEXT: csel x9, x25, x1, lt2276; CHECK-GI-NEXT: fcmp s9, s122277; CHECK-GI-NEXT: csinv x8, x8, xzr, le2278; CHECK-GI-NEXT: csel x9, x26, x9, gt2279; CHECK-GI-NEXT: fcmp s9, s92280; CHECK-GI-NEXT: csel x21, xzr, x8, vs2281; CHECK-GI-NEXT: csel x22, xzr, x9, vs2282; CHECK-GI-NEXT: bl __fixsfti2283; CHECK-GI-NEXT: fcmp s10, s112284; CHECK-GI-NEXT: fmov s0, s82285; CHECK-GI-NEXT: csel x8, xzr, x0, lt2286; CHECK-GI-NEXT: csel x9, x25, x1, lt2287; CHECK-GI-NEXT: fcmp s10, s122288; CHECK-GI-NEXT: csinv x8, x8, xzr, le2289; CHECK-GI-NEXT: csel x9, x26, x9, gt2290; CHECK-GI-NEXT: fcmp s10, s102291; CHECK-GI-NEXT: csel x23, xzr, x8, vs2292; CHECK-GI-NEXT: csel x24, xzr, x9, vs2293; CHECK-GI-NEXT: bl __fixsfti2294; CHECK-GI-NEXT: fcmp s8, s112295; CHECK-GI-NEXT: mov x2, x212296; CHECK-GI-NEXT: mov x3, x222297; CHECK-GI-NEXT: mov x4, x232298; CHECK-GI-NEXT: mov x5, x242299; CHECK-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload2300; CHECK-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload2301; CHECK-GI-NEXT: csel x8, xzr, x0, lt2302; CHECK-GI-NEXT: csel x9, x25, x1, lt2303; CHECK-GI-NEXT: fcmp s8, s122304; CHECK-GI-NEXT: mov x0, x192305; CHECK-GI-NEXT: mov x1, x202306; CHECK-GI-NEXT: ldr d12, [sp, #16] // 8-byte Reload2307; CHECK-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload2308; CHECK-GI-NEXT: csinv x8, x8, xzr, le2309; CHECK-GI-NEXT: csel x9, x26, x9, gt2310; CHECK-GI-NEXT: fcmp s8, s82311; CHECK-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload2312; CHECK-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload2313; CHECK-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload2314; CHECK-GI-NEXT: csel x6, xzr, x8, vs2315; CHECK-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload2316; CHECK-GI-NEXT: csel x7, xzr, x9, vs2317; CHECK-GI-NEXT: add sp, sp, #1282318; CHECK-GI-NEXT: ret2319 %x = call <4 x i128> @llvm.fptosi.sat.v4f32.v4i128(<4 x float> %f)2320 ret <4 x i128> %x2321}2322 2323;2324; 2-Vector double to signed integer -- result size variation2325;2326 2327declare <2 x i1> @llvm.fptosi.sat.v2f64.v2i1 (<2 x double>)2328declare <2 x i8> @llvm.fptosi.sat.v2f64.v2i8 (<2 x double>)2329declare <2 x i13> @llvm.fptosi.sat.v2f64.v2i13 (<2 x double>)2330declare <2 x i16> @llvm.fptosi.sat.v2f64.v2i16 (<2 x double>)2331declare <2 x i19> @llvm.fptosi.sat.v2f64.v2i19 (<2 x double>)2332declare <2 x i50> @llvm.fptosi.sat.v2f64.v2i50 (<2 x double>)2333declare <2 x i64> @llvm.fptosi.sat.v2f64.v2i64 (<2 x double>)2334declare <2 x i100> @llvm.fptosi.sat.v2f64.v2i100(<2 x double>)2335declare <2 x i128> @llvm.fptosi.sat.v2f64.v2i128(<2 x double>)2336 2337define <2 x i1> @test_signed_v2f64_v2i1(<2 x double> %f) {2338; CHECK-SD-LABEL: test_signed_v2f64_v2i1:2339; CHECK-SD: // %bb.0:2340; CHECK-SD-NEXT: mov d1, v0.d[1]2341; CHECK-SD-NEXT: fcvtzs w9, d02342; CHECK-SD-NEXT: fcvtzs w8, d12343; CHECK-SD-NEXT: ands w8, w8, w8, asr #312344; CHECK-SD-NEXT: csinv w8, w8, wzr, pl2345; CHECK-SD-NEXT: ands w9, w9, w9, asr #312346; CHECK-SD-NEXT: csinv w9, w9, wzr, pl2347; CHECK-SD-NEXT: fmov s0, w92348; CHECK-SD-NEXT: mov v0.s[1], w82349; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02350; CHECK-SD-NEXT: ret2351;2352; CHECK-GI-LABEL: test_signed_v2f64_v2i1:2353; CHECK-GI: // %bb.0:2354; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d2355; CHECK-GI-NEXT: cmlt v1.2d, v0.2d, #02356; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b2357; CHECK-GI-NEXT: movi v1.2d, #0xffffffffffffffff2358; CHECK-GI-NEXT: cmge v2.2d, v0.2d, #02359; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2360; CHECK-GI-NEXT: xtn v0.2s, v0.2d2361; CHECK-GI-NEXT: ret2362 %x = call <2 x i1> @llvm.fptosi.sat.v2f64.v2i1(<2 x double> %f)2363 ret <2 x i1> %x2364}2365 2366define <2 x i8> @test_signed_v2f64_v2i8(<2 x double> %f) {2367; CHECK-SD-LABEL: test_signed_v2f64_v2i8:2368; CHECK-SD: // %bb.0:2369; CHECK-SD-NEXT: mov d1, v0.d[1]2370; CHECK-SD-NEXT: fcvtzs w10, d02371; CHECK-SD-NEXT: mov w8, #127 // =0x7f2372; CHECK-SD-NEXT: mov w11, #-128 // =0xffffff802373; CHECK-SD-NEXT: fcvtzs w9, d12374; CHECK-SD-NEXT: cmp w9, #1272375; CHECK-SD-NEXT: csel w9, w9, w8, lt2376; CHECK-SD-NEXT: cmn w9, #1282377; CHECK-SD-NEXT: csel w9, w9, w11, gt2378; CHECK-SD-NEXT: cmp w10, #1272379; CHECK-SD-NEXT: csel w8, w10, w8, lt2380; CHECK-SD-NEXT: cmn w8, #1282381; CHECK-SD-NEXT: csel w8, w8, w11, gt2382; CHECK-SD-NEXT: fmov s0, w82383; CHECK-SD-NEXT: mov v0.s[1], w92384; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02385; CHECK-SD-NEXT: ret2386;2387; CHECK-GI-LABEL: test_signed_v2f64_v2i8:2388; CHECK-GI: // %bb.0:2389; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d2390; CHECK-GI-NEXT: adrp x8, .LCPI47_12391; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI47_1]2392; CHECK-GI-NEXT: adrp x8, .LCPI47_02393; CHECK-GI-NEXT: cmgt v2.2d, v1.2d, v0.2d2394; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2395; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI47_0]2396; CHECK-GI-NEXT: cmgt v2.2d, v0.2d, v1.2d2397; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2398; CHECK-GI-NEXT: xtn v0.2s, v0.2d2399; CHECK-GI-NEXT: ret2400 %x = call <2 x i8> @llvm.fptosi.sat.v2f64.v2i8(<2 x double> %f)2401 ret <2 x i8> %x2402}2403 2404define <2 x i13> @test_signed_v2f64_v2i13(<2 x double> %f) {2405; CHECK-SD-LABEL: test_signed_v2f64_v2i13:2406; CHECK-SD: // %bb.0:2407; CHECK-SD-NEXT: mov d1, v0.d[1]2408; CHECK-SD-NEXT: fcvtzs w10, d02409; CHECK-SD-NEXT: mov w8, #4095 // =0xfff2410; CHECK-SD-NEXT: mov w11, #-4096 // =0xfffff0002411; CHECK-SD-NEXT: fcvtzs w9, d12412; CHECK-SD-NEXT: cmp w9, #40952413; CHECK-SD-NEXT: csel w9, w9, w8, lt2414; CHECK-SD-NEXT: cmn w9, #1, lsl #12 // =40962415; CHECK-SD-NEXT: csel w9, w9, w11, gt2416; CHECK-SD-NEXT: cmp w10, #40952417; CHECK-SD-NEXT: csel w8, w10, w8, lt2418; CHECK-SD-NEXT: cmn w8, #1, lsl #12 // =40962419; CHECK-SD-NEXT: csel w8, w8, w11, gt2420; CHECK-SD-NEXT: fmov s0, w82421; CHECK-SD-NEXT: mov v0.s[1], w92422; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02423; CHECK-SD-NEXT: ret2424;2425; CHECK-GI-LABEL: test_signed_v2f64_v2i13:2426; CHECK-GI: // %bb.0:2427; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d2428; CHECK-GI-NEXT: adrp x8, .LCPI48_12429; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI48_1]2430; CHECK-GI-NEXT: adrp x8, .LCPI48_02431; CHECK-GI-NEXT: cmgt v2.2d, v1.2d, v0.2d2432; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2433; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI48_0]2434; CHECK-GI-NEXT: cmgt v2.2d, v0.2d, v1.2d2435; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2436; CHECK-GI-NEXT: xtn v0.2s, v0.2d2437; CHECK-GI-NEXT: ret2438 %x = call <2 x i13> @llvm.fptosi.sat.v2f64.v2i13(<2 x double> %f)2439 ret <2 x i13> %x2440}2441 2442define <2 x i16> @test_signed_v2f64_v2i16(<2 x double> %f) {2443; CHECK-SD-LABEL: test_signed_v2f64_v2i16:2444; CHECK-SD: // %bb.0:2445; CHECK-SD-NEXT: mov d1, v0.d[1]2446; CHECK-SD-NEXT: mov w8, #32767 // =0x7fff2447; CHECK-SD-NEXT: fcvtzs w10, d02448; CHECK-SD-NEXT: mov w11, #-32768 // =0xffff80002449; CHECK-SD-NEXT: fcvtzs w9, d12450; CHECK-SD-NEXT: cmp w9, w82451; CHECK-SD-NEXT: csel w9, w9, w8, lt2452; CHECK-SD-NEXT: cmn w9, #8, lsl #12 // =327682453; CHECK-SD-NEXT: csel w9, w9, w11, gt2454; CHECK-SD-NEXT: cmp w10, w82455; CHECK-SD-NEXT: csel w8, w10, w8, lt2456; CHECK-SD-NEXT: cmn w8, #8, lsl #12 // =327682457; CHECK-SD-NEXT: csel w8, w8, w11, gt2458; CHECK-SD-NEXT: fmov s0, w82459; CHECK-SD-NEXT: mov v0.s[1], w92460; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02461; CHECK-SD-NEXT: ret2462;2463; CHECK-GI-LABEL: test_signed_v2f64_v2i16:2464; CHECK-GI: // %bb.0:2465; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d2466; CHECK-GI-NEXT: adrp x8, .LCPI49_12467; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI49_1]2468; CHECK-GI-NEXT: adrp x8, .LCPI49_02469; CHECK-GI-NEXT: cmgt v2.2d, v1.2d, v0.2d2470; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2471; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI49_0]2472; CHECK-GI-NEXT: cmgt v2.2d, v0.2d, v1.2d2473; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2474; CHECK-GI-NEXT: xtn v0.2s, v0.2d2475; CHECK-GI-NEXT: ret2476 %x = call <2 x i16> @llvm.fptosi.sat.v2f64.v2i16(<2 x double> %f)2477 ret <2 x i16> %x2478}2479 2480define <2 x i19> @test_signed_v2f64_v2i19(<2 x double> %f) {2481; CHECK-SD-LABEL: test_signed_v2f64_v2i19:2482; CHECK-SD: // %bb.0:2483; CHECK-SD-NEXT: mov d1, v0.d[1]2484; CHECK-SD-NEXT: mov w8, #262143 // =0x3ffff2485; CHECK-SD-NEXT: fcvtzs w10, d02486; CHECK-SD-NEXT: mov w11, #-262144 // =0xfffc00002487; CHECK-SD-NEXT: fcvtzs w9, d12488; CHECK-SD-NEXT: cmp w9, w82489; CHECK-SD-NEXT: csel w9, w9, w8, lt2490; CHECK-SD-NEXT: cmn w9, #64, lsl #12 // =2621442491; CHECK-SD-NEXT: csel w9, w9, w11, gt2492; CHECK-SD-NEXT: cmp w10, w82493; CHECK-SD-NEXT: csel w8, w10, w8, lt2494; CHECK-SD-NEXT: cmn w8, #64, lsl #12 // =2621442495; CHECK-SD-NEXT: csel w8, w8, w11, gt2496; CHECK-SD-NEXT: fmov s0, w82497; CHECK-SD-NEXT: mov v0.s[1], w92498; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02499; CHECK-SD-NEXT: ret2500;2501; CHECK-GI-LABEL: test_signed_v2f64_v2i19:2502; CHECK-GI: // %bb.0:2503; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d2504; CHECK-GI-NEXT: adrp x8, .LCPI50_12505; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI50_1]2506; CHECK-GI-NEXT: adrp x8, .LCPI50_02507; CHECK-GI-NEXT: cmgt v2.2d, v1.2d, v0.2d2508; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2509; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI50_0]2510; CHECK-GI-NEXT: cmgt v2.2d, v0.2d, v1.2d2511; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2512; CHECK-GI-NEXT: xtn v0.2s, v0.2d2513; CHECK-GI-NEXT: ret2514 %x = call <2 x i19> @llvm.fptosi.sat.v2f64.v2i19(<2 x double> %f)2515 ret <2 x i19> %x2516}2517 2518define <2 x i32> @test_signed_v2f64_v2i32_duplicate(<2 x double> %f) {2519; CHECK-SD-LABEL: test_signed_v2f64_v2i32_duplicate:2520; CHECK-SD: // %bb.0:2521; CHECK-SD-NEXT: mov d1, v0.d[1]2522; CHECK-SD-NEXT: fcvtzs w8, d02523; CHECK-SD-NEXT: fcvtzs w9, d12524; CHECK-SD-NEXT: fmov s0, w82525; CHECK-SD-NEXT: mov v0.s[1], w92526; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02527; CHECK-SD-NEXT: ret2528;2529; CHECK-GI-LABEL: test_signed_v2f64_v2i32_duplicate:2530; CHECK-GI: // %bb.0:2531; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d2532; CHECK-GI-NEXT: adrp x8, .LCPI51_12533; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI51_1]2534; CHECK-GI-NEXT: adrp x8, .LCPI51_02535; CHECK-GI-NEXT: cmgt v2.2d, v1.2d, v0.2d2536; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2537; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI51_0]2538; CHECK-GI-NEXT: cmgt v2.2d, v0.2d, v1.2d2539; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2540; CHECK-GI-NEXT: xtn v0.2s, v0.2d2541; CHECK-GI-NEXT: ret2542 %x = call <2 x i32> @llvm.fptosi.sat.v2f64.v2i32(<2 x double> %f)2543 ret <2 x i32> %x2544}2545 2546define <2 x i50> @test_signed_v2f64_v2i50(<2 x double> %f) {2547; CHECK-SD-LABEL: test_signed_v2f64_v2i50:2548; CHECK-SD: // %bb.0:2549; CHECK-SD-NEXT: mov d1, v0.d[1]2550; CHECK-SD-NEXT: mov x8, #562949953421311 // =0x1ffffffffffff2551; CHECK-SD-NEXT: fcvtzs x10, d02552; CHECK-SD-NEXT: mov x11, #-562949953421312 // =0xfffe0000000000002553; CHECK-SD-NEXT: fcvtzs x9, d12554; CHECK-SD-NEXT: cmp x9, x82555; CHECK-SD-NEXT: csel x9, x9, x8, lt2556; CHECK-SD-NEXT: cmp x9, x112557; CHECK-SD-NEXT: csel x9, x9, x11, gt2558; CHECK-SD-NEXT: cmp x10, x82559; CHECK-SD-NEXT: csel x8, x10, x8, lt2560; CHECK-SD-NEXT: cmp x8, x112561; CHECK-SD-NEXT: csel x8, x8, x11, gt2562; CHECK-SD-NEXT: fmov d0, x82563; CHECK-SD-NEXT: mov v0.d[1], x92564; CHECK-SD-NEXT: ret2565;2566; CHECK-GI-LABEL: test_signed_v2f64_v2i50:2567; CHECK-GI: // %bb.0:2568; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d2569; CHECK-GI-NEXT: adrp x8, .LCPI52_12570; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI52_1]2571; CHECK-GI-NEXT: adrp x8, .LCPI52_02572; CHECK-GI-NEXT: cmgt v2.2d, v1.2d, v0.2d2573; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2574; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI52_0]2575; CHECK-GI-NEXT: cmgt v2.2d, v0.2d, v1.2d2576; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2577; CHECK-GI-NEXT: ret2578 %x = call <2 x i50> @llvm.fptosi.sat.v2f64.v2i50(<2 x double> %f)2579 ret <2 x i50> %x2580}2581 2582define <2 x i64> @test_signed_v2f64_v2i64(<2 x double> %f) {2583; CHECK-LABEL: test_signed_v2f64_v2i64:2584; CHECK: // %bb.0:2585; CHECK-NEXT: fcvtzs v0.2d, v0.2d2586; CHECK-NEXT: ret2587 %x = call <2 x i64> @llvm.fptosi.sat.v2f64.v2i64(<2 x double> %f)2588 ret <2 x i64> %x2589}2590 2591define <2 x i100> @test_signed_v2f64_v2i100(<2 x double> %f) {2592; CHECK-SD-LABEL: test_signed_v2f64_v2i100:2593; CHECK-SD: // %bb.0:2594; CHECK-SD-NEXT: sub sp, sp, #802595; CHECK-SD-NEXT: str d10, [sp, #16] // 8-byte Spill2596; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill2597; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Spill2598; CHECK-SD-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill2599; CHECK-SD-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill2600; CHECK-SD-NEXT: .cfi_def_cfa_offset 802601; CHECK-SD-NEXT: .cfi_offset w19, -82602; CHECK-SD-NEXT: .cfi_offset w20, -162603; CHECK-SD-NEXT: .cfi_offset w21, -242604; CHECK-SD-NEXT: .cfi_offset w22, -322605; CHECK-SD-NEXT: .cfi_offset w30, -402606; CHECK-SD-NEXT: .cfi_offset b8, -482607; CHECK-SD-NEXT: .cfi_offset b9, -562608; CHECK-SD-NEXT: .cfi_offset b10, -642609; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2610; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02611; CHECK-SD-NEXT: bl __fixdfti2612; CHECK-SD-NEXT: mov x8, #-4170333254945079296 // =0xc6200000000000002613; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2614; CHECK-SD-NEXT: mov x21, #-34359738368 // =0xfffffff8000000002615; CHECK-SD-NEXT: fmov d9, x82616; CHECK-SD-NEXT: mov x8, #5053038781909696511 // =0x461fffffffffffff2617; CHECK-SD-NEXT: mov x22, #34359738367 // =0x7ffffffff2618; CHECK-SD-NEXT: fmov d10, x82619; CHECK-SD-NEXT: mov d8, v0.d[1]2620; CHECK-SD-NEXT: fcmp d0, d92621; CHECK-SD-NEXT: csel x8, xzr, x0, lt2622; CHECK-SD-NEXT: csel x9, x21, x1, lt2623; CHECK-SD-NEXT: fcmp d0, d102624; CHECK-SD-NEXT: csel x9, x22, x9, gt2625; CHECK-SD-NEXT: csinv x8, x8, xzr, le2626; CHECK-SD-NEXT: fcmp d0, d02627; CHECK-SD-NEXT: fmov d0, d82628; CHECK-SD-NEXT: csel x19, xzr, x8, vs2629; CHECK-SD-NEXT: csel x20, xzr, x9, vs2630; CHECK-SD-NEXT: bl __fixdfti2631; CHECK-SD-NEXT: fcmp d8, d92632; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Reload2633; CHECK-SD-NEXT: csel x8, xzr, x0, lt2634; CHECK-SD-NEXT: csel x9, x21, x1, lt2635; CHECK-SD-NEXT: fcmp d8, d102636; CHECK-SD-NEXT: mov x0, x192637; CHECK-SD-NEXT: mov x1, x202638; CHECK-SD-NEXT: ldr d10, [sp, #16] // 8-byte Reload2639; CHECK-SD-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload2640; CHECK-SD-NEXT: csel x9, x22, x9, gt2641; CHECK-SD-NEXT: csinv x8, x8, xzr, le2642; CHECK-SD-NEXT: fcmp d8, d82643; CHECK-SD-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload2644; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload2645; CHECK-SD-NEXT: csel x2, xzr, x8, vs2646; CHECK-SD-NEXT: csel x3, xzr, x9, vs2647; CHECK-SD-NEXT: add sp, sp, #802648; CHECK-SD-NEXT: ret2649;2650; CHECK-GI-LABEL: test_signed_v2f64_v2i100:2651; CHECK-GI: // %bb.0:2652; CHECK-GI-NEXT: sub sp, sp, #802653; CHECK-GI-NEXT: str d10, [sp, #16] // 8-byte Spill2654; CHECK-GI-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill2655; CHECK-GI-NEXT: str x30, [sp, #40] // 8-byte Spill2656; CHECK-GI-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill2657; CHECK-GI-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill2658; CHECK-GI-NEXT: .cfi_def_cfa_offset 802659; CHECK-GI-NEXT: .cfi_offset w19, -82660; CHECK-GI-NEXT: .cfi_offset w20, -162661; CHECK-GI-NEXT: .cfi_offset w21, -242662; CHECK-GI-NEXT: .cfi_offset w22, -322663; CHECK-GI-NEXT: .cfi_offset w30, -402664; CHECK-GI-NEXT: .cfi_offset b8, -482665; CHECK-GI-NEXT: .cfi_offset b9, -562666; CHECK-GI-NEXT: .cfi_offset b10, -642667; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2668; CHECK-GI-NEXT: mov d8, v0.d[1]2669; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q02670; CHECK-GI-NEXT: bl __fixdfti2671; CHECK-GI-NEXT: mov x8, #-4170333254945079296 // =0xc6200000000000002672; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload2673; CHECK-GI-NEXT: mov x21, #34359738368 // =0x8000000002674; CHECK-GI-NEXT: fmov d9, x82675; CHECK-GI-NEXT: mov x8, #5053038781909696511 // =0x461fffffffffffff2676; CHECK-GI-NEXT: mov x22, #34359738367 // =0x7ffffffff2677; CHECK-GI-NEXT: fmov d10, x82678; CHECK-GI-NEXT: fcmp d0, d92679; CHECK-GI-NEXT: csel x8, xzr, x0, lt2680; CHECK-GI-NEXT: csel x9, x21, x1, lt2681; CHECK-GI-NEXT: fcmp d0, d102682; CHECK-GI-NEXT: csinv x8, x8, xzr, le2683; CHECK-GI-NEXT: csel x9, x22, x9, gt2684; CHECK-GI-NEXT: fcmp d0, d02685; CHECK-GI-NEXT: fmov d0, d82686; CHECK-GI-NEXT: csel x19, xzr, x8, vs2687; CHECK-GI-NEXT: csel x20, xzr, x9, vs2688; CHECK-GI-NEXT: bl __fixdfti2689; CHECK-GI-NEXT: fcmp d8, d92690; CHECK-GI-NEXT: ldr x30, [sp, #40] // 8-byte Reload2691; CHECK-GI-NEXT: csel x8, xzr, x0, lt2692; CHECK-GI-NEXT: csel x9, x21, x1, lt2693; CHECK-GI-NEXT: fcmp d8, d102694; CHECK-GI-NEXT: mov x0, x192695; CHECK-GI-NEXT: mov x1, x202696; CHECK-GI-NEXT: ldr d10, [sp, #16] // 8-byte Reload2697; CHECK-GI-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload2698; CHECK-GI-NEXT: csinv x8, x8, xzr, le2699; CHECK-GI-NEXT: csel x9, x22, x9, gt2700; CHECK-GI-NEXT: fcmp d8, d82701; CHECK-GI-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload2702; CHECK-GI-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload2703; CHECK-GI-NEXT: csel x2, xzr, x8, vs2704; CHECK-GI-NEXT: csel x3, xzr, x9, vs2705; CHECK-GI-NEXT: add sp, sp, #802706; CHECK-GI-NEXT: ret2707 %x = call <2 x i100> @llvm.fptosi.sat.v2f64.v2i100(<2 x double> %f)2708 ret <2 x i100> %x2709}2710 2711define <2 x i128> @test_signed_v2f64_v2i128(<2 x double> %f) {2712; CHECK-SD-LABEL: test_signed_v2f64_v2i128:2713; CHECK-SD: // %bb.0:2714; CHECK-SD-NEXT: sub sp, sp, #802715; CHECK-SD-NEXT: str d10, [sp, #16] // 8-byte Spill2716; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill2717; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Spill2718; CHECK-SD-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill2719; CHECK-SD-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill2720; CHECK-SD-NEXT: .cfi_def_cfa_offset 802721; CHECK-SD-NEXT: .cfi_offset w19, -82722; CHECK-SD-NEXT: .cfi_offset w20, -162723; CHECK-SD-NEXT: .cfi_offset w21, -242724; CHECK-SD-NEXT: .cfi_offset w22, -322725; CHECK-SD-NEXT: .cfi_offset w30, -402726; CHECK-SD-NEXT: .cfi_offset b8, -482727; CHECK-SD-NEXT: .cfi_offset b9, -562728; CHECK-SD-NEXT: .cfi_offset b10, -642729; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2730; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02731; CHECK-SD-NEXT: bl __fixdfti2732; CHECK-SD-NEXT: mov x8, #-4044232465378705408 // =0xc7e00000000000002733; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2734; CHECK-SD-NEXT: mov x21, #-9223372036854775808 // =0x80000000000000002735; CHECK-SD-NEXT: fmov d9, x82736; CHECK-SD-NEXT: mov x8, #5179139571476070399 // =0x47dfffffffffffff2737; CHECK-SD-NEXT: mov x22, #9223372036854775807 // =0x7fffffffffffffff2738; CHECK-SD-NEXT: fmov d10, x82739; CHECK-SD-NEXT: mov d8, v0.d[1]2740; CHECK-SD-NEXT: fcmp d0, d92741; CHECK-SD-NEXT: csel x8, xzr, x0, lt2742; CHECK-SD-NEXT: csel x9, x21, x1, lt2743; CHECK-SD-NEXT: fcmp d0, d102744; CHECK-SD-NEXT: csel x9, x22, x9, gt2745; CHECK-SD-NEXT: csinv x8, x8, xzr, le2746; CHECK-SD-NEXT: fcmp d0, d02747; CHECK-SD-NEXT: fmov d0, d82748; CHECK-SD-NEXT: csel x19, xzr, x8, vs2749; CHECK-SD-NEXT: csel x20, xzr, x9, vs2750; CHECK-SD-NEXT: bl __fixdfti2751; CHECK-SD-NEXT: fcmp d8, d92752; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Reload2753; CHECK-SD-NEXT: csel x8, xzr, x0, lt2754; CHECK-SD-NEXT: csel x9, x21, x1, lt2755; CHECK-SD-NEXT: fcmp d8, d102756; CHECK-SD-NEXT: mov x0, x192757; CHECK-SD-NEXT: mov x1, x202758; CHECK-SD-NEXT: ldr d10, [sp, #16] // 8-byte Reload2759; CHECK-SD-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload2760; CHECK-SD-NEXT: csel x9, x22, x9, gt2761; CHECK-SD-NEXT: csinv x8, x8, xzr, le2762; CHECK-SD-NEXT: fcmp d8, d82763; CHECK-SD-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload2764; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload2765; CHECK-SD-NEXT: csel x2, xzr, x8, vs2766; CHECK-SD-NEXT: csel x3, xzr, x9, vs2767; CHECK-SD-NEXT: add sp, sp, #802768; CHECK-SD-NEXT: ret2769;2770; CHECK-GI-LABEL: test_signed_v2f64_v2i128:2771; CHECK-GI: // %bb.0:2772; CHECK-GI-NEXT: sub sp, sp, #802773; CHECK-GI-NEXT: str d10, [sp, #16] // 8-byte Spill2774; CHECK-GI-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill2775; CHECK-GI-NEXT: str x30, [sp, #40] // 8-byte Spill2776; CHECK-GI-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill2777; CHECK-GI-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill2778; CHECK-GI-NEXT: .cfi_def_cfa_offset 802779; CHECK-GI-NEXT: .cfi_offset w19, -82780; CHECK-GI-NEXT: .cfi_offset w20, -162781; CHECK-GI-NEXT: .cfi_offset w21, -242782; CHECK-GI-NEXT: .cfi_offset w22, -322783; CHECK-GI-NEXT: .cfi_offset w30, -402784; CHECK-GI-NEXT: .cfi_offset b8, -482785; CHECK-GI-NEXT: .cfi_offset b9, -562786; CHECK-GI-NEXT: .cfi_offset b10, -642787; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2788; CHECK-GI-NEXT: mov d8, v0.d[1]2789; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q02790; CHECK-GI-NEXT: bl __fixdfti2791; CHECK-GI-NEXT: mov x8, #-4044232465378705408 // =0xc7e00000000000002792; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload2793; CHECK-GI-NEXT: mov x21, #-9223372036854775808 // =0x80000000000000002794; CHECK-GI-NEXT: fmov d9, x82795; CHECK-GI-NEXT: mov x8, #5179139571476070399 // =0x47dfffffffffffff2796; CHECK-GI-NEXT: mov x22, #9223372036854775807 // =0x7fffffffffffffff2797; CHECK-GI-NEXT: fmov d10, x82798; CHECK-GI-NEXT: fcmp d0, d92799; CHECK-GI-NEXT: csel x8, xzr, x0, lt2800; CHECK-GI-NEXT: csel x9, x21, x1, lt2801; CHECK-GI-NEXT: fcmp d0, d102802; CHECK-GI-NEXT: csinv x8, x8, xzr, le2803; CHECK-GI-NEXT: csel x9, x22, x9, gt2804; CHECK-GI-NEXT: fcmp d0, d02805; CHECK-GI-NEXT: fmov d0, d82806; CHECK-GI-NEXT: csel x19, xzr, x8, vs2807; CHECK-GI-NEXT: csel x20, xzr, x9, vs2808; CHECK-GI-NEXT: bl __fixdfti2809; CHECK-GI-NEXT: fcmp d8, d92810; CHECK-GI-NEXT: ldr x30, [sp, #40] // 8-byte Reload2811; CHECK-GI-NEXT: csel x8, xzr, x0, lt2812; CHECK-GI-NEXT: csel x9, x21, x1, lt2813; CHECK-GI-NEXT: fcmp d8, d102814; CHECK-GI-NEXT: mov x0, x192815; CHECK-GI-NEXT: mov x1, x202816; CHECK-GI-NEXT: ldr d10, [sp, #16] // 8-byte Reload2817; CHECK-GI-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload2818; CHECK-GI-NEXT: csinv x8, x8, xzr, le2819; CHECK-GI-NEXT: csel x9, x22, x9, gt2820; CHECK-GI-NEXT: fcmp d8, d82821; CHECK-GI-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload2822; CHECK-GI-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload2823; CHECK-GI-NEXT: csel x2, xzr, x8, vs2824; CHECK-GI-NEXT: csel x3, xzr, x9, vs2825; CHECK-GI-NEXT: add sp, sp, #802826; CHECK-GI-NEXT: ret2827 %x = call <2 x i128> @llvm.fptosi.sat.v2f64.v2i128(<2 x double> %f)2828 ret <2 x i128> %x2829}2830 2831;2832; 4-Vector half to signed integer -- result size variation2833;2834 2835declare <4 x i1> @llvm.fptosi.sat.v4f16.v4i1 (<4 x half>)2836declare <4 x i8> @llvm.fptosi.sat.v4f16.v4i8 (<4 x half>)2837declare <4 x i13> @llvm.fptosi.sat.v4f16.v4i13 (<4 x half>)2838declare <4 x i16> @llvm.fptosi.sat.v4f16.v4i16 (<4 x half>)2839declare <4 x i19> @llvm.fptosi.sat.v4f16.v4i19 (<4 x half>)2840declare <4 x i50> @llvm.fptosi.sat.v4f16.v4i50 (<4 x half>)2841declare <4 x i64> @llvm.fptosi.sat.v4f16.v4i64 (<4 x half>)2842declare <4 x i100> @llvm.fptosi.sat.v4f16.v4i100(<4 x half>)2843declare <4 x i128> @llvm.fptosi.sat.v4f16.v4i128(<4 x half>)2844 2845define <4 x i1> @test_signed_v4f16_v4i1(<4 x half> %f) {2846; CHECK-SD-CVT-LABEL: test_signed_v4f16_v4i1:2847; CHECK-SD-CVT: // %bb.0:2848; CHECK-SD-CVT-NEXT: fcvtl v0.4s, v0.4h2849; CHECK-SD-CVT-NEXT: movi v1.2d, #00000000000000002850; CHECK-SD-CVT-NEXT: fcvtzs v0.4s, v0.4s2851; CHECK-SD-CVT-NEXT: smin v0.4s, v0.4s, v1.4s2852; CHECK-SD-CVT-NEXT: movi v1.2d, #0xffffffffffffffff2853; CHECK-SD-CVT-NEXT: smax v0.4s, v0.4s, v1.4s2854; CHECK-SD-CVT-NEXT: xtn v0.4h, v0.4s2855; CHECK-SD-CVT-NEXT: ret2856;2857; CHECK-SD-FP16-LABEL: test_signed_v4f16_v4i1:2858; CHECK-SD-FP16: // %bb.0:2859; CHECK-SD-FP16-NEXT: movi v1.2d, #00000000000000002860; CHECK-SD-FP16-NEXT: fcvtzs v0.4h, v0.4h2861; CHECK-SD-FP16-NEXT: movi v2.2d, #0xffffffffffffffff2862; CHECK-SD-FP16-NEXT: smin v0.4h, v0.4h, v1.4h2863; CHECK-SD-FP16-NEXT: smax v0.4h, v0.4h, v2.4h2864; CHECK-SD-FP16-NEXT: ret2865;2866; CHECK-GI-CVT-LABEL: test_signed_v4f16_v4i1:2867; CHECK-GI-CVT: // %bb.0:2868; CHECK-GI-CVT-NEXT: fcvtl v0.4s, v0.4h2869; CHECK-GI-CVT-NEXT: movi v1.2d, #00000000000000002870; CHECK-GI-CVT-NEXT: movi v2.2d, #0xffffffffffffffff2871; CHECK-GI-CVT-NEXT: fcvtzs v0.4s, v0.4s2872; CHECK-GI-CVT-NEXT: smin v0.4s, v0.4s, v1.4s2873; CHECK-GI-CVT-NEXT: smax v0.4s, v0.4s, v2.4s2874; CHECK-GI-CVT-NEXT: xtn v0.4h, v0.4s2875; CHECK-GI-CVT-NEXT: ret2876;2877; CHECK-GI-FP16-LABEL: test_signed_v4f16_v4i1:2878; CHECK-GI-FP16: // %bb.0:2879; CHECK-GI-FP16-NEXT: movi v1.2d, #00000000000000002880; CHECK-GI-FP16-NEXT: fcvtzs v0.4h, v0.4h2881; CHECK-GI-FP16-NEXT: movi d2, #0xffffffffffffffff2882; CHECK-GI-FP16-NEXT: smin v0.4h, v0.4h, v1.4h2883; CHECK-GI-FP16-NEXT: smax v0.4h, v0.4h, v2.4h2884; CHECK-GI-FP16-NEXT: ret2885 %x = call <4 x i1> @llvm.fptosi.sat.v4f16.v4i1(<4 x half> %f)2886 ret <4 x i1> %x2887}2888 2889define <4 x i8> @test_signed_v4f16_v4i8(<4 x half> %f) {2890; CHECK-CVT-LABEL: test_signed_v4f16_v4i8:2891; CHECK-CVT: // %bb.0:2892; CHECK-CVT-NEXT: fcvtl v0.4s, v0.4h2893; CHECK-CVT-NEXT: movi v1.4s, #1272894; CHECK-CVT-NEXT: fcvtzs v0.4s, v0.4s2895; CHECK-CVT-NEXT: smin v0.4s, v0.4s, v1.4s2896; CHECK-CVT-NEXT: mvni v1.4s, #1272897; CHECK-CVT-NEXT: smax v0.4s, v0.4s, v1.4s2898; CHECK-CVT-NEXT: xtn v0.4h, v0.4s2899; CHECK-CVT-NEXT: ret2900;2901; CHECK-SD-FP16-LABEL: test_signed_v4f16_v4i8:2902; CHECK-SD-FP16: // %bb.0:2903; CHECK-SD-FP16-NEXT: movi v1.4h, #1272904; CHECK-SD-FP16-NEXT: fcvtzs v0.4h, v0.4h2905; CHECK-SD-FP16-NEXT: smin v0.4h, v0.4h, v1.4h2906; CHECK-SD-FP16-NEXT: mvni v1.4h, #1272907; CHECK-SD-FP16-NEXT: smax v0.4h, v0.4h, v1.4h2908; CHECK-SD-FP16-NEXT: ret2909;2910; CHECK-GI-FP16-LABEL: test_signed_v4f16_v4i8:2911; CHECK-GI-FP16: // %bb.0:2912; CHECK-GI-FP16-NEXT: movi v1.4h, #1272913; CHECK-GI-FP16-NEXT: fcvtzs v0.4h, v0.4h2914; CHECK-GI-FP16-NEXT: mvni v2.4h, #1272915; CHECK-GI-FP16-NEXT: smin v0.4h, v0.4h, v1.4h2916; CHECK-GI-FP16-NEXT: smax v0.4h, v0.4h, v2.4h2917; CHECK-GI-FP16-NEXT: ret2918 %x = call <4 x i8> @llvm.fptosi.sat.v4f16.v4i8(<4 x half> %f)2919 ret <4 x i8> %x2920}2921 2922define <4 x i13> @test_signed_v4f16_v4i13(<4 x half> %f) {2923; CHECK-CVT-LABEL: test_signed_v4f16_v4i13:2924; CHECK-CVT: // %bb.0:2925; CHECK-CVT-NEXT: fcvtl v0.4s, v0.4h2926; CHECK-CVT-NEXT: movi v1.4s, #15, msl #82927; CHECK-CVT-NEXT: fcvtzs v0.4s, v0.4s2928; CHECK-CVT-NEXT: smin v0.4s, v0.4s, v1.4s2929; CHECK-CVT-NEXT: mvni v1.4s, #15, msl #82930; CHECK-CVT-NEXT: smax v0.4s, v0.4s, v1.4s2931; CHECK-CVT-NEXT: xtn v0.4h, v0.4s2932; CHECK-CVT-NEXT: ret2933;2934; CHECK-FP16-LABEL: test_signed_v4f16_v4i13:2935; CHECK-FP16: // %bb.0:2936; CHECK-FP16-NEXT: fcvtzs v0.4h, v0.4h2937; CHECK-FP16-NEXT: mvni v1.4h, #240, lsl #82938; CHECK-FP16-NEXT: movi v2.4h, #240, lsl #82939; CHECK-FP16-NEXT: smin v0.4h, v0.4h, v1.4h2940; CHECK-FP16-NEXT: smax v0.4h, v0.4h, v2.4h2941; CHECK-FP16-NEXT: ret2942 %x = call <4 x i13> @llvm.fptosi.sat.v4f16.v4i13(<4 x half> %f)2943 ret <4 x i13> %x2944}2945 2946define <4 x i16> @test_signed_v4f16_v4i16(<4 x half> %f) {2947; CHECK-CVT-LABEL: test_signed_v4f16_v4i16:2948; CHECK-CVT: // %bb.0:2949; CHECK-CVT-NEXT: fcvtl v0.4s, v0.4h2950; CHECK-CVT-NEXT: fcvtzs v0.4s, v0.4s2951; CHECK-CVT-NEXT: sqxtn v0.4h, v0.4s2952; CHECK-CVT-NEXT: ret2953;2954; CHECK-FP16-LABEL: test_signed_v4f16_v4i16:2955; CHECK-FP16: // %bb.0:2956; CHECK-FP16-NEXT: fcvtzs v0.4h, v0.4h2957; CHECK-FP16-NEXT: ret2958 %x = call <4 x i16> @llvm.fptosi.sat.v4f16.v4i16(<4 x half> %f)2959 ret <4 x i16> %x2960}2961 2962define <4 x i19> @test_signed_v4f16_v4i19(<4 x half> %f) {2963; CHECK-LABEL: test_signed_v4f16_v4i19:2964; CHECK: // %bb.0:2965; CHECK-NEXT: fcvtl v0.4s, v0.4h2966; CHECK-NEXT: movi v1.4s, #3, msl #162967; CHECK-NEXT: fcvtzs v0.4s, v0.4s2968; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s2969; CHECK-NEXT: mvni v1.4s, #3, msl #162970; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s2971; CHECK-NEXT: ret2972 %x = call <4 x i19> @llvm.fptosi.sat.v4f16.v4i19(<4 x half> %f)2973 ret <4 x i19> %x2974}2975 2976define <4 x i32> @test_signed_v4f16_v4i32_duplicate(<4 x half> %f) {2977; CHECK-LABEL: test_signed_v4f16_v4i32_duplicate:2978; CHECK: // %bb.0:2979; CHECK-NEXT: fcvtl v0.4s, v0.4h2980; CHECK-NEXT: fcvtzs v0.4s, v0.4s2981; CHECK-NEXT: ret2982 %x = call <4 x i32> @llvm.fptosi.sat.v4f16.v4i32(<4 x half> %f)2983 ret <4 x i32> %x2984}2985 2986define <4 x i50> @test_signed_v4f16_v4i50(<4 x half> %f) {2987; CHECK-CVT-LABEL: test_signed_v4f16_v4i50:2988; CHECK-CVT: // %bb.0:2989; CHECK-CVT-NEXT: // kill: def $d0 killed $d0 def $q02990; CHECK-CVT-NEXT: mov h1, v0.h[1]2991; CHECK-CVT-NEXT: fcvt s2, h02992; CHECK-CVT-NEXT: mov x8, #562949953421311 // =0x1ffffffffffff2993; CHECK-CVT-NEXT: mov h3, v0.h[2]2994; CHECK-CVT-NEXT: mov h0, v0.h[3]2995; CHECK-CVT-NEXT: mov x11, #-562949953421312 // =0xfffe0000000000002996; CHECK-CVT-NEXT: fcvt s1, h12997; CHECK-CVT-NEXT: fcvtzs x9, s22998; CHECK-CVT-NEXT: fcvt s2, h32999; CHECK-CVT-NEXT: fcvt s0, h03000; CHECK-CVT-NEXT: fcvtzs x10, s13001; CHECK-CVT-NEXT: cmp x9, x83002; CHECK-CVT-NEXT: csel x9, x9, x8, lt3003; CHECK-CVT-NEXT: fcvtzs x12, s23004; CHECK-CVT-NEXT: cmp x9, x113005; CHECK-CVT-NEXT: csel x0, x9, x11, gt3006; CHECK-CVT-NEXT: cmp x10, x83007; CHECK-CVT-NEXT: csel x9, x10, x8, lt3008; CHECK-CVT-NEXT: fcvtzs x10, s03009; CHECK-CVT-NEXT: cmp x9, x113010; CHECK-CVT-NEXT: csel x1, x9, x11, gt3011; CHECK-CVT-NEXT: cmp x12, x83012; CHECK-CVT-NEXT: csel x9, x12, x8, lt3013; CHECK-CVT-NEXT: cmp x9, x113014; CHECK-CVT-NEXT: csel x2, x9, x11, gt3015; CHECK-CVT-NEXT: cmp x10, x83016; CHECK-CVT-NEXT: csel x8, x10, x8, lt3017; CHECK-CVT-NEXT: cmp x8, x113018; CHECK-CVT-NEXT: csel x3, x8, x11, gt3019; CHECK-CVT-NEXT: ret3020;3021; CHECK-FP16-LABEL: test_signed_v4f16_v4i50:3022; CHECK-FP16: // %bb.0:3023; CHECK-FP16-NEXT: // kill: def $d0 killed $d0 def $q03024; CHECK-FP16-NEXT: mov h1, v0.h[1]3025; CHECK-FP16-NEXT: fcvtzs x9, h03026; CHECK-FP16-NEXT: mov x8, #562949953421311 // =0x1ffffffffffff3027; CHECK-FP16-NEXT: mov h2, v0.h[2]3028; CHECK-FP16-NEXT: mov x11, #-562949953421312 // =0xfffe0000000000003029; CHECK-FP16-NEXT: mov h0, v0.h[3]3030; CHECK-FP16-NEXT: fcvtzs x10, h13031; CHECK-FP16-NEXT: cmp x9, x83032; CHECK-FP16-NEXT: csel x9, x9, x8, lt3033; CHECK-FP16-NEXT: fcvtzs x12, h23034; CHECK-FP16-NEXT: cmp x9, x113035; CHECK-FP16-NEXT: csel x0, x9, x11, gt3036; CHECK-FP16-NEXT: cmp x10, x83037; CHECK-FP16-NEXT: csel x9, x10, x8, lt3038; CHECK-FP16-NEXT: fcvtzs x10, h03039; CHECK-FP16-NEXT: cmp x9, x113040; CHECK-FP16-NEXT: csel x1, x9, x11, gt3041; CHECK-FP16-NEXT: cmp x12, x83042; CHECK-FP16-NEXT: csel x9, x12, x8, lt3043; CHECK-FP16-NEXT: cmp x9, x113044; CHECK-FP16-NEXT: csel x2, x9, x11, gt3045; CHECK-FP16-NEXT: cmp x10, x83046; CHECK-FP16-NEXT: csel x8, x10, x8, lt3047; CHECK-FP16-NEXT: cmp x8, x113048; CHECK-FP16-NEXT: csel x3, x8, x11, gt3049; CHECK-FP16-NEXT: ret3050 %x = call <4 x i50> @llvm.fptosi.sat.v4f16.v4i50(<4 x half> %f)3051 ret <4 x i50> %x3052}3053 3054define <4 x i64> @test_signed_v4f16_v4i64(<4 x half> %f) {3055; CHECK-SD-CVT-LABEL: test_signed_v4f16_v4i64:3056; CHECK-SD-CVT: // %bb.0:3057; CHECK-SD-CVT-NEXT: // kill: def $d0 killed $d0 def $q03058; CHECK-SD-CVT-NEXT: mov h1, v0.h[2]3059; CHECK-SD-CVT-NEXT: mov h2, v0.h[1]3060; CHECK-SD-CVT-NEXT: mov h3, v0.h[3]3061; CHECK-SD-CVT-NEXT: fcvt s0, h03062; CHECK-SD-CVT-NEXT: fcvt s1, h13063; CHECK-SD-CVT-NEXT: fcvt s2, h23064; CHECK-SD-CVT-NEXT: fcvt s3, h33065; CHECK-SD-CVT-NEXT: fcvtzs x8, s03066; CHECK-SD-CVT-NEXT: fcvtzs x9, s13067; CHECK-SD-CVT-NEXT: fcvtzs x10, s23068; CHECK-SD-CVT-NEXT: fcvtzs x11, s33069; CHECK-SD-CVT-NEXT: fmov d0, x83070; CHECK-SD-CVT-NEXT: fmov d1, x93071; CHECK-SD-CVT-NEXT: mov v0.d[1], x103072; CHECK-SD-CVT-NEXT: mov v1.d[1], x113073; CHECK-SD-CVT-NEXT: ret3074;3075; CHECK-SD-FP16-LABEL: test_signed_v4f16_v4i64:3076; CHECK-SD-FP16: // %bb.0:3077; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 def $q03078; CHECK-SD-FP16-NEXT: mov h1, v0.h[2]3079; CHECK-SD-FP16-NEXT: mov h2, v0.h[1]3080; CHECK-SD-FP16-NEXT: mov h3, v0.h[3]3081; CHECK-SD-FP16-NEXT: fcvtzs x8, h03082; CHECK-SD-FP16-NEXT: fcvtzs x9, h13083; CHECK-SD-FP16-NEXT: fcvtzs x10, h23084; CHECK-SD-FP16-NEXT: fcvtzs x11, h33085; CHECK-SD-FP16-NEXT: fmov d0, x83086; CHECK-SD-FP16-NEXT: fmov d1, x93087; CHECK-SD-FP16-NEXT: mov v0.d[1], x103088; CHECK-SD-FP16-NEXT: mov v1.d[1], x113089; CHECK-SD-FP16-NEXT: ret3090;3091; CHECK-GI-LABEL: test_signed_v4f16_v4i64:3092; CHECK-GI: // %bb.0:3093; CHECK-GI-NEXT: fcvtl v0.4s, v0.4h3094; CHECK-GI-NEXT: fcvtl v1.2d, v0.2s3095; CHECK-GI-NEXT: fcvtl2 v2.2d, v0.4s3096; CHECK-GI-NEXT: fcvtzs v0.2d, v1.2d3097; CHECK-GI-NEXT: fcvtzs v1.2d, v2.2d3098; CHECK-GI-NEXT: ret3099 %x = call <4 x i64> @llvm.fptosi.sat.v4f16.v4i64(<4 x half> %f)3100 ret <4 x i64> %x3101}3102 3103define <4 x i100> @test_signed_v4f16_v4i100(<4 x half> %f) {3104; CHECK-SD-LABEL: test_signed_v4f16_v4i100:3105; CHECK-SD: // %bb.0:3106; CHECK-SD-NEXT: sub sp, sp, #1123107; CHECK-SD-NEXT: str d10, [sp, #16] // 8-byte Spill3108; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill3109; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Spill3110; CHECK-SD-NEXT: stp x26, x25, [sp, #48] // 16-byte Folded Spill3111; CHECK-SD-NEXT: stp x24, x23, [sp, #64] // 16-byte Folded Spill3112; CHECK-SD-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill3113; CHECK-SD-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill3114; CHECK-SD-NEXT: .cfi_def_cfa_offset 1123115; CHECK-SD-NEXT: .cfi_offset w19, -83116; CHECK-SD-NEXT: .cfi_offset w20, -163117; CHECK-SD-NEXT: .cfi_offset w21, -243118; CHECK-SD-NEXT: .cfi_offset w22, -323119; CHECK-SD-NEXT: .cfi_offset w23, -403120; CHECK-SD-NEXT: .cfi_offset w24, -483121; CHECK-SD-NEXT: .cfi_offset w25, -563122; CHECK-SD-NEXT: .cfi_offset w26, -643123; CHECK-SD-NEXT: .cfi_offset w30, -723124; CHECK-SD-NEXT: .cfi_offset b8, -803125; CHECK-SD-NEXT: .cfi_offset b9, -883126; CHECK-SD-NEXT: .cfi_offset b10, -963127; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q03128; CHECK-SD-NEXT: fcvt s8, h03129; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill3130; CHECK-SD-NEXT: fmov s0, s83131; CHECK-SD-NEXT: bl __fixsfti3132; CHECK-SD-NEXT: movi v9.2s, #241, lsl #243133; CHECK-SD-NEXT: mov w8, #1895825407 // =0x70ffffff3134; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3135; CHECK-SD-NEXT: fmov s10, w83136; CHECK-SD-NEXT: mov x25, #-34359738368 // =0xfffffff8000000003137; CHECK-SD-NEXT: mov x26, #34359738367 // =0x7ffffffff3138; CHECK-SD-NEXT: mov h0, v0.h[1]3139; CHECK-SD-NEXT: fcmp s8, s93140; CHECK-SD-NEXT: csel x8, xzr, x0, lt3141; CHECK-SD-NEXT: csel x9, x25, x1, lt3142; CHECK-SD-NEXT: fcmp s8, s103143; CHECK-SD-NEXT: csel x9, x26, x9, gt3144; CHECK-SD-NEXT: csinv x8, x8, xzr, le3145; CHECK-SD-NEXT: fcmp s8, s83146; CHECK-SD-NEXT: fcvt s8, h03147; CHECK-SD-NEXT: csel x19, xzr, x8, vs3148; CHECK-SD-NEXT: csel x20, xzr, x9, vs3149; CHECK-SD-NEXT: fmov s0, s83150; CHECK-SD-NEXT: bl __fixsfti3151; CHECK-SD-NEXT: fcmp s8, s93152; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3153; CHECK-SD-NEXT: mov h0, v0.h[2]3154; CHECK-SD-NEXT: csel x8, xzr, x0, lt3155; CHECK-SD-NEXT: csel x9, x25, x1, lt3156; CHECK-SD-NEXT: fcmp s8, s103157; CHECK-SD-NEXT: csel x9, x26, x9, gt3158; CHECK-SD-NEXT: csinv x8, x8, xzr, le3159; CHECK-SD-NEXT: fcmp s8, s83160; CHECK-SD-NEXT: fcvt s8, h03161; CHECK-SD-NEXT: csel x21, xzr, x8, vs3162; CHECK-SD-NEXT: csel x22, xzr, x9, vs3163; CHECK-SD-NEXT: fmov s0, s83164; CHECK-SD-NEXT: bl __fixsfti3165; CHECK-SD-NEXT: fcmp s8, s93166; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3167; CHECK-SD-NEXT: mov h0, v0.h[3]3168; CHECK-SD-NEXT: csel x8, xzr, x0, lt3169; CHECK-SD-NEXT: csel x9, x25, x1, lt3170; CHECK-SD-NEXT: fcmp s8, s103171; CHECK-SD-NEXT: csel x9, x26, x9, gt3172; CHECK-SD-NEXT: csinv x8, x8, xzr, le3173; CHECK-SD-NEXT: fcmp s8, s83174; CHECK-SD-NEXT: fcvt s8, h03175; CHECK-SD-NEXT: csel x23, xzr, x8, vs3176; CHECK-SD-NEXT: csel x24, xzr, x9, vs3177; CHECK-SD-NEXT: fmov s0, s83178; CHECK-SD-NEXT: bl __fixsfti3179; CHECK-SD-NEXT: fcmp s8, s93180; CHECK-SD-NEXT: mov x2, x213181; CHECK-SD-NEXT: mov x3, x223182; CHECK-SD-NEXT: mov x4, x233183; CHECK-SD-NEXT: mov x5, x243184; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Reload3185; CHECK-SD-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload3186; CHECK-SD-NEXT: csel x8, xzr, x0, lt3187; CHECK-SD-NEXT: csel x9, x25, x1, lt3188; CHECK-SD-NEXT: fcmp s8, s103189; CHECK-SD-NEXT: mov x0, x193190; CHECK-SD-NEXT: mov x1, x203191; CHECK-SD-NEXT: ldr d10, [sp, #16] // 8-byte Reload3192; CHECK-SD-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload3193; CHECK-SD-NEXT: csel x9, x26, x9, gt3194; CHECK-SD-NEXT: csinv x8, x8, xzr, le3195; CHECK-SD-NEXT: fcmp s8, s83196; CHECK-SD-NEXT: ldp x24, x23, [sp, #64] // 16-byte Folded Reload3197; CHECK-SD-NEXT: ldp x26, x25, [sp, #48] // 16-byte Folded Reload3198; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload3199; CHECK-SD-NEXT: csel x6, xzr, x8, vs3200; CHECK-SD-NEXT: csel x7, xzr, x9, vs3201; CHECK-SD-NEXT: add sp, sp, #1123202; CHECK-SD-NEXT: ret3203;3204; CHECK-GI-CVT-LABEL: test_signed_v4f16_v4i100:3205; CHECK-GI-CVT: // %bb.0:3206; CHECK-GI-CVT-NEXT: // kill: def $d0 killed $d0 def $q03207; CHECK-GI-CVT-NEXT: mov h1, v0.h[1]3208; CHECK-GI-CVT-NEXT: mov h2, v0.h[2]3209; CHECK-GI-CVT-NEXT: mov x1, xzr3210; CHECK-GI-CVT-NEXT: mov h3, v0.h[3]3211; CHECK-GI-CVT-NEXT: fcvt s0, h03212; CHECK-GI-CVT-NEXT: mov x3, xzr3213; CHECK-GI-CVT-NEXT: mov x5, xzr3214; CHECK-GI-CVT-NEXT: mov x7, xzr3215; CHECK-GI-CVT-NEXT: fcvt s1, h13216; CHECK-GI-CVT-NEXT: fcvt s2, h23217; CHECK-GI-CVT-NEXT: fcvt s3, h33218; CHECK-GI-CVT-NEXT: fcvtzs x0, s03219; CHECK-GI-CVT-NEXT: fcvtzs x2, s13220; CHECK-GI-CVT-NEXT: fcvtzs x4, s23221; CHECK-GI-CVT-NEXT: fcvtzs x6, s33222; CHECK-GI-CVT-NEXT: ret3223;3224; CHECK-GI-FP16-LABEL: test_signed_v4f16_v4i100:3225; CHECK-GI-FP16: // %bb.0:3226; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 def $q03227; CHECK-GI-FP16-NEXT: mov h1, v0.h[1]3228; CHECK-GI-FP16-NEXT: mov h2, v0.h[2]3229; CHECK-GI-FP16-NEXT: mov x1, xzr3230; CHECK-GI-FP16-NEXT: mov h3, v0.h[3]3231; CHECK-GI-FP16-NEXT: fcvtzs x0, h03232; CHECK-GI-FP16-NEXT: mov x3, xzr3233; CHECK-GI-FP16-NEXT: mov x5, xzr3234; CHECK-GI-FP16-NEXT: mov x7, xzr3235; CHECK-GI-FP16-NEXT: fcvtzs x2, h13236; CHECK-GI-FP16-NEXT: fcvtzs x4, h23237; CHECK-GI-FP16-NEXT: fcvtzs x6, h33238; CHECK-GI-FP16-NEXT: ret3239 %x = call <4 x i100> @llvm.fptosi.sat.v4f16.v4i100(<4 x half> %f)3240 ret <4 x i100> %x3241}3242 3243define <4 x i128> @test_signed_v4f16_v4i128(<4 x half> %f) {3244; CHECK-SD-LABEL: test_signed_v4f16_v4i128:3245; CHECK-SD: // %bb.0:3246; CHECK-SD-NEXT: sub sp, sp, #1123247; CHECK-SD-NEXT: str d10, [sp, #16] // 8-byte Spill3248; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill3249; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Spill3250; CHECK-SD-NEXT: stp x26, x25, [sp, #48] // 16-byte Folded Spill3251; CHECK-SD-NEXT: stp x24, x23, [sp, #64] // 16-byte Folded Spill3252; CHECK-SD-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill3253; CHECK-SD-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill3254; CHECK-SD-NEXT: .cfi_def_cfa_offset 1123255; CHECK-SD-NEXT: .cfi_offset w19, -83256; CHECK-SD-NEXT: .cfi_offset w20, -163257; CHECK-SD-NEXT: .cfi_offset w21, -243258; CHECK-SD-NEXT: .cfi_offset w22, -323259; CHECK-SD-NEXT: .cfi_offset w23, -403260; CHECK-SD-NEXT: .cfi_offset w24, -483261; CHECK-SD-NEXT: .cfi_offset w25, -563262; CHECK-SD-NEXT: .cfi_offset w26, -643263; CHECK-SD-NEXT: .cfi_offset w30, -723264; CHECK-SD-NEXT: .cfi_offset b8, -803265; CHECK-SD-NEXT: .cfi_offset b9, -883266; CHECK-SD-NEXT: .cfi_offset b10, -963267; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q03268; CHECK-SD-NEXT: fcvt s8, h03269; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill3270; CHECK-SD-NEXT: fmov s0, s83271; CHECK-SD-NEXT: bl __fixsfti3272; CHECK-SD-NEXT: movi v9.2s, #255, lsl #243273; CHECK-SD-NEXT: mov w8, #2130706431 // =0x7effffff3274; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3275; CHECK-SD-NEXT: fmov s10, w83276; CHECK-SD-NEXT: mov x25, #-9223372036854775808 // =0x80000000000000003277; CHECK-SD-NEXT: mov x26, #9223372036854775807 // =0x7fffffffffffffff3278; CHECK-SD-NEXT: mov h0, v0.h[1]3279; CHECK-SD-NEXT: fcmp s8, s93280; CHECK-SD-NEXT: csel x8, xzr, x0, lt3281; CHECK-SD-NEXT: csel x9, x25, x1, lt3282; CHECK-SD-NEXT: fcmp s8, s103283; CHECK-SD-NEXT: csel x9, x26, x9, gt3284; CHECK-SD-NEXT: csinv x8, x8, xzr, le3285; CHECK-SD-NEXT: fcmp s8, s83286; CHECK-SD-NEXT: fcvt s8, h03287; CHECK-SD-NEXT: csel x19, xzr, x8, vs3288; CHECK-SD-NEXT: csel x20, xzr, x9, vs3289; CHECK-SD-NEXT: fmov s0, s83290; CHECK-SD-NEXT: bl __fixsfti3291; CHECK-SD-NEXT: fcmp s8, s93292; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3293; CHECK-SD-NEXT: mov h0, v0.h[2]3294; CHECK-SD-NEXT: csel x8, xzr, x0, lt3295; CHECK-SD-NEXT: csel x9, x25, x1, lt3296; CHECK-SD-NEXT: fcmp s8, s103297; CHECK-SD-NEXT: csel x9, x26, x9, gt3298; CHECK-SD-NEXT: csinv x8, x8, xzr, le3299; CHECK-SD-NEXT: fcmp s8, s83300; CHECK-SD-NEXT: fcvt s8, h03301; CHECK-SD-NEXT: csel x21, xzr, x8, vs3302; CHECK-SD-NEXT: csel x22, xzr, x9, vs3303; CHECK-SD-NEXT: fmov s0, s83304; CHECK-SD-NEXT: bl __fixsfti3305; CHECK-SD-NEXT: fcmp s8, s93306; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3307; CHECK-SD-NEXT: mov h0, v0.h[3]3308; CHECK-SD-NEXT: csel x8, xzr, x0, lt3309; CHECK-SD-NEXT: csel x9, x25, x1, lt3310; CHECK-SD-NEXT: fcmp s8, s103311; CHECK-SD-NEXT: csel x9, x26, x9, gt3312; CHECK-SD-NEXT: csinv x8, x8, xzr, le3313; CHECK-SD-NEXT: fcmp s8, s83314; CHECK-SD-NEXT: fcvt s8, h03315; CHECK-SD-NEXT: csel x23, xzr, x8, vs3316; CHECK-SD-NEXT: csel x24, xzr, x9, vs3317; CHECK-SD-NEXT: fmov s0, s83318; CHECK-SD-NEXT: bl __fixsfti3319; CHECK-SD-NEXT: fcmp s8, s93320; CHECK-SD-NEXT: mov x2, x213321; CHECK-SD-NEXT: mov x3, x223322; CHECK-SD-NEXT: mov x4, x233323; CHECK-SD-NEXT: mov x5, x243324; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Reload3325; CHECK-SD-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload3326; CHECK-SD-NEXT: csel x8, xzr, x0, lt3327; CHECK-SD-NEXT: csel x9, x25, x1, lt3328; CHECK-SD-NEXT: fcmp s8, s103329; CHECK-SD-NEXT: mov x0, x193330; CHECK-SD-NEXT: mov x1, x203331; CHECK-SD-NEXT: ldr d10, [sp, #16] // 8-byte Reload3332; CHECK-SD-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload3333; CHECK-SD-NEXT: csel x9, x26, x9, gt3334; CHECK-SD-NEXT: csinv x8, x8, xzr, le3335; CHECK-SD-NEXT: fcmp s8, s83336; CHECK-SD-NEXT: ldp x24, x23, [sp, #64] // 16-byte Folded Reload3337; CHECK-SD-NEXT: ldp x26, x25, [sp, #48] // 16-byte Folded Reload3338; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload3339; CHECK-SD-NEXT: csel x6, xzr, x8, vs3340; CHECK-SD-NEXT: csel x7, xzr, x9, vs3341; CHECK-SD-NEXT: add sp, sp, #1123342; CHECK-SD-NEXT: ret3343;3344; CHECK-GI-CVT-LABEL: test_signed_v4f16_v4i128:3345; CHECK-GI-CVT: // %bb.0:3346; CHECK-GI-CVT-NEXT: // kill: def $d0 killed $d0 def $q03347; CHECK-GI-CVT-NEXT: mov h1, v0.h[1]3348; CHECK-GI-CVT-NEXT: mov h2, v0.h[2]3349; CHECK-GI-CVT-NEXT: mov x1, xzr3350; CHECK-GI-CVT-NEXT: mov h3, v0.h[3]3351; CHECK-GI-CVT-NEXT: fcvt s0, h03352; CHECK-GI-CVT-NEXT: mov x3, xzr3353; CHECK-GI-CVT-NEXT: mov x5, xzr3354; CHECK-GI-CVT-NEXT: mov x7, xzr3355; CHECK-GI-CVT-NEXT: fcvt s1, h13356; CHECK-GI-CVT-NEXT: fcvt s2, h23357; CHECK-GI-CVT-NEXT: fcvt s3, h33358; CHECK-GI-CVT-NEXT: fcvtzs x0, s03359; CHECK-GI-CVT-NEXT: fcvtzs x2, s13360; CHECK-GI-CVT-NEXT: fcvtzs x4, s23361; CHECK-GI-CVT-NEXT: fcvtzs x6, s33362; CHECK-GI-CVT-NEXT: ret3363;3364; CHECK-GI-FP16-LABEL: test_signed_v4f16_v4i128:3365; CHECK-GI-FP16: // %bb.0:3366; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 def $q03367; CHECK-GI-FP16-NEXT: mov h1, v0.h[1]3368; CHECK-GI-FP16-NEXT: mov h2, v0.h[2]3369; CHECK-GI-FP16-NEXT: mov x1, xzr3370; CHECK-GI-FP16-NEXT: mov h3, v0.h[3]3371; CHECK-GI-FP16-NEXT: fcvtzs x0, h03372; CHECK-GI-FP16-NEXT: mov x3, xzr3373; CHECK-GI-FP16-NEXT: mov x5, xzr3374; CHECK-GI-FP16-NEXT: mov x7, xzr3375; CHECK-GI-FP16-NEXT: fcvtzs x2, h13376; CHECK-GI-FP16-NEXT: fcvtzs x4, h23377; CHECK-GI-FP16-NEXT: fcvtzs x6, h33378; CHECK-GI-FP16-NEXT: ret3379 %x = call <4 x i128> @llvm.fptosi.sat.v4f16.v4i128(<4 x half> %f)3380 ret <4 x i128> %x3381}3382 3383;3384; 8-Vector half to signed integer -- result size variation3385;3386 3387declare <8 x i1> @llvm.fptosi.sat.v8f16.v8i1 (<8 x half>)3388declare <8 x i8> @llvm.fptosi.sat.v8f16.v8i8 (<8 x half>)3389declare <8 x i13> @llvm.fptosi.sat.v8f16.v8i13 (<8 x half>)3390declare <8 x i16> @llvm.fptosi.sat.v8f16.v8i16 (<8 x half>)3391declare <8 x i19> @llvm.fptosi.sat.v8f16.v8i19 (<8 x half>)3392declare <8 x i50> @llvm.fptosi.sat.v8f16.v8i50 (<8 x half>)3393declare <8 x i64> @llvm.fptosi.sat.v8f16.v8i64 (<8 x half>)3394declare <8 x i100> @llvm.fptosi.sat.v8f16.v8i100(<8 x half>)3395declare <8 x i128> @llvm.fptosi.sat.v8f16.v8i128(<8 x half>)3396 3397define <8 x i1> @test_signed_v8f16_v8i1(<8 x half> %f) {3398; CHECK-SD-CVT-LABEL: test_signed_v8f16_v8i1:3399; CHECK-SD-CVT: // %bb.0:3400; CHECK-SD-CVT-NEXT: fcvtl2 v2.4s, v0.8h3401; CHECK-SD-CVT-NEXT: fcvtl v0.4s, v0.4h3402; CHECK-SD-CVT-NEXT: movi v1.2d, #00000000000000003403; CHECK-SD-CVT-NEXT: movi v3.2d, #0xffffffffffffffff3404; CHECK-SD-CVT-NEXT: fcvtzs v2.4s, v2.4s3405; CHECK-SD-CVT-NEXT: fcvtzs v0.4s, v0.4s3406; CHECK-SD-CVT-NEXT: smin v2.4s, v2.4s, v1.4s3407; CHECK-SD-CVT-NEXT: smin v0.4s, v0.4s, v1.4s3408; CHECK-SD-CVT-NEXT: smax v1.4s, v2.4s, v3.4s3409; CHECK-SD-CVT-NEXT: smax v0.4s, v0.4s, v3.4s3410; CHECK-SD-CVT-NEXT: uzp1 v0.8h, v0.8h, v1.8h3411; CHECK-SD-CVT-NEXT: xtn v0.8b, v0.8h3412; CHECK-SD-CVT-NEXT: ret3413;3414; CHECK-FP16-LABEL: test_signed_v8f16_v8i1:3415; CHECK-FP16: // %bb.0:3416; CHECK-FP16-NEXT: movi v1.2d, #00000000000000003417; CHECK-FP16-NEXT: fcvtzs v0.8h, v0.8h3418; CHECK-FP16-NEXT: movi v2.2d, #0xffffffffffffffff3419; CHECK-FP16-NEXT: smin v0.8h, v0.8h, v1.8h3420; CHECK-FP16-NEXT: smax v0.8h, v0.8h, v2.8h3421; CHECK-FP16-NEXT: xtn v0.8b, v0.8h3422; CHECK-FP16-NEXT: ret3423;3424; CHECK-GI-CVT-LABEL: test_signed_v8f16_v8i1:3425; CHECK-GI-CVT: // %bb.0:3426; CHECK-GI-CVT-NEXT: fcvtl v2.4s, v0.4h3427; CHECK-GI-CVT-NEXT: fcvtl2 v0.4s, v0.8h3428; CHECK-GI-CVT-NEXT: movi v1.2d, #00000000000000003429; CHECK-GI-CVT-NEXT: movi v3.2d, #0xffffffffffffffff3430; CHECK-GI-CVT-NEXT: fcvtzs v2.4s, v2.4s3431; CHECK-GI-CVT-NEXT: fcvtzs v0.4s, v0.4s3432; CHECK-GI-CVT-NEXT: smin v2.4s, v2.4s, v1.4s3433; CHECK-GI-CVT-NEXT: smin v0.4s, v0.4s, v1.4s3434; CHECK-GI-CVT-NEXT: smax v1.4s, v2.4s, v3.4s3435; CHECK-GI-CVT-NEXT: smax v0.4s, v0.4s, v3.4s3436; CHECK-GI-CVT-NEXT: uzp1 v0.8h, v1.8h, v0.8h3437; CHECK-GI-CVT-NEXT: xtn v0.8b, v0.8h3438; CHECK-GI-CVT-NEXT: ret3439 %x = call <8 x i1> @llvm.fptosi.sat.v8f16.v8i1(<8 x half> %f)3440 ret <8 x i1> %x3441}3442 3443define <8 x i8> @test_signed_v8f16_v8i8(<8 x half> %f) {3444; CHECK-SD-CVT-LABEL: test_signed_v8f16_v8i8:3445; CHECK-SD-CVT: // %bb.0:3446; CHECK-SD-CVT-NEXT: fcvtl2 v2.4s, v0.8h3447; CHECK-SD-CVT-NEXT: fcvtl v0.4s, v0.4h3448; CHECK-SD-CVT-NEXT: movi v1.4s, #1273449; CHECK-SD-CVT-NEXT: fcvtzs v2.4s, v2.4s3450; CHECK-SD-CVT-NEXT: fcvtzs v0.4s, v0.4s3451; CHECK-SD-CVT-NEXT: smin v2.4s, v2.4s, v1.4s3452; CHECK-SD-CVT-NEXT: smin v0.4s, v0.4s, v1.4s3453; CHECK-SD-CVT-NEXT: mvni v1.4s, #1273454; CHECK-SD-CVT-NEXT: smax v2.4s, v2.4s, v1.4s3455; CHECK-SD-CVT-NEXT: smax v0.4s, v0.4s, v1.4s3456; CHECK-SD-CVT-NEXT: uzp1 v0.8h, v0.8h, v2.8h3457; CHECK-SD-CVT-NEXT: xtn v0.8b, v0.8h3458; CHECK-SD-CVT-NEXT: ret3459;3460; CHECK-FP16-LABEL: test_signed_v8f16_v8i8:3461; CHECK-FP16: // %bb.0:3462; CHECK-FP16-NEXT: fcvtzs v0.8h, v0.8h3463; CHECK-FP16-NEXT: sqxtn v0.8b, v0.8h3464; CHECK-FP16-NEXT: ret3465;3466; CHECK-GI-CVT-LABEL: test_signed_v8f16_v8i8:3467; CHECK-GI-CVT: // %bb.0:3468; CHECK-GI-CVT-NEXT: fcvtl v2.4s, v0.4h3469; CHECK-GI-CVT-NEXT: fcvtl2 v0.4s, v0.8h3470; CHECK-GI-CVT-NEXT: movi v1.4s, #1273471; CHECK-GI-CVT-NEXT: fcvtzs v2.4s, v2.4s3472; CHECK-GI-CVT-NEXT: fcvtzs v0.4s, v0.4s3473; CHECK-GI-CVT-NEXT: smin v2.4s, v2.4s, v1.4s3474; CHECK-GI-CVT-NEXT: smin v0.4s, v0.4s, v1.4s3475; CHECK-GI-CVT-NEXT: mvni v1.4s, #1273476; CHECK-GI-CVT-NEXT: smax v2.4s, v2.4s, v1.4s3477; CHECK-GI-CVT-NEXT: smax v0.4s, v0.4s, v1.4s3478; CHECK-GI-CVT-NEXT: uzp1 v0.8h, v2.8h, v0.8h3479; CHECK-GI-CVT-NEXT: xtn v0.8b, v0.8h3480; CHECK-GI-CVT-NEXT: ret3481 %x = call <8 x i8> @llvm.fptosi.sat.v8f16.v8i8(<8 x half> %f)3482 ret <8 x i8> %x3483}3484 3485define <8 x i13> @test_signed_v8f16_v8i13(<8 x half> %f) {3486; CHECK-SD-CVT-LABEL: test_signed_v8f16_v8i13:3487; CHECK-SD-CVT: // %bb.0:3488; CHECK-SD-CVT-NEXT: fcvtl2 v2.4s, v0.8h3489; CHECK-SD-CVT-NEXT: fcvtl v0.4s, v0.4h3490; CHECK-SD-CVT-NEXT: movi v1.4s, #15, msl #83491; CHECK-SD-CVT-NEXT: fcvtzs v2.4s, v2.4s3492; CHECK-SD-CVT-NEXT: fcvtzs v0.4s, v0.4s3493; CHECK-SD-CVT-NEXT: smin v2.4s, v2.4s, v1.4s3494; CHECK-SD-CVT-NEXT: smin v0.4s, v0.4s, v1.4s3495; CHECK-SD-CVT-NEXT: mvni v1.4s, #15, msl #83496; CHECK-SD-CVT-NEXT: smax v2.4s, v2.4s, v1.4s3497; CHECK-SD-CVT-NEXT: smax v0.4s, v0.4s, v1.4s3498; CHECK-SD-CVT-NEXT: uzp1 v0.8h, v0.8h, v2.8h3499; CHECK-SD-CVT-NEXT: ret3500;3501; CHECK-FP16-LABEL: test_signed_v8f16_v8i13:3502; CHECK-FP16: // %bb.0:3503; CHECK-FP16-NEXT: fcvtzs v0.8h, v0.8h3504; CHECK-FP16-NEXT: mvni v1.8h, #240, lsl #83505; CHECK-FP16-NEXT: movi v2.8h, #240, lsl #83506; CHECK-FP16-NEXT: smin v0.8h, v0.8h, v1.8h3507; CHECK-FP16-NEXT: smax v0.8h, v0.8h, v2.8h3508; CHECK-FP16-NEXT: ret3509;3510; CHECK-GI-CVT-LABEL: test_signed_v8f16_v8i13:3511; CHECK-GI-CVT: // %bb.0:3512; CHECK-GI-CVT-NEXT: fcvtl v2.4s, v0.4h3513; CHECK-GI-CVT-NEXT: fcvtl2 v0.4s, v0.8h3514; CHECK-GI-CVT-NEXT: movi v1.4s, #15, msl #83515; CHECK-GI-CVT-NEXT: fcvtzs v2.4s, v2.4s3516; CHECK-GI-CVT-NEXT: fcvtzs v0.4s, v0.4s3517; CHECK-GI-CVT-NEXT: smin v2.4s, v2.4s, v1.4s3518; CHECK-GI-CVT-NEXT: smin v0.4s, v0.4s, v1.4s3519; CHECK-GI-CVT-NEXT: mvni v1.4s, #15, msl #83520; CHECK-GI-CVT-NEXT: smax v2.4s, v2.4s, v1.4s3521; CHECK-GI-CVT-NEXT: smax v0.4s, v0.4s, v1.4s3522; CHECK-GI-CVT-NEXT: uzp1 v0.8h, v2.8h, v0.8h3523; CHECK-GI-CVT-NEXT: ret3524 %x = call <8 x i13> @llvm.fptosi.sat.v8f16.v8i13(<8 x half> %f)3525 ret <8 x i13> %x3526}3527 3528define <8 x i16> @test_signed_v8f16_v8i16(<8 x half> %f) {3529; CHECK-SD-CVT-LABEL: test_signed_v8f16_v8i16:3530; CHECK-SD-CVT: // %bb.0:3531; CHECK-SD-CVT-NEXT: fcvtl v1.4s, v0.4h3532; CHECK-SD-CVT-NEXT: fcvtl2 v2.4s, v0.8h3533; CHECK-SD-CVT-NEXT: fcvtzs v1.4s, v1.4s3534; CHECK-SD-CVT-NEXT: sqxtn v0.4h, v1.4s3535; CHECK-SD-CVT-NEXT: fcvtzs v1.4s, v2.4s3536; CHECK-SD-CVT-NEXT: sqxtn2 v0.8h, v1.4s3537; CHECK-SD-CVT-NEXT: ret3538;3539; CHECK-FP16-LABEL: test_signed_v8f16_v8i16:3540; CHECK-FP16: // %bb.0:3541; CHECK-FP16-NEXT: fcvtzs v0.8h, v0.8h3542; CHECK-FP16-NEXT: ret3543;3544; CHECK-GI-CVT-LABEL: test_signed_v8f16_v8i16:3545; CHECK-GI-CVT: // %bb.0:3546; CHECK-GI-CVT-NEXT: fcvtl v1.4s, v0.4h3547; CHECK-GI-CVT-NEXT: fcvtl2 v0.4s, v0.8h3548; CHECK-GI-CVT-NEXT: fcvtzs v1.4s, v1.4s3549; CHECK-GI-CVT-NEXT: fcvtzs v2.4s, v0.4s3550; CHECK-GI-CVT-NEXT: sqxtn v0.4h, v1.4s3551; CHECK-GI-CVT-NEXT: sqxtn2 v0.8h, v2.4s3552; CHECK-GI-CVT-NEXT: ret3553 %x = call <8 x i16> @llvm.fptosi.sat.v8f16.v8i16(<8 x half> %f)3554 ret <8 x i16> %x3555}3556 3557define <8 x i19> @test_signed_v8f16_v8i19(<8 x half> %f) {3558; CHECK-LABEL: test_signed_v8f16_v8i19:3559; CHECK: // %bb.0:3560; CHECK-NEXT: fcvtl v2.4s, v0.4h3561; CHECK-NEXT: fcvtl2 v0.4s, v0.8h3562; CHECK-NEXT: movi v1.4s, #3, msl #163563; CHECK-NEXT: mvni v3.4s, #3, msl #163564; CHECK-NEXT: fcvtzs v2.4s, v2.4s3565; CHECK-NEXT: fcvtzs v0.4s, v0.4s3566; CHECK-NEXT: smin v2.4s, v2.4s, v1.4s3567; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s3568; CHECK-NEXT: smax v1.4s, v2.4s, v3.4s3569; CHECK-NEXT: smax v0.4s, v0.4s, v3.4s3570; CHECK-NEXT: mov w1, v1.s[1]3571; CHECK-NEXT: mov w2, v1.s[2]3572; CHECK-NEXT: mov w3, v1.s[3]3573; CHECK-NEXT: mov w5, v0.s[1]3574; CHECK-NEXT: mov w6, v0.s[2]3575; CHECK-NEXT: mov w7, v0.s[3]3576; CHECK-NEXT: fmov w4, s03577; CHECK-NEXT: fmov w0, s13578; CHECK-NEXT: ret3579 %x = call <8 x i19> @llvm.fptosi.sat.v8f16.v8i19(<8 x half> %f)3580 ret <8 x i19> %x3581}3582 3583define <8 x i32> @test_signed_v8f16_v8i32_duplicate(<8 x half> %f) {3584; CHECK-SD-LABEL: test_signed_v8f16_v8i32_duplicate:3585; CHECK-SD: // %bb.0:3586; CHECK-SD-NEXT: fcvtl2 v1.4s, v0.8h3587; CHECK-SD-NEXT: fcvtl v0.4s, v0.4h3588; CHECK-SD-NEXT: fcvtzs v1.4s, v1.4s3589; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s3590; CHECK-SD-NEXT: ret3591;3592; CHECK-GI-LABEL: test_signed_v8f16_v8i32_duplicate:3593; CHECK-GI: // %bb.0:3594; CHECK-GI-NEXT: fcvtl v1.4s, v0.4h3595; CHECK-GI-NEXT: fcvtl2 v2.4s, v0.8h3596; CHECK-GI-NEXT: fcvtzs v0.4s, v1.4s3597; CHECK-GI-NEXT: fcvtzs v1.4s, v2.4s3598; CHECK-GI-NEXT: ret3599 %x = call <8 x i32> @llvm.fptosi.sat.v8f16.v8i32(<8 x half> %f)3600 ret <8 x i32> %x3601}3602 3603define <8 x i50> @test_signed_v8f16_v8i50(<8 x half> %f) {3604; CHECK-CVT-LABEL: test_signed_v8f16_v8i50:3605; CHECK-CVT: // %bb.0:3606; CHECK-CVT-NEXT: ext v1.16b, v0.16b, v0.16b, #83607; CHECK-CVT-NEXT: mov x8, #562949953421311 // =0x1ffffffffffff3608; CHECK-CVT-NEXT: mov x9, #-562949953421312 // =0xfffe0000000000003609; CHECK-CVT-NEXT: mov h2, v1.h[1]3610; CHECK-CVT-NEXT: fcvt s3, h13611; CHECK-CVT-NEXT: mov h4, v1.h[2]3612; CHECK-CVT-NEXT: mov h1, v1.h[3]3613; CHECK-CVT-NEXT: fcvt s2, h23614; CHECK-CVT-NEXT: fcvtzs x10, s33615; CHECK-CVT-NEXT: fcvt s3, h43616; CHECK-CVT-NEXT: fcvt s1, h13617; CHECK-CVT-NEXT: fcvtzs x11, s23618; CHECK-CVT-NEXT: cmp x10, x83619; CHECK-CVT-NEXT: fcvtzs x12, s33620; CHECK-CVT-NEXT: csel x10, x10, x8, lt3621; CHECK-CVT-NEXT: mov h2, v0.h[1]3622; CHECK-CVT-NEXT: fcvt s3, h03623; CHECK-CVT-NEXT: cmp x10, x93624; CHECK-CVT-NEXT: csel x4, x10, x9, gt3625; CHECK-CVT-NEXT: cmp x11, x83626; CHECK-CVT-NEXT: csel x10, x11, x8, lt3627; CHECK-CVT-NEXT: fcvtzs x11, s13628; CHECK-CVT-NEXT: mov h1, v0.h[2]3629; CHECK-CVT-NEXT: cmp x10, x93630; CHECK-CVT-NEXT: fcvt s2, h23631; CHECK-CVT-NEXT: mov h0, v0.h[3]3632; CHECK-CVT-NEXT: csel x5, x10, x9, gt3633; CHECK-CVT-NEXT: cmp x12, x83634; CHECK-CVT-NEXT: csel x10, x12, x8, lt3635; CHECK-CVT-NEXT: fcvtzs x12, s33636; CHECK-CVT-NEXT: cmp x10, x93637; CHECK-CVT-NEXT: fcvt s1, h13638; CHECK-CVT-NEXT: csel x6, x10, x9, gt3639; CHECK-CVT-NEXT: cmp x11, x83640; CHECK-CVT-NEXT: fcvt s0, h03641; CHECK-CVT-NEXT: csel x10, x11, x8, lt3642; CHECK-CVT-NEXT: fcvtzs x11, s23643; CHECK-CVT-NEXT: cmp x10, x93644; CHECK-CVT-NEXT: csel x7, x10, x9, gt3645; CHECK-CVT-NEXT: cmp x12, x83646; CHECK-CVT-NEXT: csel x10, x12, x8, lt3647; CHECK-CVT-NEXT: fcvtzs x12, s13648; CHECK-CVT-NEXT: cmp x10, x93649; CHECK-CVT-NEXT: csel x0, x10, x9, gt3650; CHECK-CVT-NEXT: cmp x11, x83651; CHECK-CVT-NEXT: csel x10, x11, x8, lt3652; CHECK-CVT-NEXT: fcvtzs x11, s03653; CHECK-CVT-NEXT: cmp x10, x93654; CHECK-CVT-NEXT: csel x1, x10, x9, gt3655; CHECK-CVT-NEXT: cmp x12, x83656; CHECK-CVT-NEXT: csel x10, x12, x8, lt3657; CHECK-CVT-NEXT: cmp x10, x93658; CHECK-CVT-NEXT: csel x2, x10, x9, gt3659; CHECK-CVT-NEXT: cmp x11, x83660; CHECK-CVT-NEXT: csel x8, x11, x8, lt3661; CHECK-CVT-NEXT: cmp x8, x93662; CHECK-CVT-NEXT: csel x3, x8, x9, gt3663; CHECK-CVT-NEXT: ret3664;3665; CHECK-FP16-LABEL: test_signed_v8f16_v8i50:3666; CHECK-FP16: // %bb.0:3667; CHECK-FP16-NEXT: ext v1.16b, v0.16b, v0.16b, #83668; CHECK-FP16-NEXT: mov x8, #562949953421311 // =0x1ffffffffffff3669; CHECK-FP16-NEXT: mov x9, #-562949953421312 // =0xfffe0000000000003670; CHECK-FP16-NEXT: mov h2, v1.h[1]3671; CHECK-FP16-NEXT: fcvtzs x10, h13672; CHECK-FP16-NEXT: mov h3, v1.h[2]3673; CHECK-FP16-NEXT: mov h1, v1.h[3]3674; CHECK-FP16-NEXT: fcvtzs x11, h23675; CHECK-FP16-NEXT: cmp x10, x83676; CHECK-FP16-NEXT: fcvtzs x12, h33677; CHECK-FP16-NEXT: csel x10, x10, x8, lt3678; CHECK-FP16-NEXT: mov h2, v0.h[2]3679; CHECK-FP16-NEXT: cmp x10, x93680; CHECK-FP16-NEXT: csel x4, x10, x9, gt3681; CHECK-FP16-NEXT: cmp x11, x83682; CHECK-FP16-NEXT: csel x10, x11, x8, lt3683; CHECK-FP16-NEXT: fcvtzs x11, h13684; CHECK-FP16-NEXT: mov h1, v0.h[1]3685; CHECK-FP16-NEXT: cmp x10, x93686; CHECK-FP16-NEXT: csel x5, x10, x9, gt3687; CHECK-FP16-NEXT: cmp x12, x83688; CHECK-FP16-NEXT: csel x10, x12, x8, lt3689; CHECK-FP16-NEXT: fcvtzs x12, h03690; CHECK-FP16-NEXT: mov h0, v0.h[3]3691; CHECK-FP16-NEXT: cmp x10, x93692; CHECK-FP16-NEXT: csel x6, x10, x9, gt3693; CHECK-FP16-NEXT: cmp x11, x83694; CHECK-FP16-NEXT: csel x10, x11, x8, lt3695; CHECK-FP16-NEXT: fcvtzs x11, h13696; CHECK-FP16-NEXT: cmp x10, x93697; CHECK-FP16-NEXT: csel x7, x10, x9, gt3698; CHECK-FP16-NEXT: cmp x12, x83699; CHECK-FP16-NEXT: csel x10, x12, x8, lt3700; CHECK-FP16-NEXT: fcvtzs x12, h23701; CHECK-FP16-NEXT: cmp x10, x93702; CHECK-FP16-NEXT: csel x0, x10, x9, gt3703; CHECK-FP16-NEXT: cmp x11, x83704; CHECK-FP16-NEXT: csel x10, x11, x8, lt3705; CHECK-FP16-NEXT: fcvtzs x11, h03706; CHECK-FP16-NEXT: cmp x10, x93707; CHECK-FP16-NEXT: csel x1, x10, x9, gt3708; CHECK-FP16-NEXT: cmp x12, x83709; CHECK-FP16-NEXT: csel x10, x12, x8, lt3710; CHECK-FP16-NEXT: cmp x10, x93711; CHECK-FP16-NEXT: csel x2, x10, x9, gt3712; CHECK-FP16-NEXT: cmp x11, x83713; CHECK-FP16-NEXT: csel x8, x11, x8, lt3714; CHECK-FP16-NEXT: cmp x8, x93715; CHECK-FP16-NEXT: csel x3, x8, x9, gt3716; CHECK-FP16-NEXT: ret3717 %x = call <8 x i50> @llvm.fptosi.sat.v8f16.v8i50(<8 x half> %f)3718 ret <8 x i50> %x3719}3720 3721define <8 x i64> @test_signed_v8f16_v8i64(<8 x half> %f) {3722; CHECK-SD-CVT-LABEL: test_signed_v8f16_v8i64:3723; CHECK-SD-CVT: // %bb.0:3724; CHECK-SD-CVT-NEXT: ext v1.16b, v0.16b, v0.16b, #83725; CHECK-SD-CVT-NEXT: mov h4, v0.h[2]3726; CHECK-SD-CVT-NEXT: mov h3, v0.h[1]3727; CHECK-SD-CVT-NEXT: mov h7, v0.h[3]3728; CHECK-SD-CVT-NEXT: fcvt s0, h03729; CHECK-SD-CVT-NEXT: mov h2, v1.h[2]3730; CHECK-SD-CVT-NEXT: mov h5, v1.h[1]3731; CHECK-SD-CVT-NEXT: mov h6, v1.h[3]3732; CHECK-SD-CVT-NEXT: fcvt s1, h13733; CHECK-SD-CVT-NEXT: fcvt s4, h43734; CHECK-SD-CVT-NEXT: fcvt s3, h33735; CHECK-SD-CVT-NEXT: fcvt s7, h73736; CHECK-SD-CVT-NEXT: fcvtzs x9, s03737; CHECK-SD-CVT-NEXT: fcvt s2, h23738; CHECK-SD-CVT-NEXT: fcvt s5, h53739; CHECK-SD-CVT-NEXT: fcvt s6, h63740; CHECK-SD-CVT-NEXT: fcvtzs x8, s13741; CHECK-SD-CVT-NEXT: fcvtzs x12, s43742; CHECK-SD-CVT-NEXT: fcvtzs x11, s33743; CHECK-SD-CVT-NEXT: fcvtzs x15, s73744; CHECK-SD-CVT-NEXT: fmov d0, x93745; CHECK-SD-CVT-NEXT: fcvtzs x10, s23746; CHECK-SD-CVT-NEXT: fcvtzs x13, s53747; CHECK-SD-CVT-NEXT: fcvtzs x14, s63748; CHECK-SD-CVT-NEXT: fmov d2, x83749; CHECK-SD-CVT-NEXT: fmov d1, x123750; CHECK-SD-CVT-NEXT: mov v0.d[1], x113751; CHECK-SD-CVT-NEXT: fmov d3, x103752; CHECK-SD-CVT-NEXT: mov v2.d[1], x133753; CHECK-SD-CVT-NEXT: mov v1.d[1], x153754; CHECK-SD-CVT-NEXT: mov v3.d[1], x143755; CHECK-SD-CVT-NEXT: ret3756;3757; CHECK-SD-FP16-LABEL: test_signed_v8f16_v8i64:3758; CHECK-SD-FP16: // %bb.0:3759; CHECK-SD-FP16-NEXT: ext v1.16b, v0.16b, v0.16b, #83760; CHECK-SD-FP16-NEXT: mov h4, v0.h[2]3761; CHECK-SD-FP16-NEXT: mov h3, v0.h[1]3762; CHECK-SD-FP16-NEXT: mov h7, v0.h[3]3763; CHECK-SD-FP16-NEXT: fcvtzs x9, h03764; CHECK-SD-FP16-NEXT: mov h2, v1.h[2]3765; CHECK-SD-FP16-NEXT: mov h5, v1.h[1]3766; CHECK-SD-FP16-NEXT: mov h6, v1.h[3]3767; CHECK-SD-FP16-NEXT: fcvtzs x8, h13768; CHECK-SD-FP16-NEXT: fcvtzs x12, h43769; CHECK-SD-FP16-NEXT: fcvtzs x11, h33770; CHECK-SD-FP16-NEXT: fcvtzs x15, h73771; CHECK-SD-FP16-NEXT: fmov d0, x93772; CHECK-SD-FP16-NEXT: fcvtzs x10, h23773; CHECK-SD-FP16-NEXT: fcvtzs x13, h53774; CHECK-SD-FP16-NEXT: fcvtzs x14, h63775; CHECK-SD-FP16-NEXT: fmov d2, x83776; CHECK-SD-FP16-NEXT: fmov d1, x123777; CHECK-SD-FP16-NEXT: mov v0.d[1], x113778; CHECK-SD-FP16-NEXT: fmov d3, x103779; CHECK-SD-FP16-NEXT: mov v2.d[1], x133780; CHECK-SD-FP16-NEXT: mov v1.d[1], x153781; CHECK-SD-FP16-NEXT: mov v3.d[1], x143782; CHECK-SD-FP16-NEXT: ret3783;3784; CHECK-GI-LABEL: test_signed_v8f16_v8i64:3785; CHECK-GI: // %bb.0:3786; CHECK-GI-NEXT: fcvtl v1.4s, v0.4h3787; CHECK-GI-NEXT: fcvtl2 v0.4s, v0.8h3788; CHECK-GI-NEXT: fcvtl v2.2d, v1.2s3789; CHECK-GI-NEXT: fcvtl2 v1.2d, v1.4s3790; CHECK-GI-NEXT: fcvtl v3.2d, v0.2s3791; CHECK-GI-NEXT: fcvtl2 v4.2d, v0.4s3792; CHECK-GI-NEXT: fcvtzs v0.2d, v2.2d3793; CHECK-GI-NEXT: fcvtzs v1.2d, v1.2d3794; CHECK-GI-NEXT: fcvtzs v2.2d, v3.2d3795; CHECK-GI-NEXT: fcvtzs v3.2d, v4.2d3796; CHECK-GI-NEXT: ret3797 %x = call <8 x i64> @llvm.fptosi.sat.v8f16.v8i64(<8 x half> %f)3798 ret <8 x i64> %x3799}3800 3801define <8 x i100> @test_signed_v8f16_v8i100(<8 x half> %f) {3802; CHECK-LABEL: test_signed_v8f16_v8i100:3803; CHECK: // %bb.0:3804; CHECK-NEXT: sub sp, sp, #1923805; CHECK-NEXT: str d10, [sp, #64] // 8-byte Spill3806; CHECK-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill3807; CHECK-NEXT: stp x29, x30, [sp, #96] // 16-byte Folded Spill3808; CHECK-NEXT: stp x28, x27, [sp, #112] // 16-byte Folded Spill3809; CHECK-NEXT: stp x26, x25, [sp, #128] // 16-byte Folded Spill3810; CHECK-NEXT: stp x24, x23, [sp, #144] // 16-byte Folded Spill3811; CHECK-NEXT: stp x22, x21, [sp, #160] // 16-byte Folded Spill3812; CHECK-NEXT: stp x20, x19, [sp, #176] // 16-byte Folded Spill3813; CHECK-NEXT: .cfi_def_cfa_offset 1923814; CHECK-NEXT: .cfi_offset w19, -83815; CHECK-NEXT: .cfi_offset w20, -163816; CHECK-NEXT: .cfi_offset w21, -243817; CHECK-NEXT: .cfi_offset w22, -323818; CHECK-NEXT: .cfi_offset w23, -403819; CHECK-NEXT: .cfi_offset w24, -483820; CHECK-NEXT: .cfi_offset w25, -563821; CHECK-NEXT: .cfi_offset w26, -643822; CHECK-NEXT: .cfi_offset w27, -723823; CHECK-NEXT: .cfi_offset w28, -803824; CHECK-NEXT: .cfi_offset w30, -883825; CHECK-NEXT: .cfi_offset w29, -963826; CHECK-NEXT: .cfi_offset b8, -1043827; CHECK-NEXT: .cfi_offset b9, -1123828; CHECK-NEXT: .cfi_offset b10, -1283829; CHECK-NEXT: str q0, [sp, #48] // 16-byte Spill3830; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #83831; CHECK-NEXT: mov x19, x83832; CHECK-NEXT: str q0, [sp, #32] // 16-byte Spill3833; CHECK-NEXT: mov h0, v0.h[1]3834; CHECK-NEXT: fcvt s8, h03835; CHECK-NEXT: fmov s0, s83836; CHECK-NEXT: bl __fixsfti3837; CHECK-NEXT: movi v10.2s, #241, lsl #243838; CHECK-NEXT: mov w8, #1895825407 // =0x70ffffff3839; CHECK-NEXT: ldr q0, [sp, #32] // 16-byte Reload3840; CHECK-NEXT: fmov s9, w83841; CHECK-NEXT: mov x22, #-34359738368 // =0xfffffff8000000003842; CHECK-NEXT: mov x23, #34359738367 // =0x7ffffffff3843; CHECK-NEXT: mov h0, v0.h[3]3844; CHECK-NEXT: fcmp s8, s103845; CHECK-NEXT: csel x8, x22, x1, lt3846; CHECK-NEXT: csel x9, xzr, x0, lt3847; CHECK-NEXT: fcmp s8, s93848; CHECK-NEXT: csinv x9, x9, xzr, le3849; CHECK-NEXT: csel x8, x23, x8, gt3850; CHECK-NEXT: fcmp s8, s83851; CHECK-NEXT: fcvt s8, h03852; CHECK-NEXT: csel x8, xzr, x8, vs3853; CHECK-NEXT: str x8, [sp, #72] // 8-byte Spill3854; CHECK-NEXT: csel x8, xzr, x9, vs3855; CHECK-NEXT: fmov s0, s83856; CHECK-NEXT: str x8, [sp, #24] // 8-byte Spill3857; CHECK-NEXT: bl __fixsfti3858; CHECK-NEXT: fcmp s8, s103859; CHECK-NEXT: ldr q0, [sp, #32] // 16-byte Reload3860; CHECK-NEXT: csel x8, xzr, x0, lt3861; CHECK-NEXT: csel x9, x22, x1, lt3862; CHECK-NEXT: fcmp s8, s93863; CHECK-NEXT: csel x9, x23, x9, gt3864; CHECK-NEXT: csinv x8, x8, xzr, le3865; CHECK-NEXT: fcmp s8, s83866; CHECK-NEXT: fcvt s8, h03867; CHECK-NEXT: csel x10, xzr, x8, vs3868; CHECK-NEXT: csel x8, xzr, x9, vs3869; CHECK-NEXT: stp x8, x10, [sp, #8] // 16-byte Folded Spill3870; CHECK-NEXT: fmov s0, s83871; CHECK-NEXT: bl __fixsfti3872; CHECK-NEXT: fcmp s8, s103873; CHECK-NEXT: ldr q0, [sp, #32] // 16-byte Reload3874; CHECK-NEXT: mov h0, v0.h[2]3875; CHECK-NEXT: csel x8, x22, x1, lt3876; CHECK-NEXT: csel x9, xzr, x0, lt3877; CHECK-NEXT: fcmp s8, s93878; CHECK-NEXT: csinv x9, x9, xzr, le3879; CHECK-NEXT: csel x8, x23, x8, gt3880; CHECK-NEXT: fcmp s8, s83881; CHECK-NEXT: fcvt s8, h03882; CHECK-NEXT: csel x26, xzr, x8, vs3883; CHECK-NEXT: csel x8, xzr, x9, vs3884; CHECK-NEXT: str x8, [sp, #32] // 8-byte Spill3885; CHECK-NEXT: fmov s0, s83886; CHECK-NEXT: bl __fixsfti3887; CHECK-NEXT: fcmp s8, s103888; CHECK-NEXT: ldr q0, [sp, #48] // 16-byte Reload3889; CHECK-NEXT: mov h0, v0.h[1]3890; CHECK-NEXT: csel x8, x22, x1, lt3891; CHECK-NEXT: csel x9, xzr, x0, lt3892; CHECK-NEXT: fcmp s8, s93893; CHECK-NEXT: csinv x9, x9, xzr, le3894; CHECK-NEXT: csel x8, x23, x8, gt3895; CHECK-NEXT: fcmp s8, s83896; CHECK-NEXT: fcvt s8, h03897; CHECK-NEXT: csel x27, xzr, x8, vs3898; CHECK-NEXT: csel x8, xzr, x9, vs3899; CHECK-NEXT: str x8, [sp] // 8-byte Spill3900; CHECK-NEXT: fmov s0, s83901; CHECK-NEXT: bl __fixsfti3902; CHECK-NEXT: fcmp s8, s103903; CHECK-NEXT: ldr q0, [sp, #48] // 16-byte Reload3904; CHECK-NEXT: mov h0, v0.h[3]3905; CHECK-NEXT: csel x8, x22, x1, lt3906; CHECK-NEXT: csel x9, xzr, x0, lt3907; CHECK-NEXT: fcmp s8, s93908; CHECK-NEXT: csinv x9, x9, xzr, le3909; CHECK-NEXT: csel x8, x23, x8, gt3910; CHECK-NEXT: fcmp s8, s83911; CHECK-NEXT: fcvt s8, h03912; CHECK-NEXT: csel x20, xzr, x8, vs3913; CHECK-NEXT: csel x21, xzr, x9, vs3914; CHECK-NEXT: fmov s0, s83915; CHECK-NEXT: bl __fixsfti3916; CHECK-NEXT: fcmp s8, s103917; CHECK-NEXT: ldr q0, [sp, #48] // 16-byte Reload3918; CHECK-NEXT: csel x8, xzr, x0, lt3919; CHECK-NEXT: csel x9, x22, x1, lt3920; CHECK-NEXT: fcmp s8, s93921; CHECK-NEXT: csel x9, x23, x9, gt3922; CHECK-NEXT: csinv x8, x8, xzr, le3923; CHECK-NEXT: fcmp s8, s83924; CHECK-NEXT: fcvt s8, h03925; CHECK-NEXT: csel x28, xzr, x8, vs3926; CHECK-NEXT: csel x24, xzr, x9, vs3927; CHECK-NEXT: fmov s0, s83928; CHECK-NEXT: bl __fixsfti3929; CHECK-NEXT: fcmp s8, s103930; CHECK-NEXT: ldr q0, [sp, #48] // 16-byte Reload3931; CHECK-NEXT: mov h0, v0.h[2]3932; CHECK-NEXT: csel x8, x22, x1, lt3933; CHECK-NEXT: csel x9, xzr, x0, lt3934; CHECK-NEXT: fcmp s8, s93935; CHECK-NEXT: csinv x9, x9, xzr, le3936; CHECK-NEXT: csel x8, x23, x8, gt3937; CHECK-NEXT: fcmp s8, s83938; CHECK-NEXT: fcvt s8, h03939; CHECK-NEXT: csel x25, xzr, x8, vs3940; CHECK-NEXT: csel x29, xzr, x9, vs3941; CHECK-NEXT: fmov s0, s83942; CHECK-NEXT: bl __fixsfti3943; CHECK-NEXT: ldr x9, [sp] // 8-byte Reload3944; CHECK-NEXT: extr x8, x24, x28, #283945; CHECK-NEXT: fcmp s8, s103946; CHECK-NEXT: bfi x25, x21, #36, #283947; CHECK-NEXT: lsr x11, x20, #283948; CHECK-NEXT: stur x9, [x19, #75]3949; CHECK-NEXT: extr x9, x20, x21, #283950; CHECK-NEXT: stur x8, [x19, #41]3951; CHECK-NEXT: csel x8, x22, x1, lt3952; CHECK-NEXT: str x9, [x19, #16]3953; CHECK-NEXT: csel x9, xzr, x0, lt3954; CHECK-NEXT: fcmp s8, s93955; CHECK-NEXT: ldr x10, [sp, #32] // 8-byte Reload3956; CHECK-NEXT: stp x29, x25, [x19]3957; CHECK-NEXT: stur x10, [x19, #50]3958; CHECK-NEXT: lsr x10, x24, #283959; CHECK-NEXT: csinv x9, x9, xzr, le3960; CHECK-NEXT: csel x8, x23, x8, gt3961; CHECK-NEXT: fcmp s8, s83962; CHECK-NEXT: strb w10, [x19, #49]3963; CHECK-NEXT: ldp x14, x12, [sp, #8] // 16-byte Folded Reload3964; CHECK-NEXT: strb w11, [x19, #24]3965; CHECK-NEXT: csel x8, xzr, x8, vs3966; CHECK-NEXT: ldr x13, [sp, #24] // 8-byte Reload3967; CHECK-NEXT: csel x9, xzr, x9, vs3968; CHECK-NEXT: bfi x8, x28, #36, #283969; CHECK-NEXT: extr x10, x14, x12, #283970; CHECK-NEXT: bfi x27, x12, #36, #283971; CHECK-NEXT: ldr x12, [sp, #72] // 8-byte Reload3972; CHECK-NEXT: bfi x26, x13, #36, #283973; CHECK-NEXT: stur x9, [x19, #25]3974; CHECK-NEXT: lsr x9, x14, #283975; CHECK-NEXT: extr x11, x12, x13, #283976; CHECK-NEXT: stur x8, [x19, #33]3977; CHECK-NEXT: lsr x8, x12, #283978; CHECK-NEXT: stur x10, [x19, #91]3979; CHECK-NEXT: stur x27, [x19, #83]3980; CHECK-NEXT: stur x11, [x19, #66]3981; CHECK-NEXT: stur x26, [x19, #58]3982; CHECK-NEXT: strb w9, [x19, #99]3983; CHECK-NEXT: strb w8, [x19, #74]3984; CHECK-NEXT: ldp x20, x19, [sp, #176] // 16-byte Folded Reload3985; CHECK-NEXT: ldr d10, [sp, #64] // 8-byte Reload3986; CHECK-NEXT: ldp x22, x21, [sp, #160] // 16-byte Folded Reload3987; CHECK-NEXT: ldp x24, x23, [sp, #144] // 16-byte Folded Reload3988; CHECK-NEXT: ldp x26, x25, [sp, #128] // 16-byte Folded Reload3989; CHECK-NEXT: ldp x28, x27, [sp, #112] // 16-byte Folded Reload3990; CHECK-NEXT: ldp x29, x30, [sp, #96] // 16-byte Folded Reload3991; CHECK-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload3992; CHECK-NEXT: add sp, sp, #1923993; CHECK-NEXT: ret3994 %x = call <8 x i100> @llvm.fptosi.sat.v8f16.v8i100(<8 x half> %f)3995 ret <8 x i100> %x3996}3997 3998define <8 x i128> @test_signed_v8f16_v8i128(<8 x half> %f) {3999; CHECK-SD-LABEL: test_signed_v8f16_v8i128:4000; CHECK-SD: // %bb.0:4001; CHECK-SD-NEXT: sub sp, sp, #1924002; CHECK-SD-NEXT: str d10, [sp, #64] // 8-byte Spill4003; CHECK-SD-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill4004; CHECK-SD-NEXT: stp x29, x30, [sp, #96] // 16-byte Folded Spill4005; CHECK-SD-NEXT: stp x28, x27, [sp, #112] // 16-byte Folded Spill4006; CHECK-SD-NEXT: stp x26, x25, [sp, #128] // 16-byte Folded Spill4007; CHECK-SD-NEXT: stp x24, x23, [sp, #144] // 16-byte Folded Spill4008; CHECK-SD-NEXT: stp x22, x21, [sp, #160] // 16-byte Folded Spill4009; CHECK-SD-NEXT: stp x20, x19, [sp, #176] // 16-byte Folded Spill4010; CHECK-SD-NEXT: .cfi_def_cfa_offset 1924011; CHECK-SD-NEXT: .cfi_offset w19, -84012; CHECK-SD-NEXT: .cfi_offset w20, -164013; CHECK-SD-NEXT: .cfi_offset w21, -244014; CHECK-SD-NEXT: .cfi_offset w22, -324015; CHECK-SD-NEXT: .cfi_offset w23, -404016; CHECK-SD-NEXT: .cfi_offset w24, -484017; CHECK-SD-NEXT: .cfi_offset w25, -564018; CHECK-SD-NEXT: .cfi_offset w26, -644019; CHECK-SD-NEXT: .cfi_offset w27, -724020; CHECK-SD-NEXT: .cfi_offset w28, -804021; CHECK-SD-NEXT: .cfi_offset w30, -884022; CHECK-SD-NEXT: .cfi_offset w29, -964023; CHECK-SD-NEXT: .cfi_offset b8, -1044024; CHECK-SD-NEXT: .cfi_offset b9, -1124025; CHECK-SD-NEXT: .cfi_offset b10, -1284026; CHECK-SD-NEXT: str q0, [sp, #48] // 16-byte Spill4027; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #84028; CHECK-SD-NEXT: mov x19, x84029; CHECK-SD-NEXT: fcvt s8, h04030; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill4031; CHECK-SD-NEXT: fmov s0, s84032; CHECK-SD-NEXT: bl __fixsfti4033; CHECK-SD-NEXT: movi v9.2s, #255, lsl #244034; CHECK-SD-NEXT: mov w8, #2130706431 // =0x7effffff4035; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload4036; CHECK-SD-NEXT: fmov s10, w84037; CHECK-SD-NEXT: mov x22, #-9223372036854775808 // =0x80000000000000004038; CHECK-SD-NEXT: mov x23, #9223372036854775807 // =0x7fffffffffffffff4039; CHECK-SD-NEXT: mov h0, v0.h[1]4040; CHECK-SD-NEXT: fcmp s8, s94041; CHECK-SD-NEXT: csel x8, xzr, x0, lt4042; CHECK-SD-NEXT: csel x9, x22, x1, lt4043; CHECK-SD-NEXT: fcmp s8, s104044; CHECK-SD-NEXT: csel x9, x23, x9, gt4045; CHECK-SD-NEXT: csinv x8, x8, xzr, le4046; CHECK-SD-NEXT: fcmp s8, s84047; CHECK-SD-NEXT: fcvt s8, h04048; CHECK-SD-NEXT: csel x8, xzr, x8, vs4049; CHECK-SD-NEXT: str x8, [sp, #72] // 8-byte Spill4050; CHECK-SD-NEXT: csel x8, xzr, x9, vs4051; CHECK-SD-NEXT: fmov s0, s84052; CHECK-SD-NEXT: str x8, [sp, #24] // 8-byte Spill4053; CHECK-SD-NEXT: bl __fixsfti4054; CHECK-SD-NEXT: fcmp s8, s94055; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload4056; CHECK-SD-NEXT: mov h0, v0.h[2]4057; CHECK-SD-NEXT: csel x8, xzr, x0, lt4058; CHECK-SD-NEXT: csel x9, x22, x1, lt4059; CHECK-SD-NEXT: fcmp s8, s104060; CHECK-SD-NEXT: csel x9, x23, x9, gt4061; CHECK-SD-NEXT: csinv x8, x8, xzr, le4062; CHECK-SD-NEXT: fcmp s8, s84063; CHECK-SD-NEXT: fcvt s8, h04064; CHECK-SD-NEXT: csel x10, xzr, x8, vs4065; CHECK-SD-NEXT: csel x8, xzr, x9, vs4066; CHECK-SD-NEXT: stp x8, x10, [sp, #8] // 16-byte Folded Spill4067; CHECK-SD-NEXT: fmov s0, s84068; CHECK-SD-NEXT: bl __fixsfti4069; CHECK-SD-NEXT: fcmp s8, s94070; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload4071; CHECK-SD-NEXT: mov h0, v0.h[3]4072; CHECK-SD-NEXT: csel x8, xzr, x0, lt4073; CHECK-SD-NEXT: csel x9, x22, x1, lt4074; CHECK-SD-NEXT: fcmp s8, s104075; CHECK-SD-NEXT: csel x9, x23, x9, gt4076; CHECK-SD-NEXT: csinv x8, x8, xzr, le4077; CHECK-SD-NEXT: fcmp s8, s84078; CHECK-SD-NEXT: fcvt s8, h04079; CHECK-SD-NEXT: csel x8, xzr, x8, vs4080; CHECK-SD-NEXT: str x8, [sp, #32] // 8-byte Spill4081; CHECK-SD-NEXT: csel x8, xzr, x9, vs4082; CHECK-SD-NEXT: fmov s0, s84083; CHECK-SD-NEXT: str x8, [sp] // 8-byte Spill4084; CHECK-SD-NEXT: bl __fixsfti4085; CHECK-SD-NEXT: fcmp s8, s94086; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload4087; CHECK-SD-NEXT: csel x8, xzr, x0, lt4088; CHECK-SD-NEXT: csel x9, x22, x1, lt4089; CHECK-SD-NEXT: fcmp s8, s104090; CHECK-SD-NEXT: csel x9, x23, x9, gt4091; CHECK-SD-NEXT: csinv x8, x8, xzr, le4092; CHECK-SD-NEXT: fcmp s8, s84093; CHECK-SD-NEXT: fcvt s8, h04094; CHECK-SD-NEXT: csel x28, xzr, x8, vs4095; CHECK-SD-NEXT: csel x29, xzr, x9, vs4096; CHECK-SD-NEXT: fmov s0, s84097; CHECK-SD-NEXT: bl __fixsfti4098; CHECK-SD-NEXT: fcmp s8, s94099; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload4100; CHECK-SD-NEXT: mov h0, v0.h[1]4101; CHECK-SD-NEXT: csel x8, xzr, x0, lt4102; CHECK-SD-NEXT: csel x9, x22, x1, lt4103; CHECK-SD-NEXT: fcmp s8, s104104; CHECK-SD-NEXT: csel x9, x23, x9, gt4105; CHECK-SD-NEXT: csinv x8, x8, xzr, le4106; CHECK-SD-NEXT: fcmp s8, s84107; CHECK-SD-NEXT: fcvt s8, h04108; CHECK-SD-NEXT: csel x20, xzr, x8, vs4109; CHECK-SD-NEXT: csel x21, xzr, x9, vs4110; CHECK-SD-NEXT: fmov s0, s84111; CHECK-SD-NEXT: bl __fixsfti4112; CHECK-SD-NEXT: fcmp s8, s94113; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload4114; CHECK-SD-NEXT: mov h0, v0.h[2]4115; CHECK-SD-NEXT: csel x8, xzr, x0, lt4116; CHECK-SD-NEXT: csel x9, x22, x1, lt4117; CHECK-SD-NEXT: fcmp s8, s104118; CHECK-SD-NEXT: csel x9, x23, x9, gt4119; CHECK-SD-NEXT: csinv x8, x8, xzr, le4120; CHECK-SD-NEXT: fcmp s8, s84121; CHECK-SD-NEXT: fcvt s8, h04122; CHECK-SD-NEXT: csel x24, xzr, x8, vs4123; CHECK-SD-NEXT: csel x25, xzr, x9, vs4124; CHECK-SD-NEXT: fmov s0, s84125; CHECK-SD-NEXT: bl __fixsfti4126; CHECK-SD-NEXT: fcmp s8, s94127; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload4128; CHECK-SD-NEXT: mov h0, v0.h[3]4129; CHECK-SD-NEXT: csel x8, xzr, x0, lt4130; CHECK-SD-NEXT: csel x9, x22, x1, lt4131; CHECK-SD-NEXT: fcmp s8, s104132; CHECK-SD-NEXT: csel x9, x23, x9, gt4133; CHECK-SD-NEXT: csinv x8, x8, xzr, le4134; CHECK-SD-NEXT: fcmp s8, s84135; CHECK-SD-NEXT: fcvt s8, h04136; CHECK-SD-NEXT: csel x26, xzr, x8, vs4137; CHECK-SD-NEXT: csel x27, xzr, x9, vs4138; CHECK-SD-NEXT: fmov s0, s84139; CHECK-SD-NEXT: bl __fixsfti4140; CHECK-SD-NEXT: fcmp s8, s94141; CHECK-SD-NEXT: stp x26, x27, [x19, #32]4142; CHECK-SD-NEXT: stp x24, x25, [x19, #16]4143; CHECK-SD-NEXT: stp x20, x21, [x19]4144; CHECK-SD-NEXT: csel x8, xzr, x0, lt4145; CHECK-SD-NEXT: csel x9, x22, x1, lt4146; CHECK-SD-NEXT: fcmp s8, s104147; CHECK-SD-NEXT: stp x28, x29, [x19, #112]4148; CHECK-SD-NEXT: csel x9, x23, x9, gt4149; CHECK-SD-NEXT: csinv x8, x8, xzr, le4150; CHECK-SD-NEXT: fcmp s8, s84151; CHECK-SD-NEXT: csel x9, xzr, x9, vs4152; CHECK-SD-NEXT: csel x8, xzr, x8, vs4153; CHECK-SD-NEXT: stp x8, x9, [x19, #48]4154; CHECK-SD-NEXT: ldr x8, [sp] // 8-byte Reload4155; CHECK-SD-NEXT: str x8, [x19, #104]4156; CHECK-SD-NEXT: ldr x8, [sp, #32] // 8-byte Reload4157; CHECK-SD-NEXT: str x8, [x19, #96]4158; CHECK-SD-NEXT: ldr x8, [sp, #8] // 8-byte Reload4159; CHECK-SD-NEXT: str x8, [x19, #88]4160; CHECK-SD-NEXT: ldr x8, [sp, #16] // 8-byte Reload4161; CHECK-SD-NEXT: str x8, [x19, #80]4162; CHECK-SD-NEXT: ldr x8, [sp, #24] // 8-byte Reload4163; CHECK-SD-NEXT: str x8, [x19, #72]4164; CHECK-SD-NEXT: ldr x8, [sp, #72] // 8-byte Reload4165; CHECK-SD-NEXT: str x8, [x19, #64]4166; CHECK-SD-NEXT: ldp x20, x19, [sp, #176] // 16-byte Folded Reload4167; CHECK-SD-NEXT: ldr d10, [sp, #64] // 8-byte Reload4168; CHECK-SD-NEXT: ldp x22, x21, [sp, #160] // 16-byte Folded Reload4169; CHECK-SD-NEXT: ldp x24, x23, [sp, #144] // 16-byte Folded Reload4170; CHECK-SD-NEXT: ldp x26, x25, [sp, #128] // 16-byte Folded Reload4171; CHECK-SD-NEXT: ldp x28, x27, [sp, #112] // 16-byte Folded Reload4172; CHECK-SD-NEXT: ldp x29, x30, [sp, #96] // 16-byte Folded Reload4173; CHECK-SD-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload4174; CHECK-SD-NEXT: add sp, sp, #1924175; CHECK-SD-NEXT: ret4176;4177; CHECK-GI-CVT-LABEL: test_signed_v8f16_v8i128:4178; CHECK-GI-CVT: // %bb.0:4179; CHECK-GI-CVT-NEXT: mov h1, v0.h[1]4180; CHECK-GI-CVT-NEXT: mov h2, v0.h[2]4181; CHECK-GI-CVT-NEXT: mov h3, v0.h[3]4182; CHECK-GI-CVT-NEXT: mov h4, v0.h[4]4183; CHECK-GI-CVT-NEXT: fcvt s5, h04184; CHECK-GI-CVT-NEXT: mov h6, v0.h[5]4185; CHECK-GI-CVT-NEXT: mov h7, v0.h[6]4186; CHECK-GI-CVT-NEXT: mov h0, v0.h[7]4187; CHECK-GI-CVT-NEXT: fcvt s1, h14188; CHECK-GI-CVT-NEXT: fcvt s2, h24189; CHECK-GI-CVT-NEXT: fcvt s3, h34190; CHECK-GI-CVT-NEXT: fcvtzs x9, s54191; CHECK-GI-CVT-NEXT: fcvt s4, h44192; CHECK-GI-CVT-NEXT: fcvt s5, h64193; CHECK-GI-CVT-NEXT: fcvt s0, h04194; CHECK-GI-CVT-NEXT: fcvtzs x10, s14195; CHECK-GI-CVT-NEXT: fcvt s1, h74196; CHECK-GI-CVT-NEXT: fcvtzs x11, s24197; CHECK-GI-CVT-NEXT: fcvtzs x12, s34198; CHECK-GI-CVT-NEXT: mov v2.d[0], x94199; CHECK-GI-CVT-NEXT: fcvtzs x9, s44200; CHECK-GI-CVT-NEXT: mov v3.d[0], x104201; CHECK-GI-CVT-NEXT: fcvtzs x10, s54202; CHECK-GI-CVT-NEXT: mov v4.d[0], x114203; CHECK-GI-CVT-NEXT: fcvtzs x11, s14204; CHECK-GI-CVT-NEXT: mov v1.d[0], x124205; CHECK-GI-CVT-NEXT: fcvtzs x12, s04206; CHECK-GI-CVT-NEXT: mov v0.d[0], x94207; CHECK-GI-CVT-NEXT: mov v2.d[1], xzr4208; CHECK-GI-CVT-NEXT: mov v5.d[0], x104209; CHECK-GI-CVT-NEXT: mov v3.d[1], xzr4210; CHECK-GI-CVT-NEXT: mov v4.d[1], xzr4211; CHECK-GI-CVT-NEXT: mov v6.d[0], x114212; CHECK-GI-CVT-NEXT: mov v7.d[0], x124213; CHECK-GI-CVT-NEXT: mov v1.d[1], xzr4214; CHECK-GI-CVT-NEXT: mov v0.d[1], xzr4215; CHECK-GI-CVT-NEXT: mov v5.d[1], xzr4216; CHECK-GI-CVT-NEXT: stp q2, q3, [x8]4217; CHECK-GI-CVT-NEXT: mov v6.d[1], xzr4218; CHECK-GI-CVT-NEXT: mov v7.d[1], xzr4219; CHECK-GI-CVT-NEXT: stp q4, q1, [x8, #32]4220; CHECK-GI-CVT-NEXT: stp q0, q5, [x8, #64]4221; CHECK-GI-CVT-NEXT: stp q6, q7, [x8, #96]4222; CHECK-GI-CVT-NEXT: ret4223;4224; CHECK-GI-FP16-LABEL: test_signed_v8f16_v8i128:4225; CHECK-GI-FP16: // %bb.0:4226; CHECK-GI-FP16-NEXT: mov h1, v0.h[1]4227; CHECK-GI-FP16-NEXT: mov h2, v0.h[2]4228; CHECK-GI-FP16-NEXT: mov h3, v0.h[3]4229; CHECK-GI-FP16-NEXT: mov h4, v0.h[4]4230; CHECK-GI-FP16-NEXT: fcvtzs x9, h04231; CHECK-GI-FP16-NEXT: mov h5, v0.h[5]4232; CHECK-GI-FP16-NEXT: fcvtzs x10, h14233; CHECK-GI-FP16-NEXT: mov h1, v0.h[6]4234; CHECK-GI-FP16-NEXT: fcvtzs x11, h24235; CHECK-GI-FP16-NEXT: mov h0, v0.h[7]4236; CHECK-GI-FP16-NEXT: fcvtzs x12, h34237; CHECK-GI-FP16-NEXT: mov v2.d[0], x94238; CHECK-GI-FP16-NEXT: fcvtzs x9, h44239; CHECK-GI-FP16-NEXT: mov v3.d[0], x104240; CHECK-GI-FP16-NEXT: fcvtzs x10, h54241; CHECK-GI-FP16-NEXT: mov v4.d[0], x114242; CHECK-GI-FP16-NEXT: fcvtzs x11, h14243; CHECK-GI-FP16-NEXT: mov v1.d[0], x124244; CHECK-GI-FP16-NEXT: fcvtzs x12, h04245; CHECK-GI-FP16-NEXT: mov v0.d[0], x94246; CHECK-GI-FP16-NEXT: mov v2.d[1], xzr4247; CHECK-GI-FP16-NEXT: mov v5.d[0], x104248; CHECK-GI-FP16-NEXT: mov v3.d[1], xzr4249; CHECK-GI-FP16-NEXT: mov v4.d[1], xzr4250; CHECK-GI-FP16-NEXT: mov v6.d[0], x114251; CHECK-GI-FP16-NEXT: mov v7.d[0], x124252; CHECK-GI-FP16-NEXT: mov v1.d[1], xzr4253; CHECK-GI-FP16-NEXT: mov v0.d[1], xzr4254; CHECK-GI-FP16-NEXT: mov v5.d[1], xzr4255; CHECK-GI-FP16-NEXT: stp q2, q3, [x8]4256; CHECK-GI-FP16-NEXT: mov v6.d[1], xzr4257; CHECK-GI-FP16-NEXT: mov v7.d[1], xzr4258; CHECK-GI-FP16-NEXT: stp q4, q1, [x8, #32]4259; CHECK-GI-FP16-NEXT: stp q0, q5, [x8, #64]4260; CHECK-GI-FP16-NEXT: stp q6, q7, [x8, #96]4261; CHECK-GI-FP16-NEXT: ret4262 %x = call <8 x i128> @llvm.fptosi.sat.v8f16.v8i128(<8 x half> %f)4263 ret <8 x i128> %x4264}4265 4266 4267declare <8 x i8> @llvm.fptosi.sat.v8f32.v8i8(<8 x float> %f)4268declare <8 x i16> @llvm.fptosi.sat.v8f32.v8i16(<8 x float> %f)4269declare <16 x i8> @llvm.fptosi.sat.v16f32.v16i8(<16 x float> %f)4270declare <16 x i16> @llvm.fptosi.sat.v16f32.v16i16(<16 x float> %f)4271 4272declare <16 x i8> @llvm.fptosi.sat.v16f16.v16i8(<16 x half> %f)4273declare <16 x i16> @llvm.fptosi.sat.v16f16.v16i16(<16 x half> %f)4274 4275declare <8 x i8> @llvm.fptosi.sat.v8f64.v8i8(<8 x double> %f)4276declare <8 x i16> @llvm.fptosi.sat.v8f64.v8i16(<8 x double> %f)4277declare <16 x i8> @llvm.fptosi.sat.v16f64.v16i8(<16 x double> %f)4278declare <16 x i16> @llvm.fptosi.sat.v16f64.v16i16(<16 x double> %f)4279 4280define <8 x i8> @test_signed_v8f32_v8i8(<8 x float> %f) {4281; CHECK-SD-LABEL: test_signed_v8f32_v8i8:4282; CHECK-SD: // %bb.0:4283; CHECK-SD-NEXT: movi v2.4s, #1274284; CHECK-SD-NEXT: fcvtzs v1.4s, v1.4s4285; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s4286; CHECK-SD-NEXT: smin v1.4s, v1.4s, v2.4s4287; CHECK-SD-NEXT: smin v0.4s, v0.4s, v2.4s4288; CHECK-SD-NEXT: mvni v2.4s, #1274289; CHECK-SD-NEXT: smax v1.4s, v1.4s, v2.4s4290; CHECK-SD-NEXT: smax v0.4s, v0.4s, v2.4s4291; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h4292; CHECK-SD-NEXT: xtn v0.8b, v0.8h4293; CHECK-SD-NEXT: ret4294;4295; CHECK-GI-LABEL: test_signed_v8f32_v8i8:4296; CHECK-GI: // %bb.0:4297; CHECK-GI-NEXT: movi v2.4s, #1274298; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s4299; CHECK-GI-NEXT: fcvtzs v1.4s, v1.4s4300; CHECK-GI-NEXT: smin v0.4s, v0.4s, v2.4s4301; CHECK-GI-NEXT: smin v1.4s, v1.4s, v2.4s4302; CHECK-GI-NEXT: mvni v2.4s, #1274303; CHECK-GI-NEXT: smax v0.4s, v0.4s, v2.4s4304; CHECK-GI-NEXT: smax v1.4s, v1.4s, v2.4s4305; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h4306; CHECK-GI-NEXT: xtn v0.8b, v0.8h4307; CHECK-GI-NEXT: ret4308 %x = call <8 x i8> @llvm.fptosi.sat.v8f32.v8i8(<8 x float> %f)4309 ret <8 x i8> %x4310}4311 4312define <16 x i8> @test_signed_v16f32_v16i8(<16 x float> %f) {4313; CHECK-SD-LABEL: test_signed_v16f32_v16i8:4314; CHECK-SD: // %bb.0:4315; CHECK-SD-NEXT: movi v4.4s, #1274316; CHECK-SD-NEXT: fcvtzs v3.4s, v3.4s4317; CHECK-SD-NEXT: fcvtzs v2.4s, v2.4s4318; CHECK-SD-NEXT: fcvtzs v1.4s, v1.4s4319; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s4320; CHECK-SD-NEXT: mvni v5.4s, #1274321; CHECK-SD-NEXT: smin v3.4s, v3.4s, v4.4s4322; CHECK-SD-NEXT: smin v2.4s, v2.4s, v4.4s4323; CHECK-SD-NEXT: smin v1.4s, v1.4s, v4.4s4324; CHECK-SD-NEXT: smin v0.4s, v0.4s, v4.4s4325; CHECK-SD-NEXT: smax v3.4s, v3.4s, v5.4s4326; CHECK-SD-NEXT: smax v2.4s, v2.4s, v5.4s4327; CHECK-SD-NEXT: smax v1.4s, v1.4s, v5.4s4328; CHECK-SD-NEXT: smax v0.4s, v0.4s, v5.4s4329; CHECK-SD-NEXT: uzp1 v2.8h, v2.8h, v3.8h4330; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h4331; CHECK-SD-NEXT: uzp1 v0.16b, v0.16b, v2.16b4332; CHECK-SD-NEXT: ret4333;4334; CHECK-GI-LABEL: test_signed_v16f32_v16i8:4335; CHECK-GI: // %bb.0:4336; CHECK-GI-NEXT: movi v4.4s, #1274337; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s4338; CHECK-GI-NEXT: fcvtzs v1.4s, v1.4s4339; CHECK-GI-NEXT: fcvtzs v2.4s, v2.4s4340; CHECK-GI-NEXT: fcvtzs v3.4s, v3.4s4341; CHECK-GI-NEXT: mvni v5.4s, #1274342; CHECK-GI-NEXT: smin v0.4s, v0.4s, v4.4s4343; CHECK-GI-NEXT: smin v1.4s, v1.4s, v4.4s4344; CHECK-GI-NEXT: smin v2.4s, v2.4s, v4.4s4345; CHECK-GI-NEXT: smin v3.4s, v3.4s, v4.4s4346; CHECK-GI-NEXT: smax v0.4s, v0.4s, v5.4s4347; CHECK-GI-NEXT: smax v1.4s, v1.4s, v5.4s4348; CHECK-GI-NEXT: smax v2.4s, v2.4s, v5.4s4349; CHECK-GI-NEXT: smax v3.4s, v3.4s, v5.4s4350; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h4351; CHECK-GI-NEXT: uzp1 v1.8h, v2.8h, v3.8h4352; CHECK-GI-NEXT: uzp1 v0.16b, v0.16b, v1.16b4353; CHECK-GI-NEXT: ret4354 %x = call <16 x i8> @llvm.fptosi.sat.v16f32.v16i8(<16 x float> %f)4355 ret <16 x i8> %x4356}4357 4358define <8 x i16> @test_signed_v8f32_v8i16(<8 x float> %f) {4359; CHECK-LABEL: test_signed_v8f32_v8i16:4360; CHECK: // %bb.0:4361; CHECK-NEXT: fcvtzs v0.4s, v0.4s4362; CHECK-NEXT: fcvtzs v1.4s, v1.4s4363; CHECK-NEXT: sqxtn v0.4h, v0.4s4364; CHECK-NEXT: sqxtn2 v0.8h, v1.4s4365; CHECK-NEXT: ret4366 %x = call <8 x i16> @llvm.fptosi.sat.v8f32.v8i16(<8 x float> %f)4367 ret <8 x i16> %x4368}4369 4370define <16 x i16> @test_signed_v16f32_v16i16(<16 x float> %f) {4371; CHECK-SD-LABEL: test_signed_v16f32_v16i16:4372; CHECK-SD: // %bb.0:4373; CHECK-SD-NEXT: fcvtzs v0.4s, v0.4s4374; CHECK-SD-NEXT: fcvtzs v2.4s, v2.4s4375; CHECK-SD-NEXT: fcvtzs v4.4s, v1.4s4376; CHECK-SD-NEXT: sqxtn v0.4h, v0.4s4377; CHECK-SD-NEXT: sqxtn v1.4h, v2.4s4378; CHECK-SD-NEXT: fcvtzs v2.4s, v3.4s4379; CHECK-SD-NEXT: sqxtn2 v0.8h, v4.4s4380; CHECK-SD-NEXT: sqxtn2 v1.8h, v2.4s4381; CHECK-SD-NEXT: ret4382;4383; CHECK-GI-LABEL: test_signed_v16f32_v16i16:4384; CHECK-GI: // %bb.0:4385; CHECK-GI-NEXT: fcvtzs v0.4s, v0.4s4386; CHECK-GI-NEXT: fcvtzs v2.4s, v2.4s4387; CHECK-GI-NEXT: fcvtzs v4.4s, v1.4s4388; CHECK-GI-NEXT: fcvtzs v3.4s, v3.4s4389; CHECK-GI-NEXT: sqxtn v0.4h, v0.4s4390; CHECK-GI-NEXT: sqxtn v1.4h, v2.4s4391; CHECK-GI-NEXT: sqxtn2 v0.8h, v4.4s4392; CHECK-GI-NEXT: sqxtn2 v1.8h, v3.4s4393; CHECK-GI-NEXT: ret4394 %x = call <16 x i16> @llvm.fptosi.sat.v16f32.v16i16(<16 x float> %f)4395 ret <16 x i16> %x4396}4397 4398 4399 4400define <16 x i8> @test_signed_v16f16_v16i8(<16 x half> %f) {4401; CHECK-SD-CVT-LABEL: test_signed_v16f16_v16i8:4402; CHECK-SD-CVT: // %bb.0:4403; CHECK-SD-CVT-NEXT: fcvtl2 v3.4s, v1.8h4404; CHECK-SD-CVT-NEXT: fcvtl v1.4s, v1.4h4405; CHECK-SD-CVT-NEXT: fcvtl2 v4.4s, v0.8h4406; CHECK-SD-CVT-NEXT: fcvtl v0.4s, v0.4h4407; CHECK-SD-CVT-NEXT: movi v2.4s, #1274408; CHECK-SD-CVT-NEXT: fcvtzs v3.4s, v3.4s4409; CHECK-SD-CVT-NEXT: fcvtzs v1.4s, v1.4s4410; CHECK-SD-CVT-NEXT: fcvtzs v4.4s, v4.4s4411; CHECK-SD-CVT-NEXT: fcvtzs v0.4s, v0.4s4412; CHECK-SD-CVT-NEXT: smin v3.4s, v3.4s, v2.4s4413; CHECK-SD-CVT-NEXT: smin v1.4s, v1.4s, v2.4s4414; CHECK-SD-CVT-NEXT: smin v4.4s, v4.4s, v2.4s4415; CHECK-SD-CVT-NEXT: smin v0.4s, v0.4s, v2.4s4416; CHECK-SD-CVT-NEXT: mvni v2.4s, #1274417; CHECK-SD-CVT-NEXT: smax v3.4s, v3.4s, v2.4s4418; CHECK-SD-CVT-NEXT: smax v1.4s, v1.4s, v2.4s4419; CHECK-SD-CVT-NEXT: smax v4.4s, v4.4s, v2.4s4420; CHECK-SD-CVT-NEXT: smax v0.4s, v0.4s, v2.4s4421; CHECK-SD-CVT-NEXT: uzp1 v1.8h, v1.8h, v3.8h4422; CHECK-SD-CVT-NEXT: uzp1 v0.8h, v0.8h, v4.8h4423; CHECK-SD-CVT-NEXT: uzp1 v0.16b, v0.16b, v1.16b4424; CHECK-SD-CVT-NEXT: ret4425;4426; CHECK-FP16-LABEL: test_signed_v16f16_v16i8:4427; CHECK-FP16: // %bb.0:4428; CHECK-FP16-NEXT: fcvtzs v0.8h, v0.8h4429; CHECK-FP16-NEXT: fcvtzs v1.8h, v1.8h4430; CHECK-FP16-NEXT: sqxtn v0.8b, v0.8h4431; CHECK-FP16-NEXT: sqxtn2 v0.16b, v1.8h4432; CHECK-FP16-NEXT: ret4433;4434; CHECK-GI-CVT-LABEL: test_signed_v16f16_v16i8:4435; CHECK-GI-CVT: // %bb.0:4436; CHECK-GI-CVT-NEXT: fcvtl v3.4s, v0.4h4437; CHECK-GI-CVT-NEXT: fcvtl2 v0.4s, v0.8h4438; CHECK-GI-CVT-NEXT: fcvtl v4.4s, v1.4h4439; CHECK-GI-CVT-NEXT: fcvtl2 v1.4s, v1.8h4440; CHECK-GI-CVT-NEXT: movi v2.4s, #1274441; CHECK-GI-CVT-NEXT: mvni v5.4s, #1274442; CHECK-GI-CVT-NEXT: fcvtzs v3.4s, v3.4s4443; CHECK-GI-CVT-NEXT: fcvtzs v0.4s, v0.4s4444; CHECK-GI-CVT-NEXT: fcvtzs v4.4s, v4.4s4445; CHECK-GI-CVT-NEXT: fcvtzs v1.4s, v1.4s4446; CHECK-GI-CVT-NEXT: smin v3.4s, v3.4s, v2.4s4447; CHECK-GI-CVT-NEXT: smin v0.4s, v0.4s, v2.4s4448; CHECK-GI-CVT-NEXT: smin v4.4s, v4.4s, v2.4s4449; CHECK-GI-CVT-NEXT: smin v1.4s, v1.4s, v2.4s4450; CHECK-GI-CVT-NEXT: smax v2.4s, v3.4s, v5.4s4451; CHECK-GI-CVT-NEXT: smax v0.4s, v0.4s, v5.4s4452; CHECK-GI-CVT-NEXT: smax v3.4s, v4.4s, v5.4s4453; CHECK-GI-CVT-NEXT: smax v1.4s, v1.4s, v5.4s4454; CHECK-GI-CVT-NEXT: uzp1 v0.8h, v2.8h, v0.8h4455; CHECK-GI-CVT-NEXT: uzp1 v1.8h, v3.8h, v1.8h4456; CHECK-GI-CVT-NEXT: uzp1 v0.16b, v0.16b, v1.16b4457; CHECK-GI-CVT-NEXT: ret4458 %x = call <16 x i8> @llvm.fptosi.sat.v16f16.v16i8(<16 x half> %f)4459 ret <16 x i8> %x4460}4461 4462define <16 x i16> @test_signed_v16f16_v16i16(<16 x half> %f) {4463; CHECK-SD-CVT-LABEL: test_signed_v16f16_v16i16:4464; CHECK-SD-CVT: // %bb.0:4465; CHECK-SD-CVT-NEXT: fcvtl v2.4s, v0.4h4466; CHECK-SD-CVT-NEXT: fcvtl v3.4s, v1.4h4467; CHECK-SD-CVT-NEXT: fcvtl2 v4.4s, v0.8h4468; CHECK-SD-CVT-NEXT: fcvtl2 v5.4s, v1.8h4469; CHECK-SD-CVT-NEXT: fcvtzs v2.4s, v2.4s4470; CHECK-SD-CVT-NEXT: fcvtzs v1.4s, v3.4s4471; CHECK-SD-CVT-NEXT: fcvtzs v3.4s, v5.4s4472; CHECK-SD-CVT-NEXT: sqxtn v0.4h, v2.4s4473; CHECK-SD-CVT-NEXT: fcvtzs v2.4s, v4.4s4474; CHECK-SD-CVT-NEXT: sqxtn v1.4h, v1.4s4475; CHECK-SD-CVT-NEXT: sqxtn2 v0.8h, v2.4s4476; CHECK-SD-CVT-NEXT: sqxtn2 v1.8h, v3.4s4477; CHECK-SD-CVT-NEXT: ret4478;4479; CHECK-FP16-LABEL: test_signed_v16f16_v16i16:4480; CHECK-FP16: // %bb.0:4481; CHECK-FP16-NEXT: fcvtzs v0.8h, v0.8h4482; CHECK-FP16-NEXT: fcvtzs v1.8h, v1.8h4483; CHECK-FP16-NEXT: ret4484;4485; CHECK-GI-CVT-LABEL: test_signed_v16f16_v16i16:4486; CHECK-GI-CVT: // %bb.0:4487; CHECK-GI-CVT-NEXT: fcvtl v2.4s, v0.4h4488; CHECK-GI-CVT-NEXT: fcvtl v3.4s, v1.4h4489; CHECK-GI-CVT-NEXT: fcvtl2 v0.4s, v0.8h4490; CHECK-GI-CVT-NEXT: fcvtl2 v1.4s, v1.8h4491; CHECK-GI-CVT-NEXT: fcvtzs v2.4s, v2.4s4492; CHECK-GI-CVT-NEXT: fcvtzs v3.4s, v3.4s4493; CHECK-GI-CVT-NEXT: fcvtzs v4.4s, v0.4s4494; CHECK-GI-CVT-NEXT: fcvtzs v5.4s, v1.4s4495; CHECK-GI-CVT-NEXT: sqxtn v0.4h, v2.4s4496; CHECK-GI-CVT-NEXT: sqxtn v1.4h, v3.4s4497; CHECK-GI-CVT-NEXT: sqxtn2 v0.8h, v4.4s4498; CHECK-GI-CVT-NEXT: sqxtn2 v1.8h, v5.4s4499; CHECK-GI-CVT-NEXT: ret4500 %x = call <16 x i16> @llvm.fptosi.sat.v16f16.v16i16(<16 x half> %f)4501 ret <16 x i16> %x4502}4503 4504define <8 x i8> @test_signed_v8f64_v8i8(<8 x double> %f) {4505; CHECK-SD-LABEL: test_signed_v8f64_v8i8:4506; CHECK-SD: // %bb.0:4507; CHECK-SD-NEXT: mov d4, v0.d[1]4508; CHECK-SD-NEXT: fcvtzs w10, d04509; CHECK-SD-NEXT: mov w8, #127 // =0x7f4510; CHECK-SD-NEXT: fcvtzs w12, d14511; CHECK-SD-NEXT: mov d1, v1.d[1]4512; CHECK-SD-NEXT: fcvtzs w9, d44513; CHECK-SD-NEXT: cmp w9, #1274514; CHECK-SD-NEXT: csel w11, w9, w8, lt4515; CHECK-SD-NEXT: mov w9, #-128 // =0xffffff804516; CHECK-SD-NEXT: cmn w11, #1284517; CHECK-SD-NEXT: csel w11, w11, w9, gt4518; CHECK-SD-NEXT: cmp w10, #1274519; CHECK-SD-NEXT: csel w10, w10, w8, lt4520; CHECK-SD-NEXT: cmn w10, #1284521; CHECK-SD-NEXT: csel w10, w10, w9, gt4522; CHECK-SD-NEXT: cmp w12, #1274523; CHECK-SD-NEXT: fmov s0, w104524; CHECK-SD-NEXT: fcvtzs w10, d14525; CHECK-SD-NEXT: mov d1, v2.d[1]4526; CHECK-SD-NEXT: mov v0.b[1], w114527; CHECK-SD-NEXT: csel w11, w12, w8, lt4528; CHECK-SD-NEXT: cmn w11, #1284529; CHECK-SD-NEXT: csel w11, w11, w9, gt4530; CHECK-SD-NEXT: cmp w10, #1274531; CHECK-SD-NEXT: csel w10, w10, w8, lt4532; CHECK-SD-NEXT: mov v0.b[2], w114533; CHECK-SD-NEXT: fcvtzs w11, d24534; CHECK-SD-NEXT: cmn w10, #1284535; CHECK-SD-NEXT: csel w10, w10, w9, gt4536; CHECK-SD-NEXT: cmp w11, #1274537; CHECK-SD-NEXT: mov v0.b[3], w104538; CHECK-SD-NEXT: fcvtzs w10, d14539; CHECK-SD-NEXT: csel w11, w11, w8, lt4540; CHECK-SD-NEXT: mov d1, v3.d[1]4541; CHECK-SD-NEXT: cmn w11, #1284542; CHECK-SD-NEXT: csel w11, w11, w9, gt4543; CHECK-SD-NEXT: mov v0.b[4], w114544; CHECK-SD-NEXT: cmp w10, #1274545; CHECK-SD-NEXT: fcvtzs w11, d34546; CHECK-SD-NEXT: csel w10, w10, w8, lt4547; CHECK-SD-NEXT: cmn w10, #1284548; CHECK-SD-NEXT: csel w10, w10, w9, gt4549; CHECK-SD-NEXT: mov v0.b[5], w104550; CHECK-SD-NEXT: cmp w11, #1274551; CHECK-SD-NEXT: fcvtzs w10, d14552; CHECK-SD-NEXT: csel w11, w11, w8, lt4553; CHECK-SD-NEXT: cmn w11, #1284554; CHECK-SD-NEXT: csel w11, w11, w9, gt4555; CHECK-SD-NEXT: mov v0.b[6], w114556; CHECK-SD-NEXT: cmp w10, #1274557; CHECK-SD-NEXT: csel w8, w10, w8, lt4558; CHECK-SD-NEXT: cmn w8, #1284559; CHECK-SD-NEXT: csel w8, w8, w9, gt4560; CHECK-SD-NEXT: mov v0.b[7], w84561; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q04562; CHECK-SD-NEXT: ret4563;4564; CHECK-GI-LABEL: test_signed_v8f64_v8i8:4565; CHECK-GI: // %bb.0:4566; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d4567; CHECK-GI-NEXT: fcvtzs v1.2d, v1.2d4568; CHECK-GI-NEXT: adrp x8, .LCPI82_14569; CHECK-GI-NEXT: fcvtzs v2.2d, v2.2d4570; CHECK-GI-NEXT: fcvtzs v3.2d, v3.2d4571; CHECK-GI-NEXT: ldr q4, [x8, :lo12:.LCPI82_1]4572; CHECK-GI-NEXT: adrp x8, .LCPI82_04573; CHECK-GI-NEXT: cmgt v5.2d, v4.2d, v0.2d4574; CHECK-GI-NEXT: cmgt v6.2d, v4.2d, v1.2d4575; CHECK-GI-NEXT: cmgt v7.2d, v4.2d, v2.2d4576; CHECK-GI-NEXT: cmgt v16.2d, v4.2d, v3.2d4577; CHECK-GI-NEXT: bif v0.16b, v4.16b, v5.16b4578; CHECK-GI-NEXT: bif v1.16b, v4.16b, v6.16b4579; CHECK-GI-NEXT: bif v2.16b, v4.16b, v7.16b4580; CHECK-GI-NEXT: bif v3.16b, v4.16b, v16.16b4581; CHECK-GI-NEXT: ldr q4, [x8, :lo12:.LCPI82_0]4582; CHECK-GI-NEXT: cmgt v5.2d, v0.2d, v4.2d4583; CHECK-GI-NEXT: cmgt v6.2d, v1.2d, v4.2d4584; CHECK-GI-NEXT: cmgt v7.2d, v2.2d, v4.2d4585; CHECK-GI-NEXT: cmgt v16.2d, v3.2d, v4.2d4586; CHECK-GI-NEXT: bif v0.16b, v4.16b, v5.16b4587; CHECK-GI-NEXT: bif v1.16b, v4.16b, v6.16b4588; CHECK-GI-NEXT: bif v2.16b, v4.16b, v7.16b4589; CHECK-GI-NEXT: bif v3.16b, v4.16b, v16.16b4590; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s4591; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s4592; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h4593; CHECK-GI-NEXT: xtn v0.8b, v0.8h4594; CHECK-GI-NEXT: ret4595 %x = call <8 x i8> @llvm.fptosi.sat.v8f64.v8i8(<8 x double> %f)4596 ret <8 x i8> %x4597}4598 4599define <16 x i8> @test_signed_v16f64_v16i8(<16 x double> %f) {4600; CHECK-SD-LABEL: test_signed_v16f64_v16i8:4601; CHECK-SD: // %bb.0:4602; CHECK-SD-NEXT: mov d16, v0.d[1]4603; CHECK-SD-NEXT: fcvtzs w10, d04604; CHECK-SD-NEXT: mov w8, #127 // =0x7f4605; CHECK-SD-NEXT: fcvtzs w12, d14606; CHECK-SD-NEXT: mov d1, v1.d[1]4607; CHECK-SD-NEXT: fcvtzs w9, d164608; CHECK-SD-NEXT: cmp w9, #1274609; CHECK-SD-NEXT: csel w11, w9, w8, lt4610; CHECK-SD-NEXT: mov w9, #-128 // =0xffffff804611; CHECK-SD-NEXT: cmn w11, #1284612; CHECK-SD-NEXT: csel w11, w11, w9, gt4613; CHECK-SD-NEXT: cmp w10, #1274614; CHECK-SD-NEXT: csel w10, w10, w8, lt4615; CHECK-SD-NEXT: cmn w10, #1284616; CHECK-SD-NEXT: csel w10, w10, w9, gt4617; CHECK-SD-NEXT: cmp w12, #1274618; CHECK-SD-NEXT: fmov s0, w104619; CHECK-SD-NEXT: fcvtzs w10, d14620; CHECK-SD-NEXT: mov d1, v2.d[1]4621; CHECK-SD-NEXT: mov v0.b[1], w114622; CHECK-SD-NEXT: csel w11, w12, w8, lt4623; CHECK-SD-NEXT: cmn w11, #1284624; CHECK-SD-NEXT: csel w11, w11, w9, gt4625; CHECK-SD-NEXT: cmp w10, #1274626; CHECK-SD-NEXT: csel w10, w10, w8, lt4627; CHECK-SD-NEXT: mov v0.b[2], w114628; CHECK-SD-NEXT: fcvtzs w11, d24629; CHECK-SD-NEXT: cmn w10, #1284630; CHECK-SD-NEXT: csel w10, w10, w9, gt4631; CHECK-SD-NEXT: cmp w11, #1274632; CHECK-SD-NEXT: mov v0.b[3], w104633; CHECK-SD-NEXT: fcvtzs w10, d14634; CHECK-SD-NEXT: csel w11, w11, w8, lt4635; CHECK-SD-NEXT: mov d1, v3.d[1]4636; CHECK-SD-NEXT: cmn w11, #1284637; CHECK-SD-NEXT: csel w11, w11, w9, gt4638; CHECK-SD-NEXT: mov v0.b[4], w114639; CHECK-SD-NEXT: fcvtzs w11, d34640; CHECK-SD-NEXT: cmp w10, #1274641; CHECK-SD-NEXT: csel w10, w10, w8, lt4642; CHECK-SD-NEXT: cmn w10, #1284643; CHECK-SD-NEXT: csel w10, w10, w9, gt4644; CHECK-SD-NEXT: mov v0.b[5], w104645; CHECK-SD-NEXT: fcvtzs w10, d14646; CHECK-SD-NEXT: cmp w11, #1274647; CHECK-SD-NEXT: csel w11, w11, w8, lt4648; CHECK-SD-NEXT: mov d1, v4.d[1]4649; CHECK-SD-NEXT: cmn w11, #1284650; CHECK-SD-NEXT: csel w11, w11, w9, gt4651; CHECK-SD-NEXT: mov v0.b[6], w114652; CHECK-SD-NEXT: fcvtzs w11, d44653; CHECK-SD-NEXT: cmp w10, #1274654; CHECK-SD-NEXT: csel w10, w10, w8, lt4655; CHECK-SD-NEXT: cmn w10, #1284656; CHECK-SD-NEXT: csel w10, w10, w9, gt4657; CHECK-SD-NEXT: cmp w11, #1274658; CHECK-SD-NEXT: mov v0.b[7], w104659; CHECK-SD-NEXT: fcvtzs w10, d14660; CHECK-SD-NEXT: csel w11, w11, w8, lt4661; CHECK-SD-NEXT: mov d1, v5.d[1]4662; CHECK-SD-NEXT: cmn w11, #1284663; CHECK-SD-NEXT: csel w11, w11, w9, gt4664; CHECK-SD-NEXT: mov v0.b[8], w114665; CHECK-SD-NEXT: fcvtzs w11, d54666; CHECK-SD-NEXT: cmp w10, #1274667; CHECK-SD-NEXT: csel w10, w10, w8, lt4668; CHECK-SD-NEXT: cmn w10, #1284669; CHECK-SD-NEXT: csel w10, w10, w9, gt4670; CHECK-SD-NEXT: mov v0.b[9], w104671; CHECK-SD-NEXT: fcvtzs w10, d14672; CHECK-SD-NEXT: cmp w11, #1274673; CHECK-SD-NEXT: csel w11, w11, w8, lt4674; CHECK-SD-NEXT: mov d1, v6.d[1]4675; CHECK-SD-NEXT: cmn w11, #1284676; CHECK-SD-NEXT: csel w11, w11, w9, gt4677; CHECK-SD-NEXT: mov v0.b[10], w114678; CHECK-SD-NEXT: fcvtzs w11, d64679; CHECK-SD-NEXT: cmp w10, #1274680; CHECK-SD-NEXT: csel w10, w10, w8, lt4681; CHECK-SD-NEXT: cmn w10, #1284682; CHECK-SD-NEXT: csel w10, w10, w9, gt4683; CHECK-SD-NEXT: cmp w11, #1274684; CHECK-SD-NEXT: mov v0.b[11], w104685; CHECK-SD-NEXT: fcvtzs w10, d14686; CHECK-SD-NEXT: csel w11, w11, w8, lt4687; CHECK-SD-NEXT: mov d1, v7.d[1]4688; CHECK-SD-NEXT: cmn w11, #1284689; CHECK-SD-NEXT: csel w11, w11, w9, gt4690; CHECK-SD-NEXT: mov v0.b[12], w114691; CHECK-SD-NEXT: cmp w10, #1274692; CHECK-SD-NEXT: fcvtzs w11, d74693; CHECK-SD-NEXT: csel w10, w10, w8, lt4694; CHECK-SD-NEXT: cmn w10, #1284695; CHECK-SD-NEXT: csel w10, w10, w9, gt4696; CHECK-SD-NEXT: mov v0.b[13], w104697; CHECK-SD-NEXT: cmp w11, #1274698; CHECK-SD-NEXT: fcvtzs w10, d14699; CHECK-SD-NEXT: csel w11, w11, w8, lt4700; CHECK-SD-NEXT: cmn w11, #1284701; CHECK-SD-NEXT: csel w11, w11, w9, gt4702; CHECK-SD-NEXT: mov v0.b[14], w114703; CHECK-SD-NEXT: cmp w10, #1274704; CHECK-SD-NEXT: csel w8, w10, w8, lt4705; CHECK-SD-NEXT: cmn w8, #1284706; CHECK-SD-NEXT: csel w8, w8, w9, gt4707; CHECK-SD-NEXT: mov v0.b[15], w84708; CHECK-SD-NEXT: ret4709;4710; CHECK-GI-LABEL: test_signed_v16f64_v16i8:4711; CHECK-GI: // %bb.0:4712; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d4713; CHECK-GI-NEXT: fcvtzs v1.2d, v1.2d4714; CHECK-GI-NEXT: adrp x8, .LCPI83_14715; CHECK-GI-NEXT: fcvtzs v2.2d, v2.2d4716; CHECK-GI-NEXT: fcvtzs v3.2d, v3.2d4717; CHECK-GI-NEXT: ldr q16, [x8, :lo12:.LCPI83_1]4718; CHECK-GI-NEXT: fcvtzs v4.2d, v4.2d4719; CHECK-GI-NEXT: fcvtzs v5.2d, v5.2d4720; CHECK-GI-NEXT: adrp x8, .LCPI83_04721; CHECK-GI-NEXT: fcvtzs v6.2d, v6.2d4722; CHECK-GI-NEXT: fcvtzs v7.2d, v7.2d4723; CHECK-GI-NEXT: ldr q25, [x8, :lo12:.LCPI83_0]4724; CHECK-GI-NEXT: cmgt v17.2d, v16.2d, v0.2d4725; CHECK-GI-NEXT: cmgt v18.2d, v16.2d, v1.2d4726; CHECK-GI-NEXT: cmgt v19.2d, v16.2d, v2.2d4727; CHECK-GI-NEXT: cmgt v20.2d, v16.2d, v3.2d4728; CHECK-GI-NEXT: cmgt v21.2d, v16.2d, v4.2d4729; CHECK-GI-NEXT: cmgt v22.2d, v16.2d, v5.2d4730; CHECK-GI-NEXT: cmgt v23.2d, v16.2d, v6.2d4731; CHECK-GI-NEXT: cmgt v24.2d, v16.2d, v7.2d4732; CHECK-GI-NEXT: bif v0.16b, v16.16b, v17.16b4733; CHECK-GI-NEXT: bif v1.16b, v16.16b, v18.16b4734; CHECK-GI-NEXT: bif v2.16b, v16.16b, v19.16b4735; CHECK-GI-NEXT: bif v3.16b, v16.16b, v20.16b4736; CHECK-GI-NEXT: bif v4.16b, v16.16b, v21.16b4737; CHECK-GI-NEXT: bif v5.16b, v16.16b, v22.16b4738; CHECK-GI-NEXT: bif v6.16b, v16.16b, v23.16b4739; CHECK-GI-NEXT: bif v7.16b, v16.16b, v24.16b4740; CHECK-GI-NEXT: cmgt v16.2d, v0.2d, v25.2d4741; CHECK-GI-NEXT: cmgt v17.2d, v1.2d, v25.2d4742; CHECK-GI-NEXT: cmgt v18.2d, v2.2d, v25.2d4743; CHECK-GI-NEXT: cmgt v19.2d, v3.2d, v25.2d4744; CHECK-GI-NEXT: cmgt v20.2d, v4.2d, v25.2d4745; CHECK-GI-NEXT: cmgt v21.2d, v5.2d, v25.2d4746; CHECK-GI-NEXT: cmgt v22.2d, v6.2d, v25.2d4747; CHECK-GI-NEXT: cmgt v23.2d, v7.2d, v25.2d4748; CHECK-GI-NEXT: bif v0.16b, v25.16b, v16.16b4749; CHECK-GI-NEXT: bif v1.16b, v25.16b, v17.16b4750; CHECK-GI-NEXT: bif v2.16b, v25.16b, v18.16b4751; CHECK-GI-NEXT: bif v3.16b, v25.16b, v19.16b4752; CHECK-GI-NEXT: bif v4.16b, v25.16b, v20.16b4753; CHECK-GI-NEXT: bif v5.16b, v25.16b, v21.16b4754; CHECK-GI-NEXT: bif v6.16b, v25.16b, v22.16b4755; CHECK-GI-NEXT: bif v7.16b, v25.16b, v23.16b4756; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s4757; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s4758; CHECK-GI-NEXT: uzp1 v2.4s, v4.4s, v5.4s4759; CHECK-GI-NEXT: uzp1 v3.4s, v6.4s, v7.4s4760; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h4761; CHECK-GI-NEXT: uzp1 v1.8h, v2.8h, v3.8h4762; CHECK-GI-NEXT: uzp1 v0.16b, v0.16b, v1.16b4763; CHECK-GI-NEXT: ret4764 %x = call <16 x i8> @llvm.fptosi.sat.v16f64.v16i8(<16 x double> %f)4765 ret <16 x i8> %x4766}4767 4768define <8 x i16> @test_signed_v8f64_v8i16(<8 x double> %f) {4769; CHECK-SD-LABEL: test_signed_v8f64_v8i16:4770; CHECK-SD: // %bb.0:4771; CHECK-SD-NEXT: mov d4, v0.d[1]4772; CHECK-SD-NEXT: mov w8, #32767 // =0x7fff4773; CHECK-SD-NEXT: fcvtzs w10, d04774; CHECK-SD-NEXT: fcvtzs w12, d14775; CHECK-SD-NEXT: mov d1, v1.d[1]4776; CHECK-SD-NEXT: fcvtzs w9, d44777; CHECK-SD-NEXT: cmp w9, w84778; CHECK-SD-NEXT: csel w11, w9, w8, lt4779; CHECK-SD-NEXT: mov w9, #-32768 // =0xffff80004780; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684781; CHECK-SD-NEXT: csel w11, w11, w9, gt4782; CHECK-SD-NEXT: cmp w10, w84783; CHECK-SD-NEXT: csel w10, w10, w8, lt4784; CHECK-SD-NEXT: cmn w10, #8, lsl #12 // =327684785; CHECK-SD-NEXT: csel w10, w10, w9, gt4786; CHECK-SD-NEXT: cmp w12, w84787; CHECK-SD-NEXT: fmov s0, w104788; CHECK-SD-NEXT: fcvtzs w10, d14789; CHECK-SD-NEXT: mov d1, v2.d[1]4790; CHECK-SD-NEXT: mov v0.h[1], w114791; CHECK-SD-NEXT: csel w11, w12, w8, lt4792; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684793; CHECK-SD-NEXT: csel w11, w11, w9, gt4794; CHECK-SD-NEXT: cmp w10, w84795; CHECK-SD-NEXT: csel w10, w10, w8, lt4796; CHECK-SD-NEXT: mov v0.h[2], w114797; CHECK-SD-NEXT: fcvtzs w11, d24798; CHECK-SD-NEXT: cmn w10, #8, lsl #12 // =327684799; CHECK-SD-NEXT: csel w10, w10, w9, gt4800; CHECK-SD-NEXT: cmp w11, w84801; CHECK-SD-NEXT: mov v0.h[3], w104802; CHECK-SD-NEXT: fcvtzs w10, d14803; CHECK-SD-NEXT: csel w11, w11, w8, lt4804; CHECK-SD-NEXT: mov d1, v3.d[1]4805; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684806; CHECK-SD-NEXT: csel w11, w11, w9, gt4807; CHECK-SD-NEXT: mov v0.h[4], w114808; CHECK-SD-NEXT: cmp w10, w84809; CHECK-SD-NEXT: fcvtzs w11, d34810; CHECK-SD-NEXT: csel w10, w10, w8, lt4811; CHECK-SD-NEXT: cmn w10, #8, lsl #12 // =327684812; CHECK-SD-NEXT: csel w10, w10, w9, gt4813; CHECK-SD-NEXT: mov v0.h[5], w104814; CHECK-SD-NEXT: cmp w11, w84815; CHECK-SD-NEXT: fcvtzs w10, d14816; CHECK-SD-NEXT: csel w11, w11, w8, lt4817; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684818; CHECK-SD-NEXT: csel w11, w11, w9, gt4819; CHECK-SD-NEXT: mov v0.h[6], w114820; CHECK-SD-NEXT: cmp w10, w84821; CHECK-SD-NEXT: csel w8, w10, w8, lt4822; CHECK-SD-NEXT: cmn w8, #8, lsl #12 // =327684823; CHECK-SD-NEXT: csel w8, w8, w9, gt4824; CHECK-SD-NEXT: mov v0.h[7], w84825; CHECK-SD-NEXT: ret4826;4827; CHECK-GI-LABEL: test_signed_v8f64_v8i16:4828; CHECK-GI: // %bb.0:4829; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d4830; CHECK-GI-NEXT: fcvtzs v1.2d, v1.2d4831; CHECK-GI-NEXT: adrp x8, .LCPI84_14832; CHECK-GI-NEXT: fcvtzs v2.2d, v2.2d4833; CHECK-GI-NEXT: fcvtzs v3.2d, v3.2d4834; CHECK-GI-NEXT: ldr q4, [x8, :lo12:.LCPI84_1]4835; CHECK-GI-NEXT: adrp x8, .LCPI84_04836; CHECK-GI-NEXT: cmgt v5.2d, v4.2d, v0.2d4837; CHECK-GI-NEXT: cmgt v6.2d, v4.2d, v1.2d4838; CHECK-GI-NEXT: cmgt v7.2d, v4.2d, v2.2d4839; CHECK-GI-NEXT: cmgt v16.2d, v4.2d, v3.2d4840; CHECK-GI-NEXT: bif v0.16b, v4.16b, v5.16b4841; CHECK-GI-NEXT: bif v1.16b, v4.16b, v6.16b4842; CHECK-GI-NEXT: bif v2.16b, v4.16b, v7.16b4843; CHECK-GI-NEXT: bif v3.16b, v4.16b, v16.16b4844; CHECK-GI-NEXT: ldr q4, [x8, :lo12:.LCPI84_0]4845; CHECK-GI-NEXT: cmgt v5.2d, v0.2d, v4.2d4846; CHECK-GI-NEXT: cmgt v6.2d, v1.2d, v4.2d4847; CHECK-GI-NEXT: cmgt v7.2d, v2.2d, v4.2d4848; CHECK-GI-NEXT: cmgt v16.2d, v3.2d, v4.2d4849; CHECK-GI-NEXT: bif v0.16b, v4.16b, v5.16b4850; CHECK-GI-NEXT: bif v1.16b, v4.16b, v6.16b4851; CHECK-GI-NEXT: bif v2.16b, v4.16b, v7.16b4852; CHECK-GI-NEXT: bif v3.16b, v4.16b, v16.16b4853; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s4854; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s4855; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h4856; CHECK-GI-NEXT: ret4857 %x = call <8 x i16> @llvm.fptosi.sat.v8f64.v8i16(<8 x double> %f)4858 ret <8 x i16> %x4859}4860 4861define <16 x i16> @test_signed_v16f64_v16i16(<16 x double> %f) {4862; CHECK-SD-LABEL: test_signed_v16f64_v16i16:4863; CHECK-SD: // %bb.0:4864; CHECK-SD-NEXT: mov d16, v0.d[1]4865; CHECK-SD-NEXT: mov w8, #32767 // =0x7fff4866; CHECK-SD-NEXT: fcvtzs w11, d04867; CHECK-SD-NEXT: mov d0, v1.d[1]4868; CHECK-SD-NEXT: fcvtzs w12, d14869; CHECK-SD-NEXT: fcvtzs w15, d34870; CHECK-SD-NEXT: mov d1, v4.d[1]4871; CHECK-SD-NEXT: fcvtzs w1, d54872; CHECK-SD-NEXT: fcvtzs w9, d164873; CHECK-SD-NEXT: fcvtzs w14, d04874; CHECK-SD-NEXT: mov d0, v2.d[1]4875; CHECK-SD-NEXT: fcvtzs w0, d14876; CHECK-SD-NEXT: cmp w9, w84877; CHECK-SD-NEXT: csel w10, w9, w8, lt4878; CHECK-SD-NEXT: mov w9, #-32768 // =0xffff80004879; CHECK-SD-NEXT: cmn w10, #8, lsl #12 // =327684880; CHECK-SD-NEXT: csel w10, w10, w9, gt4881; CHECK-SD-NEXT: cmp w11, w84882; CHECK-SD-NEXT: csel w11, w11, w8, lt4883; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684884; CHECK-SD-NEXT: csel w13, w11, w9, gt4885; CHECK-SD-NEXT: cmp w12, w84886; CHECK-SD-NEXT: csel w11, w12, w8, lt4887; CHECK-SD-NEXT: fcvtzs w12, d24888; CHECK-SD-NEXT: mov d2, v5.d[1]4889; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684890; CHECK-SD-NEXT: csel w17, w11, w9, gt4891; CHECK-SD-NEXT: cmp w14, w84892; CHECK-SD-NEXT: csel w11, w14, w8, lt4893; CHECK-SD-NEXT: fcvtzs w14, d04894; CHECK-SD-NEXT: mov d0, v3.d[1]4895; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684896; CHECK-SD-NEXT: csel w11, w11, w9, gt4897; CHECK-SD-NEXT: cmp w12, w84898; CHECK-SD-NEXT: csel w12, w12, w8, lt4899; CHECK-SD-NEXT: cmn w12, #8, lsl #12 // =327684900; CHECK-SD-NEXT: fcvtzs w18, d04901; CHECK-SD-NEXT: fmov s0, w134902; CHECK-SD-NEXT: csel w16, w12, w9, gt4903; CHECK-SD-NEXT: cmp w14, w84904; CHECK-SD-NEXT: csel w12, w14, w8, lt4905; CHECK-SD-NEXT: cmn w12, #8, lsl #12 // =327684906; CHECK-SD-NEXT: mov v0.h[1], w104907; CHECK-SD-NEXT: fcvtzs w10, d24908; CHECK-SD-NEXT: csel w14, w12, w9, gt4909; CHECK-SD-NEXT: cmp w15, w84910; CHECK-SD-NEXT: mov d2, v6.d[1]4911; CHECK-SD-NEXT: csel w12, w15, w8, lt4912; CHECK-SD-NEXT: cmn w12, #8, lsl #12 // =327684913; CHECK-SD-NEXT: csel w12, w12, w9, gt4914; CHECK-SD-NEXT: cmp w18, w84915; CHECK-SD-NEXT: mov v0.h[2], w174916; CHECK-SD-NEXT: csel w15, w18, w8, lt4917; CHECK-SD-NEXT: fcvtzs w18, d44918; CHECK-SD-NEXT: cmn w15, #8, lsl #12 // =327684919; CHECK-SD-NEXT: csel w15, w15, w9, gt4920; CHECK-SD-NEXT: cmp w0, w84921; CHECK-SD-NEXT: csel w0, w0, w8, lt4922; CHECK-SD-NEXT: mov v0.h[3], w114923; CHECK-SD-NEXT: cmn w0, #8, lsl #12 // =327684924; CHECK-SD-NEXT: csel w0, w0, w9, gt4925; CHECK-SD-NEXT: cmp w18, w84926; CHECK-SD-NEXT: csel w18, w18, w8, lt4927; CHECK-SD-NEXT: cmn w18, #8, lsl #12 // =327684928; CHECK-SD-NEXT: mov v0.h[4], w164929; CHECK-SD-NEXT: csel w13, w18, w9, gt4930; CHECK-SD-NEXT: cmp w1, w84931; CHECK-SD-NEXT: fmov s1, w134932; CHECK-SD-NEXT: csel w13, w1, w8, lt4933; CHECK-SD-NEXT: cmn w13, #8, lsl #12 // =327684934; CHECK-SD-NEXT: csel w13, w13, w9, gt4935; CHECK-SD-NEXT: cmp w10, w84936; CHECK-SD-NEXT: mov v0.h[5], w144937; CHECK-SD-NEXT: mov v1.h[1], w04938; CHECK-SD-NEXT: csel w10, w10, w8, lt4939; CHECK-SD-NEXT: cmn w10, #8, lsl #12 // =327684940; CHECK-SD-NEXT: csel w10, w10, w9, gt4941; CHECK-SD-NEXT: mov v0.h[6], w124942; CHECK-SD-NEXT: mov v1.h[2], w134943; CHECK-SD-NEXT: fcvtzs w13, d64944; CHECK-SD-NEXT: mov v0.h[7], w154945; CHECK-SD-NEXT: cmp w13, w84946; CHECK-SD-NEXT: mov v1.h[3], w104947; CHECK-SD-NEXT: fcvtzs w10, d24948; CHECK-SD-NEXT: csel w11, w13, w8, lt4949; CHECK-SD-NEXT: mov d2, v7.d[1]4950; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684951; CHECK-SD-NEXT: csel w11, w11, w9, gt4952; CHECK-SD-NEXT: mov v1.h[4], w114953; CHECK-SD-NEXT: cmp w10, w84954; CHECK-SD-NEXT: fcvtzs w11, d74955; CHECK-SD-NEXT: csel w10, w10, w8, lt4956; CHECK-SD-NEXT: cmn w10, #8, lsl #12 // =327684957; CHECK-SD-NEXT: csel w10, w10, w9, gt4958; CHECK-SD-NEXT: mov v1.h[5], w104959; CHECK-SD-NEXT: cmp w11, w84960; CHECK-SD-NEXT: fcvtzs w10, d24961; CHECK-SD-NEXT: csel w11, w11, w8, lt4962; CHECK-SD-NEXT: cmn w11, #8, lsl #12 // =327684963; CHECK-SD-NEXT: csel w11, w11, w9, gt4964; CHECK-SD-NEXT: mov v1.h[6], w114965; CHECK-SD-NEXT: cmp w10, w84966; CHECK-SD-NEXT: csel w8, w10, w8, lt4967; CHECK-SD-NEXT: cmn w8, #8, lsl #12 // =327684968; CHECK-SD-NEXT: csel w8, w8, w9, gt4969; CHECK-SD-NEXT: mov v1.h[7], w84970; CHECK-SD-NEXT: ret4971;4972; CHECK-GI-LABEL: test_signed_v16f64_v16i16:4973; CHECK-GI: // %bb.0:4974; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d4975; CHECK-GI-NEXT: fcvtzs v1.2d, v1.2d4976; CHECK-GI-NEXT: adrp x8, .LCPI85_14977; CHECK-GI-NEXT: fcvtzs v2.2d, v2.2d4978; CHECK-GI-NEXT: fcvtzs v3.2d, v3.2d4979; CHECK-GI-NEXT: ldr q16, [x8, :lo12:.LCPI85_1]4980; CHECK-GI-NEXT: fcvtzs v4.2d, v4.2d4981; CHECK-GI-NEXT: fcvtzs v5.2d, v5.2d4982; CHECK-GI-NEXT: adrp x8, .LCPI85_04983; CHECK-GI-NEXT: fcvtzs v6.2d, v6.2d4984; CHECK-GI-NEXT: fcvtzs v7.2d, v7.2d4985; CHECK-GI-NEXT: ldr q25, [x8, :lo12:.LCPI85_0]4986; CHECK-GI-NEXT: cmgt v17.2d, v16.2d, v0.2d4987; CHECK-GI-NEXT: cmgt v18.2d, v16.2d, v1.2d4988; CHECK-GI-NEXT: cmgt v19.2d, v16.2d, v2.2d4989; CHECK-GI-NEXT: cmgt v20.2d, v16.2d, v3.2d4990; CHECK-GI-NEXT: cmgt v21.2d, v16.2d, v4.2d4991; CHECK-GI-NEXT: cmgt v22.2d, v16.2d, v5.2d4992; CHECK-GI-NEXT: cmgt v23.2d, v16.2d, v6.2d4993; CHECK-GI-NEXT: cmgt v24.2d, v16.2d, v7.2d4994; CHECK-GI-NEXT: bif v0.16b, v16.16b, v17.16b4995; CHECK-GI-NEXT: bif v1.16b, v16.16b, v18.16b4996; CHECK-GI-NEXT: bif v2.16b, v16.16b, v19.16b4997; CHECK-GI-NEXT: bif v3.16b, v16.16b, v20.16b4998; CHECK-GI-NEXT: bif v4.16b, v16.16b, v21.16b4999; CHECK-GI-NEXT: bif v5.16b, v16.16b, v22.16b5000; CHECK-GI-NEXT: bif v6.16b, v16.16b, v23.16b5001; CHECK-GI-NEXT: bif v7.16b, v16.16b, v24.16b5002; CHECK-GI-NEXT: cmgt v16.2d, v0.2d, v25.2d5003; CHECK-GI-NEXT: cmgt v17.2d, v1.2d, v25.2d5004; CHECK-GI-NEXT: cmgt v18.2d, v2.2d, v25.2d5005; CHECK-GI-NEXT: cmgt v19.2d, v3.2d, v25.2d5006; CHECK-GI-NEXT: cmgt v20.2d, v4.2d, v25.2d5007; CHECK-GI-NEXT: cmgt v21.2d, v5.2d, v25.2d5008; CHECK-GI-NEXT: cmgt v22.2d, v6.2d, v25.2d5009; CHECK-GI-NEXT: cmgt v23.2d, v7.2d, v25.2d5010; CHECK-GI-NEXT: bif v0.16b, v25.16b, v16.16b5011; CHECK-GI-NEXT: bif v1.16b, v25.16b, v17.16b5012; CHECK-GI-NEXT: bif v2.16b, v25.16b, v18.16b5013; CHECK-GI-NEXT: bif v3.16b, v25.16b, v19.16b5014; CHECK-GI-NEXT: bif v4.16b, v25.16b, v20.16b5015; CHECK-GI-NEXT: bif v5.16b, v25.16b, v21.16b5016; CHECK-GI-NEXT: bif v6.16b, v25.16b, v22.16b5017; CHECK-GI-NEXT: bif v7.16b, v25.16b, v23.16b5018; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s5019; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s5020; CHECK-GI-NEXT: uzp1 v2.4s, v4.4s, v5.4s5021; CHECK-GI-NEXT: uzp1 v3.4s, v6.4s, v7.4s5022; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h5023; CHECK-GI-NEXT: uzp1 v1.8h, v2.8h, v3.8h5024; CHECK-GI-NEXT: ret5025 %x = call <16 x i16> @llvm.fptosi.sat.v16f64.v16i16(<16 x double> %f)5026 ret <16 x i16> %x5027}5028 5029define <2 x i64> @test_signed_v2f128_v2i64(<2 x fp128> %f) {5030; CHECK-SD-LABEL: test_signed_v2f128_v2i64:5031; CHECK-SD: // %bb.0:5032; CHECK-SD-NEXT: sub sp, sp, #965033; CHECK-SD-NEXT: stp x30, x21, [sp, #64] // 16-byte Folded Spill5034; CHECK-SD-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill5035; CHECK-SD-NEXT: .cfi_def_cfa_offset 965036; CHECK-SD-NEXT: .cfi_offset w19, -85037; CHECK-SD-NEXT: .cfi_offset w20, -165038; CHECK-SD-NEXT: .cfi_offset w21, -245039; CHECK-SD-NEXT: .cfi_offset w30, -325040; CHECK-SD-NEXT: mov v2.16b, v1.16b5041; CHECK-SD-NEXT: stp q1, q0, [sp, #32] // 32-byte Folded Spill5042; CHECK-SD-NEXT: adrp x8, .LCPI86_05043; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI86_0]5044; CHECK-SD-NEXT: mov v0.16b, v2.16b5045; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5046; CHECK-SD-NEXT: bl __getf25047; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload5048; CHECK-SD-NEXT: mov w19, w05049; CHECK-SD-NEXT: bl __fixtfdi5050; CHECK-SD-NEXT: adrp x8, .LCPI86_15051; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload5052; CHECK-SD-NEXT: cmp w19, #05053; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI86_1]5054; CHECK-SD-NEXT: mov x20, #-9223372036854775808 // =0x80000000000000005055; CHECK-SD-NEXT: csel x19, x20, x0, mi5056; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill5057; CHECK-SD-NEXT: bl __gttf25058; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload5059; CHECK-SD-NEXT: mov x21, #9223372036854775807 // =0x7fffffffffffffff5060; CHECK-SD-NEXT: cmp w0, #05061; CHECK-SD-NEXT: csel x19, x21, x19, gt5062; CHECK-SD-NEXT: mov v1.16b, v0.16b5063; CHECK-SD-NEXT: bl __unordtf25064; CHECK-SD-NEXT: cmp w0, #05065; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5066; CHECK-SD-NEXT: csel x8, xzr, x19, ne5067; CHECK-SD-NEXT: fmov d0, x85068; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill5069; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload5070; CHECK-SD-NEXT: bl __getf25071; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload5072; CHECK-SD-NEXT: mov w19, w05073; CHECK-SD-NEXT: bl __fixtfdi5074; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload5075; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5076; CHECK-SD-NEXT: cmp w19, #05077; CHECK-SD-NEXT: csel x19, x20, x0, mi5078; CHECK-SD-NEXT: bl __gttf25079; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload5080; CHECK-SD-NEXT: cmp w0, #05081; CHECK-SD-NEXT: csel x19, x21, x19, gt5082; CHECK-SD-NEXT: mov v1.16b, v0.16b5083; CHECK-SD-NEXT: bl __unordtf25084; CHECK-SD-NEXT: cmp w0, #05085; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload5086; CHECK-SD-NEXT: csel x8, xzr, x19, ne5087; CHECK-SD-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload5088; CHECK-SD-NEXT: fmov d0, x85089; CHECK-SD-NEXT: ldp x30, x21, [sp, #64] // 16-byte Folded Reload5090; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]5091; CHECK-SD-NEXT: add sp, sp, #965092; CHECK-SD-NEXT: ret5093;5094; CHECK-GI-LABEL: test_signed_v2f128_v2i64:5095; CHECK-GI: // %bb.0:5096; CHECK-GI-NEXT: sub sp, sp, #1125097; CHECK-GI-NEXT: stp x30, x23, [sp, #64] // 16-byte Folded Spill5098; CHECK-GI-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill5099; CHECK-GI-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill5100; CHECK-GI-NEXT: .cfi_def_cfa_offset 1125101; CHECK-GI-NEXT: .cfi_offset w19, -85102; CHECK-GI-NEXT: .cfi_offset w20, -165103; CHECK-GI-NEXT: .cfi_offset w21, -245104; CHECK-GI-NEXT: .cfi_offset w22, -325105; CHECK-GI-NEXT: .cfi_offset w23, -405106; CHECK-GI-NEXT: .cfi_offset w30, -485107; CHECK-GI-NEXT: adrp x8, .LCPI86_15108; CHECK-GI-NEXT: str q1, [sp, #48] // 16-byte Spill5109; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI86_1]5110; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill5111; CHECK-GI-NEXT: mov v1.16b, v2.16b5112; CHECK-GI-NEXT: str q2, [sp, #16] // 16-byte Spill5113; CHECK-GI-NEXT: bl __gttf25114; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload5115; CHECK-GI-NEXT: cmp w0, #05116; CHECK-GI-NEXT: mov x20, #-4594234569871327232 // =0xc03e0000000000005117; CHECK-GI-NEXT: fmov x8, d05118; CHECK-GI-NEXT: csel x19, x8, xzr, gt5119; CHECK-GI-NEXT: mov x8, v0.d[1]5120; CHECK-GI-NEXT: mov v0.d[0], x195121; CHECK-GI-NEXT: csel x21, x8, x20, gt5122; CHECK-GI-NEXT: adrp x8, .LCPI86_05123; CHECK-GI-NEXT: mov v0.d[1], x215124; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI86_0]5125; CHECK-GI-NEXT: str q1, [sp] // 16-byte Spill5126; CHECK-GI-NEXT: bl __lttf25127; CHECK-GI-NEXT: mov x22, #-1125899906842624 // =0xfffc0000000000005128; CHECK-GI-NEXT: cmp w0, #05129; CHECK-GI-NEXT: mov x23, #4629137466983448575 // =0x403dffffffffffff5130; CHECK-GI-NEXT: csel x8, x19, x22, mi5131; CHECK-GI-NEXT: mov v0.d[0], x85132; CHECK-GI-NEXT: csel x8, x21, x23, mi5133; CHECK-GI-NEXT: mov v0.d[1], x85134; CHECK-GI-NEXT: bl __fixtfdi5135; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload5136; CHECK-GI-NEXT: mov x19, x05137; CHECK-GI-NEXT: mov v1.16b, v0.16b5138; CHECK-GI-NEXT: bl __unordtf25139; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload5140; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Reload5141; CHECK-GI-NEXT: cmp w0, #05142; CHECK-GI-NEXT: csel x21, xzr, x19, ne5143; CHECK-GI-NEXT: bl __gttf25144; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload5145; CHECK-GI-NEXT: cmp w0, #05146; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload5147; CHECK-GI-NEXT: fmov x8, d05148; CHECK-GI-NEXT: csel x19, x8, xzr, gt5149; CHECK-GI-NEXT: mov x8, v0.d[1]5150; CHECK-GI-NEXT: mov v0.d[0], x195151; CHECK-GI-NEXT: csel x20, x8, x20, gt5152; CHECK-GI-NEXT: mov v0.d[1], x205153; CHECK-GI-NEXT: bl __lttf25154; CHECK-GI-NEXT: cmp w0, #05155; CHECK-GI-NEXT: csel x8, x19, x22, mi5156; CHECK-GI-NEXT: mov v0.d[0], x85157; CHECK-GI-NEXT: csel x8, x20, x23, mi5158; CHECK-GI-NEXT: mov v0.d[1], x85159; CHECK-GI-NEXT: bl __fixtfdi5160; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload5161; CHECK-GI-NEXT: mov x19, x05162; CHECK-GI-NEXT: mov v1.16b, v0.16b5163; CHECK-GI-NEXT: bl __unordtf25164; CHECK-GI-NEXT: fmov d0, x215165; CHECK-GI-NEXT: cmp w0, #05166; CHECK-GI-NEXT: csel x8, xzr, x19, ne5167; CHECK-GI-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload5168; CHECK-GI-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload5169; CHECK-GI-NEXT: ldp x30, x23, [sp, #64] // 16-byte Folded Reload5170; CHECK-GI-NEXT: mov v0.d[1], x85171; CHECK-GI-NEXT: add sp, sp, #1125172; CHECK-GI-NEXT: ret5173 %x = call <2 x i64> @llvm.fptosi.sat.v2f128.v2i64(<2 x fp128> %f)5174 ret <2 x i64> %x5175}5176