int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char ** lpGBKStr) { #ifdef _WIN32 int nRetLen = 0; nRetLen = WTC(lpUTF8Str,NULL,0); (* lpGBKStr) = (unsigned char *)malloc((nRetLen + 1)*sizeof(char)); if((* lpGBKStr) == NULL) return 0; nRetLen = WTC(lpUTF8Str,(* lpGBKStr),nRetLen); return nRetLen; #endif #ifdef __LINUX__ int nRetLen = strlen((char *)lpUTF8Str) + 1; * lpGBKStr = (unsigned char *)malloc(nRetLen); return u2g((char *)lpUTF8Str,strlen((char *)lpUTF8Str),(char *)*lpGBKStr,nRetLen); #endif return 0; }
FDK_INLINE /* __attribute__((noinline)) */ static void dct_IV_func2( int i, const FIXP_SPK *twiddle, FIXP_DBL *pDat_0, FIXP_DBL *pDat_1, int inc) { FIXP_DBL accu1, accu2, accu3, accu4, accuX; LONG val_tw; accu1 = pDat_1[-2]; accu2 = pDat_1[-1]; *--pDat_1 = -(pDat_0[1]>>1); *pDat_0++ = (pDat_0[0]>>1); twiddle += inc; __asm { LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc B dct_IV_loop2_2nd_part /* 42 cycles for 2 iterations = 21 cycles/iteration */ dct_IV_loop2: SMULWT accuX, accu2, val_tw SMULWB accu2, accu2, val_tw RSB accuX, accuX, #0 SMLAWB accuX, accu1, val_tw, accuX SMLAWT accu2, accu1, val_tw, accu2 STR accuX, [pDat_0], #4 STR accu2, [pDat_1, #-4] ! LDR accu4, [pDat_0, #4] LDR accu3, [pDat_0] SMULWB accuX, accu4, val_tw SMULWT accu4, accu4, val_tw RSB accuX, accuX, #0 SMLAWT accuX, accu3, val_tw, accuX SMLAWB accu4, accu3, val_tw, accu4 LDR accu1, [pDat_1, #-8] LDR accu2, [pDat_1, #-4] LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc STR accuX, [pDat_1, #-4] ! STR accu4, [pDat_0], #4 dct_IV_loop2_2nd_part: SMULWT accuX, accu2, val_tw SMULWB accu2, accu2, val_tw RSB accuX, accuX, #0 SMLAWB accuX, accu1, val_tw, accuX SMLAWT accu2, accu1, val_tw, accu2 STR accuX, [pDat_0], #4 STR accu2, [pDat_1, #-4] ! LDR accu4, [pDat_0, #4] LDR accu3, [pDat_0] SMULWB accuX, accu4, val_tw SMULWT accu4, accu4, val_tw RSB accuX, accuX, #0 SMLAWT accuX, accu3, val_tw, accuX SMLAWB accu4, accu3, val_tw, accu4 LDR accu1, [pDat_1, #-8] LDR accu2, [pDat_1, #-4] STR accuX, [pDat_1, #-4] ! STR accu4, [pDat_0], #4 LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc SUBS i, i, #1 BNE dct_IV_loop2 } /* Last Sin and Cos value pair are the same */ accu1 = fMultDiv2(accu1, WTC(0x5a82799a)); accu2 = fMultDiv2(accu2, WTC(0x5a82799a)); *--pDat_1 = accu1 + accu2; *pDat_0++ = accu1 - accu2; }
LDR accu4, [pDat_0] // accu4 = pDat_0[0] LDR accu3, [pDat_0, #4] // accu3 = pDat_0[1] RSB accu4, accu4, #0 // accu4 = -accu4 RSB accu3, accu3, #0 // accu3 = -accu3 SMULWB accu1, accu3, val_tw // accu1 = (-accu3)*val_tw.h SMULWT accu2, accu3, val_tw // accu2 = (-accu3)*val_tw.l RSB accu1, accu1, #0 // accu1 = -(-accu3)*val_tw.h SMLAWT accu3, accu4, val_tw, accu1 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h SMLAWB accu4, accu4, val_tw, accu2 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h LDR accu1, [pDat_1, #-4] // accu1 = pDat_1[-1] LDR accu2, [pDat_1] // accu2 = pDat_1[0] STR accu3, [pDat_0], #4 // *pDat_0++ = accu3 STR accu4, [pDat_1], #-4 // *pDat_1-- = accu4 SUBS i, i, #1 BNE dst_IV_loop2 } /* Last Sin and Cos value pair are the same */ accu1 = fMultDiv2(-accu1, WTC(0x5a82799a)); accu2 = fMultDiv2(-accu2, WTC(0x5a82799a)); *pDat_0 = accu1 + accu2; *pDat_1 = accu1 - accu2; } #endif /* FUNCTION_dst_IV_func2 */