mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-30 23:42:52 +01:00
03a3269d15
1) make sure that the first two instructions of the sequence cannot separate from each other. The linker requires that they be sequential. If they get separated, it can still work but it will not work in all cases because the first of the instructions mostly involves the hi part of the pc relative offset and that part changes slowly. You would have to be at the right boundary for this to matter. 2) make sure that this sequence begins on a longword boundary. There appears to be a bug in binutils which makes some of these calculations get messed up if the instruction sequence does not begin on a longword boundary. This is being investigated with the appropriate binutils folks. llvm-svn: 190966
60 lines
2.2 KiB
LLVM
60 lines
2.2 KiB
LLVM
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=C1
|
|
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=C2
|
|
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=PE
|
|
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s | FileCheck %s -check-prefix=ST1
|
|
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s | FileCheck %s -check-prefix=ST2
|
|
;
|
|
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=SR
|
|
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips32 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=SR32
|
|
|
|
|
|
@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", align 1
|
|
|
|
define i32 @main() nounwind {
|
|
entry:
|
|
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0))
|
|
ret i32 0
|
|
|
|
; SR: .set mips16 # @main
|
|
|
|
; SR32: .set nomips16
|
|
; SR32: .ent main
|
|
; SR-NOT: .set noreorder
|
|
; SR-NOT: .set nomacro
|
|
; SR-NOT: .set noat
|
|
; SR32: .set noreorder
|
|
; SR32: .set nomacro
|
|
; SR32: .set noat
|
|
; SR: save $ra, $s0, $s1, $s2, [[FS:[0-9]+]]
|
|
; PE: .ent main
|
|
; PE: .align 2
|
|
; PE-NEXT: li $[[T1:[0-9]+]], %hi(_gp_disp)
|
|
; PE-NEXT: addiu $[[T2:[0-9]+]], $pc, %lo(_gp_disp)
|
|
; PE: sll $[[T3:[0-9]+]], $[[T1]], 16
|
|
; C1: lw ${{[0-9]+}}, %got($.str)(${{[0-9]+}})
|
|
; C2: lw ${{[0-9]+}}, %call16(printf)(${{[0-9]+}})
|
|
; C1: addiu ${{[0-9]+}}, %lo($.str)
|
|
; C2: move $25, ${{[0-9]+}}
|
|
; C1: move $gp, ${{[0-9]+}}
|
|
; C1: jalrc ${{[0-9]+}}
|
|
; SR: restore $ra, $s0, $s1, $s2, [[FS]]
|
|
; PE: li $2, 0
|
|
; PE: jrc $ra
|
|
|
|
; ST1: li ${{[0-9]+}}, %hi($.str)
|
|
; ST1: sll ${{[0-9]+}}, ${{[0-9]+}}, 16
|
|
; ST1: addiu ${{[0-9]+}}, %lo($.str)
|
|
; ST2: li ${{[0-9]+}}, %hi($.str)
|
|
; ST2: jal printf
|
|
}
|
|
|
|
; SR-NOT: .set at
|
|
; SR-NOT: .set macro
|
|
; SR-NOT: .set reorder
|
|
; SR32: .set at
|
|
; SR32: .set macro
|
|
; SR32: .set reorder
|
|
; SR: .end main
|
|
; SR32: .end main
|
|
declare i32 @printf(i8*, ...)
|