[AArch64] MachO large code-model: Materialize FP constants in code.

In the large code model we have to first get the address of the GOT entry, load
the address of the constant, and then load the constant itself.

To avoid these loads and the GOT entry alltogether this commit changes the way
how FP constants are materialized in the large code model. The constats are now
materialized in a GPR and then bitconverted/moved into the FPR.

Reviewed by Tim Northover

Fixes rdar://problem/16572564.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223941 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Juergen Ributzka
2014-12-10 19:43:32 +00:00
parent a98fd8b640
commit 446f01b1d5
4 changed files with 65 additions and 1 deletions

View File

@@ -1,4 +1,6 @@
; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-linux-gnu | FileCheck %s
; RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs < %s | FileCheck %s
; RUN: llc -mtriple=aarch64-apple-darwin -code-model=large -verify-machineinstrs < %s | FileCheck %s --check-prefix=LARGE
; RUN: llc -mtriple=aarch64-apple-darwin -code-model=large -fast-isel -fast-isel-abort -verify-machineinstrs < %s | FileCheck %s --check-prefix=LARGE
@varf32 = global float 0.0
@varf64 = global double 0.0
@@ -34,3 +36,22 @@ define void @check_double() {
; CHECK: ret
ret void
}
; LARGE-LABEL: check_float2
; LARGE: movz [[REG:w[0-9]+]], #0x4049, lsl #16
; LARGE-NEXT: movk [[REG]], #0xfdb
; LARGE-NEXT: fmov s0, [[REG]]
define float @check_float2() {
ret float 3.14159274101257324218750
}
; LARGE-LABEL: check_double2
; LARGE: movz [[REG:x[0-9]+]], #0x4009, lsl #48
; LARGE-NEXT: movk [[REG]], #0x21fb, lsl #32
; LARGE-NEXT: movk [[REG]], #0x5444, lsl #16
; LARGE-NEXT: movk [[REG]], #0x2d18
; LARGE-NEXT: fmov d0, [[REG]]
define double @check_double2() {
ret double 3.1415926535897931159979634685441851615905761718750
}