195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#!/usr/bin/env perl
295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# ====================================================================
495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# project. The module is, however, dual licensed under OpenSSL and
695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# CRYPTOGAMS licenses depending on where you obtain it. For further
795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# details see http://www.openssl.org/~appro/cryptogams/.
895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# ====================================================================
995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# AES for ARMv4
1195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# January 2007.
1395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#
1495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# Code uses single 1K S-box and is >2 times faster than code generated
1595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which
1695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# allows to merge logical or arithmetic operation with shift or rotate
1795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# in one instruction and emit combined result every cycle. The module
1895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# is endian-neutral. The performance is ~42 cycles/byte for 128-bit
1995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# key [on single-issue Xscale PXA250 core].
2095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
2195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# May 2007.
2295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#
2395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# AES_set_[en|de]crypt_key is added.
2495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
2595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# July 2010.
2695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#
2795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# Rescheduling for dual-issue pipeline resulted in 12% improvement on
2895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# Cortex A8 core and ~25 cycles per byte processed with 128-bit key.
2995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
3095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# February 2011.
3195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#
3295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# Profiler-assisted and platform-specific optimization resulted in 16%
3395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# improvement on Cortex A8 core and ~21.5 cycles per byte.
3495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
3595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleywhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
3695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyopen STDOUT,">$output";
3795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
3895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$s0="r0";
3995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$s1="r1";
4095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$s2="r2";
4195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$s3="r3";
4295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$t1="r4";
4395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$t2="r5";
4495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$t3="r6";
4595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$i1="r7";
4695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$i2="r8";
4795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$i3="r9";
4895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
4995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$tbl="r10";
5095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$key="r11";
5195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$rounds="r12";
5295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
5395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$code=<<___;
5495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if defined(__arm__)
5595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifndef __KERNEL__
5695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# include "arm_arch.h"
5795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
5895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# define __ARM_ARCH__ __LINUX_ARM_ARCH__
5995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
6095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
6195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.text
6295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
6395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.code	32
6495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
6595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.syntax	unified
6695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# ifdef __thumb2__
6795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.thumb
6895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# else
6995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.code	32
7095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley# endif
7195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
7295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
7395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.type	AES_Te,%object
7495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	5
7595c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyAES_Te:
7695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
7795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
7895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
7995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
8095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
8195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
8295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
8395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
8495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
8595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
8695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
8795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
8895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
8995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
9095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
9195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
9295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
9395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
9495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
9595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
9695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
9795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
9895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
9995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
10095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
10195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
10295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
10395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
10495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
10595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
10695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
10795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
10895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
10995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
11095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
11195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
11295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
11395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
11495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
11595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
11695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
11795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
11895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
11995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
12095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
12195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
12295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
12395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
12495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
12595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
12695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
12795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
12895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
12995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
13095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
13195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
13295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
13395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
13495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
13595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
13695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
13795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
13895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
13995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
14095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley@ Te4[256]
14195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
14295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
14395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
14495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
14595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
14695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
14795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
14895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
14995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
15095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
15195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
15295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
15395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
15495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
15595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
15695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
15795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
15895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
15995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
16095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
16195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
16295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
16395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
16495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
16595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
16695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
16795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
16895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
16995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
17095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
17195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
17295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
17395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley@ rcon[]
17495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x01000000, 0x02000000, 0x04000000, 0x08000000
17595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x10000000, 0x20000000, 0x40000000, 0x80000000
17695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0
17795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.size	AES_Te,.-AES_Te
17895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
179eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley@ void asm_AES_encrypt(const unsigned char *in, unsigned char *out,
180eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley@ 		       const AES_KEY *key) {
181eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.global asm_AES_encrypt
182eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.hidden asm_AES_encrypt
183eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.type   asm_AES_encrypt,%function
18495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	5
185eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langleyasm_AES_encrypt:
18695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
187eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	sub	r3,pc,#8		@ asm_AES_encrypt
18895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
189eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	adr	r3,asm_AES_encrypt
19095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
19195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	stmdb   sp!,{r1,r4-r12,lr}
19295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,r0		@ inp
19395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$key,r2
194eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	sub	$tbl,r3,#asm_AES_encrypt-AES_Te	@ Te
19595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
19695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s0,[$rounds,#3]	@ load input data in endian-neutral
19795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#2]	@ manner...
19895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#1]
19995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#0]
20095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t1,lsl#8
20195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s1,[$rounds,#7]
20295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t2,lsl#16
20395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#6]
20495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t3,lsl#24
20595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#5]
20695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#4]
20795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t1,lsl#8
20895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s2,[$rounds,#11]
20995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t2,lsl#16
21095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#10]
21195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t3,lsl#24
21295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#9]
21395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#8]
21495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t1,lsl#8
21595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s3,[$rounds,#15]
21695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t2,lsl#16
21795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#14]
21895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t3,lsl#24
21995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#13]
22095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#12]
22195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t1,lsl#8
22295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t2,lsl#16
22395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t3,lsl#24
22495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
22595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s0,[$rounds,#0]
22695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s1,[$rounds,#4]
22795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s2,[$rounds,#8]
22895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s3,[$rounds,#12]
22995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef __ARMEL__
23095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s0,$s0
23195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s1,$s1
23295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s2,$s2
23395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s3,$s3
23495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
23595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
23695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bl	_armv4_AES_encrypt
23795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
23895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$rounds,[sp],#4		@ pop out
23995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=7
24095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef __ARMEL__
24195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s0,$s0
24295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s1,$s1
24395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s2,$s2
24495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s3,$s3
24595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
24695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$rounds,#0]
24795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$rounds,#4]
24895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$rounds,#8]
24995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$rounds,#12]
25095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
25195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t1,$s0,lsr#24		@ write output in endian-neutral
25295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t2,$s0,lsr#16		@ manner...
25395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t3,$s0,lsr#8
25495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t1,[$rounds,#0]
25595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t2,[$rounds,#1]
25695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t1,$s1,lsr#24
25795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t3,[$rounds,#2]
25895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t2,$s1,lsr#16
25995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$s0,[$rounds,#3]
26095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t3,$s1,lsr#8
26195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t1,[$rounds,#4]
26295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t2,[$rounds,#5]
26395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t1,$s2,lsr#24
26495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t3,[$rounds,#6]
26595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t2,$s2,lsr#16
26695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$s1,[$rounds,#7]
26795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t3,$s2,lsr#8
26895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t1,[$rounds,#8]
26995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t2,[$rounds,#9]
27095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t1,$s3,lsr#24
27195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t3,[$rounds,#10]
27295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t2,$s3,lsr#16
27395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$s2,[$rounds,#11]
27495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t3,$s3,lsr#8
27595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t1,[$rounds,#12]
27695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t2,[$rounds,#13]
27795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t3,[$rounds,#14]
27895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$s3,[$rounds,#15]
27995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
28095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=5
28195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia	sp!,{r4-r12,pc}
28295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
28395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia   sp!,{r4-r12,lr}
28495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	tst	lr,#1
28595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	moveq	pc,lr			@ be binary compatible with V4, yet
28695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bx	lr			@ interoperable with Thumb ISA:-)
28795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
288eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.size	asm_AES_encrypt,.-asm_AES_encrypt
28995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
29095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.type   _armv4_AES_encrypt,%function
29195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	2
29295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley_armv4_AES_encrypt:
29395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	lr,[sp,#-4]!		@ push lr
29495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia	$key!,{$t1-$i1}
29595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$t1
29695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$rounds,[$key,#240-16]
29795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$t2
29895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$t3
29995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$i1
30095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$rounds,$rounds,#1
30195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	lr,#255
30295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
30395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s0
30495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s0,lsr#8
30595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s0,lsr#16
30695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s0,$s0,lsr#24
30795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Lenc_loop:
30895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$tbl,$i1,lsl#2]	@ Te3[s0>>0]
30995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s1,lsr#16	@ i0
31095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$tbl,$i2,lsl#2]	@ Te2[s0>>8]
31195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s1
31295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$tbl,$i3,lsl#2]	@ Te1[s0>>16]
31395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s1,lsr#8
31495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s0,[$tbl,$s0,lsl#2]	@ Te0[s0>>24]
31595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s1,$s1,lsr#24
31695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
31795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$tbl,$i1,lsl#2]	@ Te1[s1>>16]
31895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$tbl,$i2,lsl#2]	@ Te3[s1>>0]
31995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$tbl,$i3,lsl#2]	@ Te2[s1>>8]
32095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1,ror#8
32195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s1,[$tbl,$s1,lsl#2]	@ Te0[s1>>24]
32295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s2,lsr#8	@ i0
32395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t2,$t2,$i2,ror#8
32495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s2,lsr#16	@ i1
32595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t3,$t3,$i3,ror#8
32695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s2
32795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$tbl,$i1,lsl#2]	@ Te2[s2>>8]
32895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$t1,ror#24
32995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$tbl,$i2,lsl#2]	@ Te1[s2>>16]
33095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s2,$s2,lsr#24
33195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
33295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$tbl,$i3,lsl#2]	@ Te3[s2>>0]
33395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1,ror#16
33495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s2,[$tbl,$s2,lsl#2]	@ Te0[s2>>24]
33595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s3		@ i0
33695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$i2,ror#8
33795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s3,lsr#8	@ i1
33895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t3,$t3,$i3,ror#16
33995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s3,lsr#16	@ i2
34095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$tbl,$i1,lsl#2]	@ Te3[s3>>0]
34195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$t2,ror#16
34295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$tbl,$i2,lsl#2]	@ Te2[s3>>8]
34395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s3,$s3,lsr#24
34495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
34595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$tbl,$i3,lsl#2]	@ Te1[s3>>16]
34695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1,ror#24
34795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$key],#16
34895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$i2,ror#16
34995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s3,[$tbl,$s3,lsl#2]	@ Te0[s3>>24]
35095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$i3,ror#8
35195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$key,#-12]
35295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$t3,ror#8
35395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
35495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$key,#-8]
35595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1
35695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$key,#-4]
35795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s0
35895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$t1
35995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s0,lsr#8
36095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$t2
36195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s0,lsr#16
36295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$t3
36395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s0,$s0,lsr#24
36495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
36595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	subs	$rounds,$rounds,#1
36695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.Lenc_loop
36795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
36895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$tbl,$tbl,#2
36995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
37095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$tbl,$i1,lsl#2]	@ Te4[s0>>0]
37195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s1,lsr#16	@ i0
37295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$tbl,$i2,lsl#2]	@ Te4[s0>>8]
37395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s1
37495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$tbl,$i3,lsl#2]	@ Te4[s0>>16]
37595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s1,lsr#8
37695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s0,[$tbl,$s0,lsl#2]	@ Te4[s0>>24]
37795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s1,$s1,lsr#24
37895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
37995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1,lsl#2]	@ Te4[s1>>16]
38095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2,lsl#2]	@ Te4[s1>>0]
38195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3,lsl#2]	@ Te4[s1>>8]
38295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$i1,$s0,lsl#8
38395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s1,[$tbl,$s1,lsl#2]	@ Te4[s1>>24]
38495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s2,lsr#8	@ i0
38595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t2,$i2,$t2,lsl#8
38695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s2,lsr#16	@ i1
38795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t3,$i3,$t3,lsl#8
38895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s2
38995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1,lsl#2]	@ Te4[s2>>8]
39095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$t1,$s1,lsl#24
39195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2,lsl#2]	@ Te4[s2>>16]
39295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s2,$s2,lsr#24
39395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
39495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3,lsl#2]	@ Te4[s2>>0]
39595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$i1,$s0,lsl#8
39695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s2,[$tbl,$s2,lsl#2]	@ Te4[s2>>24]
39795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s3		@ i0
39895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$i2,lsl#16
39995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s3,lsr#8	@ i1
40095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t3,$i3,$t3,lsl#8
40195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s3,lsr#16	@ i2
40295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1,lsl#2]	@ Te4[s3>>0]
40395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$t2,$s2,lsl#24
40495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2,lsl#2]	@ Te4[s3>>8]
40595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s3,$s3,lsr#24
40695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
40795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3,lsl#2]	@ Te4[s3>>16]
40895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$i1,$s0,lsl#8
40995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$key,#0]
41095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s3,[$tbl,$s3,lsl#2]	@ Te4[s3>>24]
41195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$i2,lsl#8
41295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$key,#4]
41395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$i3,lsl#16
41495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$key,#8]
41595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$t3,$s3,lsl#24
41695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$key,#12]
41795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
41895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1
41995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$t1
42095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$t2
42195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$t3
42295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
42395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$tbl,$tbl,#2
42495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	pc,[sp],#4		@ pop and return
42595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.size	_armv4_AES_encrypt,.-_armv4_AES_encrypt
42695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
427eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.global asm_AES_set_encrypt_key
428eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.hidden asm_AES_set_encrypt_key
429eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.type   asm_AES_set_encrypt_key,%function
43095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	5
431eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langleyasm_AES_set_encrypt_key:
43295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley_armv4_AES_set_encrypt_key:
43395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
434eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	sub	r3,pc,#8		@ asm_AES_set_encrypt_key
43595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
436eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	adr	r3,asm_AES_set_encrypt_key
43795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
43895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	r0,#0
43995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=7
44095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	itt	eq			@ Thumb2 thing, sanity check in ARM
44195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
44295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	moveq	r0,#-1
44395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	beq	.Labrt
44495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	r2,#0
44595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=7
44695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	itt	eq			@ Thumb2 thing, sanity check in ARM
44795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
44895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	moveq	r0,#-1
44995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	beq	.Labrt
45095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
45195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	r1,#128
45295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	beq	.Lok
45395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	r1,#192
45495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	beq	.Lok
45595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	r1,#256
45695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=7
45795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	itt	ne			@ Thumb2 thing, sanity check in ARM
45895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
45995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	movne	r0,#-1
46095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.Labrt
46195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
46295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Lok:	stmdb   sp!,{r4-r12,lr}
46395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024	@ Te4
46495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
46595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,r0		@ inp
46695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	lr,r1			@ bits
46795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$key,r2			@ key
46895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
46995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
47095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s0,[$rounds,#3]	@ load input data in endian-neutral
47195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#2]	@ manner...
47295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#1]
47395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#0]
47495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t1,lsl#8
47595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s1,[$rounds,#7]
47695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t2,lsl#16
47795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#6]
47895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t3,lsl#24
47995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#5]
48095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#4]
48195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t1,lsl#8
48295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s2,[$rounds,#11]
48395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t2,lsl#16
48495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#10]
48595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t3,lsl#24
48695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#9]
48795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#8]
48895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t1,lsl#8
48995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s3,[$rounds,#15]
49095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t2,lsl#16
49195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#14]
49295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t3,lsl#24
49395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#13]
49495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#12]
49595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t1,lsl#8
49695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$key],#16
49795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t2,lsl#16
49895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$key,#-12]
49995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t3,lsl#24
50095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$key,#-8]
50195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$key,#-4]
50295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
50395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s0,[$rounds,#0]
50495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s1,[$rounds,#4]
50595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s2,[$rounds,#8]
50695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s3,[$rounds,#12]
50795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef __ARMEL__
50895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s0,$s0
50995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s1,$s1
51095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s2,$s2
51195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s3,$s3
51295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
51395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$key],#16
51495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$key,#-12]
51595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$key,#-8]
51695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$key,#-4]
51795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
51895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
51995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	lr,#128
52095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.Lnot128
52195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,#10
52295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$rounds,[$key,#240-16]
52395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$t3,$tbl,#256			@ rcon
52495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	lr,#255
52595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
52695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.L128_loop:
52795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t2,lr,$s3,lsr#24
52895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s3,lsr#16
52995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$tbl,$t2]
53095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s3,lsr#8
53195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1]
53295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s3
53395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2]
53495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i1,lsl#24
53595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3]
53695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i2,lsl#16
53795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$t3],#4			@ rcon[i++]
53895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i3,lsl#8
53995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t2,$t2,$t1
54095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$t2			@ rk[4]=rk[0]^...
54195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$s0			@ rk[5]=rk[1]^rk[4]
54295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$key],#16
54395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$s1			@ rk[6]=rk[2]^rk[5]
54495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$key,#-12]
54595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$s2			@ rk[7]=rk[3]^rk[6]
54695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$key,#-8]
54795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	subs	$rounds,$rounds,#1
54895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$key,#-4]
54995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.L128_loop
55095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	r2,$key,#176
55195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	b	.Ldone
55295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
55395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Lnot128:
55495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
55595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$rounds,#19]
55695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#18]
55795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#17]
55895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#16]
55995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i2,$i2,$t1,lsl#8
56095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$rounds,#23]
56195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i2,$i2,$t2,lsl#16
56295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#22]
56395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i2,$i2,$t3,lsl#24
56495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#21]
56595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#20]
56695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i3,$i3,$t1,lsl#8
56795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i3,$i3,$t2,lsl#16
56895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i2,[$key],#8
56995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i3,$i3,$t3,lsl#24
57095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i3,[$key,#-4]
57195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
57295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$rounds,#16]
57395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$rounds,#20]
57495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef __ARMEL__
57595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$i2,$i2
57695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$i3,$i3
57795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
57895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i2,[$key],#8
57995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i3,[$key,#-4]
58095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
58195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
58295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	lr,#192
58395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.Lnot192
58495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,#12
58595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$rounds,[$key,#240-24]
58695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$t3,$tbl,#256			@ rcon
58795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	lr,#255
58895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,#8
58995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
59095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.L192_loop:
59195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t2,lr,$i3,lsr#24
59295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$i3,lsr#16
59395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$tbl,$t2]
59495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$i3,lsr#8
59595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1]
59695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$i3
59795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2]
59895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i1,lsl#24
59995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3]
60095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i2,lsl#16
60195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$t3],#4			@ rcon[i++]
60295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i3,lsl#8
60395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$i3,$t2,$t1
60495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i3			@ rk[6]=rk[0]^...
60595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$s0			@ rk[7]=rk[1]^rk[6]
60695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$key],#24
60795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$s1			@ rk[8]=rk[2]^rk[7]
60895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$key,#-20]
60995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$s2			@ rk[9]=rk[3]^rk[8]
61095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$key,#-16]
61195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	subs	$rounds,$rounds,#1
61295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$key,#-12]
61395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=7
61495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	itt	eq				@ Thumb2 thing, sanity check in ARM
61595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
61695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	subeq	r2,$key,#216
61795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	beq	.Ldone
61895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
61995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$key,#-32]
62095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$key,#-28]
62195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$i1,$i1,$s3			@ rk[10]=rk[4]^rk[9]
62295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$i3,$i2,$i1			@ rk[11]=rk[5]^rk[10]
62395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i1,[$key,#-8]
62495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i3,[$key,#-4]
62595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	b	.L192_loop
62695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
62795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Lnot192:
62895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
62995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$rounds,#27]
63095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#26]
63195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#25]
63295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#24]
63395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i2,$i2,$t1,lsl#8
63495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$rounds,#31]
63595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i2,$i2,$t2,lsl#16
63695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#30]
63795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i2,$i2,$t3,lsl#24
63895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#29]
63995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#28]
64095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i3,$i3,$t1,lsl#8
64195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i3,$i3,$t2,lsl#16
64295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i2,[$key],#8
64395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$i3,$i3,$t3,lsl#24
64495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i3,[$key,#-4]
64595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
64695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$rounds,#24]
64795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$rounds,#28]
64895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef __ARMEL__
64995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$i2,$i2
65095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$i3,$i3
65195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
65295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i2,[$key],#8
65395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i3,[$key,#-4]
65495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
65595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
65695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,#14
65795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$rounds,[$key,#240-32]
65895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$t3,$tbl,#256			@ rcon
65995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	lr,#255
66095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,#7
66195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
66295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.L256_loop:
66395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t2,lr,$i3,lsr#24
66495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$i3,lsr#16
66595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$tbl,$t2]
66695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$i3,lsr#8
66795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1]
66895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$i3
66995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2]
67095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i1,lsl#24
67195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3]
67295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i2,lsl#16
67395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$t3],#4			@ rcon[i++]
67495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i3,lsl#8
67595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$i3,$t2,$t1
67695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i3			@ rk[8]=rk[0]^...
67795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$s0			@ rk[9]=rk[1]^rk[8]
67895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$key],#32
67995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$s1			@ rk[10]=rk[2]^rk[9]
68095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$key,#-28]
68195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$s2			@ rk[11]=rk[3]^rk[10]
68295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$key,#-24]
68395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	subs	$rounds,$rounds,#1
68495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$key,#-20]
68595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=7
68695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	itt	eq				@ Thumb2 thing, sanity check in ARM
68795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
68895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	subeq	r2,$key,#256
68995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	beq	.Ldone
69095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
69195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t2,lr,$s3
69295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s3,lsr#8
69395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$tbl,$t2]
69495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s3,lsr#16
69595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1]
69695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s3,lsr#24
69795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2]
69895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i1,lsl#8
69995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3]
70095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i2,lsl#16
70195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$key,#-48]
70295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$t2,$t2,$i3,lsl#24
70395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
70495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$key,#-44]
70595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$key,#-40]
70695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t1,$t1,$t2			@ rk[12]=rk[4]^...
70795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$key,#-36]
70895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$i1,$i1,$t1			@ rk[13]=rk[5]^rk[12]
70995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$t1,[$key,#-16]
71095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$i2,$i2,$i1			@ rk[14]=rk[6]^rk[13]
71195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i1,[$key,#-12]
71295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$i3,$i3,$i2			@ rk[15]=rk[7]^rk[14]
71395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i2,[$key,#-8]
71495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i3,[$key,#-4]
71595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	b	.L256_loop
71695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
71795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	2
71895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Ldone:	mov	r0,#0
71995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia   sp!,{r4-r12,lr}
72095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Labrt:
72195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if defined(__thumb2__) && __ARM_ARCH__>=7
72295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	.short	0x4770			@ bx lr in Thumb2 encoding
72395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
72495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	tst	lr,#1
72595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	moveq	pc,lr			@ be binary compatible with V4, yet
72695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bx	lr			@ interoperable with Thumb ISA:-)
72795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
728eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.size	asm_AES_set_encrypt_key,.-asm_AES_set_encrypt_key
72995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
730eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.global asm_AES_set_decrypt_key
731eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.hidden asm_AES_set_decrypt_key
732eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.type   asm_AES_set_decrypt_key,%function
73395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	5
734eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langleyasm_AES_set_decrypt_key:
73595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	lr,[sp,#-4]!            @ push lr
73695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bl	_armv4_AES_set_encrypt_key
73795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	r0,#0
73895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	lr,[sp],#4              @ pop lr
73995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.Labrt
74095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
741eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	mov	r0,r2			@ asm_AES_set_encrypt_key preserves r2,
74295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	r1,r2			@ which is AES_KEY *key
74395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	b	_armv4_AES_set_enc2dec_key
744eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.size	asm_AES_set_decrypt_key,.-asm_AES_set_decrypt_key
74595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
74695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley@ void AES_set_enc2dec_key(const AES_KEY *inp,AES_KEY *out)
74795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.global	AES_set_enc2dec_key
748eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.hidden	AES_set_enc2dec_key
74995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.type	AES_set_enc2dec_key,%function
75095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	5
75195c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyAES_set_enc2dec_key:
75295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley_armv4_AES_set_enc2dec_key:
75395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	stmdb   sp!,{r4-r12,lr}
75495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
75595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$rounds,[r0,#240]
75695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$i1,r0			@ input
75795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$i2,r0,$rounds,lsl#4
75895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$key,r1			@ ouput
75995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$tbl,r1,$rounds,lsl#4
76095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$rounds,[r1,#240]
76195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
76295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Linv:	ldr	$s0,[$i1],#16
76395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s1,[$i1,#-12]
76495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s2,[$i1,#-8]
76595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s3,[$i1,#-4]
76695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$i2],#-16
76795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$i2,#16+4]
76895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$i2,#16+8]
76995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$i2,#16+12]
77095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$tbl],#-16
77195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$tbl,#16+4]
77295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$tbl,#16+8]
77395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$tbl,#16+12]
77495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$t1,[$key],#16
77595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$t2,[$key,#-12]
77695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$t3,[$key,#-8]
77795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$i3,[$key,#-4]
77895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	teq	$i1,$i2
77995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.Linv
78095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
78195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s0,[$i1]
78295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s1,[$i1,#4]
78395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s2,[$i1,#8]
78495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s3,[$i1,#12]
78595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$key]
78695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$key,#4]
78795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$key,#8]
78895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$key,#12]
78995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$key,$key,$rounds,lsl#3
79095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley___
79195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$mask80=$i1;
79295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$mask1b=$i2;
79395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$mask7f=$i3;
79495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$code.=<<___;
79595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s0,[$key,#16]!		@ prefetch tp1
79695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$mask80,#0x80
79795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$mask1b,#0x1b
79895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$mask80,$mask80,#0x8000
79995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$mask1b,$mask1b,#0x1b00
80095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$mask80,$mask80,$mask80,lsl#16
80195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$mask1b,$mask1b,$mask1b,lsl#16
80295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$rounds,$rounds,#1
80395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mvn	$mask7f,$mask80
80495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,$rounds,lsl#2	@ (rounds-1)*4
80595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
80695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Lmix:	and	$t1,$s0,$mask80
80795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$s1,$s0,$mask7f
80895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$t1,$t1,$t1,lsr#7
80995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t1,$t1,$mask1b
81095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$t1,$s1,lsl#1	@ tp2
81195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
81295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t1,$s1,$mask80
81395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$s2,$s1,$mask7f
81495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$t1,$t1,$t1,lsr#7
81595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t1,$t1,$mask1b
81695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$t1,$s2,lsl#1	@ tp4
81795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
81895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t1,$s2,$mask80
81995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$s3,$s2,$mask7f
82095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$t1,$t1,$t1,lsr#7
82195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$t1,$t1,$mask1b
82295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$t1,$s3,lsl#1	@ tp8
82395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
82495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t1,$s1,$s2
82595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t2,$s0,$s3		@ tp9
82695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t1,$t1,$s3		@ tpe
82795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t1,$t1,$s1,ror#24
82895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t1,$t1,$t2,ror#24	@ ^= ROTATE(tpb=tp9^tp2,8)
82995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t1,$t1,$s2,ror#16
83095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t1,$t1,$t2,ror#16	@ ^= ROTATE(tpd=tp9^tp4,16)
83195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t1,$t1,$t2,ror#8	@ ^= ROTATE(tp9,24)
83295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
83395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s0,[$key,#4]		@ prefetch tp1
83495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$t1,[$key],#4
83595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	subs	$rounds,$rounds,#1
83695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.Lmix
83795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
83895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	r0,#0
83995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=5
84095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia	sp!,{r4-r12,pc}
84195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
84295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia   sp!,{r4-r12,lr}
84395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	tst	lr,#1
84495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	moveq	pc,lr			@ be binary compatible with V4, yet
84595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bx	lr			@ interoperable with Thumb ISA:-)
84695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
84795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.size	AES_set_enc2dec_key,.-AES_set_enc2dec_key
84895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
84995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.type	AES_Td,%object
85095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	5
85195c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyAES_Td:
85295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
85395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
85495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
85595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
85695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
85795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
85895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
85995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
86095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
86195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
86295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
86395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
86495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
86595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
86695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
86795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
86895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
86995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
87095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
87195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
87295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
87395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
87495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
87595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
87695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
87795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
87895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
87995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
88095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
88195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
88295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
88395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
88495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
88595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
88695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
88795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
88895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
88995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
89095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
89195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
89295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
89395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
89495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
89595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
89695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
89795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
89895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
89995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
90095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
90195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
90295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
90395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
90495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
90595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
90695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
90795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
90895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
90995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
91095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
91195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
91295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
91395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
91495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
91595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.word	0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
91695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley@ Td4[256]
91795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
91895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
91995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
92095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
92195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
92295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
92395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
92495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
92595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
92695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
92795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
92895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
92995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
93095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
93195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
93295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
93395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
93495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
93595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
93695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
93795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
93895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
93995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
94095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
94195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
94295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
94395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
94495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
94595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
94695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
94795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
94895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.byte	0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
94995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.size	AES_Td,.-AES_Td
95095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
951eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley@ void asm_AES_decrypt(const unsigned char *in, unsigned char *out,
952eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley@ 		       const AES_KEY *key) {
953eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.global asm_AES_decrypt
954eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.hidden asm_AES_decrypt
955eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.type   asm_AES_decrypt,%function
95695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	5
957eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langleyasm_AES_decrypt:
95895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
959eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	sub	r3,pc,#8		@ asm_AES_decrypt
96095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
961eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	adr	r3,asm_AES_decrypt
96295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
96395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	stmdb   sp!,{r1,r4-r12,lr}
96495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$rounds,r0		@ inp
96595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$key,r2
966eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley	sub	$tbl,r3,#asm_AES_decrypt-AES_Td		@ Td
96795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__<7
96895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s0,[$rounds,#3]	@ load input data in endian-neutral
96995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#2]	@ manner...
97095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#1]
97195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#0]
97295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t1,lsl#8
97395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s1,[$rounds,#7]
97495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t2,lsl#16
97595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#6]
97695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s0,$s0,$t3,lsl#24
97795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#5]
97895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#4]
97995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t1,lsl#8
98095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s2,[$rounds,#11]
98195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t2,lsl#16
98295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#10]
98395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s1,$s1,$t3,lsl#24
98495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#9]
98595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#8]
98695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t1,lsl#8
98795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s3,[$rounds,#15]
98895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t2,lsl#16
98995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$rounds,#14]
99095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s2,$s2,$t3,lsl#24
99195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$rounds,#13]
99295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$rounds,#12]
99395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t1,lsl#8
99495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t2,lsl#16
99595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	orr	$s3,$s3,$t3,lsl#24
99695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
99795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s0,[$rounds,#0]
99895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s1,[$rounds,#4]
99995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s2,[$rounds,#8]
100095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s3,[$rounds,#12]
100195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef __ARMEL__
100295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s0,$s0
100395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s1,$s1
100495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s2,$s2
100595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s3,$s3
100695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
100795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
100895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bl	_armv4_AES_decrypt
100995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
101095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$rounds,[sp],#4		@ pop out
101195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=7
101295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef __ARMEL__
101395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s0,$s0
101495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s1,$s1
101595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s2,$s2
101695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rev	$s3,$s3
101795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
101895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s0,[$rounds,#0]
101995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s1,[$rounds,#4]
102095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s2,[$rounds,#8]
102195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	$s3,[$rounds,#12]
102295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
102395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t1,$s0,lsr#24		@ write output in endian-neutral
102495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t2,$s0,lsr#16		@ manner...
102595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t3,$s0,lsr#8
102695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t1,[$rounds,#0]
102795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t2,[$rounds,#1]
102895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t1,$s1,lsr#24
102995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t3,[$rounds,#2]
103095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t2,$s1,lsr#16
103195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$s0,[$rounds,#3]
103295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t3,$s1,lsr#8
103395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t1,[$rounds,#4]
103495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t2,[$rounds,#5]
103595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t1,$s2,lsr#24
103695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t3,[$rounds,#6]
103795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t2,$s2,lsr#16
103895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$s1,[$rounds,#7]
103995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t3,$s2,lsr#8
104095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t1,[$rounds,#8]
104195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t2,[$rounds,#9]
104295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t1,$s3,lsr#24
104395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t3,[$rounds,#10]
104495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t2,$s3,lsr#16
104595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$s2,[$rounds,#11]
104695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$t3,$s3,lsr#8
104795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t1,[$rounds,#12]
104895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t2,[$rounds,#13]
104995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$t3,[$rounds,#14]
105095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	strb	$s3,[$rounds,#15]
105195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
105295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if __ARM_ARCH__>=5
105395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia	sp!,{r4-r12,pc}
105495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#else
105595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia   sp!,{r4-r12,lr}
105695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	tst	lr,#1
105795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	moveq	pc,lr			@ be binary compatible with V4, yet
105895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bx	lr			@ interoperable with Thumb ISA:-)
105995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
1060eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley.size	asm_AES_decrypt,.-asm_AES_decrypt
106195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
106295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.type   _armv4_AES_decrypt,%function
106395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	2
106495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley_armv4_AES_decrypt:
106595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	str	lr,[sp,#-4]!		@ push lr
106695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldmia	$key!,{$t1-$i1}
106795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$t1
106895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$rounds,[$key,#240-16]
106995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$t2
107095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$t3
107195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$i1
107295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$rounds,$rounds,#1
107395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	lr,#255
107495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
107595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s0,lsr#16
107695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s0,lsr#8
107795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s0
107895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s0,$s0,lsr#24
107995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.Ldec_loop:
108095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$tbl,$i1,lsl#2]	@ Td1[s0>>16]
108195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s1		@ i0
108295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$tbl,$i2,lsl#2]	@ Td2[s0>>8]
108395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s1,lsr#16
108495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$tbl,$i3,lsl#2]	@ Td3[s0>>0]
108595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s1,lsr#8
108695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s0,[$tbl,$s0,lsl#2]	@ Td0[s0>>24]
108795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s1,$s1,lsr#24
108895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
108995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$tbl,$i1,lsl#2]	@ Td3[s1>>0]
109095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$tbl,$i2,lsl#2]	@ Td1[s1>>16]
109195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$tbl,$i3,lsl#2]	@ Td2[s1>>8]
109295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1,ror#24
109395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s1,[$tbl,$s1,lsl#2]	@ Td0[s1>>24]
109495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s2,lsr#8	@ i0
109595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t2,$i2,$t2,ror#8
109695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s2		@ i1
109795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t3,$i3,$t3,ror#8
109895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s2,lsr#16
109995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$tbl,$i1,lsl#2]	@ Td2[s2>>8]
110095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$t1,ror#8
110195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$tbl,$i2,lsl#2]	@ Td3[s2>>0]
110295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s2,$s2,lsr#24
110395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
110495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$tbl,$i3,lsl#2]	@ Td1[s2>>16]
110595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1,ror#16
110695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s2,[$tbl,$s2,lsl#2]	@ Td0[s2>>24]
110795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s3,lsr#16	@ i0
110895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$i2,ror#24
110995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s3,lsr#8	@ i1
111095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t3,$i3,$t3,ror#8
111195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s3		@ i2
111295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$tbl,$i1,lsl#2]	@ Td1[s3>>16]
111395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$t2,ror#8
111495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i2,[$tbl,$i2,lsl#2]	@ Td2[s3>>8]
111595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s3,$s3,lsr#24
111695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
111795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i3,[$tbl,$i3,lsl#2]	@ Td3[s3>>0]
111895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1,ror#8
111995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$key],#16
112095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$i2,ror#16
112195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$s3,[$tbl,$s3,lsl#2]	@ Td0[s3>>24]
112295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$i3,ror#24
112395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
112495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$key,#-12]
112595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1
112695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$key,#-8]
112795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$t3,ror#8
112895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$key,#-4]
112995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s0,lsr#16
113095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$t1
113195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s0,lsr#8
113295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$t2
113395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s0
113495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$t3
113595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	mov	$s0,$s0,lsr#24
113695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
113795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	subs	$rounds,$rounds,#1
113895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	bne	.Ldec_loop
113995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
114095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$tbl,$tbl,#1024
114195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
114295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$tbl,#0]		@ prefetch Td4
114395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$tbl,#32]
114495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$tbl,#64]
114595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$tbl,#96]
114695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$tbl,#128]
114795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$tbl,#160]
114895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$tbl,#192]
114995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$tbl,#224]
115095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
115195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s0,[$tbl,$s0]		@ Td4[s0>>24]
115295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t1,[$tbl,$i1]		@ Td4[s0>>16]
115395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s1		@ i0
115495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t2,[$tbl,$i2]		@ Td4[s0>>8]
115595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s1,lsr#16
115695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$t3,[$tbl,$i3]		@ Td4[s0>>0]
115795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s1,lsr#8
115895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
115995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$s1,$tbl,$s1,lsr#24
116095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1]		@ Td4[s1>>0]
116195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s1,[$s1]		@ Td4[s1>>24]
116295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2]		@ Td4[s1>>16]
116395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$i1,$s0,lsl#24
116495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3]		@ Td4[s1>>8]
116595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$t1,$s1,lsl#8
116695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s2,lsr#8	@ i0
116795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t2,$t2,$i2,lsl#8
116895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s2		@ i1
116995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1]		@ Td4[s2>>8]
117095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t3,$t3,$i3,lsl#8
117195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2]		@ Td4[s2>>0]
117295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s2,lsr#16
117395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
117495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$s2,$tbl,$s2,lsr#24
117595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s2,[$s2]		@ Td4[s2>>24]
117695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1,lsl#8
117795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3]		@ Td4[s2>>16]
117895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$i2,$s1,lsl#16
117995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i1,lr,$s3,lsr#16	@ i0
118095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$t2,$s2,lsl#16
118195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i2,lr,$s3,lsr#8	@ i1
118295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i1,[$tbl,$i1]		@ Td4[s3>>16]
118395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$t3,$t3,$i3,lsl#16
118495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i2,[$tbl,$i2]		@ Td4[s3>>8]
118595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	and	$i3,lr,$s3		@ i2
118695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
118795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	add	$s3,$tbl,$s3,lsr#24
118895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$i3,[$tbl,$i3]		@ Td4[s3>>0]
118995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldrb	$s3,[$s3]		@ Td4[s3>>24]
119095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1,lsl#16
119195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$i1,[$key,#0]
119295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$i2,lsl#8
119395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t1,[$key,#4]
119495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$i3,$s2,lsl#8
119595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t2,[$key,#8]
119695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$t3,$s3,lsl#24
119795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	$t3,[$key,#12]
119895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
119995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s0,$s0,$i1
120095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s1,$s1,$t1
120195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s2,$s2,$t2
120295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	eor	$s3,$s3,$t3
120395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
120495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sub	$tbl,$tbl,#1024
120595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ldr	pc,[sp],#4		@ pop and return
120695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.size	_armv4_AES_decrypt,.-_armv4_AES_decrypt
120795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.asciz	"AES for ARMv4, CRYPTOGAMS by <appro\@openssl.org>"
120895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley.align	2
120995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
121095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
121195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley___
121295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
121395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley$code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm;	# make it possible to compile with -march=armv4
121495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
121595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyopen SELF,$0;
121695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleywhile(<SELF>) {
121795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	next if (/^#!/);
121895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	last if (!s/^#/@/ and !/^$/);
121995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	print;
122095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley}
122195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyclose SELF;
122295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
122395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyprint $code;
122495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyclose STDOUT;	# enforce flush
1225