
helper.c includes some small TCG helper functions used for mostly arithmetic instructions. These are TCG only and there's no need for them to be in the large and unwieldy helper.c. Move them out to their own source file in the tcg/ subdirectory, together with the op_addsub.h multiply-included template header that they use. Since we are moving op_addsub.h, we take the opportunity to give it a name which matches our convention for files which are not true header files but which are #included from other C files: op_addsub.c.inc. (Ironically, this means that helper.c no longer contains any TCG helper function definitions at all.) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20250110131211.2546314-1-peter.maydell@linaro.org Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
104 lines
1.8 KiB
C++
104 lines
1.8 KiB
C++
/*
|
|
* ARMv6 integer SIMD operations.
|
|
*
|
|
* Copyright (c) 2007 CodeSourcery.
|
|
* Written by Paul Brook
|
|
*
|
|
* This code is licensed under the GPL.
|
|
*/
|
|
|
|
#ifdef ARITH_GE
|
|
#define GE_ARG , void *gep
|
|
#define DECLARE_GE uint32_t ge = 0
|
|
#define SET_GE *(uint32_t *)gep = ge
|
|
#else
|
|
#define GE_ARG
|
|
#define DECLARE_GE do{}while(0)
|
|
#define SET_GE do{}while(0)
|
|
#endif
|
|
|
|
#define RESULT(val, n, width) \
|
|
res |= ((uint32_t)(glue(glue(uint,width),_t))(val)) << (n * width)
|
|
|
|
uint32_t HELPER(glue(PFX,add16))(uint32_t a, uint32_t b GE_ARG)
|
|
{
|
|
uint32_t res = 0;
|
|
DECLARE_GE;
|
|
|
|
ADD16(a, b, 0);
|
|
ADD16(a >> 16, b >> 16, 1);
|
|
SET_GE;
|
|
return res;
|
|
}
|
|
|
|
uint32_t HELPER(glue(PFX,add8))(uint32_t a, uint32_t b GE_ARG)
|
|
{
|
|
uint32_t res = 0;
|
|
DECLARE_GE;
|
|
|
|
ADD8(a, b, 0);
|
|
ADD8(a >> 8, b >> 8, 1);
|
|
ADD8(a >> 16, b >> 16, 2);
|
|
ADD8(a >> 24, b >> 24, 3);
|
|
SET_GE;
|
|
return res;
|
|
}
|
|
|
|
uint32_t HELPER(glue(PFX,sub16))(uint32_t a, uint32_t b GE_ARG)
|
|
{
|
|
uint32_t res = 0;
|
|
DECLARE_GE;
|
|
|
|
SUB16(a, b, 0);
|
|
SUB16(a >> 16, b >> 16, 1);
|
|
SET_GE;
|
|
return res;
|
|
}
|
|
|
|
uint32_t HELPER(glue(PFX,sub8))(uint32_t a, uint32_t b GE_ARG)
|
|
{
|
|
uint32_t res = 0;
|
|
DECLARE_GE;
|
|
|
|
SUB8(a, b, 0);
|
|
SUB8(a >> 8, b >> 8, 1);
|
|
SUB8(a >> 16, b >> 16, 2);
|
|
SUB8(a >> 24, b >> 24, 3);
|
|
SET_GE;
|
|
return res;
|
|
}
|
|
|
|
uint32_t HELPER(glue(PFX,subaddx))(uint32_t a, uint32_t b GE_ARG)
|
|
{
|
|
uint32_t res = 0;
|
|
DECLARE_GE;
|
|
|
|
ADD16(a, b >> 16, 0);
|
|
SUB16(a >> 16, b, 1);
|
|
SET_GE;
|
|
return res;
|
|
}
|
|
|
|
uint32_t HELPER(glue(PFX,addsubx))(uint32_t a, uint32_t b GE_ARG)
|
|
{
|
|
uint32_t res = 0;
|
|
DECLARE_GE;
|
|
|
|
SUB16(a, b >> 16, 0);
|
|
ADD16(a >> 16, b, 1);
|
|
SET_GE;
|
|
return res;
|
|
}
|
|
|
|
#undef GE_ARG
|
|
#undef DECLARE_GE
|
|
#undef SET_GE
|
|
#undef RESULT
|
|
|
|
#undef ARITH_GE
|
|
#undef PFX
|
|
#undef ADD16
|
|
#undef SUB16
|
|
#undef ADD8
|
|
#undef SUB8
|