brintos

brintos / llvm-project-archived public Read only

0
0
Text · 53.8 KiB · 455b72d Raw
1424 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown   -mattr=+sse,+sse2 | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse,+sse2 | FileCheck %s --check-prefix=X644 5; If the target does not have a single div/rem operation,6; -div-rem-pairs pass will decompose the remainder calculation as:7;   X % Y --> X - ((X / Y) * Y)8; But if the target does have a single div/rem operation,9; the opposite transform is likely beneficial.10 11define i8 @scalar_i8(i8 %x, i8 %y, ptr %divdst) nounwind {12; X86-LABEL: scalar_i8:13; X86:       # %bb.0:14; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax15; X86-NEXT:    idivb {{[0-9]+}}(%esp)16; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx17; X86-NEXT:    movsbl %ah, %ecx18; X86-NEXT:    movb %al, (%edx)19; X86-NEXT:    movl %ecx, %eax20; X86-NEXT:    retl21;22; X64-LABEL: scalar_i8:23; X64:       # %bb.0:24; X64-NEXT:    movsbl %dil, %eax25; X64-NEXT:    idivb %sil26; X64-NEXT:    movsbl %ah, %ecx27; X64-NEXT:    movb %al, (%rdx)28; X64-NEXT:    movl %ecx, %eax29; X64-NEXT:    retq30  %div = sdiv i8 %x, %y31  store i8 %div, ptr %divdst, align 432  %t1 = mul i8 %div, %y33  %t2 = sub i8 %x, %t134  ret i8 %t235}36 37define i16 @scalar_i16(i16 %x, i16 %y, ptr %divdst) nounwind {38; X86-LABEL: scalar_i16:39; X86:       # %bb.0:40; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax41; X86-NEXT:    cwtd42; X86-NEXT:    idivw {{[0-9]+}}(%esp)43; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx44; X86-NEXT:    movw %ax, (%ecx)45; X86-NEXT:    movl %edx, %eax46; X86-NEXT:    retl47;48; X64-LABEL: scalar_i16:49; X64:       # %bb.0:50; X64-NEXT:    movq %rdx, %rcx51; X64-NEXT:    movl %edi, %eax52; X64-NEXT:    # kill: def $ax killed $ax killed $eax53; X64-NEXT:    cwtd54; X64-NEXT:    idivw %si55; X64-NEXT:    movw %ax, (%rcx)56; X64-NEXT:    movl %edx, %eax57; X64-NEXT:    retq58  %div = sdiv i16 %x, %y59  store i16 %div, ptr %divdst, align 460  %t1 = mul i16 %div, %y61  %t2 = sub i16 %x, %t162  ret i16 %t263}64 65define i32 @scalar_i32(i32 %x, i32 %y, ptr %divdst) nounwind {66; X86-LABEL: scalar_i32:67; X86:       # %bb.0:68; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax69; X86-NEXT:    cltd70; X86-NEXT:    idivl {{[0-9]+}}(%esp)71; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx72; X86-NEXT:    movl %eax, (%ecx)73; X86-NEXT:    movl %edx, %eax74; X86-NEXT:    retl75;76; X64-LABEL: scalar_i32:77; X64:       # %bb.0:78; X64-NEXT:    movq %rdx, %rcx79; X64-NEXT:    movl %edi, %eax80; X64-NEXT:    cltd81; X64-NEXT:    idivl %esi82; X64-NEXT:    movl %eax, (%rcx)83; X64-NEXT:    movl %edx, %eax84; X64-NEXT:    retq85  %div = sdiv i32 %x, %y86  store i32 %div, ptr %divdst, align 487  %t1 = mul i32 %div, %y88  %t2 = sub i32 %x, %t189  ret i32 %t290}91 92define i64 @scalar_i64(i64 %x, i64 %y, ptr %divdst) nounwind {93; X86-LABEL: scalar_i64:94; X86:       # %bb.0:95; X86-NEXT:    pushl %ebp96; X86-NEXT:    pushl %ebx97; X86-NEXT:    pushl %edi98; X86-NEXT:    pushl %esi99; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi100; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi101; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx102; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp103; X86-NEXT:    pushl %ebp104; X86-NEXT:    pushl %ebx105; X86-NEXT:    pushl %edi106; X86-NEXT:    pushl %esi107; X86-NEXT:    calll __divdi3108; X86-NEXT:    addl $16, %esp109; X86-NEXT:    movl %edx, %ecx110; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx111; X86-NEXT:    movl %ecx, 4(%edx)112; X86-NEXT:    movl %eax, (%edx)113; X86-NEXT:    imull %eax, %ebp114; X86-NEXT:    mull %ebx115; X86-NEXT:    addl %ebp, %edx116; X86-NEXT:    imull %ebx, %ecx117; X86-NEXT:    addl %edx, %ecx118; X86-NEXT:    subl %eax, %esi119; X86-NEXT:    sbbl %ecx, %edi120; X86-NEXT:    movl %esi, %eax121; X86-NEXT:    movl %edi, %edx122; X86-NEXT:    popl %esi123; X86-NEXT:    popl %edi124; X86-NEXT:    popl %ebx125; X86-NEXT:    popl %ebp126; X86-NEXT:    retl127;128; X64-LABEL: scalar_i64:129; X64:       # %bb.0:130; X64-NEXT:    movq %rdx, %rcx131; X64-NEXT:    movq %rdi, %rax132; X64-NEXT:    cqto133; X64-NEXT:    idivq %rsi134; X64-NEXT:    movq %rax, (%rcx)135; X64-NEXT:    movq %rdx, %rax136; X64-NEXT:    retq137  %div = sdiv i64 %x, %y138  store i64 %div, ptr %divdst, align 4139  %t1 = mul i64 %div, %y140  %t2 = sub i64 %x, %t1141  ret i64 %t2142}143 144; X86 doesn't have __divti3, so the urem is expanded into a loop.145define i128 @scalar_i128(i128 %x, i128 %y, ptr %divdst) nounwind {146; X86-LABEL: scalar_i128:147; X86:       # %bb.0: # %_udiv-special-cases148; X86-NEXT:    pushl %ebp149; X86-NEXT:    movl %esp, %ebp150; X86-NEXT:    pushl %ebx151; X86-NEXT:    pushl %edi152; X86-NEXT:    pushl %esi153; X86-NEXT:    andl $-16, %esp154; X86-NEXT:    subl $176, %esp155; X86-NEXT:    movl 32(%ebp), %edx156; X86-NEXT:    movl 36(%ebp), %ecx157; X86-NEXT:    movl %ecx, %eax158; X86-NEXT:    sarl $31, %eax159; X86-NEXT:    xorl %eax, %ecx160; X86-NEXT:    movl %ecx, %edi161; X86-NEXT:    xorl %eax, %edx162; X86-NEXT:    movl %edx, %esi163; X86-NEXT:    movl 28(%ebp), %edx164; X86-NEXT:    xorl %eax, %edx165; X86-NEXT:    movl 24(%ebp), %ecx166; X86-NEXT:    xorl %eax, %ecx167; X86-NEXT:    subl %eax, %ecx168; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill169; X86-NEXT:    sbbl %eax, %edx170; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill171; X86-NEXT:    sbbl %eax, %esi172; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill173; X86-NEXT:    sbbl %eax, %edi174; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill175; X86-NEXT:    movl 52(%ebp), %esi176; X86-NEXT:    movl %esi, %edx177; X86-NEXT:    sarl $31, %edx178; X86-NEXT:    xorl %edx, %esi179; X86-NEXT:    movl 48(%ebp), %ecx180; X86-NEXT:    xorl %edx, %ecx181; X86-NEXT:    movl 44(%ebp), %ebx182; X86-NEXT:    xorl %edx, %ebx183; X86-NEXT:    movl 40(%ebp), %edi184; X86-NEXT:    xorl %edx, %edi185; X86-NEXT:    subl %edx, %edi186; X86-NEXT:    sbbl %edx, %ebx187; X86-NEXT:    sbbl %edx, %ecx188; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill189; X86-NEXT:    sbbl %edx, %esi190; X86-NEXT:    xorl %eax, %edx191; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill192; X86-NEXT:    movl %ebx, %eax193; X86-NEXT:    orl %esi, %eax194; X86-NEXT:    movl %edi, %ecx195; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload196; X86-NEXT:    orl %eax, %ecx197; X86-NEXT:    sete %cl198; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload199; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload200; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload201; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload202; X86-NEXT:    orl %eax, %edx203; X86-NEXT:    sete %al204; X86-NEXT:    orb %cl, %al205; X86-NEXT:    movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill206; X86-NEXT:    bsrl %esi, %edx207; X86-NEXT:    xorl $31, %edx208; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload209; X86-NEXT:    bsrl %eax, %ecx210; X86-NEXT:    xorl $31, %ecx211; X86-NEXT:    orl $32, %ecx212; X86-NEXT:    testl %esi, %esi213; X86-NEXT:    cmovnel %edx, %ecx214; X86-NEXT:    bsrl %ebx, %edx215; X86-NEXT:    xorl $31, %edx216; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill217; X86-NEXT:    bsrl %edi, %edi218; X86-NEXT:    xorl $31, %edi219; X86-NEXT:    orl $32, %edi220; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill221; X86-NEXT:    testl %ebx, %ebx222; X86-NEXT:    cmovnel %edx, %edi223; X86-NEXT:    orl $64, %edi224; X86-NEXT:    movl %eax, %edx225; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill226; X86-NEXT:    orl %esi, %edx227; X86-NEXT:    cmovnel %ecx, %edi228; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload229; X86-NEXT:    bsrl %eax, %edx230; X86-NEXT:    xorl $31, %edx231; X86-NEXT:    bsrl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload232; X86-NEXT:    xorl $31, %ecx233; X86-NEXT:    orl $32, %ecx234; X86-NEXT:    testl %eax, %eax235; X86-NEXT:    cmovnel %edx, %ecx236; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload237; X86-NEXT:    bsrl %ebx, %esi238; X86-NEXT:    xorl $31, %esi239; X86-NEXT:    bsrl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload240; X86-NEXT:    xorl $31, %edx241; X86-NEXT:    orl $32, %edx242; X86-NEXT:    testl %ebx, %ebx243; X86-NEXT:    cmovnel %esi, %edx244; X86-NEXT:    orl $64, %edx245; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload246; X86-NEXT:    orl %eax, %esi247; X86-NEXT:    cmovnel %ecx, %edx248; X86-NEXT:    xorl %ebx, %ebx249; X86-NEXT:    subl %edx, %edi250; X86-NEXT:    movl $0, %edx251; X86-NEXT:    sbbl %edx, %edx252; X86-NEXT:    movl $0, %esi253; X86-NEXT:    sbbl %esi, %esi254; X86-NEXT:    movl $0, %eax255; X86-NEXT:    sbbl %eax, %eax256; X86-NEXT:    movl $127, %ecx257; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill258; X86-NEXT:    cmpl %edi, %ecx259; X86-NEXT:    movl $0, %ecx260; X86-NEXT:    sbbl %edx, %ecx261; X86-NEXT:    movl $0, %ecx262; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill263; X86-NEXT:    sbbl %esi, %ecx264; X86-NEXT:    movl $0, %ecx265; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill266; X86-NEXT:    sbbl %eax, %ecx267; X86-NEXT:    setb %cl268; X86-NEXT:    orb {{[-0-9]+}}(%e{{[sb]}}p), %cl # 1-byte Folded Reload269; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload270; X86-NEXT:    cmovnel %ebx, %esi271; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload272; X86-NEXT:    cmovnel %ebx, %eax273; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill274; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload275; X86-NEXT:    cmovnel %ebx, %eax276; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload277; X86-NEXT:    jne .LBB4_1278; X86-NEXT:  # %bb.8: # %_udiv-special-cases279; X86-NEXT:    movl %edx, %edi280; X86-NEXT:    movl %eax, %edx281; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload282; X86-NEXT:    xorl $127, %eax283; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload284; X86-NEXT:    movl %edi, %ecx285; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload286; X86-NEXT:    orl %eax, %ecx287; X86-NEXT:    movl %edx, %eax288; X86-NEXT:    movl %ebx, %edx289; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload290; X86-NEXT:    je .LBB4_9291; X86-NEXT:  # %bb.5: # %udiv-bb1292; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload293; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)294; X86-NEXT:    xorps %xmm0, %xmm0295; X86-NEXT:    movaps %xmm0, {{[0-9]+}}(%esp)296; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload297; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)298; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload299; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)300; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload301; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)302; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload303; X86-NEXT:    movl %ebx, %ecx304; X86-NEXT:    xorb $127, %cl305; X86-NEXT:    movl %ecx, %eax306; X86-NEXT:    shrb $3, %al307; X86-NEXT:    andb $12, %al308; X86-NEXT:    negb %al309; X86-NEXT:    movsbl %al, %eax310; X86-NEXT:    movl 152(%esp,%eax), %esi311; X86-NEXT:    movl 156(%esp,%eax), %edx312; X86-NEXT:    shldl %cl, %esi, %edx313; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill314; X86-NEXT:    movl 144(%esp,%eax), %edx315; X86-NEXT:    movl 148(%esp,%eax), %eax316; X86-NEXT:    shldl %cl, %eax, %esi317; X86-NEXT:    shldl %cl, %edx, %eax318; X86-NEXT:    shll %cl, %edx319; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill320; X86-NEXT:    addl $1, %ebx321; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill322; X86-NEXT:    adcl $0, %edi323; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload324; X86-NEXT:    adcl $0, %ecx325; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload326; X86-NEXT:    adcl $0, %edx327; X86-NEXT:    jae .LBB4_2328; X86-NEXT:  # %bb.6:329; X86-NEXT:    xorl %ecx, %ecx330; X86-NEXT:    xorl %edx, %edx331; X86-NEXT:    movl %esi, %ebx332; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload333; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload334; X86-NEXT:    jmp .LBB4_7335; X86-NEXT:  .LBB4_1:336; X86-NEXT:    movl %ebx, %edx337; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload338; X86-NEXT:    jmp .LBB4_9339; X86-NEXT:  .LBB4_2: # %udiv-preheader340; X86-NEXT:    movl %edi, %ebx341; X86-NEXT:    movl %edx, %edi342; X86-NEXT:    movaps %xmm0, {{[0-9]+}}(%esp)343; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload344; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)345; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload346; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)347; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload348; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)349; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload350; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)351; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill352; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill353; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload354; X86-NEXT:    movl %ecx, %eax355; X86-NEXT:    shrb $3, %al356; X86-NEXT:    andb $12, %al357; X86-NEXT:    movzbl %al, %eax358; X86-NEXT:    movl 108(%esp,%eax), %edx359; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill360; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill361; X86-NEXT:    movl 104(%esp,%eax), %ebx362; X86-NEXT:    movl %ebx, %esi363; X86-NEXT:    shrdl %cl, %edx, %esi364; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill365; X86-NEXT:    movl 96(%esp,%eax), %esi366; X86-NEXT:    movl 100(%esp,%eax), %eax367; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill368; X86-NEXT:    movl %eax, %edi369; X86-NEXT:    shrdl %cl, %ebx, %edi370; X86-NEXT:    movl %edi, %ebx371; X86-NEXT:    shrl %cl, %edx372; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill373; X86-NEXT:    # kill: def $cl killed $cl killed $ecx374; X86-NEXT:    shrdl %cl, %eax, %esi375; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill376; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload377; X86-NEXT:    addl $-1, %eax378; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill379; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload380; X86-NEXT:    adcl $-1, %eax381; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill382; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload383; X86-NEXT:    adcl $-1, %ecx384; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill385; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload386; X86-NEXT:    adcl $-1, %ecx387; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill388; X86-NEXT:    xorl %edx, %edx389; X86-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill390; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload391; X86-NEXT:    .p2align 4392; X86-NEXT:  .LBB4_3: # %udiv-do-while393; X86-NEXT:    # =>This Inner Loop Header: Depth=1394; X86-NEXT:    movl %edx, %esi395; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill396; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload397; X86-NEXT:    shldl $1, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill398; X86-NEXT:    movl %ebx, %edx399; X86-NEXT:    shldl $1, %ebx, %eax400; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill401; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload402; X86-NEXT:    shldl $1, %ebx, %edx403; X86-NEXT:    shldl $1, %ecx, %ebx404; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload405; X86-NEXT:    shldl $1, %edi, %ecx406; X86-NEXT:    orl %esi, %ecx407; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill408; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload409; X86-NEXT:    shldl $1, %ecx, %edi410; X86-NEXT:    orl %esi, %edi411; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill412; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload413; X86-NEXT:    shldl $1, %edi, %ecx414; X86-NEXT:    orl %esi, %ecx415; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill416; X86-NEXT:    addl %edi, %edi417; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload418; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill419; X86-NEXT:    cmpl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload420; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload421; X86-NEXT:    sbbl %edx, %ecx422; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload423; X86-NEXT:    sbbl %eax, %ecx424; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload425; X86-NEXT:    sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload426; X86-NEXT:    sarl $31, %ecx427; X86-NEXT:    movl %ecx, %esi428; X86-NEXT:    andl $1, %esi429; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill430; X86-NEXT:    movl %ecx, %edi431; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload432; X86-NEXT:    movl %ecx, %esi433; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload434; X86-NEXT:    movl %ecx, %eax435; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload436; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload437; X86-NEXT:    subl %ecx, %ebx438; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill439; X86-NEXT:    sbbl %eax, %edx440; X86-NEXT:    movl %edx, %ebx441; X86-NEXT:    sbbl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill442; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload443; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload444; X86-NEXT:    sbbl %edi, %eax445; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill446; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload447; X86-NEXT:    addl $-1, %ecx448; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload449; X86-NEXT:    adcl $-1, %eax450; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload451; X86-NEXT:    adcl $-1, %edi452; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload453; X86-NEXT:    adcl $-1, %esi454; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill455; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill456; X86-NEXT:    orl %esi, %eax457; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill458; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill459; X86-NEXT:    orl %edi, %ecx460; X86-NEXT:    orl %eax, %ecx461; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload462; X86-NEXT:    jne .LBB4_3463; X86-NEXT:  # %bb.4:464; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload465; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload466; X86-NEXT:    movl %ecx, %esi467; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload468; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload469; X86-NEXT:  .LBB4_7: # %udiv-loop-exit470; X86-NEXT:    shldl $1, %ebx, %esi471; X86-NEXT:    orl %edx, %esi472; X86-NEXT:    shldl $1, %eax, %ebx473; X86-NEXT:    orl %edx, %ebx474; X86-NEXT:    shldl $1, %edi, %eax475; X86-NEXT:    orl %edx, %eax476; X86-NEXT:    movl %edi, %edx477; X86-NEXT:    addl %edi, %edx478; X86-NEXT:    orl %ecx, %edx479; X86-NEXT:  .LBB4_9: # %udiv-end480; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload481; X86-NEXT:    xorl %ecx, %esi482; X86-NEXT:    xorl %ecx, %ebx483; X86-NEXT:    xorl %ecx, %eax484; X86-NEXT:    xorl %ecx, %edx485; X86-NEXT:    subl %ecx, %edx486; X86-NEXT:    sbbl %ecx, %eax487; X86-NEXT:    sbbl %ecx, %ebx488; X86-NEXT:    sbbl %ecx, %esi489; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill490; X86-NEXT:    movl 56(%ebp), %ecx491; X86-NEXT:    movl %edx, (%ecx)492; X86-NEXT:    movl %eax, 4(%ecx)493; X86-NEXT:    movl %ebx, 8(%ecx)494; X86-NEXT:    movl %esi, 12(%ecx)495; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill496; X86-NEXT:    movl 40(%ebp), %ecx497; X86-NEXT:    movl %ebx, %edi498; X86-NEXT:    movl %edx, %esi499; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill500; X86-NEXT:    mull %ecx501; X86-NEXT:    movl %edx, %ebx502; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill503; X86-NEXT:    movl %esi, %eax504; X86-NEXT:    mull %ecx505; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill506; X86-NEXT:    movl %edx, %ecx507; X86-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload508; X86-NEXT:    adcl $0, %ebx509; X86-NEXT:    movl %esi, %eax510; X86-NEXT:    movl 44(%ebp), %esi511; X86-NEXT:    mull %esi512; X86-NEXT:    addl %ecx, %eax513; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill514; X86-NEXT:    adcl %ebx, %edx515; X86-NEXT:    movl %edx, %ecx516; X86-NEXT:    setb %bl517; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload518; X86-NEXT:    mull %esi519; X86-NEXT:    addl %ecx, %eax520; X86-NEXT:    movl %eax, %ecx521; X86-NEXT:    movzbl %bl, %eax522; X86-NEXT:    adcl %eax, %edx523; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill524; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload525; X86-NEXT:    movl 40(%ebp), %eax526; X86-NEXT:    imull %eax, %ebx527; X86-NEXT:    mull %edi528; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill529; X86-NEXT:    imull %esi, %edi530; X86-NEXT:    addl %edx, %edi531; X86-NEXT:    addl %ebx, %edi532; X86-NEXT:    movl 48(%ebp), %eax533; X86-NEXT:    movl %eax, %esi534; X86-NEXT:    imull {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload535; X86-NEXT:    movl 52(%ebp), %ebx536; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload537; X86-NEXT:    imull %edx, %ebx538; X86-NEXT:    mull %edx539; X86-NEXT:    addl %edx, %ebx540; X86-NEXT:    addl %esi, %ebx541; X86-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload542; X86-NEXT:    adcl %edi, %ebx543; X86-NEXT:    addl %ecx, %eax544; X86-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload545; X86-NEXT:    movl 24(%ebp), %edx546; X86-NEXT:    subl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload547; X86-NEXT:    movl 28(%ebp), %ecx548; X86-NEXT:    sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload549; X86-NEXT:    movl 32(%ebp), %edi550; X86-NEXT:    sbbl %eax, %edi551; X86-NEXT:    movl 36(%ebp), %esi552; X86-NEXT:    sbbl %ebx, %esi553; X86-NEXT:    movl 8(%ebp), %eax554; X86-NEXT:    movl %edx, (%eax)555; X86-NEXT:    movl %ecx, 4(%eax)556; X86-NEXT:    movl %edi, 8(%eax)557; X86-NEXT:    movl %esi, 12(%eax)558; X86-NEXT:    leal -12(%ebp), %esp559; X86-NEXT:    popl %esi560; X86-NEXT:    popl %edi561; X86-NEXT:    popl %ebx562; X86-NEXT:    popl %ebp563; X86-NEXT:    retl $4564;565; X64-LABEL: scalar_i128:566; X64:       # %bb.0:567; X64-NEXT:    pushq %r15568; X64-NEXT:    pushq %r14569; X64-NEXT:    pushq %r13570; X64-NEXT:    pushq %r12571; X64-NEXT:    pushq %rbx572; X64-NEXT:    movq %r8, %r15573; X64-NEXT:    movq %rcx, %r12574; X64-NEXT:    movq %rdx, %r13575; X64-NEXT:    movq %rsi, %rbx576; X64-NEXT:    movq %rdi, %r14577; X64-NEXT:    callq __divti3@PLT578; X64-NEXT:    movq %rdx, %rcx579; X64-NEXT:    movq %rdx, 8(%r15)580; X64-NEXT:    movq %rax, (%r15)581; X64-NEXT:    imulq %rax, %r12582; X64-NEXT:    mulq %r13583; X64-NEXT:    addq %r12, %rdx584; X64-NEXT:    imulq %r13, %rcx585; X64-NEXT:    addq %rdx, %rcx586; X64-NEXT:    subq %rax, %r14587; X64-NEXT:    sbbq %rcx, %rbx588; X64-NEXT:    movq %r14, %rax589; X64-NEXT:    movq %rbx, %rdx590; X64-NEXT:    popq %rbx591; X64-NEXT:    popq %r12592; X64-NEXT:    popq %r13593; X64-NEXT:    popq %r14594; X64-NEXT:    popq %r15595; X64-NEXT:    retq596  %div = sdiv i128 %x, %y597  store i128 %div, ptr %divdst, align 4598  %t1 = mul i128 %div, %y599  %t2 = sub i128 %x, %t1600  ret i128 %t2601}602 603define <16 x i8> @vector_i128_i8(<16 x i8> %x, <16 x i8> %y, ptr %divdst) nounwind {604; X86-LABEL: vector_i128_i8:605; X86:       # %bb.0:606; X86-NEXT:    pushl %ebp607; X86-NEXT:    movl %esp, %ebp608; X86-NEXT:    pushl %ebx609; X86-NEXT:    pushl %edi610; X86-NEXT:    pushl %esi611; X86-NEXT:    andl $-16, %esp612; X86-NEXT:    subl $48, %esp613; X86-NEXT:    movdqa %xmm0, (%esp)614; X86-NEXT:    movdqa %xmm1, {{[0-9]+}}(%esp)615; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax616; X86-NEXT:    idivb {{[0-9]+}}(%esp)617; X86-NEXT:    movzbl %al, %eax618; X86-NEXT:    movd %eax, %xmm2619; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax620; X86-NEXT:    idivb {{[0-9]+}}(%esp)621; X86-NEXT:    movzbl %al, %eax622; X86-NEXT:    movd %eax, %xmm3623; X86-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]624; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax625; X86-NEXT:    idivb {{[0-9]+}}(%esp)626; X86-NEXT:    movzbl %al, %eax627; X86-NEXT:    movd %eax, %xmm4628; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax629; X86-NEXT:    idivb {{[0-9]+}}(%esp)630; X86-NEXT:    movzbl %al, %eax631; X86-NEXT:    movd %eax, %xmm2632; X86-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]633; X86-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]634; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax635; X86-NEXT:    idivb {{[0-9]+}}(%esp)636; X86-NEXT:    movzbl %al, %eax637; X86-NEXT:    movd %eax, %xmm3638; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax639; X86-NEXT:    idivb {{[0-9]+}}(%esp)640; X86-NEXT:    movzbl %al, %eax641; X86-NEXT:    movd %eax, %xmm4642; X86-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]643; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax644; X86-NEXT:    idivb {{[0-9]+}}(%esp)645; X86-NEXT:    movzbl %al, %eax646; X86-NEXT:    movd %eax, %xmm5647; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax648; X86-NEXT:    idivb {{[0-9]+}}(%esp)649; X86-NEXT:    movzbl %al, %eax650; X86-NEXT:    movd %eax, %xmm3651; X86-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7]652; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax653; X86-NEXT:    idivb {{[0-9]+}}(%esp)654; X86-NEXT:    movzbl %al, %eax655; X86-NEXT:    movd %eax, %xmm5656; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax657; X86-NEXT:    idivb {{[0-9]+}}(%esp)658; X86-NEXT:    movzbl %al, %eax659; X86-NEXT:    movd %eax, %xmm6660; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax661; X86-NEXT:    idivb {{[0-9]+}}(%esp)662; X86-NEXT:    movzbl %al, %edx663; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax664; X86-NEXT:    idivb {{[0-9]+}}(%esp)665; X86-NEXT:    movzbl %al, %esi666; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax667; X86-NEXT:    idivb {{[0-9]+}}(%esp)668; X86-NEXT:    movzbl %al, %edi669; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax670; X86-NEXT:    idivb {{[0-9]+}}(%esp)671; X86-NEXT:    movzbl %al, %ebx672; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax673; X86-NEXT:    idivb {{[0-9]+}}(%esp)674; X86-NEXT:    movl %eax, %ecx675; X86-NEXT:    movsbl (%esp), %eax676; X86-NEXT:    idivb {{[0-9]+}}(%esp)677; X86-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]678; X86-NEXT:    movd %edx, %xmm7679; X86-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]680; X86-NEXT:    movd %esi, %xmm4681; X86-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3],xmm6[4],xmm5[4],xmm6[5],xmm5[5],xmm6[6],xmm5[6],xmm6[7],xmm5[7]682; X86-NEXT:    movd %edi, %xmm2683; X86-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm7[0],xmm4[1],xmm7[1],xmm4[2],xmm7[2],xmm4[3],xmm7[3],xmm4[4],xmm7[4],xmm4[5],xmm7[5],xmm4[6],xmm7[6],xmm4[7],xmm7[7]684; X86-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1],xmm4[2],xmm6[2],xmm4[3],xmm6[3]685; X86-NEXT:    movd %ebx, %xmm5686; X86-NEXT:    movzbl %cl, %ecx687; X86-NEXT:    movd %ecx, %xmm6688; X86-NEXT:    movl 8(%ebp), %ecx689; X86-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7]690; X86-NEXT:    movzbl %al, %eax691; X86-NEXT:    movd %eax, %xmm2692; X86-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1],xmm2[2],xmm6[2],xmm2[3],xmm6[3],xmm2[4],xmm6[4],xmm2[5],xmm6[5],xmm2[6],xmm6[6],xmm2[7],xmm6[7]693; X86-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3]694; X86-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]695; X86-NEXT:    movdqa %xmm2, %xmm4696; X86-NEXT:    punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]697; X86-NEXT:    movdqa %xmm4, (%ecx)698; X86-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]699; X86-NEXT:    movdqa %xmm1, %xmm4700; X86-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]701; X86-NEXT:    pmullw %xmm3, %xmm4702; X86-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]703; X86-NEXT:    pand %xmm3, %xmm4704; X86-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]705; X86-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]706; X86-NEXT:    pmullw %xmm2, %xmm1707; X86-NEXT:    pand %xmm3, %xmm1708; X86-NEXT:    packuswb %xmm4, %xmm1709; X86-NEXT:    psubb %xmm1, %xmm0710; X86-NEXT:    leal -12(%ebp), %esp711; X86-NEXT:    popl %esi712; X86-NEXT:    popl %edi713; X86-NEXT:    popl %ebx714; X86-NEXT:    popl %ebp715; X86-NEXT:    retl716;717; X64-LABEL: vector_i128_i8:718; X64:       # %bb.0:719; X64-NEXT:    pushq %rbp720; X64-NEXT:    pushq %r15721; X64-NEXT:    pushq %r14722; X64-NEXT:    pushq %r13723; X64-NEXT:    pushq %r12724; X64-NEXT:    pushq %rbx725; X64-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill726; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)727; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)728; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax729; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)730; X64-NEXT:    movzbl %al, %eax731; X64-NEXT:    movd %eax, %xmm2732; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax733; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)734; X64-NEXT:    movzbl %al, %edi735; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax736; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)737; X64-NEXT:    movzbl %al, %esi738; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax739; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)740; X64-NEXT:    movzbl %al, %r8d741; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax742; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)743; X64-NEXT:    movzbl %al, %r9d744; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax745; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)746; X64-NEXT:    movzbl %al, %r10d747; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax748; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)749; X64-NEXT:    movzbl %al, %r11d750; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax751; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)752; X64-NEXT:    movzbl %al, %ebx753; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax754; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)755; X64-NEXT:    movzbl %al, %ebp756; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax757; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)758; X64-NEXT:    movzbl %al, %r14d759; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax760; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)761; X64-NEXT:    movzbl %al, %r15d762; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax763; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)764; X64-NEXT:    movzbl %al, %r12d765; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax766; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)767; X64-NEXT:    movzbl %al, %r13d768; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax769; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)770; X64-NEXT:    movzbl %al, %edx771; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax772; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)773; X64-NEXT:    movl %eax, %ecx774; X64-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax775; X64-NEXT:    idivb -{{[0-9]+}}(%rsp)776; X64-NEXT:    movd %edi, %xmm3777; X64-NEXT:    movd %esi, %xmm4778; X64-NEXT:    movd %r8d, %xmm5779; X64-NEXT:    movd %r9d, %xmm6780; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]781; X64-NEXT:    movd %r10d, %xmm7782; X64-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]783; X64-NEXT:    movd %r11d, %xmm4784; X64-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]785; X64-NEXT:    movd %ebx, %xmm2786; X64-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]787; X64-NEXT:    movd %ebp, %xmm3788; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]789; X64-NEXT:    movd %r14d, %xmm4790; X64-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1],xmm2[2],xmm7[2],xmm2[3],xmm7[3]791; X64-NEXT:    movd %r15d, %xmm6792; X64-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]793; X64-NEXT:    movd %r12d, %xmm5794; X64-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]795; X64-NEXT:    movd %r13d, %xmm3796; X64-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1],xmm5[2],xmm6[2],xmm5[3],xmm6[3],xmm5[4],xmm6[4],xmm5[5],xmm6[5],xmm5[6],xmm6[6],xmm5[7],xmm6[7]797; X64-NEXT:    movd %edx, %xmm6798; X64-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]799; X64-NEXT:    movzbl %cl, %ecx800; X64-NEXT:    movd %ecx, %xmm4801; X64-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1],xmm6[2],xmm3[2],xmm6[3],xmm3[3],xmm6[4],xmm3[4],xmm6[5],xmm3[5],xmm6[6],xmm3[6],xmm6[7],xmm3[7]802; X64-NEXT:    movzbl %al, %eax803; X64-NEXT:    movd %eax, %xmm3804; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]805; X64-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1],xmm3[2],xmm6[2],xmm3[3],xmm6[3]806; X64-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]807; X64-NEXT:    movdqa %xmm3, %xmm4808; X64-NEXT:    punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm2[0]809; X64-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload810; X64-NEXT:    movdqa %xmm4, (%rax)811; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]812; X64-NEXT:    movdqa %xmm1, %xmm4813; X64-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]814; X64-NEXT:    pmullw %xmm2, %xmm4815; X64-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]816; X64-NEXT:    pand %xmm2, %xmm4817; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]818; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]819; X64-NEXT:    pmullw %xmm3, %xmm1820; X64-NEXT:    pand %xmm2, %xmm1821; X64-NEXT:    packuswb %xmm4, %xmm1822; X64-NEXT:    psubb %xmm1, %xmm0823; X64-NEXT:    popq %rbx824; X64-NEXT:    popq %r12825; X64-NEXT:    popq %r13826; X64-NEXT:    popq %r14827; X64-NEXT:    popq %r15828; X64-NEXT:    popq %rbp829; X64-NEXT:    retq830  %div = sdiv <16 x i8> %x, %y831  store <16 x i8> %div, ptr %divdst, align 16832  %t1 = mul <16 x i8> %div, %y833  %t2 = sub <16 x i8> %x, %t1834  ret <16 x i8> %t2835}836 837define <8 x i16> @vector_i128_i16(<8 x i16> %x, <8 x i16> %y, ptr %divdst) nounwind {838; X86-LABEL: vector_i128_i16:839; X86:       # %bb.0:840; X86-NEXT:    pushl %esi841; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx842; X86-NEXT:    pextrw $7, %xmm0, %eax843; X86-NEXT:    pextrw $7, %xmm1, %esi844; X86-NEXT:    # kill: def $ax killed $ax killed $eax845; X86-NEXT:    cwtd846; X86-NEXT:    idivw %si847; X86-NEXT:    # kill: def $ax killed $ax def $eax848; X86-NEXT:    movd %eax, %xmm2849; X86-NEXT:    pextrw $6, %xmm0, %eax850; X86-NEXT:    pextrw $6, %xmm1, %esi851; X86-NEXT:    # kill: def $ax killed $ax killed $eax852; X86-NEXT:    cwtd853; X86-NEXT:    idivw %si854; X86-NEXT:    # kill: def $ax killed $ax def $eax855; X86-NEXT:    movd %eax, %xmm3856; X86-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]857; X86-NEXT:    pextrw $5, %xmm0, %eax858; X86-NEXT:    pextrw $5, %xmm1, %esi859; X86-NEXT:    # kill: def $ax killed $ax killed $eax860; X86-NEXT:    cwtd861; X86-NEXT:    idivw %si862; X86-NEXT:    # kill: def $ax killed $ax def $eax863; X86-NEXT:    movd %eax, %xmm4864; X86-NEXT:    pextrw $4, %xmm0, %eax865; X86-NEXT:    pextrw $4, %xmm1, %esi866; X86-NEXT:    # kill: def $ax killed $ax killed $eax867; X86-NEXT:    cwtd868; X86-NEXT:    idivw %si869; X86-NEXT:    # kill: def $ax killed $ax def $eax870; X86-NEXT:    movd %eax, %xmm2871; X86-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]872; X86-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]873; X86-NEXT:    pextrw $3, %xmm0, %eax874; X86-NEXT:    pextrw $3, %xmm1, %esi875; X86-NEXT:    # kill: def $ax killed $ax killed $eax876; X86-NEXT:    cwtd877; X86-NEXT:    idivw %si878; X86-NEXT:    # kill: def $ax killed $ax def $eax879; X86-NEXT:    movd %eax, %xmm4880; X86-NEXT:    pextrw $2, %xmm0, %eax881; X86-NEXT:    pextrw $2, %xmm1, %esi882; X86-NEXT:    # kill: def $ax killed $ax killed $eax883; X86-NEXT:    cwtd884; X86-NEXT:    idivw %si885; X86-NEXT:    # kill: def $ax killed $ax def $eax886; X86-NEXT:    movd %eax, %xmm3887; X86-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]888; X86-NEXT:    pextrw $1, %xmm0, %eax889; X86-NEXT:    pextrw $1, %xmm1, %esi890; X86-NEXT:    # kill: def $ax killed $ax killed $eax891; X86-NEXT:    cwtd892; X86-NEXT:    idivw %si893; X86-NEXT:    # kill: def $ax killed $ax def $eax894; X86-NEXT:    movd %eax, %xmm4895; X86-NEXT:    movd %xmm0, %eax896; X86-NEXT:    movd %xmm1, %esi897; X86-NEXT:    # kill: def $ax killed $ax killed $eax898; X86-NEXT:    cwtd899; X86-NEXT:    idivw %si900; X86-NEXT:    # kill: def $ax killed $ax def $eax901; X86-NEXT:    movd %eax, %xmm5902; X86-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]903; X86-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]904; X86-NEXT:    punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm2[0]905; X86-NEXT:    movdqa %xmm5, (%ecx)906; X86-NEXT:    pmullw %xmm1, %xmm5907; X86-NEXT:    psubw %xmm5, %xmm0908; X86-NEXT:    popl %esi909; X86-NEXT:    retl910;911; X64-LABEL: vector_i128_i16:912; X64:       # %bb.0:913; X64-NEXT:    pextrw $7, %xmm0, %eax914; X64-NEXT:    pextrw $7, %xmm1, %ecx915; X64-NEXT:    # kill: def $ax killed $ax killed $eax916; X64-NEXT:    cwtd917; X64-NEXT:    idivw %cx918; X64-NEXT:    # kill: def $ax killed $ax def $eax919; X64-NEXT:    movd %eax, %xmm2920; X64-NEXT:    pextrw $6, %xmm0, %eax921; X64-NEXT:    pextrw $6, %xmm1, %ecx922; X64-NEXT:    # kill: def $ax killed $ax killed $eax923; X64-NEXT:    cwtd924; X64-NEXT:    idivw %cx925; X64-NEXT:    # kill: def $ax killed $ax def $eax926; X64-NEXT:    movd %eax, %xmm3927; X64-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]928; X64-NEXT:    pextrw $5, %xmm0, %eax929; X64-NEXT:    pextrw $5, %xmm1, %ecx930; X64-NEXT:    # kill: def $ax killed $ax killed $eax931; X64-NEXT:    cwtd932; X64-NEXT:    idivw %cx933; X64-NEXT:    # kill: def $ax killed $ax def $eax934; X64-NEXT:    movd %eax, %xmm4935; X64-NEXT:    pextrw $4, %xmm0, %eax936; X64-NEXT:    pextrw $4, %xmm1, %ecx937; X64-NEXT:    # kill: def $ax killed $ax killed $eax938; X64-NEXT:    cwtd939; X64-NEXT:    idivw %cx940; X64-NEXT:    # kill: def $ax killed $ax def $eax941; X64-NEXT:    movd %eax, %xmm2942; X64-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]943; X64-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]944; X64-NEXT:    pextrw $3, %xmm0, %eax945; X64-NEXT:    pextrw $3, %xmm1, %ecx946; X64-NEXT:    # kill: def $ax killed $ax killed $eax947; X64-NEXT:    cwtd948; X64-NEXT:    idivw %cx949; X64-NEXT:    # kill: def $ax killed $ax def $eax950; X64-NEXT:    movd %eax, %xmm3951; X64-NEXT:    pextrw $2, %xmm0, %eax952; X64-NEXT:    pextrw $2, %xmm1, %ecx953; X64-NEXT:    # kill: def $ax killed $ax killed $eax954; X64-NEXT:    cwtd955; X64-NEXT:    idivw %cx956; X64-NEXT:    # kill: def $ax killed $ax def $eax957; X64-NEXT:    movd %eax, %xmm4958; X64-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]959; X64-NEXT:    pextrw $1, %xmm0, %eax960; X64-NEXT:    pextrw $1, %xmm1, %ecx961; X64-NEXT:    # kill: def $ax killed $ax killed $eax962; X64-NEXT:    cwtd963; X64-NEXT:    idivw %cx964; X64-NEXT:    # kill: def $ax killed $ax def $eax965; X64-NEXT:    movd %eax, %xmm3966; X64-NEXT:    movd %xmm0, %eax967; X64-NEXT:    movd %xmm1, %ecx968; X64-NEXT:    # kill: def $ax killed $ax killed $eax969; X64-NEXT:    cwtd970; X64-NEXT:    idivw %cx971; X64-NEXT:    # kill: def $ax killed $ax def $eax972; X64-NEXT:    movd %eax, %xmm5973; X64-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]974; X64-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1]975; X64-NEXT:    punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm2[0]976; X64-NEXT:    movdqa %xmm5, (%rdi)977; X64-NEXT:    pmullw %xmm1, %xmm5978; X64-NEXT:    psubw %xmm5, %xmm0979; X64-NEXT:    retq980  %div = sdiv <8 x i16> %x, %y981  store <8 x i16> %div, ptr %divdst, align 16982  %t1 = mul <8 x i16> %div, %y983  %t2 = sub <8 x i16> %x, %t1984  ret <8 x i16> %t2985}986 987define <4 x i32> @vector_i128_i32(<4 x i32> %x, <4 x i32> %y, ptr %divdst) nounwind {988; X86-LABEL: vector_i128_i32:989; X86:       # %bb.0:990; X86-NEXT:    pushl %esi991; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx992; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]993; X86-NEXT:    movd %xmm2, %eax994; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]995; X86-NEXT:    movd %xmm2, %esi996; X86-NEXT:    cltd997; X86-NEXT:    idivl %esi998; X86-NEXT:    movd %eax, %xmm3999; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]1000; X86-NEXT:    movd %xmm2, %eax1001; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1002; X86-NEXT:    movd %xmm2, %esi1003; X86-NEXT:    cltd1004; X86-NEXT:    idivl %esi1005; X86-NEXT:    movd %eax, %xmm21006; X86-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1007; X86-NEXT:    movd %xmm0, %eax1008; X86-NEXT:    movd %xmm1, %esi1009; X86-NEXT:    cltd1010; X86-NEXT:    idivl %esi1011; X86-NEXT:    movd %eax, %xmm31012; X86-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]1013; X86-NEXT:    movd %xmm4, %eax1014; X86-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,1,1]1015; X86-NEXT:    movd %xmm4, %esi1016; X86-NEXT:    cltd1017; X86-NEXT:    idivl %esi1018; X86-NEXT:    movd %eax, %xmm41019; X86-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]1020; X86-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm2[0]1021; X86-NEXT:    movdqa %xmm3, (%ecx)1022; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]1023; X86-NEXT:    pmuludq %xmm1, %xmm31024; X86-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]1025; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1026; X86-NEXT:    pmuludq %xmm2, %xmm11027; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1028; X86-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]1029; X86-NEXT:    psubd %xmm3, %xmm01030; X86-NEXT:    popl %esi1031; X86-NEXT:    retl1032;1033; X64-LABEL: vector_i128_i32:1034; X64:       # %bb.0:1035; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]1036; X64-NEXT:    movd %xmm2, %eax1037; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]1038; X64-NEXT:    movd %xmm2, %ecx1039; X64-NEXT:    cltd1040; X64-NEXT:    idivl %ecx1041; X64-NEXT:    movd %eax, %xmm21042; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]1043; X64-NEXT:    movd %xmm3, %eax1044; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]1045; X64-NEXT:    movd %xmm3, %ecx1046; X64-NEXT:    cltd1047; X64-NEXT:    idivl %ecx1048; X64-NEXT:    movd %eax, %xmm31049; X64-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]1050; X64-NEXT:    movd %xmm0, %eax1051; X64-NEXT:    movd %xmm1, %ecx1052; X64-NEXT:    cltd1053; X64-NEXT:    idivl %ecx1054; X64-NEXT:    movd %eax, %xmm21055; X64-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]1056; X64-NEXT:    movd %xmm4, %eax1057; X64-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,1,1]1058; X64-NEXT:    movd %xmm4, %ecx1059; X64-NEXT:    cltd1060; X64-NEXT:    idivl %ecx1061; X64-NEXT:    movd %eax, %xmm41062; X64-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]1063; X64-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]1064; X64-NEXT:    movdqa %xmm2, (%rdi)1065; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1066; X64-NEXT:    pmuludq %xmm1, %xmm21067; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]1068; X64-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1069; X64-NEXT:    pmuludq %xmm3, %xmm11070; X64-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1071; X64-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]1072; X64-NEXT:    psubd %xmm2, %xmm01073; X64-NEXT:    retq1074  %div = sdiv <4 x i32> %x, %y1075  store <4 x i32> %div, ptr %divdst, align 161076  %t1 = mul <4 x i32> %div, %y1077  %t2 = sub <4 x i32> %x, %t11078  ret <4 x i32> %t21079}1080 1081define <2 x i64> @vector_i128_i64(<2 x i64> %x, <2 x i64> %y, ptr %divdst) nounwind {1082; X86-LABEL: vector_i128_i64:1083; X86:       # %bb.0:1084; X86-NEXT:    pushl %esi1085; X86-NEXT:    subl $64, %esp1086; X86-NEXT:    movdqu %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1087; X86-NEXT:    movdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1088; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1089; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]1090; X86-NEXT:    movd %xmm2, {{[0-9]+}}(%esp)1091; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1092; X86-NEXT:    movd %xmm2, {{[0-9]+}}(%esp)1093; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]1094; X86-NEXT:    movd %xmm1, {{[0-9]+}}(%esp)1095; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1096; X86-NEXT:    movd %xmm1, (%esp)1097; X86-NEXT:    calll __divdi31098; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload1099; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1100; X86-NEXT:    movd %xmm0, {{[0-9]+}}(%esp)1101; X86-NEXT:    movd %xmm1, {{[0-9]+}}(%esp)1102; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload1103; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1104; X86-NEXT:    movd %xmm0, {{[0-9]+}}(%esp)1105; X86-NEXT:    movd %xmm1, (%esp)1106; X86-NEXT:    movd %edx, %xmm01107; X86-NEXT:    movd %eax, %xmm11108; X86-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1109; X86-NEXT:    movdqu %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1110; X86-NEXT:    calll __divdi31111; X86-NEXT:    movd %edx, %xmm11112; X86-NEXT:    movd %eax, %xmm31113; X86-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]1114; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1115; X86-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]1116; X86-NEXT:    movdqa %xmm3, (%esi)1117; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1118; X86-NEXT:    movdqa %xmm0, %xmm11119; X86-NEXT:    psrlq $32, %xmm11120; X86-NEXT:    pmuludq %xmm3, %xmm11121; X86-NEXT:    movdqa %xmm3, %xmm21122; X86-NEXT:    psrlq $32, %xmm21123; X86-NEXT:    pmuludq %xmm0, %xmm21124; X86-NEXT:    paddq %xmm1, %xmm21125; X86-NEXT:    psllq $32, %xmm21126; X86-NEXT:    pmuludq %xmm0, %xmm31127; X86-NEXT:    paddq %xmm2, %xmm31128; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1129; X86-NEXT:    psubq %xmm3, %xmm01130; X86-NEXT:    addl $64, %esp1131; X86-NEXT:    popl %esi1132; X86-NEXT:    retl1133;1134; X64-LABEL: vector_i128_i64:1135; X64:       # %bb.0:1136; X64-NEXT:    movq %xmm0, %rax1137; X64-NEXT:    movq %xmm1, %rcx1138; X64-NEXT:    cqto1139; X64-NEXT:    idivq %rcx1140; X64-NEXT:    movq %rax, %xmm21141; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]1142; X64-NEXT:    movq %xmm3, %rax1143; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]1144; X64-NEXT:    movq %xmm3, %rcx1145; X64-NEXT:    cqto1146; X64-NEXT:    idivq %rcx1147; X64-NEXT:    movq %rax, %xmm31148; X64-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]1149; X64-NEXT:    movdqa %xmm2, (%rdi)1150; X64-NEXT:    movdqa %xmm1, %xmm31151; X64-NEXT:    psrlq $32, %xmm31152; X64-NEXT:    pmuludq %xmm2, %xmm31153; X64-NEXT:    movdqa %xmm2, %xmm41154; X64-NEXT:    psrlq $32, %xmm41155; X64-NEXT:    pmuludq %xmm1, %xmm41156; X64-NEXT:    paddq %xmm3, %xmm41157; X64-NEXT:    psllq $32, %xmm41158; X64-NEXT:    pmuludq %xmm1, %xmm21159; X64-NEXT:    paddq %xmm4, %xmm21160; X64-NEXT:    psubq %xmm2, %xmm01161; X64-NEXT:    retq1162  %div = sdiv <2 x i64> %x, %y1163  store <2 x i64> %div, ptr %divdst, align 161164  %t1 = mul <2 x i64> %div, %y1165  %t2 = sub <2 x i64> %x, %t11166  ret <2 x i64> %t21167}1168 1169define i32 @scalar_i32_const_pow2_divisor(i32 %0, ptr %1) minsize nounwind {1170; X86-LABEL: scalar_i32_const_pow2_divisor:1171; X86:       # %bb.0:1172; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1173; X86-NEXT:    movl $256, %ecx # imm = 0x1001174; X86-NEXT:    cltd1175; X86-NEXT:    idivl %ecx1176; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1177; X86-NEXT:    movl %edx, (%ecx)1178; X86-NEXT:    retl1179;1180; X64-LABEL: scalar_i32_const_pow2_divisor:1181; X64:       # %bb.0:1182; X64-NEXT:    movl %edi, %eax1183; X64-NEXT:    movl $256, %ecx # imm = 0x1001184; X64-NEXT:    cltd1185; X64-NEXT:    idivl %ecx1186; X64-NEXT:    movl %edx, (%rsi)1187; X64-NEXT:    retq1188  %3 = srem i32 %0, 2561189  store i32 %3, ptr %1, align 41190  %4 = sdiv i32 %0, 2561191  ret i32 %41192}1193 1194; Special tests.1195 1196define i32 @scalar_i32_commutative(i32 %x, ptr %ysrc, ptr %divdst) nounwind {1197; X86-LABEL: scalar_i32_commutative:1198; X86:       # %bb.0:1199; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1200; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1201; X86-NEXT:    cltd1202; X86-NEXT:    idivl (%ecx)1203; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1204; X86-NEXT:    movl %eax, (%ecx)1205; X86-NEXT:    movl %edx, %eax1206; X86-NEXT:    retl1207;1208; X64-LABEL: scalar_i32_commutative:1209; X64:       # %bb.0:1210; X64-NEXT:    movq %rdx, %rcx1211; X64-NEXT:    movl %edi, %eax1212; X64-NEXT:    cltd1213; X64-NEXT:    idivl (%rsi)1214; X64-NEXT:    movl %eax, (%rcx)1215; X64-NEXT:    movl %edx, %eax1216; X64-NEXT:    retq1217  %y = load i32, ptr %ysrc, align 41218  %div = sdiv i32 %x, %y1219  store i32 %div, ptr %divdst, align 41220  %t1 = mul i32 %y, %div ; commutative1221  %t2 = sub i32 %x, %t11222  ret i32 %t21223}1224 1225; We do not care about extra uses.1226define i32 @extrause(i32 %x, i32 %y, ptr %divdst, ptr %t1dst) nounwind {1227; X86-LABEL: extrause:1228; X86:       # %bb.0:1229; X86-NEXT:    pushl %edi1230; X86-NEXT:    pushl %esi1231; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1232; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1233; X86-NEXT:    cltd1234; X86-NEXT:    idivl %ecx1235; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1236; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi1237; X86-NEXT:    movl %eax, (%edi)1238; X86-NEXT:    imull %ecx, %eax1239; X86-NEXT:    movl %eax, (%esi)1240; X86-NEXT:    movl %edx, %eax1241; X86-NEXT:    popl %esi1242; X86-NEXT:    popl %edi1243; X86-NEXT:    retl1244;1245; X64-LABEL: extrause:1246; X64:       # %bb.0:1247; X64-NEXT:    movq %rdx, %r81248; X64-NEXT:    movl %edi, %eax1249; X64-NEXT:    cltd1250; X64-NEXT:    idivl %esi1251; X64-NEXT:    movl %eax, (%r8)1252; X64-NEXT:    imull %esi, %eax1253; X64-NEXT:    movl %eax, (%rcx)1254; X64-NEXT:    movl %edx, %eax1255; X64-NEXT:    retq1256  %div = sdiv i32 %x, %y1257  store i32 %div, ptr %divdst, align 41258  %t1 = mul i32 %div, %y1259  store i32 %t1, ptr %t1dst, align 41260  %t2 = sub i32 %x, %t11261  ret i32 %t21262}1263 1264; 'rem' should appear next to 'div'.1265define i32 @multiple_bb(i32 %x, i32 %y, ptr %divdst, i1 zeroext %store_srem, ptr %sremdst) nounwind {1266; X86-LABEL: multiple_bb:1267; X86:       # %bb.0:1268; X86-NEXT:    pushl %ebx1269; X86-NEXT:    pushl %edi1270; X86-NEXT:    pushl %esi1271; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1272; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1273; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1274; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi1275; X86-NEXT:    movl %ecx, %eax1276; X86-NEXT:    cltd1277; X86-NEXT:    idivl %esi1278; X86-NEXT:    movl %eax, (%edi)1279; X86-NEXT:    testb %bl, %bl1280; X86-NEXT:    je .LBB12_21281; X86-NEXT:  # %bb.1: # %do_srem1282; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1283; X86-NEXT:    movl %eax, %edi1284; X86-NEXT:    imull %esi, %edi1285; X86-NEXT:    subl %edi, %ecx1286; X86-NEXT:    movl %ecx, (%edx)1287; X86-NEXT:  .LBB12_2: # %end1288; X86-NEXT:    popl %esi1289; X86-NEXT:    popl %edi1290; X86-NEXT:    popl %ebx1291; X86-NEXT:    retl1292;1293; X64-LABEL: multiple_bb:1294; X64:       # %bb.0:1295; X64-NEXT:    movq %rdx, %r91296; X64-NEXT:    movl %edi, %eax1297; X64-NEXT:    cltd1298; X64-NEXT:    idivl %esi1299; X64-NEXT:    movl %eax, (%r9)1300; X64-NEXT:    testl %ecx, %ecx1301; X64-NEXT:    je .LBB12_21302; X64-NEXT:  # %bb.1: # %do_srem1303; X64-NEXT:    movl %eax, %ecx1304; X64-NEXT:    imull %esi, %ecx1305; X64-NEXT:    subl %ecx, %edi1306; X64-NEXT:    movl %edi, (%r8)1307; X64-NEXT:  .LBB12_2: # %end1308; X64-NEXT:    retq1309  %div = sdiv i32 %x, %y1310  store i32 %div, ptr %divdst, align 41311  br i1 %store_srem, label %do_srem, label %end1312do_srem:1313  %t1 = mul i32 %div, %y1314  %t2 = sub i32 %x, %t11315  store i32 %t2, ptr %sremdst, align 41316  br label %end1317end:1318  ret i32 %div1319}1320 1321define i32 @negative_different_x(i32 %x0, i32 %x1, i32 %y, ptr %divdst) nounwind {1322; X86-LABEL: negative_different_x:1323; X86:       # %bb.0:1324; X86-NEXT:    pushl %edi1325; X86-NEXT:    pushl %esi1326; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1327; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1328; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1329; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi1330; X86-NEXT:    cltd1331; X86-NEXT:    idivl %edi1332; X86-NEXT:    movl %eax, (%esi)1333; X86-NEXT:    imull %edi, %eax1334; X86-NEXT:    subl %eax, %ecx1335; X86-NEXT:    movl %ecx, %eax1336; X86-NEXT:    popl %esi1337; X86-NEXT:    popl %edi1338; X86-NEXT:    retl1339;1340; X64-LABEL: negative_different_x:1341; X64:       # %bb.0:1342; X64-NEXT:    movl %edx, %r8d1343; X64-NEXT:    movl %edi, %eax1344; X64-NEXT:    cltd1345; X64-NEXT:    idivl %r8d1346; X64-NEXT:    movl %eax, (%rcx)1347; X64-NEXT:    imull %r8d, %eax1348; X64-NEXT:    subl %eax, %esi1349; X64-NEXT:    movl %esi, %eax1350; X64-NEXT:    retq1351  %div = sdiv i32 %x0, %y ; not %x11352  store i32 %div, ptr %divdst, align 41353  %t1 = mul i32 %div, %y1354  %t2 = sub i32 %x1, %t1 ; not %x01355  ret i32 %t21356}1357 1358define i32 @negative_different_y(i32 %x0, i32 %x1, i32 %y, i32 %z, ptr %divdst) nounwind {1359; X86-LABEL: negative_different_y:1360; X86:       # %bb.0:1361; X86-NEXT:    pushl %esi1362; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1363; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1364; X86-NEXT:    movl %ecx, %eax1365; X86-NEXT:    cltd1366; X86-NEXT:    idivl {{[0-9]+}}(%esp)1367; X86-NEXT:    movl %eax, (%esi)1368; X86-NEXT:    imull {{[0-9]+}}(%esp), %eax1369; X86-NEXT:    subl %eax, %ecx1370; X86-NEXT:    movl %ecx, %eax1371; X86-NEXT:    popl %esi1372; X86-NEXT:    retl1373;1374; X64-LABEL: negative_different_y:1375; X64:       # %bb.0:1376; X64-NEXT:    movl %edx, %edi1377; X64-NEXT:    movl %esi, %eax1378; X64-NEXT:    cltd1379; X64-NEXT:    idivl %ecx1380; X64-NEXT:    movl %eax, (%r8)1381; X64-NEXT:    imull %eax, %edi1382; X64-NEXT:    subl %edi, %esi1383; X64-NEXT:    movl %esi, %eax1384; X64-NEXT:    retq1385  %div = sdiv i32 %x1, %z ; not %x01386  store i32 %div, ptr %divdst, align 41387  %t1 = mul i32 %div, %y1388  %t2 = sub i32 %x1, %t11389  ret i32 %t21390}1391 1392define i32 @negative_inverted_division(i32 %x0, i32 %x1, i32 %y, ptr %divdst) nounwind {1393; X86-LABEL: negative_inverted_division:1394; X86:       # %bb.0:1395; X86-NEXT:    pushl %esi1396; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1397; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1398; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1399; X86-NEXT:    cltd1400; X86-NEXT:    idivl %ecx1401; X86-NEXT:    movl %eax, (%esi)1402; X86-NEXT:    imull %ecx, %eax1403; X86-NEXT:    subl %eax, %ecx1404; X86-NEXT:    movl %ecx, %eax1405; X86-NEXT:    popl %esi1406; X86-NEXT:    retl1407;1408; X64-LABEL: negative_inverted_division:1409; X64:       # %bb.0:1410; X64-NEXT:    movl %edi, %eax1411; X64-NEXT:    cltd1412; X64-NEXT:    idivl %esi1413; X64-NEXT:    movl %eax, (%rcx)1414; X64-NEXT:    imull %esi, %eax1415; X64-NEXT:    subl %eax, %esi1416; X64-NEXT:    movl %esi, %eax1417; X64-NEXT:    retq1418  %div = sdiv i32 %x0, %x1 ; inverted division1419  store i32 %div, ptr %divdst, align 41420  %t1 = mul i32 %div, %x11421  %t2 = sub i32 %x1, %t11422  ret i32 %t21423}1424