summaryrefslogtreecommitdiff
path: root/lib/builtins/i386
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2014-07-26 21:08:34 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2014-07-26 21:08:34 +0000
commitbf1fef452aaec78b9164d3cc17305a71e0d1ab30 (patch)
treef98f634daabfde50c473348bb8751ca7c1277092 /lib/builtins/i386
parent23499533959d58ce28562958bf873b264060d539 (diff)
builtins: correct constant alignments
MMX/SSE instructions expect 128-bit alignment (16-byte) for constants that they reference. Correct the alignment on the constant values. Although it is quite possible for the data to end up aligned, there is no guarantee that this will occur unless it is explicitly aligned to the desired location. If the data ends up being unaligned, the resultant binary would fault at runtime due to the unaligned access. As an example, the follow would fault previously: cc -c lib/builtins/x86_64/floatundidf.S -o floatundidf.o cc -c test/builtins/Unit/floatundidf_test.c -o floatundidf_test.c ld -m elf_x86_64 floatundidf.o floatundidf_test.o -lc -o floatundidf However, if the object files were reversed, the data would end up aligned and the problem would go unnoticed. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@214033 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/builtins/i386')
-rw-r--r--lib/builtins/i386/floatdidf.S11
-rw-r--r--lib/builtins/i386/floatundidf.S14
-rw-r--r--lib/builtins/i386/floatundisf.S19
-rw-r--r--lib/builtins/i386/floatundixf.S14
4 files changed, 41 insertions, 17 deletions
diff --git a/lib/builtins/i386/floatdidf.S b/lib/builtins/i386/floatdidf.S
index 5c45ee9e6..c4626eda5 100644
--- a/lib/builtins/i386/floatdidf.S
+++ b/lib/builtins/i386/floatdidf.S
@@ -10,9 +10,14 @@
#ifndef __ELF__
.const
#endif
-.balign 4
-twop52: .quad 0x4330000000000000
-twop32: .quad 0x41f0000000000000
+
+ .balign 16
+twop52:
+ .quad 0x4330000000000000
+
+ .balign 16
+twop32:
+ .quad 0x41f0000000000000
#define REL_ADDR(_a) (_a)-0b(%eax)
diff --git a/lib/builtins/i386/floatundidf.S b/lib/builtins/i386/floatundidf.S
index b00627848..982c0fee6 100644
--- a/lib/builtins/i386/floatundidf.S
+++ b/lib/builtins/i386/floatundidf.S
@@ -20,11 +20,17 @@
#ifndef __ELF__
.const
#endif
-.balign 4
-twop52: .quad 0x4330000000000000
+ .balign 16
+twop52:
+ .quad 0x4330000000000000
+
+ .balign 16
twop84_plus_twop52:
- .quad 0x4530000000100000
-twop84: .quad 0x4530000000000000
+ .quad 0x4530000000100000
+
+ .balign 16
+twop84:
+ .quad 0x4530000000000000
#define REL_ADDR(_a) (_a)-0b(%eax)
diff --git a/lib/builtins/i386/floatundisf.S b/lib/builtins/i386/floatundisf.S
index 898462743..47f4346d7 100644
--- a/lib/builtins/i386/floatundisf.S
+++ b/lib/builtins/i386/floatundisf.S
@@ -55,12 +55,19 @@ END_COMPILERRT_FUNCTION(__floatundisf)
#ifndef __ELF__
.const
#endif
-.balign 8
-twop52: .quad 0x4330000000000000
- .quad 0x0000000000000fff
-sticky: .quad 0x0000000000000000
- .long 0x00000012
-twelve: .long 0x00000000
+ .balign 16
+twop52:
+ .quad 0x4330000000000000
+ .quad 0x0000000000000fff
+
+ .balign 16
+sticky:
+ .quad 0x0000000000000000
+ .long 0x00000012
+
+ .balign 16
+twelve:
+ .long 0x00000000
#define TWOp52 twop52-0b(%ecx)
#define STICKY sticky-0b(%ecx,%eax,8)
diff --git a/lib/builtins/i386/floatundixf.S b/lib/builtins/i386/floatundixf.S
index 9d2f31faa..a3533115e 100644
--- a/lib/builtins/i386/floatundixf.S
+++ b/lib/builtins/i386/floatundixf.S
@@ -10,11 +10,17 @@
#ifndef __ELF__
.const
#endif
-.balign 4
-twop52: .quad 0x4330000000000000
+ .balign 16
+twop52:
+ .quad 0x4330000000000000
+
+ .balign 16
twop84_plus_twop52_neg:
- .quad 0xc530000000100000
-twop84: .quad 0x4530000000000000
+ .quad 0xc530000000100000
+
+ .balign 16
+twop84:
+ .quad 0x4530000000000000
#define REL_ADDR(_a) (_a)-0b(%eax)