/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (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
 * or http://www.opensolaris.org/os/licensing.
 * 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 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Unified version for both position independent and non position independent
 * for both v8plus and v9
 * compile with:
 *
 * cc -c -xarch=v8plus des_crypt_asm.s     or
 * cc -c -arch=v9 des_crypt_asm.s
 * for kernel use (no -KPIC)
 *
 * and with
 *
 * cc -c -xarch=v8plus -KPIC -DPIC des_crypt_asm.s     or
 * cc -c -arch=v9 -KPIC -DPIC des_crypt_asm.s
 * for  .so  use
 *
 * The tables were generated by a C program, compiled into the C version 
 * of this function, from which a .s was generated by the C compiler and
 * that .s was used as a starting point for this one, in particular for
 * the data definitions. It is important, though that the tables and
 * the code both remain in the text section and in this order, otherwise,
 * at least on UltraSparc-II processors, collisions in the E-cache are
 * highly probable between the code and the data it is using which can
 * result in up to 40% performance loss
 *
 * For a description of the DES algithm, see NIST publication FIPS PUB 46-3
 *
 * In this implementation, the 16 rounds of DES are carried out by unrolling
 * a loop that computes two rounds. For those 2 rounds, the two parts of
 * the intermediate variable (L and R in the FIPS pub) are kept in their
 * extended forms (i.e. in the one after applying the transformation E),
 * with the appropriate bits repeated so that bits needed for the S-box 
 * lookups are in consecutive positions. So the bits of the L (or R)
 * variable appear in the following order (X represents a bit that is not
 * from L (R), these bits are always 0):
 * 32  1  2  3  4  5  X  X   X  X  X  X  X  X  4  5
 *  6  7  8  9  8  9 10 11  12 13 12 13 14 15 16 17
 * 16 17 18 19 20 21  X  X   X  X  X 20 21 22 23 24
 * 25 24 25 26 27 28 29 28  29 30 31 32  1  X  X  X
 * This arrangement makes it possible that 3 of the 8 S-box indices
 * can be extracted by a single instruction: srlx by 55 for the S1 index,
 * srl by 23 for the S5 index and and by 0x1f80 for the S8 index. The rest
 * of the indices requires two operations, a shift and an and.
 * The tables for the S-boxes are computed in such a way that when or-ed
 * together, they give the result of the S-box, P and E computations.
 * Also, the key schedule bits are computed to follow this bit-scheme.
 * The initial permutation tables are also computed to produce this
 * bit distribution and the final permutation works from these, too.
 *
 * The end of each round is overlapped with the beginning of the next
 * one since after the first 6 S-box lookups all the bits necessary
 * for one S-box lookup in the next round can be computed (by xor-ing
 * the next key schedule item to the partially computed next R).
 */

#if defined(lint) || defined(__lint)
	/* LINTED */
	/* Nothing to be linted in this file, its pure assembly source */
#else	/* lint || __lint */ 

	.register	%g2,#scratch
	.register	%g3,#scratch

	.file	"encrypt_asm.S"

	.section	".text",#alloc
	.align	32

!
! CONSTANT POOL
!

des_sbox_table:
	.word	5121
	.word	1073872896
	.word	0
	.word	0
	.word	1
	.word	1073741824
	.word	5121
	.word	1073872928
	.word	5121
	.word	1073741856
	.word	1
	.word	1073872928
	.word	0
	.word	32
	.word	1
	.word	1073741824
	.word	0
	.word	131072
	.word	5121
	.word	1073872896
	.word	5121
	.word	1073872928
	.word	0
	.word	131072
	.word	5120
	.word	131104
	.word	5121
	.word	1073741856
	.word	5120
	.word	0
	.word	0
	.word	32
	.word	0
	.word	131104
	.word	5120
	.word	131072
	.word	5120
	.word	131072
	.word	1
	.word	1073872896
	.word	1
	.word	1073872896
	.word	5121
	.word	1073741824
	.word	5121
	.word	1073741824
	.word	5120
	.word	131104
	.word	1
	.word	1073741856
	.word	5120
	.word	32
	.word	5120
	.word	32
	.word	1
	.word	1073741856
	.word	0
	.word	0
	.word	0
	.word	131104
	.word	1
	.word	1073872928
	.word	5120
	.word	0
	.word	1
	.word	1073741824
	.word	5121
	.word	1073872928
	.word	0
	.word	32
	.word	5121
	.word	1073741824
	.word	5121
	.word	1073872896
	.word	5120
	.word	0
	.word	5120
	.word	0
	.word	0
	.word	131072
	.word	5121
	.word	1073741856
	.word	1
	.word	1073741824
	.word	1
	.word	1073872896
	.word	5120
	.word	32
	.word	0
	.word	131072
	.word	0
	.word	32
	.word	5120
	.word	131104
	.word	1
	.word	1073872928
	.word	5121
	.word	1073872928
	.word	1
	.word	1073741856
	.word	5121
	.word	1073741824
	.word	5120
	.word	131104
	.word	5120
	.word	32
	.word	0
	.word	131104
	.word	1
	.word	1073872928
	.word	5121
	.word	1073872896
	.word	0
	.word	131104
	.word	5120
	.word	131072
	.word	5120
	.word	131072
	.word	0
	.word	0
	.word	1
	.word	1073741856
	.word	1
	.word	1073872896
	.word	0
	.word	0
	.word	5121
	.word	1073741856
	.word	536870992
	.word	536872192
	.word	536870912
	.word	536870912
	.word	0
	.word	536870912
	.word	80
	.word	536872192
	.word	80
	.word	0
	.word	0
	.word	1280
	.word	536870992
	.word	1280
	.word	536870912
	.word	536872192
	.word	536870912
	.word	1280
	.word	536870992
	.word	536872192
	.word	536870992
	.word	536870912
	.word	536870912
	.word	0
	.word	536870912
	.word	536870912
	.word	80
	.word	0
	.word	0
	.word	1280
	.word	536870992
	.word	1280
	.word	80
	.word	536870912
	.word	80
	.word	1280
	.word	536870912
	.word	536872192
	.word	0
	.word	0
	.word	536870912
	.word	0
	.word	0
	.word	536870912
	.word	80
	.word	536872192
	.word	536870992
	.word	0
	.word	80
	.word	1280
	.word	536870912
	.word	1280
	.word	0
	.word	0
	.word	80
	.word	536870912
	.word	0
	.word	536872192
	.word	536870992
	.word	536870912
	.word	536870992
	.word	0
	.word	0
	.word	536872192
	.word	0
	.word	0
	.word	80
	.word	536872192
	.word	536870992
	.word	1280
	.word	80
	.word	0
	.word	536870912
	.word	536872192
	.word	536870992
	.word	0
	.word	536870992
	.word	536870912
	.word	0
	.word	536870912
	.word	536870992
	.word	0
	.word	536870912
	.word	536870912
	.word	0
	.word	1280
	.word	536870992
	.word	536872192
	.word	80
	.word	536872192
	.word	0
	.word	1280
	.word	0
	.word	536870912
	.word	536870912
	.word	0
	.word	0
	.word	536872192
	.word	536870992
	.word	536870912
	.word	80
	.word	0
	.word	536870912
	.word	1280
	.word	80
	.word	1280
	.word	536870912
	.word	536872192
	.word	536870912
	.word	1280
	.word	80
	.word	1280
	.word	80
	.word	536870912
	.word	0
	.word	0
	.word	536870912
	.word	536870912
	.word	0
	.word	536872192
	.word	536870912
	.word	0
	.word	536870992
	.word	1280
	.word	536870992
	.word	536872192
	.word	80
	.word	536870912
	.word	0
	.word	81984
	.word	32770
	.word	-2147401728
	.word	0
	.word	0
	.word	32770
	.word	-2147483584
	.word	32768
	.word	81920
	.word	0
	.word	0
	.word	2
	.word	-2147401664
	.word	32768
	.word	81920
	.word	2
	.word	-2147483584
	.word	32768
	.word	64
	.word	32768
	.word	64
	.word	2
	.word	-2147483648
	.word	32770
	.word	-2147401664
	.word	2
	.word	-2147483584
	.word	32770
	.word	-2147483648
	.word	0
	.word	81984
	.word	32768
	.word	0
	.word	0
	.word	64
	.word	32770
	.word	-2147401728
	.word	0
	.word	81920
	.word	2
	.word	-2147401728
	.word	32770
	.word	-2147483648
	.word	32770
	.word	-2147483584
	.word	2
	.word	-2147401664
	.word	32768
	.word	81984
	.word	2
	.word	-2147401728
	.word	2
	.word	-2147483648
	.word	32768
	.word	81984
	.word	0
	.word	64
	.word	32770
	.word	-2147401664
	.word	0
	.word	81920
	.word	32768
	.word	0
	.word	32770
	.word	-2147401728
	.word	32768
	.word	0
	.word	2
	.word	-2147483584
	.word	0
	.word	81984
	.word	2
	.word	-2147483648
	.word	32770
	.word	-2147401728
	.word	32768
	.word	81920
	.word	0
	.word	0
	.word	0
	.word	81920
	.word	2
	.word	-2147483584
	.word	32770
	.word	-2147401664
	.word	32768
	.word	81920
	.word	32768
	.word	64
	.word	0
	.word	81920
	.word	0
	.word	0
	.word	32770
	.word	-2147483584
	.word	32768
	.word	81984
	.word	2
	.word	-2147483648
	.word	32768
	.word	0
	.word	32770
	.word	-2147401664
	.word	0
	.word	64
	.word	2
	.word	-2147401664
	.word	2
	.word	-2147401728
	.word	32768
	.word	64
	.word	32770
	.word	-2147483648
	.word	32768
	.word	81984
	.word	0
	.word	81984
	.word	32770
	.word	-2147483648
	.word	2
	.word	-2147401664
	.word	0
	.word	64
	.word	32770
	.word	-2147483584
	.word	2
	.word	-2147401728
	.word	1073742336
	.word	135266312
	.word	1073741824
	.word	135270408
	.word	1073741824
	.word	135270408
	.word	0
	.word	4096
	.word	512
	.word	135270400
	.word	1073742336
	.word	4104
	.word	1073742336
	.word	8
	.word	1073741824
	.word	135266312
	.word	0
	.word	0
	.word	512
	.word	135266304
	.word	512
	.word	135266304
	.word	1073742336
	.word	135270408
	.word	1073741824
	.word	4104
	.word	0
	.word	0
	.word	512
	.word	4096
	.word	1073742336
	.word	8
	.word	1073741824
	.word	8
	.word	0
	.word	135266304
	.word	512
	.word	0
	.word	1073742336
	.word	135266312
	.word	0
	.word	4096
	.word	512
	.word	0
	.word	1073741824
	.word	135266312
	.word	0
	.word	135270400
	.word	1073742336
	.word	4104
	.word	1073741824
	.word	8
	.word	0
	.word	135270400
	.word	512
	.word	4096
	.word	0
	.word	135266304
	.word	512
	.word	135270400
	.word	1073742336
	.word	135270408
	.word	1073741824
	.word	4104
	.word	512
	.word	4096
	.word	1073742336
	.word	8
	.word	512
	.word	135266304
	.word	1073742336
	.word	135270408
	.word	1073741824
	.word	4104
	.word	0
	.word	0
	.word	0
	.word	0
	.word	512
	.word	135266304
	.word	0
	.word	135270400
	.word	512
	.word	4096
	.word	1073742336
	.word	4104
	.word	1073741824
	.word	8
	.word	1073742336
	.word	135266312
	.word	1073741824
	.word	135270408
	.word	1073741824
	.word	135270408
	.word	0
	.word	4096
	.word	1073742336
	.word	135270408
	.word	1073741824
	.word	4104
	.word	1073741824
	.word	8
	.word	0
	.word	135266304
	.word	1073742336
	.word	8
	.word	1073741824
	.word	135266312
	.word	512
	.word	135270400
	.word	1073742336
	.word	4104
	.word	1073741824
	.word	135266312
	.word	0
	.word	135270400
	.word	512
	.word	0
	.word	1073742336
	.word	135266312
	.word	0
	.word	4096
	.word	512
	.word	0
	.word	0
	.word	135266304
	.word	512
	.word	135270400
	.word	0
	.word	40960
	.word	10248
	.word	40960
	.word	10248
	.word	0
	.word	268445696
	.word	40960
	.word	8
	.word	0
	.word	0
	.word	40960
	.word	268435456
	.word	0
	.word	10248
	.word	0
	.word	268435464
	.word	40960
	.word	8
	.word	0
	.word	10240
	.word	40960
	.word	268435464
	.word	40960
	.word	268445696
	.word	40960
	.word	268445704
	.word	0
	.word	8
	.word	40960
	.word	268435456
	.word	0
	.word	10240
	.word	0
	.word	268435464
	.word	0
	.word	268435464
	.word	0
	.word	0
	.word	0
	.word	268435456
	.word	40960
	.word	268445704
	.word	40960
	.word	268445704
	.word	40960
	.word	10240
	.word	40960
	.word	268445704
	.word	0
	.word	268435456
	.word	40960
	.word	0
	.word	0
	.word	268445696
	.word	0
	.word	10248
	.word	40960
	.word	10240
	.word	0
	.word	268445696
	.word	0
	.word	8
	.word	40960
	.word	8
	.word	0
	.word	268445696
	.word	40960
	.word	0
	.word	40960
	.word	10240
	.word	0
	.word	268435456
	.word	0
	.word	10248
	.word	0
	.word	268445696
	.word	40960
	.word	268435464
	.word	40960
	.word	10240
	.word	40960
	.word	268435456
	.word	0
	.word	268445704
	.word	0
	.word	10248
	.word	40960
	.word	268435464
	.word	40960
	.word	0
	.word	40960
	.word	10240
	.word	0
	.word	268445704
	.word	0
	.word	268445704
	.word	40960
	.word	8
	.word	40960
	.word	268445696
	.word	0
	.word	268445704
	.word	40960
	.word	10248
	.word	0
	.word	0
	.word	0
	.word	268435464
	.word	0
	.word	268445696
	.word	0
	.word	8
	.word	40960
	.word	10240
	.word	40960
	.word	268435456
	.word	40960
	.word	8
	.word	0
	.word	0
	.word	0
	.word	268435464
	.word	0
	.word	10248
	.word	40960
	.word	268435456
	.word	40960
	.word	134348800
	.word	640
	.word	134349056
	.word	0
	.word	0
	.word	268435456
	.word	134349056
	.word	268436096
	.word	134349056
	.word	0
	.word	0
	.word	640
	.word	134349056
	.word	268436096
	.word	256
	.word	0
	.word	134348800
	.word	268435456
	.word	256
	.word	268436096
	.word	256
	.word	0
	.word	134348800
	.word	640
	.word	256
	.word	640
	.word	134348800
	.word	268435456
	.word	134348800
	.word	0
	.word	0
	.word	268436096
	.word	0
	.word	0
	.word	256
	.word	640
	.word	134348800
	.word	268436096
	.word	0
	.word	268435456
	.word	256
	.word	268435456
	.word	134348800
	.word	268436096
	.word	0
	.word	640
	.word	134349056
	.word	640
	.word	134349056
	.word	640
	.word	0
	.word	0
	.word	256
	.word	268436096
	.word	134349056
	.word	268435456
	.word	0
	.word	268436096
	.word	256
	.word	268435456
	.word	134349056
	.word	268435456
	.word	134348800
	.word	0
	.word	134348800
	.word	268435456
	.word	0
	.word	640
	.word	134349056
	.word	640
	.word	256
	.word	268435456
	.word	134349056
	.word	268436096
	.word	256
	.word	0
	.word	0
	.word	268436096
	.word	134348800
	.word	640
	.word	256
	.word	0
	.word	134348800
	.word	268435456
	.word	134348800
	.word	0
	.word	0
	.word	268436096
	.word	134348800
	.word	640
	.word	134349056
	.word	268436096
	.word	256
	.word	268435456
	.word	134349056
	.word	0
	.word	256
	.word	268436096
	.word	134349056
	.word	268435456
	.word	0
	.word	0
	.word	134349056
	.word	640
	.word	0
	.word	640
	.word	0
	.word	268435456
	.word	134349056
	.word	0
	.word	256
	.word	268436096
	.word	0
	.word	268435456
	.word	256
	.word	640
	.word	134348800
	.word	268436096
	.word	0
	.word	0
	.word	134349056
	.word	268435456
	.word	134348800
	.word	0
	.word	256
	.word	640
	.word	134348800
	.word	268436096
	.word	160
	.word	0
	.word	-2147467104
	.word	16
	.word	-2147467264
	.word	262160
	.word	0
	.word	0
	.word	0
	.word	262144
	.word	-2147467264
	.word	262160
	.word	-2147483488
	.word	262160
	.word	16544
	.word	262144
	.word	-2147467104
	.word	262160
	.word	160
	.word	0
	.word	0
	.word	0
	.word	-2147467264
	.word	16
	.word	-2147483648
	.word	16
	.word	16384
	.word	0
	.word	-2147467104
	.word	16
	.word	-2147483648
	.word	262160
	.word	16384
	.word	262144
	.word	-2147483488
	.word	262160
	.word	-2147483488
	.word	16
	.word	16384
	.word	262144
	.word	-2147467264
	.word	16
	.word	16544
	.word	0
	.word	16544
	.word	262144
	.word	-2147483488
	.word	16
	.word	16544
	.word	0
	.word	0
	.word	262144
	.word	-2147483648
	.word	262160
	.word	-2147467104
	.word	262160
	.word	160
	.word	262144
	.word	-2147483648
	.word	16
	.word	16384
	.word	0
	.word	160
	.word	262144
	.word	16384
	.word	0
	.word	160
	.word	262144
	.word	160
	.word	0
	.word	-2147467264
	.word	262160
	.word	-2147467264
	.word	262160
	.word	-2147467104
	.word	16
	.word	-2147467104
	.word	16
	.word	-2147483648
	.word	16
	.word	-2147483488
	.word	16
	.word	16384
	.word	0
	.word	16384
	.word	262144
	.word	160
	.word	0
	.word	16544
	.word	262144
	.word	-2147483648
	.word	262160
	.word	-2147483488
	.word	262160
	.word	16544
	.word	262144
	.word	-2147483648
	.word	262160
	.word	-2147467264
	.word	16
	.word	-2147467104
	.word	262160
	.word	16544
	.word	0
	.word	160
	.word	262144
	.word	0
	.word	0
	.word	-2147483648
	.word	16
	.word	-2147467104
	.word	262160
	.word	0
	.word	0
	.word	-2147483488
	.word	262160
	.word	16544
	.word	0
	.word	0
	.word	262144
	.word	-2147467264
	.word	16
	.word	16384
	.word	262144
	.word	0
	.word	262144
	.word	-2147483488
	.word	16
	.word	67174400
	.word	67635200
	.word	0
	.word	67633152
	.word	4
	.word	0
	.word	67174404
	.word	67635200
	.word	67174400
	.word	0
	.word	67174400
	.word	67635200
	.word	0
	.word	2048
	.word	67174400
	.word	0
	.word	4
	.word	2048
	.word	67174404
	.word	0
	.word	67174404
	.word	67635200
	.word	4
	.word	67633152
	.word	67174404
	.word	67633152
	.word	4
	.word	67635200
	.word	0
	.word	67633152
	.word	0
	.word	2048
	.word	67174404
	.word	0
	.word	67174400
	.word	2048
	.word	67174400
	.word	67633152
	.word	0
	.word	67635200
	.word	4
	.word	67633152
	.word	4
	.word	2048
	.word	67174404
	.word	2048
	.word	67174404
	.word	67633152
	.word	0
	.word	67635200
	.word	0
	.word	0
	.word	0
	.word	0
	.word	67174404
	.word	2048
	.word	67174400
	.word	2048
	.word	67174400
	.word	67633152
	.word	4
	.word	67635200
	.word	4
	.word	0
	.word	4
	.word	67635200
	.word	4
	.word	0
	.word	67174404
	.word	67633152
	.word	0
	.word	67633152
	.word	0
	.word	2048
	.word	67174404
	.word	2048
	.word	0
	.word	67633152
	.word	4
	.word	67635200
	.word	67174400
	.word	67633152
	.word	0
	.word	2048
	.word	67174400
	.word	2048
	.word	67174404
	.word	0
	.word	67174404
	.word	2048
	.word	67174400
	.word	0
	.word	4
	.word	0
	.word	67174400
	.word	67635200
	.word	0
	.word	0
	.word	67174404
	.word	67635200
	.word	4
	.word	2048
	.word	67174400
	.word	2048
	.word	67174404
	.word	0
	.word	67174400
	.word	67633152
	.word	67174400
	.word	67635200
	.word	0
	.word	0
	.word	67174404
	.word	67635200
	.word	4
	.word	67633152
	.word	4
	.word	67633152
	.word	0
	.word	67635200
	.word	0
	.word	67635200
	.word	4
	.word	2048
	.word	67174400
	.word	0
	.word	67174404
	.word	67633152
	.type	des_sbox_table,#object
	.size	des_sbox_table,4096

	.align 32
!
! CONSTANT POOL
!
	.section	".text",#alloc,#execinstr

des_ip_table:
	.word	0
	.word	0
	.word	0
	.word	1024
	.word	8388608
	.word	640
	.word	8388608
	.word	1664
	.word	0
	.word	4194304
	.word	0
	.word	4195328
	.word	8388608
	.word	4194944
	.word	8388608
	.word	4195968
	.word	0
	.word	2621440
	.word	0
	.word	2622464
	.word	8388608
	.word	2622080
	.word	8388608
	.word	2623104
	.word	0
	.word	6815744
	.word	0
	.word	6816768
	.word	8388608
	.word	6816384
	.word	8388608
	.word	6817408
	.word	4
	.word	0
	.word	4
	.word	1024
	.word	8388612
	.word	640
	.word	8388612
	.word	1664
	.word	4
	.word	4194304
	.word	4
	.word	4195328
	.word	8388612
	.word	4194944
	.word	8388612
	.word	4195968
	.word	4
	.word	2621440
	.word	4
	.word	2622464
	.word	8388612
	.word	2622080
	.word	8388612
	.word	2623104
	.word	4
	.word	6815744
	.word	4
	.word	6816768
	.word	8388612
	.word	6816384
	.word	8388612
	.word	6817408
	.word	2
	.word	-2147483648
	.word	2
	.word	-2147482624
	.word	8388610
	.word	-2147483008
	.word	8388610
	.word	-2147481984
	.word	2
	.word	-2143289344
	.word	2
	.word	-2143288320
	.word	8388610
	.word	-2143288704
	.word	8388610
	.word	-2143287680
	.word	2
	.word	-2144862208
	.word	2
	.word	-2144861184
	.word	8388610
	.word	-2144861568
	.word	8388610
	.word	-2144860544
	.word	2
	.word	-2140667904
	.word	2
	.word	-2140666880
	.word	8388610
	.word	-2140667264
	.word	8388610
	.word	-2140666240
	.word	6
	.word	-2147483648
	.word	6
	.word	-2147482624
	.word	8388614
	.word	-2147483008
	.word	8388614
	.word	-2147481984
	.word	6
	.word	-2143289344
	.word	6
	.word	-2143288320
	.word	8388614
	.word	-2143288704
	.word	8388614
	.word	-2143287680
	.word	6
	.word	-2144862208
	.word	6
	.word	-2144861184
	.word	8388614
	.word	-2144861568
	.word	8388614
	.word	-2144860544
	.word	6
	.word	-2140667904
	.word	6
	.word	-2140666880
	.word	8388614
	.word	-2140667264
	.word	8388614
	.word	-2140666240
	.word	16384
	.word	0
	.word	16384
	.word	1024
	.word	8404992
	.word	640
	.word	8404992
	.word	1664
	.word	16384
	.word	4194304
	.word	16384
	.word	4195328
	.word	8404992
	.word	4194944
	.word	8404992
	.word	4195968
	.word	16384
	.word	2621440
	.word	16384
	.word	2622464
	.word	8404992
	.word	2622080
	.word	8404992
	.word	2623104
	.word	16384
	.word	6815744
	.word	16384
	.word	6816768
	.word	8404992
	.word	6816384
	.word	8404992
	.word	6817408
	.word	16388
	.word	0
	.word	16388
	.word	1024
	.word	8404996
	.word	640
	.word	8404996
	.word	1664
	.word	16388
	.word	4194304
	.word	16388
	.word	4195328
	.word	8404996
	.word	4194944
	.word	8404996
	.word	4195968
	.word	16388
	.word	2621440
	.word	16388
	.word	2622464
	.word	8404996
	.word	2622080
	.word	8404996
	.word	2623104
	.word	16388
	.word	6815744
	.word	16388
	.word	6816768
	.word	8404996
	.word	6816384
	.word	8404996
	.word	6817408
	.word	16386
	.word	-2147483648
	.word	16386
	.word	-2147482624
	.word	8404994
	.word	-2147483008
	.word	8404994
	.word	-2147481984
	.word	16386
	.word	-2143289344
	.word	16386
	.word	-2143288320
	.word	8404994
	.word	-2143288704
	.word	8404994
	.word	-2143287680
	.word	16386
	.word	-2144862208
	.word	16386
	.word	-2144861184
	.word	8404994
	.word	-2144861568
	.word	8404994
	.word	-2144860544
	.word	16386
	.word	-2140667904
	.word	16386
	.word	-2140666880
	.word	8404994
	.word	-2140667264
	.word	8404994
	.word	-2140666240
	.word	16390
	.word	-2147483648
	.word	16390
	.word	-2147482624
	.word	8404998
	.word	-2147483008
	.word	8404998
	.word	-2147481984
	.word	16390
	.word	-2143289344
	.word	16390
	.word	-2143288320
	.word	8404998
	.word	-2143288704
	.word	8404998
	.word	-2143287680
	.word	16390
	.word	-2144862208
	.word	16390
	.word	-2144861184
	.word	8404998
	.word	-2144861568
	.word	8404998
	.word	-2144860544
	.word	16390
	.word	-2140667904
	.word	16390
	.word	-2140666880
	.word	8404998
	.word	-2140667264
	.word	8404998
	.word	-2140666240
	.word	10240
	.word	0
	.word	10240
	.word	1024
	.word	8398848
	.word	640
	.word	8398848
	.word	1664
	.word	10240
	.word	4194304
	.word	10240
	.word	4195328
	.word	8398848
	.word	4194944
	.word	8398848
	.word	4195968
	.word	10240
	.word	2621440
	.word	10240
	.word	2622464
	.word	8398848
	.word	2622080
	.word	8398848
	.word	2623104
	.word	10240
	.word	6815744
	.word	10240
	.word	6816768
	.word	8398848
	.word	6816384
	.word	8398848
	.word	6817408
	.word	10244
	.word	0
	.word	10244
	.word	1024
	.word	8398852
	.word	640
	.word	8398852
	.word	1664
	.word	10244
	.word	4194304
	.word	10244
	.word	4195328
	.word	8398852
	.word	4194944
	.word	8398852
	.word	4195968
	.word	10244
	.word	2621440
	.word	10244
	.word	2622464
	.word	8398852
	.word	2622080
	.word	8398852
	.word	2623104
	.word	10244
	.word	6815744
	.word	10244
	.word	6816768
	.word	8398852
	.word	6816384
	.word	8398852
	.word	6817408
	.word	10242
	.word	-2147483648
	.word	10242
	.word	-2147482624
	.word	8398850
	.word	-2147483008
	.word	8398850
	.word	-2147481984
	.word	10242
	.word	-2143289344
	.word	10242
	.word	-2143288320
	.word	8398850
	.word	-2143288704
	.word	8398850
	.word	-2143287680
	.word	10242
	.word	-2144862208
	.word	10242
	.word	-2144861184
	.word	8398850
	.word	-2144861568
	.word	8398850
	.word	-2144860544
	.word	10242
	.word	-2140667904
	.word	10242
	.word	-2140666880
	.word	8398850
	.word	-2140667264
	.word	8398850
	.word	-2140666240
	.word	10246
	.word	-2147483648
	.word	10246
	.word	-2147482624
	.word	8398854
	.word	-2147483008
	.word	8398854
	.word	-2147481984
	.word	10246
	.word	-2143289344
	.word	10246
	.word	-2143288320
	.word	8398854
	.word	-2143288704
	.word	8398854
	.word	-2143287680
	.word	10246
	.word	-2144862208
	.word	10246
	.word	-2144861184
	.word	8398854
	.word	-2144861568
	.word	8398854
	.word	-2144860544
	.word	10246
	.word	-2140667904
	.word	10246
	.word	-2140666880
	.word	8398854
	.word	-2140667264
	.word	8398854
	.word	-2140666240
	.word	26624
	.word	0
	.word	26624
	.word	1024
	.word	8415232
	.word	640
	.word	8415232
	.word	1664
	.word	26624
	.word	4194304
	.word	26624
	.word	4195328
	.word	8415232
	.word	4194944
	.word	8415232
	.word	4195968
	.word	26624
	.word	2621440
	.word	26624
	.word	2622464
	.word	8415232
	.word	2622080
	.word	8415232
	.word	2623104
	.word	26624
	.word	6815744
	.word	26624
	.word	6816768
	.word	8415232
	.word	6816384
	.word	8415232
	.word	6817408
	.word	26628
	.word	0
	.word	26628
	.word	1024
	.word	8415236
	.word	640
	.word	8415236
	.word	1664
	.word	26628
	.word	4194304
	.word	26628
	.word	4195328
	.word	8415236
	.word	4194944
	.word	8415236
	.word	4195968
	.word	26628
	.word	2621440
	.word	26628
	.word	2622464
	.word	8415236
	.word	2622080
	.word	8415236
	.word	2623104
	.word	26628
	.word	6815744
	.word	26628
	.word	6816768
	.word	8415236
	.word	6816384
	.word	8415236
	.word	6817408
	.word	26626
	.word	-2147483648
	.word	26626
	.word	-2147482624
	.word	8415234
	.word	-2147483008
	.word	8415234
	.word	-2147481984
	.word	26626
	.word	-2143289344
	.word	26626
	.word	-2143288320
	.word	8415234
	.word	-2143288704
	.word	8415234
	.word	-2143287680
	.word	26626
	.word	-2144862208
	.word	26626
	.word	-2144861184
	.word	8415234
	.word	-2144861568
	.word	8415234
	.word	-2144860544
	.word	26626
	.word	-2140667904
	.word	26626
	.word	-2140666880
	.word	8415234
	.word	-2140667264
	.word	8415234
	.word	-2140666240
	.word	26630
	.word	-2147483648
	.word	26630
	.word	-2147482624
	.word	8415238
	.word	-2147483008
	.word	8415238
	.word	-2147481984
	.word	26630
	.word	-2143289344
	.word	26630
	.word	-2143288320
	.word	8415238
	.word	-2143288704
	.word	8415238
	.word	-2143287680
	.word	26630
	.word	-2144862208
	.word	26630
	.word	-2144861184
	.word	8415238
	.word	-2144861568
	.word	8415238
	.word	-2144860544
	.word	26630
	.word	-2140667904
	.word	26630
	.word	-2140666880
	.word	8415238
	.word	-2140667264
	.word	8415238
	.word	-2140666240
	.word	0
	.word	0
	.word	0
	.word	20480
	.word	0
	.word	2048
	.word	0
	.word	22528
	.word	0
	.word	83886080
	.word	0
	.word	83906560
	.word	0
	.word	83888128
	.word	0
	.word	83908608
	.word	0
	.word	8388608
	.word	0
	.word	8409088
	.word	0
	.word	8390656
	.word	0
	.word	8411136
	.word	0
	.word	92274688
	.word	0
	.word	92295168
	.word	0
	.word	92276736
	.word	0
	.word	92297216
	.word	80
	.word	0
	.word	80
	.word	20480
	.word	80
	.word	2048
	.word	80
	.word	22528
	.word	80
	.word	83886080
	.word	80
	.word	83906560
	.word	80
	.word	83888128
	.word	80
	.word	83908608
	.word	80
	.word	8388608
	.word	80
	.word	8409088
	.word	80
	.word	8390656
	.word	80
	.word	8411136
	.word	80
	.word	92274688
	.word	80
	.word	92295168
	.word	80
	.word	92276736
	.word	80
	.word	92297216
	.word	8
	.word	0
	.word	8
	.word	20480
	.word	8
	.word	2048
	.word	8
	.word	22528
	.word	8
	.word	83886080
	.word	8
	.word	83906560
	.word	8
	.word	83888128
	.word	8
	.word	83908608
	.word	8
	.word	8388608
	.word	8
	.word	8409088
	.word	8
	.word	8390656
	.word	8
	.word	8411136
	.word	8
	.word	92274688
	.word	8
	.word	92295168
	.word	8
	.word	92276736
	.word	8
	.word	92297216
	.word	88
	.word	0
	.word	88
	.word	20480
	.word	88
	.word	2048
	.word	88
	.word	22528
	.word	88
	.word	83886080
	.word	88
	.word	83906560
	.word	88
	.word	83888128
	.word	88
	.word	83908608
	.word	88
	.word	8388608
	.word	88
	.word	8409088
	.word	88
	.word	8390656
	.word	88
	.word	8411136
	.word	88
	.word	92274688
	.word	88
	.word	92295168
	.word	88
	.word	92276736
	.word	88
	.word	92297216
	.word	327680
	.word	4
	.word	327680
	.word	20484
	.word	327680
	.word	2052
	.word	327680
	.word	22532
	.word	327680
	.word	83886084
	.word	327680
	.word	83906564
	.word	327680
	.word	83888132
	.word	327680
	.word	83908612
	.word	327680
	.word	8388612
	.word	327680
	.word	8409092
	.word	327680
	.word	8390660
	.word	327680
	.word	8411140
	.word	327680
	.word	92274692
	.word	327680
	.word	92295172
	.word	327680
	.word	92276740
	.word	327680
	.word	92297220
	.word	327760
	.word	4
	.word	327760
	.word	20484
	.word	327760
	.word	2052
	.word	327760
	.word	22532
	.word	327760
	.word	83886084
	.word	327760
	.word	83906564
	.word	327760
	.word	83888132
	.word	327760
	.word	83908612
	.word	327760
	.word	8388612
	.word	327760
	.word	8409092
	.word	327760
	.word	8390660
	.word	327760
	.word	8411140
	.word	327760
	.word	92274692
	.word	327760
	.word	92295172
	.word	327760
	.word	92276740
	.word	327760
	.word	92297220
	.word	327688
	.word	4
	.word	327688
	.word	20484
	.word	327688
	.word	2052
	.word	327688
	.word	22532
	.word	327688
	.word	83886084
	.word	327688
	.word	83906564
	.word	327688
	.word	83888132
	.word	327688
	.word	83908612
	.word	327688
	.word	8388612
	.word	327688
	.word	8409092
	.word	327688
	.word	8390660
	.word	327688
	.word	8411140
	.word	327688
	.word	92274692
	.word	327688
	.word	92295172
	.word	327688
	.word	92276740
	.word	327688
	.word	92297220
	.word	327768
	.word	4
	.word	327768
	.word	20484
	.word	327768
	.word	2052
	.word	327768
	.word	22532
	.word	327768
	.word	83886084
	.word	327768
	.word	83906564
	.word	327768
	.word	83888132
	.word	327768
	.word	83908612
	.word	327768
	.word	8388612
	.word	327768
	.word	8409092
	.word	327768
	.word	8390660
	.word	327768
	.word	8411140
	.word	327768
	.word	92274692
	.word	327768
	.word	92295172
	.word	327768
	.word	92276740
	.word	327768
	.word	92297220
	.word	32768
	.word	0
	.word	32768
	.word	20480
	.word	32768
	.word	2048
	.word	32768
	.word	22528
	.word	32768
	.word	83886080
	.word	32768
	.word	83906560
	.word	32768
	.word	83888128
	.word	32768
	.word	83908608
	.word	32768
	.word	8388608
	.word	32768
	.word	8409088
	.word	32768
	.word	8390656
	.word	32768
	.word	8411136
	.word	32768
	.word	92274688
	.word	32768
	.word	92295168
	.word	32768
	.word	92276736
	.word	32768
	.word	92297216
	.word	32848
	.word	0
	.word	32848
	.word	20480
	.word	32848
	.word	2048
	.word	32848
	.word	22528
	.word	32848
	.word	83886080
	.word	32848
	.word	83906560
	.word	32848
	.word	83888128
	.word	32848
	.word	83908608
	.word	32848
	.word	8388608
	.word	32848
	.word	8409088
	.word	32848
	.word	8390656
	.word	32848
	.word	8411136
	.word	32848
	.word	92274688
	.word	32848
	.word	92295168
	.word	32848
	.word	92276736
	.word	32848
	.word	92297216
	.word	32776
	.word	0
	.word	32776
	.word	20480
	.word	32776
	.word	2048
	.word	32776
	.word	22528
	.word	32776
	.word	83886080
	.word	32776
	.word	83906560
	.word	32776
	.word	83888128
	.word	32776
	.word	83908608
	.word	32776
	.word	8388608
	.word	32776
	.word	8409088
	.word	32776
	.word	8390656
	.word	32776
	.word	8411136
	.word	32776
	.word	92274688
	.word	32776
	.word	92295168
	.word	32776
	.word	92276736
	.word	32776
	.word	92297216
	.word	32856
	.word	0
	.word	32856
	.word	20480
	.word	32856
	.word	2048
	.word	32856
	.word	22528
	.word	32856
	.word	83886080
	.word	32856
	.word	83906560
	.word	32856
	.word	83888128
	.word	32856
	.word	83908608
	.word	32856
	.word	8388608
	.word	32856
	.word	8409088
	.word	32856
	.word	8390656
	.word	32856
	.word	8411136
	.word	32856
	.word	92274688
	.word	32856
	.word	92295168
	.word	32856
	.word	92276736
	.word	32856
	.word	92297216
	.word	360448
	.word	4
	.word	360448
	.word	20484
	.word	360448
	.word	2052
	.word	360448
	.word	22532
	.word	360448
	.word	83886084
	.word	360448
	.word	83906564
	.word	360448
	.word	83888132
	.word	360448
	.word	83908612
	.word	360448
	.word	8388612
	.word	360448
	.word	8409092
	.word	360448
	.word	8390660
	.word	360448
	.word	8411140
	.word	360448
	.word	92274692
	.word	360448
	.word	92295172
	.word	360448
	.word	92276740
	.word	360448
	.word	92297220
	.word	360528
	.word	4
	.word	360528
	.word	20484
	.word	360528
	.word	2052
	.word	360528
	.word	22532
	.word	360528
	.word	83886084
	.word	360528
	.word	83906564
	.word	360528
	.word	83888132
	.word	360528
	.word	83908612
	.word	360528
	.word	8388612
	.word	360528
	.word	8409092
	.word	360528
	.word	8390660
	.word	360528
	.word	8411140
	.word	360528
	.word	92274692
	.word	360528
	.word	92295172
	.word	360528
	.word	92276740
	.word	360528
	.word	92297220
	.word	360456
	.word	4
	.word	360456
	.word	20484
	.word	360456
	.word	2052
	.word	360456
	.word	22532
	.word	360456
	.word	83886084
	.word	360456
	.word	83906564
	.word	360456
	.word	83888132
	.word	360456
	.word	83908612
	.word	360456
	.word	8388612
	.word	360456
	.word	8409092
	.word	360456
	.word	8390660
	.word	360456
	.word	8411140
	.word	360456
	.word	92274692
	.word	360456
	.word	92295172
	.word	360456
	.word	92276740
	.word	360456
	.word	92297220
	.word	360536
	.word	4
	.word	360536
	.word	20484
	.word	360536
	.word	2052
	.word	360536
	.word	22532
	.word	360536
	.word	83886084
	.word	360536
	.word	83906564
	.word	360536
	.word	83888132
	.word	360536
	.word	83908612
	.word	360536
	.word	8388612
	.word	360536
	.word	8409092
	.word	360536
	.word	8390660
	.word	360536
	.word	8411140
	.word	360536
	.word	92274692
	.word	360536
	.word	92295172
	.word	360536
	.word	92276740
	.word	360536
	.word	92297220
	.type	des_ip_table,#object
	.size	des_ip_table,4096


	.section	".data",#alloc
		.align	32


des_enc_const:

#ifdef __sparcv9

!
! For v9, the addresses ar 64-bit long, so we should use .xword
! instead of .word, this makes the constant table bigger
!
	.xword	(des_ip_table+0x0)	! initial permutation table 
	.xword	(des_ip_table+0x800)
	
	.xword	(des_fp_table+0x0)	! final permutation table
	
	.xword	(des_sbox_table+0x0)    ! sboxes table
	.xword	(des_sbox_table+0x200)
	.xword	(des_sbox_table+0x400)
	.xword	(des_sbox_table+0x600)
	.xword	(des_sbox_table+0x800)
	.xword	(des_sbox_table+0xa00)
	.xword	(des_sbox_table+0xc00)
	.xword	(des_sbox_table+0xe00)

	.word   0			! for alignment
	.word	7			! counter for encrypt loop
	
	.word	16515072		! top_1
	.word	0			!
	
	.word	262143			! mid_4
	.word	-67108864		!
	
	.word	0			! low_3
	.word	67108608		!
	
	.word	-1431655766		! 0xaaaaaaaaaaaaaaaa
	.word	-1431655766		!
	
	.word	1431655765		! 0x5555555555555555
	.word	1431655765		!
#else

!
! For v8, the addresses are 32-bit long
!

	.word	(des_ip_table+0x0)	! initial permutation table 
	.word	(des_ip_table+0x800)
	
	.word	(des_fp_table+0x0)	! final permutation table
	
	.word	(des_sbox_table+0x0)    ! sboxes table
	.word	(des_sbox_table+0x200)
	.word	(des_sbox_table+0x400)
	.word	(des_sbox_table+0x600)
	.word	(des_sbox_table+0x800)
	.word	(des_sbox_table+0xa00)
	.word	(des_sbox_table+0xc00)
	.word	(des_sbox_table+0xe00)
	
	.word	7			! counter for encrypt loop
	
	.word	16515072		! top_1
	.word	0			!
	
	.word	262143			! mid_4
	.word	-67108864		!
	
	.word	0			! low_3
	.word	67108608		!
	
	.word	-1431655766		! 0xaaaaaaaaaaaaaaaa
	.word	-1431655766		!
	
	.word	1431655765		! 0x5555555555555555
	.word	1431655765		!
#endif
	.type	des_enc_const,#object
	.size	des_enc_const,(.-des_enc_const)


	.section	".text",#alloc,#execinstr
/* 000000	   0 */		.align	32
/* 000000	     */		.skip	32
!
! SUBROUTINE des_crypt_impl
!
! OFFSET    SOURCE LINE	LABEL	INSTRUCTION

.global des_crypt_impl

! uint64_t des_crypt_impl(uint64_t *ks, uint64_t block, int one_or_three); 
!
! ks is the key schedule, en/decryption is differentiated by computing
!    an encryption key schedule for encryption and the reverse of it
!    for decryption (for DES, 16 entries, for triple-DES, 48 entries)
! block is the 64-bit block to en/decrypt
! one_or_three is 1 for DES and 3 for triple-DES
	
	des_crypt_impl:

#ifdef __sparcv9
	save	%sp,-192,%sp
#ifdef PIC
.L0:
	call	. + 8
	sethi	%hi(_GLOBAL_OFFSET_TABLE_ - (.L0 - .)), %o1
	sethi	%hi(des_enc_const), %g1
	
	or	%o1, %lo(_GLOBAL_OFFSET_TABLE_ - (.L0 - .)), %o1
	or	%g1, %lo(des_enc_const),%g1

	add	%o1, %o7, %o1
#else
	sethi	%hh(des_enc_const),%o1
	sethi	%lm(des_enc_const),%g1

	or	%o1,%hm(des_enc_const),%o1
	or	%g1,%lo(des_enc_const),%g1

	sllx	%o1,32,%o1
#endif
	sethi	%hi(0xaaaaaaaa), %g3

#ifdef PIC
	ldx	[%o1 + %g1], %i5
#else
	or	%o1,%g1,%i5		! &des_enc_const
#endif
	or	%g3, %lo(0xaaaaaaaa), %g3

	sllx	%g3, 32, %o0

	or	%g3, %o0, %g3		! 0xaaaaaaaaaaaaaaaa

	srlx	%g3, 1, %g2		! 0x5555555555555555
	and	%i1, %g3, %g1

	sllx	%g1, 7, %g3
	ldx	[%i5 + 0], %l7		! &(des_ip_table[0][0])
	and	%i1, %g2, %g2

	srlx	%g2, 7, %g4
	ldx	[%i5 + 8], %l6		! &(des_ip_table[1][0])
	or	%g1, %g3, %g1

	srlx	%g1, 21, %o0
	ld	[%i5 + 92], %i4		! 7 (for iteration counter)
	or	%g2, %g4, %g2

	srlx	%g1, 5, %o1
	ldx	[%i5 + 24], %l0		! &(des_sbox_table[0][0])
	and	%o0, 0x7f8, %o0

	srlx	%g2, 13, %o2
	ldx	[%l7 + %o0], %o0
	and	%o1, 0x7f8, %o1

	sllx	%g2, 3, %o3
	ldx	[%l6 + %o1], %o1
	and	%o2, 0x7f8, %o2

	srlx	%g1, 53, %o4
	ldx	[%l7 + %o2], %o2
	and	%o3, 0x7f8, %o3

	srlx	%g1, 37, %o5
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x7f8, %o4

	srlx	%g2, 45, %g1
	ldx	[%l7 + %o4], %o4
	and	%o5, 0x7f8, %o5
	
	srlx	%g2, 29, %g2
	ldx	[%l6 + %o5], %o5
	and	%g1, 0x7f8, %g1

	sllx	%o0, 6, %o0
	ldx	[%l7 + %g1], %g1
	and	%g2, 0x7f8, %g2

	sllx	%o1, 6, %o1
	ldx	[%l6 + %g2], %g2
	or	%o4, %o5, %o4

	sllx	%o2, 6, %o2
	ldx	[%i5 + 32], %l1		! &(des_sbox_table[1][0])
	or	%o0, %o1, %o0

	sllx	%o3, 6, %o3
	ldx	[%i5 + 96], %g3		! top_1
	or	%o0, %o4, %o0

	or	%g1, %g2, %g1
	ldx	[%i5 + 104], %g4	! mid_4
	or	%o2, %o3, %o2

	and	%o0, %g3, %o4
	ldx	[%i5 + 112], %g2	! low_3
	or	%o2, %g1, %o1

	sllx	%o4, 8, %o4
	ldx	[%i5 + 40], %l2		! &(des_sbox_table[2][0])
	and	%o1, %g3, %o5

	sllx	%o5, 8, %o5
	ldx	[%i5 + 48], %l3		! &(des_sbox_table[3][0])
	and	%o0, %g2, %o2

	srlx	%o2, 5, %o2
	ldx	[%i5 + 56], %l4		! &(des_sbox_table[4][0])
	and	%o1, %g2, %o3

	srlx	%o3, 5, %o3
	ldx	[%i0], %g2		! ks[0]
	and	%o0, %g4, %o0

	or	%o0, %o2, %o0
	ldx	[%i5 + 64], %l5		! &(des_sbox_table[5][0])
	and	%o1, %g4, %o1

	or	%o0, %o4, %o0
	ldx	[%i5 + 72], %l6		! &(des_sbox_table[6][0])
	or	%o1, %o3, %o1

	xor	%o0, %g2, %g1
	ldx	[%i5 + 80], %l7		! &(des_sbox_table[7][0])
	or	%o1, %o5, %o1
#else

! v8 version

	save	%sp,-144,%sp
	sethi	%hi(des_enc_const), %g2

#ifdef PIC
.L1:
	call	.+8

	sethi	%hi(_GLOBAL_OFFSET_TABLE_ - (.L1 - .)), %g1

	or	%g1, %lo(_GLOBAL_OFFSET_TABLE_ - (.L1 - .)), %g1
	or	%g2, %lo(des_enc_const), %g2
#else
	or	%g2, %lo(des_enc_const), %i5
#endif
	srl	%i2, 0, %g4
	sethi	%hi(0xaaaaaaaa), %g3

	sllx	%i1, 32, %g5
	or	%g3, %lo(0xaaaaaaaa), %g3

	sllx	%g3, 32, %o0
	add	%o7, %g1, %g1

	or	%g3, %o0, %g3		! 0xaaaaaaaaaaaaaaaa
#ifdef PIC
	ld	[%g1 + %g2], %i5
#endif
	or	%g4, %g5, %g4

	srlx	%g3, 1, %g2		! 0x5555555555555555
	and	%g4, %g3, %g1

	sllx	%g1, 7, %g3
	ld	[%i5 + 0], %l7		! &(des_ip_table[0][0])
	and	%g4, %g2, %g2

	srlx	%g2, 7, %g4
	ld	[%i5 + 4], %l6		! &(des_ip_table[1][0])
	or	%g1, %g3, %g1

	srlx	%g1, 21, %o0
	ld	[%i5 + 44], %i4		! 7 (for iteration counter)
	or	%g2, %g4, %g2

	srlx	%g1, 5, %o1
	ld	[%i5 + 12], %l0		! &(des_sbox_table[0][0])
	and	%o0, 0x7f8, %o0

	srlx	%g2, 13, %o2
	ldx	[%l7 + %o0], %o0
	and	%o1, 0x7f8, %o1

	sllx	%g2, 3, %o3
	ldx	[%l6 + %o1], %o1
	and	%o2, 0x7f8, %o2

	srlx	%g1, 53, %o4
	ldx	[%l7 + %o2], %o2
	and	%o3, 0x7f8, %o3

	srlx	%g1, 37, %o5
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x7f8, %o4

	srlx	%g2, 45, %g1
	ldx	[%l7 + %o4], %o4
	and	%o5, 0x7f8, %o5
	
	srlx	%g2, 29, %g2
	ldx	[%l6 + %o5], %o5
	and	%g1, 0x7f8, %g1

	sllx	%o0, 6, %o0
	ldx	[%l7 + %g1], %g1
	and	%g2, 0x7f8, %g2

	sllx	%o1, 6, %o1
	ldx	[%l6 + %g2], %g2
	or	%o4, %o5, %o4

	sllx	%o2, 6, %o2
	ld	[%i5 + 16], %l1		! &(des_sbox_table[1][0])
	or	%o0, %o1, %o0

	sllx	%o3, 6, %o3
	ldx	[%i5 + 48], %g3		! top_1
	or	%o0, %o4, %o0

	or	%g1, %g2, %g1
	ldx	[%i5 + 56], %g4		! mid_4
	or	%o2, %o3, %o2

	and	%o0, %g3, %o4
	ldx	[%i5 + 64], %g2		! low_3
	or	%o2, %g1, %o1

	sllx	%o4, 8, %o4
	ld	[%i5 + 20], %l2		! &(des_sbox_table[2][0])
	and	%o1, %g3, %o5

	sllx	%o5, 8, %o5
	ld	[%i5 + 24], %l3		! &(des_sbox_table[3][0])
	and	%o0, %g2, %o2

	srlx	%o2, 5, %o2
	ld	[%i5 + 28], %l4		! &(des_sbox_table[4][0])
	and	%o1, %g2, %o3

	srlx	%o3, 5, %o3
	ldx	[%i0], %g2		! ks[0]
	and	%o0, %g4, %o0

	or	%o0, %o2, %o0
	ld	[%i5 + 32], %l5		! &(des_sbox_table[5][0])
	and	%o1, %g4, %o1

	or	%o0, %o4, %o0
	ld	[%i5 + 36], %l6		! &(des_sbox_table[6][0])
	or	%o1, %o3, %o1

	xor	%o0, %g2, %g1
	ld	[%i5 + 40], %l7		! &(des_sbox_table[7][0])
	or	%o1, %o5, %o1

#endif
.L2:	
	srlx	%g1, 55, %g1
	xor	%o0, %g2, %o5
.L3:	
	srlx	%o5, 41, %g3
	ldx	[%l0 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 35, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 6, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l2 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srl	%o5, 23, %o5
	ldx	[%l6 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l4 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0 + 8], %g2
	add	%i0, 16, %i0

	xor	%o1, %o3, %o1
	or	%o4, %o5, %o5

	xor	%o1, %g2, %g1
	xor	%o1, %o5, %o1

	srl	%g1, 23, %g1
	xor	%o1, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l4 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 6, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 35, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srlx	%o5, 55, %o5
	ldx	[%l2 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l0 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0], %g2
	subcc	%i4,1,%i4

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o5

	xor	%o0, %g2, %g1
!	bnz	%icc, .L2
	xor	%o0, %o5, %o0

	srlx	%g1, 55, %g1
	xor	%o0, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l0 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 35, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 6, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l2 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srl	%o5, 23, %o5
	ldx	[%l6 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l4 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0 + 8], %g2
	add	%i0, 16, %i0

	xor	%o1, %o3, %o1
	or	%o4, %o5, %o5

	xor	%o1, %g2, %g1
	xor	%o1, %o5, %o1

	srl	%g1, 23, %g1
	xor	%o1, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l4 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 6, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 35, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srlx	%o5, 55, %o5
	ldx	[%l2 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l0 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0], %g2
	subcc	%i4,1,%i4

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o5

	xor	%o0, %g2, %g1
!	bnz	%icc, .L2
	xor	%o0, %o5, %o0

	srlx	%g1, 55, %g1
	xor	%o0, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l0 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 35, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 6, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l2 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srl	%o5, 23, %o5
	ldx	[%l6 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l4 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0 + 8], %g2
	add	%i0, 16, %i0

	xor	%o1, %o3, %o1
	or	%o4, %o5, %o5

	xor	%o1, %g2, %g1
	xor	%o1, %o5, %o1

	srl	%g1, 23, %g1
	xor	%o1, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l4 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 6, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 35, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srlx	%o5, 55, %o5
	ldx	[%l2 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l0 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0], %g2
	subcc	%i4,1,%i4

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o5

	xor	%o0, %g2, %g1
!	bnz	%icc, .L2
	xor	%o0, %o5, %o0

	srlx	%g1, 55, %g1
	xor	%o0, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l0 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 35, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 6, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l2 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srl	%o5, 23, %o5
	ldx	[%l6 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l4 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0 + 8], %g2
	add	%i0, 16, %i0

	xor	%o1, %o3, %o1
	or	%o4, %o5, %o5

	xor	%o1, %g2, %g1
	xor	%o1, %o5, %o1

	srl	%g1, 23, %g1
	xor	%o1, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l4 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 6, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 35, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srlx	%o5, 55, %o5
	ldx	[%l2 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l0 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0], %g2
	subcc	%i4,1,%i4

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o5

	xor	%o0, %g2, %g1
!	bnz	%icc, .L2
	xor	%o0, %o5, %o0

	srlx	%g1, 55, %g1
	xor	%o0, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l0 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 35, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 6, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l2 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srl	%o5, 23, %o5
	ldx	[%l6 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l4 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0 + 8], %g2
	add	%i0, 16, %i0

	xor	%o1, %o3, %o1
	or	%o4, %o5, %o5

	xor	%o1, %g2, %g1
	xor	%o1, %o5, %o1

	srl	%g1, 23, %g1
	xor	%o1, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l4 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 6, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 35, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srlx	%o5, 55, %o5
	ldx	[%l2 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l0 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0], %g2
	subcc	%i4,1,%i4

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o5

	xor	%o0, %g2, %g1
!	bnz	%icc, .L2
	xor	%o0, %o5, %o0

	srlx	%g1, 55, %g1
	xor	%o0, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l0 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 35, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 6, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l2 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srl	%o5, 23, %o5
	ldx	[%l6 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l4 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0 + 8], %g2
	add	%i0, 16, %i0

	xor	%o1, %o3, %o1
	or	%o4, %o5, %o5

	xor	%o1, %g2, %g1
	xor	%o1, %o5, %o1

	srl	%g1, 23, %g1
	xor	%o1, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l4 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 6, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 35, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srlx	%o5, 55, %o5
	ldx	[%l2 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l0 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0], %g2
	subcc	%i4,1,%i4

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o5

	xor	%o0, %g2, %g1
!	bnz	%icc, .L2
	xor	%o0, %o5, %o0

	srlx	%g1, 55, %g1
	xor	%o0, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l0 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 35, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 6, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l2 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srl	%o5, 23, %o5
	ldx	[%l6 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l4 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0 + 8], %g2
	add	%i0, 16, %i0

	xor	%o1, %o3, %o1
	or	%o4, %o5, %o5

	xor	%o1, %g2, %g1
	xor	%o1, %o5, %o1

	srl	%g1, 23, %g1
	xor	%o1, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l4 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 6, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 35, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srlx	%o5, 55, %o5
	ldx	[%l2 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l0 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0], %g2
	subcc	%i4,1,%i4

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o5

	xor	%o0, %g2, %g1
!	bnz	%icc, .L2
	xor	%o0, %o5, %o0

	srlx	%g1, 55, %g1
	xor	%o0, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l0 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 35, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 6, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l2 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srl	%o5, 23, %o5
	ldx	[%l6 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l4 + %o5], %o5
	or	%o2, %o3, %o3

	or	%g4, %o3, %o3
	ldx	[%i0 + 8], %g2
#ifdef __sparcv9
	subcc	%i2, 1, %i2		! one_or_three for v9
#else
	subcc	%i3, 1, %i3		! one_or_three for v8
#endif

	xor	%o1, %o3, %o1
	or	%o4, %o5, %o5

	xor	%o1, %g2, %g1
	xor	%o1, %o5, %g5

	srl	%g1, 23, %g1
	xor	%g5, %g2, %o5

	srlx	%o5, 41, %g3
	ldx	[%l4 + %g1], %g1
	and	%o5, 0x1f8, %g2

	srlx	%o5, 29, %g4
	ldx	[%l7 + %g2], %g2
	and	%g3, 0x1f8, %g3

	srlx	%o5, 12, %o2
	ldx	[%l1 + %g3], %g3
	and	%g4, 0x1f8, %g4

	srlx	%o5, 6, %o3
	ldx	[%l3 + %g4], %g4
	and	%o2, 0x1f8, %o2

	srlx	%o5, 35, %o4
	ldx	[%l5 + %o2], %o2
	and	%o3, 0x1f8, %o3

	or	%g1, %g2, %g2
	ldx	[%l6 + %o3], %o3
	and	%o4, 0x1f8, %o4

	srlx	%o5, 55, %o5
	ldx	[%l2 + %o4], %o4
	or	%g3, %g4, %g4

	or	%g2, %g4, %g4
	ldx	[%l0 + %o5], %o5
	bz,pn	%icc, .L4		! if finished (one or three iterations
	or	%o2, %o3, %o3		! of the 16 rounds), go to final perm.

	or	%g4, %o3, %o3
	ldx	[%i0 + 16], %g2
	add	%i0, 16, %i0

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o4

	xor	%g5, %g2, %o5
	xor	%o0, %o4, %o1

	srlx	%o5, 55, %g1
	ba	.L3
	or	%g5, %g0, %o0

	
.L4:	
	or	%g4, %o3, %o3
#ifdef __sparcv9
	ldx	[%i5 + 16], %i5		! &(dec_fp_table[0])
#else
	ld	[%i5 + 8], %i5		! &(dec_fp_table[0])
#endif
	or	%g0, 0xf, %g4

	xor	%o0, %o3, %o0
	or	%o4, %o5, %o5

	sllx	%g4, 59, %g4		! mask for bits 1-4
	xor	%o0, %o5, %o0

! fp starts here

	srlx	%o0, 33, %g1
	and	%o0, %g4, %g2

	srlx	%g5, 37, %l0
	and	%g5, %g4, %g3

	srlx	%g2, 53, %g2
	and	%g1, 0x3c0, %g1

	srlx	%g3, 57, %l1
	and	%l0, 0x3c, %l0

	srlx	%o0, 21, %g3
	or	%g1, %l0, %l0

	srlx	%g5, 25, %l2
	ld	[%i5 + %l0], %l0
	or	%l1, %g2, %l1

	srlx	%o0, 4, %g4
	ld	[%i5 + %l1], %l1
	and	%g3, 0x3c0, %g3

	srlx	%g5, 8, %l3
	and	%l2, 0x3c, %l2

	srlx	%o0, 27, %g1
	or	%l2, %g3, %l2

	srlx	%g5, 31, %l4
	ld	[%i5 + %l2], %l2
	and	%g4, 0x3c0, %g4

	and	%l3, 0x3c, %l3
	and	%g1, 0x3c0, %g1

	srlx	%o0, 10, %g2
	or	%l3, %g4, %l3

	srlx	%g5, 14, %l5
	ld	[%i5 + %l3], %l3
	and	%l4, 0x3c, %l4

	sllx	%o0, 2, %g3
	or	%l4, %g1, %l4

	srlx	%g5, 2, %l6
	ld	[%i5 + %l4], %l4
	and	%g2, 0x3c0, %g2

	srlx	%o0, 39, %g4
	and	%l5, 0x3c, %l5

	and	%g3, 0x3c0, %g3
	or	%l5, %g2, %l5

	srlx	%g5, 43, %l7
	ld	[%i5 + %l5], %l5
	and	%l6, 0x3c, %l6

	and	%g4, 0x3c0, %g4
	or	%l6, %g3, %l6

	srl	%l0, 2, %l0
	ld	[%i5 + %l6], %l6
	and	%l7, 0x3c, %l7

	srl	%l2, 4, %l2
	or	%l7, %g4, %l7

	srl	%l4, 2, %l4
	ld	[%i5 + %l7], %l7
	or	%l0, %l1, %l1

	srl	%l5, 4, %l5
	or	%l1, %l2, %l2

	srl	%l6, 6, %l6
	or	%l4, %l5, %l5

	srl	%l3, 6, %l3
	or	%l6, %l7, %l7

	or	%l2, %l3, %i1
	or	%l5, %l7, %i0

!
! result at this point is in i0-i1, just as it should for v8
!
#ifdef __sparcv9
	srl	%i1, 0, %i1

	sllx	%i0, 32, %i0

	or	%i0, %i1, %i0
#endif

	
	ret
	restore	%g0,%g0,%g0
	.type	des_crypt_impl,2
	.size	des_crypt_impl,(.-des_crypt_impl)

	.align	32
!
! CONSTANT POOL
!
des_fp_table:
	.word	0
	.word	-2147483648
	.word	8388608
	.word	-2139095040
	.word	32768
	.word	-2147450880
	.word	8421376
	.word	-2139062272
	.word	128
	.word	-2147483520
	.word	8388736
	.word	-2139094912
	.word	32896
	.word	-2147450752
	.word	8421504
	.word	-2139062144
	.word	1073741824
	.word	-1073741824
	.word	1082130432
	.word	-1065353216
	.word	1073774592
	.word	-1073709056
	.word	1082163200
	.word	-1065320448
	.word	1073741952
	.word	-1073741696
	.word	1082130560
	.word	-1065353088
	.word	1073774720
	.word	-1073708928
	.word	1082163328
	.word	-1065320320
	.word	4194304
	.word	-2143289344
	.word	12582912
	.word	-2134900736
	.word	4227072
	.word	-2143256576
	.word	12615680
	.word	-2134867968
	.word	4194432
	.word	-2143289216
	.word	12583040
	.word	-2134900608
	.word	4227200
	.word	-2143256448
	.word	12615808
	.word	-2134867840
	.word	1077936128
	.word	-1069547520
	.word	1086324736
	.word	-1061158912
	.word	1077968896
	.word	-1069514752
	.word	1086357504
	.word	-1061126144
	.word	1077936256
	.word	-1069547392
	.word	1086324864
	.word	-1061158784
	.word	1077969024
	.word	-1069514624
	.word	1086357632
	.word	-1061126016
	.word	16384
	.word	-2147467264
	.word	8404992
	.word	-2139078656
	.word	49152
	.word	-2147434496
	.word	8437760
	.word	-2139045888
	.word	16512
	.word	-2147467136
	.word	8405120
	.word	-2139078528
	.word	49280
	.word	-2147434368
	.word	8437888
	.word	-2139045760
	.word	1073758208
	.word	-1073725440
	.word	1082146816
	.word	-1065336832
	.word	1073790976
	.word	-1073692672
	.word	1082179584
	.word	-1065304064
	.word	1073758336
	.word	-1073725312
	.word	1082146944
	.word	-1065336704
	.word	1073791104
	.word	-1073692544
	.word	1082179712
	.word	-1065303936
	.word	4210688
	.word	-2143272960
	.word	12599296
	.word	-2134884352
	.word	4243456
	.word	-2143240192
	.word	12632064
	.word	-2134851584
	.word	4210816
	.word	-2143272832
	.word	12599424
	.word	-2134884224
	.word	4243584
	.word	-2143240064
	.word	12632192
	.word	-2134851456
	.word	1077952512
	.word	-1069531136
	.word	1086341120
	.word	-1061142528
	.word	1077985280
	.word	-1069498368
	.word	1086373888
	.word	-1061109760
	.word	1077952640
	.word	-1069531008
	.word	1086341248
	.word	-1061142400
	.word	1077985408
	.word	-1069498240
	.word	1086374016
	.word	-1061109632
	.word	64
	.word	-2147483584
	.word	8388672
	.word	-2139094976
	.word	32832
	.word	-2147450816
	.word	8421440
	.word	-2139062208
	.word	192
	.word	-2147483456
	.word	8388800
	.word	-2139094848
	.word	32960
	.word	-2147450688
	.word	8421568
	.word	-2139062080
	.word	1073741888
	.word	-1073741760
	.word	1082130496
	.word	-1065353152
	.word	1073774656
	.word	-1073708992
	.word	1082163264
	.word	-1065320384
	.word	1073742016
	.word	-1073741632
	.word	1082130624
	.word	-1065353024
	.word	1073774784
	.word	-1073708864
	.word	1082163392
	.word	-1065320256
	.word	4194368
	.word	-2143289280
	.word	12582976
	.word	-2134900672
	.word	4227136
	.word	-2143256512
	.word	12615744
	.word	-2134867904
	.word	4194496
	.word	-2143289152
	.word	12583104
	.word	-2134900544
	.word	4227264
	.word	-2143256384
	.word	12615872
	.word	-2134867776
	.word	1077936192
	.word	-1069547456
	.word	1086324800
	.word	-1061158848
	.word	1077968960
	.word	-1069514688
	.word	1086357568
	.word	-1061126080
	.word	1077936320
	.word	-1069547328
	.word	1086324928
	.word	-1061158720
	.word	1077969088
	.word	-1069514560
	.word	1086357696
	.word	-1061125952
	.word	16448
	.word	-2147467200
	.word	8405056
	.word	-2139078592
	.word	49216
	.word	-2147434432
	.word	8437824
	.word	-2139045824
	.word	16576
	.word	-2147467072
	.word	8405184
	.word	-2139078464
	.word	49344
	.word	-2147434304
	.word	8437952
	.word	-2139045696
	.word	1073758272
	.word	-1073725376
	.word	1082146880
	.word	-1065336768
	.word	1073791040
	.word	-1073692608
	.word	1082179648
	.word	-1065304000
	.word	1073758400
	.word	-1073725248
	.word	1082147008
	.word	-1065336640
	.word	1073791168
	.word	-1073692480
	.word	1082179776
	.word	-1065303872
	.word	4210752
	.word	-2143272896
	.word	12599360
	.word	-2134884288
	.word	4243520
	.word	-2143240128
	.word	12632128
	.word	-2134851520
	.word	4210880
	.word	-2143272768
	.word	12599488
	.word	-2134884160
	.word	4243648
	.word	-2143240000
	.word	12632256
	.word	-2134851392
	.word	1077952576
	.word	-1069531072
	.word	1086341184
	.word	-1061142464
	.word	1077985344
	.word	-1069498304
	.word	1086373952
	.word	-1061109696
	.word	1077952704
	.word	-1069530944
	.word	1086341312
	.word	-1061142336
	.word	1077985472
	.word	-1069498176
	.word	1086374080
	.word	-1061109568
	.type	des_fp_table,#object
	.size	des_fp_table,1024

#endif	/* lint || __lint */