Compiler projects using llvm
; 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
}