--- /dev/null	Mon Mar 24 15:58:26 2008
+++ new/deleted_files/usr/src/common/crypto/arcfour/amd64/arcfour_crypt_amd64.s	Mon Mar 24 15:58:26 2008
@@ -0,0 +1,165 @@
+#if !defined(lint) && !defined(__lint)
+/  ARCFOUR implementation optimized for AMD64.
+/
+/  Author: Marc Bevand <bevand_m (at) epita.fr>
+/  Licence: I hereby disclaim the copyright on this code and place it
+/  in the public domain.
+/
+/  The code has been designed to be easily integrated into openssl:
+/  the exported RC4() function can replace the actual implementations
+/  openssl already contains. Please note that when linking with openssl,
+/  it requires that sizeof(RC4_INT) == 8. So openssl must be compiled
+/  with -DRC4_INT='unsigned long'.
+/
+/  The throughput achieved by this code is about 320 MBytes/sec, on
+/  a 1.8 GHz AMD Opteron (rev C0) processor.
+
+
+/ ***** BEGIN LICENSE BLOCK *****
+/ Version: MPL 1.1/GPL 2.0/LGPL 2.1
+/
+/ The contents of this file are subject to the Mozilla Public License Version
+/ 1.1 (the "License"); you may not use this file except in compliance with
+/ the License. You may obtain a copy of the License at
+/ http://www.mozilla.org/MPL/
+/
+/ Software distributed under the License is distributed on an "AS IS" basis,
+/ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+/ for the specific language governing rights and limitations under the
+/ License.
+/
+/ The Original Code is "Marc Bevand's fast AMD64 ARCFOUR source"
+/
+/ The Initial Developer of the Original Code is
+/ Marc Bevand <bevand_m@epita.fr> .
+/ Portions created by the Initial Developer are
+/ Copyright (C) 2004 the Initial Developer. All Rights Reserved.
+/
+/ Contributor(s):
+/
+/ Alternatively, the contents of this file may be used under the terms of
+/ either the GNU General Public License Version 2 or later (the "GPL"), or
+/ the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+/ in which case the provisions of the GPL or the LGPL are applicable instead
+/ of those above. If you wish to allow use of your version of this file only
+/ under the terms of either the GPL or the LGPL, and not to allow others to
+/ use your version of this file under the terms of the MPL, indicate your
+/ decision by deleting the provisions above and replace them with the notice
+/ and other provisions required by the GPL or the LGPL. If you do not delete
+/ the provisions above, a recipient may use your version of this file under
+/ the terms of any one of the MPL, the GPL or the LGPL.
+/
+/ ***** END LICENSE BLOCK *****
+
+	.ident	"@(#)arcfour_crypt_amd64.s	1.1	08/01/02 SMI"
+
+/
+/ void arcfour_crypt(ARCFour_key *key, uchar_t *in,
+/		uchar_t *out, size_t len);
+/
+/ The following is Marc Bevand's RC4 implementation optimized for
+/ AMD64.  It has been lifted intact, except for minor interface
+/ changes to get along with Solaris crypto common code (the parameter
+/ order and the key struct element order are both different).
+/ This function works for both aligned and unaligned data ('in' and 'out').
+/ The key and key elements must be aligned.
+/
+/ Register Usage
+/ rax		data[x]
+/ rbx		ARG(len)
+/ rcx		key->i (aka x)
+/ rdx		key->j (aka y)
+/ rsi		ARG(in)
+/ rdi		ARG(out)
+/ rbp		key->arr (aka data or d)
+/ rsp		stack
+/ r8		8 bytes of rc4 stream
+/ r9		temp
+/ r10-r15 	unused
+/
+
+#include <sys/asm_linkage.h>
+
+
+	ENTRY_NP(arcfour_crypt)
+	/* EXPORT DELETE START */
+					/ load parameters
+	push	%rbp
+	push	%rbx
+	mov	%rdi,		%rbp	/ rbp = ARG(key)
+					/ rsi = ARG(in)
+	mov	%rdx,		%rdi	/ rdi = ARG(out)
+	mov	%rcx,		%rbx	/ rbx = ARG(len)
+
+					/ load key indices and key
+	mov	2048(%rbp),	%rcx	/ rcx x = key->i
+	mov	2056(%rbp),	%rdx	/ rdx y = key->j
+					/ rbp d = key->arr
+	inc	%rcx			/ x++
+	and	$255,		%rcx	/ x &= 0xff
+	lea	-8(%rbx,%rsi),	%rbx	/ rbx = in+len-8
+	mov	%rbx,		%r9	/ tmp = in+len-8
+	mov	(%rbp,%rcx,8),	%rax	/ tx = d[x]
+	cmp	%rsi,		%rbx	/ cmp in with in+len-8
+	jl	.Lend			/ jump if (in+len-8 < in)
+
+.Lstart:
+	add	$8,		%rsi		/ increment in
+	add	$8,		%rdi		/ increment out
+
+	/ generate the next 8 bytes of the rc4 stream into %r8
+	mov	$8,		%r11		/ byte counter
+1:	add	%al,		%dl		/ y += tx
+	mov	(%rbp,%rdx,8),	%ebx		/ ty = d[y]
+	mov	%ebx,		(%rbp,%rcx,8)	/ d[x] = ty
+	add	%al,		%bl		/ val = ty + tx
+	mov	%eax,		(%rbp,%rdx,8)	/ d[y] = tx
+	inc	%cl				/ x++		(NEXT ROUND)
+	mov	(%rbp,%rcx,8),	%eax		/ tx = d[x]	(NEXT ROUND)
+	movb	(%rbp,%rbx,8),	%r8b		/ val = d[val]
+	dec	%r11b
+	ror	$8,		%r8		/ (ror does not change ZF)
+	jnz	1b
+
+	/ xor 8 bytes
+	xor	-8(%rsi),	%r8
+	cmp	%r9,		%rsi		/ cmp in+len-8 with in
+	mov	%r8,		-8(%rdi)
+	jle	.Lstart				/ jump if (in <= in+len-8)
+
+.Lend:
+	add	$8,		%r9		/ tmp = in+len
+
+	/ handle the last bytes, one by one
+1:	cmp	%rsi,		%r9		/ cmp in with in+len
+	jle	.Lfinished			/ jump if (in+len <= in)
+	add	%al,		%dl		/ y += tx
+	mov	(%rbp,%rdx,8),	%ebx		/ ty = d[y]
+	mov	%ebx,		(%rbp,%rcx,8)	/ d[x] = ty
+	add	%al,		%bl		/ val = ty + tx
+	mov	%eax,		(%rbp,%rdx,8)	/ d[y] = tx
+	inc	%cl				/ x++		(NEXT ROUND)
+	mov	(%rbp,%rcx,8),	%eax		/ tx = d[x]	(NEXT ROUND)
+	movb	(%rbp,%rbx,8),	%r8b		/ val = d[val]
+	xor	(%rsi),		%r8b		/ xor 1 byte
+	movb	%r8b,		(%rdi)
+	inc	%rsi				/ in++
+	inc	%rdi				/ out++
+	jmp	1b
+
+.Lfinished:					/ save key indices i & j
+	dec	%rcx				/ x--
+	movb	%dl,		2056(%rbp)	/ key->j = y
+	movb	%cl,		2048(%rbp)	/ key->i = x
+	pop	%rbx
+	pop	%rbp
+
+	/* EXPORT DELETE END */
+
+	ret
+	SET_SIZE(arcfour_crypt)
+
+#else
+	/* LINTED */
+	/* Nothing to be linted in this file--it's pure assembly source. */
+#endif /* !lint && !__lint */
--- /dev/null	Mon Mar 24 15:58:28 2008
+++ new/usr/src/common/crypto/arcfour/amd64/THIRDPARTYLICENSE	Mon Mar 24 15:58:27 2008
@@ -0,0 +1,36 @@
+Copyright (c) 2006, CRYPTOGAMS by <appro@openssl.org>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+      *	Redistributions of source code must retain copyright notices,
+	this list of conditions and the following disclaimer.
+
+      *	Redistributions in binary form must reproduce the above
+	copyright notice, this list of conditions and the following
+	disclaimer in the documentation and/or other materials
+	provided with the distribution.
+
+      *	Neither the name of the CRYPTOGAMS nor the names of its
+	copyright holder and contributors may be used to endorse or
+	promote products derived from this software without specific
+	prior written permission.
+
+ALTERNATIVELY, provided that this notice is retained in full, this
+product may be distributed under the terms of the GNU General Public
+License (GPL), in which case the provisions of the GPL apply INSTEAD OF
+those given above.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null	Mon Mar 24 15:58:29 2008
+++ new/usr/src/common/crypto/arcfour/amd64/THIRDPARTYLICENSE.descript	Mon Mar 24 15:58:29 2008
@@ -0,0 +1,1 @@
+PORTIONS OF ARCFOUR FUNCTIONALITY
--- /dev/null	Mon Mar 24 15:58:31 2008
+++ new/usr/src/common/crypto/arcfour/amd64/arcfour-x86_64.pl	Mon Mar 24 15:58:31 2008
@@ -0,0 +1,407 @@
+#!/usr/bin/env perl
+#
+# ====================================================================
+# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
+# project. The module is, however, dual licensed under OpenSSL and
+# CRYPTOGAMS licenses depending on where you obtain it. For further
+# details see http://www.openssl.org/~appro/cryptogams/.
+# ====================================================================
+#
+# 2.22x RC4 tune-up:-) It should be noted though that my hand [as in
+# "hand-coded assembler"] doesn't stand for the whole improvement
+# coefficient. It turned out that eliminating RC4_CHAR from config
+# line results in ~40% improvement (yes, even for C implementation).
+# Presumably it has everything to do with AMD cache architecture and
+# RAW or whatever penalties. Once again! The module *requires* config
+# line *without* RC4_CHAR! As for coding "secret," I bet on partial
+# register arithmetics. For example instead of 'inc %r8; and $255,%r8'
+# I simply 'inc %r8b'. Even though optimization manual discourages
+# to operate on partial registers, it turned out to be the best bet.
+# At least for AMD... How IA32E would perform remains to be seen...
+
+# As was shown by Marc Bevand reordering of couple of load operations
+# results in even higher performance gain of 3.3x:-) At least on
+# Opteron... For reference, 1x in this case is RC4_CHAR C-code
+# compiled with gcc 3.3.2, which performs at ~54MBps per 1GHz clock.
+# Latter means that if you want to *estimate* what to expect from
+# *your* Opteron, then multiply 54 by 3.3 and clock frequency in GHz.
+
+# Intel P4 EM64T core was found to run the AMD64 code really slow...
+# The only way to achieve comparable performance on P4 was to keep
+# RC4_CHAR. Kind of ironic, huh? As it's apparently impossible to
+# compose blended code, which would perform even within 30% marginal
+# on either AMD and Intel platforms, I implement both cases. See
+# rc4_skey.c for further details...
+
+# P4 EM64T core appears to be "allergic" to 64-bit inc/dec. Replacing 
+# those with add/sub results in 50% performance improvement of folded
+# loop...
+
+# As was shown by Zou Nanhai loop unrolling can improve Intel EM64T
+# performance by >30% [unlike P4 32-bit case that is]. But this is
+# provided that loads are reordered even more aggressively! Both code
+# pathes, AMD64 and EM64T, reorder loads in essentially same manner
+# as my IA-64 implementation. On Opteron this resulted in modest 5%
+# improvement [I had to test it], while final Intel P4 performance
+# achieves respectful 432MBps on 2.8GHz processor now. For reference.
+# If executed on Xeon, current RC4_CHAR code-path is 2.7x faster than
+# RC4_INT code-path. While if executed on Opteron, it's only 25%
+# slower than the RC4_INT one [meaning that if CPU µ-arch detection
+# is not implemented, then this final RC4_CHAR code-path should be
+# preferred, as it provides better *all-round* performance].
+
+# Intel Core2 was observed to perform poorly on both code paths:-( It
+# apparently suffers from some kind of partial register stall, which
+# occurs in 64-bit mode only [as virtually identical 32-bit loop was
+# observed to outperform 64-bit one by almost 50%]. Adding two movzb to
+# cloop1 boosts its performance by 80%! This loop appears to be optimal
+# fit for Core2 and therefore the code was modified to skip cloop8 on
+# this CPU.
+
+#
+# OpenSolaris OS modifications
+#
+# Sun elects to use this software under the BSD license.
+#
+# This source originates from OpenSSL file rc4-x86_64.pl at
+# ftp://ftp.openssl.org/snapshot/openssl-0.9.8-stable-SNAP-20080131.tar.gz
+# (presumably for future OpenSSL release 0.9.8h), with these changes:
+#
+# 1. Added some comments, "use strict", and declared all variables.
+#
+# 2. Added OpenSolaris ENTRY_NP/SET_SIZE macros from
+# /usr/include/sys/asm_linkage.h, .ident keywords, and lint(1B) guards.
+#
+# 3. Changed function name from RC4() to arcfour_crypt() and RC4_set_key()
+# to arcfour_key_init(), and changed the parameter order for both to that
+# used by OpenSolaris.
+#
+# 4. The current method of using cpuid feature bits 20 (NX) or 28 (HTT) from
+# function OPENSSL_ia32_cpuid() to distinguish Intel/AMD does not work for
+# some newer AMD64 processors, as these bits are set on both Intel EM64T
+# processors and newer AMD64 processors.  I replaced this with code to use CPUID
+# instruction subfunction EAX=0 to determine if we're running on "GenuineIntel"
+# or not. The result decides whether to use a
+#	* 1-byte key array (label .LRC4_CHAR, optimal on Intel EM64T) or a
+#	* 4-byte key array (Labels .Lloop1 and .Lloop8, optimal on AMD64).
+#
+# 5. Removed x86_64-xlate.pl script (not needed for as(1) or gas(1) assemblers).
+#
+# 6. Removed Lcloop8 code (slower than Lcloop1 on EM64T and not used on AMD64).
+#
+
+use strict;
+my ($code, $dat, $inp, $out, $len, $idx, $ido, $i, @XX, @TX, $YY, $TY);
+my $output = shift;
+open STDOUT,">$output";
+
+#
+# Parameters
+#
+
+# OpenSSL:
+# void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata,
+#	unsigned char *outdata);
+#$dat="%rdi";	    # arg1
+#$len="%rsi";	    # arg2
+#$inp="%rdx";	    # arg3
+#$out="%rcx";	    # arg4
+
+# OpenSolaris:
+# void arcfour_crypt(ARCFour_key *key, uchar_t *in, uchar_t *out, size_t len);
+$dat="%rdi";	    # arg1
+$inp="%rsi";	    # arg2
+$out="%rdx";	    # arg3
+$len="%rcx";	    # arg4
+
+#
+# Register variables
+#
+# $XX[0] is key->i (aka key->x), $XX[1] is a temporary.
+# $TX[0] and $TX[1] are temporaries.
+# $YY is key->j (aka key->y).
+# $TY is a temporary.
+#
+@XX=("%r8","%r10");
+@TX=("%r9","%r11");
+$YY="%r12";
+$TY="%r13";
+
+$code=<<___;
+#if !defined(lint) && !defined(__lint)
+
+	.ident	"@(#)arcfour-x86_64.pl	1.1	08/03/01 SMI"
+
+#include <sys/asm_linkage.h>
+
+
+ENTRY_NP(arcfour_crypt)
+	/* EXPORT DELETE START */
+
+	or	$len,$len # If (len == 0) return
+	jne	.Lentry
+	ret
+.Lentry:
+	push	%r12
+	push	%r13
+
+	/ Set $dat to beginning of array, key->arr[0]
+	add	\$8,$dat
+	/ Get key->j
+	movl	-8($dat),$XX[0]#d
+	/ Get key->i
+	movl	-4($dat),$YY#d
+
+	/
+	/ Use a 1-byte data array, on Intel P4 EM64T,
+	/ which is more efficient there,
+	/ or a 4-byte data array (for AMD AMD64).
+	/
+
+	/ If RC4_CHAR flag set (Intel EM64T), then use 1-byte array
+	cmpl	\$-1,256($dat)
+	je	.LRC4_CHAR
+	/ otherwise use 4-byte integer array (AMD64)
+	inc	$XX[0]#b
+	movl	($dat,$XX[0],4),$TX[0]#d
+	test	\$-8,$len
+	jz	.Lloop1
+	jmp	.Lloop8
+
+.align	16
+.Lloop8:
+	/
+	/ This code is for use with a 4-byte integer data array, which is
+	/ more efficient on AMD64 Athlon and Opteron-class processors.
+	/
+___
+for ($i=0;$i<8;$i++) {
+$code.=<<___;
+	add	$TX[0]#b,$YY#b
+	mov	$XX[0],$XX[1]
+	movl	($dat,$YY,4),$TY#d
+	ror	\$8,%rax			# ror is redundant when $i=0
+	inc	$XX[1]#b
+	movl	($dat,$XX[1],4),$TX[1]#d
+	cmp	$XX[1],$YY
+	movl	$TX[0]#d,($dat,$YY,4)
+	cmove	$TX[0],$TX[1]
+	movl	$TY#d,($dat,$XX[0],4)
+	add	$TX[0]#b,$TY#b
+	movb	($dat,$TY,4),%al
+___
+push(@TX,shift(@TX)); push(@XX,shift(@XX));	# "rotate" registers
+}
+$code.=<<___;
+	ror	\$8,%rax
+	sub	\$8,$len
+
+	xor	($inp),%rax
+	add	\$8,$inp
+	mov	%rax,($out)
+	add	\$8,$out
+
+	test	\$-8,$len
+	jnz	.Lloop8
+	cmp	\$0,$len
+	jne	.Lloop1
+___
+$code.=<<___;
+.Lexit:
+	/
+	/ Cleanup and exit code
+	/
+	/ --i to undo ++i done at entry
+	sub	\$1,$XX[0]#b
+	/ set key->i
+	movl	$XX[0]#d,-8($dat)
+	/ set key->j
+	movl	$YY#d,-4($dat)
+
+	pop	%r13
+	pop	%r12
+	ret
+.align	16
+.Lloop1:
+	add	$TX[0]#b,$YY#b
+	movl	($dat,$YY,4),$TY#d
+	movl	$TX[0]#d,($dat,$YY,4)
+	movl	$TY#d,($dat,$XX[0],4)
+	add	$TY#b,$TX[0]#b
+	inc	$XX[0]#b
+	movl	($dat,$TX[0],4),$TY#d
+	movl	($dat,$XX[0],4),$TX[0]#d
+	xorb	($inp),$TY#b
+	inc	$inp
+	movb	$TY#b,($out)
+	inc	$out
+	dec	$len
+	jnz	.Lloop1
+	jmp	.Lexit
+
+
+.align	16
+.LRC4_CHAR:
+	/
+	/ This code is for use with a 1-byte integer data array, which is
+	/ more efficient on Intel P4 EM64T-class processors.
+	/
+	add	\$1,$XX[0]#b
+	movzb	($dat,$XX[0]),$TX[0]#d
+	jmp	.Lcloop1
+
+.align	16
+.Lcloop1:
+	add	$TX[0]#b,$YY#b
+	movzb	($dat,$YY),$TY#d
+	movb	$TX[0]#b,($dat,$YY)
+	movb	$TY#b,($dat,$XX[0])
+	add	$TX[0]#b,$TY#b
+	add	\$1,$XX[0]#b
+	/ Intel Optimization (preload $TY and $XX[0]):
+	movzb	$TY#b,$TY#d
+	movzb	$XX[0]#b,$XX[0]#d
+	movzb	($dat,$TY),$TY#d
+	movzb	($dat,$XX[0]),$TX[0]#d
+	xorb	($inp),$TY#b
+	lea	1($inp),$inp
+	movb	$TY#b,($out)
+	lea	1($out),$out
+	sub	\$1,$len
+	jnz	.Lcloop1
+	jmp	.Lexit
+
+	/* EXPORT DELETE END */
+	ret
+SET_SIZE(arcfour_crypt)
+___
+
+
+#
+# Parameters
+#
+
+# OpenSSL:
+# void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
+#$dat="%rdi";	    # arg1
+#$len="%rsi";	    # arg2
+#$inp="%rdx";	    # arg3
+
+# OpenSolaris:
+# void arcfour_key_init(ARCFour_key *key, uchar_t *keyval, int keyvallen);
+$dat="%rdi";	    # arg1
+$inp="%rsi";	    # arg2
+$len="%rdx";	    # arg3
+
+# Temporaries
+$idx="%r8";
+$ido="%r9";
+
+$code.=<<___;
+	/ int arcfour_crypt_on_intel(void);
+.extern	arcfour_crypt_on_intel
+
+ENTRY_NP(arcfour_key_init)
+	/* EXPORT DELETE START */
+
+	/ Find out if we're running on Intel or something else (e.g., AMD64).
+	/ This sets %eax to 1 for Intel, otherwise 0.
+	push	%rdi		/ Save arg1
+	push	%rsi		/ Save arg2
+	push	%rdx		/ Save arg3
+	call	arcfour_crypt_on_intel
+	pop	%rdx		/ Restore arg3
+	pop	%rsi		/ Restore arg2
+	pop	%rdi		/ Restore arg1
+
+	/ Set $dat to beginning of array, key->arr[0]
+	lea	8($dat),$dat
+	lea	($inp,$len),$inp
+	neg	$len
+	mov	$len,%rcx
+	/ Zeroed below, as %eax contains a flag from arcfour_crypt_on_intel():
+	/xor	%eax,%eax
+	xor	$ido,$ido
+	xor	%r10,%r10
+	xor	%r11,%r11
+
+	/
+	/ Use a 1-byte data array, on Intel P4 EM64T,
+	/ which is more efficient there,
+	/ or a 4-byte data array (for AMD AMD64).
+	/
+	cmp	\$1,%eax	/ Test if Intel
+	mov	\$0,%eax	/ Zero eax without modifying flags
+	je	.Lc1stloop	/ If Intel then use a 1-byte array,
+	jmp	.Lw1stloop	/ otherwise use a 4-byte array.
+
+.align	16
+.Lw1stloop:
+	/ AMD64 (4-byte array)
+	mov	%eax,($dat,%rax,4)
+	add	\$1,%al
+	jnc	.Lw1stloop
+
+	xor	$ido,$ido
+	xor	$idx,$idx
+.align	16
+.Lw2ndloop:
+	mov	($dat,$ido,4),%r10d
+	add	($inp,$len,1),$idx#b
+	add	%r10b,$idx#b
+	add	\$1,$len
+	mov	($dat,$idx,4),%r11d
+	cmovz	%rcx,$len
+	mov	%r10d,($dat,$idx,4)
+	mov	%r11d,($dat,$ido,4)
+	add	\$1,$ido#b
+	jnc	.Lw2ndloop
+	jmp	.Lexit_key
+
+.align	16
+.Lc1stloop:
+	/ Intel EM64T (1-byte array)
+	mov	%al,($dat,%rax)
+	add	\$1,%al
+	jnc	.Lc1stloop
+
+	xor	$ido,$ido
+	xor	$idx,$idx
+.align	16
+.Lc2ndloop:
+	mov	($dat,$ido),%r10b
+	add	($inp,$len),$idx#b
+	add	%r10b,$idx#b
+	add	\$1,$len
+	mov	($dat,$idx),%r11b
+	jnz	.Lcnowrap
+	mov	%rcx,$len
+.Lcnowrap:
+	mov	%r10b,($dat,$idx)
+	mov	%r11b,($dat,$ido)
+	add	\$1,$ido#b
+	jnc	.Lc2ndloop
+	movl	\$-1,256($dat)
+
+.align	16
+.Lexit_key:
+	xor	%eax,%eax
+	mov	%eax,-8($dat)
+	mov	%eax,-4($dat)
+
+	/* EXPORT DELETE END */
+	ret
+SET_SIZE(arcfour_key_init)
+.asciz	"RC4 for x86_64, CRYPTOGAMS by <appro\@openssl.org>"
+
+#else
+	/* LINTED */
+	/* Nothing to be linted in this file--it's pure assembly source. */
+#endif /* !lint && !__lint */
+___
+
+$code =~ s/#([bwd])/$1/gm;
+
+print $code;
+
+close STDOUT;
--- old/usr/src/common/crypto/arcfour/arcfour.h	Mon Mar 24 15:58:33 2008
+++ new/usr/src/common/crypto/arcfour/arcfour.h	Mon Mar 24 15:58:33 2008
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -26,7 +26,7 @@
 #ifndef _ARCFOUR_H
 #define	_ARCFOUR_H
 
