| ; 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_urem_odd(i13 %X) nounwind { |
| ; MIPSEL-LABEL: test_urem_odd: |
| ; MIPSEL: # %bb.0: |
| ; MIPSEL-NEXT: addiu $1, $zero, 3277 |
| ; MIPSEL-NEXT: mul $1, $4, $1 |
| ; MIPSEL-NEXT: andi $1, $1, 8191 |
| ; MIPSEL-NEXT: jr $ra |
| ; MIPSEL-NEXT: sltiu $2, $1, 1639 |
| ; |
| ; MIPS64EL-LABEL: test_urem_odd: |
| ; MIPS64EL: # %bb.0: |
| ; MIPS64EL-NEXT: sll $1, $4, 0 |
| ; MIPS64EL-NEXT: sll $2, $1, 1 |
| ; MIPS64EL-NEXT: addu $2, $2, $1 |
| ; MIPS64EL-NEXT: sll $3, $1, 4 |
| ; MIPS64EL-NEXT: subu $2, $3, $2 |
| ; MIPS64EL-NEXT: sll $3, $1, 6 |
| ; MIPS64EL-NEXT: subu $2, $2, $3 |
| ; MIPS64EL-NEXT: sll $3, $1, 8 |
| ; MIPS64EL-NEXT: addu $2, $3, $2 |
| ; MIPS64EL-NEXT: sll $3, $1, 10 |
| ; MIPS64EL-NEXT: subu $2, $2, $3 |
| ; MIPS64EL-NEXT: sll $1, $1, 12 |
| ; MIPS64EL-NEXT: addu $1, $1, $2 |
| ; MIPS64EL-NEXT: andi $1, $1, 8191 |
| ; MIPS64EL-NEXT: jr $ra |
| ; MIPS64EL-NEXT: sltiu $2, $1, 1639 |
| %urem = urem i13 %X, 5 |
| %cmp = icmp eq i13 %urem, 0 |
| ret i1 %cmp |
| } |
| |
| define i1 @test_urem_even(i27 %X) nounwind { |
| ; MIPSEL-LABEL: test_urem_even: |
| ; MIPSEL: # %bb.0: |
| ; MIPSEL-NEXT: lui $1, 1755 |
| ; MIPSEL-NEXT: ori $1, $1, 28087 |
| ; MIPSEL-NEXT: mul $1, $4, $1 |
| ; MIPSEL-NEXT: sll $2, $1, 26 |
| ; MIPSEL-NEXT: lui $3, 2047 |
| ; MIPSEL-NEXT: ori $4, $3, 65534 |
| ; MIPSEL-NEXT: and $1, $1, $4 |
| ; MIPSEL-NEXT: srl $1, $1, 1 |
| ; MIPSEL-NEXT: or $1, $1, $2 |
| ; MIPSEL-NEXT: ori $2, $3, 65535 |
| ; MIPSEL-NEXT: and $1, $1, $2 |
| ; MIPSEL-NEXT: lui $2, 146 |
| ; MIPSEL-NEXT: ori $2, $2, 18725 |
| ; MIPSEL-NEXT: jr $ra |
| ; MIPSEL-NEXT: sltu $2, $1, $2 |
| ; |
| ; MIPS64EL-LABEL: test_urem_even: |
| ; MIPS64EL: # %bb.0: |
| ; MIPS64EL-NEXT: lui $1, 1755 |
| ; MIPS64EL-NEXT: ori $1, $1, 28087 |
| ; MIPS64EL-NEXT: sll $2, $4, 0 |
| ; MIPS64EL-NEXT: mul $1, $2, $1 |
| ; MIPS64EL-NEXT: sll $2, $1, 26 |
| ; MIPS64EL-NEXT: lui $3, 2047 |
| ; MIPS64EL-NEXT: ori $4, $3, 65534 |
| ; MIPS64EL-NEXT: and $1, $1, $4 |
| ; MIPS64EL-NEXT: srl $1, $1, 1 |
| ; MIPS64EL-NEXT: or $1, $1, $2 |
| ; MIPS64EL-NEXT: ori $2, $3, 65535 |
| ; MIPS64EL-NEXT: lui $3, 146 |
| ; MIPS64EL-NEXT: and $1, $1, $2 |
| ; MIPS64EL-NEXT: ori $2, $3, 18725 |
| ; MIPS64EL-NEXT: jr $ra |
| ; MIPS64EL-NEXT: sltu $2, $1, $2 |
| %urem = urem i27 %X, 14 |
| %cmp = icmp eq i27 %urem, 0 |
| ret i1 %cmp |
| } |
| |
| define i1 @test_urem_odd_setne(i4 %X) nounwind { |
| ; MIPSEL-LABEL: test_urem_odd_setne: |
| ; MIPSEL: # %bb.0: |
| ; MIPSEL-NEXT: sll $1, $4, 1 |
| ; MIPSEL-NEXT: addu $1, $1, $4 |
| ; MIPSEL-NEXT: negu $1, $1 |
| ; MIPSEL-NEXT: andi $1, $1, 15 |
| ; MIPSEL-NEXT: addiu $2, $zero, 3 |
| ; MIPSEL-NEXT: jr $ra |
| ; MIPSEL-NEXT: sltu $2, $2, $1 |
| ; |
| ; MIPS64EL-LABEL: test_urem_odd_setne: |
| ; MIPS64EL: # %bb.0: |
| ; MIPS64EL-NEXT: sll $1, $4, 0 |
| ; MIPS64EL-NEXT: sll $2, $1, 1 |
| ; MIPS64EL-NEXT: addu $1, $2, $1 |
| ; MIPS64EL-NEXT: negu $1, $1 |
| ; MIPS64EL-NEXT: andi $1, $1, 15 |
| ; MIPS64EL-NEXT: addiu $2, $zero, 3 |
| ; MIPS64EL-NEXT: jr $ra |
| ; MIPS64EL-NEXT: sltu $2, $2, $1 |
| %urem = urem i4 %X, 5 |
| %cmp = icmp ne i4 %urem, 0 |
| ret i1 %cmp |
| } |
| |
| define i1 @test_urem_negative_odd(i9 %X) nounwind { |
| ; MIPSEL-LABEL: test_urem_negative_odd: |
| ; MIPSEL: # %bb.0: |
| ; MIPSEL-NEXT: sll $1, $4, 1 |
| ; MIPSEL-NEXT: addu $1, $1, $4 |
| ; MIPSEL-NEXT: sll $2, $4, 4 |
| ; MIPSEL-NEXT: subu $1, $1, $2 |
| ; MIPSEL-NEXT: sll $2, $4, 6 |
| ; MIPSEL-NEXT: addu $1, $2, $1 |
| ; MIPSEL-NEXT: sll $2, $4, 8 |
| ; MIPSEL-NEXT: addu $1, $2, $1 |
| ; MIPSEL-NEXT: andi $1, $1, 511 |
| ; MIPSEL-NEXT: addiu $2, $zero, 1 |
| ; MIPSEL-NEXT: jr $ra |
| ; MIPSEL-NEXT: sltu $2, $2, $1 |
| ; |
| ; MIPS64EL-LABEL: test_urem_negative_odd: |
| ; MIPS64EL: # %bb.0: |
| ; MIPS64EL-NEXT: sll $1, $4, 0 |
| ; MIPS64EL-NEXT: sll $2, $1, 1 |
| ; MIPS64EL-NEXT: addu $2, $2, $1 |
| ; MIPS64EL-NEXT: sll $3, $1, 4 |
| ; MIPS64EL-NEXT: subu $2, $2, $3 |
| ; MIPS64EL-NEXT: sll $3, $1, 6 |
| ; MIPS64EL-NEXT: addu $2, $3, $2 |
| ; MIPS64EL-NEXT: sll $1, $1, 8 |
| ; MIPS64EL-NEXT: addiu $3, $zero, 1 |
| ; MIPS64EL-NEXT: addu $1, $1, $2 |
| ; MIPS64EL-NEXT: andi $1, $1, 511 |
| ; MIPS64EL-NEXT: jr $ra |
| ; MIPS64EL-NEXT: sltu $2, $3, $1 |
| %urem = urem i9 %X, -5 |
| %cmp = icmp ne i9 %urem, 0 |
| ret i1 %cmp |
| } |
| |
| ; Asserts today |
| ; define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind { |
| ; %urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5> |
| ; %cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2> |
| ; ret <3 x i1> %cmp |
| ; } |
| |
| define i1 @test_urem_oversized(i66 %X) nounwind { |
| ; MIPSEL-LABEL: test_urem_oversized: |
| ; MIPSEL: # %bb.0: |
| ; MIPSEL-NEXT: lui $1, 12057 |
| ; MIPSEL-NEXT: ori $1, $1, 37186 |
| ; MIPSEL-NEXT: multu $6, $1 |
| ; MIPSEL-NEXT: mflo $2 |
| ; MIPSEL-NEXT: mfhi $3 |
| ; MIPSEL-NEXT: lui $7, 52741 |
| ; MIPSEL-NEXT: ori $7, $7, 40665 |
| ; MIPSEL-NEXT: multu $6, $7 |
| ; MIPSEL-NEXT: mflo $8 |
| ; MIPSEL-NEXT: mfhi $9 |
| ; MIPSEL-NEXT: multu $5, $7 |
| ; MIPSEL-NEXT: mfhi $10 |
| ; MIPSEL-NEXT: mflo $11 |
| ; MIPSEL-NEXT: addu $9, $11, $9 |
| ; MIPSEL-NEXT: addu $12, $2, $9 |
| ; MIPSEL-NEXT: sltu $9, $9, $11 |
| ; MIPSEL-NEXT: sll $11, $12, 31 |
| ; MIPSEL-NEXT: sltu $2, $12, $2 |
| ; MIPSEL-NEXT: srl $13, $8, 1 |
| ; MIPSEL-NEXT: sll $8, $8, 1 |
| ; MIPSEL-NEXT: addu $2, $3, $2 |
| ; MIPSEL-NEXT: or $3, $13, $11 |
| ; MIPSEL-NEXT: srl $11, $12, 1 |
| ; MIPSEL-NEXT: addu $9, $10, $9 |
| ; MIPSEL-NEXT: mul $4, $4, $7 |
| ; MIPSEL-NEXT: mul $1, $5, $1 |
| ; MIPSEL-NEXT: sll $5, $6, 1 |
| ; MIPSEL-NEXT: lui $6, 60010 |
| ; MIPSEL-NEXT: ori $6, $6, 61135 |
| ; MIPSEL-NEXT: addu $2, $9, $2 |
| ; MIPSEL-NEXT: addu $1, $1, $2 |
| ; MIPSEL-NEXT: addu $2, $5, $4 |
| ; MIPSEL-NEXT: addu $1, $1, $2 |
| ; MIPSEL-NEXT: andi $1, $1, 3 |
| ; MIPSEL-NEXT: sll $2, $1, 31 |
| ; MIPSEL-NEXT: or $4, $11, $2 |
| ; MIPSEL-NEXT: sltiu $2, $4, 13 |
| ; MIPSEL-NEXT: xori $4, $4, 13 |
| ; MIPSEL-NEXT: sltu $3, $3, $6 |
| ; MIPSEL-NEXT: movz $2, $3, $4 |
| ; MIPSEL-NEXT: srl $1, $1, 1 |
| ; MIPSEL-NEXT: or $1, $1, $8 |
| ; MIPSEL-NEXT: andi $1, $1, 3 |
| ; MIPSEL-NEXT: jr $ra |
| ; MIPSEL-NEXT: movn $2, $zero, $1 |
| ; |
| ; MIPS64EL-LABEL: test_urem_oversized: |
| ; MIPS64EL: # %bb.0: |
| ; MIPS64EL-NEXT: lui $1, 6029 |
| ; MIPS64EL-NEXT: daddiu $1, $1, -14175 |
| ; MIPS64EL-NEXT: dsll $1, $1, 16 |
| ; MIPS64EL-NEXT: daddiu $1, $1, 26371 |
| ; MIPS64EL-NEXT: dsll $1, $1, 17 |
| ; MIPS64EL-NEXT: daddiu $1, $1, -24871 |
| ; MIPS64EL-NEXT: dmult $5, $1 |
| ; MIPS64EL-NEXT: mflo $2 |
| ; MIPS64EL-NEXT: dmultu $4, $1 |
| ; MIPS64EL-NEXT: mflo $1 |
| ; MIPS64EL-NEXT: mfhi $3 |
| ; MIPS64EL-NEXT: lui $5, 14 |
| ; MIPS64EL-NEXT: daddiu $5, $5, -5525 |
| ; MIPS64EL-NEXT: dsll $5, $5, 16 |
| ; MIPS64EL-NEXT: daddiu $5, $5, -4401 |
| ; MIPS64EL-NEXT: dsll $4, $4, 1 |
| ; MIPS64EL-NEXT: daddu $3, $3, $4 |
| ; MIPS64EL-NEXT: daddu $2, $3, $2 |
| ; MIPS64EL-NEXT: andi $3, $2, 3 |
| ; MIPS64EL-NEXT: dsll $2, $3, 63 |
| ; MIPS64EL-NEXT: dsrl $4, $1, 1 |
| ; MIPS64EL-NEXT: or $2, $4, $2 |
| ; MIPS64EL-NEXT: sltu $2, $2, $5 |
| ; MIPS64EL-NEXT: dsrl $3, $3, 1 |
| ; MIPS64EL-NEXT: dsll $1, $1, 1 |
| ; MIPS64EL-NEXT: or $1, $3, $1 |
| ; MIPS64EL-NEXT: andi $1, $1, 3 |
| ; MIPS64EL-NEXT: jr $ra |
| ; MIPS64EL-NEXT: movn $2, $zero, $1 |
| %urem = urem i66 %X, 1234567890 |
| %cmp = icmp eq i66 %urem, 0 |
| ret i1 %cmp |
| } |