621 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-linux-gnu | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefix=X644 5declare {i32, i1} @llvm.umul.with.overflow.i32(i32 %a, i32 %b)6 7define zeroext i1 @a(i32 %x) nounwind {8; X86-LABEL: a:9; X86: # %bb.0:10; X86-NEXT: movl $3, %eax11; X86-NEXT: mull {{[0-9]+}}(%esp)12; X86-NEXT: seto %al13; X86-NEXT: retl14;15; X64-LABEL: a:16; X64: # %bb.0:17; X64-NEXT: movl %edi, %eax18; X64-NEXT: movl $3, %ecx19; X64-NEXT: mull %ecx20; X64-NEXT: seto %al21; X64-NEXT: retq22 %res = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %x, i32 3)23 %obil = extractvalue {i32, i1} %res, 124 ret i1 %obil25}26 27define i32 @test2(i32 %a, i32 %b) nounwind readnone {28; X86-LABEL: test2:29; X86: # %bb.0: # %entry30; X86-NEXT: movl {{[0-9]+}}(%esp), %eax31; X86-NEXT: addl {{[0-9]+}}(%esp), %eax32; X86-NEXT: addl %eax, %eax33; X86-NEXT: retl34;35; X64-LABEL: test2:36; X64: # %bb.0: # %entry37; X64-NEXT: # kill: def $esi killed $esi def $rsi38; X64-NEXT: # kill: def $edi killed $edi def $rdi39; X64-NEXT: leal (%rdi,%rsi), %eax40; X64-NEXT: addl %eax, %eax41; X64-NEXT: retq42entry:43 %tmp0 = add i32 %b, %a44 %tmp1 = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %tmp0, i32 2)45 %tmp2 = extractvalue { i32, i1 } %tmp1, 046 ret i32 %tmp247}48 49define i32 @test3(i32 %a, i32 %b) nounwind readnone {50; X86-LABEL: test3:51; X86: # %bb.0: # %entry52; X86-NEXT: movl {{[0-9]+}}(%esp), %eax53; X86-NEXT: addl {{[0-9]+}}(%esp), %eax54; X86-NEXT: movl $4, %ecx55; X86-NEXT: mull %ecx56; X86-NEXT: retl57;58; X64-LABEL: test3:59; X64: # %bb.0: # %entry60; X64-NEXT: # kill: def $esi killed $esi def $rsi61; X64-NEXT: # kill: def $edi killed $edi def $rdi62; X64-NEXT: leal (%rdi,%rsi), %eax63; X64-NEXT: movl $4, %ecx64; X64-NEXT: mull %ecx65; X64-NEXT: retq66entry:67 %tmp0 = add i32 %b, %a68 %tmp1 = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %tmp0, i32 4)69 %tmp2 = extractvalue { i32, i1 } %tmp1, 070 ret i32 %tmp271}72 73; Check that shifts larger than the shift amount type are handled.74; Intentionally not testing codegen here, only that this doesn't assert.75declare {i300, i1} @llvm.umul.with.overflow.i300(i300 %a, i300 %b)76define i300 @test4(i300 %a, i300 %b) nounwind {77; X86-LABEL: test4:78; X86: # %bb.0:79; X86-NEXT: pushl %ebp80; X86-NEXT: pushl %ebx81; X86-NEXT: pushl %edi82; X86-NEXT: pushl %esi83; X86-NEXT: subl $76, %esp84; X86-NEXT: movl $4095, %ecx # imm = 0xFFF85; X86-NEXT: movl {{[0-9]+}}(%esp), %eax86; X86-NEXT: andl %ecx, %eax87; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill88; X86-NEXT: andl {{[0-9]+}}(%esp), %ecx89; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill90; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx91; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx92; X86-NEXT: movl {{[0-9]+}}(%esp), %edi93; X86-NEXT: movl %ebx, %eax94; X86-NEXT: mull %edi95; X86-NEXT: movl %edx, %esi96; X86-NEXT: movl %eax, (%esp) # 4-byte Spill97; X86-NEXT: movl %ecx, %eax98; X86-NEXT: mull %edi99; X86-NEXT: movl %edx, %ecx100; X86-NEXT: movl %eax, %edi101; X86-NEXT: addl %esi, %edi102; X86-NEXT: adcl $0, %ecx103; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp104; X86-NEXT: movl %ebx, %eax105; X86-NEXT: mull %ebp106; X86-NEXT: movl %edx, %esi107; X86-NEXT: movl %eax, %ebx108; X86-NEXT: addl %edi, %ebx109; X86-NEXT: adcl %ecx, %esi110; X86-NEXT: setb %cl111; X86-NEXT: movl {{[0-9]+}}(%esp), %eax112; X86-NEXT: mull %ebp113; X86-NEXT: addl %esi, %eax114; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill115; X86-NEXT: movzbl %cl, %eax116; X86-NEXT: adcl %eax, %edx117; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill118; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp119; X86-NEXT: movl %ebp, %eax120; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx121; X86-NEXT: mull %ecx122; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill123; X86-NEXT: movl %edx, %edi124; X86-NEXT: movl {{[0-9]+}}(%esp), %eax125; X86-NEXT: mull %ecx126; X86-NEXT: movl %edx, %esi127; X86-NEXT: movl %eax, %ecx128; X86-NEXT: addl %edi, %ecx129; X86-NEXT: adcl $0, %esi130; X86-NEXT: movl %ebp, %eax131; X86-NEXT: mull {{[0-9]+}}(%esp)132; X86-NEXT: movl %edx, %edi133; X86-NEXT: addl %ecx, %eax134; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill135; X86-NEXT: adcl %esi, %edi136; X86-NEXT: setb %cl137; X86-NEXT: movl {{[0-9]+}}(%esp), %eax138; X86-NEXT: movl {{[0-9]+}}(%esp), %edx139; X86-NEXT: mull %edx140; X86-NEXT: movl %edx, %ebp141; X86-NEXT: movl %eax, %esi142; X86-NEXT: addl %edi, %esi143; X86-NEXT: movzbl %cl, %eax144; X86-NEXT: adcl %eax, %ebp145; X86-NEXT: addl (%esp), %esi # 4-byte Folded Reload146; X86-NEXT: adcl %ebx, %ebp147; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill148; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill149; X86-NEXT: movl {{[0-9]+}}(%esp), %edi150; X86-NEXT: movl {{[0-9]+}}(%esp), %eax151; X86-NEXT: mull %edi152; X86-NEXT: movl %edx, %ecx153; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill154; X86-NEXT: movl {{[0-9]+}}(%esp), %eax155; X86-NEXT: mull %edi156; X86-NEXT: movl %edx, %edi157; X86-NEXT: movl %eax, %ebx158; X86-NEXT: addl %ecx, %ebx159; X86-NEXT: adcl $0, %edi160; X86-NEXT: movl {{[0-9]+}}(%esp), %eax161; X86-NEXT: mull {{[0-9]+}}(%esp)162; X86-NEXT: movl %edx, %ecx163; X86-NEXT: addl %ebx, %eax164; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill165; X86-NEXT: adcl %edi, %ecx166; X86-NEXT: setb (%esp) # 1-byte Folded Spill167; X86-NEXT: movl {{[0-9]+}}(%esp), %eax168; X86-NEXT: mull {{[0-9]+}}(%esp)169; X86-NEXT: movl %edx, %edi170; X86-NEXT: movl %eax, %ebx171; X86-NEXT: addl %ecx, %ebx172; X86-NEXT: movzbl (%esp), %eax # 1-byte Folded Reload173; X86-NEXT: adcl %eax, %edi174; X86-NEXT: addl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill175; X86-NEXT: adcl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill176; X86-NEXT: adcl $0, %ebx177; X86-NEXT: adcl $0, %edi178; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload179; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload180; X86-NEXT: setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill181; X86-NEXT: movl {{[0-9]+}}(%esp), %eax182; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx183; X86-NEXT: mull %ecx184; X86-NEXT: movl %edx, %esi185; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill186; X86-NEXT: movl {{[0-9]+}}(%esp), %eax187; X86-NEXT: mull %ecx188; X86-NEXT: movl %edx, %ecx189; X86-NEXT: movl %eax, %ebp190; X86-NEXT: addl %esi, %ebp191; X86-NEXT: adcl $0, %ecx192; X86-NEXT: movl {{[0-9]+}}(%esp), %eax193; X86-NEXT: movl {{[0-9]+}}(%esp), %edx194; X86-NEXT: mull %edx195; X86-NEXT: movl %edx, %esi196; X86-NEXT: addl %ebp, %eax197; X86-NEXT: movl %eax, %ebp198; X86-NEXT: adcl %ecx, %esi199; X86-NEXT: setb %cl200; X86-NEXT: movl {{[0-9]+}}(%esp), %eax201; X86-NEXT: mull {{[0-9]+}}(%esp)202; X86-NEXT: addl %esi, %eax203; X86-NEXT: movl %eax, %esi204; X86-NEXT: movzbl %cl, %eax205; X86-NEXT: adcl %eax, %edx206; X86-NEXT: addl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill207; X86-NEXT: adcl %edi, %ebp208; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill209; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload210; X86-NEXT: adcl %eax, %esi211; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill212; X86-NEXT: adcl $0, %edx213; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill214; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx215; X86-NEXT: movl %ebx, %eax216; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx217; X86-NEXT: mull %ecx218; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill219; X86-NEXT: movl %edx, %esi220; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp221; X86-NEXT: movl %ebp, %eax222; X86-NEXT: mull %ecx223; X86-NEXT: movl %edx, %ecx224; X86-NEXT: movl %eax, %edi225; X86-NEXT: addl %esi, %edi226; X86-NEXT: adcl $0, %ecx227; X86-NEXT: movl %ebx, %eax228; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx229; X86-NEXT: mull %ebx230; X86-NEXT: movl %edx, %esi231; X86-NEXT: addl %edi, %eax232; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill233; X86-NEXT: adcl %ecx, %esi234; X86-NEXT: setb %cl235; X86-NEXT: movl %ebp, %eax236; X86-NEXT: mull %ebx237; X86-NEXT: addl %esi, %eax238; X86-NEXT: movl %eax, (%esp) # 4-byte Spill239; X86-NEXT: movzbl %cl, %eax240; X86-NEXT: adcl %eax, %edx241; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill242; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx243; X86-NEXT: movl %ebx, %eax244; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp245; X86-NEXT: mull %ebp246; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill247; X86-NEXT: movl %edx, %edi248; X86-NEXT: movl {{[0-9]+}}(%esp), %eax249; X86-NEXT: mull %ebp250; X86-NEXT: movl %edx, %esi251; X86-NEXT: movl %eax, %ecx252; X86-NEXT: addl %edi, %ecx253; X86-NEXT: adcl $0, %esi254; X86-NEXT: movl %ebx, %eax255; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx256; X86-NEXT: mull %ebx257; X86-NEXT: movl %edx, %edi258; X86-NEXT: addl %ecx, %eax259; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill260; X86-NEXT: adcl %esi, %edi261; X86-NEXT: setb %cl262; X86-NEXT: movl {{[0-9]+}}(%esp), %esi263; X86-NEXT: movl %esi, %eax264; X86-NEXT: mull %ebx265; X86-NEXT: movl %edx, %ebx266; X86-NEXT: movl %eax, %ebp267; X86-NEXT: addl %edi, %ebp268; X86-NEXT: movzbl %cl, %eax269; X86-NEXT: adcl %eax, %ebx270; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload271; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload272; X86-NEXT: adcl $0, (%esp) # 4-byte Folded Spill273; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill274; X86-NEXT: movl {{[0-9]+}}(%esp), %eax275; X86-NEXT: movl {{[0-9]+}}(%esp), %edi276; X86-NEXT: mull %edi277; X86-NEXT: movl %edx, %ecx278; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill279; X86-NEXT: movl %esi, %eax280; X86-NEXT: mull %edi281; X86-NEXT: movl %edx, %esi282; X86-NEXT: movl %eax, %edi283; X86-NEXT: addl %ecx, %edi284; X86-NEXT: adcl $0, %esi285; X86-NEXT: movl {{[0-9]+}}(%esp), %eax286; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx287; X86-NEXT: mull %ecx288; X86-NEXT: movl %edx, %ecx289; X86-NEXT: addl %edi, %eax290; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill291; X86-NEXT: adcl %esi, %ecx292; X86-NEXT: setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill293; X86-NEXT: movl {{[0-9]+}}(%esp), %eax294; X86-NEXT: mull {{[0-9]+}}(%esp)295; X86-NEXT: movl %edx, %esi296; X86-NEXT: movl %eax, %edi297; X86-NEXT: addl %ecx, %edi298; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload299; X86-NEXT: adcl %eax, %esi300; X86-NEXT: addl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill301; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload302; X86-NEXT: adcl %ebx, %ebp303; X86-NEXT: adcl $0, %edi304; X86-NEXT: adcl $0, %esi305; X86-NEXT: addl (%esp), %edi # 4-byte Folded Reload306; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload307; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx308; X86-NEXT: movl {{[0-9]+}}(%esp), %edx309; X86-NEXT: imull %edx, %ecx310; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx311; X86-NEXT: movl %ebx, %eax312; X86-NEXT: mull %edx313; X86-NEXT: addl %edx, %ecx314; X86-NEXT: imull {{[0-9]+}}(%esp), %ebx315; X86-NEXT: addl %ecx, %ebx316; X86-NEXT: movl %eax, %edx317; X86-NEXT: addl %edi, %edx318; X86-NEXT: adcl %esi, %ebx319; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload320; X86-NEXT: addl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill321; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload322; X86-NEXT: adcl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill323; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload324; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload325; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill326; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload327; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill328; X86-NEXT: adcl $0, %edx329; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill330; X86-NEXT: adcl $0, %ebx331; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill332; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx333; X86-NEXT: movl {{[0-9]+}}(%esp), %esi334; X86-NEXT: movl %esi, %eax335; X86-NEXT: mull %ecx336; X86-NEXT: movl %edx, %edi337; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill338; X86-NEXT: movl {{[0-9]+}}(%esp), %eax339; X86-NEXT: mull %ecx340; X86-NEXT: movl %edx, %ecx341; X86-NEXT: movl %eax, %ebp342; X86-NEXT: addl %edi, %ebp343; X86-NEXT: adcl $0, %ecx344; X86-NEXT: movl {{[0-9]+}}(%esp), %edi345; X86-NEXT: movl %esi, %eax346; X86-NEXT: mull %edi347; X86-NEXT: movl %edi, %esi348; X86-NEXT: movl %edx, %ebx349; X86-NEXT: movl %eax, %edi350; X86-NEXT: addl %ebp, %edi351; X86-NEXT: adcl %ecx, %ebx352; X86-NEXT: setb %cl353; X86-NEXT: movl {{[0-9]+}}(%esp), %eax354; X86-NEXT: mull %esi355; X86-NEXT: addl %ebx, %eax356; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill357; X86-NEXT: movzbl %cl, %eax358; X86-NEXT: adcl %eax, %edx359; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill360; X86-NEXT: movl {{[0-9]+}}(%esp), %esi361; X86-NEXT: movl %esi, %eax362; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx363; X86-NEXT: mull %ecx364; X86-NEXT: movl %edx, %ebp365; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill366; X86-NEXT: movl {{[0-9]+}}(%esp), %eax367; X86-NEXT: mull %ecx368; X86-NEXT: movl %edx, %ecx369; X86-NEXT: movl %eax, %ebx370; X86-NEXT: addl %ebp, %ebx371; X86-NEXT: adcl $0, %ecx372; X86-NEXT: movl %esi, %eax373; X86-NEXT: movl {{[0-9]+}}(%esp), %esi374; X86-NEXT: mull %esi375; X86-NEXT: movl %edx, %ebp376; X86-NEXT: addl %ebx, %eax377; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill378; X86-NEXT: adcl %ecx, %ebp379; X86-NEXT: setb (%esp) # 1-byte Folded Spill380; X86-NEXT: movl {{[0-9]+}}(%esp), %eax381; X86-NEXT: mull %esi382; X86-NEXT: movl %edx, %ebx383; X86-NEXT: movl %eax, %ecx384; X86-NEXT: addl %ebp, %ecx385; X86-NEXT: movzbl (%esp), %eax # 1-byte Folded Reload386; X86-NEXT: adcl %eax, %ebx387; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload388; X86-NEXT: adcl %edi, %ebx389; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill390; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill391; X86-NEXT: movl {{[0-9]+}}(%esp), %edi392; X86-NEXT: movl {{[0-9]+}}(%esp), %eax393; X86-NEXT: mull %edi394; X86-NEXT: movl %edx, %esi395; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill396; X86-NEXT: movl {{[0-9]+}}(%esp), %eax397; X86-NEXT: mull %edi398; X86-NEXT: movl %edx, %edi399; X86-NEXT: movl %eax, %ebp400; X86-NEXT: addl %esi, %ebp401; X86-NEXT: adcl $0, %edi402; X86-NEXT: movl {{[0-9]+}}(%esp), %eax403; X86-NEXT: mull {{[0-9]+}}(%esp)404; X86-NEXT: movl %edx, %esi405; X86-NEXT: addl %ebp, %eax406; X86-NEXT: movl %eax, (%esp) # 4-byte Spill407; X86-NEXT: adcl %edi, %esi408; X86-NEXT: setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill409; X86-NEXT: movl {{[0-9]+}}(%esp), %eax410; X86-NEXT: mull {{[0-9]+}}(%esp)411; X86-NEXT: movl %edx, %edi412; X86-NEXT: movl %eax, %ebp413; X86-NEXT: addl %esi, %ebp414; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload415; X86-NEXT: adcl %eax, %edi416; X86-NEXT: addl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill417; X86-NEXT: adcl %ebx, (%esp) # 4-byte Folded Spill418; X86-NEXT: adcl $0, %ebp419; X86-NEXT: adcl $0, %edi420; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload421; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload422; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx423; X86-NEXT: movl {{[0-9]+}}(%esp), %edx424; X86-NEXT: imull %edx, %ecx425; X86-NEXT: movl {{[0-9]+}}(%esp), %esi426; X86-NEXT: movl %esi, %eax427; X86-NEXT: mull %edx428; X86-NEXT: movl %eax, %ebx429; X86-NEXT: addl %edx, %ecx430; X86-NEXT: imull {{[0-9]+}}(%esp), %esi431; X86-NEXT: addl %ecx, %esi432; X86-NEXT: addl %ebp, %ebx433; X86-NEXT: adcl %edi, %esi434; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload435; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload436; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill437; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload438; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload439; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill440; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload441; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload442; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill443; X86-NEXT: movl (%esp), %eax # 4-byte Reload444; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload445; X86-NEXT: movl %eax, (%esp) # 4-byte Spill446; X86-NEXT: adcl $0, %ebx447; X86-NEXT: adcl $0, %esi448; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload449; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload450; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp451; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx452; X86-NEXT: imull %ecx, %ebp453; X86-NEXT: movl {{[0-9]+}}(%esp), %edi454; X86-NEXT: movl %edi, %eax455; X86-NEXT: mull %ecx456; X86-NEXT: movl %eax, %ecx457; X86-NEXT: addl %edx, %ebp458; X86-NEXT: imull {{[0-9]+}}(%esp), %edi459; X86-NEXT: addl %ebp, %edi460; X86-NEXT: addl %ebx, %ecx461; X86-NEXT: adcl %esi, %edi462; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill463; X86-NEXT: movl {{[0-9]+}}(%esp), %edi464; X86-NEXT: movl %edi, %eax465; X86-NEXT: imull {{[0-9]+}}(%esp), %edi466; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload467; X86-NEXT: movl {{[0-9]+}}(%esp), %edx468; X86-NEXT: imull %edx, %esi469; X86-NEXT: mull %edx470; X86-NEXT: movl %eax, %ebp471; X86-NEXT: addl %edx, %edi472; X86-NEXT: addl %esi, %edi473; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx474; X86-NEXT: movl %ebx, %eax475; X86-NEXT: imull {{[0-9]+}}(%esp), %ebx476; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload477; X86-NEXT: movl {{[0-9]+}}(%esp), %edx478; X86-NEXT: imull %edx, %esi479; X86-NEXT: mull %edx480; X86-NEXT: addl %edx, %ebx481; X86-NEXT: addl %esi, %ebx482; X86-NEXT: addl %ebp, %eax483; X86-NEXT: adcl %edi, %ebx484; X86-NEXT: addl %ecx, %eax485; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload486; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx487; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload488; X86-NEXT: movl %edx, 4(%ecx)489; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload490; X86-NEXT: movl %edx, (%ecx)491; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload492; X86-NEXT: movl %edx, 8(%ecx)493; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload494; X86-NEXT: movl %edx, 12(%ecx)495; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload496; X86-NEXT: movl %edx, 16(%ecx)497; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload498; X86-NEXT: movl %edx, 20(%ecx)499; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload500; X86-NEXT: movl %edx, 24(%ecx)501; X86-NEXT: movl (%esp), %edx # 4-byte Reload502; X86-NEXT: movl %edx, 28(%ecx)503; X86-NEXT: movl %eax, 32(%ecx)504; X86-NEXT: andl $4095, %ebx # imm = 0xFFF505; X86-NEXT: movw %bx, 36(%ecx)506; X86-NEXT: movl %ecx, %eax507; X86-NEXT: addl $76, %esp508; X86-NEXT: popl %esi509; X86-NEXT: popl %edi510; X86-NEXT: popl %ebx511; X86-NEXT: popl %ebp512; X86-NEXT: retl $4513;514; X64-LABEL: test4:515; X64: # %bb.0:516; X64-NEXT: pushq %rbp517; X64-NEXT: pushq %r15518; X64-NEXT: pushq %r14519; X64-NEXT: pushq %r13520; X64-NEXT: pushq %r12521; X64-NEXT: pushq %rbx522; X64-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill523; X64-NEXT: movq %r8, %r11524; X64-NEXT: movq %rcx, %r8525; X64-NEXT: movq %rdx, %rcx526; X64-NEXT: movq {{[0-9]+}}(%rsp), %r12527; X64-NEXT: movq {{[0-9]+}}(%rsp), %r9528; X64-NEXT: movq %rsi, %rax529; X64-NEXT: mulq %r9530; X64-NEXT: movq %rdx, %rbx531; X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill532; X64-NEXT: movq %rcx, %rax533; X64-NEXT: mulq %r9534; X64-NEXT: movq %rdx, %r14535; X64-NEXT: movq %rax, %r15536; X64-NEXT: addq %rbx, %r15537; X64-NEXT: adcq $0, %r14538; X64-NEXT: movq %rsi, %rax539; X64-NEXT: mulq %r12540; X64-NEXT: movq %rdx, %rbp541; X64-NEXT: movq %rax, %rbx542; X64-NEXT: addq %r15, %rbx543; X64-NEXT: adcq %r14, %rbp544; X64-NEXT: setb %al545; X64-NEXT: movzbl %al, %r10d546; X64-NEXT: movq %rcx, %rax547; X64-NEXT: mulq %r12548; X64-NEXT: movq %rdx, %r12549; X64-NEXT: movq %rax, %r13550; X64-NEXT: addq %rbp, %r13551; X64-NEXT: adcq %r10, %r12552; X64-NEXT: movq %r8, %rax553; X64-NEXT: mulq %r9554; X64-NEXT: movq %rdx, %r15555; X64-NEXT: movq %rax, %r14556; X64-NEXT: movq %r11, %rax557; X64-NEXT: mulq %r9558; X64-NEXT: movq %rdx, %rbp559; X64-NEXT: movq %rax, %r10560; X64-NEXT: addq %r15, %r10561; X64-NEXT: adcq $0, %rbp562; X64-NEXT: movq %r8, %rax563; X64-NEXT: movq {{[0-9]+}}(%rsp), %r9564; X64-NEXT: mulq %r9565; X64-NEXT: movq %rax, %r15566; X64-NEXT: addq %r10, %r15567; X64-NEXT: adcq %rbp, %rdx568; X64-NEXT: imulq %r9, %r11569; X64-NEXT: movq {{[0-9]+}}(%rsp), %r9570; X64-NEXT: addq %r13, %r14571; X64-NEXT: adcq %r12, %r15572; X64-NEXT: adcq %rdx, %r11573; X64-NEXT: movq %rsi, %rax574; X64-NEXT: mulq %r9575; X64-NEXT: movq %rdx, %r10576; X64-NEXT: movq %rax, %r12577; X64-NEXT: movq %rcx, %rax578; X64-NEXT: mulq %r9579; X64-NEXT: movq %rdx, %r13580; X64-NEXT: movq %rax, %rbp581; X64-NEXT: addq %r10, %rbp582; X64-NEXT: adcq $0, %r13583; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10584; X64-NEXT: movq %rsi, %rax585; X64-NEXT: mulq %r10586; X64-NEXT: addq %rbp, %rax587; X64-NEXT: adcq %r13, %rdx588; X64-NEXT: imulq %r10, %rcx589; X64-NEXT: addq %rdx, %rcx590; X64-NEXT: addq %r14, %r12591; X64-NEXT: adcq %r15, %rax592; X64-NEXT: adcq %r11, %rcx593; X64-NEXT: imulq %r9, %r8594; X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload595; X64-NEXT: imulq {{[0-9]+}}(%rsp), %rdx596; X64-NEXT: imulq {{[0-9]+}}(%rsp), %rsi597; X64-NEXT: addq %rdx, %rsi598; X64-NEXT: addq %r8, %rsi599; X64-NEXT: addq %rcx, %rsi600; X64-NEXT: movq %rbx, 8(%rdi)601; X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload602; X64-NEXT: movq %rcx, (%rdi)603; X64-NEXT: movq %r12, 16(%rdi)604; X64-NEXT: movq %rax, 24(%rdi)605; X64-NEXT: movl %esi, 32(%rdi)606; X64-NEXT: shrq $32, %rsi607; X64-NEXT: andl $4095, %esi # imm = 0xFFF608; X64-NEXT: movw %si, 36(%rdi)609; X64-NEXT: movq %rdi, %rax610; X64-NEXT: popq %rbx611; X64-NEXT: popq %r12612; X64-NEXT: popq %r13613; X64-NEXT: popq %r14614; X64-NEXT: popq %r15615; X64-NEXT: popq %rbp616; X64-NEXT: retq617 %x = call {i300, i1} @llvm.umul.with.overflow.i300(i300 %a, i300 %b)618 %y = extractvalue {i300, i1} %x, 0619 ret i300 %y620}621