1203 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s3 4; i32 saturate5 6define i32 @stest_f64i32(double %x) nounwind {7; CHECK-LABEL: stest_f64i32:8; CHECK: # %bb.0: # %entry9; CHECK-NEXT: xorl %eax, %eax10; CHECK-NEXT: ucomisd %xmm0, %xmm011; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm012; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm013; CHECK-NEXT: cvttsd2si %xmm0, %ecx14; CHECK-NEXT: cmovnpl %ecx, %eax15; CHECK-NEXT: retq16entry:17 %conv = fptosi double %x to i6418 %0 = icmp slt i64 %conv, 214748364719 %spec.store.select = select i1 %0, i64 %conv, i64 214748364720 %1 = icmp sgt i64 %spec.store.select, -214748364821 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -214748364822 %conv6 = trunc i64 %spec.store.select7 to i3223 ret i32 %conv624}25 26define i32 @utest_f64i32(double %x) nounwind {27; CHECK-LABEL: utest_f64i32:28; CHECK: # %bb.0: # %entry29; CHECK-NEXT: cvttsd2si %xmm0, %rax30; CHECK-NEXT: movq %rax, %rcx31; CHECK-NEXT: sarq $63, %rcx32; CHECK-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm033; CHECK-NEXT: cvttsd2si %xmm0, %rdx34; CHECK-NEXT: andq %rcx, %rdx35; CHECK-NEXT: orq %rax, %rdx36; CHECK-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF37; CHECK-NEXT: cmpq %rax, %rdx38; CHECK-NEXT: movl $-1, %eax39; CHECK-NEXT: cmovbl %edx, %eax40; CHECK-NEXT: retq41entry:42 %conv = fptoui double %x to i6443 %0 = icmp ult i64 %conv, 429496729544 %spec.store.select = select i1 %0, i64 %conv, i64 429496729545 %conv6 = trunc i64 %spec.store.select to i3246 ret i32 %conv647}48 49define i32 @ustest_f64i32(double %x) nounwind {50; CHECK-LABEL: ustest_f64i32:51; CHECK: # %bb.0: # %entry52; CHECK-NEXT: cvttsd2si %xmm0, %rcx53; CHECK-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF54; CHECK-NEXT: cmpq %rax, %rcx55; CHECK-NEXT: cmovlq %rcx, %rax56; CHECK-NEXT: xorl %ecx, %ecx57; CHECK-NEXT: testq %rax, %rax58; CHECK-NEXT: cmovlel %ecx, %eax59; CHECK-NEXT: # kill: def $eax killed $eax killed $rax60; CHECK-NEXT: retq61entry:62 %conv = fptosi double %x to i6463 %0 = icmp slt i64 %conv, 429496729564 %spec.store.select = select i1 %0, i64 %conv, i64 429496729565 %1 = icmp sgt i64 %spec.store.select, 066 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 067 %conv6 = trunc i64 %spec.store.select7 to i3268 ret i32 %conv669}70 71define i32 @stest_f32i32(float %x) nounwind {72; CHECK-LABEL: stest_f32i32:73; CHECK: # %bb.0: # %entry74; CHECK-NEXT: cvttss2si %xmm0, %eax75; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm076; CHECK-NEXT: movl $2147483647, %ecx # imm = 0x7FFFFFFF77; CHECK-NEXT: cmovbel %eax, %ecx78; CHECK-NEXT: xorl %eax, %eax79; CHECK-NEXT: ucomiss %xmm0, %xmm080; CHECK-NEXT: cmovnpl %ecx, %eax81; CHECK-NEXT: retq82entry:83 %conv = fptosi float %x to i6484 %0 = icmp slt i64 %conv, 214748364785 %spec.store.select = select i1 %0, i64 %conv, i64 214748364786 %1 = icmp sgt i64 %spec.store.select, -214748364887 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -214748364888 %conv6 = trunc i64 %spec.store.select7 to i3289 ret i32 %conv690}91 92define i32 @utest_f32i32(float %x) nounwind {93; CHECK-LABEL: utest_f32i32:94; CHECK: # %bb.0: # %entry95; CHECK-NEXT: cvttss2si %xmm0, %rax96; CHECK-NEXT: movq %rax, %rcx97; CHECK-NEXT: sarq $63, %rcx98; CHECK-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm099; CHECK-NEXT: cvttss2si %xmm0, %rdx100; CHECK-NEXT: andq %rcx, %rdx101; CHECK-NEXT: orq %rax, %rdx102; CHECK-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF103; CHECK-NEXT: cmpq %rax, %rdx104; CHECK-NEXT: movl $-1, %eax105; CHECK-NEXT: cmovbl %edx, %eax106; CHECK-NEXT: retq107entry:108 %conv = fptoui float %x to i64109 %0 = icmp ult i64 %conv, 4294967295110 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295111 %conv6 = trunc i64 %spec.store.select to i32112 ret i32 %conv6113}114 115define i32 @ustest_f32i32(float %x) nounwind {116; CHECK-LABEL: ustest_f32i32:117; CHECK: # %bb.0: # %entry118; CHECK-NEXT: cvttss2si %xmm0, %rcx119; CHECK-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF120; CHECK-NEXT: cmpq %rax, %rcx121; CHECK-NEXT: cmovlq %rcx, %rax122; CHECK-NEXT: xorl %ecx, %ecx123; CHECK-NEXT: testq %rax, %rax124; CHECK-NEXT: cmovlel %ecx, %eax125; CHECK-NEXT: # kill: def $eax killed $eax killed $rax126; CHECK-NEXT: retq127entry:128 %conv = fptosi float %x to i64129 %0 = icmp slt i64 %conv, 4294967295130 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295131 %1 = icmp sgt i64 %spec.store.select, 0132 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0133 %conv6 = trunc i64 %spec.store.select7 to i32134 ret i32 %conv6135}136 137define i32 @stest_f16i32(half %x) nounwind {138; CHECK-LABEL: stest_f16i32:139; CHECK: # %bb.0: # %entry140; CHECK-NEXT: pushq %rax141; CHECK-NEXT: callq __extendhfsf2@PLT142; CHECK-NEXT: cvttss2si %xmm0, %eax143; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0144; CHECK-NEXT: movl $-2147483648, %ecx # imm = 0x80000000145; CHECK-NEXT: cmovael %eax, %ecx146; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0147; CHECK-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF148; CHECK-NEXT: cmovbel %ecx, %edx149; CHECK-NEXT: xorl %eax, %eax150; CHECK-NEXT: ucomiss %xmm0, %xmm0151; CHECK-NEXT: cmovnpl %edx, %eax152; CHECK-NEXT: popq %rcx153; CHECK-NEXT: retq154entry:155 %conv = fptosi half %x to i64156 %0 = icmp slt i64 %conv, 2147483647157 %spec.store.select = select i1 %0, i64 %conv, i64 2147483647158 %1 = icmp sgt i64 %spec.store.select, -2147483648159 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648160 %conv6 = trunc i64 %spec.store.select7 to i32161 ret i32 %conv6162}163 164define i32 @utest_f16i32(half %x) nounwind {165; CHECK-LABEL: utest_f16i32:166; CHECK: # %bb.0: # %entry167; CHECK-NEXT: pushq %rax168; CHECK-NEXT: callq __extendhfsf2@PLT169; CHECK-NEXT: cvttss2si %xmm0, %rax170; CHECK-NEXT: movq %rax, %rcx171; CHECK-NEXT: sarq $63, %rcx172; CHECK-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0173; CHECK-NEXT: cvttss2si %xmm0, %rdx174; CHECK-NEXT: andq %rcx, %rdx175; CHECK-NEXT: orq %rax, %rdx176; CHECK-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF177; CHECK-NEXT: cmpq %rax, %rdx178; CHECK-NEXT: movl $-1, %eax179; CHECK-NEXT: cmovbl %edx, %eax180; CHECK-NEXT: popq %rcx181; CHECK-NEXT: retq182entry:183 %conv = fptoui half %x to i64184 %0 = icmp ult i64 %conv, 4294967295185 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295186 %conv6 = trunc i64 %spec.store.select to i32187 ret i32 %conv6188}189 190define i32 @ustest_f16i32(half %x) nounwind {191; CHECK-LABEL: ustest_f16i32:192; CHECK: # %bb.0: # %entry193; CHECK-NEXT: pushq %rax194; CHECK-NEXT: callq __extendhfsf2@PLT195; CHECK-NEXT: cvttss2si %xmm0, %rcx196; CHECK-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF197; CHECK-NEXT: cmpq %rax, %rcx198; CHECK-NEXT: cmovlq %rcx, %rax199; CHECK-NEXT: xorl %ecx, %ecx200; CHECK-NEXT: testq %rax, %rax201; CHECK-NEXT: cmovlel %ecx, %eax202; CHECK-NEXT: # kill: def $eax killed $eax killed $rax203; CHECK-NEXT: popq %rcx204; CHECK-NEXT: retq205entry:206 %conv = fptosi half %x to i64207 %0 = icmp slt i64 %conv, 4294967295208 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295209 %1 = icmp sgt i64 %spec.store.select, 0210 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0211 %conv6 = trunc i64 %spec.store.select7 to i32212 ret i32 %conv6213}214 215; i16 saturate216 217define i16 @stest_f64i16(double %x) nounwind {218; CHECK-LABEL: stest_f64i16:219; CHECK: # %bb.0: # %entry220; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-3.2768E+4,0.0E+0]221; CHECK-NEXT: maxsd %xmm0, %xmm1222; CHECK-NEXT: movsd {{.*#+}} xmm0 = [3.2767E+4,0.0E+0]223; CHECK-NEXT: minsd %xmm1, %xmm0224; CHECK-NEXT: cvttsd2si %xmm0, %eax225; CHECK-NEXT: # kill: def $ax killed $ax killed $eax226; CHECK-NEXT: retq227entry:228 %conv = fptosi double %x to i32229 %0 = icmp slt i32 %conv, 32767230 %spec.store.select = select i1 %0, i32 %conv, i32 32767231 %1 = icmp sgt i32 %spec.store.select, -32768232 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768233 %conv6 = trunc i32 %spec.store.select7 to i16234 ret i16 %conv6235}236 237define i16 @utest_f64i16(double %x) nounwind {238; CHECK-LABEL: utest_f64i16:239; CHECK: # %bb.0: # %entry240; CHECK-NEXT: cvttsd2si %xmm0, %rcx241; CHECK-NEXT: cmpl $65535, %ecx # imm = 0xFFFF242; CHECK-NEXT: movl $65535, %eax # imm = 0xFFFF243; CHECK-NEXT: cmovbl %ecx, %eax244; CHECK-NEXT: # kill: def $ax killed $ax killed $eax245; CHECK-NEXT: retq246entry:247 %conv = fptoui double %x to i32248 %0 = icmp ult i32 %conv, 65535249 %spec.store.select = select i1 %0, i32 %conv, i32 65535250 %conv6 = trunc i32 %spec.store.select to i16251 ret i16 %conv6252}253 254define i16 @ustest_f64i16(double %x) nounwind {255; CHECK-LABEL: ustest_f64i16:256; CHECK: # %bb.0: # %entry257; CHECK-NEXT: cvttsd2si %xmm0, %eax258; CHECK-NEXT: cmpl $65535, %eax # imm = 0xFFFF259; CHECK-NEXT: movl $65535, %ecx # imm = 0xFFFF260; CHECK-NEXT: cmovll %eax, %ecx261; CHECK-NEXT: xorl %eax, %eax262; CHECK-NEXT: testl %ecx, %ecx263; CHECK-NEXT: cmovgl %ecx, %eax264; CHECK-NEXT: # kill: def $ax killed $ax killed $eax265; CHECK-NEXT: retq266entry:267 %conv = fptosi double %x to i32268 %0 = icmp slt i32 %conv, 65535269 %spec.store.select = select i1 %0, i32 %conv, i32 65535270 %1 = icmp sgt i32 %spec.store.select, 0271 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0272 %conv6 = trunc i32 %spec.store.select7 to i16273 ret i16 %conv6274}275 276define i16 @stest_f32i16(float %x) nounwind {277; CHECK-LABEL: stest_f32i16:278; CHECK: # %bb.0: # %entry279; CHECK-NEXT: movss {{.*#+}} xmm1 = [-3.2768E+4,0.0E+0,0.0E+0,0.0E+0]280; CHECK-NEXT: maxss %xmm0, %xmm1281; CHECK-NEXT: movss {{.*#+}} xmm0 = [3.2767E+4,0.0E+0,0.0E+0,0.0E+0]282; CHECK-NEXT: minss %xmm1, %xmm0283; CHECK-NEXT: cvttss2si %xmm0, %eax284; CHECK-NEXT: # kill: def $ax killed $ax killed $eax285; CHECK-NEXT: retq286entry:287 %conv = fptosi float %x to i32288 %0 = icmp slt i32 %conv, 32767289 %spec.store.select = select i1 %0, i32 %conv, i32 32767290 %1 = icmp sgt i32 %spec.store.select, -32768291 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768292 %conv6 = trunc i32 %spec.store.select7 to i16293 ret i16 %conv6294}295 296define i16 @utest_f32i16(float %x) nounwind {297; CHECK-LABEL: utest_f32i16:298; CHECK: # %bb.0: # %entry299; CHECK-NEXT: cvttss2si %xmm0, %rcx300; CHECK-NEXT: cmpl $65535, %ecx # imm = 0xFFFF301; CHECK-NEXT: movl $65535, %eax # imm = 0xFFFF302; CHECK-NEXT: cmovbl %ecx, %eax303; CHECK-NEXT: # kill: def $ax killed $ax killed $eax304; CHECK-NEXT: retq305entry:306 %conv = fptoui float %x to i32307 %0 = icmp ult i32 %conv, 65535308 %spec.store.select = select i1 %0, i32 %conv, i32 65535309 %conv6 = trunc i32 %spec.store.select to i16310 ret i16 %conv6311}312 313define i16 @ustest_f32i16(float %x) nounwind {314; CHECK-LABEL: ustest_f32i16:315; CHECK: # %bb.0: # %entry316; CHECK-NEXT: cvttss2si %xmm0, %eax317; CHECK-NEXT: cmpl $65535, %eax # imm = 0xFFFF318; CHECK-NEXT: movl $65535, %ecx # imm = 0xFFFF319; CHECK-NEXT: cmovll %eax, %ecx320; CHECK-NEXT: xorl %eax, %eax321; CHECK-NEXT: testl %ecx, %ecx322; CHECK-NEXT: cmovgl %ecx, %eax323; CHECK-NEXT: # kill: def $ax killed $ax killed $eax324; CHECK-NEXT: retq325entry:326 %conv = fptosi float %x to i32327 %0 = icmp slt i32 %conv, 65535328 %spec.store.select = select i1 %0, i32 %conv, i32 65535329 %1 = icmp sgt i32 %spec.store.select, 0330 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0331 %conv6 = trunc i32 %spec.store.select7 to i16332 ret i16 %conv6333}334 335define i16 @stest_f16i16(half %x) nounwind {336; CHECK-LABEL: stest_f16i16:337; CHECK: # %bb.0: # %entry338; CHECK-NEXT: pushq %rax339; CHECK-NEXT: callq __extendhfsf2@PLT340; CHECK-NEXT: cvttss2si %xmm0, %eax341; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0342; CHECK-NEXT: movl $32768, %ecx # imm = 0x8000343; CHECK-NEXT: cmovael %eax, %ecx344; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0345; CHECK-NEXT: movl $32767, %edx # imm = 0x7FFF346; CHECK-NEXT: cmovbel %ecx, %edx347; CHECK-NEXT: xorl %eax, %eax348; CHECK-NEXT: ucomiss %xmm0, %xmm0349; CHECK-NEXT: cmovnpl %edx, %eax350; CHECK-NEXT: # kill: def $ax killed $ax killed $eax351; CHECK-NEXT: popq %rcx352; CHECK-NEXT: retq353entry:354 %conv = fptosi half %x to i32355 %0 = icmp slt i32 %conv, 32767356 %spec.store.select = select i1 %0, i32 %conv, i32 32767357 %1 = icmp sgt i32 %spec.store.select, -32768358 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768359 %conv6 = trunc i32 %spec.store.select7 to i16360 ret i16 %conv6361}362 363define i16 @utest_f16i16(half %x) nounwind {364; CHECK-LABEL: utest_f16i16:365; CHECK: # %bb.0: # %entry366; CHECK-NEXT: pushq %rax367; CHECK-NEXT: callq __extendhfsf2@PLT368; CHECK-NEXT: cvttss2si %xmm0, %rcx369; CHECK-NEXT: cmpl $65535, %ecx # imm = 0xFFFF370; CHECK-NEXT: movl $65535, %eax # imm = 0xFFFF371; CHECK-NEXT: cmovbl %ecx, %eax372; CHECK-NEXT: # kill: def $ax killed $ax killed $eax373; CHECK-NEXT: popq %rcx374; CHECK-NEXT: retq375entry:376 %conv = fptoui half %x to i32377 %0 = icmp ult i32 %conv, 65535378 %spec.store.select = select i1 %0, i32 %conv, i32 65535379 %conv6 = trunc i32 %spec.store.select to i16380 ret i16 %conv6381}382 383define i16 @ustest_f16i16(half %x) nounwind {384; CHECK-LABEL: ustest_f16i16:385; CHECK: # %bb.0: # %entry386; CHECK-NEXT: pushq %rax387; CHECK-NEXT: callq __extendhfsf2@PLT388; CHECK-NEXT: cvttss2si %xmm0, %eax389; CHECK-NEXT: cmpl $65535, %eax # imm = 0xFFFF390; CHECK-NEXT: movl $65535, %ecx # imm = 0xFFFF391; CHECK-NEXT: cmovll %eax, %ecx392; CHECK-NEXT: xorl %eax, %eax393; CHECK-NEXT: testl %ecx, %ecx394; CHECK-NEXT: cmovgl %ecx, %eax395; CHECK-NEXT: # kill: def $ax killed $ax killed $eax396; CHECK-NEXT: popq %rcx397; CHECK-NEXT: retq398entry:399 %conv = fptosi half %x to i32400 %0 = icmp slt i32 %conv, 65535401 %spec.store.select = select i1 %0, i32 %conv, i32 65535402 %1 = icmp sgt i32 %spec.store.select, 0403 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0404 %conv6 = trunc i32 %spec.store.select7 to i16405 ret i16 %conv6406}407 408; i64 saturate409 410define i64 @stest_f64i64(double %x) nounwind {411; CHECK-LABEL: stest_f64i64:412; CHECK: # %bb.0: # %entry413; CHECK-NEXT: cvttsd2si %xmm0, %rax414; CHECK-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0415; CHECK-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF416; CHECK-NEXT: cmovbeq %rax, %rcx417; CHECK-NEXT: xorl %eax, %eax418; CHECK-NEXT: ucomisd %xmm0, %xmm0419; CHECK-NEXT: cmovnpq %rcx, %rax420; CHECK-NEXT: retq421entry:422 %conv = fptosi double %x to i128423 %0 = icmp slt i128 %conv, 9223372036854775807424 %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807425 %1 = icmp sgt i128 %spec.store.select, -9223372036854775808426 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808427 %conv6 = trunc i128 %spec.store.select7 to i64428 ret i64 %conv6429}430 431define i64 @utest_f64i64(double %x) nounwind {432; CHECK-LABEL: utest_f64i64:433; CHECK: # %bb.0: # %entry434; CHECK-NEXT: pushq %rax435; CHECK-NEXT: callq __fixunsdfti@PLT436; CHECK-NEXT: xorl %ecx, %ecx437; CHECK-NEXT: testq %rdx, %rdx438; CHECK-NEXT: cmovneq %rcx, %rax439; CHECK-NEXT: popq %rcx440; CHECK-NEXT: retq441entry:442 %conv = fptoui double %x to i128443 %0 = icmp ult i128 %conv, 18446744073709551616444 %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616445 %conv6 = trunc i128 %spec.store.select to i64446 ret i64 %conv6447}448 449define i64 @ustest_f64i64(double %x) nounwind {450; CHECK-LABEL: ustest_f64i64:451; CHECK: # %bb.0: # %entry452; CHECK-NEXT: pushq %rax453; CHECK-NEXT: callq __fixdfti@PLT454; CHECK-NEXT: xorl %ecx, %ecx455; CHECK-NEXT: testq %rdx, %rdx456; CHECK-NEXT: movl $1, %esi457; CHECK-NEXT: cmovleq %rdx, %rsi458; CHECK-NEXT: cmovgq %rcx, %rax459; CHECK-NEXT: movq %rax, %rdx460; CHECK-NEXT: negq %rdx461; CHECK-NEXT: movl $0, %edx462; CHECK-NEXT: sbbq %rsi, %rdx463; CHECK-NEXT: cmovgeq %rcx, %rax464; CHECK-NEXT: popq %rcx465; CHECK-NEXT: retq466entry:467 %conv = fptosi double %x to i128468 %0 = icmp slt i128 %conv, 18446744073709551616469 %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616470 %1 = icmp sgt i128 %spec.store.select, 0471 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 0472 %conv6 = trunc i128 %spec.store.select7 to i64473 ret i64 %conv6474}475 476define i64 @stest_f32i64(float %x) nounwind {477; CHECK-LABEL: stest_f32i64:478; CHECK: # %bb.0: # %entry479; CHECK-NEXT: cvttss2si %xmm0, %rax480; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0481; CHECK-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF482; CHECK-NEXT: cmovbeq %rax, %rcx483; CHECK-NEXT: xorl %eax, %eax484; CHECK-NEXT: ucomiss %xmm0, %xmm0485; CHECK-NEXT: cmovnpq %rcx, %rax486; CHECK-NEXT: retq487entry:488 %conv = fptosi float %x to i128489 %0 = icmp slt i128 %conv, 9223372036854775807490 %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807491 %1 = icmp sgt i128 %spec.store.select, -9223372036854775808492 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808493 %conv6 = trunc i128 %spec.store.select7 to i64494 ret i64 %conv6495}496 497define i64 @utest_f32i64(float %x) nounwind {498; CHECK-LABEL: utest_f32i64:499; CHECK: # %bb.0: # %entry500; CHECK-NEXT: pushq %rax501; CHECK-NEXT: callq __fixunssfti@PLT502; CHECK-NEXT: xorl %ecx, %ecx503; CHECK-NEXT: testq %rdx, %rdx504; CHECK-NEXT: cmovneq %rcx, %rax505; CHECK-NEXT: popq %rcx506; CHECK-NEXT: retq507entry:508 %conv = fptoui float %x to i128509 %0 = icmp ult i128 %conv, 18446744073709551616510 %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616511 %conv6 = trunc i128 %spec.store.select to i64512 ret i64 %conv6513}514 515define i64 @ustest_f32i64(float %x) nounwind {516; CHECK-LABEL: ustest_f32i64:517; CHECK: # %bb.0: # %entry518; CHECK-NEXT: pushq %rax519; CHECK-NEXT: callq __fixsfti@PLT520; CHECK-NEXT: xorl %ecx, %ecx521; CHECK-NEXT: testq %rdx, %rdx522; CHECK-NEXT: movl $1, %esi523; CHECK-NEXT: cmovleq %rdx, %rsi524; CHECK-NEXT: cmovgq %rcx, %rax525; CHECK-NEXT: movq %rax, %rdx526; CHECK-NEXT: negq %rdx527; CHECK-NEXT: movl $0, %edx528; CHECK-NEXT: sbbq %rsi, %rdx529; CHECK-NEXT: cmovgeq %rcx, %rax530; CHECK-NEXT: popq %rcx531; CHECK-NEXT: retq532entry:533 %conv = fptosi float %x to i128534 %0 = icmp slt i128 %conv, 18446744073709551616535 %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616536 %1 = icmp sgt i128 %spec.store.select, 0537 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 0538 %conv6 = trunc i128 %spec.store.select7 to i64539 ret i64 %conv6540}541 542define i64 @stest_f16i64(half %x) nounwind {543; CHECK-LABEL: stest_f16i64:544; CHECK: # %bb.0: # %entry545; CHECK-NEXT: pushq %rax546; CHECK-NEXT: callq __extendhfsf2@PLT547; CHECK-NEXT: cvttss2si %xmm0, %rax548; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0549; CHECK-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000550; CHECK-NEXT: cmovaeq %rax, %rcx551; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0552; CHECK-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF553; CHECK-NEXT: cmovbeq %rcx, %rdx554; CHECK-NEXT: xorl %eax, %eax555; CHECK-NEXT: ucomiss %xmm0, %xmm0556; CHECK-NEXT: cmovnpq %rdx, %rax557; CHECK-NEXT: popq %rcx558; CHECK-NEXT: retq559entry:560 %conv = fptosi half %x to i128561 %0 = icmp slt i128 %conv, 9223372036854775807562 %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807563 %1 = icmp sgt i128 %spec.store.select, -9223372036854775808564 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808565 %conv6 = trunc i128 %spec.store.select7 to i64566 ret i64 %conv6567}568 569define i64 @utest_f16i64(half %x) nounwind {570; CHECK-LABEL: utest_f16i64:571; CHECK: # %bb.0: # %entry572; CHECK-NEXT: pushq %rax573; CHECK-NEXT: callq __fixunshfti@PLT574; CHECK-NEXT: xorl %ecx, %ecx575; CHECK-NEXT: testq %rdx, %rdx576; CHECK-NEXT: cmovneq %rcx, %rax577; CHECK-NEXT: popq %rcx578; CHECK-NEXT: retq579entry:580 %conv = fptoui half %x to i128581 %0 = icmp ult i128 %conv, 18446744073709551616582 %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616583 %conv6 = trunc i128 %spec.store.select to i64584 ret i64 %conv6585}586 587define i64 @ustest_f16i64(half %x) nounwind {588; CHECK-LABEL: ustest_f16i64:589; CHECK: # %bb.0: # %entry590; CHECK-NEXT: pushq %rax591; CHECK-NEXT: callq __fixhfti@PLT592; CHECK-NEXT: xorl %ecx, %ecx593; CHECK-NEXT: testq %rdx, %rdx594; CHECK-NEXT: movl $1, %esi595; CHECK-NEXT: cmovleq %rdx, %rsi596; CHECK-NEXT: cmovgq %rcx, %rax597; CHECK-NEXT: movq %rax, %rdx598; CHECK-NEXT: negq %rdx599; CHECK-NEXT: movl $0, %edx600; CHECK-NEXT: sbbq %rsi, %rdx601; CHECK-NEXT: cmovgeq %rcx, %rax602; CHECK-NEXT: popq %rcx603; CHECK-NEXT: retq604entry:605 %conv = fptosi half %x to i128606 %0 = icmp slt i128 %conv, 18446744073709551616607 %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616608 %1 = icmp sgt i128 %spec.store.select, 0609 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 0610 %conv6 = trunc i128 %spec.store.select7 to i64611 ret i64 %conv6612}613 614 615 616 617; i32 saturate618 619define i32 @stest_f64i32_mm(double %x) nounwind {620; CHECK-LABEL: stest_f64i32_mm:621; CHECK: # %bb.0: # %entry622; CHECK-NEXT: xorl %eax, %eax623; CHECK-NEXT: ucomisd %xmm0, %xmm0624; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0625; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0626; CHECK-NEXT: cvttsd2si %xmm0, %ecx627; CHECK-NEXT: cmovnpl %ecx, %eax628; CHECK-NEXT: retq629entry:630 %conv = fptosi double %x to i64631 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)632 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)633 %conv6 = trunc i64 %spec.store.select7 to i32634 ret i32 %conv6635}636 637define i32 @utest_f64i32_mm(double %x) nounwind {638; CHECK-LABEL: utest_f64i32_mm:639; CHECK: # %bb.0: # %entry640; CHECK-NEXT: cvttsd2si %xmm0, %rcx641; CHECK-NEXT: movq %rcx, %rdx642; CHECK-NEXT: sarq $63, %rdx643; CHECK-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0644; CHECK-NEXT: cvttsd2si %xmm0, %rax645; CHECK-NEXT: andq %rdx, %rax646; CHECK-NEXT: orq %rcx, %rax647; CHECK-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF648; CHECK-NEXT: cmpq %rcx, %rax649; CHECK-NEXT: cmovaeq %rcx, %rax650; CHECK-NEXT: # kill: def $eax killed $eax killed $rax651; CHECK-NEXT: retq652entry:653 %conv = fptoui double %x to i64654 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)655 %conv6 = trunc i64 %spec.store.select to i32656 ret i32 %conv6657}658 659define i32 @ustest_f64i32_mm(double %x) nounwind {660; CHECK-LABEL: ustest_f64i32_mm:661; CHECK: # %bb.0: # %entry662; CHECK-NEXT: cvttsd2si %xmm0, %rax663; CHECK-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF664; CHECK-NEXT: cmpq %rcx, %rax665; CHECK-NEXT: cmovlq %rax, %rcx666; CHECK-NEXT: xorl %eax, %eax667; CHECK-NEXT: testq %rcx, %rcx668; CHECK-NEXT: cmovgq %rcx, %rax669; CHECK-NEXT: # kill: def $eax killed $eax killed $rax670; CHECK-NEXT: retq671entry:672 %conv = fptosi double %x to i64673 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)674 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)675 %conv6 = trunc i64 %spec.store.select7 to i32676 ret i32 %conv6677}678 679define i32 @stest_f32i32_mm(float %x) nounwind {680; CHECK-LABEL: stest_f32i32_mm:681; CHECK: # %bb.0: # %entry682; CHECK-NEXT: cvttss2si %xmm0, %eax683; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0684; CHECK-NEXT: movl $2147483647, %ecx # imm = 0x7FFFFFFF685; CHECK-NEXT: cmovbel %eax, %ecx686; CHECK-NEXT: xorl %eax, %eax687; CHECK-NEXT: ucomiss %xmm0, %xmm0688; CHECK-NEXT: cmovnpl %ecx, %eax689; CHECK-NEXT: retq690entry:691 %conv = fptosi float %x to i64692 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)693 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)694 %conv6 = trunc i64 %spec.store.select7 to i32695 ret i32 %conv6696}697 698define i32 @utest_f32i32_mm(float %x) nounwind {699; CHECK-LABEL: utest_f32i32_mm:700; CHECK: # %bb.0: # %entry701; CHECK-NEXT: cvttss2si %xmm0, %rcx702; CHECK-NEXT: movq %rcx, %rdx703; CHECK-NEXT: sarq $63, %rdx704; CHECK-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0705; CHECK-NEXT: cvttss2si %xmm0, %rax706; CHECK-NEXT: andq %rdx, %rax707; CHECK-NEXT: orq %rcx, %rax708; CHECK-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF709; CHECK-NEXT: cmpq %rcx, %rax710; CHECK-NEXT: cmovaeq %rcx, %rax711; CHECK-NEXT: # kill: def $eax killed $eax killed $rax712; CHECK-NEXT: retq713entry:714 %conv = fptoui float %x to i64715 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)716 %conv6 = trunc i64 %spec.store.select to i32717 ret i32 %conv6718}719 720define i32 @ustest_f32i32_mm(float %x) nounwind {721; CHECK-LABEL: ustest_f32i32_mm:722; CHECK: # %bb.0: # %entry723; CHECK-NEXT: cvttss2si %xmm0, %rax724; CHECK-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF725; CHECK-NEXT: cmpq %rcx, %rax726; CHECK-NEXT: cmovlq %rax, %rcx727; CHECK-NEXT: xorl %eax, %eax728; CHECK-NEXT: testq %rcx, %rcx729; CHECK-NEXT: cmovgq %rcx, %rax730; CHECK-NEXT: # kill: def $eax killed $eax killed $rax731; CHECK-NEXT: retq732entry:733 %conv = fptosi float %x to i64734 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)735 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)736 %conv6 = trunc i64 %spec.store.select7 to i32737 ret i32 %conv6738}739 740define i32 @stest_f16i32_mm(half %x) nounwind {741; CHECK-LABEL: stest_f16i32_mm:742; CHECK: # %bb.0: # %entry743; CHECK-NEXT: pushq %rax744; CHECK-NEXT: callq __extendhfsf2@PLT745; CHECK-NEXT: cvttss2si %xmm0, %eax746; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0747; CHECK-NEXT: movl $-2147483648, %ecx # imm = 0x80000000748; CHECK-NEXT: cmovael %eax, %ecx749; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0750; CHECK-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF751; CHECK-NEXT: cmovbel %ecx, %edx752; CHECK-NEXT: xorl %eax, %eax753; CHECK-NEXT: ucomiss %xmm0, %xmm0754; CHECK-NEXT: cmovnpl %edx, %eax755; CHECK-NEXT: popq %rcx756; CHECK-NEXT: retq757entry:758 %conv = fptosi half %x to i64759 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)760 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)761 %conv6 = trunc i64 %spec.store.select7 to i32762 ret i32 %conv6763}764 765define i32 @utest_f16i32_mm(half %x) nounwind {766; CHECK-LABEL: utest_f16i32_mm:767; CHECK: # %bb.0: # %entry768; CHECK-NEXT: pushq %rax769; CHECK-NEXT: callq __extendhfsf2@PLT770; CHECK-NEXT: cvttss2si %xmm0, %rcx771; CHECK-NEXT: movq %rcx, %rdx772; CHECK-NEXT: sarq $63, %rdx773; CHECK-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0774; CHECK-NEXT: cvttss2si %xmm0, %rax775; CHECK-NEXT: andq %rdx, %rax776; CHECK-NEXT: orq %rcx, %rax777; CHECK-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF778; CHECK-NEXT: cmpq %rcx, %rax779; CHECK-NEXT: cmovaeq %rcx, %rax780; CHECK-NEXT: # kill: def $eax killed $eax killed $rax781; CHECK-NEXT: popq %rcx782; CHECK-NEXT: retq783entry:784 %conv = fptoui half %x to i64785 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)786 %conv6 = trunc i64 %spec.store.select to i32787 ret i32 %conv6788}789 790define i32 @ustest_f16i32_mm(half %x) nounwind {791; CHECK-LABEL: ustest_f16i32_mm:792; CHECK: # %bb.0: # %entry793; CHECK-NEXT: pushq %rax794; CHECK-NEXT: callq __extendhfsf2@PLT795; CHECK-NEXT: cvttss2si %xmm0, %rax796; CHECK-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF797; CHECK-NEXT: cmpq %rcx, %rax798; CHECK-NEXT: cmovlq %rax, %rcx799; CHECK-NEXT: xorl %eax, %eax800; CHECK-NEXT: testq %rcx, %rcx801; CHECK-NEXT: cmovgq %rcx, %rax802; CHECK-NEXT: # kill: def $eax killed $eax killed $rax803; CHECK-NEXT: popq %rcx804; CHECK-NEXT: retq805entry:806 %conv = fptosi half %x to i64807 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)808 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)809 %conv6 = trunc i64 %spec.store.select7 to i32810 ret i32 %conv6811}812 813; i16 saturate814 815define i16 @stest_f64i16_mm(double %x) nounwind {816; CHECK-LABEL: stest_f64i16_mm:817; CHECK: # %bb.0: # %entry818; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-3.2768E+4,0.0E+0]819; CHECK-NEXT: maxsd %xmm0, %xmm1820; CHECK-NEXT: movsd {{.*#+}} xmm0 = [3.2767E+4,0.0E+0]821; CHECK-NEXT: minsd %xmm1, %xmm0822; CHECK-NEXT: cvttsd2si %xmm0, %eax823; CHECK-NEXT: # kill: def $ax killed $ax killed $eax824; CHECK-NEXT: retq825entry:826 %conv = fptosi double %x to i32827 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)828 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)829 %conv6 = trunc i32 %spec.store.select7 to i16830 ret i16 %conv6831}832 833define i16 @utest_f64i16_mm(double %x) nounwind {834; CHECK-LABEL: utest_f64i16_mm:835; CHECK: # %bb.0: # %entry836; CHECK-NEXT: cvttsd2si %xmm0, %rcx837; CHECK-NEXT: cmpl $65535, %ecx # imm = 0xFFFF838; CHECK-NEXT: movl $65535, %eax # imm = 0xFFFF839; CHECK-NEXT: cmovbl %ecx, %eax840; CHECK-NEXT: # kill: def $ax killed $ax killed $eax841; CHECK-NEXT: retq842entry:843 %conv = fptoui double %x to i32844 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)845 %conv6 = trunc i32 %spec.store.select to i16846 ret i16 %conv6847}848 849define i16 @ustest_f64i16_mm(double %x) nounwind {850; CHECK-LABEL: ustest_f64i16_mm:851; CHECK: # %bb.0: # %entry852; CHECK-NEXT: cvttsd2si %xmm0, %eax853; CHECK-NEXT: cmpl $65535, %eax # imm = 0xFFFF854; CHECK-NEXT: movl $65535, %ecx # imm = 0xFFFF855; CHECK-NEXT: cmovll %eax, %ecx856; CHECK-NEXT: xorl %eax, %eax857; CHECK-NEXT: testl %ecx, %ecx858; CHECK-NEXT: cmovgl %ecx, %eax859; CHECK-NEXT: # kill: def $ax killed $ax killed $eax860; CHECK-NEXT: retq861entry:862 %conv = fptosi double %x to i32863 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)864 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)865 %conv6 = trunc i32 %spec.store.select7 to i16866 ret i16 %conv6867}868 869define i16 @stest_f32i16_mm(float %x) nounwind {870; CHECK-LABEL: stest_f32i16_mm:871; CHECK: # %bb.0: # %entry872; CHECK-NEXT: movss {{.*#+}} xmm1 = [-3.2768E+4,0.0E+0,0.0E+0,0.0E+0]873; CHECK-NEXT: maxss %xmm0, %xmm1874; CHECK-NEXT: movss {{.*#+}} xmm0 = [3.2767E+4,0.0E+0,0.0E+0,0.0E+0]875; CHECK-NEXT: minss %xmm1, %xmm0876; CHECK-NEXT: cvttss2si %xmm0, %eax877; CHECK-NEXT: # kill: def $ax killed $ax killed $eax878; CHECK-NEXT: retq879entry:880 %conv = fptosi float %x to i32881 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)882 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)883 %conv6 = trunc i32 %spec.store.select7 to i16884 ret i16 %conv6885}886 887define i16 @utest_f32i16_mm(float %x) nounwind {888; CHECK-LABEL: utest_f32i16_mm:889; CHECK: # %bb.0: # %entry890; CHECK-NEXT: cvttss2si %xmm0, %rcx891; CHECK-NEXT: cmpl $65535, %ecx # imm = 0xFFFF892; CHECK-NEXT: movl $65535, %eax # imm = 0xFFFF893; CHECK-NEXT: cmovbl %ecx, %eax894; CHECK-NEXT: # kill: def $ax killed $ax killed $eax895; CHECK-NEXT: retq896entry:897 %conv = fptoui float %x to i32898 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)899 %conv6 = trunc i32 %spec.store.select to i16900 ret i16 %conv6901}902 903define i16 @ustest_f32i16_mm(float %x) nounwind {904; CHECK-LABEL: ustest_f32i16_mm:905; CHECK: # %bb.0: # %entry906; CHECK-NEXT: cvttss2si %xmm0, %eax907; CHECK-NEXT: cmpl $65535, %eax # imm = 0xFFFF908; CHECK-NEXT: movl $65535, %ecx # imm = 0xFFFF909; CHECK-NEXT: cmovll %eax, %ecx910; CHECK-NEXT: xorl %eax, %eax911; CHECK-NEXT: testl %ecx, %ecx912; CHECK-NEXT: cmovgl %ecx, %eax913; CHECK-NEXT: # kill: def $ax killed $ax killed $eax914; CHECK-NEXT: retq915entry:916 %conv = fptosi float %x to i32917 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)918 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)919 %conv6 = trunc i32 %spec.store.select7 to i16920 ret i16 %conv6921}922 923define i16 @stest_f16i16_mm(half %x) nounwind {924; CHECK-LABEL: stest_f16i16_mm:925; CHECK: # %bb.0: # %entry926; CHECK-NEXT: pushq %rax927; CHECK-NEXT: callq __extendhfsf2@PLT928; CHECK-NEXT: cvttss2si %xmm0, %eax929; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0930; CHECK-NEXT: movl $32768, %ecx # imm = 0x8000931; CHECK-NEXT: cmovael %eax, %ecx932; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0933; CHECK-NEXT: movl $32767, %edx # imm = 0x7FFF934; CHECK-NEXT: cmovbel %ecx, %edx935; CHECK-NEXT: xorl %eax, %eax936; CHECK-NEXT: ucomiss %xmm0, %xmm0937; CHECK-NEXT: cmovnpl %edx, %eax938; CHECK-NEXT: # kill: def $ax killed $ax killed $eax939; CHECK-NEXT: popq %rcx940; CHECK-NEXT: retq941entry:942 %conv = fptosi half %x to i32943 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)944 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)945 %conv6 = trunc i32 %spec.store.select7 to i16946 ret i16 %conv6947}948 949define i16 @utest_f16i16_mm(half %x) nounwind {950; CHECK-LABEL: utest_f16i16_mm:951; CHECK: # %bb.0: # %entry952; CHECK-NEXT: pushq %rax953; CHECK-NEXT: callq __extendhfsf2@PLT954; CHECK-NEXT: cvttss2si %xmm0, %rcx955; CHECK-NEXT: cmpl $65535, %ecx # imm = 0xFFFF956; CHECK-NEXT: movl $65535, %eax # imm = 0xFFFF957; CHECK-NEXT: cmovbl %ecx, %eax958; CHECK-NEXT: # kill: def $ax killed $ax killed $eax959; CHECK-NEXT: popq %rcx960; CHECK-NEXT: retq961entry:962 %conv = fptoui half %x to i32963 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)964 %conv6 = trunc i32 %spec.store.select to i16965 ret i16 %conv6966}967 968define i16 @ustest_f16i16_mm(half %x) nounwind {969; CHECK-LABEL: ustest_f16i16_mm:970; CHECK: # %bb.0: # %entry971; CHECK-NEXT: pushq %rax972; CHECK-NEXT: callq __extendhfsf2@PLT973; CHECK-NEXT: cvttss2si %xmm0, %eax974; CHECK-NEXT: cmpl $65535, %eax # imm = 0xFFFF975; CHECK-NEXT: movl $65535, %ecx # imm = 0xFFFF976; CHECK-NEXT: cmovll %eax, %ecx977; CHECK-NEXT: xorl %eax, %eax978; CHECK-NEXT: testl %ecx, %ecx979; CHECK-NEXT: cmovgl %ecx, %eax980; CHECK-NEXT: # kill: def $ax killed $ax killed $eax981; CHECK-NEXT: popq %rcx982; CHECK-NEXT: retq983entry:984 %conv = fptosi half %x to i32985 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)986 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)987 %conv6 = trunc i32 %spec.store.select7 to i16988 ret i16 %conv6989}990 991; i64 saturate992 993define i64 @stest_f64i64_mm(double %x) nounwind {994; CHECK-LABEL: stest_f64i64_mm:995; CHECK: # %bb.0: # %entry996; CHECK-NEXT: cvttsd2si %xmm0, %rax997; CHECK-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0998; CHECK-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF999; CHECK-NEXT: cmovbeq %rax, %rcx1000; CHECK-NEXT: xorl %eax, %eax1001; CHECK-NEXT: ucomisd %xmm0, %xmm01002; CHECK-NEXT: cmovnpq %rcx, %rax1003; CHECK-NEXT: retq1004entry:1005 %conv = fptosi double %x to i1281006 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)1007 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)1008 %conv6 = trunc i128 %spec.store.select7 to i641009 ret i64 %conv61010}1011 1012define i64 @utest_f64i64_mm(double %x) nounwind {1013; CHECK-LABEL: utest_f64i64_mm:1014; CHECK: # %bb.0: # %entry1015; CHECK-NEXT: pushq %rax1016; CHECK-NEXT: callq __fixunsdfti@PLT1017; CHECK-NEXT: xorl %ecx, %ecx1018; CHECK-NEXT: testq %rdx, %rdx1019; CHECK-NEXT: cmovneq %rcx, %rax1020; CHECK-NEXT: popq %rcx1021; CHECK-NEXT: retq1022entry:1023 %conv = fptoui double %x to i1281024 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)1025 %conv6 = trunc i128 %spec.store.select to i641026 ret i64 %conv61027}1028 1029define i64 @ustest_f64i64_mm(double %x) nounwind {1030; CHECK-LABEL: ustest_f64i64_mm:1031; CHECK: # %bb.0: # %entry1032; CHECK-NEXT: pushq %rax1033; CHECK-NEXT: callq __fixdfti@PLT1034; CHECK-NEXT: xorl %ecx, %ecx1035; CHECK-NEXT: testq %rdx, %rdx1036; CHECK-NEXT: cmovgq %rcx, %rax1037; CHECK-NEXT: movl $1, %esi1038; CHECK-NEXT: cmovleq %rdx, %rsi1039; CHECK-NEXT: testq %rsi, %rsi1040; CHECK-NEXT: cmovsq %rcx, %rax1041; CHECK-NEXT: popq %rcx1042; CHECK-NEXT: retq1043entry:1044 %conv = fptosi double %x to i1281045 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)1046 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)1047 %conv6 = trunc i128 %spec.store.select7 to i641048 ret i64 %conv61049}1050 1051define i64 @stest_f32i64_mm(float %x) nounwind {1052; CHECK-LABEL: stest_f32i64_mm:1053; CHECK: # %bb.0: # %entry1054; CHECK-NEXT: cvttss2si %xmm0, %rax1055; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01056; CHECK-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF1057; CHECK-NEXT: cmovbeq %rax, %rcx1058; CHECK-NEXT: xorl %eax, %eax1059; CHECK-NEXT: ucomiss %xmm0, %xmm01060; CHECK-NEXT: cmovnpq %rcx, %rax1061; CHECK-NEXT: retq1062entry:1063 %conv = fptosi float %x to i1281064 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)1065 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)1066 %conv6 = trunc i128 %spec.store.select7 to i641067 ret i64 %conv61068}1069 1070define i64 @utest_f32i64_mm(float %x) nounwind {1071; CHECK-LABEL: utest_f32i64_mm:1072; CHECK: # %bb.0: # %entry1073; CHECK-NEXT: pushq %rax1074; CHECK-NEXT: callq __fixunssfti@PLT1075; CHECK-NEXT: xorl %ecx, %ecx1076; CHECK-NEXT: testq %rdx, %rdx1077; CHECK-NEXT: cmovneq %rcx, %rax1078; CHECK-NEXT: popq %rcx1079; CHECK-NEXT: retq1080entry:1081 %conv = fptoui float %x to i1281082 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)1083 %conv6 = trunc i128 %spec.store.select to i641084 ret i64 %conv61085}1086 1087define i64 @ustest_f32i64_mm(float %x) nounwind {1088; CHECK-LABEL: ustest_f32i64_mm:1089; CHECK: # %bb.0: # %entry1090; CHECK-NEXT: pushq %rax1091; CHECK-NEXT: callq __fixsfti@PLT1092; CHECK-NEXT: xorl %ecx, %ecx1093; CHECK-NEXT: testq %rdx, %rdx1094; CHECK-NEXT: cmovgq %rcx, %rax1095; CHECK-NEXT: movl $1, %esi1096; CHECK-NEXT: cmovleq %rdx, %rsi1097; CHECK-NEXT: testq %rsi, %rsi1098; CHECK-NEXT: cmovsq %rcx, %rax1099; CHECK-NEXT: popq %rcx1100; CHECK-NEXT: retq1101entry:1102 %conv = fptosi float %x to i1281103 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)1104 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)1105 %conv6 = trunc i128 %spec.store.select7 to i641106 ret i64 %conv61107}1108 1109define i64 @stest_f16i64_mm(half %x) nounwind {1110; CHECK-LABEL: stest_f16i64_mm:1111; CHECK: # %bb.0: # %entry1112; CHECK-NEXT: pushq %rax1113; CHECK-NEXT: callq __extendhfsf2@PLT1114; CHECK-NEXT: cvttss2si %xmm0, %rax1115; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01116; CHECK-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x80000000000000001117; CHECK-NEXT: cmovaeq %rax, %rcx1118; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01119; CHECK-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF1120; CHECK-NEXT: cmovbeq %rcx, %rdx1121; CHECK-NEXT: xorl %eax, %eax1122; CHECK-NEXT: ucomiss %xmm0, %xmm01123; CHECK-NEXT: cmovnpq %rdx, %rax1124; CHECK-NEXT: popq %rcx1125; CHECK-NEXT: retq1126entry:1127 %conv = fptosi half %x to i1281128 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)1129 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)1130 %conv6 = trunc i128 %spec.store.select7 to i641131 ret i64 %conv61132}1133 1134define i64 @utest_f16i64_mm(half %x) nounwind {1135; CHECK-LABEL: utest_f16i64_mm:1136; CHECK: # %bb.0: # %entry1137; CHECK-NEXT: pushq %rax1138; CHECK-NEXT: callq __fixunshfti@PLT1139; CHECK-NEXT: xorl %ecx, %ecx1140; CHECK-NEXT: testq %rdx, %rdx1141; CHECK-NEXT: cmovneq %rcx, %rax1142; CHECK-NEXT: popq %rcx1143; CHECK-NEXT: retq1144entry:1145 %conv = fptoui half %x to i1281146 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)1147 %conv6 = trunc i128 %spec.store.select to i641148 ret i64 %conv61149}1150 1151define i64 @ustest_f16i64_mm(half %x) nounwind {1152; CHECK-LABEL: ustest_f16i64_mm:1153; CHECK: # %bb.0: # %entry1154; CHECK-NEXT: pushq %rax1155; CHECK-NEXT: callq __fixhfti@PLT1156; CHECK-NEXT: xorl %ecx, %ecx1157; CHECK-NEXT: testq %rdx, %rdx1158; CHECK-NEXT: cmovgq %rcx, %rax1159; CHECK-NEXT: movl $1, %esi1160; CHECK-NEXT: cmovleq %rdx, %rsi1161; CHECK-NEXT: testq %rsi, %rsi1162; CHECK-NEXT: cmovsq %rcx, %rax1163; CHECK-NEXT: popq %rcx1164; CHECK-NEXT: retq1165entry:1166 %conv = fptosi half %x to i1281167 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)1168 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)1169 %conv6 = trunc i128 %spec.store.select7 to i641170 ret i64 %conv61171}1172 1173; i32 non saturate1174 1175define i32 @ustest_f16i32_nsat(half %x) nounwind {1176; CHECK-LABEL: ustest_f16i32_nsat:1177; CHECK: # %bb.0:1178; CHECK-NEXT: pushq %rax1179; CHECK-NEXT: callq __extendhfsf2@PLT1180; CHECK-NEXT: cvttss2si %xmm0, %ecx1181; CHECK-NEXT: movl %ecx, %eax1182; CHECK-NEXT: sarl $31, %eax1183; CHECK-NEXT: xorl %edx, %edx1184; CHECK-NEXT: andl %ecx, %eax1185; CHECK-NEXT: cmovlel %edx, %eax1186; CHECK-NEXT: popq %rcx1187; CHECK-NEXT: retq1188 %conv = fptosi half %x to i321189 %spec.store.select = call i32 @llvm.smin.i32(i32 0, i32 %conv)1190 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)1191 ret i32 %spec.store.select71192}1193 1194declare i32 @llvm.smin.i32(i32, i32)1195declare i32 @llvm.smax.i32(i32, i32)1196declare i32 @llvm.umin.i32(i32, i32)1197declare i64 @llvm.smin.i64(i64, i64)1198declare i64 @llvm.smax.i64(i64, i64)1199declare i64 @llvm.umin.i64(i64, i64)1200declare i128 @llvm.smin.i128(i128, i128)1201declare i128 @llvm.smax.i128(i128, i128)1202declare i128 @llvm.umin.i128(i128, i128)1203