mirror of
https://github.com/intel/isa-l.git
synced 2024-12-12 09:23:50 +01:00
igzip: Implement icf_body random data skip ahead
Change-Id: I5dd5f37ec0cdfe4f2591685dc4a0a056f0b07ea3 Signed-off-by: Roy Oursler <roy.j.oursler@intel.com>
This commit is contained in:
parent
eaa1c18a94
commit
fce71b0670
@ -36,7 +36,6 @@
|
|||||||
%include "reg_sizes.asm"
|
%include "reg_sizes.asm"
|
||||||
|
|
||||||
%include "stdmac.asm"
|
%include "stdmac.asm"
|
||||||
|
|
||||||
%ifdef DEBUG
|
%ifdef DEBUG
|
||||||
%macro MARK 1
|
%macro MARK 1
|
||||||
global %1
|
global %1
|
||||||
@ -51,6 +50,13 @@ global %1
|
|||||||
%define LARGE_MATCH_MIN 264 ; Minimum match size to enter large match emit loop
|
%define LARGE_MATCH_MIN 264 ; Minimum match size to enter large match emit loop
|
||||||
%define MIN_INBUF_PADDING 16
|
%define MIN_INBUF_PADDING 16
|
||||||
%define MAX_EMIT_SIZE 258 * 16
|
%define MAX_EMIT_SIZE 258 * 16
|
||||||
|
|
||||||
|
%define SKIP_SIZE_BASE (2 << 10) ; No match length before starting skipping
|
||||||
|
%define SKIP_BASE 32 ; Initial skip size
|
||||||
|
%define SKIP_START 512 ; Start increasing skip size once level is beyond SKIP_START
|
||||||
|
%define SKIP_RATE 2 ; Rate skip size increases after SKIP_START
|
||||||
|
%define MAX_SKIP_SIZE 128 ; Maximum skip size
|
||||||
|
%define MAX_SKIP_LEVEL (((MAX_SKIP_SIZE - SKIP_BASE) / SKIP_RATE) + SKIP_START) ; Maximum skip level
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
@ -63,6 +69,7 @@ global %1
|
|||||||
%define curr_data rax
|
%define curr_data rax
|
||||||
|
|
||||||
%define tmp2 rcx
|
%define tmp2 rcx
|
||||||
|
%define skip_count rcx
|
||||||
|
|
||||||
%define dist rbx
|
%define dist rbx
|
||||||
%define dist_code2 rbx
|
%define dist_code2 rbx
|
||||||
@ -96,7 +103,10 @@ global %1
|
|||||||
|
|
||||||
%define xtmp0 xmm0 ; tmp
|
%define xtmp0 xmm0 ; tmp
|
||||||
%define xtmp1 xmm1 ; tmp
|
%define xtmp1 xmm1 ; tmp
|
||||||
|
%define xlow_lit_shuf xmm2
|
||||||
|
%define xup_lit_shuf xmm3
|
||||||
%define xdata xmm4
|
%define xdata xmm4
|
||||||
|
%define xlit xmm5
|
||||||
|
|
||||||
%define ytmp0 ymm0 ; tmp
|
%define ytmp0 ymm0 ; tmp
|
||||||
%define ytmp1 ymm1 ; tmp
|
%define ytmp1 ymm1 ; tmp
|
||||||
@ -116,9 +126,11 @@ hash_mask_offset equ 24
|
|||||||
f_end_i_mem_offset equ 32
|
f_end_i_mem_offset equ 32
|
||||||
stream_offset equ 40
|
stream_offset equ 40
|
||||||
inbuf_slop_offset equ 48
|
inbuf_slop_offset equ 48
|
||||||
gpr_save_mem_offset equ 64 ; gpr save area (8*8 bytes)
|
skip_match_offset equ 56
|
||||||
|
skip_level_offset equ 64
|
||||||
|
gpr_save_mem_offset equ 80 ; gpr save area (8*8 bytes)
|
||||||
xmm_save_mem_offset equ gpr_save_mem_offset + 8*8 ; xmm save area (4*16 bytes) (16 byte aligned)
|
xmm_save_mem_offset equ gpr_save_mem_offset + 8*8 ; xmm save area (4*16 bytes) (16 byte aligned)
|
||||||
stack_size equ 9*8 + 8*8 + 4*16
|
stack_size equ 11*8 + 8*8 + 4*16
|
||||||
|
|
||||||
;;; 8 because stack address is odd multiple of 8 after a function call and
|
;;; 8 because stack address is odd multiple of 8 after a function call and
|
||||||
;;; we want it aligned to 16 bytes
|
;;; we want it aligned to 16 bytes
|
||||||
@ -214,6 +226,14 @@ isal_deflate_icf_body_ %+ METHOD %+ _ %+ ARCH %+ :
|
|||||||
mov file_length %+ d, [stream + _avail_in]
|
mov file_length %+ d, [stream + _avail_in]
|
||||||
add file_length, f_i
|
add file_length, f_i
|
||||||
|
|
||||||
|
mov [rsp + skip_match_offset], f_i
|
||||||
|
add qword [rsp + skip_match_offset], SKIP_SIZE_BASE
|
||||||
|
mov qword [rsp + skip_level_offset], 0
|
||||||
|
|
||||||
|
PBROADCASTD xlit, dword [min_lit_dist_syms]
|
||||||
|
MOVDQU xlow_lit_shuf, [low_lit_shuf]
|
||||||
|
MOVDQU xup_lit_shuf, [up_lit_shuf]
|
||||||
|
|
||||||
mov qword [rsp + inbuf_slop_offset], MIN_INBUF_PADDING
|
mov qword [rsp + inbuf_slop_offset], MIN_INBUF_PADDING
|
||||||
cmp byte [stream + _end_of_stream], 0
|
cmp byte [stream + _end_of_stream], 0
|
||||||
jnz .default_inbuf_padding
|
jnz .default_inbuf_padding
|
||||||
@ -338,6 +358,10 @@ isal_deflate_icf_body_ %+ METHOD %+ _ %+ ARCH %+ :
|
|||||||
cmp f_i, file_length
|
cmp f_i, file_length
|
||||||
jg .len_dist_lit_huffman_finish
|
jg .len_dist_lit_huffman_finish
|
||||||
|
|
||||||
|
lea tmp1, [f_i + SKIP_SIZE_BASE]
|
||||||
|
mov qword [rsp + skip_match_offset], tmp1
|
||||||
|
sub qword [rsp + skip_level_offset], len2
|
||||||
|
|
||||||
MOVDQU xdata, [file_start + len2]
|
MOVDQU xdata, [file_start + len2]
|
||||||
mov tmp1, [file_start + len2]
|
mov tmp1, [file_start + len2]
|
||||||
sub file_start, tmp2
|
sub file_start, tmp2
|
||||||
@ -426,6 +450,10 @@ isal_deflate_icf_body_ %+ METHOD %+ _ %+ ARCH %+ :
|
|||||||
cmp f_i, file_length
|
cmp f_i, file_length
|
||||||
jg .len_dist_huffman_finish
|
jg .len_dist_huffman_finish
|
||||||
|
|
||||||
|
lea tmp2, [f_i + SKIP_SIZE_BASE]
|
||||||
|
mov qword [rsp + skip_match_offset], tmp2
|
||||||
|
sub qword [rsp + skip_level_offset], len
|
||||||
|
|
||||||
MOVDQU xdata, [file_start + len]
|
MOVDQU xdata, [file_start + len]
|
||||||
mov curr_data2, [file_start + len]
|
mov curr_data2, [file_start + len]
|
||||||
mov curr_data, curr_data2
|
mov curr_data, curr_data2
|
||||||
@ -498,8 +526,117 @@ isal_deflate_icf_body_ %+ METHOD %+ _ %+ ARCH %+ :
|
|||||||
mov dword [m_out_buf], lit_code %+ d
|
mov dword [m_out_buf], lit_code %+ d
|
||||||
add m_out_buf, 4
|
add m_out_buf, 4
|
||||||
|
|
||||||
|
cmp f_i, [rsp + skip_match_offset]
|
||||||
|
jle .loop2
|
||||||
|
|
||||||
|
xor tmp3, tmp3
|
||||||
|
mov rcx, [rsp + skip_level_offset]
|
||||||
|
add rcx, 1
|
||||||
|
cmovl rcx, tmp3
|
||||||
|
mov tmp1, MAX_SKIP_LEVEL
|
||||||
|
cmp rcx, MAX_SKIP_LEVEL
|
||||||
|
cmovg rcx, tmp1
|
||||||
|
|
||||||
|
mov tmp1, SKIP_SIZE_BASE
|
||||||
|
shr tmp1, cl
|
||||||
|
|
||||||
|
%if MAX_SKIP_LEVEL > 63
|
||||||
|
cmp rcx, 63
|
||||||
|
cmovg tmp1, tmp3
|
||||||
|
%endif
|
||||||
|
mov [rsp + skip_match_offset], tmp1
|
||||||
|
mov [rsp + skip_level_offset], rcx
|
||||||
|
|
||||||
|
sub rcx, SKIP_START
|
||||||
|
cmovl rcx, tmp3
|
||||||
|
|
||||||
|
lea skip_count, [SKIP_RATE * rcx + SKIP_BASE]
|
||||||
|
and skip_count, -SKIP_BASE
|
||||||
|
|
||||||
|
mov tmp1, [rsp + m_out_end]
|
||||||
|
lea tmp1, [tmp1 + 4]
|
||||||
|
sub tmp1, m_out_buf
|
||||||
|
shr tmp1, 1
|
||||||
|
cmp tmp1, skip_count
|
||||||
|
jl .skip_forward_short
|
||||||
|
|
||||||
|
mov tmp1, [rsp + inbuf_slop_offset]
|
||||||
|
add tmp1, file_length
|
||||||
|
sub tmp1, f_i
|
||||||
|
cmp tmp1, skip_count
|
||||||
|
jl .skip_forward_short
|
||||||
|
|
||||||
|
.skip_forward_long:
|
||||||
|
MOVQ xdata, [file_start + f_i]
|
||||||
|
|
||||||
|
movzx lit_code, byte [file_start + f_i]
|
||||||
|
movzx lit_code2, byte [file_start + f_i + 1]
|
||||||
|
|
||||||
|
add dword [lit_len_hist + HIST_ELEM_SIZE*lit_code], 1
|
||||||
|
add dword [lit_len_hist + HIST_ELEM_SIZE*lit_code2], 1
|
||||||
|
|
||||||
|
movzx lit_code, byte [file_start + f_i + 2]
|
||||||
|
movzx lit_code2, byte [file_start + f_i + 3]
|
||||||
|
|
||||||
|
add dword [lit_len_hist + HIST_ELEM_SIZE*lit_code], 1
|
||||||
|
add dword [lit_len_hist + HIST_ELEM_SIZE*lit_code2], 1
|
||||||
|
|
||||||
|
movzx lit_code, byte [file_start + f_i + 4]
|
||||||
|
movzx lit_code2, byte [file_start + f_i + 5]
|
||||||
|
|
||||||
|
add dword [lit_len_hist + HIST_ELEM_SIZE*lit_code], 1
|
||||||
|
add dword [lit_len_hist + HIST_ELEM_SIZE*lit_code2], 1
|
||||||
|
|
||||||
|
movzx lit_code, byte [file_start + f_i + 6]
|
||||||
|
movzx lit_code2, byte [file_start + f_i + 7]
|
||||||
|
|
||||||
|
add dword [lit_len_hist + HIST_ELEM_SIZE*lit_code], 1
|
||||||
|
add dword [lit_len_hist + HIST_ELEM_SIZE*lit_code2], 1
|
||||||
|
|
||||||
|
PSHUFB xtmp0, xdata, xlow_lit_shuf
|
||||||
|
PSHUFB xtmp1, xdata, xup_lit_shuf
|
||||||
|
PSLLD xtmp1, xtmp1, DIST_OFFSET
|
||||||
|
POR xtmp0, xtmp0, xtmp1
|
||||||
|
PADDD xtmp0, xtmp0, xlit
|
||||||
|
MOVDQU [m_out_buf], xtmp0
|
||||||
|
|
||||||
|
add m_out_buf, 16
|
||||||
|
add f_i, 8
|
||||||
|
|
||||||
|
sub skip_count, 8
|
||||||
|
jg .skip_forward_long
|
||||||
|
|
||||||
|
cmp file_length, f_i
|
||||||
|
jle .input_end
|
||||||
|
|
||||||
|
mov curr_data, [file_start + f_i]
|
||||||
|
MOVDQU xdata, [file_start + f_i]
|
||||||
|
add [rsp + skip_match_offset], f_i
|
||||||
|
|
||||||
jmp .loop2
|
jmp .loop2
|
||||||
|
|
||||||
|
.skip_forward_short:
|
||||||
|
movzx lit_code, byte [file_start + f_i]
|
||||||
|
movzx lit_code2, byte [file_start + f_i + 1]
|
||||||
|
|
||||||
|
inc dword [lit_len_hist + HIST_ELEM_SIZE*lit_code]
|
||||||
|
inc dword [lit_len_hist + HIST_ELEM_SIZE*lit_code2]
|
||||||
|
|
||||||
|
shl lit_code2, DIST_OFFSET
|
||||||
|
lea lit_code, [lit_code + lit_code2 + (31 << DIST_OFFSET)]
|
||||||
|
|
||||||
|
mov dword [m_out_buf], lit_code %+ d
|
||||||
|
add m_out_buf, 4
|
||||||
|
add f_i, 2
|
||||||
|
|
||||||
|
cmp m_out_buf, [rsp + m_out_end]
|
||||||
|
ja .output_end
|
||||||
|
|
||||||
|
cmp file_length, f_i
|
||||||
|
jle .input_end
|
||||||
|
|
||||||
|
jmp .skip_forward_short
|
||||||
|
|
||||||
.write_lit_bits_finish:
|
.write_lit_bits_finish:
|
||||||
inc dword [lit_len_hist + HIST_ELEM_SIZE*lit_code2]
|
inc dword [lit_len_hist + HIST_ELEM_SIZE*lit_code2]
|
||||||
|
|
||||||
@ -557,6 +694,7 @@ isal_deflate_icf_body_ %+ METHOD %+ _ %+ ARCH %+ :
|
|||||||
%endif
|
%endif
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
align 16
|
||||||
.compare_loop:
|
.compare_loop:
|
||||||
lea tmp2, [tmp1 + dist - 1]
|
lea tmp2, [tmp1 + dist - 1]
|
||||||
|
|
||||||
@ -578,6 +716,7 @@ isal_deflate_icf_body_ %+ METHOD %+ _ %+ ARCH %+ :
|
|||||||
mov len, 258
|
mov len, 258
|
||||||
jmp .len_dist_huffman
|
jmp .len_dist_huffman
|
||||||
|
|
||||||
|
align 16
|
||||||
.compare_loop2:
|
.compare_loop2:
|
||||||
lea tmp2, [tmp1 + dist2]
|
lea tmp2, [tmp1 + dist2]
|
||||||
add tmp1, 1
|
add tmp1, 1
|
||||||
@ -751,3 +890,12 @@ isal_deflate_icf_body_ %+ METHOD %+ _ %+ ARCH %+ :
|
|||||||
%xdefine COMPARE_TYPE1 COMPARE_TYPE2
|
%xdefine COMPARE_TYPE1 COMPARE_TYPE2
|
||||||
%endif
|
%endif
|
||||||
%endrep
|
%endrep
|
||||||
|
min_lit_dist_syms:
|
||||||
|
dd LIT + (1 << DIST_OFFSET)
|
||||||
|
|
||||||
|
low_lit_shuf:
|
||||||
|
db 0x00, 0xff, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff
|
||||||
|
db 0x04, 0xff, 0xff, 0xff, 0x06, 0xff, 0xff, 0xff
|
||||||
|
up_lit_shuf:
|
||||||
|
db 0x01, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff
|
||||||
|
db 0x05, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff
|
||||||
|
262
igzip/stdmac.asm
262
igzip/stdmac.asm
@ -207,72 +207,6 @@ ssc:
|
|||||||
ret
|
ret
|
||||||
%endm
|
%endm
|
||||||
|
|
||||||
;; Implement BZHI instruction on older architectures
|
|
||||||
;; Clobbers rcx, unless rcx is %%index
|
|
||||||
%macro BZHI 4
|
|
||||||
%define %%dest %1
|
|
||||||
%define %%src %2
|
|
||||||
%define %%index %3
|
|
||||||
%define %%tmp1 %4
|
|
||||||
|
|
||||||
%ifdef USE_HSWNI
|
|
||||||
bzhi %%dest, %%src, %%index
|
|
||||||
%else
|
|
||||||
%ifnidn %%index, rcx
|
|
||||||
mov rcx, %%index
|
|
||||||
%endif
|
|
||||||
mov %%tmp1, 1
|
|
||||||
shl %%tmp1, cl
|
|
||||||
sub %%tmp1, 1
|
|
||||||
|
|
||||||
%ifnidn %%src, %%dest
|
|
||||||
mov %%dest, %%src
|
|
||||||
%endif
|
|
||||||
|
|
||||||
and %%dest, %%tmp1
|
|
||||||
%endif
|
|
||||||
%endm
|
|
||||||
|
|
||||||
;; Implement shrx instruction on older architectures
|
|
||||||
;; Clobbers rcx, unless rcx is %%index
|
|
||||||
%macro SHRX 3
|
|
||||||
%define %%dest %1
|
|
||||||
%define %%src %2
|
|
||||||
%define %%index %3
|
|
||||||
|
|
||||||
%ifdef USE_HSWNI
|
|
||||||
shrx %%dest, %%src, %%index
|
|
||||||
%else
|
|
||||||
%ifnidn %%index, rcx
|
|
||||||
mov rcx, %%index
|
|
||||||
%endif
|
|
||||||
%ifnidn %%src, %%dest
|
|
||||||
mov %%dest, %%src
|
|
||||||
%endif
|
|
||||||
shr %%dest, cl
|
|
||||||
%endif
|
|
||||||
%endm
|
|
||||||
|
|
||||||
;; Implement shlx instruction on older architectures
|
|
||||||
;; Clobbers rcx, unless rcx is %%index
|
|
||||||
%macro SHLX 3
|
|
||||||
%define %%dest %1
|
|
||||||
%define %%src %2
|
|
||||||
%define %%index %3
|
|
||||||
|
|
||||||
%ifdef USE_HSWNI
|
|
||||||
shlx %%dest, %%src, %%index
|
|
||||||
%else
|
|
||||||
%ifnidn %%src, %%dest
|
|
||||||
mov %%dest, %%src
|
|
||||||
%endif
|
|
||||||
%ifnidn %%index, rcx
|
|
||||||
mov rcx, %%index
|
|
||||||
%endif
|
|
||||||
shl %%dest, cl
|
|
||||||
%endif
|
|
||||||
%endm
|
|
||||||
|
|
||||||
%macro MOVDQU 2
|
%macro MOVDQU 2
|
||||||
%define %%dest %1
|
%define %%dest %1
|
||||||
%define %%src %2
|
%define %%src %2
|
||||||
@ -283,6 +217,16 @@ ssc:
|
|||||||
%endif
|
%endif
|
||||||
%endm
|
%endm
|
||||||
|
|
||||||
|
%macro MOVDQA 2
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src %2
|
||||||
|
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
||||||
|
vmovdqa %%dest, %%src
|
||||||
|
%else
|
||||||
|
movdqa %%dest, %%src
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
%macro MOVD 2
|
%macro MOVD 2
|
||||||
%define %%dest %1
|
%define %%dest %1
|
||||||
%define %%src %2
|
%define %%src %2
|
||||||
@ -303,6 +247,111 @@ ssc:
|
|||||||
%endif
|
%endif
|
||||||
%endm
|
%endm
|
||||||
|
|
||||||
|
;; Move register if the src and dest are not equal
|
||||||
|
%macro MOVNIDN 2
|
||||||
|
%define dest %1
|
||||||
|
%define src %2
|
||||||
|
%ifnidn dest, src
|
||||||
|
mov dest, src
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
%macro MOVDQANIDN 2
|
||||||
|
%define dest %1
|
||||||
|
%define src %2
|
||||||
|
%ifnidn dest, src
|
||||||
|
MOVDQA dest, src
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
%macro PSHUFD 3
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src1 %2
|
||||||
|
%define %%imm8 %3
|
||||||
|
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
||||||
|
vpshufd %%dest, %%src1, %%imm8
|
||||||
|
%else
|
||||||
|
pshufd %%dest, %%src1, %%imm8
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
%macro PSHUFB 3
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src1 %2
|
||||||
|
%define %%shuf %3
|
||||||
|
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
||||||
|
vpshufb %%dest, %%src1, %%shuf
|
||||||
|
%else
|
||||||
|
MOVDQANIDN %%dest, %%src1
|
||||||
|
pshufb %%dest, %%shuf
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
%macro PBROADCASTD 2
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src %2
|
||||||
|
%if (ARCH == 04)
|
||||||
|
vpbroadcastd %%dest, %%src
|
||||||
|
%else
|
||||||
|
MOVD %%dest, %%src
|
||||||
|
PSHUFD %%dest, %%dest, 0
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
;; Implement BZHI instruction on older architectures
|
||||||
|
;; Clobbers rcx, unless rcx is %%index
|
||||||
|
%macro BZHI 4
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src %2
|
||||||
|
%define %%index %3
|
||||||
|
%define %%tmp1 %4
|
||||||
|
|
||||||
|
%ifdef USE_HSWNI
|
||||||
|
bzhi %%dest, %%src, %%index
|
||||||
|
%else
|
||||||
|
MOVNIDN rcx, %%index
|
||||||
|
mov %%tmp1, 1
|
||||||
|
shl %%tmp1, cl
|
||||||
|
sub %%tmp1, 1
|
||||||
|
|
||||||
|
MOVNIDN %%dest, %%src
|
||||||
|
|
||||||
|
and %%dest, %%tmp1
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
;; Implement shrx instruction on older architectures
|
||||||
|
;; Clobbers rcx, unless rcx is %%index
|
||||||
|
%macro SHRX 3
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src %2
|
||||||
|
%define %%index %3
|
||||||
|
|
||||||
|
%ifdef USE_HSWNI
|
||||||
|
shrx %%dest, %%src, %%index
|
||||||
|
%else
|
||||||
|
MOVNIDN rcx, %%index
|
||||||
|
MOVNIDN %%dest, %%src
|
||||||
|
shr %%dest, cl
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
;; Implement shlx instruction on older architectures
|
||||||
|
;; Clobbers rcx, unless rcx is %%index
|
||||||
|
%macro SHLX 3
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src %2
|
||||||
|
%define %%index %3
|
||||||
|
|
||||||
|
%ifdef USE_HSWNI
|
||||||
|
shlx %%dest, %%src, %%index
|
||||||
|
%else
|
||||||
|
MOVNIDN %%dest, %%src
|
||||||
|
MOVNIDN rcx, %%index
|
||||||
|
shl %%dest, cl
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
%macro PINSRD 3
|
%macro PINSRD 3
|
||||||
%define %%dest %1
|
%define %%dest %1
|
||||||
%define %%src %2
|
%define %%src %2
|
||||||
@ -335,6 +384,18 @@ ssc:
|
|||||||
%endif
|
%endif
|
||||||
%endm
|
%endm
|
||||||
|
|
||||||
|
%macro PSLLD 3
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src %2
|
||||||
|
%define %%offset %3
|
||||||
|
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
||||||
|
vpslld %%dest, %%src, %%offset
|
||||||
|
%else
|
||||||
|
MOVDQANIDN %%dest, %%src
|
||||||
|
pslld %%dest, %%offset
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
%macro PAND 3
|
%macro PAND 3
|
||||||
%define %%dest %1
|
%define %%dest %1
|
||||||
%define %%src1 %2
|
%define %%src1 %2
|
||||||
@ -342,13 +403,47 @@ ssc:
|
|||||||
%if (ARCH == 02 || ARCH == 03 || ARCH == 04)
|
%if (ARCH == 02 || ARCH == 03 || ARCH == 04)
|
||||||
vpand %%dest, %%src1, %%src2
|
vpand %%dest, %%src1, %%src2
|
||||||
%else
|
%else
|
||||||
%ifnidn %%dest, %%src1
|
MOVDQANIDN %%dest, %%src1
|
||||||
movdqa %%dest, %%src1
|
|
||||||
%endif
|
|
||||||
pand %%dest, %%src2
|
pand %%dest, %%src2
|
||||||
%endif
|
%endif
|
||||||
%endm
|
%endm
|
||||||
|
|
||||||
|
%macro POR 3
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src1 %2
|
||||||
|
%define %%src2 %3
|
||||||
|
%if (ARCH == 02 || ARCH == 03 || ARCH == 04)
|
||||||
|
vpor %%dest, %%src1, %%src2
|
||||||
|
%else
|
||||||
|
MOVDQANIDN %%dest, %%src1
|
||||||
|
por %%dest, %%src2
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
%macro PXOR 3
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src1 %2
|
||||||
|
%define %%src2 %3
|
||||||
|
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
||||||
|
vpxor %%dest, %%src1, %%src2
|
||||||
|
%else
|
||||||
|
MOVDQANIDN %%dest, %%src1
|
||||||
|
pxor %%dest, %%src2
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
|
%macro PADDD 3
|
||||||
|
%define %%dest %1
|
||||||
|
%define %%src1 %2
|
||||||
|
%define %%src2 %3
|
||||||
|
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
||||||
|
vpaddd %%dest, %%src1, %%src2
|
||||||
|
%else
|
||||||
|
MOVDQANIDN %%dest, %%src1
|
||||||
|
paddd %%dest, %%src2
|
||||||
|
%endif
|
||||||
|
%endm
|
||||||
|
|
||||||
%macro PCMPEQB 3
|
%macro PCMPEQB 3
|
||||||
%define %%dest %1
|
%define %%dest %1
|
||||||
%define %%src1 %2
|
%define %%src1 %2
|
||||||
@ -356,9 +451,7 @@ ssc:
|
|||||||
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
||||||
vpcmpeqb %%dest, %%src1, %%src2
|
vpcmpeqb %%dest, %%src1, %%src2
|
||||||
%else
|
%else
|
||||||
%ifnidn %%dest, %%src1
|
MOVDQANIDN %%dest, %%src1
|
||||||
movdqa %%dest, %%src1
|
|
||||||
%endif
|
|
||||||
pcmpeqb %%dest, %%src2
|
pcmpeqb %%dest, %%src2
|
||||||
%endif
|
%endif
|
||||||
%endm
|
%endm
|
||||||
@ -373,29 +466,4 @@ ssc:
|
|||||||
%endif
|
%endif
|
||||||
%endm
|
%endm
|
||||||
|
|
||||||
%macro PXOR 3
|
|
||||||
%define %%dest %1
|
|
||||||
%define %%src1 %2
|
|
||||||
%define %%src2 %3
|
|
||||||
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
|
||||||
vpxor %%dest, %%src1, %%src2
|
|
||||||
%else
|
|
||||||
%ifnidn %%dest, %%src1
|
|
||||||
movdqa %%dest, %%src1
|
|
||||||
%endif
|
|
||||||
pxor %%dest, %%src2
|
|
||||||
%endif
|
|
||||||
%endm
|
|
||||||
|
|
||||||
%macro PSHUFD 3
|
|
||||||
%define %%dest %1
|
|
||||||
%define %%src1 %2
|
|
||||||
%define %%imm8 %3
|
|
||||||
%if ((ARCH == 02) || (ARCH == 03) || (ARCH == 04))
|
|
||||||
vpshufd %%dest, %%src1, %%imm8
|
|
||||||
%else
|
|
||||||
pshufd %%dest, %%src1, %%imm8
|
|
||||||
%endif
|
|
||||||
%endm
|
|
||||||
|
|
||||||
%endif ;; ifndef STDMAC_ASM
|
%endif ;; ifndef STDMAC_ASM
|
||||||
|
Loading…
Reference in New Issue
Block a user