1016 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=X86-643; RUN: llc < %s -mtriple=x86_64-cygwin | FileCheck %s -check-prefix=WIN644; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s -check-prefix=WIN645; RUN: llc < %s -mtriple=x86_64-mingw32 | FileCheck %s -check-prefix=WIN646 7define i64 @mod128(i128 %x) nounwind {8; X86-64-LABEL: mod128:9; X86-64: # %bb.0:10; X86-64-NEXT: pushq %rax11; X86-64-NEXT: movl $3, %edx12; X86-64-NEXT: xorl %ecx, %ecx13; X86-64-NEXT: callq __modti3@PLT14; X86-64-NEXT: popq %rcx15; X86-64-NEXT: retq16;17; WIN64-LABEL: mod128:18; WIN64: # %bb.0:19; WIN64-NEXT: subq $72, %rsp20; WIN64-NEXT: movq %rdx, {{[0-9]+}}(%rsp)21; WIN64-NEXT: movq %rcx, {{[0-9]+}}(%rsp)22; WIN64-NEXT: movq $3, {{[0-9]+}}(%rsp)23; WIN64-NEXT: movq $0, {{[0-9]+}}(%rsp)24; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx25; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx26; WIN64-NEXT: callq __modti327; WIN64-NEXT: movq %xmm0, %rax28; WIN64-NEXT: addq $72, %rsp29; WIN64-NEXT: retq30 31 32 %1 = srem i128 %x, 333 %2 = trunc i128 %1 to i6434 ret i64 %235}36 37define i64 @div128(i128 %x) nounwind {38; X86-64-LABEL: div128:39; X86-64: # %bb.0:40; X86-64-NEXT: pushq %rax41; X86-64-NEXT: movl $3, %edx42; X86-64-NEXT: xorl %ecx, %ecx43; X86-64-NEXT: callq __divti3@PLT44; X86-64-NEXT: popq %rcx45; X86-64-NEXT: retq46;47; WIN64-LABEL: div128:48; WIN64: # %bb.0:49; WIN64-NEXT: subq $72, %rsp50; WIN64-NEXT: movq %rdx, {{[0-9]+}}(%rsp)51; WIN64-NEXT: movq %rcx, {{[0-9]+}}(%rsp)52; WIN64-NEXT: movq $3, {{[0-9]+}}(%rsp)53; WIN64-NEXT: movq $0, {{[0-9]+}}(%rsp)54; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx55; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx56; WIN64-NEXT: callq __divti357; WIN64-NEXT: movq %xmm0, %rax58; WIN64-NEXT: addq $72, %rsp59; WIN64-NEXT: retq60 61 62 %1 = sdiv i128 %x, 363 %2 = trunc i128 %1 to i6464 ret i64 %265}66 67define i64 @umod128(i128 %x) nounwind {68; X86-64-LABEL: umod128:69; X86-64: # %bb.0:70; X86-64-NEXT: pushq %rax71; X86-64-NEXT: movl $11, %edx72; X86-64-NEXT: xorl %ecx, %ecx73; X86-64-NEXT: callq __umodti3@PLT74; X86-64-NEXT: popq %rcx75; X86-64-NEXT: retq76;77; WIN64-LABEL: umod128:78; WIN64: # %bb.0:79; WIN64-NEXT: subq $72, %rsp80; WIN64-NEXT: movq %rdx, {{[0-9]+}}(%rsp)81; WIN64-NEXT: movq %rcx, {{[0-9]+}}(%rsp)82; WIN64-NEXT: movq $11, {{[0-9]+}}(%rsp)83; WIN64-NEXT: movq $0, {{[0-9]+}}(%rsp)84; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx85; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx86; WIN64-NEXT: callq __umodti387; WIN64-NEXT: movq %xmm0, %rax88; WIN64-NEXT: addq $72, %rsp89; WIN64-NEXT: retq90 91 92 %1 = urem i128 %x, 1193 %2 = trunc i128 %1 to i6494 ret i64 %295}96 97define i64 @udiv128(i128 %x) nounwind {98; X86-64-LABEL: udiv128:99; X86-64: # %bb.0:100; X86-64-NEXT: addq %rdi, %rsi101; X86-64-NEXT: adcq $0, %rsi102; X86-64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB103; X86-64-NEXT: movq %rsi, %rax104; X86-64-NEXT: mulq %rcx105; X86-64-NEXT: shrq %rdx106; X86-64-NEXT: leaq (%rdx,%rdx,2), %rax107; X86-64-NEXT: subq %rsi, %rax108; X86-64-NEXT: addq %rdi, %rax109; X86-64-NEXT: imulq %rcx, %rax110; X86-64-NEXT: retq111;112; WIN64-LABEL: udiv128:113; WIN64: # %bb.0:114; WIN64-NEXT: movq %rdx, %r8115; WIN64-NEXT: addq %rcx, %r8116; WIN64-NEXT: adcq $0, %r8117; WIN64-NEXT: movabsq $-6148914691236517205, %r9 # imm = 0xAAAAAAAAAAAAAAAB118; WIN64-NEXT: movq %r8, %rax119; WIN64-NEXT: mulq %r9120; WIN64-NEXT: shrq %rdx121; WIN64-NEXT: leaq (%rdx,%rdx,2), %rax122; WIN64-NEXT: subq %r8, %rax123; WIN64-NEXT: addq %rcx, %rax124; WIN64-NEXT: imulq %r9, %rax125; WIN64-NEXT: retq126 127 128 %1 = udiv i128 %x, 3129 %2 = trunc i128 %1 to i64130 ret i64 %2131}132 133define i128 @urem_i128_3(i128 %x) nounwind {134; X86-64-LABEL: urem_i128_3:135; X86-64: # %bb.0: # %entry136; X86-64-NEXT: addq %rsi, %rdi137; X86-64-NEXT: adcq $0, %rdi138; X86-64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB139; X86-64-NEXT: movq %rdi, %rax140; X86-64-NEXT: mulq %rcx141; X86-64-NEXT: shrq %rdx142; X86-64-NEXT: leaq (%rdx,%rdx,2), %rax143; X86-64-NEXT: subq %rax, %rdi144; X86-64-NEXT: movq %rdi, %rax145; X86-64-NEXT: xorl %edx, %edx146; X86-64-NEXT: retq147;148; WIN64-LABEL: urem_i128_3:149; WIN64: # %bb.0: # %entry150; WIN64-NEXT: addq %rdx, %rcx151; WIN64-NEXT: adcq $0, %rcx152; WIN64-NEXT: movabsq $-6148914691236517205, %rdx # imm = 0xAAAAAAAAAAAAAAAB153; WIN64-NEXT: movq %rcx, %rax154; WIN64-NEXT: mulq %rdx155; WIN64-NEXT: shrq %rdx156; WIN64-NEXT: leaq (%rdx,%rdx,2), %rax157; WIN64-NEXT: subq %rax, %rcx158; WIN64-NEXT: movq %rcx, %rax159; WIN64-NEXT: xorl %edx, %edx160; WIN64-NEXT: retq161entry:162 %rem = urem i128 %x, 3163 ret i128 %rem164}165 166define i128 @urem_i128_5(i128 %x) nounwind {167; X86-64-LABEL: urem_i128_5:168; X86-64: # %bb.0: # %entry169; X86-64-NEXT: addq %rsi, %rdi170; X86-64-NEXT: adcq $0, %rdi171; X86-64-NEXT: movabsq $-3689348814741910323, %rcx # imm = 0xCCCCCCCCCCCCCCCD172; X86-64-NEXT: movq %rdi, %rax173; X86-64-NEXT: mulq %rcx174; X86-64-NEXT: shrq $2, %rdx175; X86-64-NEXT: leaq (%rdx,%rdx,4), %rax176; X86-64-NEXT: subq %rax, %rdi177; X86-64-NEXT: movq %rdi, %rax178; X86-64-NEXT: xorl %edx, %edx179; X86-64-NEXT: retq180;181; WIN64-LABEL: urem_i128_5:182; WIN64: # %bb.0: # %entry183; WIN64-NEXT: addq %rdx, %rcx184; WIN64-NEXT: adcq $0, %rcx185; WIN64-NEXT: movabsq $-3689348814741910323, %rdx # imm = 0xCCCCCCCCCCCCCCCD186; WIN64-NEXT: movq %rcx, %rax187; WIN64-NEXT: mulq %rdx188; WIN64-NEXT: shrq $2, %rdx189; WIN64-NEXT: leaq (%rdx,%rdx,4), %rax190; WIN64-NEXT: subq %rax, %rcx191; WIN64-NEXT: movq %rcx, %rax192; WIN64-NEXT: xorl %edx, %edx193; WIN64-NEXT: retq194entry:195 %rem = urem i128 %x, 5196 ret i128 %rem197}198 199define i128 @urem_i128_15(i128 %x) nounwind {200; X86-64-LABEL: urem_i128_15:201; X86-64: # %bb.0: # %entry202; X86-64-NEXT: addq %rsi, %rdi203; X86-64-NEXT: adcq $0, %rdi204; X86-64-NEXT: movabsq $-8608480567731124087, %rcx # imm = 0x8888888888888889205; X86-64-NEXT: movq %rdi, %rax206; X86-64-NEXT: mulq %rcx207; X86-64-NEXT: shrq $3, %rdx208; X86-64-NEXT: leaq (%rdx,%rdx,4), %rax209; X86-64-NEXT: leaq (%rax,%rax,2), %rax210; X86-64-NEXT: subq %rax, %rdi211; X86-64-NEXT: movq %rdi, %rax212; X86-64-NEXT: xorl %edx, %edx213; X86-64-NEXT: retq214;215; WIN64-LABEL: urem_i128_15:216; WIN64: # %bb.0: # %entry217; WIN64-NEXT: addq %rdx, %rcx218; WIN64-NEXT: adcq $0, %rcx219; WIN64-NEXT: movabsq $-8608480567731124087, %rdx # imm = 0x8888888888888889220; WIN64-NEXT: movq %rcx, %rax221; WIN64-NEXT: mulq %rdx222; WIN64-NEXT: shrq $3, %rdx223; WIN64-NEXT: leaq (%rdx,%rdx,4), %rax224; WIN64-NEXT: leaq (%rax,%rax,2), %rax225; WIN64-NEXT: subq %rax, %rcx226; WIN64-NEXT: movq %rcx, %rax227; WIN64-NEXT: xorl %edx, %edx228; WIN64-NEXT: retq229entry:230 %rem = urem i128 %x, 15231 ret i128 %rem232}233 234define i128 @urem_i128_17(i128 %x) nounwind {235; X86-64-LABEL: urem_i128_17:236; X86-64: # %bb.0: # %entry237; X86-64-NEXT: addq %rsi, %rdi238; X86-64-NEXT: adcq $0, %rdi239; X86-64-NEXT: movabsq $-1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F1240; X86-64-NEXT: movq %rdi, %rax241; X86-64-NEXT: mulq %rcx242; X86-64-NEXT: movq %rdx, %rax243; X86-64-NEXT: andq $-16, %rax244; X86-64-NEXT: shrq $4, %rdx245; X86-64-NEXT: addq %rax, %rdx246; X86-64-NEXT: subq %rdx, %rdi247; X86-64-NEXT: movq %rdi, %rax248; X86-64-NEXT: xorl %edx, %edx249; X86-64-NEXT: retq250;251; WIN64-LABEL: urem_i128_17:252; WIN64: # %bb.0: # %entry253; WIN64-NEXT: addq %rdx, %rcx254; WIN64-NEXT: adcq $0, %rcx255; WIN64-NEXT: movabsq $-1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F1256; WIN64-NEXT: movq %rcx, %rax257; WIN64-NEXT: mulq %rdx258; WIN64-NEXT: movq %rdx, %rax259; WIN64-NEXT: andq $-16, %rax260; WIN64-NEXT: shrq $4, %rdx261; WIN64-NEXT: addq %rax, %rdx262; WIN64-NEXT: subq %rdx, %rcx263; WIN64-NEXT: movq %rcx, %rax264; WIN64-NEXT: xorl %edx, %edx265; WIN64-NEXT: retq266entry:267 %rem = urem i128 %x, 17268 ret i128 %rem269}270 271define i128 @urem_i128_255(i128 %x) nounwind {272; X86-64-LABEL: urem_i128_255:273; X86-64: # %bb.0: # %entry274; X86-64-NEXT: movq %rdi, %rax275; X86-64-NEXT: addq %rsi, %rax276; X86-64-NEXT: adcq $0, %rax277; X86-64-NEXT: movabsq $-9187201950435737471, %rcx # imm = 0x8080808080808081278; X86-64-NEXT: mulq %rcx279; X86-64-NEXT: shrq $7, %rdx280; X86-64-NEXT: movq %rdx, %rax281; X86-64-NEXT: shlq $8, %rax282; X86-64-NEXT: subq %rax, %rdx283; X86-64-NEXT: addq %rsi, %rdi284; X86-64-NEXT: adcq %rdx, %rdi285; X86-64-NEXT: movq %rdi, %rax286; X86-64-NEXT: xorl %edx, %edx287; X86-64-NEXT: retq288;289; WIN64-LABEL: urem_i128_255:290; WIN64: # %bb.0: # %entry291; WIN64-NEXT: movq %rdx, %r8292; WIN64-NEXT: movq %rcx, %rax293; WIN64-NEXT: addq %rdx, %rax294; WIN64-NEXT: adcq $0, %rax295; WIN64-NEXT: movabsq $-9187201950435737471, %rdx # imm = 0x8080808080808081296; WIN64-NEXT: mulq %rdx297; WIN64-NEXT: shrq $7, %rdx298; WIN64-NEXT: movq %rdx, %rax299; WIN64-NEXT: shlq $8, %rax300; WIN64-NEXT: subq %rax, %rdx301; WIN64-NEXT: addq %rcx, %r8302; WIN64-NEXT: adcq %rdx, %r8303; WIN64-NEXT: movq %r8, %rax304; WIN64-NEXT: xorl %edx, %edx305; WIN64-NEXT: retq306entry:307 %rem = urem i128 %x, 255308 ret i128 %rem309}310 311define i128 @urem_i128_257(i128 %x) nounwind {312; X86-64-LABEL: urem_i128_257:313; X86-64: # %bb.0: # %entry314; X86-64-NEXT: addq %rsi, %rdi315; X86-64-NEXT: adcq $0, %rdi316; X86-64-NEXT: movabsq $-71777214294589695, %rcx # imm = 0xFF00FF00FF00FF01317; X86-64-NEXT: movq %rdi, %rax318; X86-64-NEXT: mulq %rcx319; X86-64-NEXT: movq %rdx, %rax320; X86-64-NEXT: andq $-256, %rax321; X86-64-NEXT: shrq $8, %rdx322; X86-64-NEXT: addq %rax, %rdx323; X86-64-NEXT: subq %rdx, %rdi324; X86-64-NEXT: movq %rdi, %rax325; X86-64-NEXT: xorl %edx, %edx326; X86-64-NEXT: retq327;328; WIN64-LABEL: urem_i128_257:329; WIN64: # %bb.0: # %entry330; WIN64-NEXT: addq %rdx, %rcx331; WIN64-NEXT: adcq $0, %rcx332; WIN64-NEXT: movabsq $-71777214294589695, %rdx # imm = 0xFF00FF00FF00FF01333; WIN64-NEXT: movq %rcx, %rax334; WIN64-NEXT: mulq %rdx335; WIN64-NEXT: movq %rdx, %rax336; WIN64-NEXT: andq $-256, %rax337; WIN64-NEXT: shrq $8, %rdx338; WIN64-NEXT: addq %rax, %rdx339; WIN64-NEXT: subq %rdx, %rcx340; WIN64-NEXT: movq %rcx, %rax341; WIN64-NEXT: xorl %edx, %edx342; WIN64-NEXT: retq343entry:344 %rem = urem i128 %x, 257345 ret i128 %rem346}347 348define i128 @urem_i128_65535(i128 %x) nounwind {349; X86-64-LABEL: urem_i128_65535:350; X86-64: # %bb.0: # %entry351; X86-64-NEXT: movq %rdi, %rax352; X86-64-NEXT: addq %rsi, %rax353; X86-64-NEXT: adcq $0, %rax354; X86-64-NEXT: movabsq $-9223231297218904063, %rcx # imm = 0x8000800080008001355; X86-64-NEXT: mulq %rcx356; X86-64-NEXT: shrq $15, %rdx357; X86-64-NEXT: movq %rdx, %rax358; X86-64-NEXT: shlq $16, %rax359; X86-64-NEXT: subq %rax, %rdx360; X86-64-NEXT: addq %rsi, %rdi361; X86-64-NEXT: adcq %rdx, %rdi362; X86-64-NEXT: movq %rdi, %rax363; X86-64-NEXT: xorl %edx, %edx364; X86-64-NEXT: retq365;366; WIN64-LABEL: urem_i128_65535:367; WIN64: # %bb.0: # %entry368; WIN64-NEXT: movq %rdx, %r8369; WIN64-NEXT: movq %rcx, %rax370; WIN64-NEXT: addq %rdx, %rax371; WIN64-NEXT: adcq $0, %rax372; WIN64-NEXT: movabsq $-9223231297218904063, %rdx # imm = 0x8000800080008001373; WIN64-NEXT: mulq %rdx374; WIN64-NEXT: shrq $15, %rdx375; WIN64-NEXT: movq %rdx, %rax376; WIN64-NEXT: shlq $16, %rax377; WIN64-NEXT: subq %rax, %rdx378; WIN64-NEXT: addq %rcx, %r8379; WIN64-NEXT: adcq %rdx, %r8380; WIN64-NEXT: movq %r8, %rax381; WIN64-NEXT: xorl %edx, %edx382; WIN64-NEXT: retq383entry:384 %rem = urem i128 %x, 65535385 ret i128 %rem386}387 388define i128 @urem_i128_65537(i128 %x) nounwind {389; X86-64-LABEL: urem_i128_65537:390; X86-64: # %bb.0: # %entry391; X86-64-NEXT: addq %rsi, %rdi392; X86-64-NEXT: adcq $0, %rdi393; X86-64-NEXT: movabsq $-281470681808895, %rcx # imm = 0xFFFF0000FFFF0001394; X86-64-NEXT: movq %rdi, %rax395; X86-64-NEXT: mulq %rcx396; X86-64-NEXT: movq %rdx, %rax397; X86-64-NEXT: andq $-65536, %rax # imm = 0xFFFF0000398; X86-64-NEXT: shrq $16, %rdx399; X86-64-NEXT: addq %rax, %rdx400; X86-64-NEXT: subq %rdx, %rdi401; X86-64-NEXT: movq %rdi, %rax402; X86-64-NEXT: xorl %edx, %edx403; X86-64-NEXT: retq404;405; WIN64-LABEL: urem_i128_65537:406; WIN64: # %bb.0: # %entry407; WIN64-NEXT: addq %rdx, %rcx408; WIN64-NEXT: adcq $0, %rcx409; WIN64-NEXT: movabsq $-281470681808895, %rdx # imm = 0xFFFF0000FFFF0001410; WIN64-NEXT: movq %rcx, %rax411; WIN64-NEXT: mulq %rdx412; WIN64-NEXT: movq %rdx, %rax413; WIN64-NEXT: andq $-65536, %rax # imm = 0xFFFF0000414; WIN64-NEXT: shrq $16, %rdx415; WIN64-NEXT: addq %rax, %rdx416; WIN64-NEXT: subq %rdx, %rcx417; WIN64-NEXT: movq %rcx, %rax418; WIN64-NEXT: xorl %edx, %edx419; WIN64-NEXT: retq420entry:421 %rem = urem i128 %x, 65537422 ret i128 %rem423}424 425define i128 @urem_i128_12(i128 %x) nounwind {426; X86-64-LABEL: urem_i128_12:427; X86-64: # %bb.0: # %entry428; X86-64-NEXT: movq %rsi, %rcx429; X86-64-NEXT: shldq $62, %rdi, %rcx430; X86-64-NEXT: shrq $2, %rsi431; X86-64-NEXT: addq %rsi, %rcx432; X86-64-NEXT: adcq $0, %rcx433; X86-64-NEXT: movabsq $-6148914691236517205, %rdx # imm = 0xAAAAAAAAAAAAAAAB434; X86-64-NEXT: movq %rcx, %rax435; X86-64-NEXT: mulq %rdx436; X86-64-NEXT: shrq %rdx437; X86-64-NEXT: leal (%rdx,%rdx,2), %eax438; X86-64-NEXT: subl %eax, %ecx439; X86-64-NEXT: andl $3, %edi440; X86-64-NEXT: leaq (%rdi,%rcx,4), %rax441; X86-64-NEXT: xorl %edx, %edx442; X86-64-NEXT: retq443;444; WIN64-LABEL: urem_i128_12:445; WIN64: # %bb.0: # %entry446; WIN64-NEXT: movq %rdx, %r8447; WIN64-NEXT: shldq $62, %rcx, %r8448; WIN64-NEXT: shrq $2, %rdx449; WIN64-NEXT: addq %rdx, %r8450; WIN64-NEXT: adcq $0, %r8451; WIN64-NEXT: movabsq $-6148914691236517205, %rdx # imm = 0xAAAAAAAAAAAAAAAB452; WIN64-NEXT: movq %r8, %rax453; WIN64-NEXT: mulq %rdx454; WIN64-NEXT: shrq %rdx455; WIN64-NEXT: leal (%rdx,%rdx,2), %eax456; WIN64-NEXT: subl %eax, %r8d457; WIN64-NEXT: andl $3, %ecx458; WIN64-NEXT: leaq (%rcx,%r8,4), %rax459; WIN64-NEXT: xorl %edx, %edx460; WIN64-NEXT: retq461entry:462 %rem = urem i128 %x, 12463 ret i128 %rem464}465 466define i128 @udiv_i128_3(i128 %x) nounwind {467; X86-64-LABEL: udiv_i128_3:468; X86-64: # %bb.0: # %entry469; X86-64-NEXT: movq %rdi, %rcx470; X86-64-NEXT: addq %rsi, %rcx471; X86-64-NEXT: adcq $0, %rcx472; X86-64-NEXT: movabsq $-6148914691236517205, %r8 # imm = 0xAAAAAAAAAAAAAAAB473; X86-64-NEXT: movq %rcx, %rax474; X86-64-NEXT: mulq %r8475; X86-64-NEXT: shrq %rdx476; X86-64-NEXT: leaq (%rdx,%rdx,2), %rax477; X86-64-NEXT: subq %rax, %rcx478; X86-64-NEXT: subq %rcx, %rdi479; X86-64-NEXT: sbbq $0, %rsi480; X86-64-NEXT: movabsq $-6148914691236517206, %rcx # imm = 0xAAAAAAAAAAAAAAAA481; X86-64-NEXT: imulq %rdi, %rcx482; X86-64-NEXT: movq %rdi, %rax483; X86-64-NEXT: mulq %r8484; X86-64-NEXT: addq %rcx, %rdx485; X86-64-NEXT: imulq %rsi, %r8486; X86-64-NEXT: addq %r8, %rdx487; X86-64-NEXT: retq488;489; WIN64-LABEL: udiv_i128_3:490; WIN64: # %bb.0: # %entry491; WIN64-NEXT: movq %rdx, %r8492; WIN64-NEXT: movq %rcx, %r9493; WIN64-NEXT: addq %rdx, %r9494; WIN64-NEXT: adcq $0, %r9495; WIN64-NEXT: movabsq $-6148914691236517205, %r10 # imm = 0xAAAAAAAAAAAAAAAB496; WIN64-NEXT: movq %r9, %rax497; WIN64-NEXT: mulq %r10498; WIN64-NEXT: shrq %rdx499; WIN64-NEXT: leaq (%rdx,%rdx,2), %rax500; WIN64-NEXT: subq %rax, %r9501; WIN64-NEXT: subq %r9, %rcx502; WIN64-NEXT: sbbq $0, %r8503; WIN64-NEXT: movabsq $-6148914691236517206, %r9 # imm = 0xAAAAAAAAAAAAAAAA504; WIN64-NEXT: imulq %rcx, %r9505; WIN64-NEXT: movq %rcx, %rax506; WIN64-NEXT: mulq %r10507; WIN64-NEXT: addq %r9, %rdx508; WIN64-NEXT: imulq %r10, %r8509; WIN64-NEXT: addq %r8, %rdx510; WIN64-NEXT: retq511entry:512 %rem = udiv i128 %x, 3513 ret i128 %rem514}515 516define i128 @udiv_i128_5(i128 %x) nounwind {517; X86-64-LABEL: udiv_i128_5:518; X86-64: # %bb.0: # %entry519; X86-64-NEXT: movq %rdi, %rcx520; X86-64-NEXT: addq %rsi, %rcx521; X86-64-NEXT: adcq $0, %rcx522; X86-64-NEXT: movabsq $-3689348814741910323, %r8 # imm = 0xCCCCCCCCCCCCCCCD523; X86-64-NEXT: movq %rcx, %rax524; X86-64-NEXT: mulq %r8525; X86-64-NEXT: shrq $2, %rdx526; X86-64-NEXT: leaq (%rdx,%rdx,4), %rax527; X86-64-NEXT: subq %rax, %rcx528; X86-64-NEXT: subq %rcx, %rdi529; X86-64-NEXT: sbbq $0, %rsi530; X86-64-NEXT: movabsq $-3689348814741910324, %rcx # imm = 0xCCCCCCCCCCCCCCCC531; X86-64-NEXT: imulq %rdi, %rcx532; X86-64-NEXT: movq %rdi, %rax533; X86-64-NEXT: mulq %r8534; X86-64-NEXT: addq %rcx, %rdx535; X86-64-NEXT: imulq %rsi, %r8536; X86-64-NEXT: addq %r8, %rdx537; X86-64-NEXT: retq538;539; WIN64-LABEL: udiv_i128_5:540; WIN64: # %bb.0: # %entry541; WIN64-NEXT: movq %rdx, %r8542; WIN64-NEXT: movq %rcx, %r9543; WIN64-NEXT: addq %rdx, %r9544; WIN64-NEXT: adcq $0, %r9545; WIN64-NEXT: movabsq $-3689348814741910323, %r10 # imm = 0xCCCCCCCCCCCCCCCD546; WIN64-NEXT: movq %r9, %rax547; WIN64-NEXT: mulq %r10548; WIN64-NEXT: shrq $2, %rdx549; WIN64-NEXT: leaq (%rdx,%rdx,4), %rax550; WIN64-NEXT: subq %rax, %r9551; WIN64-NEXT: subq %r9, %rcx552; WIN64-NEXT: sbbq $0, %r8553; WIN64-NEXT: movabsq $-3689348814741910324, %r9 # imm = 0xCCCCCCCCCCCCCCCC554; WIN64-NEXT: imulq %rcx, %r9555; WIN64-NEXT: movq %rcx, %rax556; WIN64-NEXT: mulq %r10557; WIN64-NEXT: addq %r9, %rdx558; WIN64-NEXT: imulq %r10, %r8559; WIN64-NEXT: addq %r8, %rdx560; WIN64-NEXT: retq561entry:562 %rem = udiv i128 %x, 5563 ret i128 %rem564}565 566define i128 @udiv_i128_15(i128 %x) nounwind {567; X86-64-LABEL: udiv_i128_15:568; X86-64: # %bb.0: # %entry569; X86-64-NEXT: movq %rdi, %rcx570; X86-64-NEXT: addq %rsi, %rcx571; X86-64-NEXT: adcq $0, %rcx572; X86-64-NEXT: movabsq $-8608480567731124087, %rdx # imm = 0x8888888888888889573; X86-64-NEXT: movq %rcx, %rax574; X86-64-NEXT: mulq %rdx575; X86-64-NEXT: shrq $3, %rdx576; X86-64-NEXT: leaq (%rdx,%rdx,4), %rax577; X86-64-NEXT: leaq (%rax,%rax,2), %rax578; X86-64-NEXT: subq %rax, %rcx579; X86-64-NEXT: subq %rcx, %rdi580; X86-64-NEXT: sbbq $0, %rsi581; X86-64-NEXT: movabsq $-1229782938247303442, %rcx # imm = 0xEEEEEEEEEEEEEEEE582; X86-64-NEXT: imulq %rdi, %rcx583; X86-64-NEXT: movabsq $-1229782938247303441, %r8 # imm = 0xEEEEEEEEEEEEEEEF584; X86-64-NEXT: movq %rdi, %rax585; X86-64-NEXT: mulq %r8586; X86-64-NEXT: addq %rcx, %rdx587; X86-64-NEXT: imulq %rsi, %r8588; X86-64-NEXT: addq %r8, %rdx589; X86-64-NEXT: retq590;591; WIN64-LABEL: udiv_i128_15:592; WIN64: # %bb.0: # %entry593; WIN64-NEXT: movq %rdx, %r8594; WIN64-NEXT: movq %rcx, %r9595; WIN64-NEXT: addq %rdx, %r9596; WIN64-NEXT: adcq $0, %r9597; WIN64-NEXT: movabsq $-8608480567731124087, %rdx # imm = 0x8888888888888889598; WIN64-NEXT: movq %r9, %rax599; WIN64-NEXT: mulq %rdx600; WIN64-NEXT: shrq $3, %rdx601; WIN64-NEXT: leaq (%rdx,%rdx,4), %rax602; WIN64-NEXT: leaq (%rax,%rax,2), %rax603; WIN64-NEXT: subq %rax, %r9604; WIN64-NEXT: subq %r9, %rcx605; WIN64-NEXT: sbbq $0, %r8606; WIN64-NEXT: movabsq $-1229782938247303442, %r9 # imm = 0xEEEEEEEEEEEEEEEE607; WIN64-NEXT: imulq %rcx, %r9608; WIN64-NEXT: movabsq $-1229782938247303441, %r10 # imm = 0xEEEEEEEEEEEEEEEF609; WIN64-NEXT: movq %rcx, %rax610; WIN64-NEXT: mulq %r10611; WIN64-NEXT: addq %r9, %rdx612; WIN64-NEXT: imulq %r10, %r8613; WIN64-NEXT: addq %r8, %rdx614; WIN64-NEXT: retq615entry:616 %rem = udiv i128 %x, 15617 ret i128 %rem618}619 620define i128 @udiv_i128_17(i128 %x) nounwind {621; X86-64-LABEL: udiv_i128_17:622; X86-64: # %bb.0: # %entry623; X86-64-NEXT: movq %rdi, %rcx624; X86-64-NEXT: addq %rsi, %rcx625; X86-64-NEXT: adcq $0, %rcx626; X86-64-NEXT: movabsq $-1085102592571150095, %r8 # imm = 0xF0F0F0F0F0F0F0F1627; X86-64-NEXT: movq %rcx, %rax628; X86-64-NEXT: mulq %r8629; X86-64-NEXT: movq %rdx, %rax630; X86-64-NEXT: andq $-16, %rax631; X86-64-NEXT: shrq $4, %rdx632; X86-64-NEXT: addq %rax, %rdx633; X86-64-NEXT: subq %rdx, %rcx634; X86-64-NEXT: subq %rcx, %rdi635; X86-64-NEXT: sbbq $0, %rsi636; X86-64-NEXT: movabsq $-1085102592571150096, %rcx # imm = 0xF0F0F0F0F0F0F0F0637; X86-64-NEXT: imulq %rdi, %rcx638; X86-64-NEXT: movq %rdi, %rax639; X86-64-NEXT: mulq %r8640; X86-64-NEXT: addq %rcx, %rdx641; X86-64-NEXT: imulq %rsi, %r8642; X86-64-NEXT: addq %r8, %rdx643; X86-64-NEXT: retq644;645; WIN64-LABEL: udiv_i128_17:646; WIN64: # %bb.0: # %entry647; WIN64-NEXT: movq %rdx, %r8648; WIN64-NEXT: movq %rcx, %r9649; WIN64-NEXT: addq %rdx, %r9650; WIN64-NEXT: adcq $0, %r9651; WIN64-NEXT: movabsq $-1085102592571150095, %r10 # imm = 0xF0F0F0F0F0F0F0F1652; WIN64-NEXT: movq %r9, %rax653; WIN64-NEXT: mulq %r10654; WIN64-NEXT: movq %rdx, %rax655; WIN64-NEXT: andq $-16, %rax656; WIN64-NEXT: shrq $4, %rdx657; WIN64-NEXT: addq %rax, %rdx658; WIN64-NEXT: subq %rdx, %r9659; WIN64-NEXT: subq %r9, %rcx660; WIN64-NEXT: sbbq $0, %r8661; WIN64-NEXT: movabsq $-1085102592571150096, %r9 # imm = 0xF0F0F0F0F0F0F0F0662; WIN64-NEXT: imulq %rcx, %r9663; WIN64-NEXT: movq %rcx, %rax664; WIN64-NEXT: mulq %r10665; WIN64-NEXT: addq %r9, %rdx666; WIN64-NEXT: imulq %r10, %r8667; WIN64-NEXT: addq %r8, %rdx668; WIN64-NEXT: retq669entry:670 %rem = udiv i128 %x, 17671 ret i128 %rem672}673 674define i128 @udiv_i128_255(i128 %x) nounwind {675; X86-64-LABEL: udiv_i128_255:676; X86-64: # %bb.0: # %entry677; X86-64-NEXT: movq %rdi, %rax678; X86-64-NEXT: addq %rsi, %rax679; X86-64-NEXT: adcq $0, %rax680; X86-64-NEXT: movabsq $-9187201950435737471, %rcx # imm = 0x8080808080808081681; X86-64-NEXT: mulq %rcx682; X86-64-NEXT: shrq $7, %rdx683; X86-64-NEXT: movq %rdx, %rax684; X86-64-NEXT: shlq $8, %rax685; X86-64-NEXT: subq %rax, %rdx686; X86-64-NEXT: movq %rdi, %rax687; X86-64-NEXT: addq %rsi, %rax688; X86-64-NEXT: adcq %rdx, %rax689; X86-64-NEXT: subq %rax, %rdi690; X86-64-NEXT: sbbq $0, %rsi691; X86-64-NEXT: movabsq $-72340172838076674, %rcx # imm = 0xFEFEFEFEFEFEFEFE692; X86-64-NEXT: imulq %rdi, %rcx693; X86-64-NEXT: movabsq $-72340172838076673, %r8 # imm = 0xFEFEFEFEFEFEFEFF694; X86-64-NEXT: movq %rdi, %rax695; X86-64-NEXT: mulq %r8696; X86-64-NEXT: addq %rcx, %rdx697; X86-64-NEXT: imulq %rsi, %r8698; X86-64-NEXT: addq %r8, %rdx699; X86-64-NEXT: retq700;701; WIN64-LABEL: udiv_i128_255:702; WIN64: # %bb.0: # %entry703; WIN64-NEXT: movq %rdx, %r8704; WIN64-NEXT: movq %rcx, %rax705; WIN64-NEXT: addq %rdx, %rax706; WIN64-NEXT: adcq $0, %rax707; WIN64-NEXT: movabsq $-9187201950435737471, %rdx # imm = 0x8080808080808081708; WIN64-NEXT: mulq %rdx709; WIN64-NEXT: shrq $7, %rdx710; WIN64-NEXT: movq %rdx, %rax711; WIN64-NEXT: shlq $8, %rax712; WIN64-NEXT: subq %rax, %rdx713; WIN64-NEXT: movq %rcx, %rax714; WIN64-NEXT: addq %r8, %rax715; WIN64-NEXT: adcq %rdx, %rax716; WIN64-NEXT: subq %rax, %rcx717; WIN64-NEXT: sbbq $0, %r8718; WIN64-NEXT: movabsq $-72340172838076674, %r9 # imm = 0xFEFEFEFEFEFEFEFE719; WIN64-NEXT: imulq %rcx, %r9720; WIN64-NEXT: movabsq $-72340172838076673, %r10 # imm = 0xFEFEFEFEFEFEFEFF721; WIN64-NEXT: movq %rcx, %rax722; WIN64-NEXT: mulq %r10723; WIN64-NEXT: addq %r9, %rdx724; WIN64-NEXT: imulq %r10, %r8725; WIN64-NEXT: addq %r8, %rdx726; WIN64-NEXT: retq727entry:728 %rem = udiv i128 %x, 255729 ret i128 %rem730}731 732define i128 @udiv_i128_257(i128 %x) nounwind {733; X86-64-LABEL: udiv_i128_257:734; X86-64: # %bb.0: # %entry735; X86-64-NEXT: movq %rdi, %rcx736; X86-64-NEXT: addq %rsi, %rcx737; X86-64-NEXT: adcq $0, %rcx738; X86-64-NEXT: movabsq $-71777214294589695, %r8 # imm = 0xFF00FF00FF00FF01739; X86-64-NEXT: movq %rcx, %rax740; X86-64-NEXT: mulq %r8741; X86-64-NEXT: movq %rdx, %rax742; X86-64-NEXT: andq $-256, %rax743; X86-64-NEXT: shrq $8, %rdx744; X86-64-NEXT: addq %rax, %rdx745; X86-64-NEXT: subq %rdx, %rcx746; X86-64-NEXT: subq %rcx, %rdi747; X86-64-NEXT: sbbq $0, %rsi748; X86-64-NEXT: movabsq $-71777214294589696, %rcx # imm = 0xFF00FF00FF00FF00749; X86-64-NEXT: imulq %rdi, %rcx750; X86-64-NEXT: movq %rdi, %rax751; X86-64-NEXT: mulq %r8752; X86-64-NEXT: addq %rcx, %rdx753; X86-64-NEXT: imulq %rsi, %r8754; X86-64-NEXT: addq %r8, %rdx755; X86-64-NEXT: retq756;757; WIN64-LABEL: udiv_i128_257:758; WIN64: # %bb.0: # %entry759; WIN64-NEXT: movq %rdx, %r8760; WIN64-NEXT: movq %rcx, %r9761; WIN64-NEXT: addq %rdx, %r9762; WIN64-NEXT: adcq $0, %r9763; WIN64-NEXT: movabsq $-71777214294589695, %r10 # imm = 0xFF00FF00FF00FF01764; WIN64-NEXT: movq %r9, %rax765; WIN64-NEXT: mulq %r10766; WIN64-NEXT: movq %rdx, %rax767; WIN64-NEXT: andq $-256, %rax768; WIN64-NEXT: shrq $8, %rdx769; WIN64-NEXT: addq %rax, %rdx770; WIN64-NEXT: subq %rdx, %r9771; WIN64-NEXT: subq %r9, %rcx772; WIN64-NEXT: sbbq $0, %r8773; WIN64-NEXT: movabsq $-71777214294589696, %r9 # imm = 0xFF00FF00FF00FF00774; WIN64-NEXT: imulq %rcx, %r9775; WIN64-NEXT: movq %rcx, %rax776; WIN64-NEXT: mulq %r10777; WIN64-NEXT: addq %r9, %rdx778; WIN64-NEXT: imulq %r10, %r8779; WIN64-NEXT: addq %r8, %rdx780; WIN64-NEXT: retq781entry:782 %rem = udiv i128 %x, 257783 ret i128 %rem784}785 786define i128 @udiv_i128_65535(i128 %x) nounwind {787; X86-64-LABEL: udiv_i128_65535:788; X86-64: # %bb.0: # %entry789; X86-64-NEXT: movq %rdi, %rax790; X86-64-NEXT: addq %rsi, %rax791; X86-64-NEXT: adcq $0, %rax792; X86-64-NEXT: movabsq $-9223231297218904063, %rcx # imm = 0x8000800080008001793; X86-64-NEXT: mulq %rcx794; X86-64-NEXT: shrq $15, %rdx795; X86-64-NEXT: movq %rdx, %rax796; X86-64-NEXT: shlq $16, %rax797; X86-64-NEXT: subq %rax, %rdx798; X86-64-NEXT: movq %rdi, %rax799; X86-64-NEXT: addq %rsi, %rax800; X86-64-NEXT: adcq %rdx, %rax801; X86-64-NEXT: subq %rax, %rdi802; X86-64-NEXT: sbbq $0, %rsi803; X86-64-NEXT: movabsq $-281479271743490, %rcx # imm = 0xFFFEFFFEFFFEFFFE804; X86-64-NEXT: imulq %rdi, %rcx805; X86-64-NEXT: movabsq $-281479271743489, %r8 # imm = 0xFFFEFFFEFFFEFFFF806; X86-64-NEXT: movq %rdi, %rax807; X86-64-NEXT: mulq %r8808; X86-64-NEXT: addq %rcx, %rdx809; X86-64-NEXT: imulq %rsi, %r8810; X86-64-NEXT: addq %r8, %rdx811; X86-64-NEXT: retq812;813; WIN64-LABEL: udiv_i128_65535:814; WIN64: # %bb.0: # %entry815; WIN64-NEXT: movq %rdx, %r8816; WIN64-NEXT: movq %rcx, %rax817; WIN64-NEXT: addq %rdx, %rax818; WIN64-NEXT: adcq $0, %rax819; WIN64-NEXT: movabsq $-9223231297218904063, %rdx # imm = 0x8000800080008001820; WIN64-NEXT: mulq %rdx821; WIN64-NEXT: shrq $15, %rdx822; WIN64-NEXT: movq %rdx, %rax823; WIN64-NEXT: shlq $16, %rax824; WIN64-NEXT: subq %rax, %rdx825; WIN64-NEXT: movq %rcx, %rax826; WIN64-NEXT: addq %r8, %rax827; WIN64-NEXT: adcq %rdx, %rax828; WIN64-NEXT: subq %rax, %rcx829; WIN64-NEXT: sbbq $0, %r8830; WIN64-NEXT: movabsq $-281479271743490, %r9 # imm = 0xFFFEFFFEFFFEFFFE831; WIN64-NEXT: imulq %rcx, %r9832; WIN64-NEXT: movabsq $-281479271743489, %r10 # imm = 0xFFFEFFFEFFFEFFFF833; WIN64-NEXT: movq %rcx, %rax834; WIN64-NEXT: mulq %r10835; WIN64-NEXT: addq %r9, %rdx836; WIN64-NEXT: imulq %r10, %r8837; WIN64-NEXT: addq %r8, %rdx838; WIN64-NEXT: retq839entry:840 %rem = udiv i128 %x, 65535841 ret i128 %rem842}843 844define i128 @udiv_i128_65537(i128 %x) nounwind {845; X86-64-LABEL: udiv_i128_65537:846; X86-64: # %bb.0: # %entry847; X86-64-NEXT: movq %rdi, %rcx848; X86-64-NEXT: addq %rsi, %rcx849; X86-64-NEXT: adcq $0, %rcx850; X86-64-NEXT: movabsq $-281470681808895, %r8 # imm = 0xFFFF0000FFFF0001851; X86-64-NEXT: movq %rcx, %rax852; X86-64-NEXT: mulq %r8853; X86-64-NEXT: movq %rdx, %rax854; X86-64-NEXT: andq $-65536, %rax # imm = 0xFFFF0000855; X86-64-NEXT: shrq $16, %rdx856; X86-64-NEXT: addq %rax, %rdx857; X86-64-NEXT: subq %rdx, %rcx858; X86-64-NEXT: subq %rcx, %rdi859; X86-64-NEXT: sbbq $0, %rsi860; X86-64-NEXT: movabsq $-281470681808896, %rcx # imm = 0xFFFF0000FFFF0000861; X86-64-NEXT: imulq %rdi, %rcx862; X86-64-NEXT: movq %rdi, %rax863; X86-64-NEXT: mulq %r8864; X86-64-NEXT: addq %rcx, %rdx865; X86-64-NEXT: imulq %rsi, %r8866; X86-64-NEXT: addq %r8, %rdx867; X86-64-NEXT: retq868;869; WIN64-LABEL: udiv_i128_65537:870; WIN64: # %bb.0: # %entry871; WIN64-NEXT: movq %rdx, %r8872; WIN64-NEXT: movq %rcx, %r9873; WIN64-NEXT: addq %rdx, %r9874; WIN64-NEXT: adcq $0, %r9875; WIN64-NEXT: movabsq $-281470681808895, %r10 # imm = 0xFFFF0000FFFF0001876; WIN64-NEXT: movq %r9, %rax877; WIN64-NEXT: mulq %r10878; WIN64-NEXT: movq %rdx, %rax879; WIN64-NEXT: andq $-65536, %rax # imm = 0xFFFF0000880; WIN64-NEXT: shrq $16, %rdx881; WIN64-NEXT: addq %rax, %rdx882; WIN64-NEXT: subq %rdx, %r9883; WIN64-NEXT: subq %r9, %rcx884; WIN64-NEXT: sbbq $0, %r8885; WIN64-NEXT: movabsq $-281470681808896, %r9 # imm = 0xFFFF0000FFFF0000886; WIN64-NEXT: imulq %rcx, %r9887; WIN64-NEXT: movq %rcx, %rax888; WIN64-NEXT: mulq %r10889; WIN64-NEXT: addq %r9, %rdx890; WIN64-NEXT: imulq %r10, %r8891; WIN64-NEXT: addq %r8, %rdx892; WIN64-NEXT: retq893entry:894 %rem = udiv i128 %x, 65537895 ret i128 %rem896}897 898define i128 @udiv_i128_12(i128 %x) nounwind {899; X86-64-LABEL: udiv_i128_12:900; X86-64: # %bb.0: # %entry901; X86-64-NEXT: shrdq $2, %rsi, %rdi902; X86-64-NEXT: shrq $2, %rsi903; X86-64-NEXT: movq %rdi, %rcx904; X86-64-NEXT: addq %rsi, %rcx905; X86-64-NEXT: adcq $0, %rcx906; X86-64-NEXT: movabsq $-6148914691236517205, %r8 # imm = 0xAAAAAAAAAAAAAAAB907; X86-64-NEXT: movq %rcx, %rax908; X86-64-NEXT: mulq %r8909; X86-64-NEXT: shrq %rdx910; X86-64-NEXT: leaq (%rdx,%rdx,2), %rax911; X86-64-NEXT: subq %rax, %rcx912; X86-64-NEXT: subq %rcx, %rdi913; X86-64-NEXT: sbbq $0, %rsi914; X86-64-NEXT: movabsq $-6148914691236517206, %rcx # imm = 0xAAAAAAAAAAAAAAAA915; X86-64-NEXT: imulq %rdi, %rcx916; X86-64-NEXT: movq %rdi, %rax917; X86-64-NEXT: mulq %r8918; X86-64-NEXT: addq %rcx, %rdx919; X86-64-NEXT: imulq %rsi, %r8920; X86-64-NEXT: addq %r8, %rdx921; X86-64-NEXT: retq922;923; WIN64-LABEL: udiv_i128_12:924; WIN64: # %bb.0: # %entry925; WIN64-NEXT: movq %rdx, %r8926; WIN64-NEXT: shrdq $2, %rdx, %rcx927; WIN64-NEXT: shrq $2, %r8928; WIN64-NEXT: movq %rcx, %r9929; WIN64-NEXT: addq %r8, %r9930; WIN64-NEXT: adcq $0, %r9931; WIN64-NEXT: movabsq $-6148914691236517205, %r10 # imm = 0xAAAAAAAAAAAAAAAB932; WIN64-NEXT: movq %r9, %rax933; WIN64-NEXT: mulq %r10934; WIN64-NEXT: shrq %rdx935; WIN64-NEXT: leaq (%rdx,%rdx,2), %rax936; WIN64-NEXT: subq %rax, %r9937; WIN64-NEXT: subq %r9, %rcx938; WIN64-NEXT: sbbq $0, %r8939; WIN64-NEXT: movabsq $-6148914691236517206, %r9 # imm = 0xAAAAAAAAAAAAAAAA940; WIN64-NEXT: imulq %rcx, %r9941; WIN64-NEXT: movq %rcx, %rax942; WIN64-NEXT: mulq %r10943; WIN64-NEXT: addq %r9, %rdx944; WIN64-NEXT: imulq %r10, %r8945; WIN64-NEXT: addq %r8, %rdx946; WIN64-NEXT: retq947entry:948 %rem = udiv i128 %x, 12949 ret i128 %rem950}951 952; Make sure we don't inline expand for minsize.953define i128 @urem_i128_3_minsize(i128 %x) nounwind minsize {954; X86-64-LABEL: urem_i128_3_minsize:955; X86-64: # %bb.0: # %entry956; X86-64-NEXT: pushq %rax957; X86-64-NEXT: pushq $3958; X86-64-NEXT: popq %rdx959; X86-64-NEXT: xorl %ecx, %ecx960; X86-64-NEXT: callq __umodti3@PLT961; X86-64-NEXT: popq %rcx962; X86-64-NEXT: retq963;964; WIN64-LABEL: urem_i128_3_minsize:965; WIN64: # %bb.0: # %entry966; WIN64-NEXT: subq $72, %rsp967; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rax968; WIN64-NEXT: movq %rdx, 8(%rax)969; WIN64-NEXT: movq %rcx, (%rax)970; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx971; WIN64-NEXT: movq $3, (%rdx)972; WIN64-NEXT: andq $0, 8(%rdx)973; WIN64-NEXT: movq %rax, %rcx974; WIN64-NEXT: callq __umodti3975; WIN64-NEXT: movq %xmm0, %rax976; WIN64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]977; WIN64-NEXT: movq %xmm0, %rdx978; WIN64-NEXT: addq $72, %rsp979; WIN64-NEXT: retq980entry:981 %rem = urem i128 %x, 3982 ret i128 %rem983}984 985; Make sure we don't inline expand for optsize.986define i128 @urem_i128_3_optsize(i128 %x) nounwind optsize {987; X86-64-LABEL: urem_i128_3_optsize:988; X86-64: # %bb.0: # %entry989; X86-64-NEXT: pushq %rax990; X86-64-NEXT: movl $3, %edx991; X86-64-NEXT: xorl %ecx, %ecx992; X86-64-NEXT: callq __umodti3@PLT993; X86-64-NEXT: popq %rcx994; X86-64-NEXT: retq995;996; WIN64-LABEL: urem_i128_3_optsize:997; WIN64: # %bb.0: # %entry998; WIN64-NEXT: subq $72, %rsp999; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rax1000; WIN64-NEXT: movq %rdx, 8(%rax)1001; WIN64-NEXT: movq %rcx, (%rax)1002; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx1003; WIN64-NEXT: movq $3, (%rdx)1004; WIN64-NEXT: movq $0, 8(%rdx)1005; WIN64-NEXT: movq %rax, %rcx1006; WIN64-NEXT: callq __umodti31007; WIN64-NEXT: movq %xmm0, %rax1008; WIN64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1009; WIN64-NEXT: movq %xmm0, %rdx1010; WIN64-NEXT: addq $72, %rsp1011; WIN64-NEXT: retq1012entry:1013 %rem = urem i128 %x, 31014 ret i128 %rem1015}1016