18c2ecf20Sopenharmony_ci; SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci; 38c2ecf20Sopenharmony_ci; linux/arch/c6x/lib/csum_64plus.s 48c2ecf20Sopenharmony_ci; 58c2ecf20Sopenharmony_ci; Port on Texas Instruments TMS320C6x architecture 68c2ecf20Sopenharmony_ci; 78c2ecf20Sopenharmony_ci; Copyright (C) 2006, 2009, 2010, 2011 Texas Instruments Incorporated 88c2ecf20Sopenharmony_ci; Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) 98c2ecf20Sopenharmony_ci; 108c2ecf20Sopenharmony_ci#include <linux/linkage.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci; 138c2ecf20Sopenharmony_ci;unsigned int csum_partial_copy_nocheck(const char *src, char * dst, 148c2ecf20Sopenharmony_ci; int len, int sum) 158c2ecf20Sopenharmony_ci; 168c2ecf20Sopenharmony_ci; A4: src 178c2ecf20Sopenharmony_ci; B4: dst 188c2ecf20Sopenharmony_ci; A6: len 198c2ecf20Sopenharmony_ci; B6: sum 208c2ecf20Sopenharmony_ci; return csum in A4 218c2ecf20Sopenharmony_ci; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci .text 248c2ecf20Sopenharmony_ciENTRY(csum_partial_copy_nocheck) 258c2ecf20Sopenharmony_ci MVC .S2 ILC,B30 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci ZERO .D1 A9 ; csum (a side) 288c2ecf20Sopenharmony_ci|| ZERO .D2 B9 ; csum (b side) 298c2ecf20Sopenharmony_ci|| SHRU .S2X A6,2,B5 ; len / 4 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci ;; Check alignment and size 328c2ecf20Sopenharmony_ci AND .S1 3,A4,A1 338c2ecf20Sopenharmony_ci|| AND .S2 3,B4,B0 348c2ecf20Sopenharmony_ci OR .L2X B0,A1,B0 ; non aligned condition 358c2ecf20Sopenharmony_ci|| MVC .S2 B5,ILC 368c2ecf20Sopenharmony_ci|| MVK .D2 1,B2 378c2ecf20Sopenharmony_ci|| MV .D1X B5,A1 ; words condition 388c2ecf20Sopenharmony_ci [!A1] B .S1 L8 398c2ecf20Sopenharmony_ci [B0] BNOP .S1 L6,5 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci SPLOOP 1 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci ;; Main loop for aligned words 448c2ecf20Sopenharmony_ci LDW .D1T1 *A4++,A7 458c2ecf20Sopenharmony_ci NOP 4 468c2ecf20Sopenharmony_ci MV .S2X A7,B7 478c2ecf20Sopenharmony_ci|| EXTU .S1 A7,0,16,A16 488c2ecf20Sopenharmony_ci STW .D2T2 B7,*B4++ 498c2ecf20Sopenharmony_ci|| MPYU .M2 B7,B2,B8 508c2ecf20Sopenharmony_ci|| ADD .L1 A16,A9,A9 518c2ecf20Sopenharmony_ci NOP 528c2ecf20Sopenharmony_ci SPKERNEL 8,0 538c2ecf20Sopenharmony_ci|| ADD .L2 B8,B9,B9 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci ZERO .D1 A1 568c2ecf20Sopenharmony_ci|| ADD .L1X A9,B9,A9 ; add csum from a and b sides 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ciL6: 598c2ecf20Sopenharmony_ci [!A1] BNOP .S1 L8,5 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci ;; Main loop for non-aligned words 628c2ecf20Sopenharmony_ci SPLOOP 2 638c2ecf20Sopenharmony_ci || MVK .L1 1,A2 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci LDNW .D1T1 *A4++,A7 668c2ecf20Sopenharmony_ci NOP 3 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci NOP 698c2ecf20Sopenharmony_ci MV .S2X A7,B7 708c2ecf20Sopenharmony_ci || EXTU .S1 A7,0,16,A16 718c2ecf20Sopenharmony_ci || MPYU .M1 A7,A2,A8 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci ADD .L1 A16,A9,A9 748c2ecf20Sopenharmony_ci SPKERNEL 6,0 758c2ecf20Sopenharmony_ci || STNW .D2T2 B7,*B4++ 768c2ecf20Sopenharmony_ci || ADD .L1 A8,A9,A9 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ciL8: AND .S2X 2,A6,B5 798c2ecf20Sopenharmony_ci CMPGT .L2 B5,0,B0 808c2ecf20Sopenharmony_ci [!B0] BNOP .S1 L82,4 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci ;; Manage half-word 838c2ecf20Sopenharmony_ci ZERO .L1 A7 848c2ecf20Sopenharmony_ci|| ZERO .D1 A8 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_BIG_ENDIAN 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci LDBU .D1T1 *A4++,A7 898c2ecf20Sopenharmony_ci LDBU .D1T1 *A4++,A8 908c2ecf20Sopenharmony_ci NOP 3 918c2ecf20Sopenharmony_ci SHL .S1 A7,8,A0 928c2ecf20Sopenharmony_ci ADD .S1 A8,A9,A9 938c2ecf20Sopenharmony_ci STB .D2T1 A7,*B4++ 948c2ecf20Sopenharmony_ci|| ADD .S1 A0,A9,A9 958c2ecf20Sopenharmony_ci STB .D2T1 A8,*B4++ 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci#else 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci LDBU .D1T1 *A4++,A7 1008c2ecf20Sopenharmony_ci LDBU .D1T1 *A4++,A8 1018c2ecf20Sopenharmony_ci NOP 3 1028c2ecf20Sopenharmony_ci ADD .S1 A7,A9,A9 1038c2ecf20Sopenharmony_ci SHL .S1 A8,8,A0 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci STB .D2T1 A7,*B4++ 1068c2ecf20Sopenharmony_ci|| ADD .S1 A0,A9,A9 1078c2ecf20Sopenharmony_ci STB .D2T1 A8,*B4++ 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci#endif 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci ;; Manage eventually the last byte 1128c2ecf20Sopenharmony_ciL82: AND .S2X 1,A6,B0 1138c2ecf20Sopenharmony_ci [!B0] BNOP .S1 L9,5 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci|| ZERO .L1 A7 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ciL83: LDBU .D1T1 *A4++,A7 1188c2ecf20Sopenharmony_ci NOP 4 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci MV .L2X A7,B7 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_BIG_ENDIAN 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci STB .D2T2 B7,*B4++ 1258c2ecf20Sopenharmony_ci|| SHL .S1 A7,8,A7 1268c2ecf20Sopenharmony_ci ADD .S1 A7,A9,A9 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci#else 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci STB .D2T2 B7,*B4++ 1318c2ecf20Sopenharmony_ci|| ADD .S1 A7,A9,A9 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci#endif 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci ;; Fold the csum 1368c2ecf20Sopenharmony_ciL9: SHRU .S2X A9,16,B0 1378c2ecf20Sopenharmony_ci [!B0] BNOP .S1 L10,5 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ciL91: SHRU .S2X A9,16,B4 1408c2ecf20Sopenharmony_ci|| EXTU .S1 A9,16,16,A3 1418c2ecf20Sopenharmony_ci ADD .D1X A3,B4,A9 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci SHRU .S1 A9,16,A0 1448c2ecf20Sopenharmony_ci [A0] BNOP .S1 L91,5 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ciL10: MV .D1 A9,A4 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci BNOP .S2 B3,4 1498c2ecf20Sopenharmony_ci MVC .S2 B30,ILC 1508c2ecf20Sopenharmony_ciENDPROC(csum_partial_copy_nocheck) 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci; 1538c2ecf20Sopenharmony_ci;unsigned short 1548c2ecf20Sopenharmony_ci;ip_fast_csum(unsigned char *iph, unsigned int ihl) 1558c2ecf20Sopenharmony_ci;{ 1568c2ecf20Sopenharmony_ci; unsigned int checksum = 0; 1578c2ecf20Sopenharmony_ci; unsigned short *tosum = (unsigned short *) iph; 1588c2ecf20Sopenharmony_ci; int len; 1598c2ecf20Sopenharmony_ci; 1608c2ecf20Sopenharmony_ci; len = ihl*4; 1618c2ecf20Sopenharmony_ci; 1628c2ecf20Sopenharmony_ci; if (len <= 0) 1638c2ecf20Sopenharmony_ci; return 0; 1648c2ecf20Sopenharmony_ci; 1658c2ecf20Sopenharmony_ci; while(len) { 1668c2ecf20Sopenharmony_ci; len -= 2; 1678c2ecf20Sopenharmony_ci; checksum += *tosum++; 1688c2ecf20Sopenharmony_ci; } 1698c2ecf20Sopenharmony_ci; if (len & 1) 1708c2ecf20Sopenharmony_ci; checksum += *(unsigned char*) tosum; 1718c2ecf20Sopenharmony_ci; 1728c2ecf20Sopenharmony_ci; while(checksum >> 16) 1738c2ecf20Sopenharmony_ci; checksum = (checksum & 0xffff) + (checksum >> 16); 1748c2ecf20Sopenharmony_ci; 1758c2ecf20Sopenharmony_ci; return ~checksum; 1768c2ecf20Sopenharmony_ci;} 1778c2ecf20Sopenharmony_ci; 1788c2ecf20Sopenharmony_ci; A4: iph 1798c2ecf20Sopenharmony_ci; B4: ihl 1808c2ecf20Sopenharmony_ci; return checksum in A4 1818c2ecf20Sopenharmony_ci; 1828c2ecf20Sopenharmony_ci .text 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ciENTRY(ip_fast_csum) 1858c2ecf20Sopenharmony_ci ZERO .D1 A5 1868c2ecf20Sopenharmony_ci || MVC .S2 ILC,B30 1878c2ecf20Sopenharmony_ci SHL .S2 B4,2,B0 1888c2ecf20Sopenharmony_ci CMPGT .L2 B0,0,B1 1898c2ecf20Sopenharmony_ci [!B1] BNOP .S1 L15,4 1908c2ecf20Sopenharmony_ci [!B1] ZERO .D1 A3 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci [!B0] B .S1 L12 1938c2ecf20Sopenharmony_ci SHRU .S2 B0,1,B0 1948c2ecf20Sopenharmony_ci MVC .S2 B0,ILC 1958c2ecf20Sopenharmony_ci NOP 3 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci SPLOOP 1 1988c2ecf20Sopenharmony_ci LDHU .D1T1 *A4++,A3 1998c2ecf20Sopenharmony_ci NOP 3 2008c2ecf20Sopenharmony_ci NOP 2018c2ecf20Sopenharmony_ci SPKERNEL 5,0 2028c2ecf20Sopenharmony_ci || ADD .L1 A3,A5,A5 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ciL12: SHRU .S1 A5,16,A0 2058c2ecf20Sopenharmony_ci [!A0] BNOP .S1 L14,5 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ciL13: SHRU .S2X A5,16,B4 2088c2ecf20Sopenharmony_ci EXTU .S1 A5,16,16,A3 2098c2ecf20Sopenharmony_ci ADD .D1X A3,B4,A5 2108c2ecf20Sopenharmony_ci SHRU .S1 A5,16,A0 2118c2ecf20Sopenharmony_ci [A0] BNOP .S1 L13,5 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ciL14: NOT .D1 A5,A3 2148c2ecf20Sopenharmony_ci EXTU .S1 A3,16,16,A3 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ciL15: BNOP .S2 B3,3 2178c2ecf20Sopenharmony_ci MVC .S2 B30,ILC 2188c2ecf20Sopenharmony_ci MV .D1 A3,A4 2198c2ecf20Sopenharmony_ciENDPROC(ip_fast_csum) 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci; 2228c2ecf20Sopenharmony_ci;unsigned short 2238c2ecf20Sopenharmony_ci;do_csum(unsigned char *buff, unsigned int len) 2248c2ecf20Sopenharmony_ci;{ 2258c2ecf20Sopenharmony_ci; int odd, count; 2268c2ecf20Sopenharmony_ci; unsigned int result = 0; 2278c2ecf20Sopenharmony_ci; 2288c2ecf20Sopenharmony_ci; if (len <= 0) 2298c2ecf20Sopenharmony_ci; goto out; 2308c2ecf20Sopenharmony_ci; odd = 1 & (unsigned long) buff; 2318c2ecf20Sopenharmony_ci; if (odd) { 2328c2ecf20Sopenharmony_ci;#ifdef __LITTLE_ENDIAN 2338c2ecf20Sopenharmony_ci; result += (*buff << 8); 2348c2ecf20Sopenharmony_ci;#else 2358c2ecf20Sopenharmony_ci; result = *buff; 2368c2ecf20Sopenharmony_ci;#endif 2378c2ecf20Sopenharmony_ci; len--; 2388c2ecf20Sopenharmony_ci; buff++; 2398c2ecf20Sopenharmony_ci; } 2408c2ecf20Sopenharmony_ci; count = len >> 1; /* nr of 16-bit words.. */ 2418c2ecf20Sopenharmony_ci; if (count) { 2428c2ecf20Sopenharmony_ci; if (2 & (unsigned long) buff) { 2438c2ecf20Sopenharmony_ci; result += *(unsigned short *) buff; 2448c2ecf20Sopenharmony_ci; count--; 2458c2ecf20Sopenharmony_ci; len -= 2; 2468c2ecf20Sopenharmony_ci; buff += 2; 2478c2ecf20Sopenharmony_ci; } 2488c2ecf20Sopenharmony_ci; count >>= 1; /* nr of 32-bit words.. */ 2498c2ecf20Sopenharmony_ci; if (count) { 2508c2ecf20Sopenharmony_ci; unsigned int carry = 0; 2518c2ecf20Sopenharmony_ci; do { 2528c2ecf20Sopenharmony_ci; unsigned int w = *(unsigned int *) buff; 2538c2ecf20Sopenharmony_ci; count--; 2548c2ecf20Sopenharmony_ci; buff += 4; 2558c2ecf20Sopenharmony_ci; result += carry; 2568c2ecf20Sopenharmony_ci; result += w; 2578c2ecf20Sopenharmony_ci; carry = (w > result); 2588c2ecf20Sopenharmony_ci; } while (count); 2598c2ecf20Sopenharmony_ci; result += carry; 2608c2ecf20Sopenharmony_ci; result = (result & 0xffff) + (result >> 16); 2618c2ecf20Sopenharmony_ci; } 2628c2ecf20Sopenharmony_ci; if (len & 2) { 2638c2ecf20Sopenharmony_ci; result += *(unsigned short *) buff; 2648c2ecf20Sopenharmony_ci; buff += 2; 2658c2ecf20Sopenharmony_ci; } 2668c2ecf20Sopenharmony_ci; } 2678c2ecf20Sopenharmony_ci; if (len & 1) 2688c2ecf20Sopenharmony_ci;#ifdef __LITTLE_ENDIAN 2698c2ecf20Sopenharmony_ci; result += *buff; 2708c2ecf20Sopenharmony_ci;#else 2718c2ecf20Sopenharmony_ci; result += (*buff << 8); 2728c2ecf20Sopenharmony_ci;#endif 2738c2ecf20Sopenharmony_ci; result = (result & 0xffff) + (result >> 16); 2748c2ecf20Sopenharmony_ci; /* add up carry.. */ 2758c2ecf20Sopenharmony_ci; result = (result & 0xffff) + (result >> 16); 2768c2ecf20Sopenharmony_ci; if (odd) 2778c2ecf20Sopenharmony_ci; result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); 2788c2ecf20Sopenharmony_ci;out: 2798c2ecf20Sopenharmony_ci; return result; 2808c2ecf20Sopenharmony_ci;} 2818c2ecf20Sopenharmony_ci; 2828c2ecf20Sopenharmony_ci; A4: buff 2838c2ecf20Sopenharmony_ci; B4: len 2848c2ecf20Sopenharmony_ci; return checksum in A4 2858c2ecf20Sopenharmony_ci; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ciENTRY(do_csum) 2888c2ecf20Sopenharmony_ci CMPGT .L2 B4,0,B0 2898c2ecf20Sopenharmony_ci [!B0] BNOP .S1 L26,3 2908c2ecf20Sopenharmony_ci EXTU .S1 A4,31,31,A0 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci MV .L1 A0,A3 2938c2ecf20Sopenharmony_ci|| MV .S1X B3,A5 2948c2ecf20Sopenharmony_ci|| MV .L2 B4,B3 2958c2ecf20Sopenharmony_ci|| ZERO .D1 A1 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_BIG_ENDIAN 2988c2ecf20Sopenharmony_ci [A0] SUB .L2 B3,1,B3 2998c2ecf20Sopenharmony_ci|| [A0] LDBU .D1T1 *A4++,A1 3008c2ecf20Sopenharmony_ci#else 3018c2ecf20Sopenharmony_ci [!A0] BNOP .S1 L21,5 3028c2ecf20Sopenharmony_ci|| [A0] LDBU .D1T1 *A4++,A0 3038c2ecf20Sopenharmony_ci SUB .L2 B3,1,B3 3048c2ecf20Sopenharmony_ci|| SHL .S1 A0,8,A1 3058c2ecf20Sopenharmony_ciL21: 3068c2ecf20Sopenharmony_ci#endif 3078c2ecf20Sopenharmony_ci SHR .S2 B3,1,B0 3088c2ecf20Sopenharmony_ci [!B0] BNOP .S1 L24,3 3098c2ecf20Sopenharmony_ci MVK .L1 2,A0 3108c2ecf20Sopenharmony_ci AND .L1 A4,A0,A0 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci [!A0] BNOP .S1 L22,5 3138c2ecf20Sopenharmony_ci|| [A0] LDHU .D1T1 *A4++,A0 3148c2ecf20Sopenharmony_ci SUB .L2 B0,1,B0 3158c2ecf20Sopenharmony_ci|| SUB .S2 B3,2,B3 3168c2ecf20Sopenharmony_ci|| ADD .L1 A0,A1,A1 3178c2ecf20Sopenharmony_ciL22: 3188c2ecf20Sopenharmony_ci SHR .S2 B0,1,B0 3198c2ecf20Sopenharmony_ci|| ZERO .L1 A0 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_ci [!B0] BNOP .S1 L23,5 3228c2ecf20Sopenharmony_ci|| [B0] MVC .S2 B0,ILC 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci SPLOOP 3 3258c2ecf20Sopenharmony_ci SPMASK L1 3268c2ecf20Sopenharmony_ci|| MV .L1 A1,A2 3278c2ecf20Sopenharmony_ci|| LDW .D1T1 *A4++,A1 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci NOP 4 3308c2ecf20Sopenharmony_ci ADD .L1 A0,A1,A0 3318c2ecf20Sopenharmony_ci ADD .L1 A2,A0,A2 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci SPKERNEL 1,2 3348c2ecf20Sopenharmony_ci|| CMPGTU .L1 A1,A2,A0 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci ADD .L1 A0,A2,A6 3378c2ecf20Sopenharmony_ci EXTU .S1 A6,16,16,A7 3388c2ecf20Sopenharmony_ci SHRU .S2X A6,16,B0 3398c2ecf20Sopenharmony_ci NOP 1 3408c2ecf20Sopenharmony_ci ADD .L1X A7,B0,A1 3418c2ecf20Sopenharmony_ciL23: 3428c2ecf20Sopenharmony_ci MVK .L2 2,B0 3438c2ecf20Sopenharmony_ci AND .L2 B3,B0,B0 3448c2ecf20Sopenharmony_ci [B0] LDHU .D1T1 *A4++,A0 3458c2ecf20Sopenharmony_ci NOP 4 3468c2ecf20Sopenharmony_ci [B0] ADD .L1 A0,A1,A1 3478c2ecf20Sopenharmony_ciL24: 3488c2ecf20Sopenharmony_ci EXTU .S2 B3,31,31,B0 3498c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_BIG_ENDIAN 3508c2ecf20Sopenharmony_ci [!B0] BNOP .S1 L25,4 3518c2ecf20Sopenharmony_ci|| [B0] LDBU .D1T1 *A4,A0 3528c2ecf20Sopenharmony_ci SHL .S1 A0,8,A0 3538c2ecf20Sopenharmony_ci ADD .L1 A0,A1,A1 3548c2ecf20Sopenharmony_ciL25: 3558c2ecf20Sopenharmony_ci#else 3568c2ecf20Sopenharmony_ci [B0] LDBU .D1T1 *A4,A0 3578c2ecf20Sopenharmony_ci NOP 4 3588c2ecf20Sopenharmony_ci [B0] ADD .L1 A0,A1,A1 3598c2ecf20Sopenharmony_ci#endif 3608c2ecf20Sopenharmony_ci EXTU .S1 A1,16,16,A0 3618c2ecf20Sopenharmony_ci SHRU .S2X A1,16,B0 3628c2ecf20Sopenharmony_ci NOP 1 3638c2ecf20Sopenharmony_ci ADD .L1X A0,B0,A0 3648c2ecf20Sopenharmony_ci SHRU .S1 A0,16,A1 3658c2ecf20Sopenharmony_ci ADD .L1 A0,A1,A0 3668c2ecf20Sopenharmony_ci EXTU .S1 A0,16,16,A1 3678c2ecf20Sopenharmony_ci EXTU .S1 A1,16,24,A2 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci EXTU .S1 A1,24,16,A0 3708c2ecf20Sopenharmony_ci|| MV .L2X A3,B0 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci [B0] OR .L1 A0,A2,A1 3738c2ecf20Sopenharmony_ciL26: 3748c2ecf20Sopenharmony_ci NOP 1 3758c2ecf20Sopenharmony_ci BNOP .S2X A5,4 3768c2ecf20Sopenharmony_ci MV .L1 A1,A4 3778c2ecf20Sopenharmony_ciENDPROC(do_csum) 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci;__wsum csum_partial(const void *buff, int len, __wsum wsum) 3808c2ecf20Sopenharmony_ci;{ 3818c2ecf20Sopenharmony_ci; unsigned int sum = (__force unsigned int)wsum; 3828c2ecf20Sopenharmony_ci; unsigned int result = do_csum(buff, len); 3838c2ecf20Sopenharmony_ci; 3848c2ecf20Sopenharmony_ci; /* add in old sum, and carry.. */ 3858c2ecf20Sopenharmony_ci; result += sum; 3868c2ecf20Sopenharmony_ci; if (sum > result) 3878c2ecf20Sopenharmony_ci; result += 1; 3888c2ecf20Sopenharmony_ci; return (__force __wsum)result; 3898c2ecf20Sopenharmony_ci;} 3908c2ecf20Sopenharmony_ci; 3918c2ecf20Sopenharmony_ciENTRY(csum_partial) 3928c2ecf20Sopenharmony_ci MV .L1X B3,A9 3938c2ecf20Sopenharmony_ci|| CALLP .S2 do_csum,B3 3948c2ecf20Sopenharmony_ci|| MV .S1 A6,A8 3958c2ecf20Sopenharmony_ci BNOP .S2X A9,2 3968c2ecf20Sopenharmony_ci ADD .L1 A8,A4,A1 3978c2ecf20Sopenharmony_ci CMPGTU .L1 A8,A1,A0 3988c2ecf20Sopenharmony_ci ADD .L1 A1,A0,A4 3998c2ecf20Sopenharmony_ciENDPROC(csum_partial) 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci;unsigned short 4028c2ecf20Sopenharmony_ci;ip_compute_csum(unsigned char *buff, unsigned int len) 4038c2ecf20Sopenharmony_ci; 4048c2ecf20Sopenharmony_ci; A4: buff 4058c2ecf20Sopenharmony_ci; B4: len 4068c2ecf20Sopenharmony_ci; return checksum in A4 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ciENTRY(ip_compute_csum) 4098c2ecf20Sopenharmony_ci MV .L1X B3,A9 4108c2ecf20Sopenharmony_ci|| CALLP .S2 do_csum,B3 4118c2ecf20Sopenharmony_ci BNOP .S2X A9,3 4128c2ecf20Sopenharmony_ci NOT .S1 A4,A4 4138c2ecf20Sopenharmony_ci CLR .S1 A4,16,31,A4 4148c2ecf20Sopenharmony_ciENDPROC(ip_compute_csum) 415