aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/X86/absolute-symbol-kernel-code-model.ll
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