| ; RUN: llc -march=mips -mattr=-long-calls %s -o - \ | |
| ; RUN: | FileCheck -check-prefix=OFF %s | |
| ; RUN: llc -march=mips -mattr=+long-calls,+noabicalls %s -o - \ | |
| ; RUN: | FileCheck -check-prefix=ON32 %s | |
| ; RUN: llc -march=mips -mattr=+long-calls,-noabicalls %s -o - \ | |
| ; RUN: | FileCheck -check-prefix=OFF %s | |
| ; RUN: llc -march=mips64 -target-abi n32 -mattr=-long-calls %s -o - \ | |
| ; RUN: | FileCheck -check-prefix=OFF %s | |
| ; RUN: llc -march=mips64 -target-abi n32 -mattr=+long-calls,+noabicalls %s -o - \ | |
| ; RUN: | FileCheck -check-prefix=ON32 %s | |
| ; RUN: llc -march=mips64 -target-abi n64 -mattr=-long-calls %s -o - \ | |
| ; RUN: | FileCheck -check-prefix=OFF %s | |
| ; RUN: llc -march=mips64 -target-abi n64 -mattr=+long-calls,+noabicalls %s -o - \ | |
| ; RUN: | FileCheck -check-prefix=ON64 %s | |
| declare void @callee() | |
| declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i1) | |
| @val = internal unnamed_addr global [20 x i32] zeroinitializer, align 4 | |
| define void @caller() { | |
| ; Use `jal` instruction with R_MIPS_26 relocation. | |
| ; OFF: jal callee | |
| ; OFF: jal memset | |
| ; Save the `callee` and `memset` addresses in $25 register | |
| ; and use `jalr` for the jumps. | |
| ; ON32: lui $1, %hi(callee) | |
| ; ON32: addiu $25, $1, %lo(callee) | |
| ; ON32: jalr $25 | |
| ; ON32: addiu $1, $zero, %lo(memset) | |
| ; ON32: lui $2, %hi(memset) | |
| ; ON32: addu $25, $2, $1 | |
| ; ON32: jalr $25 | |
| ; ON64: lui $1, %highest(callee) | |
| ; ON64: daddiu $1, $1, %higher(callee) | |
| ; ON64: daddiu $1, $1, %hi(callee) | |
| ; ON64: daddiu $25, $1, %lo(callee) | |
| ; ON64: jalr $25 | |
| ; ON64: daddiu $1, $zero, %higher(memset) | |
| ; ON64: lui $2, %highest(memset) | |
| ; ON64: lui $2, %hi(memset) | |
| ; ON64: daddiu $2, $zero, %lo(memset) | |
| ; ON64: daddu $25, $1, $2 | |
| ; ON64: jalr $25 | |
| call void @callee() | |
| call void @llvm.memset.p0i8.i32(i8* align 4 bitcast ([20 x i32]* @val to i8*), i8 0, i32 80, i1 false) | |
| ret void | |
| } |