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