; 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 ; }