tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

jquant-sse.asm (7368B)


      1 ;
      2 ; jquant.asm - sample data conversion and quantization (SSE & MMX)
      3 ;
      4 ; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
      5 ; Copyright (C) 2016, 2024, D. R. Commander.
      6 ;
      7 ; Based on the x86 SIMD extension for IJG JPEG library
      8 ; Copyright (C) 1999-2006, MIYASAKA Masaru.
      9 ; For conditions of distribution and use, see copyright notice in jsimdext.inc
     10 ;
     11 ; This file should be assembled with NASM (Netwide Assembler) or Yasm.
     12 
     13 %include "jsimdext.inc"
     14 %include "jdct.inc"
     15 
     16 ; --------------------------------------------------------------------------
     17    SECTION     SEG_TEXT
     18    BITS        32
     19 ;
     20 ; Load data into workspace, applying unsigned->signed conversion
     21 ;
     22 ; GLOBAL(void)
     23 ; jsimd_convsamp_float_sse(JSAMPARRAY sample_data, JDIMENSION start_col,
     24 ;                          FAST_FLOAT *workspace);
     25 ;
     26 
     27 %define sample_data  ebp + 8            ; JSAMPARRAY sample_data
     28 %define start_col    ebp + 12           ; JDIMENSION start_col
     29 %define workspace    ebp + 16           ; FAST_FLOAT *workspace
     30 
     31    align       32
     32    GLOBAL_FUNCTION(jsimd_convsamp_float_sse)
     33 
     34 EXTN(jsimd_convsamp_float_sse):
     35    push        ebp
     36    mov         ebp, esp
     37    push        ebx
     38 ;   push        ecx                     ; need not be preserved
     39 ;   push        edx                     ; need not be preserved
     40    push        esi
     41    push        edi
     42 
     43    pcmpeqw     mm7, mm7
     44    psllw       mm7, 7
     45    packsswb    mm7, mm7                ; mm7 = PB_CENTERJSAMPLE (0x808080..)
     46 
     47    mov         esi, JSAMPARRAY [sample_data]  ; (JSAMPROW *)
     48    mov         eax, JDIMENSION [start_col]
     49    mov         edi, POINTER [workspace]       ; (DCTELEM *)
     50    mov         ecx, DCTSIZE/2
     51    ALIGNX      16, 7
     52 .convloop:
     53    mov         ebx, JSAMPROW [esi+0*SIZEOF_JSAMPROW]  ; (JSAMPLE *)
     54    mov         edx, JSAMPROW [esi+1*SIZEOF_JSAMPROW]  ; (JSAMPLE *)
     55 
     56    movq        mm0, MMWORD [ebx+eax*SIZEOF_JSAMPLE]
     57    movq        mm1, MMWORD [edx+eax*SIZEOF_JSAMPLE]
     58 
     59    psubb       mm0, mm7                ; mm0=(01234567)
     60    psubb       mm1, mm7                ; mm1=(89ABCDEF)
     61 
     62    punpcklbw   mm2, mm0                ; mm2=(*0*1*2*3)
     63    punpckhbw   mm0, mm0                ; mm0=(*4*5*6*7)
     64    punpcklbw   mm3, mm1                ; mm3=(*8*9*A*B)
     65    punpckhbw   mm1, mm1                ; mm1=(*C*D*E*F)
     66 
     67    punpcklwd   mm4, mm2                ; mm4=(***0***1)
     68    punpckhwd   mm2, mm2                ; mm2=(***2***3)
     69    punpcklwd   mm5, mm0                ; mm5=(***4***5)
     70    punpckhwd   mm0, mm0                ; mm0=(***6***7)
     71 
     72    psrad       mm4, (DWORD_BIT-BYTE_BIT)  ; mm4=(01)
     73    psrad       mm2, (DWORD_BIT-BYTE_BIT)  ; mm2=(23)
     74    cvtpi2ps    xmm0, mm4                  ; xmm0=(01**)
     75    cvtpi2ps    xmm1, mm2                  ; xmm1=(23**)
     76    psrad       mm5, (DWORD_BIT-BYTE_BIT)  ; mm5=(45)
     77    psrad       mm0, (DWORD_BIT-BYTE_BIT)  ; mm0=(67)
     78    cvtpi2ps    xmm2, mm5                  ; xmm2=(45**)
     79    cvtpi2ps    xmm3, mm0                  ; xmm3=(67**)
     80 
     81    punpcklwd   mm6, mm3                ; mm6=(***8***9)
     82    punpckhwd   mm3, mm3                ; mm3=(***A***B)
     83    punpcklwd   mm4, mm1                ; mm4=(***C***D)
     84    punpckhwd   mm1, mm1                ; mm1=(***E***F)
     85 
     86    psrad       mm6, (DWORD_BIT-BYTE_BIT)  ; mm6=(89)
     87    psrad       mm3, (DWORD_BIT-BYTE_BIT)  ; mm3=(AB)
     88    cvtpi2ps    xmm4, mm6                  ; xmm4=(89**)
     89    cvtpi2ps    xmm5, mm3                  ; xmm5=(AB**)
     90    psrad       mm4, (DWORD_BIT-BYTE_BIT)  ; mm4=(CD)
     91    psrad       mm1, (DWORD_BIT-BYTE_BIT)  ; mm1=(EF)
     92    cvtpi2ps    xmm6, mm4                  ; xmm6=(CD**)
     93    cvtpi2ps    xmm7, mm1                  ; xmm7=(EF**)
     94 
     95    movlhps     xmm0, xmm1              ; xmm0=(0123)
     96    movlhps     xmm2, xmm3              ; xmm2=(4567)
     97    movlhps     xmm4, xmm5              ; xmm4=(89AB)
     98    movlhps     xmm6, xmm7              ; xmm6=(CDEF)
     99 
    100    movaps      XMMWORD [XMMBLOCK(0,0,edi,SIZEOF_FAST_FLOAT)], xmm0
    101    movaps      XMMWORD [XMMBLOCK(0,1,edi,SIZEOF_FAST_FLOAT)], xmm2
    102    movaps      XMMWORD [XMMBLOCK(1,0,edi,SIZEOF_FAST_FLOAT)], xmm4
    103    movaps      XMMWORD [XMMBLOCK(1,1,edi,SIZEOF_FAST_FLOAT)], xmm6
    104 
    105    add         esi, byte 2*SIZEOF_JSAMPROW
    106    add         edi, byte 2*DCTSIZE*SIZEOF_FAST_FLOAT
    107    dec         ecx
    108    jnz         near .convloop
    109 
    110    emms                                ; empty MMX state
    111 
    112    pop         edi
    113    pop         esi
    114 ;   pop         edx                     ; need not be preserved
    115 ;   pop         ecx                     ; need not be preserved
    116    pop         ebx
    117    pop         ebp
    118    ret
    119 
    120 ; --------------------------------------------------------------------------
    121 ;
    122 ; Quantize/descale the coefficients, and store into coef_block
    123 ;
    124 ; GLOBAL(void)
    125 ; jsimd_quantize_float_sse(JCOEFPTR coef_block, FAST_FLOAT *divisors,
    126 ;                          FAST_FLOAT *workspace);
    127 ;
    128 
    129 %define coef_block  ebp + 8             ; JCOEFPTR coef_block
    130 %define divisors    ebp + 12            ; FAST_FLOAT *divisors
    131 %define workspace   ebp + 16            ; FAST_FLOAT *workspace
    132 
    133    align       32
    134    GLOBAL_FUNCTION(jsimd_quantize_float_sse)
    135 
    136 EXTN(jsimd_quantize_float_sse):
    137    push        ebp
    138    mov         ebp, esp
    139 ;   push        ebx                     ; unused
    140 ;   push        ecx                     ; unused
    141 ;   push        edx                     ; need not be preserved
    142    push        esi
    143    push        edi
    144 
    145    mov         esi, POINTER [workspace]
    146    mov         edx, POINTER [divisors]
    147    mov         edi, JCOEFPTR [coef_block]
    148    mov         eax, DCTSIZE2/16
    149    ALIGNX      16, 7
    150 .quantloop:
    151    movaps      xmm0, XMMWORD [XMMBLOCK(0,0,esi,SIZEOF_FAST_FLOAT)]
    152    movaps      xmm1, XMMWORD [XMMBLOCK(0,1,esi,SIZEOF_FAST_FLOAT)]
    153    mulps       xmm0, XMMWORD [XMMBLOCK(0,0,edx,SIZEOF_FAST_FLOAT)]
    154    mulps       xmm1, XMMWORD [XMMBLOCK(0,1,edx,SIZEOF_FAST_FLOAT)]
    155    movaps      xmm2, XMMWORD [XMMBLOCK(1,0,esi,SIZEOF_FAST_FLOAT)]
    156    movaps      xmm3, XMMWORD [XMMBLOCK(1,1,esi,SIZEOF_FAST_FLOAT)]
    157    mulps       xmm2, XMMWORD [XMMBLOCK(1,0,edx,SIZEOF_FAST_FLOAT)]
    158    mulps       xmm3, XMMWORD [XMMBLOCK(1,1,edx,SIZEOF_FAST_FLOAT)]
    159 
    160    movhlps     xmm4, xmm0
    161    movhlps     xmm5, xmm1
    162 
    163    cvtps2pi    mm0, xmm0
    164    cvtps2pi    mm1, xmm1
    165    cvtps2pi    mm4, xmm4
    166    cvtps2pi    mm5, xmm5
    167 
    168    movhlps     xmm6, xmm2
    169    movhlps     xmm7, xmm3
    170 
    171    cvtps2pi    mm2, xmm2
    172    cvtps2pi    mm3, xmm3
    173    cvtps2pi    mm6, xmm6
    174    cvtps2pi    mm7, xmm7
    175 
    176    packssdw    mm0, mm4
    177    packssdw    mm1, mm5
    178    packssdw    mm2, mm6
    179    packssdw    mm3, mm7
    180 
    181    movq        MMWORD [MMBLOCK(0,0,edi,SIZEOF_JCOEF)], mm0
    182    movq        MMWORD [MMBLOCK(0,1,edi,SIZEOF_JCOEF)], mm1
    183    movq        MMWORD [MMBLOCK(1,0,edi,SIZEOF_JCOEF)], mm2
    184    movq        MMWORD [MMBLOCK(1,1,edi,SIZEOF_JCOEF)], mm3
    185 
    186    add         esi, byte 16*SIZEOF_FAST_FLOAT
    187    add         edx, byte 16*SIZEOF_FAST_FLOAT
    188    add         edi, byte 16*SIZEOF_JCOEF
    189    dec         eax
    190    jnz         short .quantloop
    191 
    192    emms                                ; empty MMX state
    193 
    194    pop         edi
    195    pop         esi
    196 ;   pop         edx                     ; need not be preserved
    197 ;   pop         ecx                     ; unused
    198 ;   pop         ebx                     ; unused
    199    pop         ebp
    200    ret
    201 
    202 ; For some reason, the OS X linker does not honor the request to align the
    203 ; segment unless we do this.
    204    align       32