diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-11-11 00:04:49 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-11-11 00:04:49 +0000 |
commit | 9ee6e8bb853bdea7ef6c645a1a07aa55fd206aba (patch) | |
tree | 1cd430d3d9ac641c8550cfd8956dbcce1a4b9121 /target-arm/op_addsub.h | |
parent | ee4e83ed8ddc8dac572a0123398adf78b63014ae (diff) |
ARMv7 support.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3572 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-arm/op_addsub.h')
-rw-r--r-- | target-arm/op_addsub.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/target-arm/op_addsub.h b/target-arm/op_addsub.h new file mode 100644 index 0000000000..d15360d807 --- /dev/null +++ b/target-arm/op_addsub.h @@ -0,0 +1,106 @@ +/* + * ARMv6 integer SIMD operations. + * + * Copyright (c) 2007 CodeSourcery. + * Written by Paul Brook + * + * This code is licenced under the GPL. + */ + +#ifdef ARITH_GE +#define DECLARE_GE uint32_t ge = 0 +#define SET_GE env->GE = ge +#else +#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) + +void OPPROTO glue(glue(op_,PFX),add16_T0_T1)(void) +{ + uint32_t res = 0; + DECLARE_GE; + + ADD16(T0, T1, 0); + ADD16(T0 >> 16, T1 >> 16, 1); + SET_GE; + T0 = res; + FORCE_RET(); +} + +void OPPROTO glue(glue(op_,PFX),add8_T0_T1)(void) +{ + uint32_t res = 0; + DECLARE_GE; + + ADD8(T0, T1, 0); + ADD8(T0 >> 8, T1 >> 8, 1); + ADD8(T0 >> 16, T1 >> 16, 2); + ADD8(T0 >> 24, T1 >> 24, 3); + SET_GE; + T0 = res; + FORCE_RET(); +} + +void OPPROTO glue(glue(op_,PFX),sub16_T0_T1)(void) +{ + uint32_t res = 0; + DECLARE_GE; + + SUB16(T0, T1, 0); + SUB16(T0 >> 16, T1 >> 16, 1); + SET_GE; + T0 = res; + FORCE_RET(); +} + +void OPPROTO glue(glue(op_,PFX),sub8_T0_T1)(void) +{ + uint32_t res = 0; + DECLARE_GE; + + SUB8(T0, T1, 0); + SUB8(T0 >> 8, T1 >> 8, 1); + SUB8(T0 >> 16, T1 >> 16, 2); + SUB8(T0 >> 24, T1 >> 24, 3); + SET_GE; + T0 = res; + FORCE_RET(); +} + +void OPPROTO glue(glue(op_,PFX),subaddx_T0_T1)(void) +{ + uint32_t res = 0; + DECLARE_GE; + + ADD16(T0, T1, 0); + SUB16(T0 >> 16, T1 >> 16, 1); + SET_GE; + T0 = res; + FORCE_RET(); +} + +void OPPROTO glue(glue(op_,PFX),addsubx_T0_T1)(void) +{ + uint32_t res = 0; + DECLARE_GE; + + SUB16(T0, T1, 0); + ADD16(T0 >> 16, T1 >> 16, 1); + SET_GE; + T0 = res; + FORCE_RET(); +} + +#undef DECLARE_GE +#undef SET_GE +#undef RESULT + +#undef ARITH_GE +#undef PFX +#undef ADD16 +#undef SUB16 +#undef ADD8 +#undef SUB8 |