brintos

brintos / llvm-project-archived public Read only

0
0
Text · 41.3 KiB · 67483be Raw
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