| ; 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 |