summaryrefslogtreecommitdiff
path: root/test/MC/ARM/eh-directive-vsave.s
blob: c9b78d7e276b0eccb85864b4cb6d27dba0116651 (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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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: }