xref: /openbmc/qemu/target/arm/op_addsub.h (revision 77424a45)
1 /*
2  * ARMv6 integer SIMD operations.
3  *
4  * Copyright (c) 2007 CodeSourcery.
5  * Written by Paul Brook
6  *
7  * This code is licensed under the GPL.
8  */
9 
10 #ifdef ARITH_GE
11 #define GE_ARG , void *gep
12 #define DECLARE_GE uint32_t ge = 0
13 #define SET_GE *(uint32_t *)gep = ge
14 #else
15 #define GE_ARG
16 #define DECLARE_GE do{}while(0)
17 #define SET_GE do{}while(0)
18 #endif
19 
20 #define RESULT(val, n, width) \
21     res |= ((uint32_t)(glue(glue(uint,width),_t))(val)) << (n * width)
22 
HELPER(glue (PFX,add16))23 uint32_t HELPER(glue(PFX,add16))(uint32_t a, uint32_t b GE_ARG)
24 {
25     uint32_t res = 0;
26     DECLARE_GE;
27 
28     ADD16(a, b, 0);
29     ADD16(a >> 16, b >> 16, 1);
30     SET_GE;
31     return res;
32 }
33 
HELPER(glue (PFX,add8))34 uint32_t HELPER(glue(PFX,add8))(uint32_t a, uint32_t b GE_ARG)
35 {
36     uint32_t res = 0;
37     DECLARE_GE;
38 
39     ADD8(a, b, 0);
40     ADD8(a >> 8, b >> 8, 1);
41     ADD8(a >> 16, b >> 16, 2);
42     ADD8(a >> 24, b >> 24, 3);
43     SET_GE;
44     return res;
45 }
46 
HELPER(glue (PFX,sub16))47 uint32_t HELPER(glue(PFX,sub16))(uint32_t a, uint32_t b GE_ARG)
48 {
49     uint32_t res = 0;
50     DECLARE_GE;
51 
52     SUB16(a, b, 0);
53     SUB16(a >> 16, b >> 16, 1);
54     SET_GE;
55     return res;
56 }
57 
HELPER(glue (PFX,sub8))58 uint32_t HELPER(glue(PFX,sub8))(uint32_t a, uint32_t b GE_ARG)
59 {
60     uint32_t res = 0;
61     DECLARE_GE;
62 
63     SUB8(a, b, 0);
64     SUB8(a >> 8, b >> 8, 1);
65     SUB8(a >> 16, b >> 16, 2);
66     SUB8(a >> 24, b >> 24, 3);
67     SET_GE;
68     return res;
69 }
70 
HELPER(glue (PFX,subaddx))71 uint32_t HELPER(glue(PFX,subaddx))(uint32_t a, uint32_t b GE_ARG)
72 {
73     uint32_t res = 0;
74     DECLARE_GE;
75 
76     ADD16(a, b >> 16, 0);
77     SUB16(a >> 16, b, 1);
78     SET_GE;
79     return res;
80 }
81 
HELPER(glue (PFX,addsubx))82 uint32_t HELPER(glue(PFX,addsubx))(uint32_t a, uint32_t b GE_ARG)
83 {
84     uint32_t res = 0;
85     DECLARE_GE;
86 
87     SUB16(a, b >> 16, 0);
88     ADD16(a >> 16, b, 1);
89     SET_GE;
90     return res;
91 }
92 
93 #undef GE_ARG
94 #undef DECLARE_GE
95 #undef SET_GE
96 #undef RESULT
97 
98 #undef ARITH_GE
99 #undef PFX
100 #undef ADD16
101 #undef SUB16
102 #undef ADD8
103 #undef SUB8
104