-#pragma ident	"@(#)arcfour.h	1.6	07/03/29 SMI"
+#pragma ident	"@(#)arcfour.h	1.7	08/03/01 SMI"
 
 #ifdef __cplusplus
 extern "C" {
@@ -50,6 +50,9 @@
 void arcfour_crypt_aligned(ARCFour_key *key, size_t len, uchar_t *in,
     uchar_t *out);
 #endif	/* sun4u */
+#ifdef	__amd64
+int arcfour_crypt_on_intel(void);
+#endif	/* _amd64 */
 
 #ifdef	__cplusplus
 }
--- old/usr/src/common/crypto/arcfour/arcfour_crypt.c	Mon Mar 24 15:58:37 2008
+++ new/usr/src/common/crypto/arcfour/arcfour_crypt.c	Mon Mar 24 15:58:37 2008
@@ -23,18 +23,21 @@
  * Use is subject to license terms.
  */
 
-#pragma ident	"@(#)arcfour_crypt.c	1.6	08/01/02 SMI"
+#pragma ident	"@(#)arcfour_crypt.c	1.7	08/03/01 SMI"
 
 #include "arcfour.h"
 
 #if defined(__amd64)
-/*
- * Use hand-tuned, processor-specific assembly version of arcfour_crypt()
- * for 64-bit x86:
- */
-#define	USE_PSR_VERSION_OF_ARCFOUR_CRYPT
-#endif /* __amd64 */
+#ifdef _KERNEL
+#include <sys/x86_archext.h>
+#include <sys/cpuvar.h>
 
