brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.2 KiB · 8c7078c Raw
535 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X864 5declare  i4  @llvm.umul.fix.sat.i4   (i4,  i4, i32)6declare  i32 @llvm.umul.fix.sat.i32  (i32, i32, i32)7declare  i64 @llvm.umul.fix.sat.i64  (i64, i64, i32)8declare  <4 x i32> @llvm.umul.fix.sat.v4i32(<4 x i32>, <4 x i32>, i32)9 10define i32 @func(i32 %x, i32 %y) nounwind {11; X64-LABEL: func:12; X64:       # %bb.0:13; X64-NEXT:    movl %esi, %eax14; X64-NEXT:    movl %edi, %ecx15; X64-NEXT:    imulq %rax, %rcx16; X64-NEXT:    movq %rcx, %rax17; X64-NEXT:    shrq $32, %rax18; X64-NEXT:    shrdl $2, %eax, %ecx19; X64-NEXT:    cmpl $4, %eax20; X64-NEXT:    movl $-1, %eax21; X64-NEXT:    cmovbl %ecx, %eax22; X64-NEXT:    retq23;24; X86-LABEL: func:25; X86:       # %bb.0:26; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax27; X86-NEXT:    mull {{[0-9]+}}(%esp)28; X86-NEXT:    shrdl $2, %edx, %eax29; X86-NEXT:    cmpl $4, %edx30; X86-NEXT:    movl $-1, %ecx31; X86-NEXT:    cmovael %ecx, %eax32; X86-NEXT:    retl33  %tmp = call i32 @llvm.umul.fix.sat.i32(i32 %x, i32 %y, i32 2)34  ret i32 %tmp35}36 37define i64 @func2(i64 %x, i64 %y) nounwind {38; X64-LABEL: func2:39; X64:       # %bb.0:40; X64-NEXT:    movq %rdi, %rax41; X64-NEXT:    mulq %rsi42; X64-NEXT:    shrdq $2, %rdx, %rax43; X64-NEXT:    cmpq $4, %rdx44; X64-NEXT:    movq $-1, %rcx45; X64-NEXT:    cmovaeq %rcx, %rax46; X64-NEXT:    retq47;48; X86-LABEL: func2:49; X86:       # %bb.0:50; X86-NEXT:    pushl %ebp51; X86-NEXT:    pushl %ebx52; X86-NEXT:    pushl %edi53; X86-NEXT:    pushl %esi54; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx55; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi56; X86-NEXT:    movl %ecx, %eax57; X86-NEXT:    mull %edi58; X86-NEXT:    movl %edx, %esi59; X86-NEXT:    movl %eax, %ebx60; X86-NEXT:    movl %ecx, %eax61; X86-NEXT:    mull {{[0-9]+}}(%esp)62; X86-NEXT:    movl %eax, %ecx63; X86-NEXT:    addl %edx, %ebx64; X86-NEXT:    adcl $0, %esi65; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax66; X86-NEXT:    mull %edi67; X86-NEXT:    movl %edx, %edi68; X86-NEXT:    movl %eax, %ebp69; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax70; X86-NEXT:    mull {{[0-9]+}}(%esp)71; X86-NEXT:    addl %ebx, %eax72; X86-NEXT:    adcl %esi, %edx73; X86-NEXT:    adcl $0, %edi74; X86-NEXT:    addl %ebp, %edx75; X86-NEXT:    adcl $0, %edi76; X86-NEXT:    shrdl $2, %eax, %ecx77; X86-NEXT:    shrdl $2, %edx, %eax78; X86-NEXT:    shrl $2, %edx79; X86-NEXT:    orl %edi, %edx80; X86-NEXT:    movl $-1, %edx81; X86-NEXT:    cmovnel %edx, %ecx82; X86-NEXT:    cmovel %eax, %edx83; X86-NEXT:    movl %ecx, %eax84; X86-NEXT:    popl %esi85; X86-NEXT:    popl %edi86; X86-NEXT:    popl %ebx87; X86-NEXT:    popl %ebp88; X86-NEXT:    retl89  %tmp = call i64 @llvm.umul.fix.sat.i64(i64 %x, i64 %y, i32 2)90  ret i64 %tmp91}92 93define i4 @func3(i4 %x, i4 %y) nounwind {94; X64-LABEL: func3:95; X64:       # %bb.0:96; X64-NEXT:    andl $15, %esi97; X64-NEXT:    shlb $4, %dil98; X64-NEXT:    movzbl %dil, %eax99; X64-NEXT:    imull %esi, %eax100; X64-NEXT:    movl %eax, %ecx101; X64-NEXT:    shrb $2, %cl102; X64-NEXT:    shrl $8, %eax103; X64-NEXT:    movl %eax, %edx104; X64-NEXT:    shlb $6, %dl105; X64-NEXT:    orb %cl, %dl106; X64-NEXT:    movzbl %dl, %ecx107; X64-NEXT:    cmpb $4, %al108; X64-NEXT:    movl $255, %eax109; X64-NEXT:    cmovbl %ecx, %eax110; X64-NEXT:    shrb $4, %al111; X64-NEXT:    # kill: def $al killed $al killed $eax112; X64-NEXT:    retq113;114; X86-LABEL: func3:115; X86:       # %bb.0:116; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax117; X86-NEXT:    andb $15, %al118; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx119; X86-NEXT:    movzbl %al, %edx120; X86-NEXT:    shlb $4, %cl121; X86-NEXT:    movzbl %cl, %eax122; X86-NEXT:    imull %edx, %eax123; X86-NEXT:    movb %ah, %cl124; X86-NEXT:    shlb $6, %cl125; X86-NEXT:    shrb $2, %al126; X86-NEXT:    orb %cl, %al127; X86-NEXT:    movzbl %al, %ecx128; X86-NEXT:    cmpb $4, %ah129; X86-NEXT:    movl $255, %eax130; X86-NEXT:    cmovbl %ecx, %eax131; X86-NEXT:    shrb $4, %al132; X86-NEXT:    # kill: def $al killed $al killed $eax133; X86-NEXT:    retl134  %tmp = call i4 @llvm.umul.fix.sat.i4(i4 %x, i4 %y, i32 2)135  ret i4 %tmp136}137 138define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {139; X64-LABEL: vec:140; X64:       # %bb.0:141; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]142; X64-NEXT:    movd %xmm2, %eax143; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]144; X64-NEXT:    movd %xmm2, %ecx145; X64-NEXT:    imulq %rax, %rcx146; X64-NEXT:    movq %rcx, %rax147; X64-NEXT:    shrq $32, %rax148; X64-NEXT:    shrdl $2, %eax, %ecx149; X64-NEXT:    cmpl $4, %eax150; X64-NEXT:    movl $-1, %eax151; X64-NEXT:    cmovael %eax, %ecx152; X64-NEXT:    movd %ecx, %xmm2153; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]154; X64-NEXT:    movd %xmm3, %ecx155; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]156; X64-NEXT:    movd %xmm3, %edx157; X64-NEXT:    imulq %rcx, %rdx158; X64-NEXT:    movq %rdx, %rcx159; X64-NEXT:    shrq $32, %rcx160; X64-NEXT:    shrdl $2, %ecx, %edx161; X64-NEXT:    cmpl $4, %ecx162; X64-NEXT:    cmovael %eax, %edx163; X64-NEXT:    movd %edx, %xmm3164; X64-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]165; X64-NEXT:    movd %xmm1, %ecx166; X64-NEXT:    movd %xmm0, %edx167; X64-NEXT:    imulq %rcx, %rdx168; X64-NEXT:    movq %rdx, %rcx169; X64-NEXT:    shrq $32, %rcx170; X64-NEXT:    shrdl $2, %ecx, %edx171; X64-NEXT:    cmpl $4, %ecx172; X64-NEXT:    cmovael %eax, %edx173; X64-NEXT:    movd %edx, %xmm2174; X64-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]175; X64-NEXT:    movd %xmm1, %ecx176; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]177; X64-NEXT:    movd %xmm0, %edx178; X64-NEXT:    imulq %rcx, %rdx179; X64-NEXT:    movq %rdx, %rcx180; X64-NEXT:    shrq $32, %rcx181; X64-NEXT:    shrdl $2, %ecx, %edx182; X64-NEXT:    cmpl $4, %ecx183; X64-NEXT:    cmovael %eax, %edx184; X64-NEXT:    movd %edx, %xmm0185; X64-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]186; X64-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]187; X64-NEXT:    movdqa %xmm2, %xmm0188; X64-NEXT:    retq189;190; X86-LABEL: vec:191; X86:       # %bb.0:192; X86-NEXT:    pushl %ebp193; X86-NEXT:    pushl %ebx194; X86-NEXT:    pushl %edi195; X86-NEXT:    pushl %esi196; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi197; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp198; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx199; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax200; X86-NEXT:    mull {{[0-9]+}}(%esp)201; X86-NEXT:    movl %eax, %esi202; X86-NEXT:    shrdl $2, %edx, %esi203; X86-NEXT:    cmpl $4, %edx204; X86-NEXT:    movl $-1, %ecx205; X86-NEXT:    cmovael %ecx, %esi206; X86-NEXT:    movl %ebx, %eax207; X86-NEXT:    mull {{[0-9]+}}(%esp)208; X86-NEXT:    movl %eax, %ebx209; X86-NEXT:    shrdl $2, %edx, %ebx210; X86-NEXT:    cmpl $4, %edx211; X86-NEXT:    cmovael %ecx, %ebx212; X86-NEXT:    movl %ebp, %eax213; X86-NEXT:    mull {{[0-9]+}}(%esp)214; X86-NEXT:    movl %eax, %ebp215; X86-NEXT:    shrdl $2, %edx, %ebp216; X86-NEXT:    cmpl $4, %edx217; X86-NEXT:    cmovael %ecx, %ebp218; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax219; X86-NEXT:    mull {{[0-9]+}}(%esp)220; X86-NEXT:    shrdl $2, %edx, %eax221; X86-NEXT:    cmpl $4, %edx222; X86-NEXT:    cmovael %ecx, %eax223; X86-NEXT:    movl %eax, 12(%edi)224; X86-NEXT:    movl %ebp, 8(%edi)225; X86-NEXT:    movl %ebx, 4(%edi)226; X86-NEXT:    movl %esi, (%edi)227; X86-NEXT:    movl %edi, %eax228; X86-NEXT:    popl %esi229; X86-NEXT:    popl %edi230; X86-NEXT:    popl %ebx231; X86-NEXT:    popl %ebp232; X86-NEXT:    retl $4233  %tmp = call <4 x i32> @llvm.umul.fix.sat.v4i32(<4 x i32> %x, <4 x i32> %y, i32 2)234  ret <4 x i32> %tmp235}236 237; These result in regular integer multiplication238define i32 @func4(i32 %x, i32 %y) nounwind {239; X64-LABEL: func4:240; X64:       # %bb.0:241; X64-NEXT:    movl %edi, %eax242; X64-NEXT:    mull %esi243; X64-NEXT:    movl $-1, %ecx244; X64-NEXT:    cmovol %ecx, %eax245; X64-NEXT:    retq246;247; X86-LABEL: func4:248; X86:       # %bb.0:249; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax250; X86-NEXT:    mull {{[0-9]+}}(%esp)251; X86-NEXT:    movl $-1, %ecx252; X86-NEXT:    cmovol %ecx, %eax253; X86-NEXT:    retl254  %tmp = call i32 @llvm.umul.fix.sat.i32(i32 %x, i32 %y, i32 0)255  ret i32 %tmp256}257 258define i64 @func5(i64 %x, i64 %y) {259; X64-LABEL: func5:260; X64:       # %bb.0:261; X64-NEXT:    movq %rdi, %rax262; X64-NEXT:    mulq %rsi263; X64-NEXT:    movq $-1, %rcx264; X64-NEXT:    cmovoq %rcx, %rax265; X64-NEXT:    retq266;267; X86-LABEL: func5:268; X86:       # %bb.0:269; X86-NEXT:    pushl %ebp270; X86-NEXT:    .cfi_def_cfa_offset 8271; X86-NEXT:    pushl %ebx272; X86-NEXT:    .cfi_def_cfa_offset 12273; X86-NEXT:    pushl %edi274; X86-NEXT:    .cfi_def_cfa_offset 16275; X86-NEXT:    pushl %esi276; X86-NEXT:    .cfi_def_cfa_offset 20277; X86-NEXT:    .cfi_offset %esi, -20278; X86-NEXT:    .cfi_offset %edi, -16279; X86-NEXT:    .cfi_offset %ebx, -12280; X86-NEXT:    .cfi_offset %ebp, -8281; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp282; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax283; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi284; X86-NEXT:    testl %esi, %esi285; X86-NEXT:    setne %dl286; X86-NEXT:    testl %eax, %eax287; X86-NEXT:    setne %cl288; X86-NEXT:    andb %dl, %cl289; X86-NEXT:    mull {{[0-9]+}}(%esp)290; X86-NEXT:    movl %eax, %edi291; X86-NEXT:    seto %bl292; X86-NEXT:    movl %esi, %eax293; X86-NEXT:    mull %ebp294; X86-NEXT:    seto %ch295; X86-NEXT:    orb %bl, %ch296; X86-NEXT:    orb %cl, %ch297; X86-NEXT:    leal (%edi,%eax), %esi298; X86-NEXT:    movl %ebp, %eax299; X86-NEXT:    mull {{[0-9]+}}(%esp)300; X86-NEXT:    addl %esi, %edx301; X86-NEXT:    setb %cl302; X86-NEXT:    orb %ch, %cl303; X86-NEXT:    movl $-1, %ecx304; X86-NEXT:    cmovnel %ecx, %eax305; X86-NEXT:    cmovnel %ecx, %edx306; X86-NEXT:    popl %esi307; X86-NEXT:    .cfi_def_cfa_offset 16308; X86-NEXT:    popl %edi309; X86-NEXT:    .cfi_def_cfa_offset 12310; X86-NEXT:    popl %ebx311; X86-NEXT:    .cfi_def_cfa_offset 8312; X86-NEXT:    popl %ebp313; X86-NEXT:    .cfi_def_cfa_offset 4314; X86-NEXT:    retl315  %tmp = call i64 @llvm.umul.fix.sat.i64(i64 %x, i64 %y, i32 0)316  ret i64 %tmp317}318 319define i4 @func6(i4 %x, i4 %y) nounwind {320; X64-LABEL: func6:321; X64:       # %bb.0:322; X64-NEXT:    movl %edi, %eax323; X64-NEXT:    andb $15, %sil324; X64-NEXT:    shlb $4, %al325; X64-NEXT:    # kill: def $al killed $al killed $eax326; X64-NEXT:    mulb %sil327; X64-NEXT:    movzbl %al, %ecx328; X64-NEXT:    movl $255, %eax329; X64-NEXT:    cmovnol %ecx, %eax330; X64-NEXT:    shrb $4, %al331; X64-NEXT:    # kill: def $al killed $al killed $eax332; X64-NEXT:    retq333;334; X86-LABEL: func6:335; X86:       # %bb.0:336; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx337; X86-NEXT:    andb $15, %cl338; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax339; X86-NEXT:    shlb $4, %al340; X86-NEXT:    mulb %cl341; X86-NEXT:    movzbl %al, %ecx342; X86-NEXT:    movl $255, %eax343; X86-NEXT:    cmovnol %ecx, %eax344; X86-NEXT:    shrb $4, %al345; X86-NEXT:    # kill: def $al killed $al killed $eax346; X86-NEXT:    retl347  %tmp = call i4 @llvm.umul.fix.sat.i4(i4 %x, i4 %y, i32 0)348  ret i4 %tmp349}350 351define <4 x i32> @vec2(<4 x i32> %x, <4 x i32> %y) nounwind {352; X64-LABEL: vec2:353; X64:       # %bb.0:354; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]355; X64-NEXT:    movd %xmm2, %eax356; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]357; X64-NEXT:    movd %xmm2, %ecx358; X64-NEXT:    mull %ecx359; X64-NEXT:    movl $-1, %ecx360; X64-NEXT:    cmovol %ecx, %eax361; X64-NEXT:    movd %eax, %xmm2362; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]363; X64-NEXT:    movd %xmm3, %eax364; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]365; X64-NEXT:    movd %xmm3, %edx366; X64-NEXT:    mull %edx367; X64-NEXT:    cmovol %ecx, %eax368; X64-NEXT:    movd %eax, %xmm3369; X64-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]370; X64-NEXT:    movd %xmm0, %eax371; X64-NEXT:    movd %xmm1, %edx372; X64-NEXT:    mull %edx373; X64-NEXT:    cmovol %ecx, %eax374; X64-NEXT:    movd %eax, %xmm2375; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]376; X64-NEXT:    movd %xmm0, %eax377; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]378; X64-NEXT:    movd %xmm0, %edx379; X64-NEXT:    mull %edx380; X64-NEXT:    cmovol %ecx, %eax381; X64-NEXT:    movd %eax, %xmm0382; X64-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]383; X64-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]384; X64-NEXT:    movdqa %xmm2, %xmm0385; X64-NEXT:    retq386;387; X86-LABEL: vec2:388; X86:       # %bb.0:389; X86-NEXT:    pushl %ebp390; X86-NEXT:    pushl %ebx391; X86-NEXT:    pushl %edi392; X86-NEXT:    pushl %esi393; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx394; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp395; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx396; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax397; X86-NEXT:    mull {{[0-9]+}}(%esp)398; X86-NEXT:    movl %eax, %esi399; X86-NEXT:    movl $-1, %edi400; X86-NEXT:    cmovol %edi, %esi401; X86-NEXT:    movl %ebx, %eax402; X86-NEXT:    mull {{[0-9]+}}(%esp)403; X86-NEXT:    movl %eax, %ebx404; X86-NEXT:    cmovol %edi, %ebx405; X86-NEXT:    movl %ebp, %eax406; X86-NEXT:    mull {{[0-9]+}}(%esp)407; X86-NEXT:    movl %eax, %ebp408; X86-NEXT:    cmovol %edi, %ebp409; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax410; X86-NEXT:    mull {{[0-9]+}}(%esp)411; X86-NEXT:    cmovol %edi, %eax412; X86-NEXT:    movl %eax, 12(%ecx)413; X86-NEXT:    movl %ebp, 8(%ecx)414; X86-NEXT:    movl %ebx, 4(%ecx)415; X86-NEXT:    movl %esi, (%ecx)416; X86-NEXT:    movl %ecx, %eax417; X86-NEXT:    popl %esi418; X86-NEXT:    popl %edi419; X86-NEXT:    popl %ebx420; X86-NEXT:    popl %ebp421; X86-NEXT:    retl $4422  %tmp = call <4 x i32> @llvm.umul.fix.sat.v4i32(<4 x i32> %x, <4 x i32> %y, i32 0)423  ret <4 x i32> %tmp424}425 426define i64 @func7(i64 %x, i64 %y) nounwind {427; X64-LABEL: func7:428; X64:       # %bb.0:429; X64-NEXT:    movq %rdi, %rax430; X64-NEXT:    mulq %rsi431; X64-NEXT:    shrdq $32, %rdx, %rax432; X64-NEXT:    movl $4294967295, %ecx # imm = 0xFFFFFFFF433; X64-NEXT:    cmpq %rcx, %rdx434; X64-NEXT:    movq $-1, %rcx435; X64-NEXT:    cmovaq %rcx, %rax436; X64-NEXT:    retq437;438; X86-LABEL: func7:439; X86:       # %bb.0:440; X86-NEXT:    pushl %ebp441; X86-NEXT:    pushl %ebx442; X86-NEXT:    pushl %edi443; X86-NEXT:    pushl %esi444; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi445; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx446; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp447; X86-NEXT:    movl %edi, %eax448; X86-NEXT:    mull %ebp449; X86-NEXT:    movl %edx, %ecx450; X86-NEXT:    movl %eax, %esi451; X86-NEXT:    movl %edi, %eax452; X86-NEXT:    mull %ebx453; X86-NEXT:    addl %edx, %esi454; X86-NEXT:    adcl $0, %ecx455; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax456; X86-NEXT:    mull %ebp457; X86-NEXT:    movl %edx, %edi458; X86-NEXT:    movl %eax, %ebp459; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax460; X86-NEXT:    mull %ebx461; X86-NEXT:    addl %esi, %eax462; X86-NEXT:    adcl %ecx, %edx463; X86-NEXT:    adcl $0, %edi464; X86-NEXT:    addl %ebp, %edx465; X86-NEXT:    adcl $0, %edi466; X86-NEXT:    xorl %ecx, %ecx467; X86-NEXT:    negl %edi468; X86-NEXT:    sbbl %ecx, %ecx469; X86-NEXT:    orl %ecx, %eax470; X86-NEXT:    orl %ecx, %edx471; X86-NEXT:    popl %esi472; X86-NEXT:    popl %edi473; X86-NEXT:    popl %ebx474; X86-NEXT:    popl %ebp475; X86-NEXT:    retl476  %tmp = call i64 @llvm.umul.fix.sat.i64(i64 %x, i64 %y, i32 32)477  ret i64 %tmp478}479 480define i64 @func8(i64 %x, i64 %y) nounwind {481; X64-LABEL: func8:482; X64:       # %bb.0:483; X64-NEXT:    movq %rdi, %rax484; X64-NEXT:    mulq %rsi485; X64-NEXT:    shrdq $63, %rdx, %rax486; X64-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF487; X64-NEXT:    cmpq %rcx, %rdx488; X64-NEXT:    movq $-1, %rcx489; X64-NEXT:    cmovaq %rcx, %rax490; X64-NEXT:    retq491;492; X86-LABEL: func8:493; X86:       # %bb.0:494; X86-NEXT:    pushl %ebp495; X86-NEXT:    pushl %ebx496; X86-NEXT:    pushl %edi497; X86-NEXT:    pushl %esi498; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx499; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx500; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp501; X86-NEXT:    movl %ecx, %eax502; X86-NEXT:    mull %ebp503; X86-NEXT:    movl %edx, %esi504; X86-NEXT:    movl %eax, %edi505; X86-NEXT:    movl %ecx, %eax506; X86-NEXT:    mull %ebx507; X86-NEXT:    addl %edx, %edi508; X86-NEXT:    adcl $0, %esi509; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax510; X86-NEXT:    mull %ebp511; X86-NEXT:    movl %edx, %ecx512; X86-NEXT:    movl %eax, %ebp513; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax514; X86-NEXT:    mull %ebx515; X86-NEXT:    addl %edi, %eax516; X86-NEXT:    adcl %esi, %edx517; X86-NEXT:    adcl $0, %ecx518; X86-NEXT:    addl %ebp, %edx519; X86-NEXT:    adcl $0, %ecx520; X86-NEXT:    shldl $1, %edx, %ecx521; X86-NEXT:    shrdl $31, %edx, %eax522; X86-NEXT:    testl $-2147483648, %edx # imm = 0x80000000523; X86-NEXT:    movl $-1, %edx524; X86-NEXT:    cmovnel %edx, %eax525; X86-NEXT:    cmovnel %edx, %ecx526; X86-NEXT:    movl %ecx, %edx527; X86-NEXT:    popl %esi528; X86-NEXT:    popl %edi529; X86-NEXT:    popl %ebx530; X86-NEXT:    popl %ebp531; X86-NEXT:    retl532  %tmp = call i64 @llvm.umul.fix.sat.i64(i64 %x, i64 %y, i32 63)533  ret i64 %tmp534}535