1338 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: movzbl {{[0-9]+}}(%esp), %eax15; X86-NEXT: divb {{[0-9]+}}(%esp)16; X86-NEXT: movl {{[0-9]+}}(%esp), %edx17; X86-NEXT: movzbl %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: movzbl %dil, %eax25; X64-NEXT: divb %sil26; X64-NEXT: movzbl %ah, %ecx27; X64-NEXT: movb %al, (%rdx)28; X64-NEXT: movl %ecx, %eax29; X64-NEXT: retq30 %div = udiv 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: xorl %edx, %edx42; X86-NEXT: divw {{[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: xorl %edx, %edx54; X64-NEXT: divw %si55; X64-NEXT: movw %ax, (%rcx)56; X64-NEXT: movl %edx, %eax57; X64-NEXT: retq58 %div = udiv 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: xorl %edx, %edx70; X86-NEXT: divl {{[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: xorl %edx, %edx81; X64-NEXT: divl %esi82; X64-NEXT: movl %eax, (%rcx)83; X64-NEXT: movl %edx, %eax84; X64-NEXT: retq85 %div = udiv 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 __udivdi3108; 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: xorl %edx, %edx133; X64-NEXT: divq %rsi134; X64-NEXT: movq %rax, (%rcx)135; X64-NEXT: movq %rdx, %rax136; X64-NEXT: retq137 %div = udiv 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 $160, %esp155; X86-NEXT: movl 40(%ebp), %ebx156; X86-NEXT: movl 52(%ebp), %esi157; X86-NEXT: movl 44(%ebp), %edi158; X86-NEXT: movl %edi, %eax159; X86-NEXT: orl %esi, %eax160; X86-NEXT: movl %ebx, %ecx161; X86-NEXT: orl 48(%ebp), %ecx162; X86-NEXT: orl %eax, %ecx163; X86-NEXT: sete %cl164; X86-NEXT: movl 28(%ebp), %eax165; X86-NEXT: orl 36(%ebp), %eax166; X86-NEXT: movl 24(%ebp), %edx167; X86-NEXT: orl 32(%ebp), %edx168; X86-NEXT: orl %eax, %edx169; X86-NEXT: sete %al170; X86-NEXT: orb %cl, %al171; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill172; X86-NEXT: bsrl %esi, %edx173; X86-NEXT: xorl $31, %edx174; X86-NEXT: bsrl 48(%ebp), %ecx175; X86-NEXT: xorl $31, %ecx176; X86-NEXT: orl $32, %ecx177; X86-NEXT: testl %esi, %esi178; X86-NEXT: cmovnel %edx, %ecx179; X86-NEXT: bsrl %edi, %edx180; X86-NEXT: xorl $31, %edx181; X86-NEXT: bsrl %ebx, %eax182; X86-NEXT: xorl $31, %eax183; X86-NEXT: orl $32, %eax184; X86-NEXT: testl %edi, %edi185; X86-NEXT: cmovnel %edx, %eax186; X86-NEXT: orl $64, %eax187; X86-NEXT: movl 48(%ebp), %edx188; X86-NEXT: orl %esi, %edx189; X86-NEXT: cmovnel %ecx, %eax190; X86-NEXT: movl 36(%ebp), %ebx191; X86-NEXT: bsrl %ebx, %edx192; X86-NEXT: xorl $31, %edx193; X86-NEXT: movl 32(%ebp), %ecx194; X86-NEXT: bsrl %ecx, %ecx195; X86-NEXT: xorl $31, %ecx196; X86-NEXT: orl $32, %ecx197; X86-NEXT: testl %ebx, %ebx198; X86-NEXT: cmovnel %edx, %ecx199; X86-NEXT: movl 28(%ebp), %edi200; X86-NEXT: bsrl %edi, %esi201; X86-NEXT: xorl $31, %esi202; X86-NEXT: bsrl 24(%ebp), %edx203; X86-NEXT: xorl $31, %edx204; X86-NEXT: orl $32, %edx205; X86-NEXT: testl %edi, %edi206; X86-NEXT: cmovnel %esi, %edx207; X86-NEXT: orl $64, %edx208; X86-NEXT: movl 32(%ebp), %esi209; X86-NEXT: orl %ebx, %esi210; X86-NEXT: cmovnel %ecx, %edx211; X86-NEXT: xorl %edi, %edi212; X86-NEXT: subl %edx, %eax213; X86-NEXT: movl $0, %ebx214; X86-NEXT: sbbl %ebx, %ebx215; X86-NEXT: movl $0, %ecx216; X86-NEXT: sbbl %ecx, %ecx217; X86-NEXT: movl $0, %esi218; X86-NEXT: sbbl %esi, %esi219; X86-NEXT: movl $127, %edx220; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill221; X86-NEXT: cmpl %eax, %edx222; X86-NEXT: movl $0, %edx223; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill224; X86-NEXT: sbbl %ebx, %edx225; X86-NEXT: movl $0, %edx226; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill227; X86-NEXT: sbbl %ecx, %edx228; X86-NEXT: movl $0, %edx229; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill230; X86-NEXT: sbbl %esi, %edx231; X86-NEXT: setb %dl232; X86-NEXT: orb {{[-0-9]+}}(%e{{[sb]}}p), %dl # 1-byte Folded Reload233; X86-NEXT: movl 36(%ebp), %eax234; X86-NEXT: cmovnel %edi, %eax235; X86-NEXT: movl 32(%ebp), %esi236; X86-NEXT: cmovnel %edi, %esi237; X86-NEXT: movl 28(%ebp), %edx238; X86-NEXT: cmovnel %edi, %edx239; X86-NEXT: movl 24(%ebp), %ebx240; X86-NEXT: cmovnel %edi, %ebx241; X86-NEXT: movl 56(%ebp), %edi242; X86-NEXT: jne .LBB4_8243; X86-NEXT: # %bb.1: # %_udiv-special-cases244; X86-NEXT: movl %eax, %edi245; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload246; X86-NEXT: xorl $127, %eax247; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload248; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload249; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload250; X86-NEXT: orl %eax, %ecx251; X86-NEXT: movl %edi, %eax252; X86-NEXT: movl 56(%ebp), %edi253; X86-NEXT: movl 24(%ebp), %ecx254; X86-NEXT: je .LBB4_8255; X86-NEXT: # %bb.2: # %udiv-bb1256; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)257; X86-NEXT: xorps %xmm0, %xmm0258; X86-NEXT: movaps %xmm0, {{[0-9]+}}(%esp)259; X86-NEXT: movl 28(%ebp), %eax260; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)261; X86-NEXT: movl 32(%ebp), %eax262; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)263; X86-NEXT: movl 36(%ebp), %eax264; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)265; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload266; X86-NEXT: movl %eax, %ecx267; X86-NEXT: xorb $127, %cl268; X86-NEXT: movl %ecx, %eax269; X86-NEXT: shrb $3, %al270; X86-NEXT: andb $12, %al271; X86-NEXT: negb %al272; X86-NEXT: movsbl %al, %eax273; X86-NEXT: movl 136(%esp,%eax), %esi274; X86-NEXT: movl 140(%esp,%eax), %edx275; X86-NEXT: shldl %cl, %esi, %edx276; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill277; X86-NEXT: movl 128(%esp,%eax), %ebx278; X86-NEXT: movl 132(%esp,%eax), %edx279; X86-NEXT: shldl %cl, %edx, %esi280; X86-NEXT: shldl %cl, %ebx, %edx281; X86-NEXT: shll %cl, %ebx282; X86-NEXT: addl $1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill283; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload284; X86-NEXT: adcl $0, %eax285; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload286; X86-NEXT: adcl $0, %ecx287; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill288; X86-NEXT: jae .LBB4_3289; X86-NEXT: # %bb.6:290; X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill291; X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill292; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload293; X86-NEXT: jmp .LBB4_7294; X86-NEXT: .LBB4_3: # %udiv-preheader295; X86-NEXT: movaps %xmm0, {{[0-9]+}}(%esp)296; X86-NEXT: movl 24(%ebp), %edi297; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)298; X86-NEXT: movl 28(%ebp), %edi299; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)300; X86-NEXT: movl 32(%ebp), %edi301; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)302; X86-NEXT: movl 36(%ebp), %edi303; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)304; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill305; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload306; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill307; X86-NEXT: movl %ecx, %eax308; X86-NEXT: shrb $3, %al309; X86-NEXT: andb $12, %al310; X86-NEXT: movzbl %al, %eax311; X86-NEXT: movl 92(%esp,%eax), %edi312; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill313; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill314; X86-NEXT: movl 88(%esp,%eax), %edi315; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill316; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload317; X86-NEXT: shrdl %cl, %edx, %edi318; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill319; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill320; X86-NEXT: movl 80(%esp,%eax), %edx321; X86-NEXT: movl 84(%esp,%eax), %eax322; X86-NEXT: movl %eax, %ebx323; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload324; X86-NEXT: shrdl %cl, %edi, %ebx325; X86-NEXT: shrl %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill326; X86-NEXT: # kill: def $cl killed $cl killed $ecx327; X86-NEXT: shrdl %cl, %eax, %edx328; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill329; X86-NEXT: movl 40(%ebp), %eax330; X86-NEXT: addl $-1, %eax331; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill332; X86-NEXT: movl 44(%ebp), %eax333; X86-NEXT: adcl $-1, %eax334; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill335; X86-NEXT: movl 48(%ebp), %eax336; X86-NEXT: adcl $-1, %eax337; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill338; X86-NEXT: movl 52(%ebp), %eax339; X86-NEXT: adcl $-1, %eax340; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill341; X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill342; X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill343; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload344; X86-NEXT: .p2align 4345; X86-NEXT: .LBB4_4: # %udiv-do-while346; X86-NEXT: # =>This Inner Loop Header: Depth=1347; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload348; X86-NEXT: shldl $1, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill349; X86-NEXT: shldl $1, %ebx, %edx350; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill351; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload352; X86-NEXT: shldl $1, %edi, %ebx353; X86-NEXT: shldl $1, %ecx, %edi354; X86-NEXT: shldl $1, %esi, %ecx355; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload356; X86-NEXT: orl %eax, %ecx357; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill358; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload359; X86-NEXT: shldl $1, %ecx, %esi360; X86-NEXT: orl %eax, %esi361; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill362; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload363; X86-NEXT: shldl $1, %esi, %ecx364; X86-NEXT: orl %eax, %ecx365; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill366; X86-NEXT: addl %esi, %esi367; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload368; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill369; X86-NEXT: cmpl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload370; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload371; X86-NEXT: sbbl %ebx, %ecx372; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload373; X86-NEXT: sbbl %edx, %ecx374; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload375; X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload376; X86-NEXT: sarl $31, %ecx377; X86-NEXT: movl %ecx, %eax378; X86-NEXT: andl $1, %eax379; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill380; X86-NEXT: movl %ecx, %esi381; X86-NEXT: andl 52(%ebp), %esi382; X86-NEXT: movl %ecx, %eax383; X86-NEXT: andl 48(%ebp), %eax384; X86-NEXT: movl %ecx, %edx385; X86-NEXT: andl 44(%ebp), %edx386; X86-NEXT: andl 40(%ebp), %ecx387; X86-NEXT: subl %ecx, %edi388; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill389; X86-NEXT: sbbl %edx, %ebx390; X86-NEXT: sbbl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill391; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload392; X86-NEXT: sbbl %esi, %eax393; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill394; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload395; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload396; X86-NEXT: addl $-1, %ecx397; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload398; X86-NEXT: adcl $-1, %eax399; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload400; X86-NEXT: adcl $-1, %edx401; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload402; X86-NEXT: adcl $-1, %edi403; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill404; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill405; X86-NEXT: orl %edi, %eax406; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill407; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill408; X86-NEXT: orl %edx, %ecx409; X86-NEXT: orl %eax, %ecx410; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload411; X86-NEXT: jne .LBB4_4412; X86-NEXT: # %bb.5:413; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload414; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload415; X86-NEXT: movl %ecx, %eax416; X86-NEXT: movl 56(%ebp), %edi417; X86-NEXT: .LBB4_7: # %udiv-loop-exit418; X86-NEXT: shldl $1, %esi, %eax419; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload420; X86-NEXT: orl %ecx, %eax421; X86-NEXT: shldl $1, %edx, %esi422; X86-NEXT: orl %ecx, %esi423; X86-NEXT: shldl $1, %ebx, %edx424; X86-NEXT: orl %ecx, %edx425; X86-NEXT: addl %ebx, %ebx426; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload427; X86-NEXT: .LBB4_8: # %udiv-end428; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill429; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill430; X86-NEXT: movl %ebx, (%edi)431; X86-NEXT: movl %edx, 4(%edi)432; X86-NEXT: movl %esi, 8(%edi)433; X86-NEXT: movl %eax, 12(%edi)434; X86-NEXT: movl %eax, %ecx435; X86-NEXT: movl 48(%ebp), %eax436; X86-NEXT: movl %eax, %esi437; X86-NEXT: imull %edx, %esi438; X86-NEXT: mull %ebx439; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill440; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill441; X86-NEXT: addl %esi, %edx442; X86-NEXT: movl 52(%ebp), %edi443; X86-NEXT: imull %ebx, %edi444; X86-NEXT: addl %edx, %edi445; X86-NEXT: movl 40(%ebp), %eax446; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload447; X86-NEXT: mull %ebx448; X86-NEXT: movl %eax, %esi449; X86-NEXT: imull 40(%ebp), %ecx450; X86-NEXT: addl %edx, %ecx451; X86-NEXT: movl 44(%ebp), %eax452; X86-NEXT: imull %eax, %ebx453; X86-NEXT: addl %ecx, %ebx454; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload455; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill456; X86-NEXT: adcl %edi, %ebx457; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill458; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload459; X86-NEXT: movl %esi, %eax460; X86-NEXT: movl 40(%ebp), %ecx461; X86-NEXT: mull %ecx462; X86-NEXT: movl %edx, %edi463; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill464; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload465; X86-NEXT: mull %ecx466; X86-NEXT: movl %edx, %ebx467; X86-NEXT: movl %eax, %ecx468; X86-NEXT: addl %edi, %ecx469; X86-NEXT: adcl $0, %ebx470; X86-NEXT: movl %esi, %eax471; X86-NEXT: mull 44(%ebp)472; X86-NEXT: movl 28(%ebp), %esi473; X86-NEXT: movl %edx, %edi474; X86-NEXT: addl %ecx, %eax475; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill476; X86-NEXT: adcl %ebx, %edi477; X86-NEXT: setb %cl478; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload479; X86-NEXT: mull 44(%ebp)480; X86-NEXT: addl %edi, %eax481; X86-NEXT: movzbl %cl, %ecx482; X86-NEXT: adcl %ecx, %edx483; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload484; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload485; X86-NEXT: movl 24(%ebp), %ebx486; X86-NEXT: subl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload487; X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload488; X86-NEXT: movl 32(%ebp), %edi489; X86-NEXT: sbbl %eax, %edi490; X86-NEXT: movl 36(%ebp), %ecx491; X86-NEXT: sbbl %edx, %ecx492; X86-NEXT: movl 8(%ebp), %eax493; X86-NEXT: movl %ebx, (%eax)494; X86-NEXT: movl %esi, 4(%eax)495; X86-NEXT: movl %edi, 8(%eax)496; X86-NEXT: movl %ecx, 12(%eax)497; X86-NEXT: leal -12(%ebp), %esp498; X86-NEXT: popl %esi499; X86-NEXT: popl %edi500; X86-NEXT: popl %ebx501; X86-NEXT: popl %ebp502; X86-NEXT: retl $4503;504; X64-LABEL: scalar_i128:505; X64: # %bb.0:506; X64-NEXT: pushq %r15507; X64-NEXT: pushq %r14508; X64-NEXT: pushq %r13509; X64-NEXT: pushq %r12510; X64-NEXT: pushq %rbx511; X64-NEXT: movq %r8, %r15512; X64-NEXT: movq %rcx, %r12513; X64-NEXT: movq %rdx, %r13514; X64-NEXT: movq %rsi, %rbx515; X64-NEXT: movq %rdi, %r14516; X64-NEXT: callq __udivti3@PLT517; X64-NEXT: movq %rdx, %rcx518; X64-NEXT: movq %rdx, 8(%r15)519; X64-NEXT: movq %rax, (%r15)520; X64-NEXT: imulq %rax, %r12521; X64-NEXT: mulq %r13522; X64-NEXT: addq %r12, %rdx523; X64-NEXT: imulq %r13, %rcx524; X64-NEXT: addq %rdx, %rcx525; X64-NEXT: subq %rax, %r14526; X64-NEXT: sbbq %rcx, %rbx527; X64-NEXT: movq %r14, %rax528; X64-NEXT: movq %rbx, %rdx529; X64-NEXT: popq %rbx530; X64-NEXT: popq %r12531; X64-NEXT: popq %r13532; X64-NEXT: popq %r14533; X64-NEXT: popq %r15534; X64-NEXT: retq535 %div = udiv i128 %x, %y536 store i128 %div, ptr %divdst, align 4537 %t1 = mul i128 %div, %y538 %t2 = sub i128 %x, %t1539 ret i128 %t2540}541 542define <16 x i8> @vector_i128_i8(<16 x i8> %x, <16 x i8> %y, ptr %divdst) nounwind {543; X86-LABEL: vector_i128_i8:544; X86: # %bb.0:545; X86-NEXT: pushl %ebp546; X86-NEXT: movl %esp, %ebp547; X86-NEXT: pushl %ebx548; X86-NEXT: pushl %edi549; X86-NEXT: pushl %esi550; X86-NEXT: andl $-16, %esp551; X86-NEXT: subl $48, %esp552; X86-NEXT: movdqa %xmm0, (%esp)553; X86-NEXT: movdqa %xmm1, {{[0-9]+}}(%esp)554; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax555; X86-NEXT: divb {{[0-9]+}}(%esp)556; X86-NEXT: movzbl %al, %eax557; X86-NEXT: movd %eax, %xmm2558; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax559; X86-NEXT: divb {{[0-9]+}}(%esp)560; X86-NEXT: movzbl %al, %eax561; X86-NEXT: movd %eax, %xmm3562; 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]563; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax564; X86-NEXT: divb {{[0-9]+}}(%esp)565; X86-NEXT: movzbl %al, %eax566; X86-NEXT: movd %eax, %xmm4567; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax568; X86-NEXT: divb {{[0-9]+}}(%esp)569; X86-NEXT: movzbl %al, %eax570; X86-NEXT: movd %eax, %xmm2571; 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]572; X86-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]573; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax574; X86-NEXT: divb {{[0-9]+}}(%esp)575; X86-NEXT: movzbl %al, %eax576; X86-NEXT: movd %eax, %xmm3577; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax578; X86-NEXT: divb {{[0-9]+}}(%esp)579; X86-NEXT: movzbl %al, %eax580; X86-NEXT: movd %eax, %xmm4581; 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]582; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax583; X86-NEXT: divb {{[0-9]+}}(%esp)584; X86-NEXT: movzbl %al, %eax585; X86-NEXT: movd %eax, %xmm5586; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax587; X86-NEXT: divb {{[0-9]+}}(%esp)588; X86-NEXT: movzbl %al, %eax589; X86-NEXT: movd %eax, %xmm3590; 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]591; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax592; X86-NEXT: divb {{[0-9]+}}(%esp)593; X86-NEXT: movzbl %al, %eax594; X86-NEXT: movd %eax, %xmm5595; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax596; X86-NEXT: divb {{[0-9]+}}(%esp)597; X86-NEXT: movzbl %al, %eax598; X86-NEXT: movd %eax, %xmm6599; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax600; X86-NEXT: divb {{[0-9]+}}(%esp)601; X86-NEXT: movzbl %al, %edx602; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax603; X86-NEXT: divb {{[0-9]+}}(%esp)604; X86-NEXT: movzbl %al, %esi605; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax606; X86-NEXT: divb {{[0-9]+}}(%esp)607; X86-NEXT: movzbl %al, %edi608; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax609; X86-NEXT: divb {{[0-9]+}}(%esp)610; X86-NEXT: movzbl %al, %ebx611; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax612; X86-NEXT: divb {{[0-9]+}}(%esp)613; X86-NEXT: movl %eax, %ecx614; X86-NEXT: movzbl (%esp), %eax615; X86-NEXT: divb {{[0-9]+}}(%esp)616; X86-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]617; X86-NEXT: movd %edx, %xmm7618; X86-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]619; X86-NEXT: movd %esi, %xmm4620; 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]621; X86-NEXT: movd %edi, %xmm2622; 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]623; X86-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1],xmm4[2],xmm6[2],xmm4[3],xmm6[3]624; X86-NEXT: movd %ebx, %xmm5625; X86-NEXT: movzbl %cl, %ecx626; X86-NEXT: movd %ecx, %xmm6627; X86-NEXT: movl 8(%ebp), %ecx628; 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]629; X86-NEXT: movzbl %al, %eax630; X86-NEXT: movd %eax, %xmm2631; 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]632; X86-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3]633; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]634; X86-NEXT: movdqa %xmm2, %xmm4635; X86-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]636; X86-NEXT: movdqa %xmm4, (%ecx)637; X86-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]638; X86-NEXT: movdqa %xmm1, %xmm4639; X86-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]640; X86-NEXT: pmullw %xmm3, %xmm4641; X86-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]642; X86-NEXT: pand %xmm3, %xmm4643; X86-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]644; X86-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]645; X86-NEXT: pmullw %xmm2, %xmm1646; X86-NEXT: pand %xmm3, %xmm1647; X86-NEXT: packuswb %xmm4, %xmm1648; X86-NEXT: psubb %xmm1, %xmm0649; X86-NEXT: leal -12(%ebp), %esp650; X86-NEXT: popl %esi651; X86-NEXT: popl %edi652; X86-NEXT: popl %ebx653; X86-NEXT: popl %ebp654; X86-NEXT: retl655;656; X64-LABEL: vector_i128_i8:657; X64: # %bb.0:658; X64-NEXT: pushq %rbp659; X64-NEXT: pushq %r15660; X64-NEXT: pushq %r14661; X64-NEXT: pushq %r13662; X64-NEXT: pushq %r12663; X64-NEXT: pushq %rbx664; X64-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill665; X64-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp)666; X64-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp)667; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax668; X64-NEXT: divb -{{[0-9]+}}(%rsp)669; X64-NEXT: movzbl %al, %eax670; X64-NEXT: movd %eax, %xmm2671; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax672; X64-NEXT: divb -{{[0-9]+}}(%rsp)673; X64-NEXT: movzbl %al, %edi674; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax675; X64-NEXT: divb -{{[0-9]+}}(%rsp)676; X64-NEXT: movzbl %al, %esi677; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax678; X64-NEXT: divb -{{[0-9]+}}(%rsp)679; X64-NEXT: movzbl %al, %r8d680; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax681; X64-NEXT: divb -{{[0-9]+}}(%rsp)682; X64-NEXT: movzbl %al, %r9d683; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax684; X64-NEXT: divb -{{[0-9]+}}(%rsp)685; X64-NEXT: movzbl %al, %r10d686; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax687; X64-NEXT: divb -{{[0-9]+}}(%rsp)688; X64-NEXT: movzbl %al, %r11d689; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax690; X64-NEXT: divb -{{[0-9]+}}(%rsp)691; X64-NEXT: movzbl %al, %ebx692; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax693; X64-NEXT: divb -{{[0-9]+}}(%rsp)694; X64-NEXT: movzbl %al, %ebp695; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax696; X64-NEXT: divb -{{[0-9]+}}(%rsp)697; X64-NEXT: movzbl %al, %r14d698; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax699; X64-NEXT: divb -{{[0-9]+}}(%rsp)700; X64-NEXT: movzbl %al, %r15d701; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax702; X64-NEXT: divb -{{[0-9]+}}(%rsp)703; X64-NEXT: movzbl %al, %r12d704; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax705; X64-NEXT: divb -{{[0-9]+}}(%rsp)706; X64-NEXT: movzbl %al, %r13d707; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax708; X64-NEXT: divb -{{[0-9]+}}(%rsp)709; X64-NEXT: movzbl %al, %edx710; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax711; X64-NEXT: divb -{{[0-9]+}}(%rsp)712; X64-NEXT: movl %eax, %ecx713; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax714; X64-NEXT: divb -{{[0-9]+}}(%rsp)715; X64-NEXT: movd %edi, %xmm3716; X64-NEXT: movd %esi, %xmm4717; X64-NEXT: movd %r8d, %xmm5718; X64-NEXT: movd %r9d, %xmm6719; 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]720; X64-NEXT: movd %r10d, %xmm7721; 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]722; X64-NEXT: movd %r11d, %xmm4723; X64-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]724; X64-NEXT: movd %ebx, %xmm2725; 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]726; X64-NEXT: movd %ebp, %xmm3727; 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]728; X64-NEXT: movd %r14d, %xmm4729; X64-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1],xmm2[2],xmm7[2],xmm2[3],xmm7[3]730; X64-NEXT: movd %r15d, %xmm6731; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]732; X64-NEXT: movd %r12d, %xmm5733; 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]734; X64-NEXT: movd %r13d, %xmm3735; 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]736; X64-NEXT: movd %edx, %xmm6737; X64-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]738; X64-NEXT: movzbl %cl, %ecx739; X64-NEXT: movd %ecx, %xmm4740; 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]741; X64-NEXT: movzbl %al, %eax742; X64-NEXT: movd %eax, %xmm3743; 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]744; X64-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1],xmm3[2],xmm6[2],xmm3[3],xmm6[3]745; X64-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]746; X64-NEXT: movdqa %xmm3, %xmm4747; X64-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm2[0]748; X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload749; X64-NEXT: movdqa %xmm4, (%rax)750; X64-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]751; X64-NEXT: movdqa %xmm1, %xmm4752; X64-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]753; X64-NEXT: pmullw %xmm2, %xmm4754; X64-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]755; X64-NEXT: pand %xmm2, %xmm4756; X64-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]757; X64-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]758; X64-NEXT: pmullw %xmm3, %xmm1759; X64-NEXT: pand %xmm2, %xmm1760; X64-NEXT: packuswb %xmm4, %xmm1761; X64-NEXT: psubb %xmm1, %xmm0762; X64-NEXT: popq %rbx763; X64-NEXT: popq %r12764; X64-NEXT: popq %r13765; X64-NEXT: popq %r14766; X64-NEXT: popq %r15767; X64-NEXT: popq %rbp768; X64-NEXT: retq769 %div = udiv <16 x i8> %x, %y770 store <16 x i8> %div, ptr %divdst, align 16771 %t1 = mul <16 x i8> %div, %y772 %t2 = sub <16 x i8> %x, %t1773 ret <16 x i8> %t2774}775 776define <8 x i16> @vector_i128_i16(<8 x i16> %x, <8 x i16> %y, ptr %divdst) nounwind {777; X86-LABEL: vector_i128_i16:778; X86: # %bb.0:779; X86-NEXT: pushl %esi780; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx781; X86-NEXT: pextrw $7, %xmm0, %eax782; X86-NEXT: pextrw $7, %xmm1, %esi783; X86-NEXT: # kill: def $ax killed $ax killed $eax784; X86-NEXT: xorl %edx, %edx785; X86-NEXT: divw %si786; X86-NEXT: # kill: def $ax killed $ax def $eax787; X86-NEXT: movd %eax, %xmm2788; X86-NEXT: pextrw $6, %xmm0, %eax789; X86-NEXT: pextrw $6, %xmm1, %esi790; X86-NEXT: # kill: def $ax killed $ax killed $eax791; X86-NEXT: xorl %edx, %edx792; X86-NEXT: divw %si793; X86-NEXT: # kill: def $ax killed $ax def $eax794; X86-NEXT: movd %eax, %xmm3795; X86-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]796; X86-NEXT: pextrw $5, %xmm0, %eax797; X86-NEXT: pextrw $5, %xmm1, %esi798; X86-NEXT: # kill: def $ax killed $ax killed $eax799; X86-NEXT: xorl %edx, %edx800; X86-NEXT: divw %si801; X86-NEXT: # kill: def $ax killed $ax def $eax802; X86-NEXT: movd %eax, %xmm4803; X86-NEXT: pextrw $4, %xmm0, %eax804; X86-NEXT: pextrw $4, %xmm1, %esi805; X86-NEXT: # kill: def $ax killed $ax killed $eax806; X86-NEXT: xorl %edx, %edx807; X86-NEXT: divw %si808; X86-NEXT: # kill: def $ax killed $ax def $eax809; X86-NEXT: movd %eax, %xmm2810; X86-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]811; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]812; X86-NEXT: pextrw $3, %xmm0, %eax813; X86-NEXT: pextrw $3, %xmm1, %esi814; X86-NEXT: # kill: def $ax killed $ax killed $eax815; X86-NEXT: xorl %edx, %edx816; X86-NEXT: divw %si817; X86-NEXT: # kill: def $ax killed $ax def $eax818; X86-NEXT: movd %eax, %xmm4819; X86-NEXT: pextrw $2, %xmm0, %eax820; X86-NEXT: pextrw $2, %xmm1, %esi821; X86-NEXT: # kill: def $ax killed $ax killed $eax822; X86-NEXT: xorl %edx, %edx823; X86-NEXT: divw %si824; X86-NEXT: # kill: def $ax killed $ax def $eax825; X86-NEXT: movd %eax, %xmm3826; X86-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]827; X86-NEXT: pextrw $1, %xmm0, %eax828; X86-NEXT: pextrw $1, %xmm1, %esi829; X86-NEXT: # kill: def $ax killed $ax killed $eax830; X86-NEXT: xorl %edx, %edx831; X86-NEXT: divw %si832; X86-NEXT: # kill: def $ax killed $ax def $eax833; X86-NEXT: movd %eax, %xmm4834; X86-NEXT: movd %xmm0, %eax835; X86-NEXT: movd %xmm1, %esi836; X86-NEXT: # kill: def $ax killed $ax killed $eax837; X86-NEXT: xorl %edx, %edx838; X86-NEXT: divw %si839; X86-NEXT: # kill: def $ax killed $ax def $eax840; X86-NEXT: movd %eax, %xmm5841; X86-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]842; X86-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]843; X86-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm2[0]844; X86-NEXT: movdqa %xmm5, (%ecx)845; X86-NEXT: pmullw %xmm1, %xmm5846; X86-NEXT: psubw %xmm5, %xmm0847; X86-NEXT: popl %esi848; X86-NEXT: retl849;850; X64-LABEL: vector_i128_i16:851; X64: # %bb.0:852; X64-NEXT: pextrw $7, %xmm0, %eax853; X64-NEXT: pextrw $7, %xmm1, %ecx854; X64-NEXT: # kill: def $ax killed $ax killed $eax855; X64-NEXT: xorl %edx, %edx856; X64-NEXT: divw %cx857; X64-NEXT: # kill: def $ax killed $ax def $eax858; X64-NEXT: movd %eax, %xmm2859; X64-NEXT: pextrw $6, %xmm0, %eax860; X64-NEXT: pextrw $6, %xmm1, %ecx861; X64-NEXT: # kill: def $ax killed $ax killed $eax862; X64-NEXT: xorl %edx, %edx863; X64-NEXT: divw %cx864; X64-NEXT: # kill: def $ax killed $ax def $eax865; X64-NEXT: movd %eax, %xmm3866; X64-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]867; X64-NEXT: pextrw $5, %xmm0, %eax868; X64-NEXT: pextrw $5, %xmm1, %ecx869; X64-NEXT: # kill: def $ax killed $ax killed $eax870; X64-NEXT: xorl %edx, %edx871; X64-NEXT: divw %cx872; X64-NEXT: # kill: def $ax killed $ax def $eax873; X64-NEXT: movd %eax, %xmm4874; X64-NEXT: pextrw $4, %xmm0, %eax875; X64-NEXT: pextrw $4, %xmm1, %ecx876; X64-NEXT: # kill: def $ax killed $ax killed $eax877; X64-NEXT: xorl %edx, %edx878; X64-NEXT: divw %cx879; X64-NEXT: # kill: def $ax killed $ax def $eax880; X64-NEXT: movd %eax, %xmm2881; X64-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]882; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]883; X64-NEXT: pextrw $3, %xmm0, %eax884; X64-NEXT: pextrw $3, %xmm1, %ecx885; X64-NEXT: # kill: def $ax killed $ax killed $eax886; X64-NEXT: xorl %edx, %edx887; X64-NEXT: divw %cx888; X64-NEXT: # kill: def $ax killed $ax def $eax889; X64-NEXT: movd %eax, %xmm3890; X64-NEXT: pextrw $2, %xmm0, %eax891; X64-NEXT: pextrw $2, %xmm1, %ecx892; X64-NEXT: # kill: def $ax killed $ax killed $eax893; X64-NEXT: xorl %edx, %edx894; X64-NEXT: divw %cx895; X64-NEXT: # kill: def $ax killed $ax def $eax896; X64-NEXT: movd %eax, %xmm4897; X64-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]898; X64-NEXT: pextrw $1, %xmm0, %eax899; X64-NEXT: pextrw $1, %xmm1, %ecx900; X64-NEXT: # kill: def $ax killed $ax killed $eax901; X64-NEXT: xorl %edx, %edx902; X64-NEXT: divw %cx903; X64-NEXT: # kill: def $ax killed $ax def $eax904; X64-NEXT: movd %eax, %xmm3905; X64-NEXT: movd %xmm0, %eax906; X64-NEXT: movd %xmm1, %ecx907; X64-NEXT: # kill: def $ax killed $ax killed $eax908; X64-NEXT: xorl %edx, %edx909; X64-NEXT: divw %cx910; X64-NEXT: # kill: def $ax killed $ax def $eax911; X64-NEXT: movd %eax, %xmm5912; X64-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]913; X64-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1]914; X64-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm2[0]915; X64-NEXT: movdqa %xmm5, (%rdi)916; X64-NEXT: pmullw %xmm1, %xmm5917; X64-NEXT: psubw %xmm5, %xmm0918; X64-NEXT: retq919 %div = udiv <8 x i16> %x, %y920 store <8 x i16> %div, ptr %divdst, align 16921 %t1 = mul <8 x i16> %div, %y922 %t2 = sub <8 x i16> %x, %t1923 ret <8 x i16> %t2924}925 926define <4 x i32> @vector_i128_i32(<4 x i32> %x, <4 x i32> %y, ptr %divdst) nounwind {927; X86-LABEL: vector_i128_i32:928; X86: # %bb.0:929; X86-NEXT: pushl %esi930; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx931; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]932; X86-NEXT: movd %xmm2, %eax933; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]934; X86-NEXT: movd %xmm2, %esi935; X86-NEXT: xorl %edx, %edx936; X86-NEXT: divl %esi937; X86-NEXT: movd %eax, %xmm3938; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]939; X86-NEXT: movd %xmm2, %eax940; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]941; X86-NEXT: movd %xmm2, %esi942; X86-NEXT: xorl %edx, %edx943; X86-NEXT: divl %esi944; X86-NEXT: movd %eax, %xmm2945; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]946; X86-NEXT: movd %xmm0, %eax947; X86-NEXT: movd %xmm1, %esi948; X86-NEXT: xorl %edx, %edx949; X86-NEXT: divl %esi950; X86-NEXT: movd %eax, %xmm3951; X86-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]952; X86-NEXT: movd %xmm4, %eax953; X86-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,1,1]954; X86-NEXT: movd %xmm4, %esi955; X86-NEXT: xorl %edx, %edx956; X86-NEXT: divl %esi957; X86-NEXT: movd %eax, %xmm4958; X86-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]959; X86-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm2[0]960; X86-NEXT: movdqa %xmm3, (%ecx)961; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]962; X86-NEXT: pmuludq %xmm1, %xmm3963; X86-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]964; X86-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]965; X86-NEXT: pmuludq %xmm2, %xmm1966; X86-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]967; X86-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]968; X86-NEXT: psubd %xmm3, %xmm0969; X86-NEXT: popl %esi970; X86-NEXT: retl971;972; X64-LABEL: vector_i128_i32:973; X64: # %bb.0:974; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]975; X64-NEXT: movd %xmm2, %eax976; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]977; X64-NEXT: movd %xmm2, %ecx978; X64-NEXT: xorl %edx, %edx979; X64-NEXT: divl %ecx980; X64-NEXT: movd %eax, %xmm2981; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]982; X64-NEXT: movd %xmm3, %eax983; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]984; X64-NEXT: movd %xmm3, %ecx985; X64-NEXT: xorl %edx, %edx986; X64-NEXT: divl %ecx987; X64-NEXT: movd %eax, %xmm3988; X64-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]989; X64-NEXT: movd %xmm0, %eax990; X64-NEXT: movd %xmm1, %ecx991; X64-NEXT: xorl %edx, %edx992; X64-NEXT: divl %ecx993; X64-NEXT: movd %eax, %xmm2994; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]995; X64-NEXT: movd %xmm4, %eax996; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,1,1]997; X64-NEXT: movd %xmm4, %ecx998; X64-NEXT: xorl %edx, %edx999; X64-NEXT: divl %ecx1000; X64-NEXT: movd %eax, %xmm41001; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]1002; X64-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]1003; X64-NEXT: movdqa %xmm2, (%rdi)1004; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1005; X64-NEXT: pmuludq %xmm1, %xmm21006; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]1007; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1008; X64-NEXT: pmuludq %xmm3, %xmm11009; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1010; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]1011; X64-NEXT: psubd %xmm2, %xmm01012; X64-NEXT: retq1013 %div = udiv <4 x i32> %x, %y1014 store <4 x i32> %div, ptr %divdst, align 161015 %t1 = mul <4 x i32> %div, %y1016 %t2 = sub <4 x i32> %x, %t11017 ret <4 x i32> %t21018}1019 1020define <2 x i64> @vector_i128_i64(<2 x i64> %x, <2 x i64> %y, ptr %divdst) nounwind {1021; X86-LABEL: vector_i128_i64:1022; X86: # %bb.0:1023; X86-NEXT: pushl %esi1024; X86-NEXT: subl $64, %esp1025; X86-NEXT: movdqu %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1026; X86-NEXT: movdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1027; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1028; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]1029; X86-NEXT: movd %xmm2, {{[0-9]+}}(%esp)1030; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1031; X86-NEXT: movd %xmm2, {{[0-9]+}}(%esp)1032; X86-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]1033; X86-NEXT: movd %xmm1, {{[0-9]+}}(%esp)1034; X86-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1035; X86-NEXT: movd %xmm1, (%esp)1036; X86-NEXT: calll __udivdi31037; X86-NEXT: movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload1038; X86-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1039; X86-NEXT: movd %xmm0, {{[0-9]+}}(%esp)1040; X86-NEXT: movd %xmm1, {{[0-9]+}}(%esp)1041; X86-NEXT: movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload1042; X86-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1043; X86-NEXT: movd %xmm0, {{[0-9]+}}(%esp)1044; X86-NEXT: movd %xmm1, (%esp)1045; X86-NEXT: movd %edx, %xmm01046; X86-NEXT: movd %eax, %xmm11047; X86-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1048; X86-NEXT: movdqu %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1049; X86-NEXT: calll __udivdi31050; X86-NEXT: movd %edx, %xmm11051; X86-NEXT: movd %eax, %xmm31052; X86-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]1053; X86-NEXT: movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1054; X86-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]1055; X86-NEXT: movdqa %xmm3, (%esi)1056; X86-NEXT: movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1057; X86-NEXT: movdqa %xmm0, %xmm11058; X86-NEXT: psrlq $32, %xmm11059; X86-NEXT: pmuludq %xmm3, %xmm11060; X86-NEXT: movdqa %xmm3, %xmm21061; X86-NEXT: psrlq $32, %xmm21062; X86-NEXT: pmuludq %xmm0, %xmm21063; X86-NEXT: paddq %xmm1, %xmm21064; X86-NEXT: psllq $32, %xmm21065; X86-NEXT: pmuludq %xmm0, %xmm31066; X86-NEXT: paddq %xmm2, %xmm31067; X86-NEXT: movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1068; X86-NEXT: psubq %xmm3, %xmm01069; X86-NEXT: addl $64, %esp1070; X86-NEXT: popl %esi1071; X86-NEXT: retl1072;1073; X64-LABEL: vector_i128_i64:1074; X64: # %bb.0:1075; X64-NEXT: movq %xmm0, %rax1076; X64-NEXT: movq %xmm1, %rcx1077; X64-NEXT: xorl %edx, %edx1078; X64-NEXT: divq %rcx1079; X64-NEXT: movq %rax, %xmm21080; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]1081; X64-NEXT: movq %xmm3, %rax1082; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]1083; X64-NEXT: movq %xmm3, %rcx1084; X64-NEXT: xorl %edx, %edx1085; X64-NEXT: divq %rcx1086; X64-NEXT: movq %rax, %xmm31087; X64-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]1088; X64-NEXT: movdqa %xmm2, (%rdi)1089; X64-NEXT: movdqa %xmm1, %xmm31090; X64-NEXT: psrlq $32, %xmm31091; X64-NEXT: pmuludq %xmm2, %xmm31092; X64-NEXT: movdqa %xmm2, %xmm41093; X64-NEXT: psrlq $32, %xmm41094; X64-NEXT: pmuludq %xmm1, %xmm41095; X64-NEXT: paddq %xmm3, %xmm41096; X64-NEXT: psllq $32, %xmm41097; X64-NEXT: pmuludq %xmm1, %xmm21098; X64-NEXT: paddq %xmm4, %xmm21099; X64-NEXT: psubq %xmm2, %xmm01100; X64-NEXT: retq1101 %div = udiv <2 x i64> %x, %y1102 store <2 x i64> %div, ptr %divdst, align 161103 %t1 = mul <2 x i64> %div, %y1104 %t2 = sub <2 x i64> %x, %t11105 ret <2 x i64> %t21106}1107 1108; Special tests.1109 1110define i32 @scalar_i32_commutative(i32 %x, ptr %ysrc, ptr %divdst) nounwind {1111; X86-LABEL: scalar_i32_commutative:1112; X86: # %bb.0:1113; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1114; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1115; X86-NEXT: xorl %edx, %edx1116; X86-NEXT: divl (%ecx)1117; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1118; X86-NEXT: movl %eax, (%ecx)1119; X86-NEXT: movl %edx, %eax1120; X86-NEXT: retl1121;1122; X64-LABEL: scalar_i32_commutative:1123; X64: # %bb.0:1124; X64-NEXT: movq %rdx, %rcx1125; X64-NEXT: movl %edi, %eax1126; X64-NEXT: xorl %edx, %edx1127; X64-NEXT: divl (%rsi)1128; X64-NEXT: movl %eax, (%rcx)1129; X64-NEXT: movl %edx, %eax1130; X64-NEXT: retq1131 %y = load i32, ptr %ysrc, align 41132 %div = udiv i32 %x, %y1133 store i32 %div, ptr %divdst, align 41134 %t1 = mul i32 %y, %div ; commutative1135 %t2 = sub i32 %x, %t11136 ret i32 %t21137}1138 1139; We do not care about extra uses.1140define i32 @extrause(i32 %x, i32 %y, ptr %divdst, ptr %t1dst) nounwind {1141; X86-LABEL: extrause:1142; X86: # %bb.0:1143; X86-NEXT: pushl %edi1144; X86-NEXT: pushl %esi1145; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1146; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1147; X86-NEXT: xorl %edx, %edx1148; X86-NEXT: divl %ecx1149; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1150; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1151; X86-NEXT: movl %eax, (%edi)1152; X86-NEXT: imull %ecx, %eax1153; X86-NEXT: movl %eax, (%esi)1154; X86-NEXT: movl %edx, %eax1155; X86-NEXT: popl %esi1156; X86-NEXT: popl %edi1157; X86-NEXT: retl1158;1159; X64-LABEL: extrause:1160; X64: # %bb.0:1161; X64-NEXT: movq %rdx, %r81162; X64-NEXT: movl %edi, %eax1163; X64-NEXT: xorl %edx, %edx1164; X64-NEXT: divl %esi1165; X64-NEXT: movl %eax, (%r8)1166; X64-NEXT: imull %esi, %eax1167; X64-NEXT: movl %eax, (%rcx)1168; X64-NEXT: movl %edx, %eax1169; X64-NEXT: retq1170 %div = udiv i32 %x, %y1171 store i32 %div, ptr %divdst, align 41172 %t1 = mul i32 %div, %y1173 store i32 %t1, ptr %t1dst, align 41174 %t2 = sub i32 %x, %t11175 ret i32 %t21176}1177 1178; 'rem' should appear next to 'div'.1179define i32 @multiple_bb(i32 %x, i32 %y, ptr %divdst, i1 zeroext %store_urem, ptr %uremdst) nounwind {1180; X86-LABEL: multiple_bb:1181; X86: # %bb.0:1182; X86-NEXT: pushl %ebx1183; X86-NEXT: pushl %edi1184; X86-NEXT: pushl %esi1185; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1186; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1187; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ebx1188; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1189; X86-NEXT: movl %ecx, %eax1190; X86-NEXT: xorl %edx, %edx1191; X86-NEXT: divl %esi1192; X86-NEXT: movl %eax, (%edi)1193; X86-NEXT: testb %bl, %bl1194; X86-NEXT: je .LBB11_21195; X86-NEXT: # %bb.1: # %do_urem1196; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1197; X86-NEXT: movl %eax, %edi1198; X86-NEXT: imull %esi, %edi1199; X86-NEXT: subl %edi, %ecx1200; X86-NEXT: movl %ecx, (%edx)1201; X86-NEXT: .LBB11_2: # %end1202; X86-NEXT: popl %esi1203; X86-NEXT: popl %edi1204; X86-NEXT: popl %ebx1205; X86-NEXT: retl1206;1207; X64-LABEL: multiple_bb:1208; X64: # %bb.0:1209; X64-NEXT: movq %rdx, %r91210; X64-NEXT: movl %edi, %eax1211; X64-NEXT: xorl %edx, %edx1212; X64-NEXT: divl %esi1213; X64-NEXT: movl %eax, (%r9)1214; X64-NEXT: testl %ecx, %ecx1215; X64-NEXT: je .LBB11_21216; X64-NEXT: # %bb.1: # %do_urem1217; X64-NEXT: movl %eax, %ecx1218; X64-NEXT: imull %esi, %ecx1219; X64-NEXT: subl %ecx, %edi1220; X64-NEXT: movl %edi, (%r8)1221; X64-NEXT: .LBB11_2: # %end1222; X64-NEXT: retq1223 %div = udiv i32 %x, %y1224 store i32 %div, ptr %divdst, align 41225 br i1 %store_urem, label %do_urem, label %end1226do_urem:1227 %t1 = mul i32 %div, %y1228 %t2 = sub i32 %x, %t11229 store i32 %t2, ptr %uremdst, align 41230 br label %end1231end:1232 ret i32 %div1233}1234 1235define i32 @negative_different_x(i32 %x0, i32 %x1, i32 %y, ptr %divdst) nounwind {1236; X86-LABEL: negative_different_x:1237; X86: # %bb.0:1238; X86-NEXT: pushl %edi1239; X86-NEXT: pushl %esi1240; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1241; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1242; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1243; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1244; X86-NEXT: xorl %edx, %edx1245; X86-NEXT: divl %edi1246; X86-NEXT: movl %eax, (%esi)1247; X86-NEXT: imull %edi, %eax1248; X86-NEXT: subl %eax, %ecx1249; X86-NEXT: movl %ecx, %eax1250; X86-NEXT: popl %esi1251; X86-NEXT: popl %edi1252; X86-NEXT: retl1253;1254; X64-LABEL: negative_different_x:1255; X64: # %bb.0:1256; X64-NEXT: movl %edx, %r8d1257; X64-NEXT: movl %edi, %eax1258; X64-NEXT: xorl %edx, %edx1259; X64-NEXT: divl %r8d1260; X64-NEXT: movl %eax, (%rcx)1261; X64-NEXT: imull %r8d, %eax1262; X64-NEXT: subl %eax, %esi1263; X64-NEXT: movl %esi, %eax1264; X64-NEXT: retq1265 %div = udiv i32 %x0, %y ; not %x11266 store i32 %div, ptr %divdst, align 41267 %t1 = mul i32 %div, %y1268 %t2 = sub i32 %x1, %t1 ; not %x01269 ret i32 %t21270}1271 1272define i32 @negative_different_y(i32 %x0, i32 %x1, i32 %y, i32 %z, ptr %divdst) nounwind {1273; X86-LABEL: negative_different_y:1274; X86: # %bb.0:1275; X86-NEXT: pushl %esi1276; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1277; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1278; X86-NEXT: movl %ecx, %eax1279; X86-NEXT: xorl %edx, %edx1280; X86-NEXT: divl {{[0-9]+}}(%esp)1281; X86-NEXT: movl %eax, (%esi)1282; X86-NEXT: imull {{[0-9]+}}(%esp), %eax1283; X86-NEXT: subl %eax, %ecx1284; X86-NEXT: movl %ecx, %eax1285; X86-NEXT: popl %esi1286; X86-NEXT: retl1287;1288; X64-LABEL: negative_different_y:1289; X64: # %bb.0:1290; X64-NEXT: movl %edx, %edi1291; X64-NEXT: movl %esi, %eax1292; X64-NEXT: xorl %edx, %edx1293; X64-NEXT: divl %ecx1294; X64-NEXT: movl %eax, (%r8)1295; X64-NEXT: imull %eax, %edi1296; X64-NEXT: subl %edi, %esi1297; X64-NEXT: movl %esi, %eax1298; X64-NEXT: retq1299 %div = udiv i32 %x1, %z ; not %x01300 store i32 %div, ptr %divdst, align 41301 %t1 = mul i32 %div, %y1302 %t2 = sub i32 %x1, %t11303 ret i32 %t21304}1305 1306define i32 @negative_inverted_division(i32 %x0, i32 %x1, i32 %y, ptr %divdst) nounwind {1307; X86-LABEL: negative_inverted_division:1308; X86: # %bb.0:1309; X86-NEXT: pushl %esi1310; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1311; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1312; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1313; X86-NEXT: xorl %edx, %edx1314; X86-NEXT: divl %ecx1315; X86-NEXT: movl %eax, (%esi)1316; X86-NEXT: imull %ecx, %eax1317; X86-NEXT: subl %eax, %ecx1318; X86-NEXT: movl %ecx, %eax1319; X86-NEXT: popl %esi1320; X86-NEXT: retl1321;1322; X64-LABEL: negative_inverted_division:1323; X64: # %bb.0:1324; X64-NEXT: movl %edi, %eax1325; X64-NEXT: xorl %edx, %edx1326; X64-NEXT: divl %esi1327; X64-NEXT: movl %eax, (%rcx)1328; X64-NEXT: imull %esi, %eax1329; X64-NEXT: subl %eax, %esi1330; X64-NEXT: movl %esi, %eax1331; X64-NEXT: retq1332 %div = udiv i32 %x0, %x1 ; inverted division1333 store i32 %div, ptr %divdst, align 41334 %t1 = mul i32 %div, %x11335 %t2 = sub i32 %x1, %t11336 ret i32 %t21337}1338