+#else
+#include <sys/auxv.h>
+#endif	/* _KERNEL */
+#endif	/* __amd64 */
+
+#if !defined(__amd64)
 /* Initialize the key stream 'key' using the key value */
 void
 arcfour_key_init(ARCFour_key *key, uchar_t *keyval, int keyvallen)
@@ -45,12 +48,13 @@
 	uchar_t tmp;
 	int i, j;
 
+	/* Normalize key length to 256 */
 	for (i = j = 0; i < 256; i++, j++) {
 		if (j == keyvallen)
 			j = 0;
-
 		ext_keyval[i] = keyval[j];
 	}
+
 	for (i = 0; i < 256; i++)
 		key->arr[i] = (uchar_t)i;
 
@@ -68,7 +72,6 @@
 }
 
 
-#if !defined(USE_PSR_VERSION_OF_ARCFOUR_CRYPT)
 /*
  * Encipher 'in' using 'key'.
  * in and out can point to the same location
@@ -138,4 +141,21 @@
 
 /* EXPORT DELETE END */
 }
-#endif	/* !USE_PSR_VERSION_OF_ARCFOUR_CRYPT */
+
+#else
+
+/*
+ * Return 1 if executing on Intel, otherwise 0 (e.g., AMD64).
+ */
+int
+arcfour_crypt_on_intel(void)
+{
+#ifdef _KERNEL
+	return (cpuid_getvendor(CPU) == X86_VENDOR_Intel);
+#else
+	uint_t	ui;
+	(void) getisax(&ui, 1);
+	return ((ui & AV_386_AMD_MMX) == 0);
+#endif	/* _KERNEL */
+}
+#endif	/* !__amd64 */
--- old/usr/src/lib/pkcs11/pkcs11_softtoken/amd64/Makefile	Mon Mar 24 15:58:42 2008
+++ new/usr/src/lib/pkcs11/pkcs11_softtoken/amd64/Makefile	Mon Mar 24 15:58:41 2008
@@ -22,12 +22,12 @@
 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
