]>
Commit | Line | Data |
---|---|---|
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 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 |