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