Statistics
| Branch: | Revision:

root / target-arm / op_addsub.h @ bb42e28b

History | View | Annotate | Download (1.8 kB)

1
/*
2
 * ARMv6 integer SIMD operations.
3
 *
4
 * Copyright (c) 2007 CodeSourcery.
5
 * Written by Paul Brook
6
 *
7
 * This code is licenced 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