| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32 |
| |
| ; sdiv |
| define signext i8 @sdiv_i8(i8 signext %a, i8 signext %b) { |
| ; MIPS32-LABEL: sdiv_i8: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: sll $1, $5, 24 |
| ; MIPS32-NEXT: sra $2, $1, 24 |
| ; MIPS32-NEXT: sll $1, $4, 24 |
| ; MIPS32-NEXT: sra $1, $1, 24 |
| ; MIPS32-NEXT: div $zero, $2, $1 |
| ; MIPS32-NEXT: teq $1, $zero, 7 |
| ; MIPS32-NEXT: mflo $1 |
| ; MIPS32-NEXT: sll $1, $1, 24 |
| ; MIPS32-NEXT: sra $2, $1, 24 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = sdiv i8 %b, %a |
| ret i8 %div |
| } |
| |
| define signext i16 @sdiv_i16(i16 signext %a, i16 signext %b) { |
| ; MIPS32-LABEL: sdiv_i16: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: sll $1, $5, 16 |
| ; MIPS32-NEXT: sra $2, $1, 16 |
| ; MIPS32-NEXT: sll $1, $4, 16 |
| ; MIPS32-NEXT: sra $1, $1, 16 |
| ; MIPS32-NEXT: div $zero, $2, $1 |
| ; MIPS32-NEXT: teq $1, $zero, 7 |
| ; MIPS32-NEXT: mflo $1 |
| ; MIPS32-NEXT: sll $1, $1, 16 |
| ; MIPS32-NEXT: sra $2, $1, 16 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = sdiv i16 %b, %a |
| ret i16 %div |
| } |
| |
| define signext i32 @sdiv_i32(i32 signext %a, i32 signext %b) { |
| ; MIPS32-LABEL: sdiv_i32: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: div $zero, $5, $4 |
| ; MIPS32-NEXT: teq $4, $zero, 7 |
| ; MIPS32-NEXT: mflo $2 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = sdiv i32 %b, %a |
| ret i32 %div |
| } |
| |
| define signext i64 @sdiv_i64(i64 signext %a, i64 signext %b) { |
| ; MIPS32-LABEL: sdiv_i64: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: addiu $sp, $sp, -32 |
| ; MIPS32-NEXT: .cfi_def_cfa_offset 32 |
| ; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: .cfi_offset 31, -4 |
| ; MIPS32-NEXT: sw $4, 20($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: sw $5, 24($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: move $4, $6 |
| ; MIPS32-NEXT: lw $6, 20($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: move $5, $7 |
| ; MIPS32-NEXT: lw $7, 24($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: jal __divdi3 |
| ; MIPS32-NEXT: nop |
| ; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: addiu $sp, $sp, 32 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = sdiv i64 %b, %a |
| ret i64 %div |
| } |
| |
| ; srem |
| define signext i8 @srem_i8(i8 signext %a, i8 signext %b) { |
| ; MIPS32-LABEL: srem_i8: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: sll $1, $5, 24 |
| ; MIPS32-NEXT: sra $2, $1, 24 |
| ; MIPS32-NEXT: sll $1, $4, 24 |
| ; MIPS32-NEXT: sra $1, $1, 24 |
| ; MIPS32-NEXT: div $zero, $2, $1 |
| ; MIPS32-NEXT: teq $1, $zero, 7 |
| ; MIPS32-NEXT: mflo $1 |
| ; MIPS32-NEXT: sll $1, $1, 24 |
| ; MIPS32-NEXT: sra $2, $1, 24 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = sdiv i8 %b, %a |
| ret i8 %div |
| } |
| |
| define signext i16 @srem_i16(i16 signext %a, i16 signext %b) { |
| ; MIPS32-LABEL: srem_i16: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: sll $1, $5, 16 |
| ; MIPS32-NEXT: sra $2, $1, 16 |
| ; MIPS32-NEXT: sll $1, $4, 16 |
| ; MIPS32-NEXT: sra $1, $1, 16 |
| ; MIPS32-NEXT: div $zero, $2, $1 |
| ; MIPS32-NEXT: teq $1, $zero, 7 |
| ; MIPS32-NEXT: mfhi $1 |
| ; MIPS32-NEXT: sll $1, $1, 16 |
| ; MIPS32-NEXT: sra $2, $1, 16 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %rem = srem i16 %b, %a |
| ret i16 %rem |
| } |
| |
| define signext i32 @srem_i32(i32 signext %a, i32 signext %b) { |
| ; MIPS32-LABEL: srem_i32: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: div $zero, $5, $4 |
| ; MIPS32-NEXT: teq $4, $zero, 7 |
| ; MIPS32-NEXT: mfhi $2 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %rem = srem i32 %b, %a |
| ret i32 %rem |
| } |
| |
| define signext i64 @srem_i64(i64 signext %a, i64 signext %b) { |
| ; MIPS32-LABEL: srem_i64: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: addiu $sp, $sp, -32 |
| ; MIPS32-NEXT: .cfi_def_cfa_offset 32 |
| ; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: .cfi_offset 31, -4 |
| ; MIPS32-NEXT: sw $4, 20($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: sw $5, 24($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: move $4, $6 |
| ; MIPS32-NEXT: lw $6, 20($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: move $5, $7 |
| ; MIPS32-NEXT: lw $7, 24($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: jal __moddi3 |
| ; MIPS32-NEXT: nop |
| ; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: addiu $sp, $sp, 32 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %rem = srem i64 %b, %a |
| ret i64 %rem |
| } |
| |
| ; udiv |
| define signext i8 @udiv_i8(i8 signext %a, i8 signext %b) { |
| ; MIPS32-LABEL: udiv_i8: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: andi $2, $5, 255 |
| ; MIPS32-NEXT: andi $1, $4, 255 |
| ; MIPS32-NEXT: divu $zero, $2, $1 |
| ; MIPS32-NEXT: teq $1, $zero, 7 |
| ; MIPS32-NEXT: mflo $1 |
| ; MIPS32-NEXT: sll $1, $1, 24 |
| ; MIPS32-NEXT: sra $2, $1, 24 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = udiv i8 %b, %a |
| ret i8 %div |
| } |
| |
| define signext i16 @udiv_i16(i16 signext %a, i16 signext %b) { |
| ; MIPS32-LABEL: udiv_i16: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: andi $2, $5, 65535 |
| ; MIPS32-NEXT: andi $1, $4, 65535 |
| ; MIPS32-NEXT: divu $zero, $2, $1 |
| ; MIPS32-NEXT: teq $1, $zero, 7 |
| ; MIPS32-NEXT: mflo $1 |
| ; MIPS32-NEXT: sll $1, $1, 16 |
| ; MIPS32-NEXT: sra $2, $1, 16 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = udiv i16 %b, %a |
| ret i16 %div |
| } |
| |
| define signext i32 @udiv_i32(i32 signext %a, i32 signext %b) { |
| ; MIPS32-LABEL: udiv_i32: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: divu $zero, $5, $4 |
| ; MIPS32-NEXT: teq $4, $zero, 7 |
| ; MIPS32-NEXT: mflo $2 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = udiv i32 %b, %a |
| ret i32 %div |
| } |
| |
| define signext i64 @udiv_i64(i64 signext %a, i64 signext %b) { |
| ; MIPS32-LABEL: udiv_i64: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: addiu $sp, $sp, -32 |
| ; MIPS32-NEXT: .cfi_def_cfa_offset 32 |
| ; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: .cfi_offset 31, -4 |
| ; MIPS32-NEXT: sw $4, 20($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: sw $5, 24($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: move $4, $6 |
| ; MIPS32-NEXT: lw $6, 20($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: move $5, $7 |
| ; MIPS32-NEXT: lw $7, 24($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: jal __udivdi3 |
| ; MIPS32-NEXT: nop |
| ; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: addiu $sp, $sp, 32 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %div = udiv i64 %b, %a |
| ret i64 %div |
| } |
| |
| ; urem |
| define signext i8 @urem_i8(i8 signext %a, i8 signext %b) { |
| ; MIPS32-LABEL: urem_i8: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: andi $2, $5, 255 |
| ; MIPS32-NEXT: andi $1, $4, 255 |
| ; MIPS32-NEXT: divu $zero, $2, $1 |
| ; MIPS32-NEXT: teq $1, $zero, 7 |
| ; MIPS32-NEXT: mfhi $1 |
| ; MIPS32-NEXT: sll $1, $1, 24 |
| ; MIPS32-NEXT: sra $2, $1, 24 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %rem = urem i8 %b, %a |
| ret i8 %rem |
| } |
| |
| define signext i16 @urem_i16(i16 signext %a, i16 signext %b) { |
| ; MIPS32-LABEL: urem_i16: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: andi $2, $5, 65535 |
| ; MIPS32-NEXT: andi $1, $4, 65535 |
| ; MIPS32-NEXT: divu $zero, $2, $1 |
| ; MIPS32-NEXT: teq $1, $zero, 7 |
| ; MIPS32-NEXT: mfhi $1 |
| ; MIPS32-NEXT: sll $1, $1, 16 |
| ; MIPS32-NEXT: sra $2, $1, 16 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %rem = urem i16 %b, %a |
| ret i16 %rem |
| } |
| |
| define signext i32 @urem_i32(i32 signext %a, i32 signext %b) { |
| ; MIPS32-LABEL: urem_i32: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: divu $zero, $5, $4 |
| ; MIPS32-NEXT: teq $4, $zero, 7 |
| ; MIPS32-NEXT: mfhi $2 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %rem = urem i32 %b, %a |
| ret i32 %rem |
| } |
| |
| define signext i64 @urem_i64(i64 signext %a, i64 signext %b) { |
| ; MIPS32-LABEL: urem_i64: |
| ; MIPS32: # %bb.0: # %entry |
| ; MIPS32-NEXT: addiu $sp, $sp, -32 |
| ; MIPS32-NEXT: .cfi_def_cfa_offset 32 |
| ; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: .cfi_offset 31, -4 |
| ; MIPS32-NEXT: sw $4, 20($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: sw $5, 24($sp) # 4-byte Folded Spill |
| ; MIPS32-NEXT: move $4, $6 |
| ; MIPS32-NEXT: lw $6, 20($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: move $5, $7 |
| ; MIPS32-NEXT: lw $7, 24($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: jal __umoddi3 |
| ; MIPS32-NEXT: nop |
| ; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload |
| ; MIPS32-NEXT: addiu $sp, $sp, 32 |
| ; MIPS32-NEXT: jr $ra |
| ; MIPS32-NEXT: nop |
| entry: |
| %rem = urem i64 %b, %a |
| ret i64 %rem |
| } |