/* * 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 * 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 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #if defined(lint) || defined(__lint) #include "arcfour.h" /* ARGSUSED */ void arcfour_crypt_aligned(ARCFour_key *key, size_t len, uchar_t *in, uchar_t *out) {} #else /* lint || __lint */ .register %g2,#scratch .register %g3,#scratch .section ".text",#alloc,#execinstr .file "arcfour_crypt_asm.s" .section ".text",#alloc .align 32 .section ".text",#alloc,#execinstr .align 32 .skip 32 /* * SUBROUTINE arcfour_crypt_aligned * * void arcfour_crypt_aligned(ARCFour_key *key, size_t len, * uchar_t *in, uchar_t *out); * * in and out should be aligned on an 8-byte boundary, but len can be anything */ .global arcfour_crypt_aligned arcfour_crypt_aligned: save %sp,-144,%sp srl %i1, 3, %l7 ldub [%i0+256], %g1 orcc %l7, %g0, %g0 ldub [%i0+257], %g2 add %g1, 1, %o1 bz %icc, .Loop2 add %i0, 0, %i5 add %o1, 1, %g1 and %o1, 255, %o1 and %g1, 255, %g1 ldub [%i5 + %o1], %o3 ldub [%i5 + %g1], %g3 add %g2, %o3, %o2 add %o2, %g3, %g2 and %o2, 255, %o2 and %g2, 255, %g2 ldub [%i5 + %o2], %o4 stb %o3, [%i5+%o2] subcc %o2, %g1, %g0 stb %o4, [%i5 + %o1] bz %icc, .L1A add %o3,%o4,%o5 .L1B: and %o5, 255, %o5 ldub [%i5 + %g2], %g4 ldub [%i5 + %o5], %o5 add %g1, 1, %o1 and %o1, 255, %o1 stb %g3, [%i5 + %g2] add %g3, %g4, %g5 and %g5, 255, %g5 stb %g4, [%i5 + %g1] add %o1, 1, %g1 sllx %o5, 56, %o0 ldub [%i5 + %o1], %o3 and %g1, 255, %g1 ldub [%i5 + %g1], %g3 add %g2, %o3, %o2 ldub [%i5 + %g5], %g5 add %o2, %g3, %g2 and %o2, 255, %o2 sllx %g5, 48, %g5 ldub [%i5 + %o2], %o4 and %g2, 255, %g2 or %o0, %g5, %o0 stb %o3, [%i5+%o2] subcc %o2, %g1, %g0 stb %o4, [%i5 + %o1] bz %icc, .L2A add %o3,%o4,%o5 .L2B: and %o5, 255, %o5 ldub [%i5 + %g2], %g4 ldub [%i5 + %o5], %o5 add %g1, 1, %o1 and %o1, 255, %o1 stb %g3, [%i5 + %g2] add %g3, %g4, %g5 and %g5, 255, %g5 stb %g4, [%i5 + %g1] add %o1, 1, %g1 sllx %o5, 40, %o5 ldub [%i5 + %o1], %o3 and %g1, 255, %g1 ldub [%i5 + %g1], %g3 or %o0, %o5, %o0 add %g2, %o3, %o2 ldub [%i5 + %g5], %g5 add %o2, %g3, %g2 and %o2, 255, %o2 sllx %g5, 32, %g5 ldub [%i5 + %o2], %o4 and %g2, 255, %g2 or %o0, %g5, %o0 stb %o3, [%i5+%o2] subcc %o2, %g1, %g0 stb %o4, [%i5 + %o1] bz %icc, .L3A add %o3,%o4,%o5 .L3B: and %o5, 255, %o5 ldub [%i5 + %g2], %g4 ldub [%i5 + %o5], %o5 add %g1, 1, %o1 and %o1, 255, %o1 stb %g3, [%i5 + %g2] add %g3, %g4, %g5 and %g5, 255, %g5 stb %g4, [%i5 + %g1] add %o1, 1, %g1 sll %o5, 24, %o5 ldub [%i5 + %o1], %o3 and %g1, 255, %g1 sub %i1, 8, %i1 ldub [%i5 + %g1], %g3 or %o0, %o5, %o0 srl %i1, 3, %l7 ldub [%i5 + %g5], %g5 add %g2, %o3, %o2 add %o2, %g3, %g2 and %o2, 255, %o2 sll %g5, 16, %g5 ldub [%i5 + %o2], %o4 and %g2, 255, %g2 or %o0, %g5, %o0 stb %o3, [%i5+%o2] subcc %o2, %g1, %g0 stb %o4, [%i5 + %o1] bz %icc, .L4A add %o3,%o4,%o5 .L4B: and %o5, 255, %o5 ldub [%i5 + %g2], %g4 add %g1, 1, %o1 orcc %l7, %g0, %g0 ldub [%i5 + %o5], %o5 and %o1, 255, %o1 add %g3, %g4, %g5 stb %g4, [%i5 + %g1] add %o1, 1, %g1 stb %g3, [%i5 + %g2] bz %icc, .EndLoop1 and %g5, 255, %g5 .Loop1: sll %o5, 8, %o5 ldub [%i5 + %o1], %o3 and %g1, 255, %g1 ldub [%i5 + %g1], %g3 or %o0, %o5, %o0 ldub [%i5 + %g5], %g5 add %g2, %o3, %o2 add %o2, %g3, %g2 ldx [%i2], %o7 and %o2, 255, %o2 and %g2, 255, %g2 ldub [%i5 + %o2], %o4 or %o0, %g5, %o0 stb %o3, [%i5+%o2] subcc %o2, %g1, %g0 stb %o4, [%i5 + %o1] bz %icc, .L5A add %o3,%o4,%o5 .L5B: and %o5, 255, %o5 ldub [%i5 + %g2], %g4 ldub [%i5 + %o5], %o5 add %g1, 1, %o1 and %o1, 255, %o1 stb %g3, [%i5 + %g2] add %g3, %g4, %g5 and %g5, 255, %g5 stb %g4, [%i5 + %g1] add %o1, 1, %g1 xor %o0, %o7, %o7 ldub [%i5 + %o1], %o3 and %g1, 255, %g1 sllx %o5, 56, %o0 ldub [%i5 + %g1], %g3 add %g2, %o3, %o2 ldub [%i5 + %g5], %g5 add %o2, %g3, %g2 stx %o7, [%i3] and %o2, 255, %o2 sllx %g5, 48, %g5 ldub [%i5 + %o2], %o4 and %g2, 255, %g2 or %o0, %g5, %o0 stb %o3, [%i5+%o2] subcc %o2, %g1, %g0 stb %o4, [%i5 + %o1] bz %icc, .L6A add %o3,%o4,%o5 .L6B: and %o5, 255, %o5 ldub [%i5 + %g2], %g4 add %i3, 8, %i3 add %i2, 8, %i2 ldub [%i5 + %o5], %o5 add %g1, 1, %o1 and %o1, 255, %o1 stb %g3, [%i5 + %g2] add %g3, %g4, %g5 and %g5, 255, %g5 stb %g4, [%i5 + %g1] add %o1, 1, %g1 sllx %o5, 40, %o5 ldub [%i5 + %o1], %o3 and %g1, 255, %g1 ldub [%i5 + %g1], %g3 or %o0, %o5, %o0 add %g2, %o3, %o2 ldub [%i5 + %g5], %g5 add %o2, %g3, %g2 and %o2, 255, %o2 sllx %g5, 32, %g5 ldub [%i5 + %o2], %o4 and %g2, 255, %g2 or %o0, %g5, %o0 stb %o3, [%i5 + %o2] subcc %o2, %g1, %g0 stb %o4, [%i5 + %o1] bz %icc, .L7A add %o3,%o4,%o5 .L7B: and %o5, 255, %o5 ldub [%i5 + %g2], %g4 ldub [%i5 + %o5], %o5 add %g1, 1, %o1 and %o1, 255, %o1 stb %g3, [%i5 + %g2] add %g3, %g4, %g5 and %g5, 255, %g5 stb %g4, [%i5 + %g1] add %o1, 1, %g1 sll %o5, 24, %o5 ldub [%i5 + %o1], %o3 and %g1, 255, %g1 sub %i1, 8, %i1 ldub [%i5 + %g1], %g3 or %o0, %o5, %o0 srl %i1, 3, %l7 ldub [%i5 + %g5], %g5 add %g2, %o3, %o2 add %o2, %g3, %g2 and %o2, 255, %o2 sll %g5, 16, %g5 ldub [%i5 + %o2], %o4 and %g2, 255, %g2 or %o0, %g5, %o0 stb %o3, [%i5 + %o2] subcc %o2, %g1, %g0 stb %o4, [%i5 + %o1] bz %icc, .L8A add %o3,%o4,%o5 .L8B: and %o5, 255, %o5 ldub [%i5 + %g2], %g4 add %g1, 1, %o1 orcc %l7, %g0, %g0 ldub [%i5 + %o5], %o5 and %o1, 255, %o1 add %g3, %g4, %g5 stb %g4, [%i5 + %g1] add %o1, 1, %g1 stb %g3, [%i5 + %g2] bnz %icc, .Loop1 and %g5, 255, %g5 .EndLoop1: sll %o5, 8, %o5 ldub [%i5 + %g5], %g5 orcc %i1, %g0, %g0 or %o0, %o5, %o0 ldx [%i2], %o7 sub %g1, 2, %g1 and %g1, 255, %g1 stb %g1, [%i0 + 256] or %o0, %g5, %o0 xor %o0, %o7, %o7 stx %o7, [%i3] add %i2, 8, %i2 add %i3, 8, %i3 bnz %icc, .Loop2_1 stb %g2, [%i0 + 257] ret restore %g0,%g0,%g0 .Loop2: orcc %i1, %g0, %g0 bnz .Loop2_1 nop ret restore %g0,%g0,%g0 .Loop2_1: and %o1, 255, %g1 ldub [%i5 + %g1], %g3 add %g2, %g3, %g2 and %g2, 255, %g2 ldub [%i5 + %g2], %g4 stb %g3, [%i5 + %g2] add %g3, %g4, %g5 stb %g4, [%i5 + %g1] and %g5, 255, %g5 ldub [%i2], %o0 add %g1, 1, %o1 ldub [%i5 + %g5], %g5 subcc %i1, 1, %i1 add %i2, 1, %i2 add %i3, 1, %i3 xor %o0, %g5, %o0 bnz %icc, .Loop2_1 stb %o0, [%i3 - 1] stb %g1, [%i0 + 256] stb %g2, [%i0 + 257] ret restore %g0,%g0,%g0 .L1A: add %o2, %o3, %g2 or %o3, %g0, %g3 ba .L1B and %g2, 255, %g2 .L2A: add %o2, %o3, %g2 or %o3, %g0, %g3 ba .L2B and %g2, 255, %g2 .L3A: add %o2, %o3, %g2 or %o3, %g0, %g3 ba .L3B and %g2, 255, %g2 .L4A: add %o2, %o3, %g2 or %o3, %g0, %g3 ba .L4B and %g2, 255, %g2 .L5A: add %o2, %o3, %g2 or %o3, %g0, %g3 ba .L5B and %g2, 255, %g2 .L6A: add %o2, %o3, %g2 or %o3, %g0, %g3 ba .L6B and %g2, 255, %g2 .L7A: add %o2, %o3, %g2 or %o3, %g0, %g3 ba .L7B and %g2, 255, %g2 .L8A: add %o2, %o3, %g2 or %o3, %g0, %g3 ba .L8B and %g2, 255, %g2 .type arcfour_crypt_aligned,2 .size arcfour_crypt_aligned,(. - arcfour_crypt_aligned) #endif /* lint || __lint */