3
2
[alpine-aports] [PATCH] testing/freeimage: new aport
---
testing/freeimage/0001-no-root-install.patch | 16 +
testing/freeimage/0002-fix-cpuid-x86.patch | 67 ++
...P-fix-compilation-issue-with-GCC-5.x-C-11.patch | 1172 ++++++++++++++++++++
testing/freeimage/0004-fix-gcc-6.patch | 31 +
testing/freeimage/APKBUILD | 41 +
5 files changed, 1327 insertions(+)
create mode 100644 testing/freeimage/0001-no-root-install.patch
create mode 100644 testing/freeimage/0002-fix-cpuid-x86.patch
create mode 100644 testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
create mode 100644 testing/freeimage/0004-fix-gcc-6.patch
create mode 100644 testing/freeimage/APKBUILD
diff --git a/testing/freeimage/0001-no-root-install.patch b/testing/freeimage/0001-no-root-install.patch
new file mode 100644
index 0000000..d3b062d
--- /dev/null
+++ b/testing/freeimage/0001-no-root-install.patch
@@ -0,0 +1,16 @@
+ diff -ruN a/Makefile.gnu b/Makefile.gnu
+ --- a/Makefile.gnu 2015-04-09 16:34:02.315316841 +0200
+ +++ b/Makefile.gnu 2015-04-09 16:34:28.875483201 +0200
+ @@ -71,9 +71,9 @@
+
+ install:
+ install -d $(INCDIR) $(INSTALLDIR)
+ - install -m 644 -o root -g root $(HEADER) $(INCDIR)
+ - install -m 644 -o root -g root $(STATICLIB) $(INSTALLDIR)
+ - install -m 755 -o root -g root $(SHAREDLIB) $(INSTALLDIR)
+ + install -m 644 $(HEADER) $(INCDIR)
+ + install -m 644 $(STATICLIB) $(INSTALLDIR)
+ + install -m 755 $(SHAREDLIB) $(INSTALLDIR)
+ ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(VERLIBNAME)
+ ln -sf $(VERLIBNAME) $(INSTALLDIR)/$(LIBNAME)
+ # ldconfig
diff --git a/testing/freeimage/0002-fix-cpuid-x86.patch b/testing/freeimage/0002-fix-cpuid-x86.patch
new file mode 100644
index 0000000..98b0e9c
--- /dev/null
+++ b/testing/freeimage/0002-fix-cpuid-x86.patch
@@ -0,0 +1,67 @@
+ Fix build issue caused by invalid register usage on x86
+
+ Patch taken from https://github.com/openexr/openexr/issues/128.
+
+ Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+ Index: b/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
+ ===================================================================
+ --- a/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
+ +++ b/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
+ @@ -40,21 +40,19 @@
+
+ namespace {
+ #if defined(IMF_HAVE_SSE2) && defined(__GNUC__)
+ -
+ +#include <cpuid.h>
+ // Helper functions for gcc + SSE enabled
+ - void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx)
+ + void cpuid(unsigned int n, unsigned int &eax, unsigned int &ebx,
+ + unsigned int &ecx, unsigned int &edx)
+ {
+ - __asm__ __volatile__ (
+ - "cpuid"
+ - : /* Output */ "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
+ - : /* Input */ "a"(n)
+ - : /* Clobber */);
+ + __get_cpuid(n, &eax, &ebx, &ecx, &edx);
+ }
+
+ #else // IMF_HAVE_SSE2 && __GNUC__
+
+ // Helper functions for generic compiler - all disabled
+ - void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx)
+ + void cpuid(unsigned int n, unsigned int &eax, unsigned int &ebx,
+ + unsigned int &ecx, unsigned int &edx)
+ {
+ eax = ebx = ecx = edx = 0;
+ }
+ @@ -64,7 +62,7 @@
+
+ #ifdef OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX
+
+ - void xgetbv(int n, int &eax, int &edx)
+ + void xgetbv(unsigned int n, unsigned int &eax, unsigned int &edx)
+ {
+ __asm__ __volatile__ (
+ "xgetbv"
+ @@ -75,7 +73,7 @@
+
+ #else // OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX
+
+ - void xgetbv(int n, int &eax, int &edx)
+ + void xgetbv(unsigned int n, unsigned int &eax, unsigned int &edx)
+ {
+ eax = edx = 0;
+ }
+ @@ -94,8 +92,8 @@
+ f16c(false)
+ {
+ bool osxsave = false;
+ - int max = 0;
+ - int eax, ebx, ecx, edx;
+ + unsigned int max = 0;
+ + unsigned int eax, ebx, ecx, edx;
+
+ cpuid(0, max, ebx, ecx, edx);
+ if (max > 0)
diff --git a/testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch b/testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
new file mode 100644
index 0000000..20c11ea
--- /dev/null
+++ b/testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
@@ -0,0 +1,1172 @@
+ From 44bce1b66c1cdd5308ac3ac773ea0a53d83790fd Mon Sep 17 00:00:00 2001
+ From: Peter Korsgaard <peter@korsgaard.com>
+ Date: Tue, 24 Nov 2015 21:16:39 +0100
+ Subject: [PATCH] LibWebP: fix compilation issue with GCC 5.x / C++11
+
+ GCC 5.1 / C++11 gets confused about the "#<TEXT>" in the inline assembly
+ code, and dies with errors like:
+
+ Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:34: error: invalid
+ character ' ' in raw string delimiter
+
+ Fix it by introducting white space around the string literals like it has
+ been done in upstream webp:
+
+ https://chromium.googlesource.com/webm/libwebp/+/eebaf97f5a1cb713d81d311308d8a48c124e5aef
+
+ Discussed upstream:
+ http://sourceforge.net/p/freeimage/discussion/36110/thread/605ef8e4/
+
+ [Scripted by sed -i 's/"\(#[A-Z0-9]*\)"/" \1 "/g' *.c]
+ Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
+ ---
+ Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c | 28 +-
+ Source/LibWebP/src/dsp/dsp.enc_mips32.c | 314 ++++++++++-----------
+ Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c | 288 +++++++++----------
+ Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c | 10 +-
+ Source/LibWebP/src/dsp/dsp.lossless_mips32.c | 34 +--
+ Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c | 8 +-
+ .../LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c | 18 +-
+ Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c | 10 +-
+ 8 files changed, 355 insertions(+), 355 deletions(-)
+
+ diff --git a/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
+ index dac2c93..aaa8111 100644
+ --- a/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
+ @@ -548,10 +548,10 @@ static void SimpleVFilter16(uint8_t* p, int stride, int thresh) {
+ // TEMP3 = SRC[D + D1 * BPS]
+ #define LOAD_4_BYTES(TEMP0, TEMP1, TEMP2, TEMP3, \
+ A, A1, B, B1, C, C1, D, D1, SRC) \
+ - "lbu %["#TEMP0"], "#A"+"#A1"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ - "lbu %["#TEMP1"], "#B"+"#B1"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ - "lbu %["#TEMP2"], "#C"+"#C1"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ - "lbu %["#TEMP3"], "#D"+"#D1"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ + "lbu %[" #TEMP0 "], " #A "+" #A1 "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+ + "lbu %[" #TEMP1 "], " #B "+" #B1 "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+ + "lbu %[" #TEMP2 "], " #C "+" #C1 "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+ + "lbu %[" #TEMP3 "], " #D "+" #D1 "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+
+ static void SimpleHFilter16(uint8_t* p, int stride, int thresh) {
+ int i;
+ @@ -623,8 +623,8 @@ static void SimpleHFilter16i(uint8_t* p, int stride, int thresh) {
+ // DST[A * BPS] = TEMP0
+ // DST[B + C * BPS] = TEMP1
+ #define STORE_8_BYTES(TEMP0, TEMP1, A, B, C, DST) \
+ - "usw %["#TEMP0"], "#A"*"XSTR(BPS)"(%["#DST"]) \n\t" \
+ - "usw %["#TEMP1"], "#B"+"#C"*"XSTR(BPS)"(%["#DST"]) \n\t"
+ + "usw %[" #TEMP0 "], " #A "*"XSTR(BPS)"(%[" #DST "]) \n\t" \
+ + "usw %[" #TEMP1 "], " #B "+" #C "*"XSTR(BPS)"(%[" #DST "]) \n\t"
+
+ static void VE4(uint8_t* dst) { // vertical
+ const uint8_t* top = dst - BPS;
+ @@ -725,8 +725,8 @@ static void RD4(uint8_t* dst) { // Down-right
+ // TEMP0 = SRC[A * BPS]
+ // TEMP1 = SRC[B + C * BPS]
+ #define LOAD_8_BYTES(TEMP0, TEMP1, A, B, C, SRC) \
+ - "ulw %["#TEMP0"], "#A"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ - "ulw %["#TEMP1"], "#B"+"#C"*"XSTR(BPS)"(%["#SRC"]) \n\t"
+ + "ulw %[" #TEMP0 "], " #A "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+ + "ulw %[" #TEMP1 "], " #B "+" #C "*"XSTR(BPS)"(%[" #SRC "]) \n\t"
+
+ static void LD4(uint8_t* dst) { // Down-Left
+ int temp0, temp1, temp2, temp3, temp4;
+ @@ -873,24 +873,24 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with no top samples
+ #define CLIPPING(SIZE) \
+ "preceu.ph.qbl %[temp2], %[temp0] \n\t" \
+ "preceu.ph.qbr %[temp0], %[temp0] \n\t" \
+ -".if "#SIZE" == 8 \n\t" \
+ +".if " #SIZE " == 8 \n\t" \
+ "preceu.ph.qbl %[temp3], %[temp1] \n\t" \
+ "preceu.ph.qbr %[temp1], %[temp1] \n\t" \
+ ".endif \n\t" \
+ "addu.ph %[temp2], %[temp2], %[dst_1] \n\t" \
+ "addu.ph %[temp0], %[temp0], %[dst_1] \n\t" \
+ -".if "#SIZE" == 8 \n\t" \
+ +".if " #SIZE " == 8 \n\t" \
+ "addu.ph %[temp3], %[temp3], %[dst_1] \n\t" \
+ "addu.ph %[temp1], %[temp1], %[dst_1] \n\t" \
+ ".endif \n\t" \
+ "shll_s.ph %[temp2], %[temp2], 7 \n\t" \
+ "shll_s.ph %[temp0], %[temp0], 7 \n\t" \
+ -".if "#SIZE" == 8 \n\t" \
+ +".if " #SIZE " == 8 \n\t" \
+ "shll_s.ph %[temp3], %[temp3], 7 \n\t" \
+ "shll_s.ph %[temp1], %[temp1], 7 \n\t" \
+ ".endif \n\t" \
+ "precrqu_s.qb.ph %[temp0], %[temp2], %[temp0] \n\t" \
+ -".if "#SIZE" == 8 \n\t" \
+ +".if " #SIZE " == 8 \n\t" \
+ "precrqu_s.qb.ph %[temp1], %[temp3], %[temp1] \n\t" \
+ ".endif \n\t"
+
+ @@ -899,7 +899,7 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with no top samples
+ int dst_1 = ((int)(DST)[-1] << 16) + (DST)[-1]; \
+ int temp0, temp1, temp2, temp3; \
+ __asm__ volatile ( \
+ - ".if "#SIZE" < 8 \n\t" \
+ + ".if " #SIZE " < 8 \n\t" \
+ "ulw %[temp0], 0(%[top]) \n\t" \
+ "subu.ph %[dst_1], %[dst_1], %[top_1] \n\t" \
+ CLIPPING(4) \
+ @@ -911,7 +911,7 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with no top samples
+ CLIPPING(8) \
+ "usw %[temp0], 0(%[dst]) \n\t" \
+ "usw %[temp1], 4(%[dst]) \n\t" \
+ - ".if "#SIZE" == 16 \n\t" \
+ + ".if " #SIZE " == 16 \n\t" \
+ "ulw %[temp0], 8(%[top]) \n\t" \
+ "ulw %[temp1], 12(%[top]) \n\t" \
+ CLIPPING(8) \
+ diff --git a/Source/LibWebP/src/dsp/dsp.enc_mips32.c b/Source/LibWebP/src/dsp/dsp.enc_mips32.c
+ index 545aa3a..bf1c16d 100644
+ --- a/Source/LibWebP/src/dsp/dsp.enc_mips32.c
+ +++ b/Source/LibWebP/src/dsp/dsp.enc_mips32.c
+ @@ -31,26 +31,26 @@ static const int kC2 = 35468;
+ // TEMP0..TEMP3 - registers for corresponding tmp elements
+ // TEMP4..TEMP5 - temporary registers
+ #define VERTICAL_PASS(A, B, C, D, TEMP4, TEMP0, TEMP1, TEMP2, TEMP3) \
+ - "lh %[temp16], "#A"(%[temp20]) \n\t" \
+ - "lh %[temp18], "#B"(%[temp20]) \n\t" \
+ - "lh %[temp17], "#C"(%[temp20]) \n\t" \
+ - "lh %[temp19], "#D"(%[temp20]) \n\t" \
+ - "addu %["#TEMP4"], %[temp16], %[temp18] \n\t" \
+ + "lh %[temp16], " #A "(%[temp20]) \n\t" \
+ + "lh %[temp18], " #B "(%[temp20]) \n\t" \
+ + "lh %[temp17], " #C "(%[temp20]) \n\t" \
+ + "lh %[temp19], " #D "(%[temp20]) \n\t" \
+ + "addu %[" #TEMP4 "], %[temp16], %[temp18] \n\t" \
+ "subu %[temp16], %[temp16], %[temp18] \n\t" \
+ - "mul %["#TEMP0"], %[temp17], %[kC2] \n\t" \
+ + "mul %[" #TEMP0 "], %[temp17], %[kC2] \n\t" \
+ "mul %[temp18], %[temp19], %[kC1] \n\t" \
+ "mul %[temp17], %[temp17], %[kC1] \n\t" \
+ "mul %[temp19], %[temp19], %[kC2] \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 16 \n\n" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\n" \
+ "sra %[temp18], %[temp18], 16 \n\n" \
+ "sra %[temp17], %[temp17], 16 \n\n" \
+ "sra %[temp19], %[temp19], 16 \n\n" \
+ - "subu %["#TEMP2"], %["#TEMP0"], %[temp18] \n\t" \
+ - "addu %["#TEMP3"], %[temp17], %[temp19] \n\t" \
+ - "addu %["#TEMP0"], %["#TEMP4"], %["#TEMP3"] \n\t" \
+ - "addu %["#TEMP1"], %[temp16], %["#TEMP2"] \n\t" \
+ - "subu %["#TEMP2"], %[temp16], %["#TEMP2"] \n\t" \
+ - "subu %["#TEMP3"], %["#TEMP4"], %["#TEMP3"] \n\t"
+ + "subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp18] \n\t" \
+ + "addu %[" #TEMP3 "], %[temp17], %[temp19] \n\t" \
+ + "addu %[" #TEMP0 "], %[" #TEMP4 "], %[" #TEMP3 "] \n\t" \
+ + "addu %[" #TEMP1 "], %[temp16], %[" #TEMP2 "] \n\t" \
+ + "subu %[" #TEMP2 "], %[temp16], %[" #TEMP2 "] \n\t" \
+ + "subu %[" #TEMP3 "], %[" #TEMP4 "], %[" #TEMP3 "] \n\t"
+
+ // macro for one horizontal pass in ITransformOne
+ // MUL and STORE macros inlined
+ @@ -59,58 +59,58 @@ static const int kC2 = 35468;
+ // A - offset in bytes to load from ref and store to dst buffer
+ // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements
+ #define HORIZONTAL_PASS(A, TEMP0, TEMP4, TEMP8, TEMP12) \
+ - "addiu %["#TEMP0"], %["#TEMP0"], 4 \n\t" \
+ - "addu %[temp16], %["#TEMP0"], %["#TEMP8"] \n\t" \
+ - "subu %[temp17], %["#TEMP0"], %["#TEMP8"] \n\t" \
+ - "mul %["#TEMP0"], %["#TEMP4"], %[kC2] \n\t" \
+ - "mul %["#TEMP8"], %["#TEMP12"], %[kC1] \n\t" \
+ - "mul %["#TEMP4"], %["#TEMP4"], %[kC1] \n\t" \
+ - "mul %["#TEMP12"], %["#TEMP12"], %[kC2] \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 16 \n\t" \
+ - "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t" \
+ - "sra %["#TEMP4"], %["#TEMP4"], 16 \n\t" \
+ - "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t" \
+ - "subu %[temp18], %["#TEMP0"], %["#TEMP8"] \n\t" \
+ - "addu %[temp19], %["#TEMP4"], %["#TEMP12"] \n\t" \
+ - "addu %["#TEMP0"], %[temp16], %[temp19] \n\t" \
+ - "addu %["#TEMP4"], %[temp17], %[temp18] \n\t" \
+ - "subu %["#TEMP8"], %[temp17], %[temp18] \n\t" \
+ - "subu %["#TEMP12"], %[temp16], %[temp19] \n\t" \
+ + "addiu %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \
+ + "addu %[temp16], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
+ + "subu %[temp17], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
+ + "mul %[" #TEMP0 "], %[" #TEMP4 "], %[kC2] \n\t" \
+ + "mul %[" #TEMP8 "], %[" #TEMP12 "], %[kC1] \n\t" \
+ + "mul %[" #TEMP4 "], %[" #TEMP4 "], %[kC1] \n\t" \
+ + "mul %[" #TEMP12 "], %[" #TEMP12 "], %[kC2] \n\t" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\t" \
+ + "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \
+ + "sra %[" #TEMP4 "], %[" #TEMP4 "], 16 \n\t" \
+ + "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \
+ + "subu %[temp18], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
+ + "addu %[temp19], %[" #TEMP4 "], %[" #TEMP12 "] \n\t" \
+ + "addu %[" #TEMP0 "], %[temp16], %[temp19] \n\t" \
+ + "addu %[" #TEMP4 "], %[temp17], %[temp18] \n\t" \
+ + "subu %[" #TEMP8 "], %[temp17], %[temp18] \n\t" \
+ + "subu %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \
+ "lw %[temp20], 0(%[args]) \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 3 \n\t" \
+ - "sra %["#TEMP4"], %["#TEMP4"], 3 \n\t" \
+ - "sra %["#TEMP8"], %["#TEMP8"], 3 \n\t" \
+ - "sra %["#TEMP12"], %["#TEMP12"], 3 \n\t" \
+ - "lbu %[temp16], 0+"XSTR(BPS)"*"#A"(%[temp20]) \n\t" \
+ - "lbu %[temp17], 1+"XSTR(BPS)"*"#A"(%[temp20]) \n\t" \
+ - "lbu %[temp18], 2+"XSTR(BPS)"*"#A"(%[temp20]) \n\t" \
+ - "lbu %[temp19], 3+"XSTR(BPS)"*"#A"(%[temp20]) \n\t" \
+ - "addu %["#TEMP0"], %[temp16], %["#TEMP0"] \n\t" \
+ - "addu %["#TEMP4"], %[temp17], %["#TEMP4"] \n\t" \
+ - "addu %["#TEMP8"], %[temp18], %["#TEMP8"] \n\t" \
+ - "addu %["#TEMP12"], %[temp19], %["#TEMP12"] \n\t" \
+ - "slt %[temp16], %["#TEMP0"], $zero \n\t" \
+ - "slt %[temp17], %["#TEMP4"], $zero \n\t" \
+ - "slt %[temp18], %["#TEMP8"], $zero \n\t" \
+ - "slt %[temp19], %["#TEMP12"], $zero \n\t" \
+ - "movn %["#TEMP0"], $zero, %[temp16] \n\t" \
+ - "movn %["#TEMP4"], $zero, %[temp17] \n\t" \
+ - "movn %["#TEMP8"], $zero, %[temp18] \n\t" \
+ - "movn %["#TEMP12"], $zero, %[temp19] \n\t" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 3 \n\t" \
+ + "sra %[" #TEMP4 "], %[" #TEMP4 "], 3 \n\t" \
+ + "sra %[" #TEMP8 "], %[" #TEMP8 "], 3 \n\t" \
+ + "sra %[" #TEMP12 "], %[" #TEMP12 "], 3 \n\t" \
+ + "lbu %[temp16], 0+"XSTR(BPS)"*" #A "(%[temp20]) \n\t" \
+ + "lbu %[temp17], 1+"XSTR(BPS)"*" #A "(%[temp20]) \n\t" \
+ + "lbu %[temp18], 2+"XSTR(BPS)"*" #A "(%[temp20]) \n\t" \
+ + "lbu %[temp19], 3+"XSTR(BPS)"*" #A "(%[temp20]) \n\t" \
+ + "addu %[" #TEMP0 "], %[temp16], %[" #TEMP0 "] \n\t" \
+ + "addu %[" #TEMP4 "], %[temp17], %[" #TEMP4 "] \n\t" \
+ + "addu %[" #TEMP8 "], %[temp18], %[" #TEMP8 "] \n\t" \
+ + "addu %[" #TEMP12 "], %[temp19], %[" #TEMP12 "] \n\t" \
+ + "slt %[temp16], %[" #TEMP0 "], $zero \n\t" \
+ + "slt %[temp17], %[" #TEMP4 "], $zero \n\t" \
+ + "slt %[temp18], %[" #TEMP8 "], $zero \n\t" \
+ + "slt %[temp19], %[" #TEMP12 "], $zero \n\t" \
+ + "movn %[" #TEMP0 "], $zero, %[temp16] \n\t" \
+ + "movn %[" #TEMP4 "], $zero, %[temp17] \n\t" \
+ + "movn %[" #TEMP8 "], $zero, %[temp18] \n\t" \
+ + "movn %[" #TEMP12 "], $zero, %[temp19] \n\t" \
+ "addiu %[temp20], $zero, 255 \n\t" \
+ - "slt %[temp16], %["#TEMP0"], %[temp20] \n\t" \
+ - "slt %[temp17], %["#TEMP4"], %[temp20] \n\t" \
+ - "slt %[temp18], %["#TEMP8"], %[temp20] \n\t" \
+ - "slt %[temp19], %["#TEMP12"], %[temp20] \n\t" \
+ - "movz %["#TEMP0"], %[temp20], %[temp16] \n\t" \
+ - "movz %["#TEMP4"], %[temp20], %[temp17] \n\t" \
+ + "slt %[temp16], %[" #TEMP0 "], %[temp20] \n\t" \
+ + "slt %[temp17], %[" #TEMP4 "], %[temp20] \n\t" \
+ + "slt %[temp18], %[" #TEMP8 "], %[temp20] \n\t" \
+ + "slt %[temp19], %[" #TEMP12 "], %[temp20] \n\t" \
+ + "movz %[" #TEMP0 "], %[temp20], %[temp16] \n\t" \
+ + "movz %[" #TEMP4 "], %[temp20], %[temp17] \n\t" \
+ "lw %[temp16], 8(%[args]) \n\t" \
+ - "movz %["#TEMP8"], %[temp20], %[temp18] \n\t" \
+ - "movz %["#TEMP12"], %[temp20], %[temp19] \n\t" \
+ - "sb %["#TEMP0"], 0+"XSTR(BPS)"*"#A"(%[temp16]) \n\t" \
+ - "sb %["#TEMP4"], 1+"XSTR(BPS)"*"#A"(%[temp16]) \n\t" \
+ - "sb %["#TEMP8"], 2+"XSTR(BPS)"*"#A"(%[temp16]) \n\t" \
+ - "sb %["#TEMP12"], 3+"XSTR(BPS)"*"#A"(%[temp16]) \n\t"
+ + "movz %[" #TEMP8 "], %[temp20], %[temp18] \n\t" \
+ + "movz %[" #TEMP12 "], %[temp20], %[temp19] \n\t" \
+ + "sb %[" #TEMP0 "], 0+"XSTR(BPS)"*" #A "(%[temp16]) \n\t" \
+ + "sb %[" #TEMP4 "], 1+"XSTR(BPS)"*" #A "(%[temp16]) \n\t" \
+ + "sb %[" #TEMP8 "], 2+"XSTR(BPS)"*" #A "(%[temp16]) \n\t" \
+ + "sb %[" #TEMP12 "], 3+"XSTR(BPS)"*" #A "(%[temp16]) \n\t"
+
+ // Does one or two inverse transforms.
+ static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t* in,
+ @@ -161,9 +161,9 @@ static void ITransform(const uint8_t* ref, const int16_t* in,
+ // K - offset in bytes (kZigzag[n] * 4)
+ // N - offset in bytes (n * 2)
+ #define QUANTIZE_ONE(J, K, N) \
+ - "lh %[temp0], "#J"(%[ppin]) \n\t" \
+ - "lhu %[temp1], "#J"(%[ppsharpen]) \n\t" \
+ - "lw %[temp2], "#K"(%[ppzthresh]) \n\t" \
+ + "lh %[temp0], " #J "(%[ppin]) \n\t" \
+ + "lhu %[temp1], " #J "(%[ppsharpen]) \n\t" \
+ + "lw %[temp2], " #K "(%[ppzthresh]) \n\t" \
+ "sra %[sign], %[temp0], 15 \n\t" \
+ "xor %[coeff], %[temp0], %[sign] \n\t" \
+ "subu %[coeff], %[coeff], %[sign] \n\t" \
+ @@ -172,9 +172,9 @@ static void ITransform(const uint8_t* ref, const int16_t* in,
+ "addiu %[temp5], $zero, 0 \n\t" \
+ "addiu %[level], $zero, 0 \n\t" \
+ "beqz %[temp4], 2f \n\t" \
+ - "lhu %[temp1], "#J"(%[ppiq]) \n\t" \
+ - "lw %[temp2], "#K"(%[ppbias]) \n\t" \
+ - "lhu %[temp3], "#J"(%[ppq]) \n\t" \
+ + "lhu %[temp1], " #J "(%[ppiq]) \n\t" \
+ + "lw %[temp2], " #K "(%[ppbias]) \n\t" \
+ + "lhu %[temp3], " #J "(%[ppq]) \n\t" \
+ "mul %[level], %[coeff], %[temp1] \n\t" \
+ "addu %[level], %[level], %[temp2] \n\t" \
+ "sra %[level], %[level], 17 \n\t" \
+ @@ -184,8 +184,8 @@ static void ITransform(const uint8_t* ref, const int16_t* in,
+ "subu %[level], %[level], %[sign] \n\t" \
+ "mul %[temp5], %[level], %[temp3] \n\t" \
+ "2: \n\t" \
+ - "sh %[temp5], "#J"(%[ppin]) \n\t" \
+ - "sh %[level], "#N"(%[pout]) \n\t"
+ + "sh %[temp5], " #J "(%[ppin]) \n\t" \
+ + "sh %[level], " #N "(%[pout]) \n\t"
+
+ static int QuantizeBlock(int16_t in[16], int16_t out[16],
+ const VP8Matrix* const mtx) {
+ @@ -254,14 +254,14 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ // E..H - offsets in bytes to store first results to tmp buffer
+ // E1..H1 - offsets in bytes to store second results to tmp buffer
+ #define HORIZONTAL_PASS(A, E, F, G, H, E1, F1, G1, H1) \
+ - "lbu %[temp0], 0+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
+ - "lbu %[temp1], 1+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
+ - "lbu %[temp2], 2+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
+ - "lbu %[temp3], 3+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
+ - "lbu %[temp4], 0+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
+ - "lbu %[temp5], 1+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
+ - "lbu %[temp6], 2+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
+ - "lbu %[temp7], 3+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
+ + "lbu %[temp0], 0+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
+ + "lbu %[temp1], 1+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
+ + "lbu %[temp2], 2+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
+ + "lbu %[temp3], 3+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
+ + "lbu %[temp4], 0+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
+ + "lbu %[temp5], 1+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
+ + "lbu %[temp6], 2+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
+ + "lbu %[temp7], 3+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
+ "addu %[temp8], %[temp0], %[temp2] \n\t" \
+ "subu %[temp0], %[temp0], %[temp2] \n\t" \
+ "addu %[temp2], %[temp1], %[temp3] \n\t" \
+ @@ -278,14 +278,14 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ "subu %[temp3], %[temp3], %[temp6] \n\t" \
+ "addu %[temp6], %[temp4], %[temp5] \n\t" \
+ "subu %[temp4], %[temp4], %[temp5] \n\t" \
+ - "sw %[temp7], "#E"(%[tmp]) \n\t" \
+ - "sw %[temp2], "#H"(%[tmp]) \n\t" \
+ - "sw %[temp8], "#F"(%[tmp]) \n\t" \
+ - "sw %[temp0], "#G"(%[tmp]) \n\t" \
+ - "sw %[temp1], "#E1"(%[tmp]) \n\t" \
+ - "sw %[temp3], "#H1"(%[tmp]) \n\t" \
+ - "sw %[temp6], "#F1"(%[tmp]) \n\t" \
+ - "sw %[temp4], "#G1"(%[tmp]) \n\t"
+ + "sw %[temp7], " #E "(%[tmp]) \n\t" \
+ + "sw %[temp2], " #H "(%[tmp]) \n\t" \
+ + "sw %[temp8], " #F "(%[tmp]) \n\t" \
+ + "sw %[temp0], " #G "(%[tmp]) \n\t" \
+ + "sw %[temp1], " #E1 "(%[tmp]) \n\t" \
+ + "sw %[temp3], " #H1 "(%[tmp]) \n\t" \
+ + "sw %[temp6], " #F1 "(%[tmp]) \n\t" \
+ + "sw %[temp4], " #G1 "(%[tmp]) \n\t"
+
+ // macro for one vertical pass in Disto4x4 (TTransform)
+ // two calls of function TTransform are merged into single one
+ @@ -300,10 +300,10 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ // A1..D1 - offsets in bytes to load second results from tmp buffer
+ // E..H - offsets in bytes to load from w buffer
+ #define VERTICAL_PASS(A, B, C, D, A1, B1, C1, D1, E, F, G, H) \
+ - "lw %[temp0], "#A1"(%[tmp]) \n\t" \
+ - "lw %[temp1], "#C1"(%[tmp]) \n\t" \
+ - "lw %[temp2], "#B1"(%[tmp]) \n\t" \
+ - "lw %[temp3], "#D1"(%[tmp]) \n\t" \
+ + "lw %[temp0], " #A1 "(%[tmp]) \n\t" \
+ + "lw %[temp1], " #C1 "(%[tmp]) \n\t" \
+ + "lw %[temp2], " #B1 "(%[tmp]) \n\t" \
+ + "lw %[temp3], " #D1 "(%[tmp]) \n\t" \
+ "addu %[temp8], %[temp0], %[temp1] \n\t" \
+ "subu %[temp0], %[temp0], %[temp1] \n\t" \
+ "addu %[temp1], %[temp2], %[temp3] \n\t" \
+ @@ -324,18 +324,18 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ "subu %[temp1], %[temp1], %[temp5] \n\t" \
+ "subu %[temp0], %[temp0], %[temp6] \n\t" \
+ "subu %[temp8], %[temp8], %[temp7] \n\t" \
+ - "lhu %[temp4], "#E"(%[w]) \n\t" \
+ - "lhu %[temp5], "#F"(%[w]) \n\t" \
+ - "lhu %[temp6], "#G"(%[w]) \n\t" \
+ - "lhu %[temp7], "#H"(%[w]) \n\t" \
+ + "lhu %[temp4], " #E "(%[w]) \n\t" \
+ + "lhu %[temp5], " #F "(%[w]) \n\t" \
+ + "lhu %[temp6], " #G "(%[w]) \n\t" \
+ + "lhu %[temp7], " #H "(%[w]) \n\t" \
+ "madd %[temp4], %[temp3] \n\t" \
+ "madd %[temp5], %[temp1] \n\t" \
+ "madd %[temp6], %[temp0] \n\t" \
+ "madd %[temp7], %[temp8] \n\t" \
+ - "lw %[temp0], "#A"(%[tmp]) \n\t" \
+ - "lw %[temp1], "#C"(%[tmp]) \n\t" \
+ - "lw %[temp2], "#B"(%[tmp]) \n\t" \
+ - "lw %[temp3], "#D"(%[tmp]) \n\t" \
+ + "lw %[temp0], " #A "(%[tmp]) \n\t" \
+ + "lw %[temp1], " #C "(%[tmp]) \n\t" \
+ + "lw %[temp2], " #B "(%[tmp]) \n\t" \
+ + "lw %[temp3], " #D "(%[tmp]) \n\t" \
+ "addu %[temp8], %[temp0], %[temp1] \n\t" \
+ "subu %[temp0], %[temp0], %[temp1] \n\t" \
+ "addu %[temp1], %[temp2], %[temp3] \n\t" \
+ @@ -413,70 +413,70 @@ static int Disto16x16(const uint8_t* const a, const uint8_t* const b,
+ // A - offset in bytes to load from src and ref buffers
+ // TEMP0..TEMP3 - registers for corresponding tmp elements
+ #define HORIZONTAL_PASS(A, TEMP0, TEMP1, TEMP2, TEMP3) \
+ - "lw %["#TEMP1"], 0(%[args]) \n\t" \
+ - "lw %["#TEMP2"], 4(%[args]) \n\t" \
+ - "lbu %[temp16], 0+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "lbu %[temp17], 0+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
+ - "lbu %[temp18], 1+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "lbu %[temp19], 1+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
+ + "lw %[" #TEMP1 "], 0(%[args]) \n\t" \
+ + "lw %[" #TEMP2 "], 4(%[args]) \n\t" \
+ + "lbu %[temp16], 0+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "lbu %[temp17], 0+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
+ + "lbu %[temp18], 1+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "lbu %[temp19], 1+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
+ "subu %[temp20], %[temp16], %[temp17] \n\t" \
+ - "lbu %[temp16], 2+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "lbu %[temp17], 2+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
+ - "subu %["#TEMP0"], %[temp18], %[temp19] \n\t" \
+ - "lbu %[temp18], 3+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "lbu %[temp19], 3+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
+ - "subu %["#TEMP1"], %[temp16], %[temp17] \n\t" \
+ - "subu %["#TEMP2"], %[temp18], %[temp19] \n\t" \
+ - "addu %["#TEMP3"], %[temp20], %["#TEMP2"] \n\t" \
+ - "subu %["#TEMP2"], %[temp20], %["#TEMP2"] \n\t" \
+ - "addu %[temp20], %["#TEMP0"], %["#TEMP1"] \n\t" \
+ - "subu %["#TEMP0"], %["#TEMP0"], %["#TEMP1"] \n\t" \
+ - "mul %[temp16], %["#TEMP2"], %[c5352] \n\t" \
+ - "mul %[temp17], %["#TEMP2"], %[c2217] \n\t" \
+ - "mul %[temp18], %["#TEMP0"], %[c5352] \n\t" \
+ - "mul %[temp19], %["#TEMP0"], %[c2217] \n\t" \
+ - "addu %["#TEMP1"], %["#TEMP3"], %[temp20] \n\t" \
+ - "subu %[temp20], %["#TEMP3"], %[temp20] \n\t" \
+ - "sll %["#TEMP0"], %["#TEMP1"], 3 \n\t" \
+ - "sll %["#TEMP2"], %[temp20], 3 \n\t" \
+ + "lbu %[temp16], 2+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "lbu %[temp17], 2+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
+ + "subu %[" #TEMP0 "], %[temp18], %[temp19] \n\t" \
+ + "lbu %[temp18], 3+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "lbu %[temp19], 3+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
+ + "subu %[" #TEMP1 "], %[temp16], %[temp17] \n\t" \
+ + "subu %[" #TEMP2 "], %[temp18], %[temp19] \n\t" \
+ + "addu %[" #TEMP3 "], %[temp20], %[" #TEMP2 "] \n\t" \
+ + "subu %[" #TEMP2 "], %[temp20], %[" #TEMP2 "] \n\t" \
+ + "addu %[temp20], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
+ + "subu %[" #TEMP0 "], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
+ + "mul %[temp16], %[" #TEMP2 "], %[c5352] \n\t" \
+ + "mul %[temp17], %[" #TEMP2 "], %[c2217] \n\t" \
+ + "mul %[temp18], %[" #TEMP0 "], %[c5352] \n\t" \
+ + "mul %[temp19], %[" #TEMP0 "], %[c2217] \n\t" \
+ + "addu %[" #TEMP1 "], %[" #TEMP3 "], %[temp20] \n\t" \
+ + "subu %[temp20], %[" #TEMP3 "], %[temp20] \n\t" \
+ + "sll %[" #TEMP0 "], %[" #TEMP1 "], 3 \n\t" \
+ + "sll %[" #TEMP2 "], %[temp20], 3 \n\t" \
+ "addiu %[temp16], %[temp16], 1812 \n\t" \
+ "addiu %[temp17], %[temp17], 937 \n\t" \
+ "addu %[temp16], %[temp16], %[temp19] \n\t" \
+ "subu %[temp17], %[temp17], %[temp18] \n\t" \
+ - "sra %["#TEMP1"], %[temp16], 9 \n\t" \
+ - "sra %["#TEMP3"], %[temp17], 9 \n\t"
+ + "sra %[" #TEMP1 "], %[temp16], 9 \n\t" \
+ + "sra %[" #TEMP3 "], %[temp17], 9 \n\t"
+
+ // macro for one vertical pass in FTransform
+ // temp0..temp15 holds tmp[0]..tmp[15]
+ // A..D - offsets in bytes to store to out buffer
+ // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements
+ #define VERTICAL_PASS(A, B, C, D, TEMP0, TEMP4, TEMP8, TEMP12) \
+ - "addu %[temp16], %["#TEMP0"], %["#TEMP12"] \n\t" \
+ - "subu %[temp19], %["#TEMP0"], %["#TEMP12"] \n\t" \
+ - "addu %[temp17], %["#TEMP4"], %["#TEMP8"] \n\t" \
+ - "subu %[temp18], %["#TEMP4"], %["#TEMP8"] \n\t" \
+ - "mul %["#TEMP8"], %[temp19], %[c2217] \n\t" \
+ - "mul %["#TEMP12"], %[temp18], %[c2217] \n\t" \
+ - "mul %["#TEMP4"], %[temp19], %[c5352] \n\t" \
+ + "addu %[temp16], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
+ + "subu %[temp19], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
+ + "addu %[temp17], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
+ + "subu %[temp18], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
+ + "mul %[" #TEMP8 "], %[temp19], %[c2217] \n\t" \
+ + "mul %[" #TEMP12 "], %[temp18], %[c2217] \n\t" \
+ + "mul %[" #TEMP4 "], %[temp19], %[c5352] \n\t" \
+ "mul %[temp18], %[temp18], %[c5352] \n\t" \
+ "addiu %[temp16], %[temp16], 7 \n\t" \
+ - "addu %["#TEMP0"], %[temp16], %[temp17] \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 4 \n\t" \
+ - "addu %["#TEMP12"], %["#TEMP12"], %["#TEMP4"] \n\t" \
+ - "subu %["#TEMP4"], %[temp16], %[temp17] \n\t" \
+ - "sra %["#TEMP4"], %["#TEMP4"], 4 \n\t" \
+ - "addiu %["#TEMP8"], %["#TEMP8"], 30000 \n\t" \
+ - "addiu %["#TEMP12"], %["#TEMP12"], 12000 \n\t" \
+ - "addiu %["#TEMP8"], %["#TEMP8"], 21000 \n\t" \
+ - "subu %["#TEMP8"], %["#TEMP8"], %[temp18] \n\t" \
+ - "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t" \
+ - "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t" \
+ - "addiu %[temp16], %["#TEMP12"], 1 \n\t" \
+ - "movn %["#TEMP12"], %[temp16], %[temp19] \n\t" \
+ - "sh %["#TEMP0"], "#A"(%[temp20]) \n\t" \
+ - "sh %["#TEMP4"], "#C"(%[temp20]) \n\t" \
+ - "sh %["#TEMP8"], "#D"(%[temp20]) \n\t" \
+ - "sh %["#TEMP12"], "#B"(%[temp20]) \n\t"
+ + "addu %[" #TEMP0 "], %[temp16], %[temp17] \n\t" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \
+ + "addu %[" #TEMP12 "], %[" #TEMP12 "], %[" #TEMP4 "] \n\t" \
+ + "subu %[" #TEMP4 "], %[temp16], %[temp17] \n\t" \
+ + "sra %[" #TEMP4 "], %[" #TEMP4 "], 4 \n\t" \
+ + "addiu %[" #TEMP8 "], %[" #TEMP8 "], 30000 \n\t" \
+ + "addiu %[" #TEMP12 "], %[" #TEMP12 "], 12000 \n\t" \
+ + "addiu %[" #TEMP8 "], %[" #TEMP8 "], 21000 \n\t" \
+ + "subu %[" #TEMP8 "], %[" #TEMP8 "], %[temp18] \n\t" \
+ + "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \
+ + "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \
+ + "addiu %[temp16], %[" #TEMP12 "], 1 \n\t" \
+ + "movn %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \
+ + "sh %[" #TEMP0 "], " #A "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP4 "], " #C "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP8 "], " #D "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP12 "], " #B "(%[temp20]) \n\t"
+
+ static void FTransform(const uint8_t* src, const uint8_t* ref, int16_t* out) {
+ int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
+ @@ -516,14 +516,14 @@ static void FTransform(const uint8_t* src, const uint8_t* ref, int16_t* out) {
+ #if !defined(WORK_AROUND_GCC)
+
+ #define GET_SSE_INNER(A, B, C, D) \
+ - "lbu %[temp0], "#A"(%[a]) \n\t" \
+ - "lbu %[temp1], "#A"(%[b]) \n\t" \
+ - "lbu %[temp2], "#B"(%[a]) \n\t" \
+ - "lbu %[temp3], "#B"(%[b]) \n\t" \
+ - "lbu %[temp4], "#C"(%[a]) \n\t" \
+ - "lbu %[temp5], "#C"(%[b]) \n\t" \
+ - "lbu %[temp6], "#D"(%[a]) \n\t" \
+ - "lbu %[temp7], "#D"(%[b]) \n\t" \
+ + "lbu %[temp0], " #A "(%[a]) \n\t" \
+ + "lbu %[temp1], " #A "(%[b]) \n\t" \
+ + "lbu %[temp2], " #B "(%[a]) \n\t" \
+ + "lbu %[temp3], " #B "(%[b]) \n\t" \
+ + "lbu %[temp4], " #C "(%[a]) \n\t" \
+ + "lbu %[temp5], " #C "(%[b]) \n\t" \
+ + "lbu %[temp6], " #D "(%[a]) \n\t" \
+ + "lbu %[temp7], " #D "(%[b]) \n\t" \
+ "subu %[temp0], %[temp0], %[temp1] \n\t" \
+ "subu %[temp2], %[temp2], %[temp3] \n\t" \
+ "subu %[temp4], %[temp4], %[temp5] \n\t" \
+ diff --git a/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
+ index ec58efe..1a3f968 100644
+ --- a/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
+ @@ -27,25 +27,25 @@ static const int kC2 = 35468;
+ // I - input (macro doesn't change it)
+ #define ADD_SUB_HALVES_X4(O0, O1, O2, O3, O4, O5, O6, O7, \
+ I0, I1, I2, I3, I4, I5, I6, I7) \
+ - "addq.ph %["#O0"], %["#I0"], %["#I1"] \n\t" \
+ - "subq.ph %["#O1"], %["#I0"], %["#I1"] \n\t" \
+ - "addq.ph %["#O2"], %["#I2"], %["#I3"] \n\t" \
+ - "subq.ph %["#O3"], %["#I2"], %["#I3"] \n\t" \
+ - "addq.ph %["#O4"], %["#I4"], %["#I5"] \n\t" \
+ - "subq.ph %["#O5"], %["#I4"], %["#I5"] \n\t" \
+ - "addq.ph %["#O6"], %["#I6"], %["#I7"] \n\t" \
+ - "subq.ph %["#O7"], %["#I6"], %["#I7"] \n\t"
+ + "addq.ph %[" #O0 "], %[" #I0 "], %[" #I1 "] \n\t" \
+ + "subq.ph %[" #O1 "], %[" #I0 "], %[" #I1 "] \n\t" \
+ + "addq.ph %[" #O2 "], %[" #I2 "], %[" #I3 "] \n\t" \
+ + "subq.ph %[" #O3 "], %[" #I2 "], %[" #I3 "] \n\t" \
+ + "addq.ph %[" #O4 "], %[" #I4 "], %[" #I5 "] \n\t" \
+ + "subq.ph %[" #O5 "], %[" #I4 "], %[" #I5 "] \n\t" \
+ + "addq.ph %[" #O6 "], %[" #I6 "], %[" #I7 "] \n\t" \
+ + "subq.ph %[" #O7 "], %[" #I6 "], %[" #I7 "] \n\t"
+
+ // IO - input/output
+ #define ABS_X8(IO0, IO1, IO2, IO3, IO4, IO5, IO6, IO7) \
+ - "absq_s.ph %["#IO0"], %["#IO0"] \n\t" \
+ - "absq_s.ph %["#IO1"], %["#IO1"] \n\t" \
+ - "absq_s.ph %["#IO2"], %["#IO2"] \n\t" \
+ - "absq_s.ph %["#IO3"], %["#IO3"] \n\t" \
+ - "absq_s.ph %["#IO4"], %["#IO4"] \n\t" \
+ - "absq_s.ph %["#IO5"], %["#IO5"] \n\t" \
+ - "absq_s.ph %["#IO6"], %["#IO6"] \n\t" \
+ - "absq_s.ph %["#IO7"], %["#IO7"] \n\t"
+ + "absq_s.ph %[" #IO0 "], %[" #IO0 "] \n\t" \
+ + "absq_s.ph %[" #IO1 "], %[" #IO1 "] \n\t" \
+ + "absq_s.ph %[" #IO2 "], %[" #IO2 "] \n\t" \
+ + "absq_s.ph %[" #IO3 "], %[" #IO3 "] \n\t" \
+ + "absq_s.ph %[" #IO4 "], %[" #IO4 "] \n\t" \
+ + "absq_s.ph %[" #IO5 "], %[" #IO5 "] \n\t" \
+ + "absq_s.ph %[" #IO6 "], %[" #IO6 "] \n\t" \
+ + "absq_s.ph %[" #IO7 "], %[" #IO7 "] \n\t"
+
+ // dpa.w.ph $ac0 temp0 ,temp1
+ // $ac += temp0[31..16] * temp1[31..16] + temp0[15..0] * temp1[15..0]
+ @@ -56,15 +56,15 @@ static const int kC2 = 35468;
+ #define MUL_HALF(O0, I0, I1, I2, I3, I4, I5, I6, I7, \
+ I8, I9, I10, I11, I12, I13, I14, I15) \
+ "mult $ac0, $zero, $zero \n\t" \
+ - "dpa.w.ph $ac0, %["#I2"], %["#I0"] \n\t" \
+ - "dpax.w.ph $ac0, %["#I5"], %["#I6"] \n\t" \
+ - "dpa.w.ph $ac0, %["#I8"], %["#I9"] \n\t" \
+ - "dpax.w.ph $ac0, %["#I11"], %["#I4"] \n\t" \
+ - "dpa.w.ph $ac0, %["#I12"], %["#I7"] \n\t" \
+ - "dpax.w.ph $ac0, %["#I13"], %["#I1"] \n\t" \
+ - "dpa.w.ph $ac0, %["#I14"], %["#I3"] \n\t" \
+ - "dpax.w.ph $ac0, %["#I15"], %["#I10"] \n\t" \
+ - "mflo %["#O0"], $ac0 \n\t"
+ + "dpa.w.ph $ac0, %[" #I2 "], %[" #I0 "] \n\t" \
+ + "dpax.w.ph $ac0, %[" #I5 "], %[" #I6 "] \n\t" \
+ + "dpa.w.ph $ac0, %[" #I8 "], %[" #I9 "] \n\t" \
+ + "dpax.w.ph $ac0, %[" #I11 "], %[" #I4 "] \n\t" \
+ + "dpa.w.ph $ac0, %[" #I12 "], %[" #I7 "] \n\t" \
+ + "dpax.w.ph $ac0, %[" #I13 "], %[" #I1 "] \n\t" \
+ + "dpa.w.ph $ac0, %[" #I14 "], %[" #I3 "] \n\t" \
+ + "dpax.w.ph $ac0, %[" #I15 "], %[" #I10 "] \n\t" \
+ + "mflo %[" #O0 "], $ac0 \n\t"
+
+ #define OUTPUT_EARLY_CLOBBER_REGS_17() \
+ OUTPUT_EARLY_CLOBBER_REGS_10(), \
+ @@ -77,69 +77,69 @@ static const int kC2 = 35468;
+ // A - offset in bytes to load from src and ref buffers
+ // TEMP0..TEMP3 - registers for corresponding tmp elements
+ #define HORIZONTAL_PASS(A, TEMP0, TEMP1, TEMP2, TEMP3) \
+ - "lw %["#TEMP0"], 0(%[args]) \n\t" \
+ - "lw %["#TEMP1"], 4(%[args]) \n\t" \
+ - "lw %["#TEMP2"], "XSTR(BPS)"*"#A"(%["#TEMP0"]) \n\t" \
+ - "lw %["#TEMP3"], "XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "preceu.ph.qbl %["#TEMP0"], %["#TEMP2"] \n\t" \
+ - "preceu.ph.qbl %["#TEMP1"], %["#TEMP3"] \n\t" \
+ - "preceu.ph.qbr %["#TEMP2"], %["#TEMP2"] \n\t" \
+ - "preceu.ph.qbr %["#TEMP3"], %["#TEMP3"] \n\t" \
+ - "subq.ph %["#TEMP0"], %["#TEMP0"], %["#TEMP1"] \n\t" \
+ - "subq.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP3"] \n\t" \
+ - "rotr %["#TEMP0"], %["#TEMP0"], 16 \n\t" \
+ - "addq.ph %["#TEMP1"], %["#TEMP2"], %["#TEMP0"] \n\t" \
+ - "subq.ph %["#TEMP3"], %["#TEMP2"], %["#TEMP0"] \n\t" \
+ - "seh %["#TEMP0"], %["#TEMP1"] \n\t" \
+ - "sra %[temp16], %["#TEMP1"], 16 \n\t" \
+ - "seh %[temp19], %["#TEMP3"] \n\t" \
+ - "sra %["#TEMP3"], %["#TEMP3"], 16 \n\t" \
+ - "subu %["#TEMP2"], %["#TEMP0"], %[temp16] \n\t" \
+ - "addu %["#TEMP0"], %["#TEMP0"], %[temp16] \n\t" \
+ + "lw %[" #TEMP0 "], 0(%[args]) \n\t" \
+ + "lw %[" #TEMP1 "], 4(%[args]) \n\t" \
+ + "lw %[" #TEMP2 "], "XSTR(BPS)"*" #A "(%[" #TEMP0 "]) \n\t" \
+ + "lw %[" #TEMP3 "], "XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "preceu.ph.qbl %[" #TEMP0 "], %[" #TEMP2 "] \n\t" \
+ + "preceu.ph.qbl %[" #TEMP1 "], %[" #TEMP3 "] \n\t" \
+ + "preceu.ph.qbr %[" #TEMP2 "], %[" #TEMP2 "] \n\t" \
+ + "preceu.ph.qbr %[" #TEMP3 "], %[" #TEMP3 "] \n\t" \
+ + "subq.ph %[" #TEMP0 "], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
+ + "subq.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP3 "] \n\t" \
+ + "rotr %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\t" \
+ + "addq.ph %[" #TEMP1 "], %[" #TEMP2 "], %[" #TEMP0 "] \n\t" \
+ + "subq.ph %[" #TEMP3 "], %[" #TEMP2 "], %[" #TEMP0 "] \n\t" \
+ + "seh %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
+ + "sra %[temp16], %[" #TEMP1 "], 16 \n\t" \
+ + "seh %[temp19], %[" #TEMP3 "] \n\t" \
+ + "sra %[" #TEMP3 "], %[" #TEMP3 "], 16 \n\t" \
+ + "subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp16] \n\t" \
+ + "addu %[" #TEMP0 "], %[" #TEMP0 "], %[temp16] \n\t" \
+ "mul %[temp17], %[temp19], %[c2217] \n\t" \
+ - "mul %[temp18], %["#TEMP3"], %[c5352] \n\t" \
+ - "mul %["#TEMP1"], %[temp19], %[c5352] \n\t" \
+ - "mul %[temp16], %["#TEMP3"], %[c2217] \n\t" \
+ - "sll %["#TEMP2"], %["#TEMP2"], 3 \n\t" \
+ - "sll %["#TEMP0"], %["#TEMP0"], 3 \n\t" \
+ - "subu %["#TEMP3"], %[temp17], %[temp18] \n\t" \
+ - "addu %["#TEMP1"], %[temp16], %["#TEMP1"] \n\t" \
+ - "addiu %["#TEMP3"], %["#TEMP3"], 937 \n\t" \
+ - "addiu %["#TEMP1"], %["#TEMP1"], 1812 \n\t" \
+ - "sra %["#TEMP3"], %["#TEMP3"], 9 \n\t" \
+ - "sra %["#TEMP1"], %["#TEMP1"], 9 \n\t"
+ + "mul %[temp18], %[" #TEMP3 "], %[c5352] \n\t" \
+ + "mul %[" #TEMP1 "], %[temp19], %[c5352] \n\t" \
+ + "mul %[temp16], %[" #TEMP3 "], %[c2217] \n\t" \
+ + "sll %[" #TEMP2 "], %[" #TEMP2 "], 3 \n\t" \
+ + "sll %[" #TEMP0 "], %[" #TEMP0 "], 3 \n\t" \
+ + "subu %[" #TEMP3 "], %[temp17], %[temp18] \n\t" \
+ + "addu %[" #TEMP1 "], %[temp16], %[" #TEMP1 "] \n\t" \
+ + "addiu %[" #TEMP3 "], %[" #TEMP3 "], 937 \n\t" \
+ + "addiu %[" #TEMP1 "], %[" #TEMP1 "], 1812 \n\t" \
+ + "sra %[" #TEMP3 "], %[" #TEMP3 "], 9 \n\t" \
+ + "sra %[" #TEMP1 "], %[" #TEMP1 "], 9 \n\t"
+
+ // macro for one vertical pass in FTransform
+ // temp0..temp15 holds tmp[0]..tmp[15]
+ // A..D - offsets in bytes to store to out buffer
+ // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements
+ #define VERTICAL_PASS(A, B, C, D, TEMP0, TEMP4, TEMP8, TEMP12) \
+ - "addu %[temp16], %["#TEMP0"], %["#TEMP12"] \n\t" \
+ - "subu %[temp19], %["#TEMP0"], %["#TEMP12"] \n\t" \
+ - "addu %[temp17], %["#TEMP4"], %["#TEMP8"] \n\t" \
+ - "subu %[temp18], %["#TEMP4"], %["#TEMP8"] \n\t" \
+ - "mul %["#TEMP8"], %[temp19], %[c2217] \n\t" \
+ - "mul %["#TEMP12"], %[temp18], %[c2217] \n\t" \
+ - "mul %["#TEMP4"], %[temp19], %[c5352] \n\t" \
+ + "addu %[temp16], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
+ + "subu %[temp19], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
+ + "addu %[temp17], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
+ + "subu %[temp18], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
+ + "mul %[" #TEMP8 "], %[temp19], %[c2217] \n\t" \
+ + "mul %[" #TEMP12 "], %[temp18], %[c2217] \n\t" \
+ + "mul %[" #TEMP4 "], %[temp19], %[c5352] \n\t" \
+ "mul %[temp18], %[temp18], %[c5352] \n\t" \
+ "addiu %[temp16], %[temp16], 7 \n\t" \
+ - "addu %["#TEMP0"], %[temp16], %[temp17] \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 4 \n\t" \
+ - "addu %["#TEMP12"], %["#TEMP12"], %["#TEMP4"] \n\t" \
+ - "subu %["#TEMP4"], %[temp16], %[temp17] \n\t" \
+ - "sra %["#TEMP4"], %["#TEMP4"], 4 \n\t" \
+ - "addiu %["#TEMP8"], %["#TEMP8"], 30000 \n\t" \
+ - "addiu %["#TEMP12"], %["#TEMP12"], 12000 \n\t" \
+ - "addiu %["#TEMP8"], %["#TEMP8"], 21000 \n\t" \
+ - "subu %["#TEMP8"], %["#TEMP8"], %[temp18] \n\t" \
+ - "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t" \
+ - "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t" \
+ - "addiu %[temp16], %["#TEMP12"], 1 \n\t" \
+ - "movn %["#TEMP12"], %[temp16], %[temp19] \n\t" \
+ - "sh %["#TEMP0"], "#A"(%[temp20]) \n\t" \
+ - "sh %["#TEMP4"], "#C"(%[temp20]) \n\t" \
+ - "sh %["#TEMP8"], "#D"(%[temp20]) \n\t" \
+ - "sh %["#TEMP12"], "#B"(%[temp20]) \n\t"
+ + "addu %[" #TEMP0 "], %[temp16], %[temp17] \n\t" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \
+ + "addu %[" #TEMP12 "], %[" #TEMP12 "], %[" #TEMP4 "] \n\t" \
+ + "subu %[" #TEMP4 "], %[temp16], %[temp17] \n\t" \
+ + "sra %[" #TEMP4 "], %[" #TEMP4 "], 4 \n\t" \
+ + "addiu %[" #TEMP8 "], %[" #TEMP8 "], 30000 \n\t" \
+ + "addiu %[" #TEMP12 "], %[" #TEMP12 "], 12000 \n\t" \
+ + "addiu %[" #TEMP8 "], %[" #TEMP8 "], 21000 \n\t" \
+ + "subu %[" #TEMP8 "], %[" #TEMP8 "], %[temp18] \n\t" \
+ + "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \
+ + "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \
+ + "addiu %[temp16], %[" #TEMP12 "], 1 \n\t" \
+ + "movn %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \
+ + "sh %[" #TEMP0 "], " #A "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP4 "], " #C "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP8 "], " #D "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP12 "], " #B "(%[temp20]) \n\t"
+
+ static void FTransform(const uint8_t* src, const uint8_t* ref, int16_t* out) {
+ const int c2217 = 2217;
+ @@ -329,11 +329,11 @@ static int Disto16x16(const uint8_t* const a, const uint8_t* const b,
+ // Intra predictions
+
+ #define FILL_PART(J, SIZE) \
+ - "usw %[value], 0+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
+ - "usw %[value], 4+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
+ - ".if "#SIZE" == 16 \n\t" \
+ - "usw %[value], 8+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
+ - "usw %[value], 12+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
+ + "usw %[value], 0+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
+ + "usw %[value], 4+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
+ + ".if " #SIZE " == 16 \n\t" \
+ + "usw %[value], 8+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
+ + "usw %[value], 12+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
+ ".endif \n\t"
+
+ #define FILL_8_OR_16(DST, VALUE, SIZE) do { \
+ @@ -348,7 +348,7 @@ static int Disto16x16(const uint8_t* const a, const uint8_t* const b,
+ FILL_PART( 5, SIZE) \
+ FILL_PART( 6, SIZE) \
+ FILL_PART( 7, SIZE) \
+ - ".if "#SIZE" == 16 \n\t" \
+ + ".if " #SIZE " == 16 \n\t" \
+ FILL_PART( 8, 16) \
+ FILL_PART( 9, 16) \
+ FILL_PART(10, 16) \
+ @@ -425,7 +425,7 @@ HORIZONTAL_PRED(dst, left, 16)
+ CLIPPING() \
+ "usw %[temp0], 0(%[dst]) \n\t" \
+ "usw %[temp1], 4(%[dst]) \n\t" \
+ - ".if "#SIZE" == 16 \n\t" \
+ + ".if " #SIZE " == 16 \n\t" \
+ "ulw %[temp0], 8(%[top]) \n\t" \
+ "ulw %[temp1], 12(%[top]) \n\t" \
+ CLIPPING() \
+ @@ -1060,8 +1060,8 @@ static void Intra4Preds(uint8_t* dst, const uint8_t* top) {
+ #if !defined(WORK_AROUND_GCC)
+
+ #define GET_SSE_INNER(A) \
+ - "lw %[temp0], "#A"(%[a]) \n\t" \
+ - "lw %[temp1], "#A"(%[b]) \n\t" \
+ + "lw %[temp0], " #A "(%[a]) \n\t" \
+ + "lw %[temp1], " #A "(%[b]) \n\t" \
+ "preceu.ph.qbr %[temp2], %[temp0] \n\t" \
+ "preceu.ph.qbl %[temp0], %[temp0] \n\t" \
+ "preceu.ph.qbr %[temp3], %[temp1] \n\t" \
+ @@ -1185,28 +1185,28 @@ static int SSE4x4(const uint8_t* a, const uint8_t* b) {
+ // N - offset in bytes (n * 2)
+ // N1 - offset in bytes ((n + 1) * 2)
+ #define QUANTIZE_ONE(J, K, N, N1) \
+ - "ulw %[temp1], "#J"(%[ppin]) \n\t" \
+ - "ulw %[temp2], "#J"(%[ppsharpen]) \n\t" \
+ - "lhu %[temp3], "#K"(%[ppzthresh]) \n\t" \
+ - "lhu %[temp6], "#K"+4(%[ppzthresh]) \n\t" \
+ + "ulw %[temp1], " #J "(%[ppin]) \n\t" \
+ + "ulw %[temp2], " #J "(%[ppsharpen]) \n\t" \
+ + "lhu %[temp3], " #K "(%[ppzthresh]) \n\t" \
+ + "lhu %[temp6], " #K "+4(%[ppzthresh]) \n\t" \
+ "absq_s.ph %[temp4], %[temp1] \n\t" \
+ "ins %[temp3], %[temp6], 16, 16 \n\t" \
+ "addu.ph %[coeff], %[temp4], %[temp2] \n\t" \
+ "shra.ph %[sign], %[temp1], 15 \n\t" \
+ "li %[level], 0x10001 \n\t" \
+ "cmp.lt.ph %[temp3], %[coeff] \n\t" \
+ - "lhu %[temp1], "#J"(%[ppiq]) \n\t" \
+ + "lhu %[temp1], " #J "(%[ppiq]) \n\t" \
+ "pick.ph %[temp5], %[level], $0 \n\t" \
+ - "lw %[temp2], "#K"(%[ppbias]) \n\t" \
+ + "lw %[temp2], " #K "(%[ppbias]) \n\t" \
+ "beqz %[temp5], 0f \n\t" \
+ - "lhu %[temp3], "#J"(%[ppq]) \n\t" \
+ + "lhu %[temp3], " #J "(%[ppq]) \n\t" \
+ "beq %[temp5], %[level], 1f \n\t" \
+ "andi %[temp5], %[temp5], 0x1 \n\t" \
+ "andi %[temp4], %[coeff], 0xffff \n\t" \
+ "beqz %[temp5], 2f \n\t" \
+ "mul %[level], %[temp4], %[temp1] \n\t" \
+ - "sh $0, "#J"+2(%[ppin]) \n\t" \
+ - "sh $0, "#N1"(%[pout]) \n\t" \
+ + "sh $0, " #J "+2(%[ppin]) \n\t" \
+ + "sh $0, " #N1 "(%[pout]) \n\t" \
+ "addu %[level], %[level], %[temp2] \n\t" \
+ "sra %[level], %[level], 17 \n\t" \
+ "slt %[temp4], %[max_level], %[level] \n\t" \
+ @@ -1216,15 +1216,15 @@ static int SSE4x4(const uint8_t* a, const uint8_t* b) {
+ "subu %[level], %[level], %[temp6] \n\t" \
+ "mul %[temp5], %[level], %[temp3] \n\t" \
+ "or %[ret], %[ret], %[level] \n\t" \
+ - "sh %[level], "#N"(%[pout]) \n\t" \
+ - "sh %[temp5], "#J"(%[ppin]) \n\t" \
+ + "sh %[level], " #N "(%[pout]) \n\t" \
+ + "sh %[temp5], " #J "(%[ppin]) \n\t" \
+ "j 3f \n\t" \
+ "2: \n\t" \
+ - "lhu %[temp1], "#J"+2(%[ppiq]) \n\t" \
+ + "lhu %[temp1], " #J "+2(%[ppiq]) \n\t" \
+ "srl %[temp5], %[coeff], 16 \n\t" \
+ "mul %[level], %[temp5], %[temp1] \n\t" \
+ - "lw %[temp2], "#K"+4(%[ppbias]) \n\t" \
+ - "lhu %[temp3], "#J"+2(%[ppq]) \n\t" \
+ + "lw %[temp2], " #K "+4(%[ppbias]) \n\t" \
+ + "lhu %[temp3], " #J "+2(%[ppq]) \n\t" \
+ "addu %[level], %[level], %[temp2] \n\t" \
+ "sra %[level], %[level], 17 \n\t" \
+ "srl %[temp6], %[sign], 16 \n\t" \
+ @@ -1233,20 +1233,20 @@ static int SSE4x4(const uint8_t* a, const uint8_t* b) {
+ "xor %[level], %[level], %[temp6] \n\t" \
+ "subu %[level], %[level], %[temp6] \n\t" \
+ "mul %[temp5], %[level], %[temp3] \n\t" \
+ - "sh $0, "#J"(%[ppin]) \n\t" \
+ - "sh $0, "#N"(%[pout]) \n\t" \
+ + "sh $0, " #J "(%[ppin]) \n\t" \
+ + "sh $0, " #N "(%[pout]) \n\t" \
+ "or %[ret], %[ret], %[level] \n\t" \
+ - "sh %[temp5], "#J"+2(%[ppin]) \n\t" \
+ - "sh %[level], "#N1"(%[pout]) \n\t" \
+ + "sh %[temp5], " #J "+2(%[ppin]) \n\t" \
+ + "sh %[level], " #N1 "(%[pout]) \n\t" \
+ "j 3f \n\t" \
+ "1: \n\t" \
+ - "lhu %[temp1], "#J"(%[ppiq]) \n\t" \
+ - "lw %[temp2], "#K"(%[ppbias]) \n\t" \
+ - "ulw %[temp3], "#J"(%[ppq]) \n\t" \
+ + "lhu %[temp1], " #J "(%[ppiq]) \n\t" \
+ + "lw %[temp2], " #K "(%[ppbias]) \n\t" \
+ + "ulw %[temp3], " #J "(%[ppq]) \n\t" \
+ "andi %[temp5], %[coeff], 0xffff \n\t" \
+ "srl %[temp0], %[coeff], 16 \n\t" \
+ - "lhu %[temp6], "#J"+2(%[ppiq]) \n\t" \
+ - "lw %[coeff], "#K"+4(%[ppbias]) \n\t" \
+ + "lhu %[temp6], " #J "+2(%[ppiq]) \n\t" \
+ + "lw %[coeff], " #K "+4(%[ppbias]) \n\t" \
+ "mul %[level], %[temp5], %[temp1] \n\t" \
+ "mul %[temp4], %[temp0], %[temp6] \n\t" \
+ "addu %[level], %[level], %[temp2] \n\t" \
+ @@ -1259,15 +1259,15 @@ static int SSE4x4(const uint8_t* a, const uint8_t* b) {
+ "subu.ph %[level], %[level], %[sign] \n\t" \
+ "mul.ph %[temp3], %[level], %[temp3] \n\t" \
+ "or %[ret], %[ret], %[level] \n\t" \
+ - "sh %[level], "#N"(%[pout]) \n\t" \
+ + "sh %[level], " #N "(%[pout]) \n\t" \
+ "srl %[level], %[level], 16 \n\t" \
+ - "sh %[level], "#N1"(%[pout]) \n\t" \
+ - "usw %[temp3], "#J"(%[ppin]) \n\t" \
+ + "sh %[level], " #N1 "(%[pout]) \n\t" \
+ + "usw %[temp3], " #J "(%[ppin]) \n\t" \
+ "j 3f \n\t" \
+ "0: \n\t" \
+ - "sh $0, "#N"(%[pout]) \n\t" \
+ - "sh $0, "#N1"(%[pout]) \n\t" \
+ - "usw $0, "#J"(%[ppin]) \n\t" \
+ + "sh $0, " #N "(%[pout]) \n\t" \
+ + "sh $0, " #N1 "(%[pout]) \n\t" \
+ + "usw $0, " #J "(%[ppin]) \n\t" \
+ "3: \n\t"
+
+ static int QuantizeBlock(int16_t in[16], int16_t out[16],
+ @@ -1326,37 +1326,37 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ // A, B, C, D - offset in bytes to load from in buffer
+ // TEMP0, TEMP1 - registers for corresponding tmp elements
+ #define HORIZONTAL_PASS_WHT(A, B, C, D, TEMP0, TEMP1) \
+ - "lh %["#TEMP0"], "#A"(%[in]) \n\t" \
+ - "lh %["#TEMP1"], "#B"(%[in]) \n\t" \
+ - "lh %[temp8], "#C"(%[in]) \n\t" \
+ - "lh %[temp9], "#D"(%[in]) \n\t" \
+ - "ins %["#TEMP1"], %["#TEMP0"], 16, 16 \n\t" \
+ + "lh %[" #TEMP0 "], " #A "(%[in]) \n\t" \
+ + "lh %[" #TEMP1 "], " #B "(%[in]) \n\t" \
+ + "lh %[temp8], " #C "(%[in]) \n\t" \
+ + "lh %[temp9], " #D "(%[in]) \n\t" \
+ + "ins %[" #TEMP1 "], %[" #TEMP0 "], 16, 16 \n\t" \
+ "ins %[temp9], %[temp8], 16, 16 \n\t" \
+ - "subq.ph %[temp8], %["#TEMP1"], %[temp9] \n\t" \
+ - "addq.ph %[temp9], %["#TEMP1"], %[temp9] \n\t" \
+ - "precrq.ph.w %["#TEMP0"], %[temp8], %[temp9] \n\t" \
+ + "subq.ph %[temp8], %[" #TEMP1 "], %[temp9] \n\t" \
+ + "addq.ph %[temp9], %[" #TEMP1 "], %[temp9] \n\t" \
+ + "precrq.ph.w %[" #TEMP0 "], %[temp8], %[temp9] \n\t" \
+ "append %[temp8], %[temp9], 16 \n\t" \
+ - "subq.ph %["#TEMP1"], %["#TEMP0"], %[temp8] \n\t" \
+ - "addq.ph %["#TEMP0"], %["#TEMP0"], %[temp8] \n\t" \
+ - "rotr %["#TEMP1"], %["#TEMP1"], 16 \n\t"
+ + "subq.ph %[" #TEMP1 "], %[" #TEMP0 "], %[temp8] \n\t" \
+ + "addq.ph %[" #TEMP0 "], %[" #TEMP0 "], %[temp8] \n\t" \
+ + "rotr %[" #TEMP1 "], %[" #TEMP1 "], 16 \n\t"
+
+ // macro for one vertical pass in FTransformWHT
+ // temp0..temp7 holds tmp[0]..tmp[15]
+ // A, B, C, D - offsets in bytes to store to out buffer
+ // TEMP0, TEMP2, TEMP4 and TEMP6 - registers for corresponding tmp elements
+ #define VERTICAL_PASS_WHT(A, B, C, D, TEMP0, TEMP2, TEMP4, TEMP6) \
+ - "addq.ph %[temp8], %["#TEMP0"], %["#TEMP4"] \n\t" \
+ - "addq.ph %[temp9], %["#TEMP2"], %["#TEMP6"] \n\t" \
+ - "subq.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP6"] \n\t" \
+ - "subq.ph %["#TEMP6"], %["#TEMP0"], %["#TEMP4"] \n\t" \
+ - "addqh.ph %["#TEMP0"], %[temp8], %[temp9] \n\t" \
+ - "subqh.ph %["#TEMP4"], %["#TEMP6"], %["#TEMP2"] \n\t" \
+ - "addqh.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP6"] \n\t" \
+ - "subqh.ph %["#TEMP6"], %[temp8], %[temp9] \n\t" \
+ - "usw %["#TEMP0"], "#A"(%[out]) \n\t" \
+ - "usw %["#TEMP2"], "#B"(%[out]) \n\t" \
+ - "usw %["#TEMP4"], "#C"(%[out]) \n\t" \
+ - "usw %["#TEMP6"], "#D"(%[out]) \n\t"
+ + "addq.ph %[temp8], %[" #TEMP0 "], %[" #TEMP4 "] \n\t" \
+ + "addq.ph %[temp9], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \
+ + "subq.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \
+ + "subq.ph %[" #TEMP6 "], %[" #TEMP0 "], %[" #TEMP4 "] \n\t" \
+ + "addqh.ph %[" #TEMP0 "], %[temp8], %[temp9] \n\t" \
+ + "subqh.ph %[" #TEMP4 "], %[" #TEMP6 "], %[" #TEMP2 "] \n\t" \
+ + "addqh.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \
+ + "subqh.ph %[" #TEMP6 "], %[temp8], %[temp9] \n\t" \
+ + "usw %[" #TEMP0 "], " #A "(%[out]) \n\t" \
+ + "usw %[" #TEMP2 "], " #B "(%[out]) \n\t" \
+ + "usw %[" #TEMP4 "], " #C "(%[out]) \n\t" \
+ + "usw %[" #TEMP6 "], " #D "(%[out]) \n\t"
+
+ static void FTransformWHT(const int16_t* in, int16_t* out) {
+ int temp0, temp1, temp2, temp3, temp4;
+ @@ -1385,10 +1385,10 @@ static void FTransformWHT(const int16_t* in, int16_t* out) {
+ // convert 8 coeffs at time
+ // A, B, C, D - offsets in bytes to load from out buffer
+ #define CONVERT_COEFFS_TO_BIN(A, B, C, D) \
+ - "ulw %[temp0], "#A"(%[out]) \n\t" \
+ - "ulw %[temp1], "#B"(%[out]) \n\t" \
+ - "ulw %[temp2], "#C"(%[out]) \n\t" \
+ - "ulw %[temp3], "#D"(%[out]) \n\t" \
+ + "ulw %[temp0], " #A "(%[out]) \n\t" \
+ + "ulw %[temp1], " #B "(%[out]) \n\t" \
+ + "ulw %[temp2], " #C "(%[out]) \n\t" \
+ + "ulw %[temp3], " #D "(%[out]) \n\t" \
+ "absq_s.ph %[temp0], %[temp0] \n\t" \
+ "absq_s.ph %[temp1], %[temp1] \n\t" \
+ "absq_s.ph %[temp2], %[temp2] \n\t" \
+ diff --git a/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
+ index 6c34efb..6a1f8f4 100644
+ --- a/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
+ @@ -48,7 +48,7 @@
+ "srl %[temp0], %[length], 0x2 \n\t" \
+ "beqz %[temp0], 4f \n\t" \
+ " andi %[temp6], %[length], 0x3 \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "lbu %[temp1], -1(%[src]) \n\t" \
+ "1: \n\t" \
+ "lbu %[temp2], 0(%[src]) \n\t" \
+ @@ -84,7 +84,7 @@
+ "lbu %[temp1], -1(%[src]) \n\t" \
+ "lbu %[temp2], 0(%[src]) \n\t" \
+ "addiu %[src], %[src], 1 \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "addu %[temp3], %[temp1], %[temp2] \n\t" \
+ "sb %[temp3], -1(%[src]) \n\t" \
+ ".else \n\t" \
+ @@ -131,7 +131,7 @@ static WEBP_INLINE void PredictLine(const uint8_t* src, uint8_t* dst,
+ "ulw %[temp3], 4(%[src]) \n\t" \
+ "ulw %[temp4], 4(%[pred]) \n\t" \
+ "addiu %[src], %[src], 8 \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "addu.qb %[temp5], %[temp1], %[temp2] \n\t" \
+ "addu.qb %[temp6], %[temp3], %[temp4] \n\t" \
+ ".else \n\t" \
+ @@ -152,7 +152,7 @@ static WEBP_INLINE void PredictLine(const uint8_t* src, uint8_t* dst,
+ "lbu %[temp2], 0(%[pred]) \n\t" \
+ "addiu %[src], %[src], 1 \n\t" \
+ "addiu %[pred], %[pred], 1 \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "addu %[temp3], %[temp1], %[temp2] \n\t" \
+ ".else \n\t" \
+ "subu %[temp3], %[temp1], %[temp2] \n\t" \
+ @@ -177,7 +177,7 @@ static WEBP_INLINE void PredictLine(const uint8_t* src, uint8_t* dst,
+ __asm__ volatile ( \
+ "lbu %[temp1], 0(%[src]) \n\t" \
+ "lbu %[temp2], 0(%[pred]) \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "addu %[temp3], %[temp1], %[temp2] \n\t" \
+ ".else \n\t" \
+ "subu %[temp3], %[temp1], %[temp2] \n\t" \
+ diff --git a/Source/LibWebP/src/dsp/dsp.lossless_mips32.c b/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
+ index 68fbe85..abe97c1 100644
+ --- a/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
+ +++ b/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
+ @@ -285,28 +285,28 @@ static VP8LStreaks HuffmanCostCombinedCount(const uint32_t* X,
+ // literal_ and successive histograms could be unaligned
+ // so we must use ulw and usw
+ #define ADD_TO_OUT(A, B, C, D, E, P0, P1, P2) \
+ - "ulw %[temp0], "#A"(%["#P0"]) \n\t" \
+ - "ulw %[temp1], "#B"(%["#P0"]) \n\t" \
+ - "ulw %[temp2], "#C"(%["#P0"]) \n\t" \
+ - "ulw %[temp3], "#D"(%["#P0"]) \n\t" \
+ - "ulw %[temp4], "#A"(%["#P1"]) \n\t" \
+ - "ulw %[temp5], "#B"(%["#P1"]) \n\t" \
+ - "ulw %[temp6], "#C"(%["#P1"]) \n\t" \
+ - "ulw %[temp7], "#D"(%["#P1"]) \n\t" \
+ + "ulw %[temp0], " #A "(%[" #P0 "]) \n\t" \
+ + "ulw %[temp1], " #B "(%[" #P0 "]) \n\t" \
+ + "ulw %[temp2], " #C "(%[" #P0 "]) \n\t" \
+ + "ulw %[temp3], " #D "(%[" #P0 "]) \n\t" \
+ + "ulw %[temp4], " #A "(%[" #P1 "]) \n\t" \
+ + "ulw %[temp5], " #B "(%[" #P1 "]) \n\t" \
+ + "ulw %[temp6], " #C "(%[" #P1 "]) \n\t" \
+ + "ulw %[temp7], " #D "(%[" #P1 "]) \n\t" \
+ "addu %[temp4], %[temp4], %[temp0] \n\t" \
+ "addu %[temp5], %[temp5], %[temp1] \n\t" \
+ "addu %[temp6], %[temp6], %[temp2] \n\t" \
+ "addu %[temp7], %[temp7], %[temp3] \n\t" \
+ - "addiu %["#P0"], %["#P0"], 16 \n\t" \
+ - ".if "#E" == 1 \n\t" \
+ - "addiu %["#P1"], %["#P1"], 16 \n\t" \
+ + "addiu %[" #P0 "], %[" #P0 "], 16 \n\t" \
+ + ".if " #E " == 1 \n\t" \
+ + "addiu %[" #P1 "], %[" #P1 "], 16 \n\t" \
+ ".endif \n\t" \
+ - "usw %[temp4], "#A"(%["#P2"]) \n\t" \
+ - "usw %[temp5], "#B"(%["#P2"]) \n\t" \
+ - "usw %[temp6], "#C"(%["#P2"]) \n\t" \
+ - "usw %[temp7], "#D"(%["#P2"]) \n\t" \
+ - "addiu %["#P2"], %["#P2"], 16 \n\t" \
+ - "bne %["#P0"], %[LoopEnd], 1b \n\t" \
+ + "usw %[temp4], " #A "(%[" #P2 "]) \n\t" \
+ + "usw %[temp5], " #B "(%[" #P2 "]) \n\t" \
+ + "usw %[temp6], " #C "(%[" #P2 "]) \n\t" \
+ + "usw %[temp7], " #D "(%[" #P2 "]) \n\t" \
+ + "addiu %[" #P2 "], %[" #P2 "], 16 \n\t" \
+ + "bne %[" #P0 "], %[LoopEnd], 1b \n\t" \
+ ".set pop \n\t" \
+
+ #define ASM_END_COMMON_0 \
+ diff --git a/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
+ index 821cda9..31ac181 100644
+ --- a/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
+ @@ -29,14 +29,14 @@ static void FUNC_NAME(const TYPE* src, \
+ for (x = 0; x < (width >> 2); ++x) { \
+ int tmp1, tmp2, tmp3, tmp4; \
+ __asm__ volatile ( \
+ - ".ifc "#TYPE", uint8_t \n\t" \
+ + ".ifc " #TYPE ", uint8_t \n\t" \
+ "lbu %[tmp1], 0(%[src]) \n\t" \
+ "lbu %[tmp2], 1(%[src]) \n\t" \
+ "lbu %[tmp3], 2(%[src]) \n\t" \
+ "lbu %[tmp4], 3(%[src]) \n\t" \
+ "addiu %[src], %[src], 4 \n\t" \
+ ".endif \n\t" \
+ - ".ifc "#TYPE", uint32_t \n\t" \
+ + ".ifc " #TYPE ", uint32_t \n\t" \
+ "lw %[tmp1], 0(%[src]) \n\t" \
+ "lw %[tmp2], 4(%[src]) \n\t" \
+ "lw %[tmp3], 8(%[src]) \n\t" \
+ @@ -55,7 +55,7 @@ static void FUNC_NAME(const TYPE* src, \
+ "lwx %[tmp2], %[tmp2](%[color_map]) \n\t" \
+ "lwx %[tmp3], %[tmp3](%[color_map]) \n\t" \
+ "lwx %[tmp4], %[tmp4](%[color_map]) \n\t" \
+ - ".ifc "#TYPE", uint8_t \n\t" \
+ + ".ifc " #TYPE ", uint8_t \n\t" \
+ "ext %[tmp1], %[tmp1], 8, 8 \n\t" \
+ "ext %[tmp2], %[tmp2], 8, 8 \n\t" \
+ "ext %[tmp3], %[tmp3], 8, 8 \n\t" \
+ @@ -66,7 +66,7 @@ static void FUNC_NAME(const TYPE* src, \
+ "sb %[tmp4], 3(%[dst]) \n\t" \
+ "addiu %[dst], %[dst], 4 \n\t" \
+ ".endif \n\t" \
+ - ".ifc "#TYPE", uint32_t \n\t" \
+ + ".ifc " #TYPE ", uint32_t \n\t" \
+ "sw %[tmp1], 0(%[dst]) \n\t" \
+ "sw %[tmp2], 4(%[dst]) \n\t" \
+ "sw %[tmp3], 8(%[dst]) \n\t" \
+ diff --git a/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
+ index a7864a0..cb3adfe 100644
+ --- a/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
+ @@ -34,15 +34,15 @@
+ G = G - t2 + kGCst; \
+ B = B + kBCst; \
+ __asm__ volatile ( \
+ - "shll_s.w %["#R"], %["#R"], 9 \n\t" \
+ - "shll_s.w %["#G"], %["#G"], 9 \n\t" \
+ - "shll_s.w %["#B"], %["#B"], 9 \n\t" \
+ - "precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \
+ - "precrqu_s.qb.ph %["#G"], %["#G"], $zero \n\t" \
+ - "precrqu_s.qb.ph %["#B"], %["#B"], $zero \n\t" \
+ - "srl %["#R"], %["#R"], 24 \n\t" \
+ - "srl %["#G"], %["#G"], 24 \n\t" \
+ - "srl %["#B"], %["#B"], 24 \n\t" \
+ + "shll_s.w %[" #R "], %[" #R "], 9 \n\t" \
+ + "shll_s.w %[" #G "], %[" #G "], 9 \n\t" \
+ + "shll_s.w %[" #B "], %[" #B "], 9 \n\t" \
+ + "precrqu_s.qb.ph %[" #R "], %[" #R "], $zero \n\t" \
+ + "precrqu_s.qb.ph %[" #G "], %[" #G "], $zero \n\t" \
+ + "precrqu_s.qb.ph %[" #B "], %[" #B "], $zero \n\t" \
+ + "srl %[" #R "], %[" #R "], 24 \n\t" \
+ + "srl %[" #G "], %[" #G "], 24 \n\t" \
+ + "srl %[" #B "], %[" #B "], 24 \n\t" \
+ : [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \
+ : \
+ ); \
+ diff --git a/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
+ index 66adde5..51cbe9e 100644
+ --- a/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
+ @@ -39,12 +39,12 @@
+ "addu %[temp5], %[temp0], %[temp1] \n\t" \
+ "subu %[temp6], %[temp0], %[temp2] \n\t" \
+ "addu %[temp7], %[temp0], %[temp4] \n\t" \
+ -".if "#K" \n\t" \
+ +".if " #K " \n\t" \
+ "lbu %[temp0], 1(%[y]) \n\t" \
+ ".endif \n\t" \
+ "shll_s.w %[temp5], %[temp5], 9 \n\t" \
+ "shll_s.w %[temp6], %[temp6], 9 \n\t" \
+ -".if "#K" \n\t" \
+ +".if " #K " \n\t" \
+ "mul %[temp0], %[t_con_5], %[temp0] \n\t" \
+ ".endif \n\t" \
+ "shll_s.w %[temp7], %[temp7], 9 \n\t" \
+ @@ -54,9 +54,9 @@
+ "srl %[temp5], %[temp5], 24 \n\t" \
+ "srl %[temp6], %[temp6], 24 \n\t" \
+ "srl %[temp7], %[temp7], 24 \n\t" \
+ - "sb %[temp5], "#R"(%[dst]) \n\t" \
+ - "sb %[temp6], "#G"(%[dst]) \n\t" \
+ - "sb %[temp7], "#B"(%[dst]) \n\t" \
+ + "sb %[temp5], " #R "(%[dst]) \n\t" \
+ + "sb %[temp6], " #G "(%[dst]) \n\t" \
+ + "sb %[temp7], " #B "(%[dst]) \n\t" \
+
+ #define ASM_CLOBBER_LIST() \
+ : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), \
+ --
+ 2.1.4
+
diff --git a/testing/freeimage/0004-fix-gcc-6.patch b/testing/freeimage/0004-fix-gcc-6.patch
new file mode 100644
index 0000000..7b442ab
--- /dev/null
+++ b/testing/freeimage/0004-fix-gcc-6.patch
@@ -0,0 +1,31 @@
+ libraw/dc_raw: fix gcc-6 failures
+
+ With gcc-6, it is no longer allowed to narrow the type of constants in
+ a constant array declaration.
+
+ Fixes:
+ http://autobuild.buildroot.org/results/081/0811531872f69f9febbdc482dfbdd7fb5c35d1c8/build-end.log
+
+ Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
+
+ diff -durN a/Source/LibRawLite/internal/dcraw_common.cpp b/Source/LibRawLite/internal/dcraw_common.cpp
+ --- a/Source/LibRawLite/internal/dcraw_common.cpp
+ +++ b/Source/LibRawLite/internal/dcraw_common.cpp
+ @@ -2479,7 +2479,7 @@
+
+ void CLASS kodak_radc_load_raw()
+ {
+ - static const char src[] = {
+ + static const signed char src[] = {
+ 1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8,
+ 1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8,
+ 2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8,
+ @@ -4519,7 +4519,7 @@
+ */
+ void CLASS vng_interpolate()
+ {
+ - static const signed char *cp, terms[] = {
+ + static const int *cp, terms[] = {
+ -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01,
+ -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01,
+ -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03,
diff --git a/testing/freeimage/APKBUILD b/testing/freeimage/APKBUILD
new file mode 100644
index 0000000..6655633
--- /dev/null
+++ b/testing/freeimage/APKBUILD
@@ -0,0 +1,41 @@
+ # Contributor: Taner Tas <taner76@gmail.com>
+ # Maintainer: Taner Tas <taner76@gmail.com>
+ pkgname=freeimage
+ pkgver=3.17.0
+ pkgrel=0
+ pkgdesc="Open Source library project for developers who would like to support popular graphics image formats."
+ url="http://freeimage.sourceforge.net/"
+ arch="all"
+ license="GPL"
+ _distname="FreeImage"
+ makedepends="dos2unix"
+ subpackages="$pkgname-dev"
+ source="http://downloads.sourceforge.net/${pkgname}/${_distname}${pkgver//.}.zip
+ 0001-no-root-install.patch
+ 0002-fix-cpuid-x86.patch
+ 0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
+ 0004-fix-gcc-6.patch"
+
+ options="!check"
+
+ prepare() {
+ mv ${srcdir}/${_distname} ${srcdir}/${pkgname}-${pkgver}
+ find "$builddir" -type f -exec dos2unix -q -s {} \;
+ default_prepare
+ }
+
+ build() {
+ cd "$builddir"
+ make
+ }
+
+ package() {
+ cd "$builddir"
+ #sed -i -e 's/-o root -g root//' Makefile.*
+ make DESTDIR="${pkgdir}" install
+ }
+ sha512sums="703c2626c0bcfe73eb40d720f45745208ca9650a7730759680a2b38ad3f6c719a43008477032bc70b76a95761f7d4b6f901b961359d36b54ace906dd78fb391b FreeImage3170.zip
+ 2dc51d700671962339cc1f27c0ad7e679e7ed6233d1534b81d68fcffb6e86960fa182b6916d19da7451bf34b69efe4a1b62b7f335b9802d7799706b766257d59 0001-no-root-install.patch
+ ef88862593bd8d271d11f86ec389c8a92c131ffb03fb7028e87dfddc7ae74e22bef50327175a7dcee9c414df80e84579c59f3b8e1f825d54f0fdc76a0530c06f 0002-fix-cpuid-x86.patch
+ 4208d4f3ee49424d65c5e78c18c424543208a554855a6ea1cafd32e57b7354aa36131ea62a95a6856e19c5c0ef47e7d63616e690246c1b19716dca323c3476cc 0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
+ 75050c6a6b2f30c42e9b5d1326499f4d088e3c79b23c92bea72b60fe6759d1e529b136f599d7de059c433cfc661b189d8dd6e32e9fcb0244fb27153c792d3c0e 0004-fix-gcc-6.patch"
--
2.16.2
---
Unsubscribe: alpine-aports+unsubscribe@lists.alpinelinux.org
Help: alpine-aports+help@lists.alpinelinux.org
---
Hi,
On Tue, Feb 27, 2018 at 10:16 AM, Taner Tas <taner76@gmail.com > wrote:
> [...]
> --- /dev/null
> +++ b/testing/freeimage/APKBUILD
> @@ -0,0 +1,41 @@
> +# Contributor: Taner Tas <taner76@gmail.com >
> +# Maintainer: Taner Tas <taner76@gmail.com >
> +pkgname=freeimage
> +pkgver=3.17.0
> +pkgrel=0
> +pkgdesc="Open Source library project for developers who would like to
> support popular graphics image formats."
> +url="http://freeimage.sourceforge.net/"
> +arch="all"
> +license="GPL"
>
The exact license is either "GPL-2.0-only FreeImage" or "GPL-3.0-only
FreeImage": http://freeimage.sourceforge.net/license.html
We use standard abbreviations from https://spdx.org/licenses/
Would you please correct it?
> +_distname="FreeImage"
> +makedepends="dos2unix"
> +subpackages="$pkgname-dev"
> +source="http://downloads.sourceforge.net/${pkgname}/${_
> distname}${pkgver//.}.zip
> + 0001-no-root-install.patch
> + 0002-fix-cpuid-x86.patch
> + 0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
> + 0004-fix-gcc-6.patch"
> +
> +options="!check"
> +
>
Please make sure that is disabled only if does not have a testsuite.
Thanks!
/eo
[alpine-aports] [PATCH v2] testing/freeimage: new aport
---
testing/freeimage/0001-no-root-install.patch | 16 +
testing/freeimage/0002-fix-cpuid-x86.patch | 67 ++
...P-fix-compilation-issue-with-GCC-5.x-C-11.patch | 1172 ++++++++++++++++++++
testing/freeimage/0004-fix-gcc-6.patch | 31 +
testing/freeimage/APKBUILD | 41 +
5 files changed, 1327 insertions(+)
create mode 100644 testing/freeimage/0001-no-root-install.patch
create mode 100644 testing/freeimage/0002-fix-cpuid-x86.patch
create mode 100644 testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
create mode 100644 testing/freeimage/0004-fix-gcc-6.patch
create mode 100644 testing/freeimage/APKBUILD
diff --git a/testing/freeimage/0001-no-root-install.patch b/testing/freeimage/0001-no-root-install.patch
new file mode 100644
index 0000000..d3b062d
--- /dev/null
+++ b/testing/freeimage/0001-no-root-install.patch
@@ -0,0 +1,16 @@
+ diff -ruN a/Makefile.gnu b/Makefile.gnu
+ --- a/Makefile.gnu 2015-04-09 16:34:02.315316841 +0200
+ +++ b/Makefile.gnu 2015-04-09 16:34:28.875483201 +0200
+ @@ -71,9 +71,9 @@
+
+ install:
+ install -d $(INCDIR) $(INSTALLDIR)
+ - install -m 644 -o root -g root $(HEADER) $(INCDIR)
+ - install -m 644 -o root -g root $(STATICLIB) $(INSTALLDIR)
+ - install -m 755 -o root -g root $(SHAREDLIB) $(INSTALLDIR)
+ + install -m 644 $(HEADER) $(INCDIR)
+ + install -m 644 $(STATICLIB) $(INSTALLDIR)
+ + install -m 755 $(SHAREDLIB) $(INSTALLDIR)
+ ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(VERLIBNAME)
+ ln -sf $(VERLIBNAME) $(INSTALLDIR)/$(LIBNAME)
+ # ldconfig
diff --git a/testing/freeimage/0002-fix-cpuid-x86.patch b/testing/freeimage/0002-fix-cpuid-x86.patch
new file mode 100644
index 0000000..98b0e9c
--- /dev/null
+++ b/testing/freeimage/0002-fix-cpuid-x86.patch
@@ -0,0 +1,67 @@
+ Fix build issue caused by invalid register usage on x86
+
+ Patch taken from https://github.com/openexr/openexr/issues/128.
+
+ Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+ Index: b/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
+ ===================================================================
+ --- a/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
+ +++ b/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
+ @@ -40,21 +40,19 @@
+
+ namespace {
+ #if defined(IMF_HAVE_SSE2) && defined(__GNUC__)
+ -
+ +#include <cpuid.h>
+ // Helper functions for gcc + SSE enabled
+ - void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx)
+ + void cpuid(unsigned int n, unsigned int &eax, unsigned int &ebx,
+ + unsigned int &ecx, unsigned int &edx)
+ {
+ - __asm__ __volatile__ (
+ - "cpuid"
+ - : /* Output */ "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
+ - : /* Input */ "a"(n)
+ - : /* Clobber */);
+ + __get_cpuid(n, &eax, &ebx, &ecx, &edx);
+ }
+
+ #else // IMF_HAVE_SSE2 && __GNUC__
+
+ // Helper functions for generic compiler - all disabled
+ - void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx)
+ + void cpuid(unsigned int n, unsigned int &eax, unsigned int &ebx,
+ + unsigned int &ecx, unsigned int &edx)
+ {
+ eax = ebx = ecx = edx = 0;
+ }
+ @@ -64,7 +62,7 @@
+
+ #ifdef OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX
+
+ - void xgetbv(int n, int &eax, int &edx)
+ + void xgetbv(unsigned int n, unsigned int &eax, unsigned int &edx)
+ {
+ __asm__ __volatile__ (
+ "xgetbv"
+ @@ -75,7 +73,7 @@
+
+ #else // OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX
+
+ - void xgetbv(int n, int &eax, int &edx)
+ + void xgetbv(unsigned int n, unsigned int &eax, unsigned int &edx)
+ {
+ eax = edx = 0;
+ }
+ @@ -94,8 +92,8 @@
+ f16c(false)
+ {
+ bool osxsave = false;
+ - int max = 0;
+ - int eax, ebx, ecx, edx;
+ + unsigned int max = 0;
+ + unsigned int eax, ebx, ecx, edx;
+
+ cpuid(0, max, ebx, ecx, edx);
+ if (max > 0)
diff --git a/testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch b/testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
new file mode 100644
index 0000000..20c11ea
--- /dev/null
+++ b/testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
@@ -0,0 +1,1172 @@
+ From 44bce1b66c1cdd5308ac3ac773ea0a53d83790fd Mon Sep 17 00:00:00 2001
+ From: Peter Korsgaard <peter@korsgaard.com>
+ Date: Tue, 24 Nov 2015 21:16:39 +0100
+ Subject: [PATCH] LibWebP: fix compilation issue with GCC 5.x / C++11
+
+ GCC 5.1 / C++11 gets confused about the "#<TEXT>" in the inline assembly
+ code, and dies with errors like:
+
+ Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:34: error: invalid
+ character ' ' in raw string delimiter
+
+ Fix it by introducting white space around the string literals like it has
+ been done in upstream webp:
+
+ https://chromium.googlesource.com/webm/libwebp/+/eebaf97f5a1cb713d81d311308d8a48c124e5aef
+
+ Discussed upstream:
+ http://sourceforge.net/p/freeimage/discussion/36110/thread/605ef8e4/
+
+ [Scripted by sed -i 's/"\(#[A-Z0-9]*\)"/" \1 "/g' *.c]
+ Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
+ ---
+ Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c | 28 +-
+ Source/LibWebP/src/dsp/dsp.enc_mips32.c | 314 ++++++++++-----------
+ Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c | 288 +++++++++----------
+ Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c | 10 +-
+ Source/LibWebP/src/dsp/dsp.lossless_mips32.c | 34 +--
+ Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c | 8 +-
+ .../LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c | 18 +-
+ Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c | 10 +-
+ 8 files changed, 355 insertions(+), 355 deletions(-)
+
+ diff --git a/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
+ index dac2c93..aaa8111 100644
+ --- a/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
+ @@ -548,10 +548,10 @@ static void SimpleVFilter16(uint8_t* p, int stride, int thresh) {
+ // TEMP3 = SRC[D + D1 * BPS]
+ #define LOAD_4_BYTES(TEMP0, TEMP1, TEMP2, TEMP3, \
+ A, A1, B, B1, C, C1, D, D1, SRC) \
+ - "lbu %["#TEMP0"], "#A"+"#A1"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ - "lbu %["#TEMP1"], "#B"+"#B1"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ - "lbu %["#TEMP2"], "#C"+"#C1"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ - "lbu %["#TEMP3"], "#D"+"#D1"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ + "lbu %[" #TEMP0 "], " #A "+" #A1 "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+ + "lbu %[" #TEMP1 "], " #B "+" #B1 "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+ + "lbu %[" #TEMP2 "], " #C "+" #C1 "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+ + "lbu %[" #TEMP3 "], " #D "+" #D1 "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+
+ static void SimpleHFilter16(uint8_t* p, int stride, int thresh) {
+ int i;
+ @@ -623,8 +623,8 @@ static void SimpleHFilter16i(uint8_t* p, int stride, int thresh) {
+ // DST[A * BPS] = TEMP0
+ // DST[B + C * BPS] = TEMP1
+ #define STORE_8_BYTES(TEMP0, TEMP1, A, B, C, DST) \
+ - "usw %["#TEMP0"], "#A"*"XSTR(BPS)"(%["#DST"]) \n\t" \
+ - "usw %["#TEMP1"], "#B"+"#C"*"XSTR(BPS)"(%["#DST"]) \n\t"
+ + "usw %[" #TEMP0 "], " #A "*"XSTR(BPS)"(%[" #DST "]) \n\t" \
+ + "usw %[" #TEMP1 "], " #B "+" #C "*"XSTR(BPS)"(%[" #DST "]) \n\t"
+
+ static void VE4(uint8_t* dst) { // vertical
+ const uint8_t* top = dst - BPS;
+ @@ -725,8 +725,8 @@ static void RD4(uint8_t* dst) { // Down-right
+ // TEMP0 = SRC[A * BPS]
+ // TEMP1 = SRC[B + C * BPS]
+ #define LOAD_8_BYTES(TEMP0, TEMP1, A, B, C, SRC) \
+ - "ulw %["#TEMP0"], "#A"*"XSTR(BPS)"(%["#SRC"]) \n\t" \
+ - "ulw %["#TEMP1"], "#B"+"#C"*"XSTR(BPS)"(%["#SRC"]) \n\t"
+ + "ulw %[" #TEMP0 "], " #A "*"XSTR(BPS)"(%[" #SRC "]) \n\t" \
+ + "ulw %[" #TEMP1 "], " #B "+" #C "*"XSTR(BPS)"(%[" #SRC "]) \n\t"
+
+ static void LD4(uint8_t* dst) { // Down-Left
+ int temp0, temp1, temp2, temp3, temp4;
+ @@ -873,24 +873,24 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with no top samples
+ #define CLIPPING(SIZE) \
+ "preceu.ph.qbl %[temp2], %[temp0] \n\t" \
+ "preceu.ph.qbr %[temp0], %[temp0] \n\t" \
+ -".if "#SIZE" == 8 \n\t" \
+ +".if " #SIZE " == 8 \n\t" \
+ "preceu.ph.qbl %[temp3], %[temp1] \n\t" \
+ "preceu.ph.qbr %[temp1], %[temp1] \n\t" \
+ ".endif \n\t" \
+ "addu.ph %[temp2], %[temp2], %[dst_1] \n\t" \
+ "addu.ph %[temp0], %[temp0], %[dst_1] \n\t" \
+ -".if "#SIZE" == 8 \n\t" \
+ +".if " #SIZE " == 8 \n\t" \
+ "addu.ph %[temp3], %[temp3], %[dst_1] \n\t" \
+ "addu.ph %[temp1], %[temp1], %[dst_1] \n\t" \
+ ".endif \n\t" \
+ "shll_s.ph %[temp2], %[temp2], 7 \n\t" \
+ "shll_s.ph %[temp0], %[temp0], 7 \n\t" \
+ -".if "#SIZE" == 8 \n\t" \
+ +".if " #SIZE " == 8 \n\t" \
+ "shll_s.ph %[temp3], %[temp3], 7 \n\t" \
+ "shll_s.ph %[temp1], %[temp1], 7 \n\t" \
+ ".endif \n\t" \
+ "precrqu_s.qb.ph %[temp0], %[temp2], %[temp0] \n\t" \
+ -".if "#SIZE" == 8 \n\t" \
+ +".if " #SIZE " == 8 \n\t" \
+ "precrqu_s.qb.ph %[temp1], %[temp3], %[temp1] \n\t" \
+ ".endif \n\t"
+
+ @@ -899,7 +899,7 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with no top samples
+ int dst_1 = ((int)(DST)[-1] << 16) + (DST)[-1]; \
+ int temp0, temp1, temp2, temp3; \
+ __asm__ volatile ( \
+ - ".if "#SIZE" < 8 \n\t" \
+ + ".if " #SIZE " < 8 \n\t" \
+ "ulw %[temp0], 0(%[top]) \n\t" \
+ "subu.ph %[dst_1], %[dst_1], %[top_1] \n\t" \
+ CLIPPING(4) \
+ @@ -911,7 +911,7 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with no top samples
+ CLIPPING(8) \
+ "usw %[temp0], 0(%[dst]) \n\t" \
+ "usw %[temp1], 4(%[dst]) \n\t" \
+ - ".if "#SIZE" == 16 \n\t" \
+ + ".if " #SIZE " == 16 \n\t" \
+ "ulw %[temp0], 8(%[top]) \n\t" \
+ "ulw %[temp1], 12(%[top]) \n\t" \
+ CLIPPING(8) \
+ diff --git a/Source/LibWebP/src/dsp/dsp.enc_mips32.c b/Source/LibWebP/src/dsp/dsp.enc_mips32.c
+ index 545aa3a..bf1c16d 100644
+ --- a/Source/LibWebP/src/dsp/dsp.enc_mips32.c
+ +++ b/Source/LibWebP/src/dsp/dsp.enc_mips32.c
+ @@ -31,26 +31,26 @@ static const int kC2 = 35468;
+ // TEMP0..TEMP3 - registers for corresponding tmp elements
+ // TEMP4..TEMP5 - temporary registers
+ #define VERTICAL_PASS(A, B, C, D, TEMP4, TEMP0, TEMP1, TEMP2, TEMP3) \
+ - "lh %[temp16], "#A"(%[temp20]) \n\t" \
+ - "lh %[temp18], "#B"(%[temp20]) \n\t" \
+ - "lh %[temp17], "#C"(%[temp20]) \n\t" \
+ - "lh %[temp19], "#D"(%[temp20]) \n\t" \
+ - "addu %["#TEMP4"], %[temp16], %[temp18] \n\t" \
+ + "lh %[temp16], " #A "(%[temp20]) \n\t" \
+ + "lh %[temp18], " #B "(%[temp20]) \n\t" \
+ + "lh %[temp17], " #C "(%[temp20]) \n\t" \
+ + "lh %[temp19], " #D "(%[temp20]) \n\t" \
+ + "addu %[" #TEMP4 "], %[temp16], %[temp18] \n\t" \
+ "subu %[temp16], %[temp16], %[temp18] \n\t" \
+ - "mul %["#TEMP0"], %[temp17], %[kC2] \n\t" \
+ + "mul %[" #TEMP0 "], %[temp17], %[kC2] \n\t" \
+ "mul %[temp18], %[temp19], %[kC1] \n\t" \
+ "mul %[temp17], %[temp17], %[kC1] \n\t" \
+ "mul %[temp19], %[temp19], %[kC2] \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 16 \n\n" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\n" \
+ "sra %[temp18], %[temp18], 16 \n\n" \
+ "sra %[temp17], %[temp17], 16 \n\n" \
+ "sra %[temp19], %[temp19], 16 \n\n" \
+ - "subu %["#TEMP2"], %["#TEMP0"], %[temp18] \n\t" \
+ - "addu %["#TEMP3"], %[temp17], %[temp19] \n\t" \
+ - "addu %["#TEMP0"], %["#TEMP4"], %["#TEMP3"] \n\t" \
+ - "addu %["#TEMP1"], %[temp16], %["#TEMP2"] \n\t" \
+ - "subu %["#TEMP2"], %[temp16], %["#TEMP2"] \n\t" \
+ - "subu %["#TEMP3"], %["#TEMP4"], %["#TEMP3"] \n\t"
+ + "subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp18] \n\t" \
+ + "addu %[" #TEMP3 "], %[temp17], %[temp19] \n\t" \
+ + "addu %[" #TEMP0 "], %[" #TEMP4 "], %[" #TEMP3 "] \n\t" \
+ + "addu %[" #TEMP1 "], %[temp16], %[" #TEMP2 "] \n\t" \
+ + "subu %[" #TEMP2 "], %[temp16], %[" #TEMP2 "] \n\t" \
+ + "subu %[" #TEMP3 "], %[" #TEMP4 "], %[" #TEMP3 "] \n\t"
+
+ // macro for one horizontal pass in ITransformOne
+ // MUL and STORE macros inlined
+ @@ -59,58 +59,58 @@ static const int kC2 = 35468;
+ // A - offset in bytes to load from ref and store to dst buffer
+ // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements
+ #define HORIZONTAL_PASS(A, TEMP0, TEMP4, TEMP8, TEMP12) \
+ - "addiu %["#TEMP0"], %["#TEMP0"], 4 \n\t" \
+ - "addu %[temp16], %["#TEMP0"], %["#TEMP8"] \n\t" \
+ - "subu %[temp17], %["#TEMP0"], %["#TEMP8"] \n\t" \
+ - "mul %["#TEMP0"], %["#TEMP4"], %[kC2] \n\t" \
+ - "mul %["#TEMP8"], %["#TEMP12"], %[kC1] \n\t" \
+ - "mul %["#TEMP4"], %["#TEMP4"], %[kC1] \n\t" \
+ - "mul %["#TEMP12"], %["#TEMP12"], %[kC2] \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 16 \n\t" \
+ - "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t" \
+ - "sra %["#TEMP4"], %["#TEMP4"], 16 \n\t" \
+ - "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t" \
+ - "subu %[temp18], %["#TEMP0"], %["#TEMP8"] \n\t" \
+ - "addu %[temp19], %["#TEMP4"], %["#TEMP12"] \n\t" \
+ - "addu %["#TEMP0"], %[temp16], %[temp19] \n\t" \
+ - "addu %["#TEMP4"], %[temp17], %[temp18] \n\t" \
+ - "subu %["#TEMP8"], %[temp17], %[temp18] \n\t" \
+ - "subu %["#TEMP12"], %[temp16], %[temp19] \n\t" \
+ + "addiu %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \
+ + "addu %[temp16], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
+ + "subu %[temp17], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
+ + "mul %[" #TEMP0 "], %[" #TEMP4 "], %[kC2] \n\t" \
+ + "mul %[" #TEMP8 "], %[" #TEMP12 "], %[kC1] \n\t" \
+ + "mul %[" #TEMP4 "], %[" #TEMP4 "], %[kC1] \n\t" \
+ + "mul %[" #TEMP12 "], %[" #TEMP12 "], %[kC2] \n\t" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\t" \
+ + "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \
+ + "sra %[" #TEMP4 "], %[" #TEMP4 "], 16 \n\t" \
+ + "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \
+ + "subu %[temp18], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
+ + "addu %[temp19], %[" #TEMP4 "], %[" #TEMP12 "] \n\t" \
+ + "addu %[" #TEMP0 "], %[temp16], %[temp19] \n\t" \
+ + "addu %[" #TEMP4 "], %[temp17], %[temp18] \n\t" \
+ + "subu %[" #TEMP8 "], %[temp17], %[temp18] \n\t" \
+ + "subu %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \
+ "lw %[temp20], 0(%[args]) \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 3 \n\t" \
+ - "sra %["#TEMP4"], %["#TEMP4"], 3 \n\t" \
+ - "sra %["#TEMP8"], %["#TEMP8"], 3 \n\t" \
+ - "sra %["#TEMP12"], %["#TEMP12"], 3 \n\t" \
+ - "lbu %[temp16], 0+"XSTR(BPS)"*"#A"(%[temp20]) \n\t" \
+ - "lbu %[temp17], 1+"XSTR(BPS)"*"#A"(%[temp20]) \n\t" \
+ - "lbu %[temp18], 2+"XSTR(BPS)"*"#A"(%[temp20]) \n\t" \
+ - "lbu %[temp19], 3+"XSTR(BPS)"*"#A"(%[temp20]) \n\t" \
+ - "addu %["#TEMP0"], %[temp16], %["#TEMP0"] \n\t" \
+ - "addu %["#TEMP4"], %[temp17], %["#TEMP4"] \n\t" \
+ - "addu %["#TEMP8"], %[temp18], %["#TEMP8"] \n\t" \
+ - "addu %["#TEMP12"], %[temp19], %["#TEMP12"] \n\t" \
+ - "slt %[temp16], %["#TEMP0"], $zero \n\t" \
+ - "slt %[temp17], %["#TEMP4"], $zero \n\t" \
+ - "slt %[temp18], %["#TEMP8"], $zero \n\t" \
+ - "slt %[temp19], %["#TEMP12"], $zero \n\t" \
+ - "movn %["#TEMP0"], $zero, %[temp16] \n\t" \
+ - "movn %["#TEMP4"], $zero, %[temp17] \n\t" \
+ - "movn %["#TEMP8"], $zero, %[temp18] \n\t" \
+ - "movn %["#TEMP12"], $zero, %[temp19] \n\t" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 3 \n\t" \
+ + "sra %[" #TEMP4 "], %[" #TEMP4 "], 3 \n\t" \
+ + "sra %[" #TEMP8 "], %[" #TEMP8 "], 3 \n\t" \
+ + "sra %[" #TEMP12 "], %[" #TEMP12 "], 3 \n\t" \
+ + "lbu %[temp16], 0+"XSTR(BPS)"*" #A "(%[temp20]) \n\t" \
+ + "lbu %[temp17], 1+"XSTR(BPS)"*" #A "(%[temp20]) \n\t" \
+ + "lbu %[temp18], 2+"XSTR(BPS)"*" #A "(%[temp20]) \n\t" \
+ + "lbu %[temp19], 3+"XSTR(BPS)"*" #A "(%[temp20]) \n\t" \
+ + "addu %[" #TEMP0 "], %[temp16], %[" #TEMP0 "] \n\t" \
+ + "addu %[" #TEMP4 "], %[temp17], %[" #TEMP4 "] \n\t" \
+ + "addu %[" #TEMP8 "], %[temp18], %[" #TEMP8 "] \n\t" \
+ + "addu %[" #TEMP12 "], %[temp19], %[" #TEMP12 "] \n\t" \
+ + "slt %[temp16], %[" #TEMP0 "], $zero \n\t" \
+ + "slt %[temp17], %[" #TEMP4 "], $zero \n\t" \
+ + "slt %[temp18], %[" #TEMP8 "], $zero \n\t" \
+ + "slt %[temp19], %[" #TEMP12 "], $zero \n\t" \
+ + "movn %[" #TEMP0 "], $zero, %[temp16] \n\t" \
+ + "movn %[" #TEMP4 "], $zero, %[temp17] \n\t" \
+ + "movn %[" #TEMP8 "], $zero, %[temp18] \n\t" \
+ + "movn %[" #TEMP12 "], $zero, %[temp19] \n\t" \
+ "addiu %[temp20], $zero, 255 \n\t" \
+ - "slt %[temp16], %["#TEMP0"], %[temp20] \n\t" \
+ - "slt %[temp17], %["#TEMP4"], %[temp20] \n\t" \
+ - "slt %[temp18], %["#TEMP8"], %[temp20] \n\t" \
+ - "slt %[temp19], %["#TEMP12"], %[temp20] \n\t" \
+ - "movz %["#TEMP0"], %[temp20], %[temp16] \n\t" \
+ - "movz %["#TEMP4"], %[temp20], %[temp17] \n\t" \
+ + "slt %[temp16], %[" #TEMP0 "], %[temp20] \n\t" \
+ + "slt %[temp17], %[" #TEMP4 "], %[temp20] \n\t" \
+ + "slt %[temp18], %[" #TEMP8 "], %[temp20] \n\t" \
+ + "slt %[temp19], %[" #TEMP12 "], %[temp20] \n\t" \
+ + "movz %[" #TEMP0 "], %[temp20], %[temp16] \n\t" \
+ + "movz %[" #TEMP4 "], %[temp20], %[temp17] \n\t" \
+ "lw %[temp16], 8(%[args]) \n\t" \
+ - "movz %["#TEMP8"], %[temp20], %[temp18] \n\t" \
+ - "movz %["#TEMP12"], %[temp20], %[temp19] \n\t" \
+ - "sb %["#TEMP0"], 0+"XSTR(BPS)"*"#A"(%[temp16]) \n\t" \
+ - "sb %["#TEMP4"], 1+"XSTR(BPS)"*"#A"(%[temp16]) \n\t" \
+ - "sb %["#TEMP8"], 2+"XSTR(BPS)"*"#A"(%[temp16]) \n\t" \
+ - "sb %["#TEMP12"], 3+"XSTR(BPS)"*"#A"(%[temp16]) \n\t"
+ + "movz %[" #TEMP8 "], %[temp20], %[temp18] \n\t" \
+ + "movz %[" #TEMP12 "], %[temp20], %[temp19] \n\t" \
+ + "sb %[" #TEMP0 "], 0+"XSTR(BPS)"*" #A "(%[temp16]) \n\t" \
+ + "sb %[" #TEMP4 "], 1+"XSTR(BPS)"*" #A "(%[temp16]) \n\t" \
+ + "sb %[" #TEMP8 "], 2+"XSTR(BPS)"*" #A "(%[temp16]) \n\t" \
+ + "sb %[" #TEMP12 "], 3+"XSTR(BPS)"*" #A "(%[temp16]) \n\t"
+
+ // Does one or two inverse transforms.
+ static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t* in,
+ @@ -161,9 +161,9 @@ static void ITransform(const uint8_t* ref, const int16_t* in,
+ // K - offset in bytes (kZigzag[n] * 4)
+ // N - offset in bytes (n * 2)
+ #define QUANTIZE_ONE(J, K, N) \
+ - "lh %[temp0], "#J"(%[ppin]) \n\t" \
+ - "lhu %[temp1], "#J"(%[ppsharpen]) \n\t" \
+ - "lw %[temp2], "#K"(%[ppzthresh]) \n\t" \
+ + "lh %[temp0], " #J "(%[ppin]) \n\t" \
+ + "lhu %[temp1], " #J "(%[ppsharpen]) \n\t" \
+ + "lw %[temp2], " #K "(%[ppzthresh]) \n\t" \
+ "sra %[sign], %[temp0], 15 \n\t" \
+ "xor %[coeff], %[temp0], %[sign] \n\t" \
+ "subu %[coeff], %[coeff], %[sign] \n\t" \
+ @@ -172,9 +172,9 @@ static void ITransform(const uint8_t* ref, const int16_t* in,
+ "addiu %[temp5], $zero, 0 \n\t" \
+ "addiu %[level], $zero, 0 \n\t" \
+ "beqz %[temp4], 2f \n\t" \
+ - "lhu %[temp1], "#J"(%[ppiq]) \n\t" \
+ - "lw %[temp2], "#K"(%[ppbias]) \n\t" \
+ - "lhu %[temp3], "#J"(%[ppq]) \n\t" \
+ + "lhu %[temp1], " #J "(%[ppiq]) \n\t" \
+ + "lw %[temp2], " #K "(%[ppbias]) \n\t" \
+ + "lhu %[temp3], " #J "(%[ppq]) \n\t" \
+ "mul %[level], %[coeff], %[temp1] \n\t" \
+ "addu %[level], %[level], %[temp2] \n\t" \
+ "sra %[level], %[level], 17 \n\t" \
+ @@ -184,8 +184,8 @@ static void ITransform(const uint8_t* ref, const int16_t* in,
+ "subu %[level], %[level], %[sign] \n\t" \
+ "mul %[temp5], %[level], %[temp3] \n\t" \
+ "2: \n\t" \
+ - "sh %[temp5], "#J"(%[ppin]) \n\t" \
+ - "sh %[level], "#N"(%[pout]) \n\t"
+ + "sh %[temp5], " #J "(%[ppin]) \n\t" \
+ + "sh %[level], " #N "(%[pout]) \n\t"
+
+ static int QuantizeBlock(int16_t in[16], int16_t out[16],
+ const VP8Matrix* const mtx) {
+ @@ -254,14 +254,14 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ // E..H - offsets in bytes to store first results to tmp buffer
+ // E1..H1 - offsets in bytes to store second results to tmp buffer
+ #define HORIZONTAL_PASS(A, E, F, G, H, E1, F1, G1, H1) \
+ - "lbu %[temp0], 0+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
+ - "lbu %[temp1], 1+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
+ - "lbu %[temp2], 2+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
+ - "lbu %[temp3], 3+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
+ - "lbu %[temp4], 0+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
+ - "lbu %[temp5], 1+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
+ - "lbu %[temp6], 2+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
+ - "lbu %[temp7], 3+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
+ + "lbu %[temp0], 0+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
+ + "lbu %[temp1], 1+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
+ + "lbu %[temp2], 2+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
+ + "lbu %[temp3], 3+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
+ + "lbu %[temp4], 0+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
+ + "lbu %[temp5], 1+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
+ + "lbu %[temp6], 2+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
+ + "lbu %[temp7], 3+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
+ "addu %[temp8], %[temp0], %[temp2] \n\t" \
+ "subu %[temp0], %[temp0], %[temp2] \n\t" \
+ "addu %[temp2], %[temp1], %[temp3] \n\t" \
+ @@ -278,14 +278,14 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ "subu %[temp3], %[temp3], %[temp6] \n\t" \
+ "addu %[temp6], %[temp4], %[temp5] \n\t" \
+ "subu %[temp4], %[temp4], %[temp5] \n\t" \
+ - "sw %[temp7], "#E"(%[tmp]) \n\t" \
+ - "sw %[temp2], "#H"(%[tmp]) \n\t" \
+ - "sw %[temp8], "#F"(%[tmp]) \n\t" \
+ - "sw %[temp0], "#G"(%[tmp]) \n\t" \
+ - "sw %[temp1], "#E1"(%[tmp]) \n\t" \
+ - "sw %[temp3], "#H1"(%[tmp]) \n\t" \
+ - "sw %[temp6], "#F1"(%[tmp]) \n\t" \
+ - "sw %[temp4], "#G1"(%[tmp]) \n\t"
+ + "sw %[temp7], " #E "(%[tmp]) \n\t" \
+ + "sw %[temp2], " #H "(%[tmp]) \n\t" \
+ + "sw %[temp8], " #F "(%[tmp]) \n\t" \
+ + "sw %[temp0], " #G "(%[tmp]) \n\t" \
+ + "sw %[temp1], " #E1 "(%[tmp]) \n\t" \
+ + "sw %[temp3], " #H1 "(%[tmp]) \n\t" \
+ + "sw %[temp6], " #F1 "(%[tmp]) \n\t" \
+ + "sw %[temp4], " #G1 "(%[tmp]) \n\t"
+
+ // macro for one vertical pass in Disto4x4 (TTransform)
+ // two calls of function TTransform are merged into single one
+ @@ -300,10 +300,10 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ // A1..D1 - offsets in bytes to load second results from tmp buffer
+ // E..H - offsets in bytes to load from w buffer
+ #define VERTICAL_PASS(A, B, C, D, A1, B1, C1, D1, E, F, G, H) \
+ - "lw %[temp0], "#A1"(%[tmp]) \n\t" \
+ - "lw %[temp1], "#C1"(%[tmp]) \n\t" \
+ - "lw %[temp2], "#B1"(%[tmp]) \n\t" \
+ - "lw %[temp3], "#D1"(%[tmp]) \n\t" \
+ + "lw %[temp0], " #A1 "(%[tmp]) \n\t" \
+ + "lw %[temp1], " #C1 "(%[tmp]) \n\t" \
+ + "lw %[temp2], " #B1 "(%[tmp]) \n\t" \
+ + "lw %[temp3], " #D1 "(%[tmp]) \n\t" \
+ "addu %[temp8], %[temp0], %[temp1] \n\t" \
+ "subu %[temp0], %[temp0], %[temp1] \n\t" \
+ "addu %[temp1], %[temp2], %[temp3] \n\t" \
+ @@ -324,18 +324,18 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ "subu %[temp1], %[temp1], %[temp5] \n\t" \
+ "subu %[temp0], %[temp0], %[temp6] \n\t" \
+ "subu %[temp8], %[temp8], %[temp7] \n\t" \
+ - "lhu %[temp4], "#E"(%[w]) \n\t" \
+ - "lhu %[temp5], "#F"(%[w]) \n\t" \
+ - "lhu %[temp6], "#G"(%[w]) \n\t" \
+ - "lhu %[temp7], "#H"(%[w]) \n\t" \
+ + "lhu %[temp4], " #E "(%[w]) \n\t" \
+ + "lhu %[temp5], " #F "(%[w]) \n\t" \
+ + "lhu %[temp6], " #G "(%[w]) \n\t" \
+ + "lhu %[temp7], " #H "(%[w]) \n\t" \
+ "madd %[temp4], %[temp3] \n\t" \
+ "madd %[temp5], %[temp1] \n\t" \
+ "madd %[temp6], %[temp0] \n\t" \
+ "madd %[temp7], %[temp8] \n\t" \
+ - "lw %[temp0], "#A"(%[tmp]) \n\t" \
+ - "lw %[temp1], "#C"(%[tmp]) \n\t" \
+ - "lw %[temp2], "#B"(%[tmp]) \n\t" \
+ - "lw %[temp3], "#D"(%[tmp]) \n\t" \
+ + "lw %[temp0], " #A "(%[tmp]) \n\t" \
+ + "lw %[temp1], " #C "(%[tmp]) \n\t" \
+ + "lw %[temp2], " #B "(%[tmp]) \n\t" \
+ + "lw %[temp3], " #D "(%[tmp]) \n\t" \
+ "addu %[temp8], %[temp0], %[temp1] \n\t" \
+ "subu %[temp0], %[temp0], %[temp1] \n\t" \
+ "addu %[temp1], %[temp2], %[temp3] \n\t" \
+ @@ -413,70 +413,70 @@ static int Disto16x16(const uint8_t* const a, const uint8_t* const b,
+ // A - offset in bytes to load from src and ref buffers
+ // TEMP0..TEMP3 - registers for corresponding tmp elements
+ #define HORIZONTAL_PASS(A, TEMP0, TEMP1, TEMP2, TEMP3) \
+ - "lw %["#TEMP1"], 0(%[args]) \n\t" \
+ - "lw %["#TEMP2"], 4(%[args]) \n\t" \
+ - "lbu %[temp16], 0+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "lbu %[temp17], 0+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
+ - "lbu %[temp18], 1+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "lbu %[temp19], 1+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
+ + "lw %[" #TEMP1 "], 0(%[args]) \n\t" \
+ + "lw %[" #TEMP2 "], 4(%[args]) \n\t" \
+ + "lbu %[temp16], 0+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "lbu %[temp17], 0+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
+ + "lbu %[temp18], 1+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "lbu %[temp19], 1+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
+ "subu %[temp20], %[temp16], %[temp17] \n\t" \
+ - "lbu %[temp16], 2+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "lbu %[temp17], 2+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
+ - "subu %["#TEMP0"], %[temp18], %[temp19] \n\t" \
+ - "lbu %[temp18], 3+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "lbu %[temp19], 3+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
+ - "subu %["#TEMP1"], %[temp16], %[temp17] \n\t" \
+ - "subu %["#TEMP2"], %[temp18], %[temp19] \n\t" \
+ - "addu %["#TEMP3"], %[temp20], %["#TEMP2"] \n\t" \
+ - "subu %["#TEMP2"], %[temp20], %["#TEMP2"] \n\t" \
+ - "addu %[temp20], %["#TEMP0"], %["#TEMP1"] \n\t" \
+ - "subu %["#TEMP0"], %["#TEMP0"], %["#TEMP1"] \n\t" \
+ - "mul %[temp16], %["#TEMP2"], %[c5352] \n\t" \
+ - "mul %[temp17], %["#TEMP2"], %[c2217] \n\t" \
+ - "mul %[temp18], %["#TEMP0"], %[c5352] \n\t" \
+ - "mul %[temp19], %["#TEMP0"], %[c2217] \n\t" \
+ - "addu %["#TEMP1"], %["#TEMP3"], %[temp20] \n\t" \
+ - "subu %[temp20], %["#TEMP3"], %[temp20] \n\t" \
+ - "sll %["#TEMP0"], %["#TEMP1"], 3 \n\t" \
+ - "sll %["#TEMP2"], %[temp20], 3 \n\t" \
+ + "lbu %[temp16], 2+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "lbu %[temp17], 2+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
+ + "subu %[" #TEMP0 "], %[temp18], %[temp19] \n\t" \
+ + "lbu %[temp18], 3+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "lbu %[temp19], 3+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
+ + "subu %[" #TEMP1 "], %[temp16], %[temp17] \n\t" \
+ + "subu %[" #TEMP2 "], %[temp18], %[temp19] \n\t" \
+ + "addu %[" #TEMP3 "], %[temp20], %[" #TEMP2 "] \n\t" \
+ + "subu %[" #TEMP2 "], %[temp20], %[" #TEMP2 "] \n\t" \
+ + "addu %[temp20], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
+ + "subu %[" #TEMP0 "], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
+ + "mul %[temp16], %[" #TEMP2 "], %[c5352] \n\t" \
+ + "mul %[temp17], %[" #TEMP2 "], %[c2217] \n\t" \
+ + "mul %[temp18], %[" #TEMP0 "], %[c5352] \n\t" \
+ + "mul %[temp19], %[" #TEMP0 "], %[c2217] \n\t" \
+ + "addu %[" #TEMP1 "], %[" #TEMP3 "], %[temp20] \n\t" \
+ + "subu %[temp20], %[" #TEMP3 "], %[temp20] \n\t" \
+ + "sll %[" #TEMP0 "], %[" #TEMP1 "], 3 \n\t" \
+ + "sll %[" #TEMP2 "], %[temp20], 3 \n\t" \
+ "addiu %[temp16], %[temp16], 1812 \n\t" \
+ "addiu %[temp17], %[temp17], 937 \n\t" \
+ "addu %[temp16], %[temp16], %[temp19] \n\t" \
+ "subu %[temp17], %[temp17], %[temp18] \n\t" \
+ - "sra %["#TEMP1"], %[temp16], 9 \n\t" \
+ - "sra %["#TEMP3"], %[temp17], 9 \n\t"
+ + "sra %[" #TEMP1 "], %[temp16], 9 \n\t" \
+ + "sra %[" #TEMP3 "], %[temp17], 9 \n\t"
+
+ // macro for one vertical pass in FTransform
+ // temp0..temp15 holds tmp[0]..tmp[15]
+ // A..D - offsets in bytes to store to out buffer
+ // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements
+ #define VERTICAL_PASS(A, B, C, D, TEMP0, TEMP4, TEMP8, TEMP12) \
+ - "addu %[temp16], %["#TEMP0"], %["#TEMP12"] \n\t" \
+ - "subu %[temp19], %["#TEMP0"], %["#TEMP12"] \n\t" \
+ - "addu %[temp17], %["#TEMP4"], %["#TEMP8"] \n\t" \
+ - "subu %[temp18], %["#TEMP4"], %["#TEMP8"] \n\t" \
+ - "mul %["#TEMP8"], %[temp19], %[c2217] \n\t" \
+ - "mul %["#TEMP12"], %[temp18], %[c2217] \n\t" \
+ - "mul %["#TEMP4"], %[temp19], %[c5352] \n\t" \
+ + "addu %[temp16], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
+ + "subu %[temp19], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
+ + "addu %[temp17], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
+ + "subu %[temp18], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
+ + "mul %[" #TEMP8 "], %[temp19], %[c2217] \n\t" \
+ + "mul %[" #TEMP12 "], %[temp18], %[c2217] \n\t" \
+ + "mul %[" #TEMP4 "], %[temp19], %[c5352] \n\t" \
+ "mul %[temp18], %[temp18], %[c5352] \n\t" \
+ "addiu %[temp16], %[temp16], 7 \n\t" \
+ - "addu %["#TEMP0"], %[temp16], %[temp17] \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 4 \n\t" \
+ - "addu %["#TEMP12"], %["#TEMP12"], %["#TEMP4"] \n\t" \
+ - "subu %["#TEMP4"], %[temp16], %[temp17] \n\t" \
+ - "sra %["#TEMP4"], %["#TEMP4"], 4 \n\t" \
+ - "addiu %["#TEMP8"], %["#TEMP8"], 30000 \n\t" \
+ - "addiu %["#TEMP12"], %["#TEMP12"], 12000 \n\t" \
+ - "addiu %["#TEMP8"], %["#TEMP8"], 21000 \n\t" \
+ - "subu %["#TEMP8"], %["#TEMP8"], %[temp18] \n\t" \
+ - "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t" \
+ - "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t" \
+ - "addiu %[temp16], %["#TEMP12"], 1 \n\t" \
+ - "movn %["#TEMP12"], %[temp16], %[temp19] \n\t" \
+ - "sh %["#TEMP0"], "#A"(%[temp20]) \n\t" \
+ - "sh %["#TEMP4"], "#C"(%[temp20]) \n\t" \
+ - "sh %["#TEMP8"], "#D"(%[temp20]) \n\t" \
+ - "sh %["#TEMP12"], "#B"(%[temp20]) \n\t"
+ + "addu %[" #TEMP0 "], %[temp16], %[temp17] \n\t" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \
+ + "addu %[" #TEMP12 "], %[" #TEMP12 "], %[" #TEMP4 "] \n\t" \
+ + "subu %[" #TEMP4 "], %[temp16], %[temp17] \n\t" \
+ + "sra %[" #TEMP4 "], %[" #TEMP4 "], 4 \n\t" \
+ + "addiu %[" #TEMP8 "], %[" #TEMP8 "], 30000 \n\t" \
+ + "addiu %[" #TEMP12 "], %[" #TEMP12 "], 12000 \n\t" \
+ + "addiu %[" #TEMP8 "], %[" #TEMP8 "], 21000 \n\t" \
+ + "subu %[" #TEMP8 "], %[" #TEMP8 "], %[temp18] \n\t" \
+ + "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \
+ + "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \
+ + "addiu %[temp16], %[" #TEMP12 "], 1 \n\t" \
+ + "movn %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \
+ + "sh %[" #TEMP0 "], " #A "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP4 "], " #C "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP8 "], " #D "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP12 "], " #B "(%[temp20]) \n\t"
+
+ static void FTransform(const uint8_t* src, const uint8_t* ref, int16_t* out) {
+ int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
+ @@ -516,14 +516,14 @@ static void FTransform(const uint8_t* src, const uint8_t* ref, int16_t* out) {
+ #if !defined(WORK_AROUND_GCC)
+
+ #define GET_SSE_INNER(A, B, C, D) \
+ - "lbu %[temp0], "#A"(%[a]) \n\t" \
+ - "lbu %[temp1], "#A"(%[b]) \n\t" \
+ - "lbu %[temp2], "#B"(%[a]) \n\t" \
+ - "lbu %[temp3], "#B"(%[b]) \n\t" \
+ - "lbu %[temp4], "#C"(%[a]) \n\t" \
+ - "lbu %[temp5], "#C"(%[b]) \n\t" \
+ - "lbu %[temp6], "#D"(%[a]) \n\t" \
+ - "lbu %[temp7], "#D"(%[b]) \n\t" \
+ + "lbu %[temp0], " #A "(%[a]) \n\t" \
+ + "lbu %[temp1], " #A "(%[b]) \n\t" \
+ + "lbu %[temp2], " #B "(%[a]) \n\t" \
+ + "lbu %[temp3], " #B "(%[b]) \n\t" \
+ + "lbu %[temp4], " #C "(%[a]) \n\t" \
+ + "lbu %[temp5], " #C "(%[b]) \n\t" \
+ + "lbu %[temp6], " #D "(%[a]) \n\t" \
+ + "lbu %[temp7], " #D "(%[b]) \n\t" \
+ "subu %[temp0], %[temp0], %[temp1] \n\t" \
+ "subu %[temp2], %[temp2], %[temp3] \n\t" \
+ "subu %[temp4], %[temp4], %[temp5] \n\t" \
+ diff --git a/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
+ index ec58efe..1a3f968 100644
+ --- a/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
+ @@ -27,25 +27,25 @@ static const int kC2 = 35468;
+ // I - input (macro doesn't change it)
+ #define ADD_SUB_HALVES_X4(O0, O1, O2, O3, O4, O5, O6, O7, \
+ I0, I1, I2, I3, I4, I5, I6, I7) \
+ - "addq.ph %["#O0"], %["#I0"], %["#I1"] \n\t" \
+ - "subq.ph %["#O1"], %["#I0"], %["#I1"] \n\t" \
+ - "addq.ph %["#O2"], %["#I2"], %["#I3"] \n\t" \
+ - "subq.ph %["#O3"], %["#I2"], %["#I3"] \n\t" \
+ - "addq.ph %["#O4"], %["#I4"], %["#I5"] \n\t" \
+ - "subq.ph %["#O5"], %["#I4"], %["#I5"] \n\t" \
+ - "addq.ph %["#O6"], %["#I6"], %["#I7"] \n\t" \
+ - "subq.ph %["#O7"], %["#I6"], %["#I7"] \n\t"
+ + "addq.ph %[" #O0 "], %[" #I0 "], %[" #I1 "] \n\t" \
+ + "subq.ph %[" #O1 "], %[" #I0 "], %[" #I1 "] \n\t" \
+ + "addq.ph %[" #O2 "], %[" #I2 "], %[" #I3 "] \n\t" \
+ + "subq.ph %[" #O3 "], %[" #I2 "], %[" #I3 "] \n\t" \
+ + "addq.ph %[" #O4 "], %[" #I4 "], %[" #I5 "] \n\t" \
+ + "subq.ph %[" #O5 "], %[" #I4 "], %[" #I5 "] \n\t" \
+ + "addq.ph %[" #O6 "], %[" #I6 "], %[" #I7 "] \n\t" \
+ + "subq.ph %[" #O7 "], %[" #I6 "], %[" #I7 "] \n\t"
+
+ // IO - input/output
+ #define ABS_X8(IO0, IO1, IO2, IO3, IO4, IO5, IO6, IO7) \
+ - "absq_s.ph %["#IO0"], %["#IO0"] \n\t" \
+ - "absq_s.ph %["#IO1"], %["#IO1"] \n\t" \
+ - "absq_s.ph %["#IO2"], %["#IO2"] \n\t" \
+ - "absq_s.ph %["#IO3"], %["#IO3"] \n\t" \
+ - "absq_s.ph %["#IO4"], %["#IO4"] \n\t" \
+ - "absq_s.ph %["#IO5"], %["#IO5"] \n\t" \
+ - "absq_s.ph %["#IO6"], %["#IO6"] \n\t" \
+ - "absq_s.ph %["#IO7"], %["#IO7"] \n\t"
+ + "absq_s.ph %[" #IO0 "], %[" #IO0 "] \n\t" \
+ + "absq_s.ph %[" #IO1 "], %[" #IO1 "] \n\t" \
+ + "absq_s.ph %[" #IO2 "], %[" #IO2 "] \n\t" \
+ + "absq_s.ph %[" #IO3 "], %[" #IO3 "] \n\t" \
+ + "absq_s.ph %[" #IO4 "], %[" #IO4 "] \n\t" \
+ + "absq_s.ph %[" #IO5 "], %[" #IO5 "] \n\t" \
+ + "absq_s.ph %[" #IO6 "], %[" #IO6 "] \n\t" \
+ + "absq_s.ph %[" #IO7 "], %[" #IO7 "] \n\t"
+
+ // dpa.w.ph $ac0 temp0 ,temp1
+ // $ac += temp0[31..16] * temp1[31..16] + temp0[15..0] * temp1[15..0]
+ @@ -56,15 +56,15 @@ static const int kC2 = 35468;
+ #define MUL_HALF(O0, I0, I1, I2, I3, I4, I5, I6, I7, \
+ I8, I9, I10, I11, I12, I13, I14, I15) \
+ "mult $ac0, $zero, $zero \n\t" \
+ - "dpa.w.ph $ac0, %["#I2"], %["#I0"] \n\t" \
+ - "dpax.w.ph $ac0, %["#I5"], %["#I6"] \n\t" \
+ - "dpa.w.ph $ac0, %["#I8"], %["#I9"] \n\t" \
+ - "dpax.w.ph $ac0, %["#I11"], %["#I4"] \n\t" \
+ - "dpa.w.ph $ac0, %["#I12"], %["#I7"] \n\t" \
+ - "dpax.w.ph $ac0, %["#I13"], %["#I1"] \n\t" \
+ - "dpa.w.ph $ac0, %["#I14"], %["#I3"] \n\t" \
+ - "dpax.w.ph $ac0, %["#I15"], %["#I10"] \n\t" \
+ - "mflo %["#O0"], $ac0 \n\t"
+ + "dpa.w.ph $ac0, %[" #I2 "], %[" #I0 "] \n\t" \
+ + "dpax.w.ph $ac0, %[" #I5 "], %[" #I6 "] \n\t" \
+ + "dpa.w.ph $ac0, %[" #I8 "], %[" #I9 "] \n\t" \
+ + "dpax.w.ph $ac0, %[" #I11 "], %[" #I4 "] \n\t" \
+ + "dpa.w.ph $ac0, %[" #I12 "], %[" #I7 "] \n\t" \
+ + "dpax.w.ph $ac0, %[" #I13 "], %[" #I1 "] \n\t" \
+ + "dpa.w.ph $ac0, %[" #I14 "], %[" #I3 "] \n\t" \
+ + "dpax.w.ph $ac0, %[" #I15 "], %[" #I10 "] \n\t" \
+ + "mflo %[" #O0 "], $ac0 \n\t"
+
+ #define OUTPUT_EARLY_CLOBBER_REGS_17() \
+ OUTPUT_EARLY_CLOBBER_REGS_10(), \
+ @@ -77,69 +77,69 @@ static const int kC2 = 35468;
+ // A - offset in bytes to load from src and ref buffers
+ // TEMP0..TEMP3 - registers for corresponding tmp elements
+ #define HORIZONTAL_PASS(A, TEMP0, TEMP1, TEMP2, TEMP3) \
+ - "lw %["#TEMP0"], 0(%[args]) \n\t" \
+ - "lw %["#TEMP1"], 4(%[args]) \n\t" \
+ - "lw %["#TEMP2"], "XSTR(BPS)"*"#A"(%["#TEMP0"]) \n\t" \
+ - "lw %["#TEMP3"], "XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
+ - "preceu.ph.qbl %["#TEMP0"], %["#TEMP2"] \n\t" \
+ - "preceu.ph.qbl %["#TEMP1"], %["#TEMP3"] \n\t" \
+ - "preceu.ph.qbr %["#TEMP2"], %["#TEMP2"] \n\t" \
+ - "preceu.ph.qbr %["#TEMP3"], %["#TEMP3"] \n\t" \
+ - "subq.ph %["#TEMP0"], %["#TEMP0"], %["#TEMP1"] \n\t" \
+ - "subq.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP3"] \n\t" \
+ - "rotr %["#TEMP0"], %["#TEMP0"], 16 \n\t" \
+ - "addq.ph %["#TEMP1"], %["#TEMP2"], %["#TEMP0"] \n\t" \
+ - "subq.ph %["#TEMP3"], %["#TEMP2"], %["#TEMP0"] \n\t" \
+ - "seh %["#TEMP0"], %["#TEMP1"] \n\t" \
+ - "sra %[temp16], %["#TEMP1"], 16 \n\t" \
+ - "seh %[temp19], %["#TEMP3"] \n\t" \
+ - "sra %["#TEMP3"], %["#TEMP3"], 16 \n\t" \
+ - "subu %["#TEMP2"], %["#TEMP0"], %[temp16] \n\t" \
+ - "addu %["#TEMP0"], %["#TEMP0"], %[temp16] \n\t" \
+ + "lw %[" #TEMP0 "], 0(%[args]) \n\t" \
+ + "lw %[" #TEMP1 "], 4(%[args]) \n\t" \
+ + "lw %[" #TEMP2 "], "XSTR(BPS)"*" #A "(%[" #TEMP0 "]) \n\t" \
+ + "lw %[" #TEMP3 "], "XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
+ + "preceu.ph.qbl %[" #TEMP0 "], %[" #TEMP2 "] \n\t" \
+ + "preceu.ph.qbl %[" #TEMP1 "], %[" #TEMP3 "] \n\t" \
+ + "preceu.ph.qbr %[" #TEMP2 "], %[" #TEMP2 "] \n\t" \
+ + "preceu.ph.qbr %[" #TEMP3 "], %[" #TEMP3 "] \n\t" \
+ + "subq.ph %[" #TEMP0 "], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
+ + "subq.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP3 "] \n\t" \
+ + "rotr %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\t" \
+ + "addq.ph %[" #TEMP1 "], %[" #TEMP2 "], %[" #TEMP0 "] \n\t" \
+ + "subq.ph %[" #TEMP3 "], %[" #TEMP2 "], %[" #TEMP0 "] \n\t" \
+ + "seh %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
+ + "sra %[temp16], %[" #TEMP1 "], 16 \n\t" \
+ + "seh %[temp19], %[" #TEMP3 "] \n\t" \
+ + "sra %[" #TEMP3 "], %[" #TEMP3 "], 16 \n\t" \
+ + "subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp16] \n\t" \
+ + "addu %[" #TEMP0 "], %[" #TEMP0 "], %[temp16] \n\t" \
+ "mul %[temp17], %[temp19], %[c2217] \n\t" \
+ - "mul %[temp18], %["#TEMP3"], %[c5352] \n\t" \
+ - "mul %["#TEMP1"], %[temp19], %[c5352] \n\t" \
+ - "mul %[temp16], %["#TEMP3"], %[c2217] \n\t" \
+ - "sll %["#TEMP2"], %["#TEMP2"], 3 \n\t" \
+ - "sll %["#TEMP0"], %["#TEMP0"], 3 \n\t" \
+ - "subu %["#TEMP3"], %[temp17], %[temp18] \n\t" \
+ - "addu %["#TEMP1"], %[temp16], %["#TEMP1"] \n\t" \
+ - "addiu %["#TEMP3"], %["#TEMP3"], 937 \n\t" \
+ - "addiu %["#TEMP1"], %["#TEMP1"], 1812 \n\t" \
+ - "sra %["#TEMP3"], %["#TEMP3"], 9 \n\t" \
+ - "sra %["#TEMP1"], %["#TEMP1"], 9 \n\t"
+ + "mul %[temp18], %[" #TEMP3 "], %[c5352] \n\t" \
+ + "mul %[" #TEMP1 "], %[temp19], %[c5352] \n\t" \
+ + "mul %[temp16], %[" #TEMP3 "], %[c2217] \n\t" \
+ + "sll %[" #TEMP2 "], %[" #TEMP2 "], 3 \n\t" \
+ + "sll %[" #TEMP0 "], %[" #TEMP0 "], 3 \n\t" \
+ + "subu %[" #TEMP3 "], %[temp17], %[temp18] \n\t" \
+ + "addu %[" #TEMP1 "], %[temp16], %[" #TEMP1 "] \n\t" \
+ + "addiu %[" #TEMP3 "], %[" #TEMP3 "], 937 \n\t" \
+ + "addiu %[" #TEMP1 "], %[" #TEMP1 "], 1812 \n\t" \
+ + "sra %[" #TEMP3 "], %[" #TEMP3 "], 9 \n\t" \
+ + "sra %[" #TEMP1 "], %[" #TEMP1 "], 9 \n\t"
+
+ // macro for one vertical pass in FTransform
+ // temp0..temp15 holds tmp[0]..tmp[15]
+ // A..D - offsets in bytes to store to out buffer
+ // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements
+ #define VERTICAL_PASS(A, B, C, D, TEMP0, TEMP4, TEMP8, TEMP12) \
+ - "addu %[temp16], %["#TEMP0"], %["#TEMP12"] \n\t" \
+ - "subu %[temp19], %["#TEMP0"], %["#TEMP12"] \n\t" \
+ - "addu %[temp17], %["#TEMP4"], %["#TEMP8"] \n\t" \
+ - "subu %[temp18], %["#TEMP4"], %["#TEMP8"] \n\t" \
+ - "mul %["#TEMP8"], %[temp19], %[c2217] \n\t" \
+ - "mul %["#TEMP12"], %[temp18], %[c2217] \n\t" \
+ - "mul %["#TEMP4"], %[temp19], %[c5352] \n\t" \
+ + "addu %[temp16], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
+ + "subu %[temp19], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
+ + "addu %[temp17], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
+ + "subu %[temp18], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
+ + "mul %[" #TEMP8 "], %[temp19], %[c2217] \n\t" \
+ + "mul %[" #TEMP12 "], %[temp18], %[c2217] \n\t" \
+ + "mul %[" #TEMP4 "], %[temp19], %[c5352] \n\t" \
+ "mul %[temp18], %[temp18], %[c5352] \n\t" \
+ "addiu %[temp16], %[temp16], 7 \n\t" \
+ - "addu %["#TEMP0"], %[temp16], %[temp17] \n\t" \
+ - "sra %["#TEMP0"], %["#TEMP0"], 4 \n\t" \
+ - "addu %["#TEMP12"], %["#TEMP12"], %["#TEMP4"] \n\t" \
+ - "subu %["#TEMP4"], %[temp16], %[temp17] \n\t" \
+ - "sra %["#TEMP4"], %["#TEMP4"], 4 \n\t" \
+ - "addiu %["#TEMP8"], %["#TEMP8"], 30000 \n\t" \
+ - "addiu %["#TEMP12"], %["#TEMP12"], 12000 \n\t" \
+ - "addiu %["#TEMP8"], %["#TEMP8"], 21000 \n\t" \
+ - "subu %["#TEMP8"], %["#TEMP8"], %[temp18] \n\t" \
+ - "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t" \
+ - "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t" \
+ - "addiu %[temp16], %["#TEMP12"], 1 \n\t" \
+ - "movn %["#TEMP12"], %[temp16], %[temp19] \n\t" \
+ - "sh %["#TEMP0"], "#A"(%[temp20]) \n\t" \
+ - "sh %["#TEMP4"], "#C"(%[temp20]) \n\t" \
+ - "sh %["#TEMP8"], "#D"(%[temp20]) \n\t" \
+ - "sh %["#TEMP12"], "#B"(%[temp20]) \n\t"
+ + "addu %[" #TEMP0 "], %[temp16], %[temp17] \n\t" \
+ + "sra %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \
+ + "addu %[" #TEMP12 "], %[" #TEMP12 "], %[" #TEMP4 "] \n\t" \
+ + "subu %[" #TEMP4 "], %[temp16], %[temp17] \n\t" \
+ + "sra %[" #TEMP4 "], %[" #TEMP4 "], 4 \n\t" \
+ + "addiu %[" #TEMP8 "], %[" #TEMP8 "], 30000 \n\t" \
+ + "addiu %[" #TEMP12 "], %[" #TEMP12 "], 12000 \n\t" \
+ + "addiu %[" #TEMP8 "], %[" #TEMP8 "], 21000 \n\t" \
+ + "subu %[" #TEMP8 "], %[" #TEMP8 "], %[temp18] \n\t" \
+ + "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \
+ + "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \
+ + "addiu %[temp16], %[" #TEMP12 "], 1 \n\t" \
+ + "movn %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \
+ + "sh %[" #TEMP0 "], " #A "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP4 "], " #C "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP8 "], " #D "(%[temp20]) \n\t" \
+ + "sh %[" #TEMP12 "], " #B "(%[temp20]) \n\t"
+
+ static void FTransform(const uint8_t* src, const uint8_t* ref, int16_t* out) {
+ const int c2217 = 2217;
+ @@ -329,11 +329,11 @@ static int Disto16x16(const uint8_t* const a, const uint8_t* const b,
+ // Intra predictions
+
+ #define FILL_PART(J, SIZE) \
+ - "usw %[value], 0+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
+ - "usw %[value], 4+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
+ - ".if "#SIZE" == 16 \n\t" \
+ - "usw %[value], 8+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
+ - "usw %[value], 12+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
+ + "usw %[value], 0+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
+ + "usw %[value], 4+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
+ + ".if " #SIZE " == 16 \n\t" \
+ + "usw %[value], 8+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
+ + "usw %[value], 12+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
+ ".endif \n\t"
+
+ #define FILL_8_OR_16(DST, VALUE, SIZE) do { \
+ @@ -348,7 +348,7 @@ static int Disto16x16(const uint8_t* const a, const uint8_t* const b,
+ FILL_PART( 5, SIZE) \
+ FILL_PART( 6, SIZE) \
+ FILL_PART( 7, SIZE) \
+ - ".if "#SIZE" == 16 \n\t" \
+ + ".if " #SIZE " == 16 \n\t" \
+ FILL_PART( 8, 16) \
+ FILL_PART( 9, 16) \
+ FILL_PART(10, 16) \
+ @@ -425,7 +425,7 @@ HORIZONTAL_PRED(dst, left, 16)
+ CLIPPING() \
+ "usw %[temp0], 0(%[dst]) \n\t" \
+ "usw %[temp1], 4(%[dst]) \n\t" \
+ - ".if "#SIZE" == 16 \n\t" \
+ + ".if " #SIZE " == 16 \n\t" \
+ "ulw %[temp0], 8(%[top]) \n\t" \
+ "ulw %[temp1], 12(%[top]) \n\t" \
+ CLIPPING() \
+ @@ -1060,8 +1060,8 @@ static void Intra4Preds(uint8_t* dst, const uint8_t* top) {
+ #if !defined(WORK_AROUND_GCC)
+
+ #define GET_SSE_INNER(A) \
+ - "lw %[temp0], "#A"(%[a]) \n\t" \
+ - "lw %[temp1], "#A"(%[b]) \n\t" \
+ + "lw %[temp0], " #A "(%[a]) \n\t" \
+ + "lw %[temp1], " #A "(%[b]) \n\t" \
+ "preceu.ph.qbr %[temp2], %[temp0] \n\t" \
+ "preceu.ph.qbl %[temp0], %[temp0] \n\t" \
+ "preceu.ph.qbr %[temp3], %[temp1] \n\t" \
+ @@ -1185,28 +1185,28 @@ static int SSE4x4(const uint8_t* a, const uint8_t* b) {
+ // N - offset in bytes (n * 2)
+ // N1 - offset in bytes ((n + 1) * 2)
+ #define QUANTIZE_ONE(J, K, N, N1) \
+ - "ulw %[temp1], "#J"(%[ppin]) \n\t" \
+ - "ulw %[temp2], "#J"(%[ppsharpen]) \n\t" \
+ - "lhu %[temp3], "#K"(%[ppzthresh]) \n\t" \
+ - "lhu %[temp6], "#K"+4(%[ppzthresh]) \n\t" \
+ + "ulw %[temp1], " #J "(%[ppin]) \n\t" \
+ + "ulw %[temp2], " #J "(%[ppsharpen]) \n\t" \
+ + "lhu %[temp3], " #K "(%[ppzthresh]) \n\t" \
+ + "lhu %[temp6], " #K "+4(%[ppzthresh]) \n\t" \
+ "absq_s.ph %[temp4], %[temp1] \n\t" \
+ "ins %[temp3], %[temp6], 16, 16 \n\t" \
+ "addu.ph %[coeff], %[temp4], %[temp2] \n\t" \
+ "shra.ph %[sign], %[temp1], 15 \n\t" \
+ "li %[level], 0x10001 \n\t" \
+ "cmp.lt.ph %[temp3], %[coeff] \n\t" \
+ - "lhu %[temp1], "#J"(%[ppiq]) \n\t" \
+ + "lhu %[temp1], " #J "(%[ppiq]) \n\t" \
+ "pick.ph %[temp5], %[level], $0 \n\t" \
+ - "lw %[temp2], "#K"(%[ppbias]) \n\t" \
+ + "lw %[temp2], " #K "(%[ppbias]) \n\t" \
+ "beqz %[temp5], 0f \n\t" \
+ - "lhu %[temp3], "#J"(%[ppq]) \n\t" \
+ + "lhu %[temp3], " #J "(%[ppq]) \n\t" \
+ "beq %[temp5], %[level], 1f \n\t" \
+ "andi %[temp5], %[temp5], 0x1 \n\t" \
+ "andi %[temp4], %[coeff], 0xffff \n\t" \
+ "beqz %[temp5], 2f \n\t" \
+ "mul %[level], %[temp4], %[temp1] \n\t" \
+ - "sh $0, "#J"+2(%[ppin]) \n\t" \
+ - "sh $0, "#N1"(%[pout]) \n\t" \
+ + "sh $0, " #J "+2(%[ppin]) \n\t" \
+ + "sh $0, " #N1 "(%[pout]) \n\t" \
+ "addu %[level], %[level], %[temp2] \n\t" \
+ "sra %[level], %[level], 17 \n\t" \
+ "slt %[temp4], %[max_level], %[level] \n\t" \
+ @@ -1216,15 +1216,15 @@ static int SSE4x4(const uint8_t* a, const uint8_t* b) {
+ "subu %[level], %[level], %[temp6] \n\t" \
+ "mul %[temp5], %[level], %[temp3] \n\t" \
+ "or %[ret], %[ret], %[level] \n\t" \
+ - "sh %[level], "#N"(%[pout]) \n\t" \
+ - "sh %[temp5], "#J"(%[ppin]) \n\t" \
+ + "sh %[level], " #N "(%[pout]) \n\t" \
+ + "sh %[temp5], " #J "(%[ppin]) \n\t" \
+ "j 3f \n\t" \
+ "2: \n\t" \
+ - "lhu %[temp1], "#J"+2(%[ppiq]) \n\t" \
+ + "lhu %[temp1], " #J "+2(%[ppiq]) \n\t" \
+ "srl %[temp5], %[coeff], 16 \n\t" \
+ "mul %[level], %[temp5], %[temp1] \n\t" \
+ - "lw %[temp2], "#K"+4(%[ppbias]) \n\t" \
+ - "lhu %[temp3], "#J"+2(%[ppq]) \n\t" \
+ + "lw %[temp2], " #K "+4(%[ppbias]) \n\t" \
+ + "lhu %[temp3], " #J "+2(%[ppq]) \n\t" \
+ "addu %[level], %[level], %[temp2] \n\t" \
+ "sra %[level], %[level], 17 \n\t" \
+ "srl %[temp6], %[sign], 16 \n\t" \
+ @@ -1233,20 +1233,20 @@ static int SSE4x4(const uint8_t* a, const uint8_t* b) {
+ "xor %[level], %[level], %[temp6] \n\t" \
+ "subu %[level], %[level], %[temp6] \n\t" \
+ "mul %[temp5], %[level], %[temp3] \n\t" \
+ - "sh $0, "#J"(%[ppin]) \n\t" \
+ - "sh $0, "#N"(%[pout]) \n\t" \
+ + "sh $0, " #J "(%[ppin]) \n\t" \
+ + "sh $0, " #N "(%[pout]) \n\t" \
+ "or %[ret], %[ret], %[level] \n\t" \
+ - "sh %[temp5], "#J"+2(%[ppin]) \n\t" \
+ - "sh %[level], "#N1"(%[pout]) \n\t" \
+ + "sh %[temp5], " #J "+2(%[ppin]) \n\t" \
+ + "sh %[level], " #N1 "(%[pout]) \n\t" \
+ "j 3f \n\t" \
+ "1: \n\t" \
+ - "lhu %[temp1], "#J"(%[ppiq]) \n\t" \
+ - "lw %[temp2], "#K"(%[ppbias]) \n\t" \
+ - "ulw %[temp3], "#J"(%[ppq]) \n\t" \
+ + "lhu %[temp1], " #J "(%[ppiq]) \n\t" \
+ + "lw %[temp2], " #K "(%[ppbias]) \n\t" \
+ + "ulw %[temp3], " #J "(%[ppq]) \n\t" \
+ "andi %[temp5], %[coeff], 0xffff \n\t" \
+ "srl %[temp0], %[coeff], 16 \n\t" \
+ - "lhu %[temp6], "#J"+2(%[ppiq]) \n\t" \
+ - "lw %[coeff], "#K"+4(%[ppbias]) \n\t" \
+ + "lhu %[temp6], " #J "+2(%[ppiq]) \n\t" \
+ + "lw %[coeff], " #K "+4(%[ppbias]) \n\t" \
+ "mul %[level], %[temp5], %[temp1] \n\t" \
+ "mul %[temp4], %[temp0], %[temp6] \n\t" \
+ "addu %[level], %[level], %[temp2] \n\t" \
+ @@ -1259,15 +1259,15 @@ static int SSE4x4(const uint8_t* a, const uint8_t* b) {
+ "subu.ph %[level], %[level], %[sign] \n\t" \
+ "mul.ph %[temp3], %[level], %[temp3] \n\t" \
+ "or %[ret], %[ret], %[level] \n\t" \
+ - "sh %[level], "#N"(%[pout]) \n\t" \
+ + "sh %[level], " #N "(%[pout]) \n\t" \
+ "srl %[level], %[level], 16 \n\t" \
+ - "sh %[level], "#N1"(%[pout]) \n\t" \
+ - "usw %[temp3], "#J"(%[ppin]) \n\t" \
+ + "sh %[level], " #N1 "(%[pout]) \n\t" \
+ + "usw %[temp3], " #J "(%[ppin]) \n\t" \
+ "j 3f \n\t" \
+ "0: \n\t" \
+ - "sh $0, "#N"(%[pout]) \n\t" \
+ - "sh $0, "#N1"(%[pout]) \n\t" \
+ - "usw $0, "#J"(%[ppin]) \n\t" \
+ + "sh $0, " #N "(%[pout]) \n\t" \
+ + "sh $0, " #N1 "(%[pout]) \n\t" \
+ + "usw $0, " #J "(%[ppin]) \n\t" \
+ "3: \n\t"
+
+ static int QuantizeBlock(int16_t in[16], int16_t out[16],
+ @@ -1326,37 +1326,37 @@ static int Quantize2Blocks(int16_t in[32], int16_t out[32],
+ // A, B, C, D - offset in bytes to load from in buffer
+ // TEMP0, TEMP1 - registers for corresponding tmp elements
+ #define HORIZONTAL_PASS_WHT(A, B, C, D, TEMP0, TEMP1) \
+ - "lh %["#TEMP0"], "#A"(%[in]) \n\t" \
+ - "lh %["#TEMP1"], "#B"(%[in]) \n\t" \
+ - "lh %[temp8], "#C"(%[in]) \n\t" \
+ - "lh %[temp9], "#D"(%[in]) \n\t" \
+ - "ins %["#TEMP1"], %["#TEMP0"], 16, 16 \n\t" \
+ + "lh %[" #TEMP0 "], " #A "(%[in]) \n\t" \
+ + "lh %[" #TEMP1 "], " #B "(%[in]) \n\t" \
+ + "lh %[temp8], " #C "(%[in]) \n\t" \
+ + "lh %[temp9], " #D "(%[in]) \n\t" \
+ + "ins %[" #TEMP1 "], %[" #TEMP0 "], 16, 16 \n\t" \
+ "ins %[temp9], %[temp8], 16, 16 \n\t" \
+ - "subq.ph %[temp8], %["#TEMP1"], %[temp9] \n\t" \
+ - "addq.ph %[temp9], %["#TEMP1"], %[temp9] \n\t" \
+ - "precrq.ph.w %["#TEMP0"], %[temp8], %[temp9] \n\t" \
+ + "subq.ph %[temp8], %[" #TEMP1 "], %[temp9] \n\t" \
+ + "addq.ph %[temp9], %[" #TEMP1 "], %[temp9] \n\t" \
+ + "precrq.ph.w %[" #TEMP0 "], %[temp8], %[temp9] \n\t" \
+ "append %[temp8], %[temp9], 16 \n\t" \
+ - "subq.ph %["#TEMP1"], %["#TEMP0"], %[temp8] \n\t" \
+ - "addq.ph %["#TEMP0"], %["#TEMP0"], %[temp8] \n\t" \
+ - "rotr %["#TEMP1"], %["#TEMP1"], 16 \n\t"
+ + "subq.ph %[" #TEMP1 "], %[" #TEMP0 "], %[temp8] \n\t" \
+ + "addq.ph %[" #TEMP0 "], %[" #TEMP0 "], %[temp8] \n\t" \
+ + "rotr %[" #TEMP1 "], %[" #TEMP1 "], 16 \n\t"
+
+ // macro for one vertical pass in FTransformWHT
+ // temp0..temp7 holds tmp[0]..tmp[15]
+ // A, B, C, D - offsets in bytes to store to out buffer
+ // TEMP0, TEMP2, TEMP4 and TEMP6 - registers for corresponding tmp elements
+ #define VERTICAL_PASS_WHT(A, B, C, D, TEMP0, TEMP2, TEMP4, TEMP6) \
+ - "addq.ph %[temp8], %["#TEMP0"], %["#TEMP4"] \n\t" \
+ - "addq.ph %[temp9], %["#TEMP2"], %["#TEMP6"] \n\t" \
+ - "subq.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP6"] \n\t" \
+ - "subq.ph %["#TEMP6"], %["#TEMP0"], %["#TEMP4"] \n\t" \
+ - "addqh.ph %["#TEMP0"], %[temp8], %[temp9] \n\t" \
+ - "subqh.ph %["#TEMP4"], %["#TEMP6"], %["#TEMP2"] \n\t" \
+ - "addqh.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP6"] \n\t" \
+ - "subqh.ph %["#TEMP6"], %[temp8], %[temp9] \n\t" \
+ - "usw %["#TEMP0"], "#A"(%[out]) \n\t" \
+ - "usw %["#TEMP2"], "#B"(%[out]) \n\t" \
+ - "usw %["#TEMP4"], "#C"(%[out]) \n\t" \
+ - "usw %["#TEMP6"], "#D"(%[out]) \n\t"
+ + "addq.ph %[temp8], %[" #TEMP0 "], %[" #TEMP4 "] \n\t" \
+ + "addq.ph %[temp9], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \
+ + "subq.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \
+ + "subq.ph %[" #TEMP6 "], %[" #TEMP0 "], %[" #TEMP4 "] \n\t" \
+ + "addqh.ph %[" #TEMP0 "], %[temp8], %[temp9] \n\t" \
+ + "subqh.ph %[" #TEMP4 "], %[" #TEMP6 "], %[" #TEMP2 "] \n\t" \
+ + "addqh.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \
+ + "subqh.ph %[" #TEMP6 "], %[temp8], %[temp9] \n\t" \
+ + "usw %[" #TEMP0 "], " #A "(%[out]) \n\t" \
+ + "usw %[" #TEMP2 "], " #B "(%[out]) \n\t" \
+ + "usw %[" #TEMP4 "], " #C "(%[out]) \n\t" \
+ + "usw %[" #TEMP6 "], " #D "(%[out]) \n\t"
+
+ static void FTransformWHT(const int16_t* in, int16_t* out) {
+ int temp0, temp1, temp2, temp3, temp4;
+ @@ -1385,10 +1385,10 @@ static void FTransformWHT(const int16_t* in, int16_t* out) {
+ // convert 8 coeffs at time
+ // A, B, C, D - offsets in bytes to load from out buffer
+ #define CONVERT_COEFFS_TO_BIN(A, B, C, D) \
+ - "ulw %[temp0], "#A"(%[out]) \n\t" \
+ - "ulw %[temp1], "#B"(%[out]) \n\t" \
+ - "ulw %[temp2], "#C"(%[out]) \n\t" \
+ - "ulw %[temp3], "#D"(%[out]) \n\t" \
+ + "ulw %[temp0], " #A "(%[out]) \n\t" \
+ + "ulw %[temp1], " #B "(%[out]) \n\t" \
+ + "ulw %[temp2], " #C "(%[out]) \n\t" \
+ + "ulw %[temp3], " #D "(%[out]) \n\t" \
+ "absq_s.ph %[temp0], %[temp0] \n\t" \
+ "absq_s.ph %[temp1], %[temp1] \n\t" \
+ "absq_s.ph %[temp2], %[temp2] \n\t" \
+ diff --git a/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
+ index 6c34efb..6a1f8f4 100644
+ --- a/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
+ @@ -48,7 +48,7 @@
+ "srl %[temp0], %[length], 0x2 \n\t" \
+ "beqz %[temp0], 4f \n\t" \
+ " andi %[temp6], %[length], 0x3 \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "lbu %[temp1], -1(%[src]) \n\t" \
+ "1: \n\t" \
+ "lbu %[temp2], 0(%[src]) \n\t" \
+ @@ -84,7 +84,7 @@
+ "lbu %[temp1], -1(%[src]) \n\t" \
+ "lbu %[temp2], 0(%[src]) \n\t" \
+ "addiu %[src], %[src], 1 \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "addu %[temp3], %[temp1], %[temp2] \n\t" \
+ "sb %[temp3], -1(%[src]) \n\t" \
+ ".else \n\t" \
+ @@ -131,7 +131,7 @@ static WEBP_INLINE void PredictLine(const uint8_t* src, uint8_t* dst,
+ "ulw %[temp3], 4(%[src]) \n\t" \
+ "ulw %[temp4], 4(%[pred]) \n\t" \
+ "addiu %[src], %[src], 8 \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "addu.qb %[temp5], %[temp1], %[temp2] \n\t" \
+ "addu.qb %[temp6], %[temp3], %[temp4] \n\t" \
+ ".else \n\t" \
+ @@ -152,7 +152,7 @@ static WEBP_INLINE void PredictLine(const uint8_t* src, uint8_t* dst,
+ "lbu %[temp2], 0(%[pred]) \n\t" \
+ "addiu %[src], %[src], 1 \n\t" \
+ "addiu %[pred], %[pred], 1 \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "addu %[temp3], %[temp1], %[temp2] \n\t" \
+ ".else \n\t" \
+ "subu %[temp3], %[temp1], %[temp2] \n\t" \
+ @@ -177,7 +177,7 @@ static WEBP_INLINE void PredictLine(const uint8_t* src, uint8_t* dst,
+ __asm__ volatile ( \
+ "lbu %[temp1], 0(%[src]) \n\t" \
+ "lbu %[temp2], 0(%[pred]) \n\t" \
+ - ".if "#INVERSE" \n\t" \
+ + ".if " #INVERSE " \n\t" \
+ "addu %[temp3], %[temp1], %[temp2] \n\t" \
+ ".else \n\t" \
+ "subu %[temp3], %[temp1], %[temp2] \n\t" \
+ diff --git a/Source/LibWebP/src/dsp/dsp.lossless_mips32.c b/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
+ index 68fbe85..abe97c1 100644
+ --- a/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
+ +++ b/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
+ @@ -285,28 +285,28 @@ static VP8LStreaks HuffmanCostCombinedCount(const uint32_t* X,
+ // literal_ and successive histograms could be unaligned
+ // so we must use ulw and usw
+ #define ADD_TO_OUT(A, B, C, D, E, P0, P1, P2) \
+ - "ulw %[temp0], "#A"(%["#P0"]) \n\t" \
+ - "ulw %[temp1], "#B"(%["#P0"]) \n\t" \
+ - "ulw %[temp2], "#C"(%["#P0"]) \n\t" \
+ - "ulw %[temp3], "#D"(%["#P0"]) \n\t" \
+ - "ulw %[temp4], "#A"(%["#P1"]) \n\t" \
+ - "ulw %[temp5], "#B"(%["#P1"]) \n\t" \
+ - "ulw %[temp6], "#C"(%["#P1"]) \n\t" \
+ - "ulw %[temp7], "#D"(%["#P1"]) \n\t" \
+ + "ulw %[temp0], " #A "(%[" #P0 "]) \n\t" \
+ + "ulw %[temp1], " #B "(%[" #P0 "]) \n\t" \
+ + "ulw %[temp2], " #C "(%[" #P0 "]) \n\t" \
+ + "ulw %[temp3], " #D "(%[" #P0 "]) \n\t" \
+ + "ulw %[temp4], " #A "(%[" #P1 "]) \n\t" \
+ + "ulw %[temp5], " #B "(%[" #P1 "]) \n\t" \
+ + "ulw %[temp6], " #C "(%[" #P1 "]) \n\t" \
+ + "ulw %[temp7], " #D "(%[" #P1 "]) \n\t" \
+ "addu %[temp4], %[temp4], %[temp0] \n\t" \
+ "addu %[temp5], %[temp5], %[temp1] \n\t" \
+ "addu %[temp6], %[temp6], %[temp2] \n\t" \
+ "addu %[temp7], %[temp7], %[temp3] \n\t" \
+ - "addiu %["#P0"], %["#P0"], 16 \n\t" \
+ - ".if "#E" == 1 \n\t" \
+ - "addiu %["#P1"], %["#P1"], 16 \n\t" \
+ + "addiu %[" #P0 "], %[" #P0 "], 16 \n\t" \
+ + ".if " #E " == 1 \n\t" \
+ + "addiu %[" #P1 "], %[" #P1 "], 16 \n\t" \
+ ".endif \n\t" \
+ - "usw %[temp4], "#A"(%["#P2"]) \n\t" \
+ - "usw %[temp5], "#B"(%["#P2"]) \n\t" \
+ - "usw %[temp6], "#C"(%["#P2"]) \n\t" \
+ - "usw %[temp7], "#D"(%["#P2"]) \n\t" \
+ - "addiu %["#P2"], %["#P2"], 16 \n\t" \
+ - "bne %["#P0"], %[LoopEnd], 1b \n\t" \
+ + "usw %[temp4], " #A "(%[" #P2 "]) \n\t" \
+ + "usw %[temp5], " #B "(%[" #P2 "]) \n\t" \
+ + "usw %[temp6], " #C "(%[" #P2 "]) \n\t" \
+ + "usw %[temp7], " #D "(%[" #P2 "]) \n\t" \
+ + "addiu %[" #P2 "], %[" #P2 "], 16 \n\t" \
+ + "bne %[" #P0 "], %[LoopEnd], 1b \n\t" \
+ ".set pop \n\t" \
+
+ #define ASM_END_COMMON_0 \
+ diff --git a/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
+ index 821cda9..31ac181 100644
+ --- a/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
+ @@ -29,14 +29,14 @@ static void FUNC_NAME(const TYPE* src, \
+ for (x = 0; x < (width >> 2); ++x) { \
+ int tmp1, tmp2, tmp3, tmp4; \
+ __asm__ volatile ( \
+ - ".ifc "#TYPE", uint8_t \n\t" \
+ + ".ifc " #TYPE ", uint8_t \n\t" \
+ "lbu %[tmp1], 0(%[src]) \n\t" \
+ "lbu %[tmp2], 1(%[src]) \n\t" \
+ "lbu %[tmp3], 2(%[src]) \n\t" \
+ "lbu %[tmp4], 3(%[src]) \n\t" \
+ "addiu %[src], %[src], 4 \n\t" \
+ ".endif \n\t" \
+ - ".ifc "#TYPE", uint32_t \n\t" \
+ + ".ifc " #TYPE ", uint32_t \n\t" \
+ "lw %[tmp1], 0(%[src]) \n\t" \
+ "lw %[tmp2], 4(%[src]) \n\t" \
+ "lw %[tmp3], 8(%[src]) \n\t" \
+ @@ -55,7 +55,7 @@ static void FUNC_NAME(const TYPE* src, \
+ "lwx %[tmp2], %[tmp2](%[color_map]) \n\t" \
+ "lwx %[tmp3], %[tmp3](%[color_map]) \n\t" \
+ "lwx %[tmp4], %[tmp4](%[color_map]) \n\t" \
+ - ".ifc "#TYPE", uint8_t \n\t" \
+ + ".ifc " #TYPE ", uint8_t \n\t" \
+ "ext %[tmp1], %[tmp1], 8, 8 \n\t" \
+ "ext %[tmp2], %[tmp2], 8, 8 \n\t" \
+ "ext %[tmp3], %[tmp3], 8, 8 \n\t" \
+ @@ -66,7 +66,7 @@ static void FUNC_NAME(const TYPE* src, \
+ "sb %[tmp4], 3(%[dst]) \n\t" \
+ "addiu %[dst], %[dst], 4 \n\t" \
+ ".endif \n\t" \
+ - ".ifc "#TYPE", uint32_t \n\t" \
+ + ".ifc " #TYPE ", uint32_t \n\t" \
+ "sw %[tmp1], 0(%[dst]) \n\t" \
+ "sw %[tmp2], 4(%[dst]) \n\t" \
+ "sw %[tmp3], 8(%[dst]) \n\t" \
+ diff --git a/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
+ index a7864a0..cb3adfe 100644
+ --- a/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
+ @@ -34,15 +34,15 @@
+ G = G - t2 + kGCst; \
+ B = B + kBCst; \
+ __asm__ volatile ( \
+ - "shll_s.w %["#R"], %["#R"], 9 \n\t" \
+ - "shll_s.w %["#G"], %["#G"], 9 \n\t" \
+ - "shll_s.w %["#B"], %["#B"], 9 \n\t" \
+ - "precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \
+ - "precrqu_s.qb.ph %["#G"], %["#G"], $zero \n\t" \
+ - "precrqu_s.qb.ph %["#B"], %["#B"], $zero \n\t" \
+ - "srl %["#R"], %["#R"], 24 \n\t" \
+ - "srl %["#G"], %["#G"], 24 \n\t" \
+ - "srl %["#B"], %["#B"], 24 \n\t" \
+ + "shll_s.w %[" #R "], %[" #R "], 9 \n\t" \
+ + "shll_s.w %[" #G "], %[" #G "], 9 \n\t" \
+ + "shll_s.w %[" #B "], %[" #B "], 9 \n\t" \
+ + "precrqu_s.qb.ph %[" #R "], %[" #R "], $zero \n\t" \
+ + "precrqu_s.qb.ph %[" #G "], %[" #G "], $zero \n\t" \
+ + "precrqu_s.qb.ph %[" #B "], %[" #B "], $zero \n\t" \
+ + "srl %[" #R "], %[" #R "], 24 \n\t" \
+ + "srl %[" #G "], %[" #G "], 24 \n\t" \
+ + "srl %[" #B "], %[" #B "], 24 \n\t" \
+ : [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \
+ : \
+ ); \
+ diff --git a/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c b/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
+ index 66adde5..51cbe9e 100644
+ --- a/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
+ +++ b/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
+ @@ -39,12 +39,12 @@
+ "addu %[temp5], %[temp0], %[temp1] \n\t" \
+ "subu %[temp6], %[temp0], %[temp2] \n\t" \
+ "addu %[temp7], %[temp0], %[temp4] \n\t" \
+ -".if "#K" \n\t" \
+ +".if " #K " \n\t" \
+ "lbu %[temp0], 1(%[y]) \n\t" \
+ ".endif \n\t" \
+ "shll_s.w %[temp5], %[temp5], 9 \n\t" \
+ "shll_s.w %[temp6], %[temp6], 9 \n\t" \
+ -".if "#K" \n\t" \
+ +".if " #K " \n\t" \
+ "mul %[temp0], %[t_con_5], %[temp0] \n\t" \
+ ".endif \n\t" \
+ "shll_s.w %[temp7], %[temp7], 9 \n\t" \
+ @@ -54,9 +54,9 @@
+ "srl %[temp5], %[temp5], 24 \n\t" \
+ "srl %[temp6], %[temp6], 24 \n\t" \
+ "srl %[temp7], %[temp7], 24 \n\t" \
+ - "sb %[temp5], "#R"(%[dst]) \n\t" \
+ - "sb %[temp6], "#G"(%[dst]) \n\t" \
+ - "sb %[temp7], "#B"(%[dst]) \n\t" \
+ + "sb %[temp5], " #R "(%[dst]) \n\t" \
+ + "sb %[temp6], " #G "(%[dst]) \n\t" \
+ + "sb %[temp7], " #B "(%[dst]) \n\t" \
+
+ #define ASM_CLOBBER_LIST() \
+ : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), \
+ --
+ 2.1.4
+
diff --git a/testing/freeimage/0004-fix-gcc-6.patch b/testing/freeimage/0004-fix-gcc-6.patch
new file mode 100644
index 0000000..7b442ab
--- /dev/null
+++ b/testing/freeimage/0004-fix-gcc-6.patch
@@ -0,0 +1,31 @@
+ libraw/dc_raw: fix gcc-6 failures
+
+ With gcc-6, it is no longer allowed to narrow the type of constants in
+ a constant array declaration.
+
+ Fixes:
+ http://autobuild.buildroot.org/results/081/0811531872f69f9febbdc482dfbdd7fb5c35d1c8/build-end.log
+
+ Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
+
+ diff -durN a/Source/LibRawLite/internal/dcraw_common.cpp b/Source/LibRawLite/internal/dcraw_common.cpp
+ --- a/Source/LibRawLite/internal/dcraw_common.cpp
+ +++ b/Source/LibRawLite/internal/dcraw_common.cpp
+ @@ -2479,7 +2479,7 @@
+
+ void CLASS kodak_radc_load_raw()
+ {
+ - static const char src[] = {
+ + static const signed char src[] = {
+ 1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8,
+ 1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8,
+ 2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8,
+ @@ -4519,7 +4519,7 @@
+ */
+ void CLASS vng_interpolate()
+ {
+ - static const signed char *cp, terms[] = {
+ + static const int *cp, terms[] = {
+ -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01,
+ -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01,
+ -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03,
diff --git a/testing/freeimage/APKBUILD b/testing/freeimage/APKBUILD
new file mode 100644
index 0000000..d948ced
--- /dev/null
+++ b/testing/freeimage/APKBUILD
@@ -0,0 +1,41 @@
+ # Contributor: Taner Tas <taner76@gmail.com>
+ # Maintainer: Taner Tas <taner76@gmail.com>
+ pkgname=freeimage
+ pkgver=3.17.0
+ pkgrel=0
+ pkgdesc="Open Source library project for developers who would like to support popular graphics image formats."
+ url="http://freeimage.sourceforge.net/"
+ arch="all"
+ license="GPL-2.0-only FreeImage"
+ _distname="FreeImage"
+ makedepends="dos2unix"
+ subpackages="$pkgname-dev"
+ source="http://downloads.sourceforge.net/${pkgname}/${_distname}${pkgver//.}.zip
+ 0001-no-root-install.patch
+ 0002-fix-cpuid-x86.patch
+ 0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
+ 0004-fix-gcc-6.patch"
+
+ options="!check"
+
+ prepare() {
+ mv ${srcdir}/${_distname} ${srcdir}/${pkgname}-${pkgver}
+ find "$builddir" -type f -exec dos2unix -q -s {} \;
+ default_prepare
+ }
+
+ build() {
+ cd "$builddir"
+ make
+ }
+
+ package() {
+ cd "$builddir"
+ #sed -i -e 's/-o root -g root//' Makefile.*
+ make DESTDIR="${pkgdir}" install
+ }
+ sha512sums="703c2626c0bcfe73eb40d720f45745208ca9650a7730759680a2b38ad3f6c719a43008477032bc70b76a95761f7d4b6f901b961359d36b54ace906dd78fb391b FreeImage3170.zip
+ 2dc51d700671962339cc1f27c0ad7e679e7ed6233d1534b81d68fcffb6e86960fa182b6916d19da7451bf34b69efe4a1b62b7f335b9802d7799706b766257d59 0001-no-root-install.patch
+ ef88862593bd8d271d11f86ec389c8a92c131ffb03fb7028e87dfddc7ae74e22bef50327175a7dcee9c414df80e84579c59f3b8e1f825d54f0fdc76a0530c06f 0002-fix-cpuid-x86.patch
+ 4208d4f3ee49424d65c5e78c18c424543208a554855a6ea1cafd32e57b7354aa36131ea62a95a6856e19c5c0ef47e7d63616e690246c1b19716dca323c3476cc 0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
+ 75050c6a6b2f30c42e9b5d1326499f4d088e3c79b23c92bea72b60fe6759d1e529b136f599d7de059c433cfc661b189d8dd6e32e9fcb0244fb27153c792d3c0e 0004-fix-gcc-6.patch"
--
2.16.2
---
Unsubscribe: alpine-aports+unsubscribe@lists.alpinelinux.org
Help: alpine-aports+help@lists.alpinelinux.org
---
[alpine-aports] Re: [PATCH v2] testing/freeimage: new aport
Thanks
Pushed. On PPC64LE fails with:
/usr/lib/gcc/powerpc64le-alpine-linux-musl/6.4.0/../../../../powerpc64le-alpine-linux-musl/bin/ld:
Source/OpenEXR/./IlmImf/ImfDwaCompressor.o: In function
`Imf_2_2::DwaCompressor::LossyDctDecoderCsc::~LossyDctDecoderCsc()':
ImfDwaCompressor.cpp:(.text._ZN7Imf_2_213DwaCompressor18LossyDctDecoderCscD2Ev[_ZN7Imf_2_213DwaCompressor18LossyDctDecoderCscD5Ev]+0x14):
call to
`Imf_2_2::DwaCompressor::LossyDctDecoderBase::~LossyDctDecoderBase()' lacks
nop, can't restore toc; recompile with -fPIC
/usr/lib/gcc/powerpc64le-alpine-linux-musl/6.4.0/../../../../powerpc64le-alpine-linux-musl/bin/ld:
final link failed: Bad value
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile.gnu:70: libfreeimage-3.17.0.so] Error 1
I've disabled it on this arch for now.
/eo
On Wed, Feb 28, 2018 at 6:55 PM, Taner Tas <taner76@gmail.com > wrote:
> ---
> testing/freeimage/0001-no-root-install.patch | 16 +
> testing/freeimage/0002-fix-cpuid-x86.patch | 67 ++
> ...P-fix-compilation-issue-with-GCC-5.x-C-11.patch | 1172
> ++++++++++++++++++++
> testing/freeimage/0004-fix-gcc-6.patch | 31 +
> testing/freeimage/APKBUILD | 41 +
> 5 files changed, 1327 insertions(+)
> create mode 100644 testing/freeimage/0001-no-root-install.patch
> create mode 100644 testing/freeimage/0002-fix-cpuid-x86.patch
> create mode 100644 testing/freeimage/0003-LibWebP-fix-compilation-issue-
> with-GCC-5.x-C-11.patch
> create mode 100644 testing/freeimage/0004-fix-gcc-6.patch
> create mode 100644 testing/freeimage/APKBUILD
>
> diff --git a/testing/freeimage/0001-no-root-install.patch
> b/testing/freeimage/0001-no-root-install.patch
> new file mode 100644
> index 0000000..d3b062d
> --- /dev/null
> +++ b/testing/freeimage/0001-no-root-install.patch
> @@ -0,0 +1,16 @@
> +diff -ruN a/Makefile.gnu b/Makefile.gnu
> +--- a/Makefile.gnu 2015-04-09 16:34:02.315316841 +0200
> ++++ b/Makefile.gnu 2015-04-09 16:34:28.875483201 +0200
> +@@ -71,9 +71,9 @@
> +
> + install:
> + install -d $(INCDIR) $(INSTALLDIR)
> +- install -m 644 -o root -g root $(HEADER) $(INCDIR)
> +- install -m 644 -o root -g root $(STATICLIB) $(INSTALLDIR)
> +- install -m 755 -o root -g root $(SHAREDLIB) $(INSTALLDIR)
> ++ install -m 644 $(HEADER) $(INCDIR)
> ++ install -m 644 $(STATICLIB) $(INSTALLDIR)
> ++ install -m 755 $(SHAREDLIB) $(INSTALLDIR)
> + ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(VERLIBNAME)
> + ln -sf $(VERLIBNAME) $(INSTALLDIR)/$(LIBNAME)
> + # ldconfig
> diff --git a/testing/freeimage/0002-fix-cpuid-x86.patch
> b/testing/freeimage/0002-fix-cpuid-x86.patch
> new file mode 100644
> index 0000000..98b0e9c
> --- /dev/null
> +++ b/testing/freeimage/0002-fix-cpuid-x86.patch
> @@ -0,0 +1,67 @@
> +Fix build issue caused by invalid register usage on x86
> +
> +Patch taken from https://github.com/openexr/openexr/issues/128 .
> +
> +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com >
> +
> +Index: b/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
> +===================================================================
> +--- a/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
> ++++ b/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp
> +@@ -40,21 +40,19 @@
> +
> + namespace {
> + #if defined(IMF_HAVE_SSE2) && defined(__GNUC__)
> +-
> ++#include <cpuid.h>
> + // Helper functions for gcc + SSE enabled
> +- void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx)
> ++ void cpuid(unsigned int n, unsigned int &eax, unsigned int &ebx,
> ++ unsigned int &ecx, unsigned int
> &edx)
> + {
> +- __asm__ __volatile__ (
> +- "cpuid"
> +- : /* Output */ "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
> +- : /* Input */ "a"(n)
> +- : /* Clobber */);
> ++ __get_cpuid(n, &eax, &ebx, &ecx, &edx);
> + }
> +
> + #else // IMF_HAVE_SSE2 && __GNUC__
> +
> + // Helper functions for generic compiler - all disabled
> +- void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx)
> ++ void cpuid(unsigned int n, unsigned int &eax, unsigned int &ebx,
> ++ unsigned int &ecx, unsigned int
> &edx)
> + {
> + eax = ebx = ecx = edx = 0;
> + }
> +@@ -64,7 +62,7 @@
> +
> + #ifdef OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX
> +
> +- void xgetbv(int n, int &eax, int &edx)
> ++ void xgetbv(unsigned int n, unsigned int &eax, unsigned int &edx)
> + {
> + __asm__ __volatile__ (
> + "xgetbv"
> +@@ -75,7 +73,7 @@
> +
> + #else // OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX
> +
> +- void xgetbv(int n, int &eax, int &edx)
> ++ void xgetbv(unsigned int n, unsigned int &eax, unsigned int &edx)
> + {
> + eax = edx = 0;
> + }
> +@@ -94,8 +92,8 @@
> + f16c(false)
> + {
> + bool osxsave = false;
> +- int max = 0;
> +- int eax, ebx, ecx, edx;
> ++ unsigned int max = 0;
> ++ unsigned int eax, ebx, ecx, edx;
> +
> + cpuid(0, max, ebx, ecx, edx);
> + if (max > 0)
> diff --git a/testing/freeimage/0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
> b/testing/freeimage/0003-LibWebP-fix-compilation-issue-
> with-GCC-5.x-C-11.patch
> new file mode 100644
> index 0000000..20c11ea
> --- /dev/null
> +++ b/testing/freeimage/0003-LibWebP-fix-compilation-issue-
> with-GCC-5.x-C-11.patch
> @@ -0,0 +1,1172 @@
> +From 44bce1b66c1cdd5308ac3ac773ea0a53d83790fd Mon Sep 17 00:00:00 2001
> +From: Peter Korsgaard <peter@korsgaard.com >
> +Date: Tue, 24 Nov 2015 21:16:39 +0100
> +Subject: [PATCH] LibWebP: fix compilation issue with GCC 5.x / C++11
> +
> +GCC 5.1 / C++11 gets confused about the "#<TEXT>" in the inline assembly
> +code, and dies with errors like:
> +
> +Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:34: error:
> invalid
> +character ' ' in raw string delimiter
> +
> +Fix it by introducting white space around the string literals like it has
> +been done in upstream webp:
> +
> +https://chromium.googlesource.com/webm/libwebp/+/
> eebaf97f5a1cb713d81d311308d8a48c124e5aef
> +
> +Discussed upstream:
> +http://sourceforge.net/p/freeimage/discussion/36110/thread/605ef8e4/
> +
> +[Scripted by sed -i 's/"\(#[A-Z0-9]*\)"/" \1 "/g' *.c]
> +Signed-off-by: Peter Korsgaard <peter@korsgaard.com >
> +---
> + Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c | 28 +-
> + Source/LibWebP/src/dsp/dsp.enc_mips32.c | 314
> ++++++++++-----------
> + Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c | 288
> +++++++++----------
> + Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c | 10 +-
> + Source/LibWebP/src/dsp/dsp.lossless_mips32.c | 34 +--
> + Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c | 8 +-
> + .../LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c | 18 +-
> + Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c | 10 +-
> + 8 files changed, 355 insertions(+), 355 deletions(-)
> +
> +diff --git a/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
> b/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
> +index dac2c93..aaa8111 100644
> +--- a/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
> ++++ b/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c
> +@@ -548,10 +548,10 @@ static void SimpleVFilter16(uint8_t* p, int stride,
> int thresh) {
> + // TEMP3 = SRC[D + D1 * BPS]
> + #define LOAD_4_BYTES(TEMP0, TEMP1, TEMP2, TEMP3,
> \
> + A, A1, B, B1, C, C1, D, D1, SRC)
> \
> +- "lbu %["#TEMP0"], "#A"+"#A1"*"XSTR(BPS)"(%["#SRC"])
> \n\t" \
> +- "lbu %["#TEMP1"], "#B"+"#B1"*"XSTR(BPS)"(%["#SRC"])
> \n\t" \
> +- "lbu %["#TEMP2"], "#C"+"#C1"*"XSTR(BPS)"(%["#SRC"])
> \n\t" \
> +- "lbu %["#TEMP3"], "#D"+"#D1"*"XSTR(BPS)"(%["#SRC"])
> \n\t" \
> ++ "lbu %[" #TEMP0 "], " #A "+" #A1 "*"XSTR(BPS)"(%[" #SRC
> "]) \n\t" \
> ++ "lbu %[" #TEMP1 "], " #B "+" #B1 "*"XSTR(BPS)"(%[" #SRC
> "]) \n\t" \
> ++ "lbu %[" #TEMP2 "], " #C "+" #C1 "*"XSTR(BPS)"(%[" #SRC
> "]) \n\t" \
> ++ "lbu %[" #TEMP3 "], " #D "+" #D1 "*"XSTR(BPS)"(%[" #SRC
> "]) \n\t" \
> +
> + static void SimpleHFilter16(uint8_t* p, int stride, int thresh) {
> + int i;
> +@@ -623,8 +623,8 @@ static void SimpleHFilter16i(uint8_t* p, int stride,
> int thresh) {
> + // DST[A * BPS] = TEMP0
> + // DST[B + C * BPS] = TEMP1
> + #define STORE_8_BYTES(TEMP0, TEMP1, A, B, C, DST)
> \
> +- "usw %["#TEMP0"], "#A"*"XSTR(BPS)"(%["#DST"])
> \n\t" \
> +- "usw %["#TEMP1"], "#B"+"#C"*"XSTR(BPS)"(%["#DST"]) \n\t"
> ++ "usw %[" #TEMP0 "], " #A "*"XSTR(BPS)"(%[" #DST "])
> \n\t" \
> ++ "usw %[" #TEMP1 "], " #B "+" #C "*"XSTR(BPS)"(%[" #DST "])
> \n\t"
> +
> + static void VE4(uint8_t* dst) { // vertical
> + const uint8_t* top = dst - BPS;
> +@@ -725,8 +725,8 @@ static void RD4(uint8_t* dst) { // Down-right
> + // TEMP0 = SRC[A * BPS]
> + // TEMP1 = SRC[B + C * BPS]
> + #define LOAD_8_BYTES(TEMP0, TEMP1, A, B, C, SRC)
> \
> +- "ulw %["#TEMP0"], "#A"*"XSTR(BPS)"(%["#SRC"])
> \n\t" \
> +- "ulw %["#TEMP1"], "#B"+"#C"*"XSTR(BPS)"(%["#SRC"]) \n\t"
> ++ "ulw %[" #TEMP0 "], " #A "*"XSTR(BPS)"(%[" #SRC "])
> \n\t" \
> ++ "ulw %[" #TEMP1 "], " #B "+" #C "*"XSTR(BPS)"(%[" #SRC "])
> \n\t"
> +
> + static void LD4(uint8_t* dst) { // Down-Left
> + int temp0, temp1, temp2, temp3, temp4;
> +@@ -873,24 +873,24 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with
> no top samples
> + #define CLIPPING(SIZE)
> \
> + "preceu.ph.qbl %[temp2], %[temp0] \n\t"
> \
> + "preceu.ph.qbr %[temp0], %[temp0] \n\t"
> \
> +-".if "#SIZE" == 8 \n\t"
> \
> ++".if " #SIZE " == 8 \n\t"
> \
> + "preceu.ph.qbl %[temp3], %[temp1] \n\t"
> \
> + "preceu.ph.qbr %[temp1], %[temp1] \n\t"
> \
> + ".endif \n\t"
> \
> + "addu.ph %[temp2], %[temp2], %[dst_1] \n\t"
> \
> + "addu.ph %[temp0], %[temp0], %[dst_1] \n\t"
> \
> +-".if "#SIZE" == 8 \n\t"
> \
> ++".if " #SIZE " == 8 \n\t"
> \
> + "addu.ph %[temp3], %[temp3], %[dst_1] \n\t"
> \
> + "addu.ph %[temp1], %[temp1], %[dst_1] \n\t"
> \
> + ".endif \n\t"
> \
> + "shll_s.ph %[temp2], %[temp2], 7 \n\t"
> \
> + "shll_s.ph %[temp0], %[temp0], 7 \n\t"
> \
> +-".if "#SIZE" == 8 \n\t"
> \
> ++".if " #SIZE " == 8 \n\t"
> \
> + "shll_s.ph %[temp3], %[temp3], 7 \n\t"
> \
> + "shll_s.ph %[temp1], %[temp1], 7 \n\t"
> \
> + ".endif \n\t"
> \
> + "precrqu_s.qb.ph %[temp0], %[temp2], %[temp0] \n\t"
> \
> +-".if "#SIZE" == 8 \n\t"
> \
> ++".if " #SIZE " == 8 \n\t"
> \
> + "precrqu_s.qb.ph %[temp1], %[temp3], %[temp1] \n\t"
> \
> + ".endif \n\t"
> +
> +@@ -899,7 +899,7 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with no
> top samples
> + int dst_1 = ((int)(DST)[-1] << 16) + (DST)[-1];
> \
> + int temp0, temp1, temp2, temp3;
> \
> + __asm__ volatile (
> \
> +- ".if "#SIZE" < 8 \n\t"
> \
> ++ ".if " #SIZE " < 8 \n\t"
> \
> + "ulw %[temp0], 0(%[top]) \n\t"
> \
> + "subu.ph %[dst_1], %[dst_1], %[top_1] \n\t"
> \
> + CLIPPING(4)
> \
> +@@ -911,7 +911,7 @@ static void DC8uvNoTop(uint8_t* dst) { // DC with no
> top samples
> + CLIPPING(8)
> \
> + "usw %[temp0], 0(%[dst]) \n\t"
> \
> + "usw %[temp1], 4(%[dst]) \n\t"
> \
> +- ".if "#SIZE" == 16 \n\t"
> \
> ++ ".if " #SIZE " == 16 \n\t"
> \
> + "ulw %[temp0], 8(%[top]) \n\t"
> \
> + "ulw %[temp1], 12(%[top]) \n\t"
> \
> + CLIPPING(8)
> \
> +diff --git a/Source/LibWebP/src/dsp/dsp.enc_mips32.c
> b/Source/LibWebP/src/dsp/dsp.enc_mips32.c
> +index 545aa3a..bf1c16d 100644
> +--- a/Source/LibWebP/src/dsp/dsp.enc_mips32.c
> ++++ b/Source/LibWebP/src/dsp/dsp.enc_mips32.c
> +@@ -31,26 +31,26 @@ static const int kC2 = 35468;
> + // TEMP0..TEMP3 - registers for corresponding tmp elements
> + // TEMP4..TEMP5 - temporary registers
> + #define VERTICAL_PASS(A, B, C, D, TEMP4, TEMP0, TEMP1, TEMP2, TEMP3)
> \
> +- "lh %[temp16], "#A"(%[temp20]) \n\t"
> \
> +- "lh %[temp18], "#B"(%[temp20]) \n\t"
> \
> +- "lh %[temp17], "#C"(%[temp20]) \n\t"
> \
> +- "lh %[temp19], "#D"(%[temp20]) \n\t"
> \
> +- "addu %["#TEMP4"], %[temp16], %[temp18] \n\t"
> \
> ++ "lh %[temp16], " #A "(%[temp20]) \n\t"
> \
> ++ "lh %[temp18], " #B "(%[temp20]) \n\t"
> \
> ++ "lh %[temp17], " #C "(%[temp20]) \n\t"
> \
> ++ "lh %[temp19], " #D "(%[temp20]) \n\t"
> \
> ++ "addu %[" #TEMP4 "], %[temp16], %[temp18] \n\t"
> \
> + "subu %[temp16], %[temp16], %[temp18] \n\t"
> \
> +- "mul %["#TEMP0"], %[temp17], %[kC2] \n\t"
> \
> ++ "mul %[" #TEMP0 "], %[temp17], %[kC2] \n\t"
> \
> + "mul %[temp18], %[temp19], %[kC1] \n\t"
> \
> + "mul %[temp17], %[temp17], %[kC1] \n\t"
> \
> + "mul %[temp19], %[temp19], %[kC2] \n\t"
> \
> +- "sra %["#TEMP0"], %["#TEMP0"], 16 \n\n"
> \
> ++ "sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\n"
> \
> + "sra %[temp18], %[temp18], 16 \n\n"
> \
> + "sra %[temp17], %[temp17], 16 \n\n"
> \
> + "sra %[temp19], %[temp19], 16 \n\n"
> \
> +- "subu %["#TEMP2"], %["#TEMP0"], %[temp18] \n\t"
> \
> +- "addu %["#TEMP3"], %[temp17], %[temp19] \n\t"
> \
> +- "addu %["#TEMP0"], %["#TEMP4"], %["#TEMP3"] \n\t"
> \
> +- "addu %["#TEMP1"], %[temp16], %["#TEMP2"] \n\t"
> \
> +- "subu %["#TEMP2"], %[temp16], %["#TEMP2"] \n\t"
> \
> +- "subu %["#TEMP3"], %["#TEMP4"], %["#TEMP3"] \n\t"
> ++ "subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp18] \n\t"
> \
> ++ "addu %[" #TEMP3 "], %[temp17], %[temp19] \n\t"
> \
> ++ "addu %[" #TEMP0 "], %[" #TEMP4 "], %[" #TEMP3 "] \n\t"
> \
> ++ "addu %[" #TEMP1 "], %[temp16], %[" #TEMP2 "] \n\t"
> \
> ++ "subu %[" #TEMP2 "], %[temp16], %[" #TEMP2 "] \n\t"
> \
> ++ "subu %[" #TEMP3 "], %[" #TEMP4 "], %[" #TEMP3 "] \n\t"
> +
> + // macro for one horizontal pass in ITransformOne
> + // MUL and STORE macros inlined
> +@@ -59,58 +59,58 @@ static const int kC2 = 35468;
> + // A - offset in bytes to load from ref and store to dst buffer
> + // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp
> elements
> + #define HORIZONTAL_PASS(A, TEMP0, TEMP4, TEMP8, TEMP12)
> \
> +- "addiu %["#TEMP0"], %["#TEMP0"], 4 \n\t"
> \
> +- "addu %[temp16], %["#TEMP0"], %["#TEMP8"] \n\t"
> \
> +- "subu %[temp17], %["#TEMP0"], %["#TEMP8"] \n\t"
> \
> +- "mul %["#TEMP0"], %["#TEMP4"], %[kC2] \n\t"
> \
> +- "mul %["#TEMP8"], %["#TEMP12"], %[kC1] \n\t"
> \
> +- "mul %["#TEMP4"], %["#TEMP4"], %[kC1] \n\t"
> \
> +- "mul %["#TEMP12"], %["#TEMP12"], %[kC2] \n\t"
> \
> +- "sra %["#TEMP0"], %["#TEMP0"], 16 \n\t"
> \
> +- "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t"
> \
> +- "sra %["#TEMP4"], %["#TEMP4"], 16 \n\t"
> \
> +- "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t"
> \
> +- "subu %[temp18], %["#TEMP0"], %["#TEMP8"] \n\t"
> \
> +- "addu %[temp19], %["#TEMP4"], %["#TEMP12"] \n\t"
> \
> +- "addu %["#TEMP0"], %[temp16], %[temp19] \n\t"
> \
> +- "addu %["#TEMP4"], %[temp17], %[temp18] \n\t"
> \
> +- "subu %["#TEMP8"], %[temp17], %[temp18] \n\t"
> \
> +- "subu %["#TEMP12"], %[temp16], %[temp19] \n\t"
> \
> ++ "addiu %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t"
> \
> ++ "addu %[temp16], %[" #TEMP0 "], %[" #TEMP8 "] \n\t"
> \
> ++ "subu %[temp17], %[" #TEMP0 "], %[" #TEMP8 "] \n\t"
> \
> ++ "mul %[" #TEMP0 "], %[" #TEMP4 "], %[kC2] \n\t"
> \
> ++ "mul %[" #TEMP8 "], %[" #TEMP12 "], %[kC1] \n\t"
> \
> ++ "mul %[" #TEMP4 "], %[" #TEMP4 "], %[kC1] \n\t"
> \
> ++ "mul %[" #TEMP12 "], %[" #TEMP12 "], %[kC2] \n\t"
> \
> ++ "sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\t"
> \
> ++ "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t"
> \
> ++ "sra %[" #TEMP4 "], %[" #TEMP4 "], 16 \n\t"
> \
> ++ "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t"
> \
> ++ "subu %[temp18], %[" #TEMP0 "], %[" #TEMP8 "] \n\t"
> \
> ++ "addu %[temp19], %[" #TEMP4 "], %[" #TEMP12 "] \n\t"
> \
> ++ "addu %[" #TEMP0 "], %[temp16], %[temp19] \n\t"
> \
> ++ "addu %[" #TEMP4 "], %[temp17], %[temp18] \n\t"
> \
> ++ "subu %[" #TEMP8 "], %[temp17], %[temp18] \n\t"
> \
> ++ "subu %[" #TEMP12 "], %[temp16], %[temp19] \n\t"
> \
> + "lw %[temp20], 0(%[args]) \n\t"
> \
> +- "sra %["#TEMP0"], %["#TEMP0"], 3 \n\t"
> \
> +- "sra %["#TEMP4"], %["#TEMP4"], 3 \n\t"
> \
> +- "sra %["#TEMP8"], %["#TEMP8"], 3 \n\t"
> \
> +- "sra %["#TEMP12"], %["#TEMP12"], 3 \n\t"
> \
> +- "lbu %[temp16], 0+"XSTR(BPS)"*"#A"(%[temp20]) \n\t"
> \
> +- "lbu %[temp17], 1+"XSTR(BPS)"*"#A"(%[temp20]) \n\t"
> \
> +- "lbu %[temp18], 2+"XSTR(BPS)"*"#A"(%[temp20]) \n\t"
> \
> +- "lbu %[temp19], 3+"XSTR(BPS)"*"#A"(%[temp20]) \n\t"
> \
> +- "addu %["#TEMP0"], %[temp16], %["#TEMP0"] \n\t"
> \
> +- "addu %["#TEMP4"], %[temp17], %["#TEMP4"] \n\t"
> \
> +- "addu %["#TEMP8"], %[temp18], %["#TEMP8"] \n\t"
> \
> +- "addu %["#TEMP12"], %[temp19], %["#TEMP12"] \n\t"
> \
> +- "slt %[temp16], %["#TEMP0"], $zero \n\t"
> \
> +- "slt %[temp17], %["#TEMP4"], $zero \n\t"
> \
> +- "slt %[temp18], %["#TEMP8"], $zero \n\t"
> \
> +- "slt %[temp19], %["#TEMP12"], $zero \n\t"
> \
> +- "movn %["#TEMP0"], $zero, %[temp16] \n\t"
> \
> +- "movn %["#TEMP4"], $zero, %[temp17] \n\t"
> \
> +- "movn %["#TEMP8"], $zero, %[temp18] \n\t"
> \
> +- "movn %["#TEMP12"], $zero, %[temp19] \n\t"
> \
> ++ "sra %[" #TEMP0 "], %[" #TEMP0 "], 3 \n\t"
> \
> ++ "sra %[" #TEMP4 "], %[" #TEMP4 "], 3 \n\t"
> \
> ++ "sra %[" #TEMP8 "], %[" #TEMP8 "], 3 \n\t"
> \
> ++ "sra %[" #TEMP12 "], %[" #TEMP12 "], 3 \n\t"
> \
> ++ "lbu %[temp16], 0+"XSTR(BPS)"*" #A "(%[temp20]) \n\t"
> \
> ++ "lbu %[temp17], 1+"XSTR(BPS)"*" #A "(%[temp20]) \n\t"
> \
> ++ "lbu %[temp18], 2+"XSTR(BPS)"*" #A "(%[temp20]) \n\t"
> \
> ++ "lbu %[temp19], 3+"XSTR(BPS)"*" #A "(%[temp20]) \n\t"
> \
> ++ "addu %[" #TEMP0 "], %[temp16], %[" #TEMP0 "] \n\t"
> \
> ++ "addu %[" #TEMP4 "], %[temp17], %[" #TEMP4 "] \n\t"
> \
> ++ "addu %[" #TEMP8 "], %[temp18], %[" #TEMP8 "] \n\t"
> \
> ++ "addu %[" #TEMP12 "], %[temp19], %[" #TEMP12 "] \n\t"
> \
> ++ "slt %[temp16], %[" #TEMP0 "], $zero \n\t"
> \
> ++ "slt %[temp17], %[" #TEMP4 "], $zero \n\t"
> \
> ++ "slt %[temp18], %[" #TEMP8 "], $zero \n\t"
> \
> ++ "slt %[temp19], %[" #TEMP12 "], $zero \n\t"
> \
> ++ "movn %[" #TEMP0 "], $zero, %[temp16] \n\t"
> \
> ++ "movn %[" #TEMP4 "], $zero, %[temp17] \n\t"
> \
> ++ "movn %[" #TEMP8 "], $zero, %[temp18] \n\t"
> \
> ++ "movn %[" #TEMP12 "], $zero, %[temp19] \n\t"
> \
> + "addiu %[temp20], $zero, 255 \n\t"
> \
> +- "slt %[temp16], %["#TEMP0"], %[temp20] \n\t"
> \
> +- "slt %[temp17], %["#TEMP4"], %[temp20] \n\t"
> \
> +- "slt %[temp18], %["#TEMP8"], %[temp20] \n\t"
> \
> +- "slt %[temp19], %["#TEMP12"], %[temp20] \n\t"
> \
> +- "movz %["#TEMP0"], %[temp20], %[temp16] \n\t"
> \
> +- "movz %["#TEMP4"], %[temp20], %[temp17] \n\t"
> \
> ++ "slt %[temp16], %[" #TEMP0 "], %[temp20] \n\t"
> \
> ++ "slt %[temp17], %[" #TEMP4 "], %[temp20] \n\t"
> \
> ++ "slt %[temp18], %[" #TEMP8 "], %[temp20] \n\t"
> \
> ++ "slt %[temp19], %[" #TEMP12 "], %[temp20] \n\t"
> \
> ++ "movz %[" #TEMP0 "], %[temp20], %[temp16] \n\t"
> \
> ++ "movz %[" #TEMP4 "], %[temp20], %[temp17] \n\t"
> \
> + "lw %[temp16], 8(%[args]) \n\t"
> \
> +- "movz %["#TEMP8"], %[temp20], %[temp18] \n\t"
> \
> +- "movz %["#TEMP12"], %[temp20], %[temp19] \n\t"
> \
> +- "sb %["#TEMP0"], 0+"XSTR(BPS)"*"#A"(%[temp16]) \n\t"
> \
> +- "sb %["#TEMP4"], 1+"XSTR(BPS)"*"#A"(%[temp16]) \n\t"
> \
> +- "sb %["#TEMP8"], 2+"XSTR(BPS)"*"#A"(%[temp16]) \n\t"
> \
> +- "sb %["#TEMP12"], 3+"XSTR(BPS)"*"#A"(%[temp16]) \n\t"
> ++ "movz %[" #TEMP8 "], %[temp20], %[temp18] \n\t"
> \
> ++ "movz %[" #TEMP12 "], %[temp20], %[temp19] \n\t"
> \
> ++ "sb %[" #TEMP0 "], 0+"XSTR(BPS)"*" #A "(%[temp16]) \n\t"
> \
> ++ "sb %[" #TEMP4 "], 1+"XSTR(BPS)"*" #A "(%[temp16]) \n\t"
> \
> ++ "sb %[" #TEMP8 "], 2+"XSTR(BPS)"*" #A "(%[temp16]) \n\t"
> \
> ++ "sb %[" #TEMP12 "], 3+"XSTR(BPS)"*" #A "(%[temp16]) \n\t"
> +
> + // Does one or two inverse transforms.
> + static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t*
> in,
> +@@ -161,9 +161,9 @@ static void ITransform(const uint8_t* ref, const
> int16_t* in,
> + // K - offset in bytes (kZigzag[n] * 4)
> + // N - offset in bytes (n * 2)
> + #define QUANTIZE_ONE(J, K, N)
> \
> +- "lh %[temp0], "#J"(%[ppin])
> \n\t" \
> +- "lhu %[temp1], "#J"(%[ppsharpen])
> \n\t" \
> +- "lw %[temp2], "#K"(%[ppzthresh])
> \n\t" \
> ++ "lh %[temp0], " #J "(%[ppin])
> \n\t" \
> ++ "lhu %[temp1], " #J "(%[ppsharpen])
> \n\t" \
> ++ "lw %[temp2], " #K "(%[ppzthresh])
> \n\t" \
> + "sra %[sign], %[temp0], 15
> \n\t" \
> + "xor %[coeff], %[temp0], %[sign]
> \n\t" \
> + "subu %[coeff], %[coeff], %[sign]
> \n\t" \
> +@@ -172,9 +172,9 @@ static void ITransform(const uint8_t* ref, const
> int16_t* in,
> + "addiu %[temp5], $zero, 0
> \n\t" \
> + "addiu %[level], $zero, 0
> \n\t" \
> + "beqz %[temp4], 2f
> \n\t" \
> +- "lhu %[temp1], "#J"(%[ppiq])
> \n\t" \
> +- "lw %[temp2], "#K"(%[ppbias])
> \n\t" \
> +- "lhu %[temp3], "#J"(%[ppq])
> \n\t" \
> ++ "lhu %[temp1], " #J "(%[ppiq])
> \n\t" \
> ++ "lw %[temp2], " #K "(%[ppbias])
> \n\t" \
> ++ "lhu %[temp3], " #J "(%[ppq])
> \n\t" \
> + "mul %[level], %[coeff], %[temp1]
> \n\t" \
> + "addu %[level], %[level], %[temp2]
> \n\t" \
> + "sra %[level], %[level], 17
> \n\t" \
> +@@ -184,8 +184,8 @@ static void ITransform(const uint8_t* ref, const
> int16_t* in,
> + "subu %[level], %[level], %[sign]
> \n\t" \
> + "mul %[temp5], %[level], %[temp3]
> \n\t" \
> + "2:
> \n\t" \
> +- "sh %[temp5], "#J"(%[ppin])
> \n\t" \
> +- "sh %[level], "#N"(%[pout]) \n\t"
> ++ "sh %[temp5], " #J "(%[ppin])
> \n\t" \
> ++ "sh %[level], " #N "(%[pout])
> \n\t"
> +
> + static int QuantizeBlock(int16_t in[16], int16_t out[16],
> + const VP8Matrix* const mtx) {
> +@@ -254,14 +254,14 @@ static int Quantize2Blocks(int16_t in[32], int16_t
> out[32],
> + // E..H - offsets in bytes to store first results to tmp buffer
> + // E1..H1 - offsets in bytes to store second results to tmp buffer
> + #define HORIZONTAL_PASS(A, E, F, G, H, E1, F1, G1, H1) \
> +- "lbu %[temp0], 0+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
> +- "lbu %[temp1], 1+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
> +- "lbu %[temp2], 2+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
> +- "lbu %[temp3], 3+"XSTR(BPS)"*"#A"(%[a]) \n\t" \
> +- "lbu %[temp4], 0+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
> +- "lbu %[temp5], 1+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
> +- "lbu %[temp6], 2+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
> +- "lbu %[temp7], 3+"XSTR(BPS)"*"#A"(%[b]) \n\t" \
> ++ "lbu %[temp0], 0+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
> ++ "lbu %[temp1], 1+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
> ++ "lbu %[temp2], 2+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
> ++ "lbu %[temp3], 3+"XSTR(BPS)"*" #A "(%[a]) \n\t" \
> ++ "lbu %[temp4], 0+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
> ++ "lbu %[temp5], 1+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
> ++ "lbu %[temp6], 2+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
> ++ "lbu %[temp7], 3+"XSTR(BPS)"*" #A "(%[b]) \n\t" \
> + "addu %[temp8], %[temp0], %[temp2] \n\t" \
> + "subu %[temp0], %[temp0], %[temp2] \n\t" \
> + "addu %[temp2], %[temp1], %[temp3] \n\t" \
> +@@ -278,14 +278,14 @@ static int Quantize2Blocks(int16_t in[32], int16_t
> out[32],
> + "subu %[temp3], %[temp3], %[temp6] \n\t" \
> + "addu %[temp6], %[temp4], %[temp5] \n\t" \
> + "subu %[temp4], %[temp4], %[temp5] \n\t" \
> +- "sw %[temp7], "#E"(%[tmp]) \n\t" \
> +- "sw %[temp2], "#H"(%[tmp]) \n\t" \
> +- "sw %[temp8], "#F"(%[tmp]) \n\t" \
> +- "sw %[temp0], "#G"(%[tmp]) \n\t" \
> +- "sw %[temp1], "#E1"(%[tmp]) \n\t" \
> +- "sw %[temp3], "#H1"(%[tmp]) \n\t" \
> +- "sw %[temp6], "#F1"(%[tmp]) \n\t" \
> +- "sw %[temp4], "#G1"(%[tmp]) \n\t"
> ++ "sw %[temp7], " #E "(%[tmp]) \n\t" \
> ++ "sw %[temp2], " #H "(%[tmp]) \n\t" \
> ++ "sw %[temp8], " #F "(%[tmp]) \n\t" \
> ++ "sw %[temp0], " #G "(%[tmp]) \n\t" \
> ++ "sw %[temp1], " #E1 "(%[tmp]) \n\t" \
> ++ "sw %[temp3], " #H1 "(%[tmp]) \n\t" \
> ++ "sw %[temp6], " #F1 "(%[tmp]) \n\t" \
> ++ "sw %[temp4], " #G1 "(%[tmp]) \n\t"
> +
> + // macro for one vertical pass in Disto4x4 (TTransform)
> + // two calls of function TTransform are merged into single one
> +@@ -300,10 +300,10 @@ static int Quantize2Blocks(int16_t in[32], int16_t
> out[32],
> + // A1..D1 - offsets in bytes to load second results from tmp buffer
> + // E..H - offsets in bytes to load from w buffer
> + #define VERTICAL_PASS(A, B, C, D, A1, B1, C1, D1, E, F, G, H) \
> +- "lw %[temp0], "#A1"(%[tmp]) \n\t" \
> +- "lw %[temp1], "#C1"(%[tmp]) \n\t" \
> +- "lw %[temp2], "#B1"(%[tmp]) \n\t" \
> +- "lw %[temp3], "#D1"(%[tmp]) \n\t" \
> ++ "lw %[temp0], " #A1 "(%[tmp]) \n\t" \
> ++ "lw %[temp1], " #C1 "(%[tmp]) \n\t" \
> ++ "lw %[temp2], " #B1 "(%[tmp]) \n\t" \
> ++ "lw %[temp3], " #D1 "(%[tmp]) \n\t" \
> + "addu %[temp8], %[temp0], %[temp1] \n\t" \
> + "subu %[temp0], %[temp0], %[temp1] \n\t" \
> + "addu %[temp1], %[temp2], %[temp3] \n\t" \
> +@@ -324,18 +324,18 @@ static int Quantize2Blocks(int16_t in[32], int16_t
> out[32],
> + "subu %[temp1], %[temp1], %[temp5] \n\t" \
> + "subu %[temp0], %[temp0], %[temp6] \n\t" \
> + "subu %[temp8], %[temp8], %[temp7] \n\t" \
> +- "lhu %[temp4], "#E"(%[w]) \n\t" \
> +- "lhu %[temp5], "#F"(%[w]) \n\t" \
> +- "lhu %[temp6], "#G"(%[w]) \n\t" \
> +- "lhu %[temp7], "#H"(%[w]) \n\t" \
> ++ "lhu %[temp4], " #E "(%[w]) \n\t" \
> ++ "lhu %[temp5], " #F "(%[w]) \n\t" \
> ++ "lhu %[temp6], " #G "(%[w]) \n\t" \
> ++ "lhu %[temp7], " #H "(%[w]) \n\t" \
> + "madd %[temp4], %[temp3] \n\t" \
> + "madd %[temp5], %[temp1] \n\t" \
> + "madd %[temp6], %[temp0] \n\t" \
> + "madd %[temp7], %[temp8] \n\t" \
> +- "lw %[temp0], "#A"(%[tmp]) \n\t" \
> +- "lw %[temp1], "#C"(%[tmp]) \n\t" \
> +- "lw %[temp2], "#B"(%[tmp]) \n\t" \
> +- "lw %[temp3], "#D"(%[tmp]) \n\t" \
> ++ "lw %[temp0], " #A "(%[tmp]) \n\t" \
> ++ "lw %[temp1], " #C "(%[tmp]) \n\t" \
> ++ "lw %[temp2], " #B "(%[tmp]) \n\t" \
> ++ "lw %[temp3], " #D "(%[tmp]) \n\t" \
> + "addu %[temp8], %[temp0], %[temp1] \n\t" \
> + "subu %[temp0], %[temp0], %[temp1] \n\t" \
> + "addu %[temp1], %[temp2], %[temp3] \n\t" \
> +@@ -413,70 +413,70 @@ static int Disto16x16(const uint8_t* const a, const
> uint8_t* const b,
> + // A - offset in bytes to load from src and ref buffers
> + // TEMP0..TEMP3 - registers for corresponding tmp elements
> + #define HORIZONTAL_PASS(A, TEMP0, TEMP1, TEMP2, TEMP3) \
> +- "lw %["#TEMP1"], 0(%[args]) \n\t" \
> +- "lw %["#TEMP2"], 4(%[args]) \n\t" \
> +- "lbu %[temp16], 0+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
> +- "lbu %[temp17], 0+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
> +- "lbu %[temp18], 1+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
> +- "lbu %[temp19], 1+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
> ++ "lw %[" #TEMP1 "], 0(%[args]) \n\t" \
> ++ "lw %[" #TEMP2 "], 4(%[args]) \n\t" \
> ++ "lbu %[temp16], 0+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
> ++ "lbu %[temp17], 0+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
> ++ "lbu %[temp18], 1+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
> ++ "lbu %[temp19], 1+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
> + "subu %[temp20], %[temp16], %[temp17] \n\t" \
> +- "lbu %[temp16], 2+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
> +- "lbu %[temp17], 2+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
> +- "subu %["#TEMP0"], %[temp18], %[temp19] \n\t" \
> +- "lbu %[temp18], 3+"XSTR(BPS)"*"#A"(%["#TEMP1"]) \n\t" \
> +- "lbu %[temp19], 3+"XSTR(BPS)"*"#A"(%["#TEMP2"]) \n\t" \
> +- "subu %["#TEMP1"], %[temp16], %[temp17] \n\t" \
> +- "subu %["#TEMP2"], %[temp18], %[temp19] \n\t" \
> +- "addu %["#TEMP3"], %[temp20], %["#TEMP2"] \n\t" \
> +- "subu %["#TEMP2"], %[temp20], %["#TEMP2"] \n\t" \
> +- "addu %[temp20], %["#TEMP0"], %["#TEMP1"] \n\t" \
> +- "subu %["#TEMP0"], %["#TEMP0"], %["#TEMP1"] \n\t" \
> +- "mul %[temp16], %["#TEMP2"], %[c5352] \n\t" \
> +- "mul %[temp17], %["#TEMP2"], %[c2217] \n\t" \
> +- "mul %[temp18], %["#TEMP0"], %[c5352] \n\t" \
> +- "mul %[temp19], %["#TEMP0"], %[c2217] \n\t" \
> +- "addu %["#TEMP1"], %["#TEMP3"], %[temp20] \n\t" \
> +- "subu %[temp20], %["#TEMP3"], %[temp20] \n\t" \
> +- "sll %["#TEMP0"], %["#TEMP1"], 3 \n\t" \
> +- "sll %["#TEMP2"], %[temp20], 3 \n\t" \
> ++ "lbu %[temp16], 2+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
> ++ "lbu %[temp17], 2+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
> ++ "subu %[" #TEMP0 "], %[temp18], %[temp19] \n\t" \
> ++ "lbu %[temp18], 3+"XSTR(BPS)"*" #A "(%[" #TEMP1 "]) \n\t" \
> ++ "lbu %[temp19], 3+"XSTR(BPS)"*" #A "(%[" #TEMP2 "]) \n\t" \
> ++ "subu %[" #TEMP1 "], %[temp16], %[temp17] \n\t" \
> ++ "subu %[" #TEMP2 "], %[temp18], %[temp19] \n\t" \
> ++ "addu %[" #TEMP3 "], %[temp20], %[" #TEMP2 "] \n\t" \
> ++ "subu %[" #TEMP2 "], %[temp20], %[" #TEMP2 "] \n\t" \
> ++ "addu %[temp20], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
> ++ "subu %[" #TEMP0 "], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \
> ++ "mul %[temp16], %[" #TEMP2 "], %[c5352] \n\t" \
> ++ "mul %[temp17], %[" #TEMP2 "], %[c2217] \n\t" \
> ++ "mul %[temp18], %[" #TEMP0 "], %[c5352] \n\t" \
> ++ "mul %[temp19], %[" #TEMP0 "], %[c2217] \n\t" \
> ++ "addu %[" #TEMP1 "], %[" #TEMP3 "], %[temp20] \n\t" \
> ++ "subu %[temp20], %[" #TEMP3 "], %[temp20] \n\t" \
> ++ "sll %[" #TEMP0 "], %[" #TEMP1 "], 3 \n\t" \
> ++ "sll %[" #TEMP2 "], %[temp20], 3 \n\t" \
> + "addiu %[temp16], %[temp16], 1812 \n\t" \
> + "addiu %[temp17], %[temp17], 937 \n\t" \
> + "addu %[temp16], %[temp16], %[temp19] \n\t" \
> + "subu %[temp17], %[temp17], %[temp18] \n\t" \
> +- "sra %["#TEMP1"], %[temp16], 9 \n\t" \
> +- "sra %["#TEMP3"], %[temp17], 9 \n\t"
> ++ "sra %[" #TEMP1 "], %[temp16], 9 \n\t" \
> ++ "sra %[" #TEMP3 "], %[temp17], 9 \n\t"
> +
> + // macro for one vertical pass in FTransform
> + // temp0..temp15 holds tmp[0]..tmp[15]
> + // A..D - offsets in bytes to store to out buffer
> + // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp
> elements
> + #define VERTICAL_PASS(A, B, C, D, TEMP0, TEMP4, TEMP8, TEMP12) \
> +- "addu %[temp16], %["#TEMP0"], %["#TEMP12"] \n\t" \
> +- "subu %[temp19], %["#TEMP0"], %["#TEMP12"] \n\t" \
> +- "addu %[temp17], %["#TEMP4"], %["#TEMP8"] \n\t" \
> +- "subu %[temp18], %["#TEMP4"], %["#TEMP8"] \n\t" \
> +- "mul %["#TEMP8"], %[temp19], %[c2217] \n\t" \
> +- "mul %["#TEMP12"], %[temp18], %[c2217] \n\t" \
> +- "mul %["#TEMP4"], %[temp19], %[c5352] \n\t" \
> ++ "addu %[temp16], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
> ++ "subu %[temp19], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \
> ++ "addu %[temp17], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
> ++ "subu %[temp18], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \
> ++ "mul %[" #TEMP8 "], %[temp19], %[c2217] \n\t" \
> ++ "mul %[" #TEMP12 "], %[temp18], %[c2217] \n\t" \
> ++ "mul %[" #TEMP4 "], %[temp19], %[c5352] \n\t" \
> + "mul %[temp18], %[temp18], %[c5352] \n\t" \
> + "addiu %[temp16], %[temp16], 7 \n\t" \
> +- "addu %["#TEMP0"], %[temp16], %[temp17] \n\t" \
> +- "sra %["#TEMP0"], %["#TEMP0"], 4 \n\t" \
> +- "addu %["#TEMP12"], %["#TEMP12"], %["#TEMP4"] \n\t" \
> +- "subu %["#TEMP4"], %[temp16], %[temp17] \n\t" \
> +- "sra %["#TEMP4"], %["#TEMP4"], 4 \n\t" \
> +- "addiu %["#TEMP8"], %["#TEMP8"], 30000 \n\t" \
> +- "addiu %["#TEMP12"], %["#TEMP12"], 12000 \n\t" \
> +- "addiu %["#TEMP8"], %["#TEMP8"], 21000 \n\t" \
> +- "subu %["#TEMP8"], %["#TEMP8"], %[temp18] \n\t" \
> +- "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t" \
> +- "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t" \
> +- "addiu %[temp16], %["#TEMP12"], 1 \n\t" \
> +- "movn %["#TEMP12"], %[temp16], %[temp19] \n\t" \
> +- "sh %["#TEMP0"], "#A"(%[temp20]) \n\t" \
> +- "sh %["#TEMP4"], "#C"(%[temp20]) \n\t" \
> +- "sh %["#TEMP8"], "#D"(%[temp20]) \n\t" \
> +- "sh %["#TEMP12"], "#B"(%[temp20]) \n\t"
> ++ "addu %[" #TEMP0 "], %[temp16], %[temp17] \n\t" \
> ++ "sra %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \
> ++ "addu %[" #TEMP12 "], %[" #TEMP12 "], %[" #TEMP4 "] \n\t" \
> ++ "subu %[" #TEMP4 "], %[temp16], %[temp17] \n\t" \
> ++ "sra %[" #TEMP4 "], %[" #TEMP4 "], 4 \n\t" \
> ++ "addiu %[" #TEMP8 "], %[" #TEMP8 "], 30000 \n\t" \
> ++ "addiu %[" #TEMP12 "], %[" #TEMP12 "], 12000 \n\t" \
> ++ "addiu %[" #TEMP8 "], %[" #TEMP8 "], 21000 \n\t" \
> ++ "subu %[" #TEMP8 "], %[" #TEMP8 "], %[temp18] \n\t" \
> ++ "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \
> ++ "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \
> ++ "addiu %[temp16], %[" #TEMP12 "], 1 \n\t" \
> ++ "movn %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \
> ++ "sh %[" #TEMP0 "], " #A "(%[temp20]) \n\t" \
> ++ "sh %[" #TEMP4 "], " #C "(%[temp20]) \n\t" \
> ++ "sh %[" #TEMP8 "], " #D "(%[temp20]) \n\t" \
> ++ "sh %[" #TEMP12 "], " #B "(%[temp20]) \n\t"
> +
> + static void FTransform(const uint8_t* src, const uint8_t* ref, int16_t*
> out) {
> + int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
> +@@ -516,14 +516,14 @@ static void FTransform(const uint8_t* src, const
> uint8_t* ref, int16_t* out) {
> + #if !defined(WORK_AROUND_GCC)
> +
> + #define GET_SSE_INNER(A, B, C, D) \
> +- "lbu %[temp0], "#A"(%[a]) \n\t" \
> +- "lbu %[temp1], "#A"(%[b]) \n\t" \
> +- "lbu %[temp2], "#B"(%[a]) \n\t" \
> +- "lbu %[temp3], "#B"(%[b]) \n\t" \
> +- "lbu %[temp4], "#C"(%[a]) \n\t" \
> +- "lbu %[temp5], "#C"(%[b]) \n\t" \
> +- "lbu %[temp6], "#D"(%[a]) \n\t" \
> +- "lbu %[temp7], "#D"(%[b]) \n\t" \
> ++ "lbu %[temp0], " #A "(%[a]) \n\t" \
> ++ "lbu %[temp1], " #A "(%[b]) \n\t" \
> ++ "lbu %[temp2], " #B "(%[a]) \n\t" \
> ++ "lbu %[temp3], " #B "(%[b]) \n\t" \
> ++ "lbu %[temp4], " #C "(%[a]) \n\t" \
> ++ "lbu %[temp5], " #C "(%[b]) \n\t" \
> ++ "lbu %[temp6], " #D "(%[a]) \n\t" \
> ++ "lbu %[temp7], " #D "(%[b]) \n\t" \
> + "subu %[temp0], %[temp0], %[temp1] \n\t" \
> + "subu %[temp2], %[temp2], %[temp3] \n\t" \
> + "subu %[temp4], %[temp4], %[temp5] \n\t" \
> +diff --git a/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
> b/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
> +index ec58efe..1a3f968 100644
> +--- a/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
> ++++ b/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c
> +@@ -27,25 +27,25 @@ static const int kC2 = 35468;
> + // I - input (macro doesn't change it)
> + #define ADD_SUB_HALVES_X4(O0, O1, O2, O3, O4, O5, O6, O7,
> \
> + I0, I1, I2, I3, I4, I5, I6, I7)
> \
> +- "addq.ph %["#O0"], %["#I0"], %["#I1"] \n\t"
> \
> +- "subq.ph %["#O1"], %["#I0"], %["#I1"] \n\t"
> \
> +- "addq.ph %["#O2"], %["#I2"], %["#I3"] \n\t"
> \
> +- "subq.ph %["#O3"], %["#I2"], %["#I3"] \n\t"
> \
> +- "addq.ph %["#O4"], %["#I4"], %["#I5"] \n\t"
> \
> +- "subq.ph %["#O5"], %["#I4"], %["#I5"] \n\t"
> \
> +- "addq.ph %["#O6"], %["#I6"], %["#I7"] \n\t"
> \
> +- "subq.ph %["#O7"], %["#I6"], %["#I7"] \n\t"
> ++ "addq.ph %[" #O0 "], %[" #I0 "], %[" #I1 "]
> \n\t" \
> ++ "subq.ph %[" #O1 "], %[" #I0 "], %[" #I1 "]
> \n\t" \
> ++ "addq.ph %[" #O2 "], %[" #I2 "], %[" #I3 "]
> \n\t" \
> ++ "subq.ph %[" #O3 "], %[" #I2 "], %[" #I3 "]
> \n\t" \
> ++ "addq.ph %[" #O4 "], %[" #I4 "], %[" #I5 "]
> \n\t" \
> ++ "subq.ph %[" #O5 "], %[" #I4 "], %[" #I5 "]
> \n\t" \
> ++ "addq.ph %[" #O6 "], %[" #I6 "], %[" #I7 "]
> \n\t" \
> ++ "subq.ph %[" #O7 "], %[" #I6 "], %[" #I7 "]
> \n\t"
> +
> + // IO - input/output
> + #define ABS_X8(IO0, IO1, IO2, IO3, IO4, IO5, IO6, IO7)
> \
> +- "absq_s.ph %["#IO0"], %["#IO0"] \n\t"
> \
> +- "absq_s.ph %["#IO1"], %["#IO1"] \n\t"
> \
> +- "absq_s.ph %["#IO2"], %["#IO2"] \n\t"
> \
> +- "absq_s.ph %["#IO3"], %["#IO3"] \n\t"
> \
> +- "absq_s.ph %["#IO4"], %["#IO4"] \n\t"
> \
> +- "absq_s.ph %["#IO5"], %["#IO5"] \n\t"
> \
> +- "absq_s.ph %["#IO6"], %["#IO6"] \n\t"
> \
> +- "absq_s.ph %["#IO7"], %["#IO7"] \n\t"
> ++ "absq_s.ph %[" #IO0 "], %[" #IO0 "]
> \n\t" \
> ++ "absq_s.ph %[" #IO1 "], %[" #IO1 "]
> \n\t" \
> ++ "absq_s.ph %[" #IO2 "], %[" #IO2 "]
> \n\t" \
> ++ "absq_s.ph %[" #IO3 "], %[" #IO3 "]
> \n\t" \
> ++ "absq_s.ph %[" #IO4 "], %[" #IO4 "]
> \n\t" \
> ++ "absq_s.ph %[" #IO5 "], %[" #IO5 "]
> \n\t" \
> ++ "absq_s.ph %[" #IO6 "], %[" #IO6 "]
> \n\t" \
> ++ "absq_s.ph %[" #IO7 "], %[" #IO7 "] \n\t"
> +
> + // dpa.w.ph $ac0 temp0 ,temp1
> + // $ac += temp0[31..16] * temp1[31..16] + temp0[15..0] * temp1[15..0]
> +@@ -56,15 +56,15 @@ static const int kC2 = 35468;
> + #define MUL_HALF(O0, I0, I1, I2, I3, I4, I5, I6, I7,
> \
> + I8, I9, I10, I11, I12, I13, I14, I15)
> \
> + "mult $ac0, $zero, $zero \n\t"
> \
> +- "dpa.w.ph $ac0, %["#I2"], %["#I0"] \n\t"
> \
> +- "dpax.w.ph $ac0, %["#I5"], %["#I6"] \n\t"
> \
> +- "dpa.w.ph $ac0, %["#I8"], %["#I9"] \n\t"
> \
> +- "dpax.w.ph $ac0, %["#I11"], %["#I4"] \n\t"
> \
> +- "dpa.w.ph $ac0, %["#I12"], %["#I7"] \n\t"
> \
> +- "dpax.w.ph $ac0, %["#I13"], %["#I1"] \n\t"
> \
> +- "dpa.w.ph $ac0, %["#I14"], %["#I3"] \n\t"
> \
> +- "dpax.w.ph $ac0, %["#I15"], %["#I10"] \n\t"
> \
> +- "mflo %["#O0"], $ac0 \n\t"
> ++ "dpa.w.ph $ac0, %[" #I2 "], %[" #I0 "]
> \n\t" \
> ++ "dpax.w.ph $ac0, %[" #I5 "], %[" #I6 "]
> \n\t" \
> ++ "dpa.w.ph $ac0, %[" #I8 "], %[" #I9 "]
> \n\t" \
> ++ "dpax.w.ph $ac0, %[" #I11 "], %[" #I4 "]
> \n\t" \
> ++ "dpa.w.ph $ac0, %[" #I12 "], %[" #I7 "]
> \n\t" \
> ++ "dpax.w.ph $ac0, %[" #I13 "], %[" #I1 "]
> \n\t" \
> ++ "dpa.w.ph $ac0, %[" #I14 "], %[" #I3 "]
> \n\t" \
> ++ "dpax.w.ph $ac0, %[" #I15 "], %[" #I10 "]
> \n\t" \
> ++ "mflo %[" #O0 "], $ac0 \n\t"
> +
> + #define OUTPUT_EARLY_CLOBBER_REGS_17()
> \
> + OUTPUT_EARLY_CLOBBER_REGS_10(),
> \
> +@@ -77,69 +77,69 @@ static const int kC2 = 35468;
> + // A - offset in bytes to load from src and ref buffers
> + // TEMP0..TEMP3 - registers for corresponding tmp elements
> + #define HORIZONTAL_PASS(A, TEMP0, TEMP1, TEMP2, TEMP3)
> \
> +- "lw %["#TEMP0"], 0(%[args])
> \n\t" \
> +- "lw %["#TEMP1"], 4(%[args])
> \n\t" \
> +- "lw %["#TEMP2"], "XSTR(BPS)"*"#A"(%["#TEMP0"])
> \n\t" \
> +- "lw %["#TEMP3"], "XSTR(BPS)"*"#A"(%["#TEMP1"])
> \n\t" \
> +- "preceu.ph.qbl %["#TEMP0"], %["#TEMP2"]
> \n\t" \
> +- "preceu.ph.qbl %["#TEMP1"], %["#TEMP3"]
> \n\t" \
> +- "preceu.ph.qbr %["#TEMP2"], %["#TEMP2"]
> \n\t" \
> +- "preceu.ph.qbr %["#TEMP3"], %["#TEMP3"]
> \n\t" \
> +- "subq.ph %["#TEMP0"], %["#TEMP0"], %["#TEMP1"]
> \n\t" \
> +- "subq.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP3"]
> \n\t" \
> +- "rotr %["#TEMP0"], %["#TEMP0"], 16
> \n\t" \
> +- "addq.ph %["#TEMP1"], %["#TEMP2"], %["#TEMP0"]
> \n\t" \
> +- "subq.ph %["#TEMP3"], %["#TEMP2"], %["#TEMP0"]
> \n\t" \
> +- "seh %["#TEMP0"], %["#TEMP1"]
> \n\t" \
> +- "sra %[temp16], %["#TEMP1"], 16
> \n\t" \
> +- "seh %[temp19], %["#TEMP3"]
> \n\t" \
> +- "sra %["#TEMP3"], %["#TEMP3"], 16
> \n\t" \
> +- "subu %["#TEMP2"], %["#TEMP0"], %[temp16]
> \n\t" \
> +- "addu %["#TEMP0"], %["#TEMP0"], %[temp16]
> \n\t" \
> ++ "lw %[" #TEMP0 "], 0(%[args])
> \n\t" \
> ++ "lw %[" #TEMP1 "], 4(%[args])
> \n\t" \
> ++ "lw %[" #TEMP2 "], "XSTR(BPS)"*" #A "(%[" #TEMP0 "])
> \n\t" \
> ++ "lw %[" #TEMP3 "], "XSTR(BPS)"*" #A "(%[" #TEMP1 "])
> \n\t" \
> ++ "preceu.ph.qbl %[" #TEMP0 "], %[" #TEMP2 "]
> \n\t" \
> ++ "preceu.ph.qbl %[" #TEMP1 "], %[" #TEMP3 "]
> \n\t" \
> ++ "preceu.ph.qbr %[" #TEMP2 "], %[" #TEMP2 "]
> \n\t" \
> ++ "preceu.ph.qbr %[" #TEMP3 "], %[" #TEMP3 "]
> \n\t" \
> ++ "subq.ph %[" #TEMP0 "], %[" #TEMP0 "], %[" #TEMP1 "]
> \n\t" \
> ++ "subq.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP3 "]
> \n\t" \
> ++ "rotr %[" #TEMP0 "], %[" #TEMP0 "], 16
> \n\t" \
> ++ "addq.ph %[" #TEMP1 "], %[" #TEMP2 "], %[" #TEMP0 "]
> \n\t" \
> ++ "subq.ph %[" #TEMP3 "], %[" #TEMP2 "], %[" #TEMP0 "]
> \n\t" \
> ++ "seh %[" #TEMP0 "], %[" #TEMP1 "]
> \n\t" \
> ++ "sra %[temp16], %[" #TEMP1 "], 16
> \n\t" \
> ++ "seh %[temp19], %[" #TEMP3 "]
> \n\t" \
> ++ "sra %[" #TEMP3 "], %[" #TEMP3 "], 16
> \n\t" \
> ++ "subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp16]
> \n\t" \
> ++ "addu %[" #TEMP0 "], %[" #TEMP0 "], %[temp16]
> \n\t" \
> + "mul %[temp17], %[temp19], %[c2217]
> \n\t" \
> +- "mul %[temp18], %["#TEMP3"], %[c5352]
> \n\t" \
> +- "mul %["#TEMP1"], %[temp19], %[c5352]
> \n\t" \
> +- "mul %[temp16], %["#TEMP3"], %[c2217]
> \n\t" \
> +- "sll %["#TEMP2"], %["#TEMP2"], 3
> \n\t" \
> +- "sll %["#TEMP0"], %["#TEMP0"], 3
> \n\t" \
> +- "subu %["#TEMP3"], %[temp17], %[temp18]
> \n\t" \
> +- "addu %["#TEMP1"], %[temp16], %["#TEMP1"]
> \n\t" \
> +- "addiu %["#TEMP3"], %["#TEMP3"], 937
> \n\t" \
> +- "addiu %["#TEMP1"], %["#TEMP1"], 1812
> \n\t" \
> +- "sra %["#TEMP3"], %["#TEMP3"], 9
> \n\t" \
> +- "sra %["#TEMP1"], %["#TEMP1"], 9 \n\t"
> ++ "mul %[temp18], %[" #TEMP3 "], %[c5352]
> \n\t" \
> ++ "mul %[" #TEMP1 "], %[temp19], %[c5352]
> \n\t" \
> ++ "mul %[temp16], %[" #TEMP3 "], %[c2217]
> \n\t" \
> ++ "sll %[" #TEMP2 "], %[" #TEMP2 "], 3
> \n\t" \
> ++ "sll %[" #TEMP0 "], %[" #TEMP0 "], 3
> \n\t" \
> ++ "subu %[" #TEMP3 "], %[temp17], %[temp18]
> \n\t" \
> ++ "addu %[" #TEMP1 "], %[temp16], %[" #TEMP1 "]
> \n\t" \
> ++ "addiu %[" #TEMP3 "], %[" #TEMP3 "], 937
> \n\t" \
> ++ "addiu %[" #TEMP1 "], %[" #TEMP1 "], 1812
> \n\t" \
> ++ "sra %[" #TEMP3 "], %[" #TEMP3 "], 9
> \n\t" \
> ++ "sra %[" #TEMP1 "], %[" #TEMP1 "], 9
> \n\t"
> +
> + // macro for one vertical pass in FTransform
> + // temp0..temp15 holds tmp[0]..tmp[15]
> + // A..D - offsets in bytes to store to out buffer
> + // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp
> elements
> + #define VERTICAL_PASS(A, B, C, D, TEMP0, TEMP4, TEMP8, TEMP12)
> \
> +- "addu %[temp16], %["#TEMP0"], %["#TEMP12"] \n\t"
> \
> +- "subu %[temp19], %["#TEMP0"], %["#TEMP12"] \n\t"
> \
> +- "addu %[temp17], %["#TEMP4"], %["#TEMP8"] \n\t"
> \
> +- "subu %[temp18], %["#TEMP4"], %["#TEMP8"] \n\t"
> \
> +- "mul %["#TEMP8"], %[temp19], %[c2217] \n\t"
> \
> +- "mul %["#TEMP12"], %[temp18], %[c2217] \n\t"
> \
> +- "mul %["#TEMP4"], %[temp19], %[c5352] \n\t"
> \
> ++ "addu %[temp16], %[" #TEMP0 "], %[" #TEMP12 "] \n\t"
> \
> ++ "subu %[temp19], %[" #TEMP0 "], %[" #TEMP12 "] \n\t"
> \
> ++ "addu %[temp17], %[" #TEMP4 "], %[" #TEMP8 "] \n\t"
> \
> ++ "subu %[temp18], %[" #TEMP4 "], %[" #TEMP8 "] \n\t"
> \
> ++ "mul %[" #TEMP8 "], %[temp19], %[c2217] \n\t"
> \
> ++ "mul %[" #TEMP12 "], %[temp18], %[c2217] \n\t"
> \
> ++ "mul %[" #TEMP4 "], %[temp19], %[c5352] \n\t"
> \
> + "mul %[temp18], %[temp18], %[c5352] \n\t"
> \
> + "addiu %[temp16], %[temp16], 7 \n\t"
> \
> +- "addu %["#TEMP0"], %[temp16], %[temp17] \n\t"
> \
> +- "sra %["#TEMP0"], %["#TEMP0"], 4 \n\t"
> \
> +- "addu %["#TEMP12"], %["#TEMP12"], %["#TEMP4"] \n\t"
> \
> +- "subu %["#TEMP4"], %[temp16], %[temp17] \n\t"
> \
> +- "sra %["#TEMP4"], %["#TEMP4"], 4 \n\t"
> \
> +- "addiu %["#TEMP8"], %["#TEMP8"], 30000 \n\t"
> \
> +- "addiu %["#TEMP12"], %["#TEMP12"], 12000 \n\t"
> \
> +- "addiu %["#TEMP8"], %["#TEMP8"], 21000 \n\t"
> \
> +- "subu %["#TEMP8"], %["#TEMP8"], %[temp18] \n\t"
> \
> +- "sra %["#TEMP12"], %["#TEMP12"], 16 \n\t"
> \
> +- "sra %["#TEMP8"], %["#TEMP8"], 16 \n\t"
> \
> +- "addiu %[temp16], %["#TEMP12"], 1 \n\t"
> \
> +- "movn %["#TEMP12"], %[temp16], %[temp19] \n\t"
> \
> +- "sh %["#TEMP0"], "#A"(%[temp20]) \n\t"
> \
> +- "sh %["#TEMP4"], "#C"(%[temp20]) \n\t"
> \
> +- "sh %["#TEMP8"], "#D"(%[temp20]) \n\t"
> \
> +- "sh %["#TEMP12"], "#B"(%[temp20]) \n\t"
> ++ "addu %[" #TEMP0 "], %[temp16], %[temp17] \n\t"
> \
> ++ "sra %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t"
> \
> ++ "addu %[" #TEMP12 "], %[" #TEMP12 "], %[" #TEMP4 "]
> \n\t" \
> ++ "subu %[" #TEMP4 "], %[temp16], %[temp17] \n\t"
> \
> ++ "sra %[" #TEMP4 "], %[" #TEMP4 "], 4 \n\t"
> \
> ++ "addiu %[" #TEMP8 "], %[" #TEMP8 "], 30000 \n\t"
> \
> ++ "addiu %[" #TEMP12 "], %[" #TEMP12 "], 12000 \n\t"
> \
> ++ "addiu %[" #TEMP8 "], %[" #TEMP8 "], 21000 \n\t"
> \
> ++ "subu %[" #TEMP8 "], %[" #TEMP8 "], %[temp18] \n\t"
> \
> ++ "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t"
> \
> ++ "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t"
> \
> ++ "addiu %[temp16], %[" #TEMP12 "], 1 \n\t"
> \
> ++ "movn %[" #TEMP12 "], %[temp16], %[temp19] \n\t"
> \
> ++ "sh %[" #TEMP0 "], " #A "(%[temp20]) \n\t"
> \
> ++ "sh %[" #TEMP4 "], " #C "(%[temp20]) \n\t"
> \
> ++ "sh %[" #TEMP8 "], " #D "(%[temp20]) \n\t"
> \
> ++ "sh %[" #TEMP12 "], " #B "(%[temp20]) \n\t"
> +
> + static void FTransform(const uint8_t* src, const uint8_t* ref, int16_t*
> out) {
> + const int c2217 = 2217;
> +@@ -329,11 +329,11 @@ static int Disto16x16(const uint8_t* const a, const
> uint8_t* const b,
> + // Intra predictions
> +
> + #define FILL_PART(J, SIZE) \
> +- "usw %[value], 0+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
> +- "usw %[value], 4+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
> +- ".if "#SIZE" == 16 \n\t" \
> +- "usw %[value], 8+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
> +- "usw %[value], 12+"#J"*"XSTR(BPS)"(%[dst]) \n\t" \
> ++ "usw %[value], 0+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
> ++ "usw %[value], 4+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
> ++ ".if " #SIZE " == 16 \n\t" \
> ++ "usw %[value], 8+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
> ++ "usw %[value], 12+" #J "*"XSTR(BPS)"(%[dst]) \n\t" \
> + ".endif \n\t"
> +
> + #define FILL_8_OR_16(DST, VALUE, SIZE) do { \
> +@@ -348,7 +348,7 @@ static int Disto16x16(const uint8_t* const a, const
> uint8_t* const b,
> + FILL_PART( 5, SIZE) \
> + FILL_PART( 6, SIZE) \
> + FILL_PART( 7, SIZE) \
> +- ".if "#SIZE" == 16 \n\t" \
> ++ ".if " #SIZE " == 16 \n\t" \
> + FILL_PART( 8, 16) \
> + FILL_PART( 9, 16) \
> + FILL_PART(10, 16) \
> +@@ -425,7 +425,7 @@ HORIZONTAL_PRED(dst, left, 16)
> + CLIPPING()
> \
> + "usw %[temp0], 0(%[dst]) \n\t"
> \
> + "usw %[temp1], 4(%[dst]) \n\t"
> \
> +- ".if "#SIZE" == 16 \n\t"
> \
> ++ ".if " #SIZE " == 16 \n\t"
> \
> + "ulw %[temp0], 8(%[top]) \n\t"
> \
> + "ulw %[temp1], 12(%[top]) \n\t"
> \
> + CLIPPING()
> \
> +@@ -1060,8 +1060,8 @@ static void Intra4Preds(uint8_t* dst, const
> uint8_t* top) {
> + #if !defined(WORK_AROUND_GCC)
> +
> + #define GET_SSE_INNER(A)
> \
> +- "lw %[temp0], "#A"(%[a]) \n\t"
> \
> +- "lw %[temp1], "#A"(%[b]) \n\t"
> \
> ++ "lw %[temp0], " #A "(%[a]) \n\t"
> \
> ++ "lw %[temp1], " #A "(%[b]) \n\t"
> \
> + "preceu.ph.qbr %[temp2], %[temp0] \n\t"
> \
> + "preceu.ph.qbl %[temp0], %[temp0] \n\t"
> \
> + "preceu.ph.qbr %[temp3], %[temp1] \n\t"
> \
> +@@ -1185,28 +1185,28 @@ static int SSE4x4(const uint8_t* a, const
> uint8_t* b) {
> + // N - offset in bytes (n * 2)
> + // N1 - offset in bytes ((n + 1) * 2)
> + #define QUANTIZE_ONE(J, K, N, N1)
> \
> +- "ulw %[temp1], "#J"(%[ppin]) \n\t"
> \
> +- "ulw %[temp2], "#J"(%[ppsharpen]) \n\t"
> \
> +- "lhu %[temp3], "#K"(%[ppzthresh]) \n\t"
> \
> +- "lhu %[temp6], "#K"+4(%[ppzthresh]) \n\t"
> \
> ++ "ulw %[temp1], " #J "(%[ppin]) \n\t"
> \
> ++ "ulw %[temp2], " #J "(%[ppsharpen]) \n\t"
> \
> ++ "lhu %[temp3], " #K "(%[ppzthresh]) \n\t"
> \
> ++ "lhu %[temp6], " #K "+4(%[ppzthresh]) \n\t"
> \
> + "absq_s.ph %[temp4], %[temp1] \n\t"
> \
> + "ins %[temp3], %[temp6], 16, 16 \n\t"
> \
> + "addu.ph %[coeff], %[temp4], %[temp2] \n\t"
> \
> + "shra.ph %[sign], %[temp1], 15 \n\t"
> \
> + "li %[level], 0x10001 \n\t"
> \
> + "cmp.lt.ph %[temp3], %[coeff] \n\t"
> \
> +- "lhu %[temp1], "#J"(%[ppiq]) \n\t"
> \
> ++ "lhu %[temp1], " #J "(%[ppiq]) \n\t"
> \
> + "pick.ph %[temp5], %[level], $0 \n\t"
> \
> +- "lw %[temp2], "#K"(%[ppbias]) \n\t"
> \
> ++ "lw %[temp2], " #K "(%[ppbias]) \n\t"
> \
> + "beqz %[temp5], 0f \n\t"
> \
> +- "lhu %[temp3], "#J"(%[ppq]) \n\t"
> \
> ++ "lhu %[temp3], " #J "(%[ppq]) \n\t"
> \
> + "beq %[temp5], %[level], 1f \n\t"
> \
> + "andi %[temp5], %[temp5], 0x1 \n\t"
> \
> + "andi %[temp4], %[coeff], 0xffff \n\t"
> \
> + "beqz %[temp5], 2f \n\t"
> \
> + "mul %[level], %[temp4], %[temp1] \n\t"
> \
> +- "sh $0, "#J"+2(%[ppin]) \n\t"
> \
> +- "sh $0, "#N1"(%[pout]) \n\t"
> \
> ++ "sh $0, " #J "+2(%[ppin]) \n\t"
> \
> ++ "sh $0, " #N1 "(%[pout]) \n\t"
> \
> + "addu %[level], %[level], %[temp2] \n\t"
> \
> + "sra %[level], %[level], 17 \n\t"
> \
> + "slt %[temp4], %[max_level], %[level] \n\t"
> \
> +@@ -1216,15 +1216,15 @@ static int SSE4x4(const uint8_t* a, const
> uint8_t* b) {
> + "subu %[level], %[level], %[temp6] \n\t"
> \
> + "mul %[temp5], %[level], %[temp3] \n\t"
> \
> + "or %[ret], %[ret], %[level] \n\t"
> \
> +- "sh %[level], "#N"(%[pout]) \n\t"
> \
> +- "sh %[temp5], "#J"(%[ppin]) \n\t"
> \
> ++ "sh %[level], " #N "(%[pout]) \n\t"
> \
> ++ "sh %[temp5], " #J "(%[ppin]) \n\t"
> \
> + "j 3f \n\t"
> \
> + "2: \n\t"
> \
> +- "lhu %[temp1], "#J"+2(%[ppiq]) \n\t"
> \
> ++ "lhu %[temp1], " #J "+2(%[ppiq]) \n\t"
> \
> + "srl %[temp5], %[coeff], 16 \n\t"
> \
> + "mul %[level], %[temp5], %[temp1] \n\t"
> \
> +- "lw %[temp2], "#K"+4(%[ppbias]) \n\t"
> \
> +- "lhu %[temp3], "#J"+2(%[ppq]) \n\t"
> \
> ++ "lw %[temp2], " #K "+4(%[ppbias]) \n\t"
> \
> ++ "lhu %[temp3], " #J "+2(%[ppq]) \n\t"
> \
> + "addu %[level], %[level], %[temp2] \n\t"
> \
> + "sra %[level], %[level], 17 \n\t"
> \
> + "srl %[temp6], %[sign], 16 \n\t"
> \
> +@@ -1233,20 +1233,20 @@ static int SSE4x4(const uint8_t* a, const
> uint8_t* b) {
> + "xor %[level], %[level], %[temp6] \n\t"
> \
> + "subu %[level], %[level], %[temp6] \n\t"
> \
> + "mul %[temp5], %[level], %[temp3] \n\t"
> \
> +- "sh $0, "#J"(%[ppin]) \n\t"
> \
> +- "sh $0, "#N"(%[pout]) \n\t"
> \
> ++ "sh $0, " #J "(%[ppin]) \n\t"
> \
> ++ "sh $0, " #N "(%[pout]) \n\t"
> \
> + "or %[ret], %[ret], %[level] \n\t"
> \
> +- "sh %[temp5], "#J"+2(%[ppin]) \n\t"
> \
> +- "sh %[level], "#N1"(%[pout]) \n\t"
> \
> ++ "sh %[temp5], " #J "+2(%[ppin]) \n\t"
> \
> ++ "sh %[level], " #N1 "(%[pout]) \n\t"
> \
> + "j 3f \n\t"
> \
> + "1: \n\t"
> \
> +- "lhu %[temp1], "#J"(%[ppiq]) \n\t"
> \
> +- "lw %[temp2], "#K"(%[ppbias]) \n\t"
> \
> +- "ulw %[temp3], "#J"(%[ppq]) \n\t"
> \
> ++ "lhu %[temp1], " #J "(%[ppiq]) \n\t"
> \
> ++ "lw %[temp2], " #K "(%[ppbias]) \n\t"
> \
> ++ "ulw %[temp3], " #J "(%[ppq]) \n\t"
> \
> + "andi %[temp5], %[coeff], 0xffff \n\t"
> \
> + "srl %[temp0], %[coeff], 16 \n\t"
> \
> +- "lhu %[temp6], "#J"+2(%[ppiq]) \n\t"
> \
> +- "lw %[coeff], "#K"+4(%[ppbias]) \n\t"
> \
> ++ "lhu %[temp6], " #J "+2(%[ppiq]) \n\t"
> \
> ++ "lw %[coeff], " #K "+4(%[ppbias]) \n\t"
> \
> + "mul %[level], %[temp5], %[temp1] \n\t"
> \
> + "mul %[temp4], %[temp0], %[temp6] \n\t"
> \
> + "addu %[level], %[level], %[temp2] \n\t"
> \
> +@@ -1259,15 +1259,15 @@ static int SSE4x4(const uint8_t* a, const
> uint8_t* b) {
> + "subu.ph %[level], %[level], %[sign] \n\t"
> \
> + "mul.ph %[temp3], %[level], %[temp3] \n\t"
> \
> + "or %[ret], %[ret], %[level] \n\t"
> \
> +- "sh %[level], "#N"(%[pout]) \n\t"
> \
> ++ "sh %[level], " #N "(%[pout]) \n\t"
> \
> + "srl %[level], %[level], 16 \n\t"
> \
> +- "sh %[level], "#N1"(%[pout]) \n\t"
> \
> +- "usw %[temp3], "#J"(%[ppin]) \n\t"
> \
> ++ "sh %[level], " #N1 "(%[pout]) \n\t"
> \
> ++ "usw %[temp3], " #J "(%[ppin]) \n\t"
> \
> + "j 3f \n\t"
> \
> + "0: \n\t"
> \
> +- "sh $0, "#N"(%[pout]) \n\t"
> \
> +- "sh $0, "#N1"(%[pout]) \n\t"
> \
> +- "usw $0, "#J"(%[ppin]) \n\t"
> \
> ++ "sh $0, " #N "(%[pout]) \n\t"
> \
> ++ "sh $0, " #N1 "(%[pout]) \n\t"
> \
> ++ "usw $0, " #J "(%[ppin]) \n\t"
> \
> + "3: \n\t"
> +
> + static int QuantizeBlock(int16_t in[16], int16_t out[16],
> +@@ -1326,37 +1326,37 @@ static int Quantize2Blocks(int16_t in[32],
> int16_t out[32],
> + // A, B, C, D - offset in bytes to load from in buffer
> + // TEMP0, TEMP1 - registers for corresponding tmp elements
> + #define HORIZONTAL_PASS_WHT(A, B, C, D, TEMP0, TEMP1)
> \
> +- "lh %["#TEMP0"], "#A"(%[in]) \n\t"
> \
> +- "lh %["#TEMP1"], "#B"(%[in]) \n\t"
> \
> +- "lh %[temp8], "#C"(%[in]) \n\t"
> \
> +- "lh %[temp9], "#D"(%[in]) \n\t"
> \
> +- "ins %["#TEMP1"], %["#TEMP0"], 16, 16 \n\t"
> \
> ++ "lh %[" #TEMP0 "], " #A "(%[in]) \n\t"
> \
> ++ "lh %[" #TEMP1 "], " #B "(%[in]) \n\t"
> \
> ++ "lh %[temp8], " #C "(%[in]) \n\t"
> \
> ++ "lh %[temp9], " #D "(%[in]) \n\t"
> \
> ++ "ins %[" #TEMP1 "], %[" #TEMP0 "], 16, 16 \n\t"
> \
> + "ins %[temp9], %[temp8], 16, 16 \n\t"
> \
> +- "subq.ph %[temp8], %["#TEMP1"], %[temp9] \n\t"
> \
> +- "addq.ph %[temp9], %["#TEMP1"], %[temp9] \n\t"
> \
> +- "precrq.ph.w %["#TEMP0"], %[temp8], %[temp9] \n\t"
> \
> ++ "subq.ph %[temp8], %[" #TEMP1 "], %[temp9] \n\t"
> \
> ++ "addq.ph %[temp9], %[" #TEMP1 "], %[temp9] \n\t"
> \
> ++ "precrq.ph.w %[" #TEMP0 "], %[temp8], %[temp9] \n\t"
> \
> + "append %[temp8], %[temp9], 16 \n\t"
> \
> +- "subq.ph %["#TEMP1"], %["#TEMP0"], %[temp8] \n\t"
> \
> +- "addq.ph %["#TEMP0"], %["#TEMP0"], %[temp8] \n\t"
> \
> +- "rotr %["#TEMP1"], %["#TEMP1"], 16 \n\t"
> ++ "subq.ph %[" #TEMP1 "], %[" #TEMP0 "], %[temp8] \n\t"
> \
> ++ "addq.ph %[" #TEMP0 "], %[" #TEMP0 "], %[temp8] \n\t"
> \
> ++ "rotr %[" #TEMP1 "], %[" #TEMP1 "], 16 \n\t"
> +
> + // macro for one vertical pass in FTransformWHT
> + // temp0..temp7 holds tmp[0]..tmp[15]
> + // A, B, C, D - offsets in bytes to store to out buffer
> + // TEMP0, TEMP2, TEMP4 and TEMP6 - registers for corresponding tmp
> elements
> + #define VERTICAL_PASS_WHT(A, B, C, D, TEMP0, TEMP2, TEMP4, TEMP6)
> \
> +- "addq.ph %[temp8], %["#TEMP0"], %["#TEMP4"] \n\t"
> \
> +- "addq.ph %[temp9], %["#TEMP2"], %["#TEMP6"] \n\t"
> \
> +- "subq.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP6"] \n\t"
> \
> +- "subq.ph %["#TEMP6"], %["#TEMP0"], %["#TEMP4"] \n\t"
> \
> +- "addqh.ph %["#TEMP0"], %[temp8], %[temp9] \n\t"
> \
> +- "subqh.ph %["#TEMP4"], %["#TEMP6"], %["#TEMP2"] \n\t"
> \
> +- "addqh.ph %["#TEMP2"], %["#TEMP2"], %["#TEMP6"] \n\t"
> \
> +- "subqh.ph %["#TEMP6"], %[temp8], %[temp9] \n\t"
> \
> +- "usw %["#TEMP0"], "#A"(%[out]) \n\t"
> \
> +- "usw %["#TEMP2"], "#B"(%[out]) \n\t"
> \
> +- "usw %["#TEMP4"], "#C"(%[out]) \n\t"
> \
> +- "usw %["#TEMP6"], "#D"(%[out]) \n\t"
> ++ "addq.ph %[temp8], %[" #TEMP0 "], %[" #TEMP4 "] \n\t"
> \
> ++ "addq.ph %[temp9], %[" #TEMP2 "], %[" #TEMP6 "] \n\t"
> \
> ++ "subq.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP6 "]
> \n\t" \
> ++ "subq.ph %[" #TEMP6 "], %[" #TEMP0 "], %[" #TEMP4 "]
> \n\t" \
> ++ "addqh.ph %[" #TEMP0 "], %[temp8], %[temp9] \n\t"
> \
> ++ "subqh.ph %[" #TEMP4 "], %[" #TEMP6 "], %[" #TEMP2 "]
> \n\t" \
> ++ "addqh.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP6 "]
> \n\t" \
> ++ "subqh.ph %[" #TEMP6 "], %[temp8], %[temp9] \n\t"
> \
> ++ "usw %[" #TEMP0 "], " #A "(%[out]) \n\t"
> \
> ++ "usw %[" #TEMP2 "], " #B "(%[out]) \n\t"
> \
> ++ "usw %[" #TEMP4 "], " #C "(%[out]) \n\t"
> \
> ++ "usw %[" #TEMP6 "], " #D "(%[out]) \n\t"
> +
> + static void FTransformWHT(const int16_t* in, int16_t* out) {
> + int temp0, temp1, temp2, temp3, temp4;
> +@@ -1385,10 +1385,10 @@ static void FTransformWHT(const int16_t* in,
> int16_t* out) {
> + // convert 8 coeffs at time
> + // A, B, C, D - offsets in bytes to load from out buffer
> + #define CONVERT_COEFFS_TO_BIN(A, B, C, D)
> \
> +- "ulw %[temp0], "#A"(%[out]) \n\t"
> \
> +- "ulw %[temp1], "#B"(%[out]) \n\t"
> \
> +- "ulw %[temp2], "#C"(%[out]) \n\t"
> \
> +- "ulw %[temp3], "#D"(%[out]) \n\t"
> \
> ++ "ulw %[temp0], " #A "(%[out]) \n\t"
> \
> ++ "ulw %[temp1], " #B "(%[out]) \n\t"
> \
> ++ "ulw %[temp2], " #C "(%[out]) \n\t"
> \
> ++ "ulw %[temp3], " #D "(%[out]) \n\t"
> \
> + "absq_s.ph %[temp0], %[temp0] \n\t"
> \
> + "absq_s.ph %[temp1], %[temp1] \n\t"
> \
> + "absq_s.ph %[temp2], %[temp2] \n\t"
> \
> +diff --git a/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
> b/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
> +index 6c34efb..6a1f8f4 100644
> +--- a/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
> ++++ b/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c
> +@@ -48,7 +48,7 @@
> + "srl %[temp0], %[length], 0x2 \n\t"
> \
> + "beqz %[temp0], 4f \n\t"
> \
> + " andi %[temp6], %[length], 0x3 \n\t"
> \
> +- ".if "#INVERSE" \n\t"
> \
> ++ ".if " #INVERSE " \n\t"
> \
> + "lbu %[temp1], -1(%[src]) \n\t"
> \
> + "1: \n\t"
> \
> + "lbu %[temp2], 0(%[src]) \n\t"
> \
> +@@ -84,7 +84,7 @@
> + "lbu %[temp1], -1(%[src]) \n\t"
> \
> + "lbu %[temp2], 0(%[src]) \n\t"
> \
> + "addiu %[src], %[src], 1 \n\t"
> \
> +- ".if "#INVERSE" \n\t"
> \
> ++ ".if " #INVERSE " \n\t"
> \
> + "addu %[temp3], %[temp1], %[temp2] \n\t"
> \
> + "sb %[temp3], -1(%[src]) \n\t"
> \
> + ".else \n\t"
> \
> +@@ -131,7 +131,7 @@ static WEBP_INLINE void PredictLine(const uint8_t*
> src, uint8_t* dst,
> + "ulw %[temp3], 4(%[src]) \n\t"
> \
> + "ulw %[temp4], 4(%[pred]) \n\t"
> \
> + "addiu %[src], %[src], 8 \n\t"
> \
> +- ".if "#INVERSE" \n\t"
> \
> ++ ".if " #INVERSE " \n\t"
> \
> + "addu.qb %[temp5], %[temp1], %[temp2] \n\t"
> \
> + "addu.qb %[temp6], %[temp3], %[temp4] \n\t"
> \
> + ".else \n\t"
> \
> +@@ -152,7 +152,7 @@ static WEBP_INLINE void PredictLine(const uint8_t*
> src, uint8_t* dst,
> + "lbu %[temp2], 0(%[pred]) \n\t"
> \
> + "addiu %[src], %[src], 1 \n\t"
> \
> + "addiu %[pred], %[pred], 1 \n\t"
> \
> +- ".if "#INVERSE" \n\t"
> \
> ++ ".if " #INVERSE " \n\t"
> \
> + "addu %[temp3], %[temp1], %[temp2] \n\t"
> \
> + ".else \n\t"
> \
> + "subu %[temp3], %[temp1], %[temp2] \n\t"
> \
> +@@ -177,7 +177,7 @@ static WEBP_INLINE void PredictLine(const uint8_t*
> src, uint8_t* dst,
> + __asm__ volatile (
> \
> + "lbu %[temp1], 0(%[src]) \n\t"
> \
> + "lbu %[temp2], 0(%[pred]) \n\t"
> \
> +- ".if "#INVERSE" \n\t"
> \
> ++ ".if " #INVERSE " \n\t"
> \
> + "addu %[temp3], %[temp1], %[temp2] \n\t"
> \
> + ".else \n\t"
> \
> + "subu %[temp3], %[temp1], %[temp2] \n\t"
> \
> +diff --git a/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
> b/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
> +index 68fbe85..abe97c1 100644
> +--- a/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
> ++++ b/Source/LibWebP/src/dsp/dsp.lossless_mips32.c
> +@@ -285,28 +285,28 @@ static VP8LStreaks HuffmanCostCombinedCount(const
> uint32_t* X,
> + // literal_ and successive histograms could be unaligned
> + // so we must use ulw and usw
> + #define ADD_TO_OUT(A, B, C, D, E, P0, P1, P2) \
> +- "ulw %[temp0], "#A"(%["#P0"]) \n\t" \
> +- "ulw %[temp1], "#B"(%["#P0"]) \n\t" \
> +- "ulw %[temp2], "#C"(%["#P0"]) \n\t" \
> +- "ulw %[temp3], "#D"(%["#P0"]) \n\t" \
> +- "ulw %[temp4], "#A"(%["#P1"]) \n\t" \
> +- "ulw %[temp5], "#B"(%["#P1"]) \n\t" \
> +- "ulw %[temp6], "#C"(%["#P1"]) \n\t" \
> +- "ulw %[temp7], "#D"(%["#P1"]) \n\t" \
> ++ "ulw %[temp0], " #A "(%[" #P0 "]) \n\t" \
> ++ "ulw %[temp1], " #B "(%[" #P0 "]) \n\t" \
> ++ "ulw %[temp2], " #C "(%[" #P0 "]) \n\t" \
> ++ "ulw %[temp3], " #D "(%[" #P0 "]) \n\t" \
> ++ "ulw %[temp4], " #A "(%[" #P1 "]) \n\t" \
> ++ "ulw %[temp5], " #B "(%[" #P1 "]) \n\t" \
> ++ "ulw %[temp6], " #C "(%[" #P1 "]) \n\t" \
> ++ "ulw %[temp7], " #D "(%[" #P1 "]) \n\t" \
> + "addu %[temp4], %[temp4], %[temp0] \n\t" \
> + "addu %[temp5], %[temp5], %[temp1] \n\t" \
> + "addu %[temp6], %[temp6], %[temp2] \n\t" \
> + "addu %[temp7], %[temp7], %[temp3] \n\t" \
> +- "addiu %["#P0"], %["#P0"], 16 \n\t" \
> +- ".if "#E" == 1 \n\t" \
> +- "addiu %["#P1"], %["#P1"], 16 \n\t" \
> ++ "addiu %[" #P0 "], %[" #P0 "], 16 \n\t" \
> ++ ".if " #E " == 1 \n\t" \
> ++ "addiu %[" #P1 "], %[" #P1 "], 16 \n\t" \
> + ".endif \n\t" \
> +- "usw %[temp4], "#A"(%["#P2"]) \n\t" \
> +- "usw %[temp5], "#B"(%["#P2"]) \n\t" \
> +- "usw %[temp6], "#C"(%["#P2"]) \n\t" \
> +- "usw %[temp7], "#D"(%["#P2"]) \n\t" \
> +- "addiu %["#P2"], %["#P2"], 16 \n\t" \
> +- "bne %["#P0"], %[LoopEnd], 1b \n\t" \
> ++ "usw %[temp4], " #A "(%[" #P2 "]) \n\t" \
> ++ "usw %[temp5], " #B "(%[" #P2 "]) \n\t" \
> ++ "usw %[temp6], " #C "(%[" #P2 "]) \n\t" \
> ++ "usw %[temp7], " #D "(%[" #P2 "]) \n\t" \
> ++ "addiu %[" #P2 "], %[" #P2 "], 16 \n\t" \
> ++ "bne %[" #P0 "], %[LoopEnd], 1b \n\t" \
> + ".set pop \n\t" \
> +
> + #define ASM_END_COMMON_0 \
> +diff --git a/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
> b/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
> +index 821cda9..31ac181 100644
> +--- a/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
> ++++ b/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c
> +@@ -29,14 +29,14 @@ static void FUNC_NAME(const TYPE* src,
> \
> + for (x = 0; x < (width >> 2); ++x) {
> \
> + int tmp1, tmp2, tmp3, tmp4;
> \
> + __asm__ volatile (
> \
> +- ".ifc "#TYPE", uint8_t \n\t"
> \
> ++ ".ifc " #TYPE ", uint8_t \n\t"
> \
> + "lbu %[tmp1], 0(%[src]) \n\t"
> \
> + "lbu %[tmp2], 1(%[src]) \n\t"
> \
> + "lbu %[tmp3], 2(%[src]) \n\t"
> \
> + "lbu %[tmp4], 3(%[src]) \n\t"
> \
> + "addiu %[src], %[src], 4 \n\t"
> \
> + ".endif \n\t"
> \
> +- ".ifc "#TYPE", uint32_t \n\t"
> \
> ++ ".ifc " #TYPE ", uint32_t \n\t"
> \
> + "lw %[tmp1], 0(%[src]) \n\t"
> \
> + "lw %[tmp2], 4(%[src]) \n\t"
> \
> + "lw %[tmp3], 8(%[src]) \n\t"
> \
> +@@ -55,7 +55,7 @@ static void FUNC_NAME(const TYPE* src,
> \
> + "lwx %[tmp2], %[tmp2](%[color_map]) \n\t"
> \
> + "lwx %[tmp3], %[tmp3](%[color_map]) \n\t"
> \
> + "lwx %[tmp4], %[tmp4](%[color_map]) \n\t"
> \
> +- ".ifc "#TYPE", uint8_t \n\t"
> \
> ++ ".ifc " #TYPE ", uint8_t \n\t"
> \
> + "ext %[tmp1], %[tmp1], 8, 8 \n\t"
> \
> + "ext %[tmp2], %[tmp2], 8, 8 \n\t"
> \
> + "ext %[tmp3], %[tmp3], 8, 8 \n\t"
> \
> +@@ -66,7 +66,7 @@ static void FUNC_NAME(const TYPE* src,
> \
> + "sb %[tmp4], 3(%[dst]) \n\t"
> \
> + "addiu %[dst], %[dst], 4 \n\t"
> \
> + ".endif \n\t"
> \
> +- ".ifc "#TYPE", uint32_t \n\t"
> \
> ++ ".ifc " #TYPE ", uint32_t \n\t"
> \
> + "sw %[tmp1], 0(%[dst]) \n\t"
> \
> + "sw %[tmp2], 4(%[dst]) \n\t"
> \
> + "sw %[tmp3], 8(%[dst]) \n\t"
> \
> +diff --git a/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
> b/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
> +index a7864a0..cb3adfe 100644
> +--- a/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
> ++++ b/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c
> +@@ -34,15 +34,15 @@
> + G = G - t2 + kGCst;
> \
> + B = B + kBCst;
> \
> + __asm__ volatile (
> \
> +- "shll_s.w %["#R"], %["#R"], 9
> \n\t" \
> +- "shll_s.w %["#G"], %["#G"], 9
> \n\t" \
> +- "shll_s.w %["#B"], %["#B"], 9
> \n\t" \
> +- "precrqu_s.qb.ph %["#R"], %["#R"], $zero
> \n\t" \
> +- "precrqu_s.qb.ph %["#G"], %["#G"], $zero
> \n\t" \
> +- "precrqu_s.qb.ph %["#B"], %["#B"], $zero
> \n\t" \
> +- "srl %["#R"], %["#R"], 24
> \n\t" \
> +- "srl %["#G"], %["#G"], 24
> \n\t" \
> +- "srl %["#B"], %["#B"], 24
> \n\t" \
> ++ "shll_s.w %[" #R "], %[" #R "], 9
> \n\t" \
> ++ "shll_s.w %[" #G "], %[" #G "], 9
> \n\t" \
> ++ "shll_s.w %[" #B "], %[" #B "], 9
> \n\t" \
> ++ "precrqu_s.qb.ph %[" #R "], %[" #R "], $zero
> \n\t" \
> ++ "precrqu_s.qb.ph %[" #G "], %[" #G "], $zero
> \n\t" \
> ++ "precrqu_s.qb.ph %[" #B "], %[" #B "], $zero
> \n\t" \
> ++ "srl %[" #R "], %[" #R "], 24
> \n\t" \
> ++ "srl %[" #G "], %[" #G "], 24
> \n\t" \
> ++ "srl %[" #B "], %[" #B "], 24
> \n\t" \
> + : [R]"+r"(R), [G]"+r"(G), [B]"+r"(B)
> \
> + :
> \
> + );
> \
> +diff --git a/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
> b/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
> +index 66adde5..51cbe9e 100644
> +--- a/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
> ++++ b/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c
> +@@ -39,12 +39,12 @@
> + "addu %[temp5], %[temp0], %[temp1] \n\t"
> \
> + "subu %[temp6], %[temp0], %[temp2] \n\t"
> \
> + "addu %[temp7], %[temp0], %[temp4] \n\t"
> \
> +-".if "#K" \n\t"
> \
> ++".if " #K " \n\t"
> \
> + "lbu %[temp0], 1(%[y]) \n\t"
> \
> + ".endif \n\t"
> \
> + "shll_s.w %[temp5], %[temp5], 9 \n\t"
> \
> + "shll_s.w %[temp6], %[temp6], 9 \n\t"
> \
> +-".if "#K" \n\t"
> \
> ++".if " #K " \n\t"
> \
> + "mul %[temp0], %[t_con_5], %[temp0] \n\t"
> \
> + ".endif \n\t"
> \
> + "shll_s.w %[temp7], %[temp7], 9 \n\t"
> \
> +@@ -54,9 +54,9 @@
> + "srl %[temp5], %[temp5], 24 \n\t"
> \
> + "srl %[temp6], %[temp6], 24 \n\t"
> \
> + "srl %[temp7], %[temp7], 24 \n\t"
> \
> +- "sb %[temp5], "#R"(%[dst]) \n\t"
> \
> +- "sb %[temp6], "#G"(%[dst]) \n\t"
> \
> +- "sb %[temp7], "#B"(%[dst]) \n\t"
> \
> ++ "sb %[temp5], " #R "(%[dst]) \n\t"
> \
> ++ "sb %[temp6], " #G "(%[dst]) \n\t"
> \
> ++ "sb %[temp7], " #B "(%[dst]) \n\t"
> \
> +
> + #define ASM_CLOBBER_LIST()
> \
> + : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2),
> \
> +--
> +2.1.4
> +
> diff --git a/testing/freeimage/0004-fix-gcc-6.patch
> b/testing/freeimage/0004-fix-gcc-6.patch
> new file mode 100644
> index 0000000..7b442ab
> --- /dev/null
> +++ b/testing/freeimage/0004-fix-gcc-6.patch
> @@ -0,0 +1,31 @@
> +libraw/dc_raw: fix gcc-6 failures
> +
> +With gcc-6, it is no longer allowed to narrow the type of constants in
> +a constant array declaration.
> +
> +Fixes:
> + http://autobuild.buildroot.org/results/081/
> 0811531872f69f9febbdc482dfbdd7fb5c35d1c8/build-end.log
> +
> +Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr >
> +
> +diff -durN a/Source/LibRawLite/internal/dcraw_common.cpp
> b/Source/LibRawLite/internal/dcraw_common.cpp
> +--- a/Source/LibRawLite/internal/dcraw_common.cpp
> ++++ b/Source/LibRawLite/internal/dcraw_common.cpp
> +@@ -2479,7 +2479,7 @@
> +
> + void CLASS kodak_radc_load_raw()
> + {
> +- static const char src[] = {
> ++ static const signed char src[] = {
> + 1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8,
> + 1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8,
> + 2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8,
> +@@ -4519,7 +4519,7 @@
> + */
> + void CLASS vng_interpolate()
> + {
> +- static const signed char *cp, terms[] = {
> ++ static const int *cp, terms[] = {
> + -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01,
> + -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01,
> + -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03,
> diff --git a/testing/freeimage/APKBUILD b/testing/freeimage/APKBUILD
> new file mode 100644
> index 0000000..d948ced
> --- /dev/null
> +++ b/testing/freeimage/APKBUILD
> @@ -0,0 +1,41 @@
> +# Contributor: Taner Tas <taner76@gmail.com >
> +# Maintainer: Taner Tas <taner76@gmail.com >
> +pkgname=freeimage
> +pkgver=3.17.0
> +pkgrel=0
> +pkgdesc="Open Source library project for developers who would like to
> support popular graphics image formats."
> +url="http://freeimage.sourceforge.net/"
> +arch="all"
> +license="GPL-2.0-only FreeImage"
> +_distname="FreeImage"
> +makedepends="dos2unix"
> +subpackages="$pkgname-dev"
> +source="http://downloads.sourceforge.net/${pkgname}/${_
> distname}${pkgver//.}.zip
> + 0001-no-root-install.patch
> + 0002-fix-cpuid-x86.patch
> + 0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
> + 0004-fix-gcc-6.patch"
> +
> +options="!check"
> +
> +prepare() {
> + mv ${srcdir}/${_distname} ${srcdir}/${pkgname}-${pkgver}
> + find "$builddir" -type f -exec dos2unix -q -s {} \;
> + default_prepare
> +}
> +
> +build() {
> + cd "$builddir"
> + make
> +}
> +
> +package() {
> + cd "$builddir"
> + #sed -i -e 's/-o root -g root//' Makefile.*
> + make DESTDIR="${pkgdir}" install
> +}
> +sha512sums="703c2626c0bcfe73eb40d720f45745208ca9650a7730759680a2b38ad3f6
> c719a43008477032bc70b76a95761f7d4b6f901b961359d36b54ace906dd78fb391b
> FreeImage3170.zip
> +2dc51d700671962339cc1f27c0ad7e679e7ed6233d1534b81d68fcffb6e8
> 6960fa182b6916d19da7451bf34b69efe4a1b62b7f335b9802d7799706b766257d59
> 0001-no-root-install.patch
> +ef88862593bd8d271d11f86ec389c8a92c131ffb03fb7028e87dfddc7ae7
> 4e22bef50327175a7dcee9c414df80e84579c59f3b8e1f825d54f0fdc76a0530c06f
> 0002-fix-cpuid-x86.patch
> +4208d4f3ee49424d65c5e78c18c424543208a554855a6ea1cafd32e57b73
> 54aa36131ea62a95a6856e19c5c0ef47e7d63616e690246c1b19716dca323c3476cc
> 0003-LibWebP-fix-compilation-issue-with-GCC-5.x-C-11.patch
> +75050c6a6b2f30c42e9b5d1326499f4d088e3c79b23c92bea72b60fe6759
> d1e529b136f599d7de059c433cfc661b189d8dd6e32e9fcb0244fb27153c792d3c0e
> 0004-fix-gcc-6.patch"
> --
> 2.16.2
>
>