xref: /llvm-project/compiler-rt/test/builtins/Unit/arm/call_apsr.h (revision 6f4f1023fafec4a470d8b7e8ea884c1953fe5291)
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