summaryrefslogtreecommitdiff
path: root/test/MC/ARM/eh-directive-vsave.s
diff options
context:
space:
mode:
Diffstat (limited to 'test/MC/ARM/eh-directive-vsave.s')
-rw-r--r--test/MC/ARM/eh-directive-vsave.s130
1 files changed, 130 insertions, 0 deletions
diff --git a/test/MC/ARM/eh-directive-vsave.s b/test/MC/ARM/eh-directive-vsave.s
new file mode 100644
index 0000000000..c9b78d7e27
--- /dev/null
+++ b/test/MC/ARM/eh-directive-vsave.s
@@ -0,0 +1,130 @@
+@ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \
+@ RUN: | llvm-readobj -s -sd -sr | FileCheck %s
+
+@ Check the .vsave directive
+
+@ The .vsave directive records the VFP registers which are pushed to the
+@ stack. There are two different opcodes:
+@
+@ 0xC800: pop d[(16+x+y):(16+x)] @ d[16+x+y]-d[16+x] must be consecutive
+@ 0xC900: pop d[(x+y):x] @ d[x+y]-d[x] must be consecutive
+
+
+ .syntax unified
+
+@-------------------------------------------------------------------------------
+@ TEST1
+@-------------------------------------------------------------------------------
+ .section .TEST1
+ .globl func1a
+ .align 2
+ .type func1a,%function
+ .fnstart
+func1a:
+ .vsave {d0}
+ vpush {d0}
+ vpop {d0}
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func1b
+ .align 2
+ .type func1b,%function
+ .fnstart
+func1b:
+ .vsave {d0, d1, d2, d3}
+ vpush {d0, d1, d2, d3}
+ vpop {d0, d1, d2, d3}
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func1c
+ .align 2
+ .type func1c,%function
+ .fnstart
+func1c:
+ .vsave {d0, d1, d2, d3, d4, d5, d6, d7}
+ vpush {d0, d1, d2, d3, d4, d5, d6, d7}
+ vpop {d0, d1, d2, d3, d4, d5, d6, d7}
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func1d
+ .align 2
+ .type func1d,%function
+ .fnstart
+func1d:
+ .vsave {d2, d3, d4, d5, d6, d7}
+ vpush {d2, d3, d4, d5, d6, d7}
+ vpop {d2, d3, d4, d5, d6, d7}
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+@ CHECK: Section {
+@ CHECK: Name: .ARM.extab.TEST1
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 B000C900 00000000 B003C900 |................|
+@ CHECK: 0010: 00000000 B007C900 00000000 B025C900 |.............%..|
+@ CHECK: )
+@ CHECK: }
+
+
+
+@-------------------------------------------------------------------------------
+@ TEST2
+@-------------------------------------------------------------------------------
+ .section .TEST2
+ .globl func2a
+ .align 2
+ .type func2a,%function
+ .fnstart
+func2a:
+ .vsave {d16}
+ vpush {d16}
+ vpop {d16}
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func2b
+ .align 2
+ .type func2b,%function
+ .fnstart
+func2b:
+ .vsave {d16, d17, d18, d19}
+ vpush {d16, d17, d18, d19}
+ vpop {d16, d17, d18, d19}
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func2c
+ .align 2
+ .type func2c,%function
+ .fnstart
+func2c:
+ .vsave {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}
+ vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}
+ vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+@ CHECK: Section {
+@ CHECK: Name: .ARM.extab.TEST2
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 B000C800 00000000 B003C800 |................|
+@ CHECK: 0010: 00000000 B00FC800 |........|
+@ CHECK: )
+@ CHECK: }