1 #ifndef CALL_APSR_H
2 #define CALL_APSR_H
3
4 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
5
6 union cpsr {
7 struct {
8 uint32_t filler : 28;
9 uint32_t v : 1;
10 uint32_t c : 1;
11 uint32_t z : 1;
12 uint32_t n : 1;
13 } flags;
14 uint32_t value;
15 };
16
17 #else
18
19 union cpsr {
20 struct {
21 uint32_t n : 1;
22 uint32_t z : 1;
23 uint32_t c : 1;
24 uint32_t v : 1;
25 uint32_t filler : 28;
26 } flags;
27 uint32_t value;
28 };
29
30 #endif
31
call_apsr_f(float a,float b,void (* fn)(float,float))32 __attribute__((noinline, pcs("aapcs"))) static uint32_t call_apsr_f(float a, float b,
33 __attribute__((pcs("aapcs"))) void (*fn)(float, float)) {
34 uint32_t result;
35 fn(a, b);
36 asm volatile("mrs %0, apsr"
37 : "=r"(result));
38 return result;
39 }
40
call_apsr_d(double a,double b,void (* fn)(double,double))41 __attribute__((noinline, pcs("aapcs"))) static uint32_t call_apsr_d(double a, double b,
42 __attribute__((pcs("aapcs"))) void (*fn)(double, double)) {
43 uint32_t result;
44 fn(a, b);
45 asm volatile("mrs %0, apsr"
46 : "=r"(result));
47 return result;
48 }
49
50 #endif // CALL_APSR_H
51