#ifndef __CRUNCH_H #define __CRUNCH_H struct crunch_state { unsigned long long mvdx[16]; unsigned long mvax[4][3]; unsigned long long dspsc; }; extern inline void crunch_state_restore(struct crunch_state *cs) { unsigned long tmp; asm volatile ( "cfldr64 mvdx0, [%0]\n\t" "cfmvsc32 dspsc, mvdx0\n\t" : : "r" (&cs->dspsc) : "memory"); #ifdef __ARMEB__ asm volatile ( "cfldr32 mvfx0, [%0]\n\t" "cfmvah32 mvax0, mvfx0\n\t" "cfldr32 mvfx0, [%0, #4]\n\t" "cfmvam32 mvax0, mvfx0\n\t" "cfldr32 mvfx0, [%0, #8]\n\t" "cfmval32 mvax0, mvfx0\n\t" "cfldr32 mvfx0, [%0, #12]\n\t" "cfmvah32 mvax1, mvfx0\n\t" "cfldr32 mvfx0, [%0, #16]\n\t" "cfmvam32 mvax1, mvfx0\n\t" "cfldr32 mvfx0, [%0, #20]\n\t" "cfmval32 mvax1, mvfx0\n\t" "cfldr32 mvfx0, [%0, #24]\n\t" "cfmvah32 mvax2, mvfx0\n\t" "cfldr32 mvfx0, [%0, #28]\n\t" "cfmvam32 mvax2, mvfx0\n\t" "cfldr32 mvfx0, [%0, #32]\n\t" "cfmval32 mvax2, mvfx0\n\t" "cfldr32 mvfx0, [%0, #36]\n\t" "cfmvah32 mvax3, mvfx0\n\t" "cfldr32 mvfx0, [%0, #40]\n\t" "cfmvam32 mvax3, mvfx0\n\t" "cfldr32 mvfx0, [%0, #44]\n\t" "cfmval32 mvax3, mvfx0\n\t" : : "r" (&cs->mvax) : "memory"); #else asm volatile ( "cfldr32 mvfx0, [%0]\n\t" "cfmval32 mvax0, mvfx0\n\t" "cfldr32 mvfx0, [%0, #4]\n\t" "cfmvam32 mvax0, mvfx0\n\t" "cfldr32 mvfx0, [%0, #8]\n\t" "cfmvah32 mvax0, mvfx0\n\t" "cfldr32 mvfx0, [%0, #12]\n\t" "cfmval32 mvax1, mvfx0\n\t" "cfldr32 mvfx0, [%0, #16]\n\t" "cfmvam32 mvax1, mvfx0\n\t" "cfldr32 mvfx0, [%0, #20]\n\t" "cfmvah32 mvax1, mvfx0\n\t" "cfldr32 mvfx0, [%0, #24]\n\t" "cfmval32 mvax2, mvfx0\n\t" "cfldr32 mvfx0, [%0, #28]\n\t" "cfmvam32 mvax2, mvfx0\n\t" "cfldr32 mvfx0, [%0, #32]\n\t" "cfmvah32 mvax2, mvfx0\n\t" "cfldr32 mvfx0, [%0, #36]\n\t" "cfmval32 mvax3, mvfx0\n\t" "cfldr32 mvfx0, [%0, #40]\n\t" "cfmvam32 mvax3, mvfx0\n\t" "cfldr32 mvfx0, [%0, #44]\n\t" "cfmvah32 mvax3, mvfx0\n\t" : : "r" (&cs->mvax) : "memory"); #endif asm volatile ( "cfldr64 mvdx0, [%0]\n\t" "cfldr64 mvdx1, [%0, #8]\n\t" "cfldr64 mvdx2, [%0, #16]\n\t" "cfldr64 mvdx3, [%0, #24]\n\t" "cfldr64 mvdx4, [%0, #32]\n\t" "cfldr64 mvdx5, [%0, #40]\n\t" "cfldr64 mvdx6, [%0, #48]\n\t" "cfldr64 mvdx7, [%0, #56]\n\t" "cfldr64 mvdx8, [%0, #64]\n\t" "cfldr64 mvdx9, [%0, #72]\n\t" "cfldr64 mvdx10, [%0, #80]\n\t" "cfldr64 mvdx11, [%0, #88]\n\t" "cfldr64 mvdx12, [%0, #96]\n\t" "cfldr64 mvdx13, [%0, #104]\n\t" "cfldr64 mvdx14, [%0, #112]\n\t" "cfldr64 mvdx15, [%0, #120]\n\t" : "=&r" (tmp) : "0" (&cs->mvdx) : "memory"); } extern inline void crunch_state_save(struct crunch_state *cs) { asm volatile ( "cfstr64 mvdx0, [%0]\n\t" "cfstr64 mvdx1, [%0, #8]\n\t" "cfstr64 mvdx2, [%0, #16]\n\t" "cfstr64 mvdx3, [%0, #24]\n\t" "cfstr64 mvdx4, [%0, #32]\n\t" "cfstr64 mvdx5, [%0, #40]\n\t" "cfstr64 mvdx6, [%0, #48]\n\t" "cfstr64 mvdx7, [%0, #56]\n\t" "cfstr64 mvdx8, [%0, #64]\n\t" "cfstr64 mvdx9, [%0, #72]\n\t" "cfstr64 mvdx10, [%0, #80]\n\t" "cfstr64 mvdx11, [%0, #88]\n\t" "cfstr64 mvdx12, [%0, #96]\n\t" "cfstr64 mvdx13, [%0, #104]\n\t" "cfstr64 mvdx14, [%0, #112]\n\t" "cfstr64 mvdx15, [%0, #120]\n\t" : : "r" (&cs->mvdx) : "memory"); #ifdef __ARMEB__ asm volatile ( "cfmv32ah mvfx0, mvax0\n\t" "cfstr32 mvfx0, [%0]\n\t" "cfmv32am mvfx0, mvax0\n\t" "cfstr32 mvfx0, [%0, #4]\n\t" "cfmv32al mvfx0, mvax0\n\t" "cfstr32 mvfx0, [%0, #8]\n\t" "cfmv32ah mvfx0, mvax1\n\t" "cfstr32 mvfx0, [%0, #12]\n\t" "cfmv32am mvfx0, mvax1\n\t" "cfstr32 mvfx0, [%0, #16]\n\t" "cfmv32al mvfx0, mvax1\n\t" "cfstr32 mvfx0, [%0, #20]\n\t" "cfmv32ah mvfx0, mvax2\n\t" "cfstr32 mvfx0, [%0, #24]\n\t" "cfmv32am mvfx0, mvax2\n\t" "cfstr32 mvfx0, [%0, #28]\n\t" "cfmv32al mvfx0, mvax2\n\t" "cfstr32 mvfx0, [%0, #32]\n\t" "cfmv32ah mvfx0, mvax3\n\t" "cfstr32 mvfx0, [%0, #36]\n\t" "cfmv32am mvfx0, mvax3\n\t" "cfstr32 mvfx0, [%0, #40]\n\t" "cfmv32al mvfx0, mvax3\n\t" "cfstr32 mvfx0, [%0, #44]\n\t" : : "r" (&cs->mvax) : "memory"); #else asm volatile ( "cfmv32al mvfx0, mvax0\n\t" "cfstr32 mvfx0, [%0]\n\t" "cfmv32am mvfx0, mvax0\n\t" "cfstr32 mvfx0, [%0, #4]\n\t" "cfmv32ah mvfx0, mvax0\n\t" "cfstr32 mvfx0, [%0, #8]\n\t" "cfmv32al mvfx0, mvax1\n\t" "cfstr32 mvfx0, [%0, #12]\n\t" "cfmv32am mvfx0, mvax1\n\t" "cfstr32 mvfx0, [%0, #16]\n\t" "cfmv32ah mvfx0, mvax1\n\t" "cfstr32 mvfx0, [%0, #20]\n\t" "cfmv32al mvfx0, mvax2\n\t" "cfstr32 mvfx0, [%0, #24]\n\t" "cfmv32am mvfx0, mvax2\n\t" "cfstr32 mvfx0, [%0, #28]\n\t" "cfmv32ah mvfx0, mvax2\n\t" "cfstr32 mvfx0, [%0, #32]\n\t" "cfmv32al mvfx0, mvax3\n\t" "cfstr32 mvfx0, [%0, #36]\n\t" "cfmv32am mvfx0, mvax3\n\t" "cfstr32 mvfx0, [%0, #40]\n\t" "cfmv32ah mvfx0, mvax3\n\t" "cfstr32 mvfx0, [%0, #44]\n\t" : : "r" (&cs->mvax) : "memory"); #endif asm volatile ( "cfmv32sc mvdx0, dspsc\n\t" "cfstr64 mvdx0, [%0]\n\t" : : "r" (&cs->dspsc) : "memory"); /* Restore corrupted register zero. */ asm volatile ( "cfldr64 mvdx0, [%0]\n\t" : : "r" (&cs->mvdx) : "memory"); } extern inline void crunch_state_zero(void) { asm volatile ( "cfmv64lr mvdx0, %1\n\t" "cfmvsc32 dspsc, mvdx0\n\t" "cfmv64lr mvdx0, %0\n\t" "cfmv64lr mvdx1, %0\n\t" "cfmv64lr mvdx2, %0\n\t" "cfmv64lr mvdx3, %0\n\t" "cfmv64lr mvdx4, %0\n\t" "cfmv64lr mvdx5, %0\n\t" "cfmv64lr mvdx6, %0\n\t" "cfmv64lr mvdx7, %0\n\t" "cfmv64lr mvdx8, %0\n\t" "cfmv64lr mvdx9, %0\n\t" "cfmv64lr mvdx10, %0\n\t" "cfmv64lr mvdx11, %0\n\t" "cfmv64lr mvdx12, %0\n\t" "cfmv64lr mvdx13, %0\n\t" "cfmv64lr mvdx14, %0\n\t" "cfmv64lr mvdx15, %0\n\t" "cfmva32 mvax0, mvfx0\n\t" "cfmva32 mvax1, mvfx0\n\t" "cfmva32 mvax2, mvfx0\n\t" "cfmva32 mvax3, mvfx0\n\t" : : "r" (0), "r" (0x00900000) : "memory"); } #endif