1;;
2;; Copyright (c) 2020, Intel Corporation
3;;
4;; Redistribution and use in source and binary forms, with or without
5;; modification, are permitted provided that the following conditions are met:
6;;
7;;     * Redistributions of source code must retain the above copyright notice,
8;;       this list of conditions and the following disclaimer.
9;;     * Redistributions in binary form must reproduce the above copyright
10;;       notice, this list of conditions and the following disclaimer in the
11;;       documentation and/or other materials provided with the distribution.
12;;     * Neither the name of Intel Corporation nor the names of its contributors
13;;       may be used to endorse or promote products derived from this software
14;;       without specific prior written permission.
15;;
16;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17;; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19;; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22;; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23;; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24;; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26;;
27
28%include "include/os.asm"
29%include "include/reg_sizes.asm"
30%include "include/crc32_const.inc"
31%include "include/clear_regs.asm"
32
33[bits 64]
34default rel
35
36%ifdef LINUX
37%define arg1            rdi
38%define arg2            rsi
39%define arg3            rdx
40%define arg4            rcx
41%else
42%define arg1            rcx
43%define arg2            rdx
44%define arg3            r8
45%define arg4            r9
46%endif
47
48struc STACK_FRAME
49_xmm_save:      resq    8 * 2
50_rsp_save:      resq    1
51endstruc
52
53section .text
54
55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
58;; arg1 - buffer pointer
59;; arg2 - buffer size in bytes
60;; Returns CRC value through RAX
61align 32
62MKGLOBAL(crc32_wimax_ofdma_data_avx, function,)
63crc32_wimax_ofdma_data_avx:
64%ifdef SAFE_PARAM
65        or              arg1, arg1
66        jz              .wrong_param
67%endif
68%ifndef LINUX
69        mov             rax, rsp
70        sub             rsp, STACK_FRAME_size
71        and             rsp, -16
72        mov             [rsp + _rsp_save], rax
73        vmovdqa         [rsp + _xmm_save + 16*0], xmm6
74        vmovdqa         [rsp + _xmm_save + 16*1], xmm7
75        vmovdqa         [rsp + _xmm_save + 16*2], xmm8
76        vmovdqa         [rsp + _xmm_save + 16*3], xmm9
77        vmovdqa         [rsp + _xmm_save + 16*4], xmm10
78        vmovdqa         [rsp + _xmm_save + 16*5], xmm11
79        vmovdqa         [rsp + _xmm_save + 16*6], xmm12
80        vmovdqa         [rsp + _xmm_save + 16*7], xmm13
81%endif
82        lea             arg4, [rel crc32_wimax_ofdma_data_const]
83        mov             arg3, arg2
84        mov             arg2, arg1
85        mov             DWORD(arg1), 0xffff_ffff
86
87        call            crc32_by8_avx
88
89        not             eax
90
91%ifdef SAFE_DATA
92        clear_scratch_xmms_avx_asm
93%endif
94%ifndef LINUX
95        vmovdqa         xmm6,  [rsp + _xmm_save + 16*0]
96        vmovdqa         xmm7,  [rsp + _xmm_save + 16*1]
97        vmovdqa         xmm8,  [rsp + _xmm_save + 16*2]
98        vmovdqa         xmm9,  [rsp + _xmm_save + 16*3]
99        vmovdqa         xmm10, [rsp + _xmm_save + 16*4]
100        vmovdqa         xmm11, [rsp + _xmm_save + 16*5]
101        vmovdqa         xmm12, [rsp + _xmm_save + 16*6]
102        vmovdqa         xmm13, [rsp + _xmm_save + 16*7]
103        mov             rsp, [rsp + _rsp_save]
104%endif
105.wrong_param:
106        ret
107
108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111;; arg1 - buffer pointer
112;; arg2 - buffer size in bytes
113;; Returns CRC value through RAX
114align 32
115MKGLOBAL(crc8_wimax_ofdma_hcs_avx, function,)
116crc8_wimax_ofdma_hcs_avx:
117%ifdef SAFE_PARAM
118        or              arg1, arg1
119        jz              .wrong_param
120%endif
121%ifndef LINUX
122        mov             rax, rsp
123        sub             rsp, STACK_FRAME_size
124        and             rsp, -16
125        mov             [rsp + _rsp_save], rax
126        vmovdqa         [rsp + _xmm_save + 16*0], xmm6
127        vmovdqa         [rsp + _xmm_save + 16*1], xmm7
128        vmovdqa         [rsp + _xmm_save + 16*2], xmm8
129        vmovdqa         [rsp + _xmm_save + 16*3], xmm9
130        vmovdqa         [rsp + _xmm_save + 16*4], xmm10
131        vmovdqa         [rsp + _xmm_save + 16*5], xmm11
132        vmovdqa         [rsp + _xmm_save + 16*6], xmm12
133        vmovdqa         [rsp + _xmm_save + 16*7], xmm13
134%endif
135        lea             arg4, [rel crc32_wimax_ofdma_hcs8_const]
136        mov             arg3, arg2
137        mov             arg2, arg1
138        xor             DWORD(arg1), DWORD(arg1)
139
140        call            crc32_by8_avx
141
142        shr             eax, 24          ; adjust for 8-bit poly
143
144%ifdef SAFE_DATA
145        clear_scratch_xmms_avx_asm
146%endif
147%ifndef LINUX
148        vmovdqa         xmm6,  [rsp + _xmm_save + 16*0]
149        vmovdqa         xmm7,  [rsp + _xmm_save + 16*1]
150        vmovdqa         xmm8,  [rsp + _xmm_save + 16*2]
151        vmovdqa         xmm9,  [rsp + _xmm_save + 16*3]
152        vmovdqa         xmm10, [rsp + _xmm_save + 16*4]
153        vmovdqa         xmm11, [rsp + _xmm_save + 16*5]
154        vmovdqa         xmm12, [rsp + _xmm_save + 16*6]
155        vmovdqa         xmm13, [rsp + _xmm_save + 16*7]
156        mov             rsp, [rsp + _rsp_save]
157%endif
158.wrong_param:
159        ret
160
161
162%ifdef LINUX
163section .note.GNU-stack noalloc noexec nowrite progbits
164%endif
165