2013-01-24 45 views
1

現在我有一個代碼想要改進。 src數據的數據類型是字節。我想用float計算並將結果存儲到字節中。但我不知道如何轉換BYTE和浮點數據的數據類型。我在Android NDK上開發。 C++代碼我想提高如下:NEON彙編代碼,如何將BYTE轉換爲浮點數?

void DoEffect(BYTE *pSrc, float rat){ 
//image data:BGRA 
float red, green, blue; 
red = pSrc[RED_CHANNEL] * rat; 
green = pSrc[GREEN_CHANNEL] * rat; 
blue = pSrc[BLUE_CHANNEL] * rat; 

// some step to calculate the result; 
// red = ... 
// ... 
// 

pSrc[RED_CHANNEL] = (BYTE)red; 
pSrc[GREEN_CHANNEL] = (BYTE)green; 
pSrc[BLUE_CHANNEL] = (BYTE)blue; 

}

和我的霓虹燈彙編代碼:

void DoEffect_neon_asm(BYTE *pSrc, float rat){ 
__asm__ __volatile__(
     "vld4.8  {d0-d3},[%[src]] \n" 
     "vdupq.32 {d4, d5}, [%[rat]] \n" 
     "# convert src data to float?  \n" 
     "code: convert byte to float  \n" 
     "# calculate result   \n" 
     "..     \n" 
     "# convert result to byte  \n" 
     "code: convert float to byte  \n" 
     :[src]"r"(pSrc), [rat]"r"(rat) 
); 

}

我的問題是如何編寫代碼「代碼:轉換字節浮動「和」代碼:將浮點轉換爲字節「列在」霓虹燈代碼「中。

+0

您需要在兩個階段完成此操作 - 首先將字節解包爲32位整數,然後將32位整數轉換爲浮點數。請注意,使用intrinsics而不是raw inline asm會更容易。 –

回答

2

將字節轉換爲浮點數非常簡單。下面的代碼將對一個字節的寄存器執行此操作:

"vmovl.u8  q3, d2      \n\t" //Expand to 16-bit 
"vmovl.u16  q10, d6      \n\t" //Expand to 32-bit 
"vmovl.u16  q11, d7      \n\t" 
"vcvt.f32.u32 q10, q10     \n\t" //Convert to float 
"vcvt.f32.u32 q11, q11     \n\t" 

轉換回字節幾乎是完全相反的過程。改爲使用vcvt.u32.f32vmovn

此外,如果您是NEON的新手,我會建議您完整閱讀documentation。這是處理說明的好方法。

+0

感謝您的回覆。 – joyDream