179 lines
6.5 KiB
LLVM
179 lines
6.5 KiB
LLVM
; FIXME: Even under non-pic mode, llvm for ve needs to generate pic code since
|
|
; nld doesn't work with non-pic code. Thefore, we test only pic codes
|
|
; for both cases here.
|
|
; llc -filetype=obj -mtriple=ve -o - %s | llvm-objdump - -d -r \
|
|
; | FileCheck %s -check-prefix=LOCAL
|
|
; RUN: llc -filetype=obj -mtriple=ve -o - %s | llvm-objdump - -d -r \
|
|
; RUN: | FileCheck %s -check-prefix=GENDYN
|
|
; RUN: llc -filetype=obj -mtriple=ve -relocation-model=pic -o - %s \
|
|
; RUN: | llvm-objdump - -d -r | FileCheck %s -check-prefix=GENDYNPIC
|
|
|
|
@x = external thread_local global i32, align 4
|
|
@y = internal thread_local global i32 0, align 4
|
|
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define nonnull i32* @get_global() {
|
|
; GENDYN: lea %s0, (-24)
|
|
; GENDYN-NEXT: R_VE_TLS_GD_LO32 x
|
|
; GENDYN-NEXT: and %s0, %s0, (32)0
|
|
; GENDYN-NEXT: sic %s10
|
|
; GENDYN-NEXT: lea.sl %s0, (%s10, %s0)
|
|
; GENDYN-NEXT: R_VE_TLS_GD_HI32 x
|
|
; GENDYN-NEXT: lea %s12, (8)
|
|
; GENDYN-NEXT: R_VE_PLT_LO32 __tls_get_addr
|
|
; GENDYN-NEXT: and %s12, %s12, (32)0
|
|
; GENDYN-NEXT: lea.sl %s12, (%s10, %s12)
|
|
; GENDYN-NEXT: R_VE_PLT_HI32 __tls_get_addr
|
|
; GENDYN-NEXT: bsic %s10, (, %s12)
|
|
; GENDYN-NEXT: or %s11, 0, %s9
|
|
;
|
|
; GENDYNPIC: lea %s15, (-24)
|
|
; GENDYNPIC-NEXT: R_VE_PC_LO32 _GLOBAL_OFFSET_TABLE_
|
|
; GENDYNPIC-NEXT: and %s15, %s15, (32)0
|
|
; GENDYNPIC-NEXT: sic %s16
|
|
; GENDYNPIC-NEXT: lea.sl %s15, (%s16, %s15)
|
|
; GENDYNPIC-NEXT: R_VE_PC_HI32 _GLOBAL_OFFSET_TABLE_
|
|
; GENDYNPIC-NEXT: lea %s0, (-24)
|
|
; GENDYNPIC-NEXT: R_VE_TLS_GD_LO32 x
|
|
; GENDYNPIC-NEXT: and %s0, %s0, (32)0
|
|
; GENDYNPIC-NEXT: sic %s10
|
|
; GENDYNPIC-NEXT: lea.sl %s0, (%s10, %s0)
|
|
; GENDYNPIC-NEXT: R_VE_TLS_GD_HI32 x
|
|
; GENDYNPIC-NEXT: lea %s12, (8)
|
|
; GENDYNPIC-NEXT: R_VE_PLT_LO32 __tls_get_addr
|
|
; GENDYNPIC-NEXT: and %s12, %s12, (32)0
|
|
; GENDYNPIC-NEXT: lea.sl %s12, (%s10, %s12)
|
|
; GENDYNPIC-NEXT: R_VE_PLT_HI32 __tls_get_addr
|
|
; GENDYNPIC-NEXT: bsic %s10, (, %s12)
|
|
; GENDYNPIC-NEXT: or %s11, 0, %s9
|
|
entry:
|
|
ret i32* @x
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define nonnull i32* @get_local() {
|
|
; GENDYN: lea %s0, (-24)
|
|
; GENDYN-NEXT: R_VE_TLS_GD_LO32 y
|
|
; GENDYN-NEXT: and %s0, %s0, (32)0
|
|
; GENDYN-NEXT: sic %s10
|
|
; GENDYN-NEXT: lea.sl %s0, (%s10, %s0)
|
|
; GENDYN-NEXT: R_VE_TLS_GD_HI32 y
|
|
; GENDYN-NEXT: lea %s12, (8)
|
|
; GENDYN-NEXT: R_VE_PLT_LO32 __tls_get_addr
|
|
; GENDYN-NEXT: and %s12, %s12, (32)0
|
|
; GENDYN-NEXT: lea.sl %s12, (%s10, %s12)
|
|
; GENDYN-NEXT: R_VE_PLT_HI32 __tls_get_addr
|
|
; GENDYN-NEXT: bsic %s10, (, %s12)
|
|
; GENDYN-NEXT: or %s11, 0, %s9
|
|
;
|
|
; GENDYNPIC: lea %s15, (-24)
|
|
; GENDYNPIC-NEXT: R_VE_PC_LO32 _GLOBAL_OFFSET_TABLE_
|
|
; GENDYNPIC-NEXT: and %s15, %s15, (32)0
|
|
; GENDYNPIC-NEXT: sic %s16
|
|
; GENDYNPIC-NEXT: lea.sl %s15, (%s16, %s15)
|
|
; GENDYNPIC-NEXT: R_VE_PC_HI32 _GLOBAL_OFFSET_TABLE_
|
|
; GENDYNPIC-NEXT: lea %s0, (-24)
|
|
; GENDYNPIC-NEXT: R_VE_TLS_GD_LO32 y
|
|
; GENDYNPIC-NEXT: and %s0, %s0, (32)0
|
|
; GENDYNPIC-NEXT: sic %s10
|
|
; GENDYNPIC-NEXT: lea.sl %s0, (%s10, %s0)
|
|
; GENDYNPIC-NEXT: R_VE_TLS_GD_HI32 y
|
|
; GENDYNPIC-NEXT: lea %s12, (8)
|
|
; GENDYNPIC-NEXT: R_VE_PLT_LO32 __tls_get_addr
|
|
; GENDYNPIC-NEXT: and %s12, %s12, (32)0
|
|
; GENDYNPIC-NEXT: lea.sl %s12, (%s10, %s12)
|
|
; GENDYNPIC-NEXT: R_VE_PLT_HI32 __tls_get_addr
|
|
; GENDYNPIC-NEXT: bsic %s10, (, %s12)
|
|
; GENDYNPIC-NEXT: or %s11, 0, %s9
|
|
entry:
|
|
ret i32* @y
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind
|
|
define void @set_global(i32 %v) {
|
|
; GENDYN: lea %s0, (-24)
|
|
; GENDYN-NEXT: R_VE_TLS_GD_LO32 x
|
|
; GENDYN-NEXT: and %s0, %s0, (32)0
|
|
; GENDYN-NEXT: sic %s10
|
|
; GENDYN-NEXT: lea.sl %s0, (%s10, %s0)
|
|
; GENDYN-NEXT: R_VE_TLS_GD_HI32 x
|
|
; GENDYN-NEXT: lea %s12, (8)
|
|
; GENDYN-NEXT: R_VE_PLT_LO32 __tls_get_addr
|
|
; GENDYN-NEXT: and %s12, %s12, (32)0
|
|
; GENDYN-NEXT: lea.sl %s12, (%s10, %s12)
|
|
; GENDYN-NEXT: R_VE_PLT_HI32 __tls_get_addr
|
|
; GENDYN-NEXT: bsic %s10, (, %s12)
|
|
; GENDYN-NEXT: stl %s18, (, %s0)
|
|
; GENDYN-NEXT: ld %s18, 288(, %s11)
|
|
; GENDYN-NEXT: or %s11, 0, %s9
|
|
;
|
|
; GENDYNPIC: lea %s15, (-24)
|
|
; GENDYNPIC-NEXT: R_VE_PC_LO32 _GLOBAL_OFFSET_TABLE_
|
|
; GENDYNPIC-NEXT: and %s15, %s15, (32)0
|
|
; GENDYNPIC-NEXT: sic %s16
|
|
; GENDYNPIC-NEXT: lea.sl %s15, (%s16, %s15)
|
|
; GENDYNPIC-NEXT: R_VE_PC_HI32 _GLOBAL_OFFSET_TABLE_
|
|
; GENDYNPIC-NEXT: lea %s0, (-24)
|
|
; GENDYNPIC-NEXT: R_VE_TLS_GD_LO32 x
|
|
; GENDYNPIC-NEXT: and %s0, %s0, (32)0
|
|
; GENDYNPIC-NEXT: sic %s10
|
|
; GENDYNPIC-NEXT: lea.sl %s0, (%s10, %s0)
|
|
; GENDYNPIC-NEXT: R_VE_TLS_GD_HI32 x
|
|
; GENDYNPIC-NEXT: lea %s12, (8)
|
|
; GENDYNPIC-NEXT: R_VE_PLT_LO32 __tls_get_addr
|
|
; GENDYNPIC-NEXT: and %s12, %s12, (32)0
|
|
; GENDYNPIC-NEXT: lea.sl %s12, (%s10, %s12)
|
|
; GENDYNPIC-NEXT: R_VE_PLT_HI32 __tls_get_addr
|
|
; GENDYNPIC-NEXT: bsic %s10, (, %s12)
|
|
; GENDYNPIC-NEXT: stl %s18, (, %s0)
|
|
; GENDYNPIC-NEXT: ld %s18, 288(, %s11)
|
|
; GENDYNPIC-NEXT: or %s11, 0, %s9
|
|
entry:
|
|
store i32 %v, i32* @x, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind
|
|
define void @set_local(i32 %v) {
|
|
; GENDYN: lea %s0, (-24)
|
|
; GENDYN-NEXT: R_VE_TLS_GD_LO32 y
|
|
; GENDYN-NEXT: and %s0, %s0, (32)0
|
|
; GENDYN-NEXT: sic %s10
|
|
; GENDYN-NEXT: lea.sl %s0, (%s10, %s0)
|
|
; GENDYN-NEXT: R_VE_TLS_GD_HI32 y
|
|
; GENDYN-NEXT: lea %s12, (8)
|
|
; GENDYN-NEXT: R_VE_PLT_LO32 __tls_get_addr
|
|
; GENDYN-NEXT: and %s12, %s12, (32)0
|
|
; GENDYN-NEXT: lea.sl %s12, (%s10, %s12)
|
|
; GENDYN-NEXT: R_VE_PLT_HI32 __tls_get_addr
|
|
; GENDYN-NEXT: bsic %s10, (, %s12)
|
|
; GENDYN-NEXT: stl %s18, (, %s0)
|
|
; GENDYN-NEXT: ld %s18, 288(, %s11)
|
|
; GENDYN-NEXT: or %s11, 0, %s9
|
|
;
|
|
; GENDYNPIC: lea %s15, (-24)
|
|
; GENDYNPIC-NEXT: R_VE_PC_LO32 _GLOBAL_OFFSET_TABLE_
|
|
; GENDYNPIC-NEXT: and %s15, %s15, (32)0
|
|
; GENDYNPIC-NEXT: sic %s16
|
|
; GENDYNPIC-NEXT: lea.sl %s15, (%s16, %s15)
|
|
; GENDYNPIC-NEXT: R_VE_PC_HI32 _GLOBAL_OFFSET_TABLE_
|
|
; GENDYNPIC-NEXT: lea %s0, (-24)
|
|
; GENDYNPIC-NEXT: R_VE_TLS_GD_LO32 y
|
|
; GENDYNPIC-NEXT: and %s0, %s0, (32)0
|
|
; GENDYNPIC-NEXT: sic %s10
|
|
; GENDYNPIC-NEXT: lea.sl %s0, (%s10, %s0)
|
|
; GENDYNPIC-NEXT: R_VE_TLS_GD_HI32 y
|
|
; GENDYNPIC-NEXT: lea %s12, (8)
|
|
; GENDYNPIC-NEXT: R_VE_PLT_LO32 __tls_get_addr
|
|
; GENDYNPIC-NEXT: and %s12, %s12, (32)0
|
|
; GENDYNPIC-NEXT: lea.sl %s12, (%s10, %s12)
|
|
; GENDYNPIC-NEXT: R_VE_PLT_HI32 __tls_get_addr
|
|
; GENDYNPIC-NEXT: bsic %s10, (, %s12)
|
|
; GENDYNPIC-NEXT: stl %s18, (, %s0)
|
|
; GENDYNPIC-NEXT: ld %s18, 288(, %s11)
|
|
; GENDYNPIC-NEXT: or %s11, 0, %s9
|
|
entry:
|
|
store i32 %v, i32* @y, align 4
|
|
ret void
|
|
}
|