| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips3 -target-abi=n64 -O2 < %s | FileCheck %s --check-prefixes=CHECK,MIPS3 | |
| ; RUN: llc -mtriple=mips64el -mcpu=mips3 -target-abi=n64 -O2 < %s | FileCheck %s --check-prefixes=CHECK,MIPS3 | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64 -target-abi=n64 -O2 < %s | FileCheck %s --check-prefixes=CHECK,MIPS64 | |
| ; RUN: llc -mtriple=mips64el -mcpu=mips64 -target-abi=n64 -O2 < %s | FileCheck %s --check-prefixes=CHECK,MIPS64 | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64r2 -target-abi=n64 -O2 < %s | FileCheck %s --check-prefixes=CHECK,R2-N64 | |
| ; RUN: llc -mtriple=mips64el -mcpu=mips64r2 -target-abi=n64 -O2 < %s | FileCheck %s --check-prefixes=CHECK,R2-N64 | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64r2 -target-abi=n32 -O2 < %s | FileCheck %s --check-prefixes=CHECK,R2-N32 | |
| ; RUN: llc -mtriple=mips64el -mcpu=mips64r2 -target-abi=n32 -O2 < %s | FileCheck %s --check-prefixes=CHECK,R2-N32 | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64r6 -target-abi=n64 -O2 < %s | FileCheck %s --check-prefixes=CHECK,R6-N64 | |
| ; RUN: llc -mtriple=mips64el -mcpu=mips64r6 -target-abi=n64 -O2 < %s | FileCheck %s --check-prefixes=CHECK,R6-N64 | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64r6 -target-abi=n32 -O2 < %s | FileCheck %s --check-prefixes=CHECK,R6-N32 | |
| ; RUN: llc -mtriple=mips64el -mcpu=mips64r6 -target-abi=n32 -O2 < %s | FileCheck %s --check-prefixes=CHECK,R6-N32 | |
| define i64 @trunc_sext(i64 %x) { | |
| ; CHECK-LABEL: trunc_sext: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $4, 0 | |
| %t = trunc i64 %x to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @trunc_zext(i64 %x) { | |
| ; MIPS3-LABEL: trunc_zext: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS3-NEXT: dsll $1, $1, 32 | |
| ; MIPS3-NEXT: daddiu $1, $1, -1 | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: and $2, $4, $1 | |
| ; | |
| ; MIPS64-LABEL: trunc_zext: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS64-NEXT: dsll $1, $1, 32 | |
| ; MIPS64-NEXT: daddiu $1, $1, -1 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: and $2, $4, $1 | |
| ; | |
| ; R2-N64-LABEL: trunc_zext: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: dext $2, $4, 0, 32 | |
| ; | |
| ; R2-N32-LABEL: trunc_zext: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: dext $2, $4, 0, 32 | |
| ; | |
| ; R6-N64-LABEL: trunc_zext: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: dext $2, $4, 0, 32 | |
| ; | |
| ; R6-N32-LABEL: trunc_zext: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: dext $2, $4, 0, 32 | |
| %t = trunc i64 %x to i32 | |
| %r = zext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @abi_sext(i32 signext %x) { | |
| ; CHECK-LABEL: abi_sext: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: move $2, $4 | |
| %r = sext i32 %x to i64 | |
| ret i64 %r | |
| } | |
| define i64 @abi_zext(i32 signext %x) { | |
| ; MIPS3-LABEL: abi_zext: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS3-NEXT: dsll $1, $1, 32 | |
| ; MIPS3-NEXT: daddiu $1, $1, -1 | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: and $2, $4, $1 | |
| ; | |
| ; MIPS64-LABEL: abi_zext: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS64-NEXT: dsll $1, $1, 32 | |
| ; MIPS64-NEXT: daddiu $1, $1, -1 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: and $2, $4, $1 | |
| ; | |
| ; R2-N64-LABEL: abi_zext: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: dext $2, $4, 0, 32 | |
| ; | |
| ; R2-N32-LABEL: abi_zext: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: dext $2, $4, 0, 32 | |
| ; | |
| ; R6-N64-LABEL: abi_zext: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: dext $2, $4, 0, 32 | |
| ; | |
| ; R6-N32-LABEL: abi_zext: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: dext $2, $4, 0, 32 | |
| %r = zext i32 %x to i64 | |
| ret i64 %r | |
| } | |
| define i64 @clearword(i32 signext %x) { | |
| ; CHECK-LABEL: clearword: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lui $1, 61455 | |
| ; CHECK-NEXT: ori $1, $1, 65535 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: and $2, $4, $1 | |
| %t = and i32 %x, -267386881 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @clear_positive(i32 signext %x) { | |
| ; CHECK-LABEL: clear_positive: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lui $1, 28687 | |
| ; CHECK-NEXT: ori $1, $1, 65535 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: and $2, $4, $1 | |
| %t = and i32 %x, 1880096767 | |
| %r = zext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @pick(i64 %a, i64 %b, i32 signext %c) { | |
| ; MIPS3-LABEL: pick: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: sltu $1, $zero, $6 | |
| ; MIPS3-NEXT: bnez $1, .LBB6_2 | |
| ; MIPS3-NEXT: move $2, $4 | |
| ; MIPS3-NEXT: # %bb.1: | |
| ; MIPS3-NEXT: move $2, $5 | |
| ; MIPS3-NEXT: .LBB6_2: | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: nop | |
| ; | |
| ; MIPS64-LABEL: pick: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: move $2, $5 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: movn $2, $4, $6 | |
| ; | |
| ; R2-N64-LABEL: pick: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: move $2, $5 | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: movn $2, $4, $6 | |
| ; | |
| ; R2-N32-LABEL: pick: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: move $2, $5 | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: movn $2, $4, $6 | |
| ; | |
| ; R6-N64-LABEL: pick: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: seleqz $1, $5, $6 | |
| ; R6-N64-NEXT: selnez $2, $4, $6 | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: or $2, $2, $1 | |
| ; | |
| ; R6-N32-LABEL: pick: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: seleqz $1, $5, $6 | |
| ; R6-N32-NEXT: selnez $2, $4, $6 | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: or $2, $2, $1 | |
| %p = icmp ne i32 %c, 0 | |
| %r = select i1 %p, i64 %a, i64 %b | |
| ret i64 %r | |
| } | |
| define i64 @zext31(i64 %x) { | |
| ; MIPS3-LABEL: zext31: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: lui $1, 32767 | |
| ; MIPS3-NEXT: ori $1, $1, 65535 | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: and $2, $4, $1 | |
| ; | |
| ; MIPS64-LABEL: zext31: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: lui $1, 32767 | |
| ; MIPS64-NEXT: ori $1, $1, 65535 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: and $2, $4, $1 | |
| ; | |
| ; R2-N64-LABEL: zext31: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: dext $2, $4, 0, 31 | |
| ; | |
| ; R2-N32-LABEL: zext31: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: dext $2, $4, 0, 31 | |
| ; | |
| ; R6-N64-LABEL: zext31: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: dext $2, $4, 0, 31 | |
| ; | |
| ; R6-N32-LABEL: zext31: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: dext $2, $4, 0, 31 | |
| %t = and i64 %x, 2147483647 | |
| %v = trunc i64 %t to i32 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } | |
| define i64 @zext32(i64 %x) { | |
| ; CHECK-LABEL: zext32: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $4, 0 | |
| %t = and i64 %x, 4294967295 | |
| %v = trunc i64 %t to i32 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } | |
| define i64 @sum_sext(i64 %x, i64 %y) { | |
| ; CHECK-LABEL: sum_sext: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: daddu $1, $4, $5 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $1, 0 | |
| %s = add i64 %x, %y | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @sum_zext(i64 %x, i64 %y) { | |
| ; MIPS3-LABEL: sum_zext: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: daddu $1, $4, $5 | |
| ; MIPS3-NEXT: daddiu $2, $zero, 1 | |
| ; MIPS3-NEXT: dsll $2, $2, 32 | |
| ; MIPS3-NEXT: daddiu $2, $2, -1 | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: and $2, $1, $2 | |
| ; | |
| ; MIPS64-LABEL: sum_zext: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: daddu $1, $4, $5 | |
| ; MIPS64-NEXT: daddiu $2, $zero, 1 | |
| ; MIPS64-NEXT: dsll $2, $2, 32 | |
| ; MIPS64-NEXT: daddiu $2, $2, -1 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: and $2, $1, $2 | |
| ; | |
| ; R2-N64-LABEL: sum_zext: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: daddu $1, $4, $5 | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: dext $2, $1, 0, 32 | |
| ; | |
| ; R2-N32-LABEL: sum_zext: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: daddu $1, $4, $5 | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: dext $2, $1, 0, 32 | |
| ; | |
| ; R6-N64-LABEL: sum_zext: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: daddu $1, $4, $5 | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: dext $2, $1, 0, 32 | |
| ; | |
| ; R6-N32-LABEL: sum_zext: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: daddu $1, $4, $5 | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: dext $2, $1, 0, 32 | |
| %s = add i64 %x, %y | |
| %t = trunc i64 %s to i32 | |
| %r = zext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @load_sext(ptr %p) { | |
| ; MIPS3-LABEL: load_sext: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: lw $2, 0($4) | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: nop | |
| ; | |
| ; MIPS64-LABEL: load_sext: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: lw $2, 0($4) | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: nop | |
| ; | |
| ; R2-N64-LABEL: load_sext: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: lw $2, 0($4) | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: nop | |
| ; | |
| ; R2-N32-LABEL: load_sext: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: sll $1, $4, 0 | |
| ; R2-N32-NEXT: lw $2, 0($1) | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: nop | |
| ; | |
| ; R6-N64-LABEL: load_sext: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: lw $2, 0($4) | |
| ; R6-N64-NEXT: jrc $ra | |
| ; | |
| ; R6-N32-LABEL: load_sext: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: sll $1, $4, 0 | |
| ; R6-N32-NEXT: lw $2, 0($1) | |
| ; R6-N32-NEXT: jrc $ra | |
| %t = load i32, ptr %p, align 4 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @load_zext(ptr %p) { | |
| ; MIPS3-LABEL: load_zext: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: lwu $2, 0($4) | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: nop | |
| ; | |
| ; MIPS64-LABEL: load_zext: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: lwu $2, 0($4) | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: nop | |
| ; | |
| ; R2-N64-LABEL: load_zext: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: lwu $2, 0($4) | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: nop | |
| ; | |
| ; R2-N32-LABEL: load_zext: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: sll $1, $4, 0 | |
| ; R2-N32-NEXT: lwu $2, 0($1) | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: nop | |
| ; | |
| ; R6-N64-LABEL: load_zext: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: lwu $2, 0($4) | |
| ; R6-N64-NEXT: jrc $ra | |
| ; | |
| ; R6-N32-LABEL: load_zext: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: sll $1, $4, 0 | |
| ; R6-N32-NEXT: lwu $2, 0($1) | |
| ; R6-N32-NEXT: jrc $ra | |
| %t = load i32, ptr %p, align 4 | |
| %r = zext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @phi_sext(i32 signext %a, i32 signext %b, i32 signext %c) { | |
| ; MIPS3-LABEL: phi_sext: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: beqz $6, .LBB13_2 | |
| ; MIPS3-NEXT: nop | |
| ; MIPS3-NEXT: # %bb.1: # %end | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: sll $2, $4, 0 | |
| ; MIPS3-NEXT: .LBB13_2: # %no | |
| ; MIPS3-NEXT: move $4, $5 | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: sll $2, $4, 0 | |
| ; | |
| ; MIPS64-LABEL: phi_sext: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: beqz $6, .LBB13_2 | |
| ; MIPS64-NEXT: nop | |
| ; MIPS64-NEXT: # %bb.1: # %end | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: sll $2, $4, 0 | |
| ; MIPS64-NEXT: .LBB13_2: # %no | |
| ; MIPS64-NEXT: move $4, $5 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: sll $2, $4, 0 | |
| ; | |
| ; R2-N64-LABEL: phi_sext: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: beqz $6, .LBB13_2 | |
| ; R2-N64-NEXT: nop | |
| ; R2-N64-NEXT: # %bb.1: # %end | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: sll $2, $4, 0 | |
| ; R2-N64-NEXT: .LBB13_2: # %no | |
| ; R2-N64-NEXT: move $4, $5 | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: sll $2, $4, 0 | |
| ; | |
| ; R2-N32-LABEL: phi_sext: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: beqz $6, .LBB13_2 | |
| ; R2-N32-NEXT: nop | |
| ; R2-N32-NEXT: # %bb.1: # %end | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: sll $2, $4, 0 | |
| ; R2-N32-NEXT: .LBB13_2: # %no | |
| ; R2-N32-NEXT: move $4, $5 | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: sll $2, $4, 0 | |
| ; | |
| ; R6-N64-LABEL: phi_sext: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: beqzc $6, .LBB13_2 | |
| ; R6-N64-NEXT: nop | |
| ; R6-N64-NEXT: # %bb.1: # %end | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: sll $2, $4, 0 | |
| ; R6-N64-NEXT: .LBB13_2: # %no | |
| ; R6-N64-NEXT: move $4, $5 | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: sll $2, $4, 0 | |
| ; | |
| ; R6-N32-LABEL: phi_sext: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: beqzc $6, .LBB13_2 | |
| ; R6-N32-NEXT: nop | |
| ; R6-N32-NEXT: # %bb.1: # %end | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: sll $2, $4, 0 | |
| ; R6-N32-NEXT: .LBB13_2: # %no | |
| ; R6-N32-NEXT: move $4, $5 | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: sll $2, $4, 0 | |
| %p = icmp ne i32 %c, 0 | |
| br i1 %p, label %yes, label %no | |
| yes: | |
| br label %end | |
| no: | |
| br label %end | |
| end: | |
| %t = phi i32 [ %a, %yes ], [ %b, %no ] | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @phi_trunc(i64 %a, i64 %b, i32 signext %c) { | |
| ; MIPS3-LABEL: phi_trunc: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: beqz $6, .LBB14_2 | |
| ; MIPS3-NEXT: nop | |
| ; MIPS3-NEXT: # %bb.1: # %end | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: sll $2, $4, 0 | |
| ; MIPS3-NEXT: .LBB14_2: # %no | |
| ; MIPS3-NEXT: move $4, $5 | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: sll $2, $4, 0 | |
| ; | |
| ; MIPS64-LABEL: phi_trunc: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: beqz $6, .LBB14_2 | |
| ; MIPS64-NEXT: nop | |
| ; MIPS64-NEXT: # %bb.1: # %end | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: sll $2, $4, 0 | |
| ; MIPS64-NEXT: .LBB14_2: # %no | |
| ; MIPS64-NEXT: move $4, $5 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: sll $2, $4, 0 | |
| ; | |
| ; R2-N64-LABEL: phi_trunc: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: beqz $6, .LBB14_2 | |
| ; R2-N64-NEXT: nop | |
| ; R2-N64-NEXT: # %bb.1: # %end | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: sll $2, $4, 0 | |
| ; R2-N64-NEXT: .LBB14_2: # %no | |
| ; R2-N64-NEXT: move $4, $5 | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: sll $2, $4, 0 | |
| ; | |
| ; R2-N32-LABEL: phi_trunc: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: beqz $6, .LBB14_2 | |
| ; R2-N32-NEXT: nop | |
| ; R2-N32-NEXT: # %bb.1: # %end | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: sll $2, $4, 0 | |
| ; R2-N32-NEXT: .LBB14_2: # %no | |
| ; R2-N32-NEXT: move $4, $5 | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: sll $2, $4, 0 | |
| ; | |
| ; R6-N64-LABEL: phi_trunc: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: beqzc $6, .LBB14_2 | |
| ; R6-N64-NEXT: nop | |
| ; R6-N64-NEXT: # %bb.1: # %end | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: sll $2, $4, 0 | |
| ; R6-N64-NEXT: .LBB14_2: # %no | |
| ; R6-N64-NEXT: move $4, $5 | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: sll $2, $4, 0 | |
| ; | |
| ; R6-N32-LABEL: phi_trunc: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: beqzc $6, .LBB14_2 | |
| ; R6-N32-NEXT: nop | |
| ; R6-N32-NEXT: # %bb.1: # %end | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: sll $2, $4, 0 | |
| ; R6-N32-NEXT: .LBB14_2: # %no | |
| ; R6-N32-NEXT: move $4, $5 | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: sll $2, $4, 0 | |
| %p = icmp ne i32 %c, 0 | |
| br i1 %p, label %yes, label %no | |
| yes: | |
| br label %end | |
| no: | |
| br label %end | |
| end: | |
| %t = phi i64 [ %a, %yes ], [ %b, %no ] | |
| %v = trunc i64 %t to i32 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } | |
| define i64 @lshr31(i64 %x) { | |
| ; CHECK-LABEL: lshr31: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: dsrl $1, $4, 31 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $1, 0 | |
| %s = lshr i64 %x, 31 | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @ashr31(i64 %x) { | |
| ; CHECK-LABEL: ashr31: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: dsrl $1, $4, 31 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $1, 0 | |
| %s = ashr i64 %x, 31 | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @lshr32(i64 %x) { | |
| ; CHECK-LABEL: lshr32: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: dsra $2, $4, 32 | |
| %s = lshr i64 %x, 32 | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @ashr32(i64 %x) { | |
| ; CHECK-LABEL: ashr32: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: dsra $2, $4, 32 | |
| %s = ashr i64 %x, 32 | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @lshr33(i64 %x) { | |
| ; CHECK-LABEL: lshr33: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: dsrl $2, $4, 33 | |
| %s = lshr i64 %x, 33 | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @ashr33(i64 %x) { | |
| ; CHECK-LABEL: ashr33: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: dsra $2, $4, 33 | |
| %s = ashr i64 %x, 33 | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @lshr63(i64 %x) { | |
| ; CHECK-LABEL: lshr63: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: dsrl $2, $4, 63 | |
| %s = lshr i64 %x, 63 | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @ashr63(i64 %x) { | |
| ; CHECK-LABEL: ashr63: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: dsra $2, $4, 63 | |
| %s = ashr i64 %x, 63 | |
| %t = trunc i64 %s to i32 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @multiuse(i64 %x) { | |
| ; CHECK-LABEL: multiuse: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: dsra $1, $4, 32 | |
| ; CHECK-NEXT: dsrl $2, $4, 32 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: xor $2, $2, $1 | |
| %s = lshr i64 %x, 32 | |
| %t = trunc i64 %s to i32 | |
| %e = sext i32 %t to i64 | |
| %r = xor i64 %s, %e | |
| ret i64 %r | |
| } | |
| define i64 @zext_call(i64 %x) { | |
| ; MIPS3-LABEL: zext_call: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: daddiu $sp, $sp, -16 | |
| ; MIPS3-NEXT: .cfi_def_cfa_offset 16 | |
| ; MIPS3-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; MIPS3-NEXT: .cfi_offset 31, -8 | |
| ; MIPS3-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS3-NEXT: dsll $1, $1, 32 | |
| ; MIPS3-NEXT: daddiu $1, $1, -1 | |
| ; MIPS3-NEXT: jal zeroext_argument | |
| ; MIPS3-NEXT: and $4, $4, $1 | |
| ; MIPS3-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; MIPS64-LABEL: zext_call: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: daddiu $sp, $sp, -16 | |
| ; MIPS64-NEXT: .cfi_def_cfa_offset 16 | |
| ; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; MIPS64-NEXT: .cfi_offset 31, -8 | |
| ; MIPS64-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS64-NEXT: dsll $1, $1, 32 | |
| ; MIPS64-NEXT: daddiu $1, $1, -1 | |
| ; MIPS64-NEXT: jal zeroext_argument | |
| ; MIPS64-NEXT: and $4, $4, $1 | |
| ; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R2-N64-LABEL: zext_call: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: daddiu $sp, $sp, -16 | |
| ; R2-N64-NEXT: .cfi_def_cfa_offset 16 | |
| ; R2-N64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R2-N64-NEXT: .cfi_offset 31, -8 | |
| ; R2-N64-NEXT: jal zeroext_argument | |
| ; R2-N64-NEXT: dext $4, $4, 0, 32 | |
| ; R2-N64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R2-N32-LABEL: zext_call: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: addiu $sp, $sp, -16 | |
| ; R2-N32-NEXT: .cfi_def_cfa_offset 16 | |
| ; R2-N32-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R2-N32-NEXT: .cfi_offset 31, -8 | |
| ; R2-N32-NEXT: jal zeroext_argument | |
| ; R2-N32-NEXT: dext $4, $4, 0, 32 | |
| ; R2-N32-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: addiu $sp, $sp, 16 | |
| ; | |
| ; R6-N64-LABEL: zext_call: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: daddiu $sp, $sp, -16 | |
| ; R6-N64-NEXT: .cfi_def_cfa_offset 16 | |
| ; R6-N64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R6-N64-NEXT: .cfi_offset 31, -8 | |
| ; R6-N64-NEXT: jal zeroext_argument | |
| ; R6-N64-NEXT: dext $4, $4, 0, 32 | |
| ; R6-N64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R6-N32-LABEL: zext_call: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: addiu $sp, $sp, -16 | |
| ; R6-N32-NEXT: .cfi_def_cfa_offset 16 | |
| ; R6-N32-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R6-N32-NEXT: .cfi_offset 31, -8 | |
| ; R6-N32-NEXT: jal zeroext_argument | |
| ; R6-N32-NEXT: dext $4, $4, 0, 32 | |
| ; R6-N32-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: addiu $sp, $sp, 16 | |
| %t = trunc i64 %x to i32 | |
| %r = call i64 @zeroext_argument(i32 zeroext %t) | |
| ret i64 %r | |
| } | |
| define i64 @clear_or(i32 signext %x) { | |
| ; CHECK-LABEL: clear_or: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lui $1, 32768 | |
| ; CHECK-NEXT: ori $1, $1, 32 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: or $2, $4, $1 | |
| %t = or i32 %x, -2147483616 | |
| %r = sext i32 %t to i64 | |
| ret i64 %r | |
| } | |
| define i64 @clear_raw(i64 %x) { | |
| ; CHECK-LABEL: clear_raw: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lui $1, 61455 | |
| ; CHECK-NEXT: ori $1, $1, 65535 | |
| ; CHECK-NEXT: sll $2, $4, 0 | |
| ; CHECK-NEXT: and $1, $2, $1 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $1, 0 | |
| %t = trunc i64 %x to i32 | |
| %v = and i32 %t, -267386881 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } | |
| define i64 @or_raw(i64 %x) { | |
| ; CHECK-LABEL: or_raw: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: sll $1, $4, 0 | |
| ; CHECK-NEXT: ori $1, $1, 32 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $1, 0 | |
| %t = trunc i64 %x to i32 | |
| %v = or i32 %t, 32 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } | |
| define i64 @pick_eq(i64 %a, i64 %b, i32 signext %c) { | |
| ; MIPS3-LABEL: pick_eq: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: sltiu $1, $6, 1 | |
| ; MIPS3-NEXT: bnez $1, .LBB28_2 | |
| ; MIPS3-NEXT: move $2, $4 | |
| ; MIPS3-NEXT: # %bb.1: | |
| ; MIPS3-NEXT: move $2, $5 | |
| ; MIPS3-NEXT: .LBB28_2: | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: nop | |
| ; | |
| ; MIPS64-LABEL: pick_eq: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: move $2, $5 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: movz $2, $4, $6 | |
| ; | |
| ; R2-N64-LABEL: pick_eq: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: move $2, $5 | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: movz $2, $4, $6 | |
| ; | |
| ; R2-N32-LABEL: pick_eq: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: move $2, $5 | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: movz $2, $4, $6 | |
| ; | |
| ; R6-N64-LABEL: pick_eq: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: selnez $1, $5, $6 | |
| ; R6-N64-NEXT: seleqz $2, $4, $6 | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: or $2, $2, $1 | |
| ; | |
| ; R6-N32-LABEL: pick_eq: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: selnez $1, $5, $6 | |
| ; R6-N32-NEXT: seleqz $2, $4, $6 | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: or $2, $2, $1 | |
| %p = icmp eq i32 %c, 0 | |
| %r = select i1 %p, i64 %a, i64 %b | |
| ret i64 %r | |
| } | |
| define i64 @pick_dirty(i64 %a, i64 %b, i64 %c) { | |
| ; MIPS3-LABEL: pick_dirty: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: sll $1, $6, 0 | |
| ; MIPS3-NEXT: sltu $1, $zero, $1 | |
| ; MIPS3-NEXT: bnez $1, .LBB29_2 | |
| ; MIPS3-NEXT: move $2, $4 | |
| ; MIPS3-NEXT: # %bb.1: | |
| ; MIPS3-NEXT: move $2, $5 | |
| ; MIPS3-NEXT: .LBB29_2: | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: nop | |
| ; | |
| ; MIPS64-LABEL: pick_dirty: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: move $2, $5 | |
| ; MIPS64-NEXT: sll $1, $6, 0 | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: movn $2, $4, $1 | |
| ; | |
| ; R2-N64-LABEL: pick_dirty: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: move $2, $5 | |
| ; R2-N64-NEXT: sll $1, $6, 0 | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: movn $2, $4, $1 | |
| ; | |
| ; R2-N32-LABEL: pick_dirty: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: move $2, $5 | |
| ; R2-N32-NEXT: sll $1, $6, 0 | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: movn $2, $4, $1 | |
| ; | |
| ; R6-N64-LABEL: pick_dirty: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: sll $1, $6, 0 | |
| ; R6-N64-NEXT: sll $1, $1, 0 | |
| ; R6-N64-NEXT: seleqz $2, $5, $1 | |
| ; R6-N64-NEXT: selnez $1, $4, $1 | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: or $2, $1, $2 | |
| ; | |
| ; R6-N32-LABEL: pick_dirty: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: sll $1, $6, 0 | |
| ; R6-N32-NEXT: sll $1, $1, 0 | |
| ; R6-N32-NEXT: seleqz $2, $5, $1 | |
| ; R6-N32-NEXT: selnez $1, $4, $1 | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: or $2, $1, $2 | |
| %t = trunc i64 %c to i32 | |
| %p = icmp ne i32 %t, 0 | |
| %r = select i1 %p, i64 %a, i64 %b | |
| ret i64 %r | |
| } | |
| define i64 @zeroext_clear_call(i64 %x) { | |
| ; MIPS3-LABEL: zeroext_clear_call: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: daddiu $sp, $sp, -16 | |
| ; MIPS3-NEXT: .cfi_def_cfa_offset 16 | |
| ; MIPS3-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; MIPS3-NEXT: .cfi_offset 31, -8 | |
| ; MIPS3-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS3-NEXT: dsll $1, $1, 32 | |
| ; MIPS3-NEXT: daddiu $1, $1, -1 | |
| ; MIPS3-NEXT: jal zeroext_clear | |
| ; MIPS3-NEXT: and $4, $4, $1 | |
| ; MIPS3-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; MIPS64-LABEL: zeroext_clear_call: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: daddiu $sp, $sp, -16 | |
| ; MIPS64-NEXT: .cfi_def_cfa_offset 16 | |
| ; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; MIPS64-NEXT: .cfi_offset 31, -8 | |
| ; MIPS64-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS64-NEXT: dsll $1, $1, 32 | |
| ; MIPS64-NEXT: daddiu $1, $1, -1 | |
| ; MIPS64-NEXT: jal zeroext_clear | |
| ; MIPS64-NEXT: and $4, $4, $1 | |
| ; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R2-N64-LABEL: zeroext_clear_call: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: daddiu $sp, $sp, -16 | |
| ; R2-N64-NEXT: .cfi_def_cfa_offset 16 | |
| ; R2-N64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R2-N64-NEXT: .cfi_offset 31, -8 | |
| ; R2-N64-NEXT: jal zeroext_clear | |
| ; R2-N64-NEXT: dext $4, $4, 0, 32 | |
| ; R2-N64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R2-N32-LABEL: zeroext_clear_call: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: addiu $sp, $sp, -16 | |
| ; R2-N32-NEXT: .cfi_def_cfa_offset 16 | |
| ; R2-N32-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R2-N32-NEXT: .cfi_offset 31, -8 | |
| ; R2-N32-NEXT: jal zeroext_clear | |
| ; R2-N32-NEXT: dext $4, $4, 0, 32 | |
| ; R2-N32-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: addiu $sp, $sp, 16 | |
| ; | |
| ; R6-N64-LABEL: zeroext_clear_call: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: daddiu $sp, $sp, -16 | |
| ; R6-N64-NEXT: .cfi_def_cfa_offset 16 | |
| ; R6-N64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R6-N64-NEXT: .cfi_offset 31, -8 | |
| ; R6-N64-NEXT: jal zeroext_clear | |
| ; R6-N64-NEXT: dext $4, $4, 0, 32 | |
| ; R6-N64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R6-N32-LABEL: zeroext_clear_call: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: addiu $sp, $sp, -16 | |
| ; R6-N32-NEXT: .cfi_def_cfa_offset 16 | |
| ; R6-N32-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R6-N32-NEXT: .cfi_offset 31, -8 | |
| ; R6-N32-NEXT: jal zeroext_clear | |
| ; R6-N32-NEXT: dext $4, $4, 0, 32 | |
| ; R6-N32-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: addiu $sp, $sp, 16 | |
| %t = trunc i64 %x to i32 | |
| %r = call i64 @zeroext_clear(i32 zeroext %t) | |
| ret i64 %r | |
| } | |
| define i64 @zeroext_or_call(i64 %x) { | |
| ; MIPS3-LABEL: zeroext_or_call: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: daddiu $sp, $sp, -16 | |
| ; MIPS3-NEXT: .cfi_def_cfa_offset 16 | |
| ; MIPS3-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; MIPS3-NEXT: .cfi_offset 31, -8 | |
| ; MIPS3-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS3-NEXT: dsll $1, $1, 32 | |
| ; MIPS3-NEXT: daddiu $1, $1, -1 | |
| ; MIPS3-NEXT: jal zeroext_or | |
| ; MIPS3-NEXT: and $4, $4, $1 | |
| ; MIPS3-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; MIPS64-LABEL: zeroext_or_call: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: daddiu $sp, $sp, -16 | |
| ; MIPS64-NEXT: .cfi_def_cfa_offset 16 | |
| ; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; MIPS64-NEXT: .cfi_offset 31, -8 | |
| ; MIPS64-NEXT: daddiu $1, $zero, 1 | |
| ; MIPS64-NEXT: dsll $1, $1, 32 | |
| ; MIPS64-NEXT: daddiu $1, $1, -1 | |
| ; MIPS64-NEXT: jal zeroext_or | |
| ; MIPS64-NEXT: and $4, $4, $1 | |
| ; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R2-N64-LABEL: zeroext_or_call: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: daddiu $sp, $sp, -16 | |
| ; R2-N64-NEXT: .cfi_def_cfa_offset 16 | |
| ; R2-N64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R2-N64-NEXT: .cfi_offset 31, -8 | |
| ; R2-N64-NEXT: jal zeroext_or | |
| ; R2-N64-NEXT: dext $4, $4, 0, 32 | |
| ; R2-N64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R2-N32-LABEL: zeroext_or_call: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: addiu $sp, $sp, -16 | |
| ; R2-N32-NEXT: .cfi_def_cfa_offset 16 | |
| ; R2-N32-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R2-N32-NEXT: .cfi_offset 31, -8 | |
| ; R2-N32-NEXT: jal zeroext_or | |
| ; R2-N32-NEXT: dext $4, $4, 0, 32 | |
| ; R2-N32-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: addiu $sp, $sp, 16 | |
| ; | |
| ; R6-N64-LABEL: zeroext_or_call: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: daddiu $sp, $sp, -16 | |
| ; R6-N64-NEXT: .cfi_def_cfa_offset 16 | |
| ; R6-N64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R6-N64-NEXT: .cfi_offset 31, -8 | |
| ; R6-N64-NEXT: jal zeroext_or | |
| ; R6-N64-NEXT: dext $4, $4, 0, 32 | |
| ; R6-N64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: daddiu $sp, $sp, 16 | |
| ; | |
| ; R6-N32-LABEL: zeroext_or_call: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: addiu $sp, $sp, -16 | |
| ; R6-N32-NEXT: .cfi_def_cfa_offset 16 | |
| ; R6-N32-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill | |
| ; R6-N32-NEXT: .cfi_offset 31, -8 | |
| ; R6-N32-NEXT: jal zeroext_or | |
| ; R6-N32-NEXT: dext $4, $4, 0, 32 | |
| ; R6-N32-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: addiu $sp, $sp, 16 | |
| %t = trunc i64 %x to i32 | |
| %r = call i64 @zeroext_or(i32 zeroext %t) | |
| ret i64 %r | |
| } | |
| define i64 @zeroext_argument(i32 zeroext %x) noinline { | |
| ; CHECK-LABEL: zeroext_argument: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $4, 0 | |
| %r = sext i32 %x to i64 | |
| ret i64 %r | |
| } | |
| define i64 @zeroext_clear(i32 zeroext %x) noinline { | |
| ; CHECK-LABEL: zeroext_clear: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lui $1, 61455 | |
| ; CHECK-NEXT: ori $1, $1, 65535 | |
| ; CHECK-NEXT: sll $2, $4, 0 | |
| ; CHECK-NEXT: and $1, $2, $1 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $1, 0 | |
| %v = and i32 %x, -267386881 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } | |
| define i64 @zeroext_or(i32 zeroext %x) noinline { | |
| ; CHECK-LABEL: zeroext_or: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: sll $1, $4, 0 | |
| ; CHECK-NEXT: ori $1, $1, 32 | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $1, 0 | |
| %v = or i32 %x, 32 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } | |
| ; Arbitrary i64 inputs need normalization for i32 ABI returns. | |
| define signext i32 @trunc_return(i64 %x) { | |
| ; CHECK-LABEL: trunc_return: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: jr $ra | |
| ; CHECK-NEXT: sll $2, $4, 0 | |
| %r = trunc i64 %x to i32 | |
| ret i32 %r | |
| } | |
| ; Keep AND/OR and constants shared between the store and sext. | |
| define i64 @multiuse_and(i32 signext %x, ptr %p) { | |
| ; MIPS3-LABEL: multiuse_and: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: lui $1, 61455 | |
| ; MIPS3-NEXT: ori $1, $1, 65535 | |
| ; MIPS3-NEXT: and $1, $4, $1 | |
| ; MIPS3-NEXT: sw $1, 0($5) | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: sll $2, $1, 0 | |
| ; | |
| ; MIPS64-LABEL: multiuse_and: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: lui $1, 61455 | |
| ; MIPS64-NEXT: ori $1, $1, 65535 | |
| ; MIPS64-NEXT: and $1, $4, $1 | |
| ; MIPS64-NEXT: sw $1, 0($5) | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: sll $2, $1, 0 | |
| ; | |
| ; R2-N64-LABEL: multiuse_and: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: lui $1, 61455 | |
| ; R2-N64-NEXT: ori $1, $1, 65535 | |
| ; R2-N64-NEXT: and $1, $4, $1 | |
| ; R2-N64-NEXT: sw $1, 0($5) | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: sll $2, $1, 0 | |
| ; | |
| ; R2-N32-LABEL: multiuse_and: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: lui $1, 61455 | |
| ; R2-N32-NEXT: ori $1, $1, 65535 | |
| ; R2-N32-NEXT: and $1, $4, $1 | |
| ; R2-N32-NEXT: sll $2, $5, 0 | |
| ; R2-N32-NEXT: sw $1, 0($2) | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: sll $2, $1, 0 | |
| ; | |
| ; R6-N64-LABEL: multiuse_and: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: lui $1, 61455 | |
| ; R6-N64-NEXT: ori $1, $1, 65535 | |
| ; R6-N64-NEXT: and $1, $4, $1 | |
| ; R6-N64-NEXT: sw $1, 0($5) | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: sll $2, $1, 0 | |
| ; | |
| ; R6-N32-LABEL: multiuse_and: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: lui $1, 61455 | |
| ; R6-N32-NEXT: ori $1, $1, 65535 | |
| ; R6-N32-NEXT: and $1, $4, $1 | |
| ; R6-N32-NEXT: sll $2, $5, 0 | |
| ; R6-N32-NEXT: sw $1, 0($2) | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: sll $2, $1, 0 | |
| %v = and i32 %x, -267386881 | |
| store i32 %v, ptr %p, align 4 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } | |
| define i64 @multiuse_or(i32 signext %x, ptr %p) { | |
| ; MIPS3-LABEL: multiuse_or: | |
| ; MIPS3: # %bb.0: | |
| ; MIPS3-NEXT: lui $1, 32768 | |
| ; MIPS3-NEXT: ori $1, $1, 32 | |
| ; MIPS3-NEXT: or $1, $4, $1 | |
| ; MIPS3-NEXT: sw $1, 0($5) | |
| ; MIPS3-NEXT: jr $ra | |
| ; MIPS3-NEXT: sll $2, $1, 0 | |
| ; | |
| ; MIPS64-LABEL: multiuse_or: | |
| ; MIPS64: # %bb.0: | |
| ; MIPS64-NEXT: lui $1, 32768 | |
| ; MIPS64-NEXT: ori $1, $1, 32 | |
| ; MIPS64-NEXT: or $1, $4, $1 | |
| ; MIPS64-NEXT: sw $1, 0($5) | |
| ; MIPS64-NEXT: jr $ra | |
| ; MIPS64-NEXT: sll $2, $1, 0 | |
| ; | |
| ; R2-N64-LABEL: multiuse_or: | |
| ; R2-N64: # %bb.0: | |
| ; R2-N64-NEXT: lui $1, 32768 | |
| ; R2-N64-NEXT: ori $1, $1, 32 | |
| ; R2-N64-NEXT: or $1, $4, $1 | |
| ; R2-N64-NEXT: sw $1, 0($5) | |
| ; R2-N64-NEXT: jr $ra | |
| ; R2-N64-NEXT: sll $2, $1, 0 | |
| ; | |
| ; R2-N32-LABEL: multiuse_or: | |
| ; R2-N32: # %bb.0: | |
| ; R2-N32-NEXT: lui $1, 32768 | |
| ; R2-N32-NEXT: ori $1, $1, 32 | |
| ; R2-N32-NEXT: or $1, $4, $1 | |
| ; R2-N32-NEXT: sll $2, $5, 0 | |
| ; R2-N32-NEXT: sw $1, 0($2) | |
| ; R2-N32-NEXT: jr $ra | |
| ; R2-N32-NEXT: sll $2, $1, 0 | |
| ; | |
| ; R6-N64-LABEL: multiuse_or: | |
| ; R6-N64: # %bb.0: | |
| ; R6-N64-NEXT: lui $1, 32768 | |
| ; R6-N64-NEXT: ori $1, $1, 32 | |
| ; R6-N64-NEXT: or $1, $4, $1 | |
| ; R6-N64-NEXT: sw $1, 0($5) | |
| ; R6-N64-NEXT: jr $ra | |
| ; R6-N64-NEXT: sll $2, $1, 0 | |
| ; | |
| ; R6-N32-LABEL: multiuse_or: | |
| ; R6-N32: # %bb.0: | |
| ; R6-N32-NEXT: lui $1, 32768 | |
| ; R6-N32-NEXT: ori $1, $1, 32 | |
| ; R6-N32-NEXT: or $1, $4, $1 | |
| ; R6-N32-NEXT: sll $2, $5, 0 | |
| ; R6-N32-NEXT: sw $1, 0($2) | |
| ; R6-N32-NEXT: jr $ra | |
| ; R6-N32-NEXT: sll $2, $1, 0 | |
| %v = or i32 %x, -2147483616 | |
| store i32 %v, ptr %p, align 4 | |
| %r = sext i32 %v to i64 | |
| ret i64 %r | |
| } |