Index: source/row_gcc.cc |
diff --git a/source/row_gcc.cc b/source/row_gcc.cc |
index 63577da10d891e5fd832e0ffce5f355724a0b5c6..0c8cf25d265770cb40d69fd83fed21902f7e91db 100644 |
--- a/source/row_gcc.cc |
+++ b/source/row_gcc.cc |
@@ -1525,11 +1525,11 @@ void RGBAToUVRow_SSSE3(const uint8* src_rgba0, int src_stride_rgba, |
// pinsrw fails with drmemory |
// __asm pinsrw xmm0, [esi], 0 /* U */ |
// __asm pinsrw xmm1, [esi + edi], 0 /* V */ |
-#define READYUV411_EBX \ |
- "movzwl " MEMACCESS([u_buf]) ",%%ebx \n" \ |
- "movd %%ebx,%%xmm0 \n" \ |
- MEMOPREG(movzwl,0x00,[u_buf],[v_buf],1,ebx) " \n" \ |
- "movd %%ebx,%%xmm1 \n" \ |
+#define READYUV411_TEMP \ |
+ "movzwl " MEMACCESS([u_buf]) ",%[temp] \n" \ |
+ "movd %[temp],%%xmm0 \n" \ |
+ MEMOPARG(movzwl,0x00,[u_buf],[v_buf],1,[temp]) " \n" \ |
+ "movd %[temp],%%xmm1 \n" \ |
"lea " MEMLEA(0x2, [u_buf]) ",%[u_buf] \n" \ |
"punpcklbw %%xmm1,%%xmm0 \n" \ |
"punpcklwd %%xmm0,%%xmm0 \n" \ |
@@ -1802,13 +1802,14 @@ void OMITFP I411ToARGBRow_SSSE3(const uint8* y_buf, |
uint8* dst_argb, |
const struct YuvConstants* yuvconstants, |
int width) { |
+ int temp = 0; |
asm volatile ( |
YUVTORGB_SETUP(yuvconstants) |
"sub %[u_buf],%[v_buf] \n" |
"pcmpeqb %%xmm5,%%xmm5 \n" |
LABELALIGN |
"1: \n" |
- READYUV411_EBX |
+ READYUV411_TEMP |
YUVTORGB(yuvconstants) |
STOREARGB |
"sub $0x8,%[width] \n" |
@@ -1817,9 +1818,10 @@ void OMITFP I411ToARGBRow_SSSE3(const uint8* y_buf, |
[u_buf]"+r"(u_buf), // %[u_buf] |
[v_buf]"+r"(v_buf), // %[v_buf] |
[dst_argb]"+r"(dst_argb), // %[dst_argb] |
+ [temp]"+r"(temp), // %[temp] |
[width]"+rm"(width) // %[width] |
: [yuvconstants]"r"(yuvconstants) // %[yuvconstants] |
- : "memory", "cc", "ebx", NACL_R14 YUVTORGB_REGS |
+ : "memory", "cc", NACL_R14 YUVTORGB_REGS |
"xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" |
); |
} |