-# ident	"@(#)Makefile	1.4	08/02/26 SMI"
+# ident	"@(#)Makefile	1.5	08/03/01 SMI"
 #
 # lib/pkcs11/pkcs11_softtoken/amd64/Makefile
 
 AES_PSR_OBJECTS =
-ARCFOUR_PSR_OBJECTS =  arcfour_crypt_amd64.o
+ARCFOUR_PSR_OBJECTS =  arcfour-x86_64.o
 DES_PSR_OBJECTS =
 RSA_PSR_OBJECTS =
 SHA1_PSR_OBJECTS =
@@ -43,6 +43,11 @@
 include ../Makefile.com
 include ../../../Makefile.lib.64
 
+#
+# Overrides
+#
+CLEANFILES	+= arcfour-x86_64.s
+
 install: all $(ROOTLIBS64) $(ROOTLINKS64)
 
 $(BIGNUM_PSR_PICS) := CFLAGS += $(C_BIGPICFLAGS) $(BIGNUM_CFG)
@@ -49,11 +54,13 @@
 
 LINTFLAGS64 += $(BIGNUM_CFG)
 
-pics/arcfour_crypt_amd64.o: $(ARCFOURDIR)/amd64/arcfour_crypt_amd64.s
-	$(COMPILE.s) -o $@ $(AS_BIGPICFLAGS) \
-		$(ARCFOURDIR)/amd64/arcfour_crypt_amd64.s
+pics/arcfour-x86_64.o: arcfour-x86_64.s
+	$(COMPILE.s) -o $@ $(AS_BIGPICFLAGS) ${@F:.o=.s}
 	$(POST_PROCESS_O)
 
