; 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: lui $1, %hi(memset) ; ON32: addiu $25, $1, %lo(memset) ; 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: lui $2, %highest(memset) ; ON64: daddiu $1, $2, %higher(memset) ; ON64: dsll $1, $1, 16 ; ON64: daddiu $1, $1, %hi(memset) ; ON64: dsll $1, $1, 16 ; ON64: daddiu $25, $1, %lo(memset) ; 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 }