1
2#define IN_FRAMEWORK
3
4#ifdef VFP
5#define D0	0
6#define D1	8
7#define D2	16
8#define D3	24
9#define D4	32
10#define D5	40
11#define D6	48
12#define D7	56
13
14#ifdef NEON
15#define Q0      D0
16#define Q1      D2
17#define Q2      D4
18#define Q3      D6
19#endif
20
21#define S0	64
22#define S1	68
23#define S2	72
24#define S3	76
25#define S4	80
26#define S5	84
27#define S6	88
28#define S7	92
29#define S8      86
30#define S9	100
31#define S10	104
32#define S11	108
33#define S12	112
34#define S13	116
35#define S14	120
36#define S15	124
37
38#define CORE_REG_START 128
39#else
40#define CORE_REG_START 0
41#endif
42
43#define R0	CORE_REG_START
44#define R1	(R0 + 4)
45#define R2	(R1 + 4)
46#define R3	(R2 + 4)
47#define STACK	(R3 + 4)
48
49
50
51extern void abort (void);
52extern int memcmp (const void *s1, const void *s2, __SIZE_TYPE__ n);
53
54__attribute__((naked))  void dumpregs () __asm("myfunc");
55__attribute__((naked))  void dumpregs ()
56{
57  asm(
58      "mov	ip, sp\n\t"
59      "stmfd	sp!, {r0-r3}\n\t"
60#ifdef VFP
61      "fstmdbs	sp!, {s0-s15}\n\t"
62      "fstmdbd	sp!, {d0-d7}\n\t"
63#endif
64      "mov	r0, sp\n\t"
65      "stmfd	sp!, {ip, r14}\n\t"
66      "bl	testfunc\n\t"
67      "ldmfd	sp!, {r0, r14}\n\t"
68      "mov	sp, r0\n\t"
69      "bx	lr");
70}
71
72
73#define LAST_ARG(type,val,offset) { type __x = val; if (memcmp(&__x, stack+offset, sizeof(type)) != 0) abort(); }
74#define ARG(type,val,offset) LAST_ARG(type, val, offset)
75#define ANON(type,val,offset) LAST_ARG(type, val, offset)
76#define LAST_ANON(type,val,offset) LAST_ARG(type, val, offset)
77#define DOTS
78
79void testfunc(char* stack)
80{
81#include TESTFILE
82  return;
83}
84
85#undef LAST_ARG
86#undef ARG
87#undef DOTS
88#undef ANON
89#undef LAST_ANON
90#define LAST_ARG(type,val,offset) type
91#define ARG(type,val,offset) LAST_ARG(type, val, offset),
92#define DOTS ...
93#define ANON(type,val, offset)
94#define LAST_ANON(type,val, offset)
95
96#ifndef MYFUNCTYPE
97#define MYFUNCTYPE void
98#endif
99
100#ifndef PCSATTR
101#define PCSATTR
102#endif
103
104MYFUNCTYPE myfunc(
105#include TESTFILE
106) PCSATTR;
107
108#undef LAST_ARG
109#undef ARG
110#undef DOTS
111#undef ANON
112#undef LAST_ANON
113#define LAST_ARG(type,val,offset) val
114#define ARG(type,val,offset) LAST_ARG(type, val, offset),
115#define DOTS
116#define LAST_ANON(type,val,offset) LAST_ARG(type, val, offset)
117#define ANON(type,val,offset) LAST_ARG(type, val, offset),
118
119
120int main()
121{
122  myfunc(
123#include TESTFILE
124);
125  return 0;
126}
127