+arcfour-x86_64.s: $(ARCFOURDIR)/amd64/arcfour-x86_64.pl
+	$(PERL) $? $@
+
 pics/%.o: $(BIGNUMDIR)/$(MACH64)/%.c
 	$(COMPILE.c) -o $@ $(C_BIGPICFLAGS) $(BIGNUM_CFG) $<
 	$(POST_PROCESS_O)
--- old/usr/src/uts/common/sys/crypto/common.h	Mon Mar 24 15:58:46 2008
+++ new/usr/src/uts/common/sys/crypto/common.h	Mon Mar 24 15:58:46 2008
@@ -26,7 +26,7 @@
 #ifndef _SYS_CRYPTO_COMMON_H
 #define	_SYS_CRYPTO_COMMON_H
 
-#pragma ident	"@(#)common.h	1.26	08/01/04 SMI"
+#pragma ident	"@(#)common.h	1.27	08/03/01 SMI"
 
 /*
  * Header file for the common data structures of the cryptographic framework
@@ -187,15 +187,14 @@
 #define	SUN_CKM_ECDSA			"CKM_ECDSA"
 
 /* Shared operation context format for CKM_RC4 */
+typedef struct {
 #if defined(__amd64)
-typedef uint64_t arcfour_key_int_t;
+	uint32_t i, j;
+	uint32_t arr[256];
 #else
-typedef uchar_t arcfour_key_int_t;
+	uchar_t arr[256];
+	uchar_t i, j;
 #endif /* __amd64 */
-
-typedef struct {
-	arcfour_key_int_t arr[256];
-	arcfour_key_int_t i, j;
 	uint64_t pad;		/* For 64-bit alignment */
 } arcfour_state_t;
 
--- old/usr/src/uts/intel/arcfour/Makefile	Mon Mar 24 15:58:50 2008
+++ new/usr/src/uts/intel/arcfour/Makefile	Mon Mar 24 15:58:50 2008
@@ -22,7 +22,7 @@
 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
-# ident	"@(#)Makefile	1.7	08/01/02 SMI"
+# ident	"@(#)Makefile	1.8	08/03/01 SMI"
 #
 #	This makefile drives the production of the ARCFOUR KEF provider.
 #
@@ -41,7 +41,7 @@
 MODULE		= arcfour
 LINTS		= $(ARCFOURPROV_OBJS:%.o=$(LINTS_DIR)/%.ln)
 ARCFOURPROV_OBJS_32 =
-ARCFOURPROV_OBJS_64 = arcfour_crypt_amd64.o
+ARCFOURPROV_OBJS_64 = arcfour-x86_64.o
 ARCFOURPROV_OBJS += $(ARCFOURPROV_OBJS_$(CLASS))
 OBJECTS		= $(ARCFOURPROV_OBJS:%=$(OBJS_DIR)/%)
 ROOTMODULE	= $(ROOT_CRYPTO_DIR)/$(MODULE)
@@ -65,6 +65,7 @@
 # Overrides
 #
 CPPFLAGS	+= -I$(COM_DIR)
+CLEANFILES	+= arcfour-x86_64.s
 
 #
 # For now, disable these lint checks; maintainers should endeavor
@@ -99,10 +100,12 @@
 #
 include $(UTSBASE)/intel/Makefile.targ
 
-$(OBJS_DIR)/arcfour_crypt_amd64.o: $(COM_DIR)/amd64/arcfour_crypt_amd64.s
-	$(COMPILE.s) -o $@ $(COM_DIR)/amd64/arcfour_crypt_amd64.s
+$(OBJS_DIR)/arcfour-x86_64.o: arcfour-x86_64.s
+	$(COMPILE.s) -o $@ ${@F:.o=.s}
 	$(POST_PROCESS_O)
 
-$(OBJS_DIR)/arcfour_crypt_amd64.ln: $(COM_DIR)/amd64/arcfour_crypt_amd64.s
-	@($(LHEAD) $(LINT.c) $(COM_DIR)/amd64/arcfour_crypt_amd64.s $(LTAIL))
+$(OBJS_DIR)/arcfour-x86_64.ln: arcfour-x86_64.s
+	@($(LHEAD) $(LINT.s) ${@F:.ln=.s} $(LTAIL))
 
+arcfour-x86_64.s: $(COM_DIR)/amd64/arcfour-x86_64.pl
+	$(PERL) $? $@
