Compiler projects using llvm
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=mips-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=MIPSEL
; RUN: llc -mtriple=mips64el-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=MIPS64EL

define i1 @test_srem_odd(i29 %X) nounwind {
; MIPSEL-LABEL: test_srem_odd:
; MIPSEL:       # %bb.0:
; MIPSEL-NEXT:    lui $1, 8026
; MIPSEL-NEXT:    ori $1, $1, 33099
; MIPSEL-NEXT:    mul $1, $4, $1
; MIPSEL-NEXT:    lui $2, 41
; MIPSEL-NEXT:    ori $2, $2, 24493
; MIPSEL-NEXT:    addu $1, $1, $2
; MIPSEL-NEXT:    lui $2, 8191
; MIPSEL-NEXT:    ori $2, $2, 65535
; MIPSEL-NEXT:    and $1, $1, $2
; MIPSEL-NEXT:    lui $2, 82
; MIPSEL-NEXT:    ori $2, $2, 48987
; MIPSEL-NEXT:    jr $ra
; MIPSEL-NEXT:    sltu $2, $1, $2
;
; MIPS64EL-LABEL: test_srem_odd:
; MIPS64EL:       # %bb.0:
; MIPS64EL-NEXT:    lui $1, 8026
; MIPS64EL-NEXT:    ori $1, $1, 33099
; MIPS64EL-NEXT:    sll $2, $4, 0
; MIPS64EL-NEXT:    mul $1, $2, $1
; MIPS64EL-NEXT:    lui $2, 41
; MIPS64EL-NEXT:    ori $2, $2, 24493
; MIPS64EL-NEXT:    addu $1, $1, $2
; MIPS64EL-NEXT:    lui $2, 8191
; MIPS64EL-NEXT:    ori $2, $2, 65535
; MIPS64EL-NEXT:    and $1, $1, $2
; MIPS64EL-NEXT:    lui $2, 82
; MIPS64EL-NEXT:    ori $2, $2, 48987
; MIPS64EL-NEXT:    jr $ra
; MIPS64EL-NEXT:    sltu $2, $1, $2
  %srem = srem i29 %X, 99
  %cmp = icmp eq i29 %srem, 0
  ret i1 %cmp
}

define i1 @test_srem_even(i4 %X) nounwind {
; MIPSEL-LABEL: test_srem_even:
; MIPSEL:       # %bb.0:
; MIPSEL-NEXT:    sll $1, $4, 28
; MIPSEL-NEXT:    sra $1, $1, 28
; MIPSEL-NEXT:    sll $2, $1, 1
; MIPSEL-NEXT:    addu $1, $2, $1
; MIPSEL-NEXT:    srl $2, $1, 4
; MIPSEL-NEXT:    srl $1, $1, 7
; MIPSEL-NEXT:    andi $1, $1, 1
; MIPSEL-NEXT:    addiu $3, $zero, 1
; MIPSEL-NEXT:    addu $1, $2, $1
; MIPSEL-NEXT:    sll $2, $1, 1
; MIPSEL-NEXT:    sll $1, $1, 2
; MIPSEL-NEXT:    addu $1, $1, $2
; MIPSEL-NEXT:    subu $1, $4, $1
; MIPSEL-NEXT:    andi $1, $1, 15
; MIPSEL-NEXT:    xor $1, $1, $3
; MIPSEL-NEXT:    jr $ra
; MIPSEL-NEXT:    sltiu $2, $1, 1
;
; MIPS64EL-LABEL: test_srem_even:
; MIPS64EL:       # %bb.0:
; MIPS64EL-NEXT:    sll $1, $4, 0
; MIPS64EL-NEXT:    sll $2, $1, 28
; MIPS64EL-NEXT:    sra $2, $2, 28
; MIPS64EL-NEXT:    sll $3, $2, 1
; MIPS64EL-NEXT:    addu $2, $3, $2
; MIPS64EL-NEXT:    addiu $3, $zero, 1
; MIPS64EL-NEXT:    srl $4, $2, 4
; MIPS64EL-NEXT:    srl $2, $2, 7
; MIPS64EL-NEXT:    andi $2, $2, 1
; MIPS64EL-NEXT:    addu $2, $4, $2
; MIPS64EL-NEXT:    sll $4, $2, 1
; MIPS64EL-NEXT:    sll $2, $2, 2
; MIPS64EL-NEXT:    addu $2, $2, $4
; MIPS64EL-NEXT:    subu $1, $1, $2
; MIPS64EL-NEXT:    andi $1, $1, 15
; MIPS64EL-NEXT:    xor $1, $1, $3
; MIPS64EL-NEXT:    jr $ra
; MIPS64EL-NEXT:    sltiu $2, $1, 1
  %srem = srem i4 %X, 6
  %cmp = icmp eq i4 %srem, 1
  ret i1 %cmp
}

define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; MIPSEL-LABEL: test_srem_pow2_setne:
; MIPSEL:       # %bb.0:
; MIPSEL-NEXT:    sll $1, $4, 26
; MIPSEL-NEXT:    sra $1, $1, 26
; MIPSEL-NEXT:    srl $1, $1, 9
; MIPSEL-NEXT:    andi $1, $1, 3
; MIPSEL-NEXT:    addu $1, $4, $1
; MIPSEL-NEXT:    andi $1, $1, 60
; MIPSEL-NEXT:    subu $1, $4, $1
; MIPSEL-NEXT:    andi $1, $1, 63
; MIPSEL-NEXT:    jr $ra
; MIPSEL-NEXT:    sltu $2, $zero, $1
;
; MIPS64EL-LABEL: test_srem_pow2_setne:
; MIPS64EL:       # %bb.0:
; MIPS64EL-NEXT:    sll $1, $4, 0
; MIPS64EL-NEXT:    sll $2, $1, 26
; MIPS64EL-NEXT:    sra $2, $2, 26
; MIPS64EL-NEXT:    srl $2, $2, 9
; MIPS64EL-NEXT:    andi $2, $2, 3
; MIPS64EL-NEXT:    addu $2, $1, $2
; MIPS64EL-NEXT:    andi $2, $2, 60
; MIPS64EL-NEXT:    subu $1, $1, $2
; MIPS64EL-NEXT:    andi $1, $1, 63
; MIPS64EL-NEXT:    jr $ra
; MIPS64EL-NEXT:    sltu $2, $zero, $1
  %srem = srem i6 %X, 4
  %cmp = icmp ne i6 %srem, 0
  ret i1 %cmp
}

; Asserts today
; See https://bugs.llvm.org/show_bug.cgi?id=49551
; and https://bugs.llvm.org/show_bug.cgi?id=49550
; define <4 x i1> @test_srem_vec(<4 x i31> %X) nounwind {
;   %srem = srem <4 x i31> %X, <i31 9, i31 9, i31 -9, i31 -9>
;   %cmp = icmp ne <4 x i31> %srem, <i31 4, i31 -4, i31 4, i31 -4>
;   ret <4 x i1> %cmp
; }