strcmp.s revision 533d3a4910febc9985154b885dbe971e3c21ca04
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2009, Intel Corporation
* All rights reserved.
*/
/*
* str[n]cmp - compare chars between two string
*/
#include "SYS.h"
#include "proc64_id.h"
#ifdef USE_AS_STRNCMP
/*
* Since the counter, %r11, is unsigned, we branch to strcmp_exitz
* if the new counter > the old one or is 0.
*/
#define UPDATE_STRNCMP_COUNTER \
/* calculate left number to compare */ \
#else
#define UPDATE_STRNCMP_COUNTER
#endif
/*
* This implementation uses SSE to compare up to 16 bytes at a time.
*/
#ifdef USE_AS_STRNCMP
#else
#endif
#ifdef USE_AS_STRNCMP
#endif
/*
* Determine rdi and rsi string offsets from 16-byte alignment.
* Use relative offset difference between the two to determine which case
* below to use.
*/
.p2align 4
/*
* ashr_0 handles the following cases:
* str1 offset = str2 offset
*/
.p2align 4
/*
* edx must be the same with r9d if in left byte (16-rcx) is equal to
* the start from (16-rax) and no null char was seen.
*/
/*
* Now both strings are aligned at 16-byte boundary. Loop over strings
* checking 32-bytes per iteration.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_1 handles the following cases:
* abs(str1 offset - str2 offset) = 15
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
/*
* Nibble avoids loads across page boundary. This is to avoid a potential
* access into unmapped memory.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_2 handles the following cases:
* abs(str1 offset - str2 offset) = 14
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_3 handles the following cases:
* abs(str1 offset - str2 offset) = 13
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_4 handles the following cases:
* abs(str1 offset - str2 offset) = 12
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_5 handles the following cases:
* abs(str1 offset - str2 offset) = 11
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_6 handles the following cases:
* abs(str1 offset - str2 offset) = 10
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_7 handles the following cases:
* abs(str1 offset - str2 offset) = 9
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_8 handles the following cases:
* abs(str1 offset - str2 offset) = 8
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_9 handles the following cases:
* abs(str1 offset - str2 offset) = 7
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_10 handles the following cases:
* abs(str1 offset - str2 offset) = 6
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_11 handles the following cases:
* abs(str1 offset - str2 offset) = 5
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_12 handles the following cases:
* abs(str1 offset - str2 offset) = 4
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_13 handles the following cases:
* abs(str1 offset - str2 offset) = 3
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_14 handles the following cases:
* abs(str1 offset - str2 offset) = 2
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
/*
* ashr_15 handles the following cases:
* abs(str1 offset - str2 offset) = 1
*/
.p2align 4
/*
* Setup %r10 value allows us to detect crossing a page boundary.
* When %r10 goes positive we are crossing a page boundary and
* need to do a nibble.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
.p2align 4
/*
* Check to see if BSF is fast on this processor. If not, use a different
* exit tail.
*/
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
/*
* This exit tail does not use the bsf instruction.
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
/*
* never need to handle byte 0 for strncmpy
#ifdef USE_AS_STRNCMP
sub $0, %r11
jbe LABEL(strcmp_exitz)
#endif
*/
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#endif
#ifdef USE_AS_STRNCMP
#endif
.p2align 4
#ifdef USE_AS_STRNCMP
#else
#endif