| ; 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 |
| } |