blob: 7b768c81b75b57592c91b75cce219484dda1f264 [file] [edit]
; 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
}