diff options
author | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-07 18:19:26 +0000 |
---|---|---|
committer | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-07 18:19:26 +0000 |
commit | a9d9eb8fd45279fa8455afa03331296dbe2871ff (patch) | |
tree | d32a32eac9b264f949eb0ea84e1ca6cb7c8f30db /target-ppc/op_mem.h | |
parent | b33c17e12d1af68a5733094f33578847379ed892 (diff) |
Implement PowerPC Altivec load & stores, used by Apple firmware for memcpy.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3349 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-ppc/op_mem.h')
-rw-r--r-- | target-ppc/op_mem.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/target-ppc/op_mem.h b/target-ppc/op_mem.h index ea1b4a3472..ca48f5de0a 100644 --- a/target-ppc/op_mem.h +++ b/target-ppc/op_mem.h @@ -1054,6 +1054,66 @@ void OPPROTO glue(op_POWER2_stfq_le, MEMSUFFIX) (void) RETURN(); } +/* Altivec vector extension */ +#if defined(WORDS_BIGENDIAN) +#define VR_DWORD0 0 +#define VR_DWORD1 1 +#else +#define VR_DWORD0 1 +#define VR_DWORD1 0 +#endif +void OPPROTO glue(op_vr_lvx, MEMSUFFIX) (void) +{ + AVR0.u64[VR_DWORD0] = glue(ldq, MEMSUFFIX)((uint32_t)T0); + AVR0.u64[VR_DWORD1] = glue(ldq, MEMSUFFIX)((uint32_t)T0 + 8); +} + +void OPPROTO glue(op_vr_lvx_le, MEMSUFFIX) (void) +{ + AVR0.u64[VR_DWORD1] = glue(ldq, MEMSUFFIX)((uint32_t)T0); + AVR0.u64[VR_DWORD0] = glue(ldq, MEMSUFFIX)((uint32_t)T0 + 8); +} + +void OPPROTO glue(op_vr_stvx, MEMSUFFIX) (void) +{ + glue(stq, MEMSUFFIX)((uint32_t)T0, AVR0.u64[VR_DWORD0]); + glue(stq, MEMSUFFIX)((uint32_t)T0 + 8, AVR0.u64[VR_DWORD1]); +} + +void OPPROTO glue(op_vr_stvx_le, MEMSUFFIX) (void) +{ + glue(stq, MEMSUFFIX)((uint32_t)T0, AVR0.u64[VR_DWORD1]); + glue(stq, MEMSUFFIX)((uint32_t)T0 + 8, AVR0.u64[VR_DWORD0]); +} + +#if defined(TARGET_PPC64) +void OPPROTO glue(op_vr_lvx_64, MEMSUFFIX) (void) +{ + AVR0.u64[VR_DWORD0] = glue(ldq, MEMSUFFIX)((uint64_t)T0); + AVR0.u64[VR_DWORD1] = glue(ldq, MEMSUFFIX)((uint64_t)T0 + 8); +} + +void OPPROTO glue(op_vr_lvx_le_64, MEMSUFFIX) (void) +{ + AVR0.u64[VR_DWORD1] = glue(ldq, MEMSUFFIX)((uint64_t)T0); + AVR0.u64[VR_DWORD0] = glue(ldq, MEMSUFFIX)((uint64_t)T0 + 8); +} + +void OPPROTO glue(op_vr_stvx_64, MEMSUFFIX) (void) +{ + glue(stq, MEMSUFFIX)((uint64_t)T0, AVR0.u64[VR_DWORD0]); + glue(stq, MEMSUFFIX)((uint64_t)T0 + 8, AVR0.u64[VR_DWORD1]); +} + +void OPPROTO glue(op_vr_stvx_le_64, MEMSUFFIX) (void) +{ + glue(stq, MEMSUFFIX)((uint64_t)T0, AVR0.u64[VR_DWORD1]); + glue(stq, MEMSUFFIX)((uint64_t)T0 + 8, AVR0.u64[VR_DWORD0]); +} +#endif +#undef VR_DWORD0 +#undef VR_DWORD1 + #if defined(TARGET_PPCEMB) /* SPE extension */ #define _PPC_SPE_LD_OP(name, op) \ |