]> granicus.if.org Git - libjpeg-turbo/commitdiff
Fix x86-64 ABI conformance issue in SIMD code
authorChandler Carruth <chandlerc@gmail.com>
Tue, 15 Sep 2015 18:57:03 +0000 (11:57 -0700)
committerDRC <information@libjpeg-turbo.org>
Thu, 17 Sep 2015 03:35:31 +0000 (22:35 -0500)
(descriptions cribbed by DRC from discussion in #20)
In the x86-64 ABI, the high (unused) DWORD of a 32-bit argument's
register is undefined, so it was incorrect to use a 64-bit mov
instruction to transfer a JDIMENSION argument in the 64-bit SSE2 SIMD
functions.  The code worked thus far only because the existing compiler
optimizers weren't smart enough to do anything else with the register in
question, so the upper 32 bits happened to be all zeroes-- for the past
6 years, on every x86-64 compiler previously known to mankind.

The bleeding-edge Clang/LLVM compiler has a smarter optimizer, and
under certain circumstances, it will attempt to load-combine adjacent
32-bit integers from one of the libjpeg structures into a single 64-bit
integer and pass that 64-bit integer as a 32-bit argument to one of the
SIMD functions (which is allowed by the ABI, since the upper 32 bits of
the 32-bit argument's register are undefined.)  This caused the
libjpeg-turbo regression tests to crash.

Also enhance the documentation of JDIMENSION to explain that its size
is significant to the implementation of the SIMD code.

Closes #20.  Refer also to http://crbug.com/532214.

14 files changed:
ChangeLog.txt
jmorecfg.h
simd/jccolext-sse2-64.asm
simd/jcgryext-sse2-64.asm
simd/jcsample-sse2-64.asm
simd/jdcolext-sse2-64.asm
simd/jdmrgext-sse2-64.asm
simd/jdsample-sse2-64.asm
simd/jidctflt-sse2-64.asm
simd/jidctfst-sse2-64.asm
simd/jidctint-sse2-64.asm
simd/jidctred-sse2-64.asm
simd/jquantf-sse2-64.asm
simd/jquanti-sse2-64.asm

index c8b554b09660877a28446964a45b71398862db5f..69e1262a92f67a72f6cc5558816b9aa9afe6b182 100644 (file)
@@ -11,6 +11,16 @@ incorrectly encode certain JPEG images when quality=100 and the fast integer
 forward DCT were used.  This was known to cause 'make test' to fail when the
 library was built with '-march=haswell' on x86 systems.
 
+[3] Fixed an issue whereby libjpeg-turbo would crash when built with the latest
+& greatest development version of the Clang/LLVM compiler.  This was caused by
+an x86-64 ABI conformance issue in some of libjpeg-turbo's 64-bit SSE2 SIMD
+routines.  Those routines were incorrectly using a 64-bit mov instruction to
+transfer a 32-bit JDIMENSION argument, whereas the x86-64 ABI allows the upper
+(unused) 32 bits of a 32-bit argument's register to be undefined.  The new
+Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
+structure members into a single 64-bit register, and this exposed the ABI
+conformance issue.
+
 
 1.4.1
 =====
index e86ccc6062df31bee2f19621c70fd963a35ba5ef..8e3007c4dd2acc1ab6637e5b587a663718fa8588 100644 (file)
@@ -162,7 +162,9 @@ typedef long INT32;
  * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore
  * "unsigned int" is sufficient on all machines.  However, if you need to
  * handle larger images and you don't mind deviating from the spec, you
- * can change this datatype.
+ * can change this datatype.  (Note that changing this datatype will
+ * potentially require modifying the SIMD code.  The x86-64 SIMD extensions,
+ * in particular, assume a 32-bit JDIMENSION.)
  */
 
 typedef unsigned int JDIMENSION;
index 7bd6d016ec6e21b879bbf0e4830b117b46eb3f84..7ad434381f94aca3b744f65246961fe5900235b0 100644 (file)
@@ -50,14 +50,14 @@ EXTN(jsimd_rgb_ycc_convert_sse2):
         collect_args
         push    rbx
 
-        mov     rcx, r10
+        mov     ecx, r10d
         test    rcx,rcx
         jz      near .return
 
         push    rcx
 
         mov rsi, r12
-        mov rcx, r13
+        mov ecx, r13d
         mov     rdi, JSAMPARRAY [rsi+0*SIZEOF_JSAMPARRAY]
         mov     rbx, JSAMPARRAY [rsi+1*SIZEOF_JSAMPARRAY]
         mov     rdx, JSAMPARRAY [rsi+2*SIZEOF_JSAMPARRAY]
index 5af02e04b1dec67b0e99d548d0723a75e6e60ce8..82c0fc8126295df200de201c22aadaf0c2cd7419 100644 (file)
@@ -50,14 +50,14 @@ EXTN(jsimd_rgb_gray_convert_sse2):
         collect_args
         push    rbx
 
-        mov     rcx, r10
+        mov     ecx, r10d
         test    rcx,rcx
         jz      near .return
 
         push    rcx
 
         mov rsi, r12
-        mov rcx, r13
+        mov ecx, r13d
         mov     rdi, JSAMPARRAY [rsi+0*SIZEOF_JSAMPARRAY]
         lea     rdi, [rdi+rcx*SIZEOF_JSAMPROW]
 
index f32fb4fcc1a0f8eb82757e6684ce48f0969dd105..7693285c90089a14226340d50445c84cb591f4a9 100644 (file)
@@ -49,11 +49,11 @@ EXTN(jsimd_h2v1_downsample_sse2):
         mov     rbp,rsp
         collect_args
 
-        mov rcx, r13
+        mov ecx, r13d
         shl     rcx,3                   ; imul rcx,DCTSIZE (rcx = output_cols)
         jz      near .return
 
-        mov rdx, r10
+        mov edx, r10d
 
         ; -- expand_right_edge
 
@@ -90,7 +90,7 @@ EXTN(jsimd_h2v1_downsample_sse2):
 
         ; -- h2v1_downsample
 
-        mov     rax, r12        ; rowctr
+        mov     eax, r12d        ; rowctr
         test    eax,eax
         jle     near .return
 
@@ -193,11 +193,11 @@ EXTN(jsimd_h2v2_downsample_sse2):
         mov     rbp,rsp
         collect_args
 
-        mov     rcx, r13
+        mov     ecx, r13d
         shl     rcx,3                   ; imul rcx,DCTSIZE (rcx = output_cols)
         jz      near .return
 
-        mov     rdx, r10
+        mov     edx, r10d
 
         ; -- expand_right_edge
 
@@ -234,7 +234,7 @@ EXTN(jsimd_h2v2_downsample_sse2):
 
         ; -- h2v2_downsample
 
-        mov     rax, r12        ; rowctr
+        mov     eax, r12d        ; rowctr
         test    rax,rax
         jle     near .return
 
index bfd1f35dff50cc085fd7c2f5c818ca952b5411f7..d356e6594a9443c06dc44a8aec3f8b1a84f336c2 100644 (file)
@@ -52,14 +52,14 @@ EXTN(jsimd_ycc_rgb_convert_sse2):
         collect_args
         push    rbx
 
-        mov     rcx, r10        ; num_cols
+        mov     ecx, r10d        ; num_cols
         test    rcx,rcx
         jz      near .return
 
         push    rcx
 
         mov     rdi, r11
-        mov     rcx, r12
+        mov     ecx, r12d
         mov     rsi, JSAMPARRAY [rdi+0*SIZEOF_JSAMPARRAY]
         mov     rbx, JSAMPARRAY [rdi+1*SIZEOF_JSAMPARRAY]
         mov     rdx, JSAMPARRAY [rdi+2*SIZEOF_JSAMPARRAY]
index ff127b5734080930bf014fa0bfb25fceb6d2116b..989d7f17c24e4bae1c4102d8ec8889fe5a390faf 100644 (file)
@@ -52,14 +52,14 @@ EXTN(jsimd_h2v1_merged_upsample_sse2):
         collect_args
         push    rbx
 
-        mov     rcx, r10        ; col
+        mov     ecx, r10d        ; col
         test    rcx,rcx
         jz      near .return
 
         push    rcx
 
         mov     rdi, r11
-        mov     rcx, r12
+        mov     ecx, r12d
         mov     rsi, JSAMPARRAY [rdi+0*SIZEOF_JSAMPARRAY]
         mov     rbx, JSAMPARRAY [rdi+1*SIZEOF_JSAMPARRAY]
         mov     rdx, JSAMPARRAY [rdi+2*SIZEOF_JSAMPARRAY]
@@ -455,10 +455,10 @@ EXTN(jsimd_h2v2_merged_upsample_sse2):
         collect_args
         push    rbx
 
-        mov     rax, r10
+        mov     eax, r10d
 
         mov     rdi, r11
-        mov     rcx, r12
+        mov     ecx, r12d
         mov     rsi, JSAMPARRAY [rdi+0*SIZEOF_JSAMPARRAY]
         mov     rbx, JSAMPARRAY [rdi+1*SIZEOF_JSAMPARRAY]
         mov     rdx, JSAMPARRAY [rdi+2*SIZEOF_JSAMPARRAY]
index 335ce2aabb3e92514623b20dabe658b681c7ce37..2287c00e5a27de58271a179094f8f1f818be3916 100644 (file)
@@ -67,7 +67,7 @@ EXTN(jsimd_h2v1_fancy_upsample_sse2):
         mov     rbp,rsp
         collect_args
 
-        mov     rax, r11  ; colctr
+        mov     eax, r11d  ; colctr
         test    rax,rax
         jz      near .return
 
@@ -214,7 +214,7 @@ EXTN(jsimd_h2v2_fancy_upsample_sse2):
         collect_args
         push    rbx
 
-        mov     rax, r11  ; colctr
+        mov     eax, r11d  ; colctr
         test    rax,rax
         jz      near .return
 
@@ -506,7 +506,7 @@ EXTN(jsimd_h2v1_upsample_sse2):
         mov     rbp,rsp
         collect_args
 
-        mov     rdx, r11
+        mov     edx, r11d
         add     rdx, byte (2*SIZEOF_XMMWORD)-1
         and     rdx, byte -(2*SIZEOF_XMMWORD)
         jz      near .return
@@ -596,7 +596,7 @@ EXTN(jsimd_h2v2_upsample_sse2):
         collect_args
         push    rbx
 
-        mov     rdx, r11
+        mov     edx, r11d
         add     rdx, byte (2*SIZEOF_XMMWORD)-1
         and     rdx, byte -(2*SIZEOF_XMMWORD)
         jz      near .return
index 32e4ec222cfe465478f0213cc0b25c61e8353d12..95bd4dcd17166d941ba1aa9ef6322ebc0bd7eedb 100644 (file)
@@ -326,7 +326,7 @@ EXTN(jsimd_idct_float_sse2):
         mov     rax, [original_rbp]
         lea     rsi, [workspace]                        ; FAST_FLOAT * wsptr
         mov     rdi, r12        ; (JSAMPROW *)
-        mov     rax, r13
+        mov     eax, r13d
         mov     rcx, DCTSIZE/4                          ; ctr
 .rowloop:
 
index bcc3e3a6fbce3afb6307e02e4ac60d14afde3de4..0f864291e942ce719b205d21daf5066eb644a42c 100644 (file)
@@ -323,7 +323,7 @@ EXTN(jsimd_idct_ifast_sse2):
 
         mov     rax, [original_rbp]
         mov     rdi, r12        ; (JSAMPROW *)
-        mov     rax, r13
+        mov     eax, r13d
 
         ; -- Even part
 
index 32bbfd8d3a6dd965053eaa7203d344c8037dc871..1cc3086600103423ca51de1bdc73cbc138848c1c 100644 (file)
@@ -515,7 +515,7 @@ EXTN(jsimd_idct_islow_sse2):
 
         mov     rax, [original_rbp]
         mov     rdi, r12        ; (JSAMPROW *)
-        mov     rax, r13
+        mov     eax, r13d
 
         ; -- Even part
 
index dad43d9056fc449f395b0328000d36f509729226..02b155a801b10a295ceecfb2f6f92145ec05d5d4 100644 (file)
@@ -312,7 +312,7 @@ EXTN(jsimd_idct_4x4_sse2):
 
         mov     rax, [original_rbp]
         mov     rdi, r12        ; (JSAMPROW *)
-        mov     rax, r13
+        mov     eax, r13d
 
         ; -- Even part
 
@@ -521,7 +521,7 @@ EXTN(jsimd_idct_2x2_sse2):
         ; ---- Pass 2: process rows, store into output array.
 
         mov     rdi, r12        ; (JSAMPROW *)
-        mov     rax, r13
+        mov     eax, r13d
 
         ; | input:| result:|
         ; | A0 B0 |        |
index 20e815f7d1455f7b777884c40c2d919b9fa48c5a..cf7f0d82782bdea0925aeb4924f38721860ca6e5 100644 (file)
@@ -50,7 +50,7 @@ EXTN(jsimd_convsamp_float_sse2):
         packsswb xmm7,xmm7              ; xmm7 = PB_CENTERJSAMPLE (0x808080..)
 
         mov rsi, r10
-        mov     rax, r11
+        mov     eax, r11d
         mov rdi, r12
         mov     rcx, DCTSIZE/2
 .convloop:
index 50b8dce7a26d2ab107124e95b1b5e18aa133da8b..b61f4db29e9885a060ed383090d853f9cd852b00 100644 (file)
@@ -50,7 +50,7 @@ EXTN(jsimd_convsamp_sse2):
         psllw   xmm7,7                  ; xmm7={0xFF80 0xFF80 0xFF80 0xFF80 ..}
 
         mov rsi, r10
-        mov rax, r11
+        mov eax, r11d
         mov rdi, r12
         mov     rcx, DCTSIZE/4
 .convloop: