1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X64 3; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X86 4 5declare i4 @llvm.sdiv.fix.i4 (i4, i4, i32) 6declare i15 @llvm.sdiv.fix.i15 (i15, i15, i32) 7declare i16 @llvm.sdiv.fix.i16 (i16, i16, i32) 8declare i18 @llvm.sdiv.fix.i18 (i18, i18, i32) 9declare i64 @llvm.sdiv.fix.i64 (i64, i64, i32) 10declare <4 x i32> @llvm.sdiv.fix.v4i32(<4 x i32>, <4 x i32>, i32) 11 12define i16 @func(i16 %x, i16 %y) nounwind { 13; X64-LABEL: func: 14; X64: # %bb.0: 15; X64-NEXT: movswl %si, %esi 16; X64-NEXT: movswl %di, %ecx 17; X64-NEXT: shll $7, %ecx 18; X64-NEXT: movl %ecx, %eax 19; X64-NEXT: cltd 20; X64-NEXT: idivl %esi 21; X64-NEXT: # kill: def $eax killed $eax def $rax 22; X64-NEXT: leal -1(%rax), %edi 23; X64-NEXT: testl %esi, %esi 24; X64-NEXT: sets %sil 25; X64-NEXT: testl %ecx, %ecx 26; X64-NEXT: sets %cl 27; X64-NEXT: xorb %sil, %cl 28; X64-NEXT: testl %edx, %edx 29; X64-NEXT: setne %dl 30; X64-NEXT: testb %cl, %dl 31; X64-NEXT: cmovnel %edi, %eax 32; X64-NEXT: # kill: def $ax killed $ax killed $rax 33; X64-NEXT: retq 34; 35; X86-LABEL: func: 36; X86: # %bb.0: 37; X86-NEXT: pushl %ebx 38; X86-NEXT: pushl %edi 39; X86-NEXT: pushl %esi 40; X86-NEXT: movswl {{[0-9]+}}(%esp), %esi 41; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx 42; X86-NEXT: shll $7, %ecx 43; X86-NEXT: movl %ecx, %eax 44; X86-NEXT: cltd 45; X86-NEXT: idivl %esi 46; X86-NEXT: leal -1(%eax), %edi 47; X86-NEXT: testl %esi, %esi 48; X86-NEXT: sets %bl 49; X86-NEXT: testl %ecx, %ecx 50; X86-NEXT: sets %cl 51; X86-NEXT: xorb %bl, %cl 52; X86-NEXT: testl %edx, %edx 53; X86-NEXT: setne %dl 54; X86-NEXT: testb %cl, %dl 55; X86-NEXT: cmovnel %edi, %eax 56; X86-NEXT: # kill: def $ax killed $ax killed $eax 57; X86-NEXT: popl %esi 58; X86-NEXT: popl %edi 59; X86-NEXT: popl %ebx 60; X86-NEXT: retl 61 %tmp = call i16 @llvm.sdiv.fix.i16(i16 %x, i16 %y, i32 7) 62 ret i16 %tmp 63} 64 65define i16 @func2(i8 %x, i8 %y) nounwind { 66; X64-LABEL: func2: 67; X64: # %bb.0: 68; X64-NEXT: movsbl %dil, %eax 69; X64-NEXT: movsbl %sil, %ecx 70; X64-NEXT: movswl %cx, %esi 71; X64-NEXT: movswl %ax, %ecx 72; X64-NEXT: shll $14, %ecx 73; X64-NEXT: movl %ecx, %eax 74; X64-NEXT: cltd 75; X64-NEXT: idivl %esi 76; X64-NEXT: # kill: def $eax killed $eax def $rax 77; X64-NEXT: leal -1(%rax), %edi 78; X64-NEXT: testl %esi, %esi 79; X64-NEXT: sets %sil 80; X64-NEXT: testl %ecx, %ecx 81; X64-NEXT: sets %cl 82; X64-NEXT: xorb %sil, %cl 83; X64-NEXT: testl %edx, %edx 84; X64-NEXT: setne %dl 85; X64-NEXT: testb %cl, %dl 86; X64-NEXT: cmovel %eax, %edi 87; X64-NEXT: addl %edi, %edi 88; X64-NEXT: movswl %di, %eax 89; X64-NEXT: shrl %eax 90; X64-NEXT: # kill: def $ax killed $ax killed $eax 91; X64-NEXT: retq 92; 93; X86-LABEL: func2: 94; X86: # %bb.0: 95; X86-NEXT: pushl %ebx 96; X86-NEXT: pushl %edi 97; X86-NEXT: pushl %esi 98; X86-NEXT: movsbl {{[0-9]+}}(%esp), %edi 99; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx 100; X86-NEXT: shll $14, %ecx 101; X86-NEXT: movl %ecx, %eax 102; X86-NEXT: cltd 103; X86-NEXT: idivl %edi 104; X86-NEXT: leal -1(%eax), %esi 105; X86-NEXT: testl %edi, %edi 106; X86-NEXT: sets %bl 107; X86-NEXT: testl %ecx, %ecx 108; X86-NEXT: sets %cl 109; X86-NEXT: xorb %bl, %cl 110; X86-NEXT: testl %edx, %edx 111; X86-NEXT: setne %dl 112; X86-NEXT: testb %cl, %dl 113; X86-NEXT: cmovel %eax, %esi 114; X86-NEXT: addl %esi, %esi 115; X86-NEXT: movswl %si, %eax 116; X86-NEXT: shrl %eax 117; X86-NEXT: # kill: def $ax killed $ax killed $eax 118; X86-NEXT: popl %esi 119; X86-NEXT: popl %edi 120; X86-NEXT: popl %ebx 121; X86-NEXT: retl 122 %x2 = sext i8 %x to i15 123 %y2 = sext i8 %y to i15 124 %tmp = call i15 @llvm.sdiv.fix.i15(i15 %x2, i15 %y2, i32 14) 125 %tmp2 = sext i15 %tmp to i16 126 ret i16 %tmp2 127} 128 129define i16 @func3(i15 %x, i8 %y) nounwind { 130; X64-LABEL: func3: 131; X64: # %bb.0: 132; X64-NEXT: shll $8, %esi 133; X64-NEXT: movswl %si, %ecx 134; X64-NEXT: addl %edi, %edi 135; X64-NEXT: shrl $4, %ecx 136; X64-NEXT: movl %edi, %eax 137; X64-NEXT: cwtd 138; X64-NEXT: idivw %cx 139; X64-NEXT: # kill: def $ax killed $ax def $rax 140; X64-NEXT: leal -1(%rax), %esi 141; X64-NEXT: testw %di, %di 142; X64-NEXT: sets %dil 143; X64-NEXT: testw %cx, %cx 144; X64-NEXT: sets %cl 145; X64-NEXT: xorb %dil, %cl 146; X64-NEXT: testw %dx, %dx 147; X64-NEXT: setne %dl 148; X64-NEXT: testb %cl, %dl 149; X64-NEXT: cmovel %eax, %esi 150; X64-NEXT: addl %esi, %esi 151; X64-NEXT: movswl %si, %eax 152; X64-NEXT: shrl %eax 153; X64-NEXT: # kill: def $ax killed $ax killed $eax 154; X64-NEXT: retq 155; 156; X86-LABEL: func3: 157; X86: # %bb.0: 158; X86-NEXT: pushl %edi 159; X86-NEXT: pushl %esi 160; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 161; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 162; X86-NEXT: shll $8, %eax 163; X86-NEXT: movswl %ax, %esi 164; X86-NEXT: addl %ecx, %ecx 165; X86-NEXT: shrl $4, %esi 166; X86-NEXT: movl %ecx, %eax 167; X86-NEXT: cwtd 168; X86-NEXT: idivw %si 169; X86-NEXT: # kill: def $ax killed $ax def $eax 170; X86-NEXT: leal -1(%eax), %edi 171; X86-NEXT: testw %cx, %cx 172; X86-NEXT: sets %cl 173; X86-NEXT: testw %si, %si 174; X86-NEXT: sets %ch 175; X86-NEXT: xorb %cl, %ch 176; X86-NEXT: testw %dx, %dx 177; X86-NEXT: setne %cl 178; X86-NEXT: testb %ch, %cl 179; X86-NEXT: cmovel %eax, %edi 180; X86-NEXT: addl %edi, %edi 181; X86-NEXT: movswl %di, %eax 182; X86-NEXT: shrl %eax 183; X86-NEXT: # kill: def $ax killed $ax killed $eax 184; X86-NEXT: popl %esi 185; X86-NEXT: popl %edi 186; X86-NEXT: retl 187 %y2 = sext i8 %y to i15 188 %y3 = shl i15 %y2, 7 189 %tmp = call i15 @llvm.sdiv.fix.i15(i15 %x, i15 %y3, i32 4) 190 %tmp2 = sext i15 %tmp to i16 191 ret i16 %tmp2 192} 193 194define i4 @func4(i4 %x, i4 %y) nounwind { 195; X64-LABEL: func4: 196; X64: # %bb.0: 197; X64-NEXT: pushq %rbx 198; X64-NEXT: shlb $4, %sil 199; X64-NEXT: sarb $4, %sil 200; X64-NEXT: shlb $4, %dil 201; X64-NEXT: sarb $4, %dil 202; X64-NEXT: shlb $2, %dil 203; X64-NEXT: movsbl %dil, %ecx 204; X64-NEXT: movl %ecx, %eax 205; X64-NEXT: idivb %sil 206; X64-NEXT: movsbl %ah, %ebx 207; X64-NEXT: movzbl %al, %edi 208; X64-NEXT: leal -1(%rdi), %eax 209; X64-NEXT: movzbl %al, %eax 210; X64-NEXT: testb %sil, %sil 211; X64-NEXT: sets %dl 212; X64-NEXT: testb %cl, %cl 213; X64-NEXT: sets %cl 214; X64-NEXT: xorb %dl, %cl 215; X64-NEXT: testb %bl, %bl 216; X64-NEXT: setne %dl 217; X64-NEXT: testb %cl, %dl 218; X64-NEXT: cmovel %edi, %eax 219; X64-NEXT: # kill: def $al killed $al killed $eax 220; X64-NEXT: popq %rbx 221; X64-NEXT: retq 222; 223; X86-LABEL: func4: 224; X86: # %bb.0: 225; X86-NEXT: pushl %ebx 226; X86-NEXT: pushl %esi 227; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 228; X86-NEXT: shlb $4, %cl 229; X86-NEXT: sarb $4, %cl 230; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx 231; X86-NEXT: shlb $4, %dl 232; X86-NEXT: sarb $4, %dl 233; X86-NEXT: shlb $2, %dl 234; X86-NEXT: movsbl %dl, %eax 235; X86-NEXT: idivb %cl 236; X86-NEXT: movsbl %ah, %ebx 237; X86-NEXT: movzbl %al, %esi 238; X86-NEXT: decb %al 239; X86-NEXT: movzbl %al, %eax 240; X86-NEXT: testb %cl, %cl 241; X86-NEXT: sets %cl 242; X86-NEXT: testb %dl, %dl 243; X86-NEXT: sets %dl 244; X86-NEXT: xorb %cl, %dl 245; X86-NEXT: testb %bl, %bl 246; X86-NEXT: setne %cl 247; X86-NEXT: testb %dl, %cl 248; X86-NEXT: cmovel %esi, %eax 249; X86-NEXT: # kill: def $al killed $al killed $eax 250; X86-NEXT: popl %esi 251; X86-NEXT: popl %ebx 252; X86-NEXT: retl 253 %tmp = call i4 @llvm.sdiv.fix.i4(i4 %x, i4 %y, i32 2) 254 ret i4 %tmp 255} 256 257define i64 @func5(i64 %x, i64 %y) nounwind { 258; X64-LABEL: func5: 259; X64: # %bb.0: 260; X64-NEXT: pushq %rbp 261; X64-NEXT: pushq %r15 262; X64-NEXT: pushq %r14 263; X64-NEXT: pushq %r13 264; X64-NEXT: pushq %r12 265; X64-NEXT: pushq %rbx 266; X64-NEXT: pushq %rax 267; X64-NEXT: movq %rsi, %r14 268; X64-NEXT: movq %rdi, %r15 269; X64-NEXT: movq %rdi, %rbx 270; X64-NEXT: sarq $63, %rbx 271; X64-NEXT: shldq $31, %rdi, %rbx 272; X64-NEXT: shlq $31, %r15 273; X64-NEXT: movq %rsi, %r12 274; X64-NEXT: sarq $63, %r12 275; X64-NEXT: movq %r15, %rdi 276; X64-NEXT: movq %rbx, %rsi 277; X64-NEXT: movq %r14, %rdx 278; X64-NEXT: movq %r12, %rcx 279; X64-NEXT: callq __divti3@PLT 280; X64-NEXT: movq %rax, (%rsp) # 8-byte Spill 281; X64-NEXT: leaq -1(%rax), %rbp 282; X64-NEXT: testq %rbx, %rbx 283; X64-NEXT: sets %al 284; X64-NEXT: testq %r12, %r12 285; X64-NEXT: sets %r13b 286; X64-NEXT: xorb %al, %r13b 287; X64-NEXT: movq %r15, %rdi 288; X64-NEXT: movq %rbx, %rsi 289; X64-NEXT: movq %r14, %rdx 290; X64-NEXT: movq %r12, %rcx 291; X64-NEXT: callq __modti3@PLT 292; X64-NEXT: orq %rax, %rdx 293; X64-NEXT: setne %al 294; X64-NEXT: testb %r13b, %al 295; X64-NEXT: cmoveq (%rsp), %rbp # 8-byte Folded Reload 296; X64-NEXT: movq %rbp, %rax 297; X64-NEXT: addq $8, %rsp 298; X64-NEXT: popq %rbx 299; X64-NEXT: popq %r12 300; X64-NEXT: popq %r13 301; X64-NEXT: popq %r14 302; X64-NEXT: popq %r15 303; X64-NEXT: popq %rbp 304; X64-NEXT: retq 305; 306; X86-LABEL: func5: 307; X86: # %bb.0: 308; X86-NEXT: pushl %ebp 309; X86-NEXT: movl %esp, %ebp 310; X86-NEXT: pushl %ebx 311; X86-NEXT: pushl %edi 312; X86-NEXT: pushl %esi 313; X86-NEXT: andl $-8, %esp 314; X86-NEXT: subl $72, %esp 315; X86-NEXT: movl 8(%ebp), %ecx 316; X86-NEXT: movl 12(%ebp), %eax 317; X86-NEXT: movl 20(%ebp), %edx 318; X86-NEXT: movl %edx, %esi 319; X86-NEXT: sarl $31, %esi 320; X86-NEXT: movl %eax, %edi 321; X86-NEXT: sarl $31, %edi 322; X86-NEXT: movl %edi, %ebx 323; X86-NEXT: shldl $31, %eax, %ebx 324; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 325; X86-NEXT: shldl $31, %ecx, %eax 326; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 327; X86-NEXT: shll $31, %ecx 328; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 329; X86-NEXT: pushl %esi 330; X86-NEXT: pushl %esi 331; X86-NEXT: pushl %edx 332; X86-NEXT: pushl 16(%ebp) 333; X86-NEXT: pushl %edi 334; X86-NEXT: pushl %ebx 335; X86-NEXT: pushl %eax 336; X86-NEXT: pushl %ecx 337; X86-NEXT: leal {{[0-9]+}}(%esp), %eax 338; X86-NEXT: pushl %eax 339; X86-NEXT: calll __divti3 340; X86-NEXT: addl $32, %esp 341; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 342; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 343; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 344; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 345; X86-NEXT: movl %ecx, %eax 346; X86-NEXT: subl $1, %eax 347; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 348; X86-NEXT: sbbl $0, %ebx 349; X86-NEXT: testl %esi, %esi 350; X86-NEXT: sets %al 351; X86-NEXT: testl %edi, %edi 352; X86-NEXT: sets %cl 353; X86-NEXT: xorb %al, %cl 354; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 355; X86-NEXT: leal {{[0-9]+}}(%esp), %eax 356; X86-NEXT: pushl %esi 357; X86-NEXT: pushl %esi 358; X86-NEXT: pushl 20(%ebp) 359; X86-NEXT: pushl 16(%ebp) 360; X86-NEXT: pushl %edi 361; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 362; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 363; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 364; X86-NEXT: pushl %eax 365; X86-NEXT: calll __modti3 366; X86-NEXT: addl $32, %esp 367; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 368; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 369; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 370; X86-NEXT: orl {{[0-9]+}}(%esp), %ecx 371; X86-NEXT: orl %eax, %ecx 372; X86-NEXT: setne %al 373; X86-NEXT: testb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload 374; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 375; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload 376; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload 377; X86-NEXT: movl %ebx, %edx 378; X86-NEXT: leal -12(%ebp), %esp 379; X86-NEXT: popl %esi 380; X86-NEXT: popl %edi 381; X86-NEXT: popl %ebx 382; X86-NEXT: popl %ebp 383; X86-NEXT: retl 384 %tmp = call i64 @llvm.sdiv.fix.i64(i64 %x, i64 %y, i32 31) 385 ret i64 %tmp 386} 387 388define i18 @func6(i16 %x, i16 %y) nounwind { 389; X64-LABEL: func6: 390; X64: # %bb.0: 391; X64-NEXT: movswl %di, %ecx 392; X64-NEXT: movswl %si, %esi 393; X64-NEXT: shll $7, %ecx 394; X64-NEXT: movl %ecx, %eax 395; X64-NEXT: cltd 396; X64-NEXT: idivl %esi 397; X64-NEXT: # kill: def $eax killed $eax def $rax 398; X64-NEXT: leal -1(%rax), %edi 399; X64-NEXT: testl %esi, %esi 400; X64-NEXT: sets %sil 401; X64-NEXT: testl %ecx, %ecx 402; X64-NEXT: sets %cl 403; X64-NEXT: xorb %sil, %cl 404; X64-NEXT: testl %edx, %edx 405; X64-NEXT: setne %dl 406; X64-NEXT: testb %cl, %dl 407; X64-NEXT: cmovnel %edi, %eax 408; X64-NEXT: # kill: def $eax killed $eax killed $rax 409; X64-NEXT: retq 410; 411; X86-LABEL: func6: 412; X86: # %bb.0: 413; X86-NEXT: pushl %ebx 414; X86-NEXT: pushl %edi 415; X86-NEXT: pushl %esi 416; X86-NEXT: movswl {{[0-9]+}}(%esp), %esi 417; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx 418; X86-NEXT: shll $7, %ecx 419; X86-NEXT: movl %ecx, %eax 420; X86-NEXT: cltd 421; X86-NEXT: idivl %esi 422; X86-NEXT: leal -1(%eax), %edi 423; X86-NEXT: testl %esi, %esi 424; X86-NEXT: sets %bl 425; X86-NEXT: testl %ecx, %ecx 426; X86-NEXT: sets %cl 427; X86-NEXT: xorb %bl, %cl 428; X86-NEXT: testl %edx, %edx 429; X86-NEXT: setne %dl 430; X86-NEXT: testb %cl, %dl 431; X86-NEXT: cmovnel %edi, %eax 432; X86-NEXT: popl %esi 433; X86-NEXT: popl %edi 434; X86-NEXT: popl %ebx 435; X86-NEXT: retl 436 %x2 = sext i16 %x to i18 437 %y2 = sext i16 %y to i18 438 %tmp = call i18 @llvm.sdiv.fix.i18(i18 %x2, i18 %y2, i32 7) 439 ret i18 %tmp 440} 441 442define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind { 443; X64-LABEL: vec: 444; X64: # %bb.0: 445; X64-NEXT: pxor %xmm2, %xmm2 446; X64-NEXT: pcmpgtd %xmm1, %xmm2 447; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3] 448; X64-NEXT: movdqa %xmm1, %xmm3 449; X64-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 450; X64-NEXT: movq %xmm3, %rcx 451; X64-NEXT: pxor %xmm5, %xmm5 452; X64-NEXT: pcmpgtd %xmm0, %xmm5 453; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 454; X64-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1] 455; X64-NEXT: psllq $31, %xmm0 456; X64-NEXT: movq %xmm0, %rax 457; X64-NEXT: cqto 458; X64-NEXT: idivq %rcx 459; X64-NEXT: movq %rax, %r8 460; X64-NEXT: movq %rdx, %r11 461; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3] 462; X64-NEXT: movq %xmm3, %rcx 463; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3] 464; X64-NEXT: movq %xmm3, %rax 465; X64-NEXT: cqto 466; X64-NEXT: idivq %rcx 467; X64-NEXT: movq %rax, %r10 468; X64-NEXT: movq %rdx, %rcx 469; X64-NEXT: pxor %xmm3, %xmm3 470; X64-NEXT: pcmpgtd %xmm4, %xmm3 471; X64-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 472; X64-NEXT: movq %xmm4, %rdi 473; X64-NEXT: pxor %xmm5, %xmm5 474; X64-NEXT: pcmpgtd %xmm1, %xmm5 475; X64-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1] 476; X64-NEXT: psllq $31, %xmm1 477; X64-NEXT: movq %xmm1, %rax 478; X64-NEXT: cqto 479; X64-NEXT: idivq %rdi 480; X64-NEXT: movq %rax, %r9 481; X64-NEXT: movq %rdx, %rdi 482; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3] 483; X64-NEXT: movq %xmm4, %rsi 484; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3] 485; X64-NEXT: movq %xmm4, %rax 486; X64-NEXT: cqto 487; X64-NEXT: idivq %rsi 488; X64-NEXT: movq %r11, %xmm4 489; X64-NEXT: movq %rcx, %xmm5 490; X64-NEXT: pxor %xmm6, %xmm6 491; X64-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0] 492; X64-NEXT: pcmpeqd %xmm6, %xmm4 493; X64-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,0,3,2] 494; X64-NEXT: pand %xmm4, %xmm5 495; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,1,1] 496; X64-NEXT: pxor %xmm4, %xmm4 497; X64-NEXT: pcmpgtd %xmm2, %xmm4 498; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 499; X64-NEXT: pxor %xmm2, %xmm2 500; X64-NEXT: pcmpgtd %xmm0, %xmm2 501; X64-NEXT: movq %r8, %xmm0 502; X64-NEXT: pxor %xmm4, %xmm2 503; X64-NEXT: movq %r10, %xmm4 504; X64-NEXT: pandn %xmm2, %xmm5 505; X64-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0] 506; X64-NEXT: movdqa %xmm5, %xmm2 507; X64-NEXT: pandn %xmm0, %xmm2 508; X64-NEXT: pcmpeqd %xmm4, %xmm4 509; X64-NEXT: paddq %xmm4, %xmm0 510; X64-NEXT: pand %xmm5, %xmm0 511; X64-NEXT: por %xmm2, %xmm0 512; X64-NEXT: movq %rdi, %xmm2 513; X64-NEXT: movq %rdx, %xmm5 514; X64-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm5[0] 515; X64-NEXT: pcmpeqd %xmm6, %xmm2 516; X64-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,0,3,2] 517; X64-NEXT: pand %xmm2, %xmm5 518; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,1,1] 519; X64-NEXT: pxor %xmm3, %xmm3 520; X64-NEXT: pcmpgtd %xmm2, %xmm3 521; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 522; X64-NEXT: pcmpgtd %xmm1, %xmm6 523; X64-NEXT: pxor %xmm3, %xmm6 524; X64-NEXT: pandn %xmm6, %xmm5 525; X64-NEXT: movq %r9, %xmm1 526; X64-NEXT: movq %rax, %xmm2 527; X64-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 528; X64-NEXT: movdqa %xmm5, %xmm2 529; X64-NEXT: pandn %xmm1, %xmm2 530; X64-NEXT: paddq %xmm4, %xmm1 531; X64-NEXT: pand %xmm5, %xmm1 532; X64-NEXT: por %xmm2, %xmm1 533; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 534; X64-NEXT: retq 535; 536; X86-LABEL: vec: 537; X86: # %bb.0: 538; X86-NEXT: pushl %ebp 539; X86-NEXT: pushl %ebx 540; X86-NEXT: pushl %edi 541; X86-NEXT: pushl %esi 542; X86-NEXT: subl $60, %esp 543; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 544; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 545; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 546; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 547; X86-NEXT: movl %esi, %ebp 548; X86-NEXT: sarl $31, %ebp 549; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 550; X86-NEXT: movl %ecx, %edx 551; X86-NEXT: shll $31, %edx 552; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 553; X86-NEXT: movl %ecx, %eax 554; X86-NEXT: shrl $31, %eax 555; X86-NEXT: shldl $31, %ecx, %eax 556; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 557; X86-NEXT: pushl %ebp 558; X86-NEXT: pushl %esi 559; X86-NEXT: pushl %eax 560; X86-NEXT: pushl %edx 561; X86-NEXT: calll __divdi3 562; X86-NEXT: addl $16, %esp 563; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 564; X86-NEXT: movl %edi, %eax 565; X86-NEXT: sarl $31, %eax 566; X86-NEXT: movl %ebx, %ebp 567; X86-NEXT: shll $31, %ebp 568; X86-NEXT: movl %ebx, %ecx 569; X86-NEXT: shrl $31, %ecx 570; X86-NEXT: shldl $31, %ebx, %ecx 571; X86-NEXT: pushl %eax 572; X86-NEXT: movl %eax, %esi 573; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 574; X86-NEXT: pushl %edi 575; X86-NEXT: pushl %ecx 576; X86-NEXT: movl %ecx, %ebx 577; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 578; X86-NEXT: pushl %ebp 579; X86-NEXT: calll __moddi3 580; X86-NEXT: addl $16, %esp 581; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 582; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 583; X86-NEXT: pushl %esi 584; X86-NEXT: pushl %edi 585; X86-NEXT: pushl %ebx 586; X86-NEXT: pushl %ebp 587; X86-NEXT: calll __divdi3 588; X86-NEXT: addl $16, %esp 589; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 590; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 591; X86-NEXT: movl %eax, %ecx 592; X86-NEXT: sarl $31, %ecx 593; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 594; X86-NEXT: movl %edx, %ebx 595; X86-NEXT: shll $31, %ebx 596; X86-NEXT: movl %edx, %edi 597; X86-NEXT: shrl $31, %edi 598; X86-NEXT: shldl $31, %edx, %edi 599; X86-NEXT: pushl %ecx 600; X86-NEXT: movl %ecx, %ebp 601; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 602; X86-NEXT: pushl %eax 603; X86-NEXT: movl %eax, %esi 604; X86-NEXT: pushl %edi 605; X86-NEXT: pushl %ebx 606; X86-NEXT: calll __moddi3 607; X86-NEXT: addl $16, %esp 608; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 609; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 610; X86-NEXT: pushl %ebp 611; X86-NEXT: pushl %esi 612; X86-NEXT: pushl %edi 613; X86-NEXT: pushl %ebx 614; X86-NEXT: calll __divdi3 615; X86-NEXT: addl $16, %esp 616; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 617; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 618; X86-NEXT: movl %eax, %ebx 619; X86-NEXT: sarl $31, %ebx 620; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 621; X86-NEXT: movl %ecx, %esi 622; X86-NEXT: shll $31, %esi 623; X86-NEXT: movl %ecx, %ebp 624; X86-NEXT: shrl $31, %ebp 625; X86-NEXT: shldl $31, %ecx, %ebp 626; X86-NEXT: pushl %ebx 627; X86-NEXT: pushl %eax 628; X86-NEXT: pushl %ebp 629; X86-NEXT: pushl %esi 630; X86-NEXT: calll __moddi3 631; X86-NEXT: addl $16, %esp 632; X86-NEXT: movl %eax, (%esp) # 4-byte Spill 633; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 634; X86-NEXT: pushl %ebx 635; X86-NEXT: pushl {{[0-9]+}}(%esp) 636; X86-NEXT: pushl %ebp 637; X86-NEXT: pushl %esi 638; X86-NEXT: calll __divdi3 639; X86-NEXT: addl $16, %esp 640; X86-NEXT: testl %ebp, %ebp 641; X86-NEXT: sets %cl 642; X86-NEXT: testl %ebx, %ebx 643; X86-NEXT: sets %dl 644; X86-NEXT: xorb %cl, %dl 645; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 646; X86-NEXT: orl (%esp), %ecx # 4-byte Folded Reload 647; X86-NEXT: setne %cl 648; X86-NEXT: testb %dl, %cl 649; X86-NEXT: leal -1(%eax), %ecx 650; X86-NEXT: cmovel %eax, %ecx 651; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill 652; X86-NEXT: testl %edi, %edi 653; X86-NEXT: sets %al 654; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 655; X86-NEXT: sets %cl 656; X86-NEXT: xorb %al, %cl 657; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 658; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload 659; X86-NEXT: setne %al 660; X86-NEXT: testb %cl, %al 661; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 662; X86-NEXT: leal -1(%eax), %ecx 663; X86-NEXT: cmovel %eax, %ecx 664; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 665; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 666; X86-NEXT: sets %al 667; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 668; X86-NEXT: sets %cl 669; X86-NEXT: xorb %al, %cl 670; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 671; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload 672; X86-NEXT: setne %al 673; X86-NEXT: testb %cl, %al 674; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 675; X86-NEXT: leal -1(%eax), %ebp 676; X86-NEXT: cmovel %eax, %ebp 677; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 678; X86-NEXT: testl %edx, %edx 679; X86-NEXT: sets %al 680; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 681; X86-NEXT: testl %ecx, %ecx 682; X86-NEXT: sets %bl 683; X86-NEXT: xorb %al, %bl 684; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload 685; X86-NEXT: leal -1(%edi), %esi 686; X86-NEXT: pushl %ecx 687; X86-NEXT: pushl {{[0-9]+}}(%esp) 688; X86-NEXT: pushl %edx 689; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 690; X86-NEXT: calll __moddi3 691; X86-NEXT: addl $16, %esp 692; X86-NEXT: orl %eax, %edx 693; X86-NEXT: setne %al 694; X86-NEXT: testb %bl, %al 695; X86-NEXT: cmovel %edi, %esi 696; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 697; X86-NEXT: movl %esi, 12(%eax) 698; X86-NEXT: movl %ebp, 8(%eax) 699; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 700; X86-NEXT: movl %ecx, 4(%eax) 701; X86-NEXT: movl (%esp), %ecx # 4-byte Reload 702; X86-NEXT: movl %ecx, (%eax) 703; X86-NEXT: addl $60, %esp 704; X86-NEXT: popl %esi 705; X86-NEXT: popl %edi 706; X86-NEXT: popl %ebx 707; X86-NEXT: popl %ebp 708; X86-NEXT: retl $4 709 %tmp = call <4 x i32> @llvm.sdiv.fix.v4i32(<4 x i32> %x, <4 x i32> %y, i32 31) 710 ret <4 x i32> %tmp 711} 712