xref: /openbmc/qemu/target/arm/op_addsub.h (revision d1e8e8ecc3d2a1a72504912d671f1cbbac1b06e5)
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