blob: ce7024dcc438bbdb4fabbf5c7c96e73ffc37b2b5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
; RUN: llc --code-model=kernel < %s -asm-verbose=0 | FileCheck %s
target triple = "x86_64-unknown-linux-gnu"
; CHECK-LABEL: func_no_abs_sym
define i64 @func_no_abs_sym() nounwind {
; CHECK: movq $no_abs_sym, %rax
%1 = ptrtoint ptr @no_abs_sym to i64
ret i64 %1
}
; CHECK-LABEL: func_abs_sym
define i64 @func_abs_sym() nounwind {
; CHECK: movabsq $abs_sym, %rax
%1 = ptrtoint ptr @abs_sym to i64
ret i64 %1
}
; CHECK-LABEL: func_abs_sym_in_range
define i64 @func_abs_sym_in_range() nounwind {
;; The absolute_symbol range fits in 32 bits but we still use movabs
;; since there's no benefit to using the sign extending instruction
;; with absolute symbols.
; CHECK: movabsq $abs_sym_in_range, %rax
%1 = ptrtoint ptr @abs_sym_in_range to i64
ret i64 %1
}
@no_abs_sym = external hidden global [0 x i8]
@abs_sym = external hidden global [0 x i8], !absolute_symbol !0
@abs_sym_in_range = external hidden global [0 x i8], !absolute_symbol !1
!0 = !{i64 -1, i64 -1} ;; Full range
!1 = !{i64 -2147483648, i64 2147483648} ;; In range
|