| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=i686-unknown-linux-gnu < %s | FileCheck %s --check-prefix=X86 |
| ; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=X64 |
| |
| define i1 @t32_3_1(i32 %X) nounwind { |
| ; X86-LABEL: t32_3_1: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-1431655765, {{[0-9]+}}(%esp), %eax # imm = 0xAAAAAAAB |
| ; X86-NEXT: addl $1431655765, %eax # imm = 0x55555555 |
| ; X86-NEXT: cmpl $1431655765, %eax # imm = 0x55555555 |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_3_1: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB |
| ; X64-NEXT: addl $1431655765, %eax # imm = 0x55555555 |
| ; X64-NEXT: cmpl $1431655765, %eax # imm = 0x55555555 |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 3 |
| %cmp = icmp eq i32 %urem, 1 |
| ret i1 %cmp |
| } |
| |
| define i1 @t32_3_2(i32 %X) nounwind { |
| ; X86-LABEL: t32_3_2: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-1431655765, {{[0-9]+}}(%esp), %eax # imm = 0xAAAAAAAB |
| ; X86-NEXT: addl $-1431655766, %eax # imm = 0xAAAAAAAA |
| ; X86-NEXT: cmpl $1431655765, %eax # imm = 0x55555555 |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_3_2: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB |
| ; X64-NEXT: addl $-1431655766, %eax # imm = 0xAAAAAAAA |
| ; X64-NEXT: cmpl $1431655765, %eax # imm = 0x55555555 |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 3 |
| %cmp = icmp eq i32 %urem, 2 |
| ret i1 %cmp |
| } |
| |
| |
| define i1 @t32_5_1(i32 %X) nounwind { |
| ; X86-LABEL: t32_5_1: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-858993459, {{[0-9]+}}(%esp), %eax # imm = 0xCCCCCCCD |
| ; X86-NEXT: addl $858993459, %eax # imm = 0x33333333 |
| ; X86-NEXT: cmpl $858993459, %eax # imm = 0x33333333 |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_5_1: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-858993459, %edi, %eax # imm = 0xCCCCCCCD |
| ; X64-NEXT: addl $858993459, %eax # imm = 0x33333333 |
| ; X64-NEXT: cmpl $858993459, %eax # imm = 0x33333333 |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 5 |
| %cmp = icmp eq i32 %urem, 1 |
| ret i1 %cmp |
| } |
| |
| define i1 @t32_5_2(i32 %X) nounwind { |
| ; X86-LABEL: t32_5_2: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-858993459, {{[0-9]+}}(%esp), %eax # imm = 0xCCCCCCCD |
| ; X86-NEXT: addl $1717986918, %eax # imm = 0x66666666 |
| ; X86-NEXT: cmpl $858993459, %eax # imm = 0x33333333 |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_5_2: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-858993459, %edi, %eax # imm = 0xCCCCCCCD |
| ; X64-NEXT: addl $1717986918, %eax # imm = 0x66666666 |
| ; X64-NEXT: cmpl $858993459, %eax # imm = 0x33333333 |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 5 |
| %cmp = icmp eq i32 %urem, 2 |
| ret i1 %cmp |
| } |
| |
| define i1 @t32_5_3(i32 %X) nounwind { |
| ; X86-LABEL: t32_5_3: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-858993459, {{[0-9]+}}(%esp), %eax # imm = 0xCCCCCCCD |
| ; X86-NEXT: addl $-1717986919, %eax # imm = 0x99999999 |
| ; X86-NEXT: cmpl $858993459, %eax # imm = 0x33333333 |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_5_3: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-858993459, %edi, %eax # imm = 0xCCCCCCCD |
| ; X64-NEXT: addl $-1717986919, %eax # imm = 0x99999999 |
| ; X64-NEXT: cmpl $858993459, %eax # imm = 0x33333333 |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 5 |
| %cmp = icmp eq i32 %urem, 3 |
| ret i1 %cmp |
| } |
| |
| define i1 @t32_5_4(i32 %X) nounwind { |
| ; X86-LABEL: t32_5_4: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-858993459, {{[0-9]+}}(%esp), %eax # imm = 0xCCCCCCCD |
| ; X86-NEXT: addl $-858993460, %eax # imm = 0xCCCCCCCC |
| ; X86-NEXT: cmpl $858993459, %eax # imm = 0x33333333 |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_5_4: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-858993459, %edi, %eax # imm = 0xCCCCCCCD |
| ; X64-NEXT: addl $-858993460, %eax # imm = 0xCCCCCCCC |
| ; X64-NEXT: cmpl $858993459, %eax # imm = 0x33333333 |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 5 |
| %cmp = icmp eq i32 %urem, 4 |
| ret i1 %cmp |
| } |
| |
| |
| define i1 @t32_6_1(i32 %X) nounwind { |
| ; X86-LABEL: t32_6_1: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-1431655765, {{[0-9]+}}(%esp), %eax # imm = 0xAAAAAAAB |
| ; X86-NEXT: addl $1431655765, %eax # imm = 0x55555555 |
| ; X86-NEXT: rorl %eax |
| ; X86-NEXT: cmpl $715827883, %eax # imm = 0x2AAAAAAB |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_6_1: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB |
| ; X64-NEXT: addl $1431655765, %eax # imm = 0x55555555 |
| ; X64-NEXT: rorl %eax |
| ; X64-NEXT: cmpl $715827883, %eax # imm = 0x2AAAAAAB |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 6 |
| %cmp = icmp eq i32 %urem, 1 |
| ret i1 %cmp |
| } |
| |
| define i1 @t32_6_2(i32 %X) nounwind { |
| ; X86-LABEL: t32_6_2: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-1431655765, {{[0-9]+}}(%esp), %eax # imm = 0xAAAAAAAB |
| ; X86-NEXT: addl $-1431655766, %eax # imm = 0xAAAAAAAA |
| ; X86-NEXT: rorl %eax |
| ; X86-NEXT: cmpl $715827883, %eax # imm = 0x2AAAAAAB |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_6_2: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB |
| ; X64-NEXT: addl $-1431655766, %eax # imm = 0xAAAAAAAA |
| ; X64-NEXT: rorl %eax |
| ; X64-NEXT: cmpl $715827883, %eax # imm = 0x2AAAAAAB |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 6 |
| %cmp = icmp eq i32 %urem, 2 |
| ret i1 %cmp |
| } |
| |
| define i1 @t32_6_3(i32 %X) nounwind { |
| ; X86-LABEL: t32_6_3: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-1431655765, {{[0-9]+}}(%esp), %eax # imm = 0xAAAAAAAB |
| ; X86-NEXT: decl %eax |
| ; X86-NEXT: rorl %eax |
| ; X86-NEXT: cmpl $715827883, %eax # imm = 0x2AAAAAAB |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_6_3: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB |
| ; X64-NEXT: decl %eax |
| ; X64-NEXT: rorl %eax |
| ; X64-NEXT: cmpl $715827883, %eax # imm = 0x2AAAAAAB |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 6 |
| %cmp = icmp eq i32 %urem, 3 |
| ret i1 %cmp |
| } |
| |
| define i1 @t32_6_4(i32 %X) nounwind { |
| ; X86-LABEL: t32_6_4: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-1431655765, {{[0-9]+}}(%esp), %eax # imm = 0xAAAAAAAB |
| ; X86-NEXT: addl $1431655764, %eax # imm = 0x55555554 |
| ; X86-NEXT: rorl %eax |
| ; X86-NEXT: cmpl $715827882, %eax # imm = 0x2AAAAAAA |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_6_4: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB |
| ; X64-NEXT: addl $1431655764, %eax # imm = 0x55555554 |
| ; X64-NEXT: rorl %eax |
| ; X64-NEXT: cmpl $715827882, %eax # imm = 0x2AAAAAAA |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 6 |
| %cmp = icmp eq i32 %urem, 4 |
| ret i1 %cmp |
| } |
| |
| define i1 @t32_6_5(i32 %X) nounwind { |
| ; X86-LABEL: t32_6_5: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-1431655765, {{[0-9]+}}(%esp), %eax # imm = 0xAAAAAAAB |
| ; X86-NEXT: addl $-1431655767, %eax # imm = 0xAAAAAAA9 |
| ; X86-NEXT: rorl %eax |
| ; X86-NEXT: cmpl $715827882, %eax # imm = 0x2AAAAAAA |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t32_6_5: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB |
| ; X64-NEXT: addl $-1431655767, %eax # imm = 0xAAAAAAA9 |
| ; X64-NEXT: rorl %eax |
| ; X64-NEXT: cmpl $715827882, %eax # imm = 0x2AAAAAAA |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i32 %X, 6 |
| %cmp = icmp eq i32 %urem, 5 |
| ret i1 %cmp |
| } |
| |
| ;------------------------------------------------------------------------------- |
| ; Other widths. |
| |
| define i1 @t16_3_2(i16 %X) nounwind { |
| ; X86-LABEL: t16_3_2: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-21845, {{[0-9]+}}(%esp), %eax # imm = 0xAAAB |
| ; X86-NEXT: addl $-21846, %eax # imm = 0xAAAA |
| ; X86-NEXT: movzwl %ax, %eax |
| ; X86-NEXT: cmpl $21845, %eax # imm = 0x5555 |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t16_3_2: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-21845, %edi, %eax # imm = 0xAAAB |
| ; X64-NEXT: addl $-21846, %eax # imm = 0xAAAA |
| ; X64-NEXT: movzwl %ax, %eax |
| ; X64-NEXT: cmpl $21845, %eax # imm = 0x5555 |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i16 %X, 3 |
| %cmp = icmp eq i16 %urem, 2 |
| ret i1 %cmp |
| } |
| |
| define i1 @t8_3_2(i8 %X) nounwind { |
| ; X86-LABEL: t8_3_2: |
| ; X86: # %bb.0: |
| ; X86-NEXT: imull $-85, {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: addb $-86, %al |
| ; X86-NEXT: cmpb $85, %al |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t8_3_2: |
| ; X64: # %bb.0: |
| ; X64-NEXT: imull $-85, %edi, %eax |
| ; X64-NEXT: addb $-86, %al |
| ; X64-NEXT: cmpb $85, %al |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i8 %X, 3 |
| %cmp = icmp eq i8 %urem, 2 |
| ret i1 %cmp |
| } |
| |
| define i1 @t64_3_2(i64 %X) nounwind { |
| ; X86-LABEL: t64_3_2: |
| ; X86: # %bb.0: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx |
| ; X86-NEXT: movl $-1431655765, %edx # imm = 0xAAAAAAAB |
| ; X86-NEXT: movl %ecx, %eax |
| ; X86-NEXT: mull %edx |
| ; X86-NEXT: imull $-1431655766, %ecx, %ecx # imm = 0xAAAAAAAA |
| ; X86-NEXT: addl %edx, %ecx |
| ; X86-NEXT: imull $-1431655765, {{[0-9]+}}(%esp), %edx # imm = 0xAAAAAAAB |
| ; X86-NEXT: addl %ecx, %edx |
| ; X86-NEXT: addl $-1431655766, %eax # imm = 0xAAAAAAAA |
| ; X86-NEXT: adcl $-1431655766, %edx # imm = 0xAAAAAAAA |
| ; X86-NEXT: cmpl $1431655765, %eax # imm = 0x55555555 |
| ; X86-NEXT: sbbl $1431655765, %edx # imm = 0x55555555 |
| ; X86-NEXT: setb %al |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: t64_3_2: |
| ; X64: # %bb.0: |
| ; X64-NEXT: movabsq $-6148914691236517205, %rax # imm = 0xAAAAAAAAAAAAAAAB |
| ; X64-NEXT: imulq %rdi, %rax |
| ; X64-NEXT: movabsq $-6148914691236517206, %rcx # imm = 0xAAAAAAAAAAAAAAAA |
| ; X64-NEXT: addq %rax, %rcx |
| ; X64-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555 |
| ; X64-NEXT: cmpq %rax, %rcx |
| ; X64-NEXT: setb %al |
| ; X64-NEXT: retq |
| %urem = urem i64 %X, 3 |
| %cmp = icmp eq i64 %urem, 2 |
| ret i1 %cmp |
| } |