wcsicmp in x86 Assembly

This procedure, wcsicmp_asm, compares two wchar_t (16-bit) strings without regard to case. See also wcscmp_asm.

The return value is:
less than zero if wcs1 is less than wcs2
equal to zero if wcs1 is equal to wcs2
greater than zero if wcs1 is greater than wcs2

TITLE 'extern "C" int wcsicmp_asm(const wchar_t *wcs1, const wchar_t *wcs2);'

.model FLAT

PUBLIC	_wcsicmp_asm

_wcsicmp_asm PROC NEAR

	mov  edx, DWORD PTR [esp+4] ; wcs1
	push esi
	mov  esi, DWORD PTR [esp+12] ; wcs2


	xor  eax, eax
	mov  ax, WORD PTR [edx]
	cmp  ax, 90 ; 'Z'
	ja   SHORT label2
	cmp  ax, 65 ; 'A'
	jb   SHORT label2
	add  eax, 32 ; 'a' - 'A' = 32


	xor  ecx, ecx
	mov  cx, WORD PTR [esi]
	cmp  cx, 90 ; 'Z'
	ja   SHORT label3
	cmp  cx, 65 ; 'A'
	jb   SHORT label3
	add  ecx, 32 ; 'a' - 'A' = 32


	add  edx, 2
	add  esi, 2

	test  ax, ax
	je   SHORT label4
	cmp  ax, cx
	je   SHORT label1


	and  ecx, 0000ffffH
	and  eax, 0000ffffH
	sub  eax, ecx
	pop  esi

	ret  0

_wcsicmp_asm ENDP