1 1.5 martin #include "arm_asm.h" 2 1.6 christos @ Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved. 3 1.3 christos @ 4 1.7 christos @ Licensed under the Apache License 2.0 (the "License"). You may not use 5 1.3 christos @ this file except in compliance with the License. You can obtain a copy 6 1.3 christos @ in the file LICENSE in the source distribution or at 7 1.3 christos @ https://www.openssl.org/source/license.html 8 1.3 christos 9 1.3 christos 10 1.3 christos @ ==================================================================== 11 1.3 christos @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL 12 1.3 christos @ project. The module is, however, dual licensed under OpenSSL and 13 1.3 christos @ CRYPTOGAMS licenses depending on where you obtain it. For further 14 1.3 christos @ details see http://www.openssl.org/~appro/cryptogams/. 15 1.3 christos @ 16 1.3 christos @ Permission to use under GPL terms is granted. 17 1.3 christos @ ==================================================================== 18 1.3 christos 19 1.3 christos @ SHA256 block procedure for ARMv4. May 2007. 20 1.3 christos 21 1.3 christos @ Performance is ~2x better than gcc 3.4 generated code and in "abso- 22 1.3 christos @ lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per 23 1.3 christos @ byte [on single-issue Xscale PXA250 core]. 24 1.3 christos 25 1.3 christos @ July 2010. 26 1.3 christos @ 27 1.3 christos @ Rescheduling for dual-issue pipeline resulted in 22% improvement on 28 1.3 christos @ Cortex A8 core and ~20 cycles per processed byte. 29 1.3 christos 30 1.3 christos @ February 2011. 31 1.3 christos @ 32 1.3 christos @ Profiler-assisted and platform-specific optimization resulted in 16% 33 1.3 christos @ improvement on Cortex A8 core and ~15.4 cycles per processed byte. 34 1.3 christos 35 1.3 christos @ September 2013. 36 1.3 christos @ 37 1.3 christos @ Add NEON implementation. On Cortex A8 it was measured to process one 38 1.3 christos @ byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon 39 1.3 christos @ S4 does it in 12.5 cycles too, but it's 50% faster than integer-only 40 1.3 christos @ code (meaning that latter performs sub-optimally, nothing was done 41 1.3 christos @ about it). 42 1.3 christos 43 1.3 christos @ May 2014. 44 1.3 christos @ 45 1.3 christos @ Add ARMv8 code path performing at 2.0 cpb on Apple A7. 46 1.3 christos 47 1.7 christos @ $output is the last argument if it looks like a file (it has an extension) 48 1.7 christos @ $flavour is the first argument if it doesn't look like a file 49 1.3 christos #ifndef __KERNEL__ 50 1.3 christos # include "arm_arch.h" 51 1.3 christos #else 52 1.3 christos # define __ARM_ARCH__ __LINUX_ARM_ARCH__ 53 1.3 christos # define __ARM_MAX_ARCH__ 7 54 1.3 christos #endif 55 1.1 martin 56 1.3 christos #if defined(__thumb2__) 57 1.3 christos .syntax unified 58 1.3 christos .thumb 59 1.3 christos #else 60 1.1 martin .code 32 61 1.3 christos #endif 62 1.1 martin 63 1.7 christos .text 64 1.7 christos 65 1.1 martin .type K256,%object 66 1.1 martin .align 5 67 1.1 martin K256: 68 1.1 martin .word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 69 1.1 martin .word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 70 1.1 martin .word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 71 1.1 martin .word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 72 1.1 martin .word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc 73 1.1 martin .word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da 74 1.1 martin .word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 75 1.1 martin .word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 76 1.1 martin .word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 77 1.1 martin .word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 78 1.1 martin .word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 79 1.1 martin .word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 80 1.1 martin .word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 81 1.1 martin .word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 82 1.1 martin .word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 83 1.1 martin .word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 84 1.1 martin .size K256,.-K256 85 1.1 martin .word 0 @ terminator 86 1.3 christos #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) 87 1.1 martin .LOPENSSL_armcap: 88 1.7 christos # ifdef _WIN32 89 1.7 christos .word OPENSSL_armcap_P 90 1.7 christos # else 91 1.3 christos .word OPENSSL_armcap_P-.Lsha256_block_data_order 92 1.7 christos # endif 93 1.1 martin #endif 94 1.1 martin .align 5 95 1.1 martin 96 1.3 christos .globl sha256_block_data_order 97 1.1 martin .type sha256_block_data_order,%function 98 1.1 martin sha256_block_data_order: 99 1.3 christos .Lsha256_block_data_order: 100 1.3 christos #if __ARM_ARCH__<7 && !defined(__thumb2__) 101 1.1 martin sub r3,pc,#8 @ sha256_block_data_order 102 1.3 christos #else 103 1.3 christos adr r3,.Lsha256_block_data_order 104 1.3 christos #endif 105 1.3 christos #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) 106 1.1 martin ldr r12,.LOPENSSL_armcap 107 1.7 christos # if !defined(_WIN32) 108 1.1 martin ldr r12,[r3,r12] @ OPENSSL_armcap_P 109 1.7 christos # endif 110 1.7 christos # if defined(__APPLE__) || defined(_WIN32) 111 1.3 christos ldr r12,[r12] 112 1.7 christos # endif 113 1.1 martin tst r12,#ARMV8_SHA256 114 1.1 martin bne .LARMv8 115 1.1 martin tst r12,#ARMV7_NEON 116 1.1 martin bne .LNEON 117 1.1 martin #endif 118 1.3 christos add r2,r1,r2,lsl#6 @ len to point at the end of inp 119 1.1 martin stmdb sp!,{r0,r1,r2,r4-r11,lr} 120 1.1 martin ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} 121 1.1 martin sub r14,r3,#256+32 @ K256 122 1.1 martin sub sp,sp,#16*4 @ alloca(X[16]) 123 1.1 martin .Loop: 124 1.1 martin # if __ARM_ARCH__>=7 125 1.1 martin ldr r2,[r1],#4 126 1.1 martin # else 127 1.1 martin ldrb r2,[r1,#3] 128 1.1 martin # endif 129 1.1 martin eor r3,r5,r6 @ magic 130 1.1 martin eor r12,r12,r12 131 1.1 martin #if __ARM_ARCH__>=7 132 1.1 martin @ ldr r2,[r1],#4 @ 0 133 1.1 martin # if 0==15 134 1.1 martin str r1,[sp,#17*4] @ make room for r1 135 1.1 martin # endif 136 1.1 martin eor r0,r8,r8,ror#5 137 1.1 martin add r4,r4,r12 @ h+=Maj(a,b,c) from the past 138 1.1 martin eor r0,r0,r8,ror#19 @ Sigma1(e) 139 1.3 christos # ifndef __ARMEB__ 140 1.1 martin rev r2,r2 141 1.3 christos # endif 142 1.1 martin #else 143 1.1 martin @ ldrb r2,[r1,#3] @ 0 144 1.1 martin add r4,r4,r12 @ h+=Maj(a,b,c) from the past 145 1.1 martin ldrb r12,[r1,#2] 146 1.1 martin ldrb r0,[r1,#1] 147 1.1 martin orr r2,r2,r12,lsl#8 148 1.1 martin ldrb r12,[r1],#4 149 1.1 martin orr r2,r2,r0,lsl#16 150 1.1 martin # if 0==15 151 1.1 martin str r1,[sp,#17*4] @ make room for r1 152 1.1 martin # endif 153 1.1 martin eor r0,r8,r8,ror#5 154 1.1 martin orr r2,r2,r12,lsl#24 155 1.1 martin eor r0,r0,r8,ror#19 @ Sigma1(e) 156 1.1 martin #endif 157 1.1 martin ldr r12,[r14],#4 @ *K256++ 158 1.1 martin add r11,r11,r2 @ h+=X[i] 159 1.1 martin str r2,[sp,#0*4] 160 1.1 martin eor r2,r9,r10 161 1.1 martin add r11,r11,r0,ror#6 @ h+=Sigma1(e) 162 1.1 martin and r2,r2,r8 163 1.1 martin add r11,r11,r12 @ h+=K256[i] 164 1.1 martin eor r2,r2,r10 @ Ch(e,f,g) 165 1.1 martin eor r0,r4,r4,ror#11 166 1.1 martin add r11,r11,r2 @ h+=Ch(e,f,g) 167 1.1 martin #if 0==31 168 1.1 martin and r12,r12,#0xff 169 1.1 martin cmp r12,#0xf2 @ done? 170 1.1 martin #endif 171 1.1 martin #if 0<15 172 1.1 martin # if __ARM_ARCH__>=7 173 1.1 martin ldr r2,[r1],#4 @ prefetch 174 1.1 martin # else 175 1.1 martin ldrb r2,[r1,#3] 176 1.1 martin # endif 177 1.1 martin eor r12,r4,r5 @ a^b, b^c in next round 178 1.1 martin #else 179 1.1 martin ldr r2,[sp,#2*4] @ from future BODY_16_xx 180 1.1 martin eor r12,r4,r5 @ a^b, b^c in next round 181 1.1 martin ldr r1,[sp,#15*4] @ from future BODY_16_xx 182 1.1 martin #endif 183 1.1 martin eor r0,r0,r4,ror#20 @ Sigma0(a) 184 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 185 1.1 martin add r7,r7,r11 @ d+=h 186 1.1 martin eor r3,r3,r5 @ Maj(a,b,c) 187 1.1 martin add r11,r11,r0,ror#2 @ h+=Sigma0(a) 188 1.1 martin @ add r11,r11,r3 @ h+=Maj(a,b,c) 189 1.1 martin #if __ARM_ARCH__>=7 190 1.1 martin @ ldr r2,[r1],#4 @ 1 191 1.1 martin # if 1==15 192 1.1 martin str r1,[sp,#17*4] @ make room for r1 193 1.1 martin # endif 194 1.1 martin eor r0,r7,r7,ror#5 195 1.1 martin add r11,r11,r3 @ h+=Maj(a,b,c) from the past 196 1.1 martin eor r0,r0,r7,ror#19 @ Sigma1(e) 197 1.3 christos # ifndef __ARMEB__ 198 1.1 martin rev r2,r2 199 1.3 christos # endif 200 1.1 martin #else 201 1.1 martin @ ldrb r2,[r1,#3] @ 1 202 1.1 martin add r11,r11,r3 @ h+=Maj(a,b,c) from the past 203 1.1 martin ldrb r3,[r1,#2] 204 1.1 martin ldrb r0,[r1,#1] 205 1.1 martin orr r2,r2,r3,lsl#8 206 1.1 martin ldrb r3,[r1],#4 207 1.1 martin orr r2,r2,r0,lsl#16 208 1.1 martin # if 1==15 209 1.1 martin str r1,[sp,#17*4] @ make room for r1 210 1.1 martin # endif 211 1.1 martin eor r0,r7,r7,ror#5 212 1.1 martin orr r2,r2,r3,lsl#24 213 1.1 martin eor r0,r0,r7,ror#19 @ Sigma1(e) 214 1.1 martin #endif 215 1.1 martin ldr r3,[r14],#4 @ *K256++ 216 1.1 martin add r10,r10,r2 @ h+=X[i] 217 1.1 martin str r2,[sp,#1*4] 218 1.1 martin eor r2,r8,r9 219 1.1 martin add r10,r10,r0,ror#6 @ h+=Sigma1(e) 220 1.1 martin and r2,r2,r7 221 1.1 martin add r10,r10,r3 @ h+=K256[i] 222 1.1 martin eor r2,r2,r9 @ Ch(e,f,g) 223 1.1 martin eor r0,r11,r11,ror#11 224 1.1 martin add r10,r10,r2 @ h+=Ch(e,f,g) 225 1.1 martin #if 1==31 226 1.1 martin and r3,r3,#0xff 227 1.1 martin cmp r3,#0xf2 @ done? 228 1.1 martin #endif 229 1.1 martin #if 1<15 230 1.1 martin # if __ARM_ARCH__>=7 231 1.1 martin ldr r2,[r1],#4 @ prefetch 232 1.1 martin # else 233 1.1 martin ldrb r2,[r1,#3] 234 1.1 martin # endif 235 1.1 martin eor r3,r11,r4 @ a^b, b^c in next round 236 1.1 martin #else 237 1.1 martin ldr r2,[sp,#3*4] @ from future BODY_16_xx 238 1.1 martin eor r3,r11,r4 @ a^b, b^c in next round 239 1.1 martin ldr r1,[sp,#0*4] @ from future BODY_16_xx 240 1.1 martin #endif 241 1.1 martin eor r0,r0,r11,ror#20 @ Sigma0(a) 242 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 243 1.1 martin add r6,r6,r10 @ d+=h 244 1.1 martin eor r12,r12,r4 @ Maj(a,b,c) 245 1.1 martin add r10,r10,r0,ror#2 @ h+=Sigma0(a) 246 1.1 martin @ add r10,r10,r12 @ h+=Maj(a,b,c) 247 1.1 martin #if __ARM_ARCH__>=7 248 1.1 martin @ ldr r2,[r1],#4 @ 2 249 1.1 martin # if 2==15 250 1.1 martin str r1,[sp,#17*4] @ make room for r1 251 1.1 martin # endif 252 1.1 martin eor r0,r6,r6,ror#5 253 1.1 martin add r10,r10,r12 @ h+=Maj(a,b,c) from the past 254 1.1 martin eor r0,r0,r6,ror#19 @ Sigma1(e) 255 1.3 christos # ifndef __ARMEB__ 256 1.1 martin rev r2,r2 257 1.3 christos # endif 258 1.1 martin #else 259 1.1 martin @ ldrb r2,[r1,#3] @ 2 260 1.1 martin add r10,r10,r12 @ h+=Maj(a,b,c) from the past 261 1.1 martin ldrb r12,[r1,#2] 262 1.1 martin ldrb r0,[r1,#1] 263 1.1 martin orr r2,r2,r12,lsl#8 264 1.1 martin ldrb r12,[r1],#4 265 1.1 martin orr r2,r2,r0,lsl#16 266 1.1 martin # if 2==15 267 1.1 martin str r1,[sp,#17*4] @ make room for r1 268 1.1 martin # endif 269 1.1 martin eor r0,r6,r6,ror#5 270 1.1 martin orr r2,r2,r12,lsl#24 271 1.1 martin eor r0,r0,r6,ror#19 @ Sigma1(e) 272 1.1 martin #endif 273 1.1 martin ldr r12,[r14],#4 @ *K256++ 274 1.1 martin add r9,r9,r2 @ h+=X[i] 275 1.1 martin str r2,[sp,#2*4] 276 1.1 martin eor r2,r7,r8 277 1.1 martin add r9,r9,r0,ror#6 @ h+=Sigma1(e) 278 1.1 martin and r2,r2,r6 279 1.1 martin add r9,r9,r12 @ h+=K256[i] 280 1.1 martin eor r2,r2,r8 @ Ch(e,f,g) 281 1.1 martin eor r0,r10,r10,ror#11 282 1.1 martin add r9,r9,r2 @ h+=Ch(e,f,g) 283 1.1 martin #if 2==31 284 1.1 martin and r12,r12,#0xff 285 1.1 martin cmp r12,#0xf2 @ done? 286 1.1 martin #endif 287 1.1 martin #if 2<15 288 1.1 martin # if __ARM_ARCH__>=7 289 1.1 martin ldr r2,[r1],#4 @ prefetch 290 1.1 martin # else 291 1.1 martin ldrb r2,[r1,#3] 292 1.1 martin # endif 293 1.1 martin eor r12,r10,r11 @ a^b, b^c in next round 294 1.1 martin #else 295 1.1 martin ldr r2,[sp,#4*4] @ from future BODY_16_xx 296 1.1 martin eor r12,r10,r11 @ a^b, b^c in next round 297 1.1 martin ldr r1,[sp,#1*4] @ from future BODY_16_xx 298 1.1 martin #endif 299 1.1 martin eor r0,r0,r10,ror#20 @ Sigma0(a) 300 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 301 1.1 martin add r5,r5,r9 @ d+=h 302 1.1 martin eor r3,r3,r11 @ Maj(a,b,c) 303 1.1 martin add r9,r9,r0,ror#2 @ h+=Sigma0(a) 304 1.1 martin @ add r9,r9,r3 @ h+=Maj(a,b,c) 305 1.1 martin #if __ARM_ARCH__>=7 306 1.1 martin @ ldr r2,[r1],#4 @ 3 307 1.1 martin # if 3==15 308 1.1 martin str r1,[sp,#17*4] @ make room for r1 309 1.1 martin # endif 310 1.1 martin eor r0,r5,r5,ror#5 311 1.1 martin add r9,r9,r3 @ h+=Maj(a,b,c) from the past 312 1.1 martin eor r0,r0,r5,ror#19 @ Sigma1(e) 313 1.3 christos # ifndef __ARMEB__ 314 1.1 martin rev r2,r2 315 1.3 christos # endif 316 1.1 martin #else 317 1.1 martin @ ldrb r2,[r1,#3] @ 3 318 1.1 martin add r9,r9,r3 @ h+=Maj(a,b,c) from the past 319 1.1 martin ldrb r3,[r1,#2] 320 1.1 martin ldrb r0,[r1,#1] 321 1.1 martin orr r2,r2,r3,lsl#8 322 1.1 martin ldrb r3,[r1],#4 323 1.1 martin orr r2,r2,r0,lsl#16 324 1.1 martin # if 3==15 325 1.1 martin str r1,[sp,#17*4] @ make room for r1 326 1.1 martin # endif 327 1.1 martin eor r0,r5,r5,ror#5 328 1.1 martin orr r2,r2,r3,lsl#24 329 1.1 martin eor r0,r0,r5,ror#19 @ Sigma1(e) 330 1.1 martin #endif 331 1.1 martin ldr r3,[r14],#4 @ *K256++ 332 1.1 martin add r8,r8,r2 @ h+=X[i] 333 1.1 martin str r2,[sp,#3*4] 334 1.1 martin eor r2,r6,r7 335 1.1 martin add r8,r8,r0,ror#6 @ h+=Sigma1(e) 336 1.1 martin and r2,r2,r5 337 1.1 martin add r8,r8,r3 @ h+=K256[i] 338 1.1 martin eor r2,r2,r7 @ Ch(e,f,g) 339 1.1 martin eor r0,r9,r9,ror#11 340 1.1 martin add r8,r8,r2 @ h+=Ch(e,f,g) 341 1.1 martin #if 3==31 342 1.1 martin and r3,r3,#0xff 343 1.1 martin cmp r3,#0xf2 @ done? 344 1.1 martin #endif 345 1.1 martin #if 3<15 346 1.1 martin # if __ARM_ARCH__>=7 347 1.1 martin ldr r2,[r1],#4 @ prefetch 348 1.1 martin # else 349 1.1 martin ldrb r2,[r1,#3] 350 1.1 martin # endif 351 1.1 martin eor r3,r9,r10 @ a^b, b^c in next round 352 1.1 martin #else 353 1.1 martin ldr r2,[sp,#5*4] @ from future BODY_16_xx 354 1.1 martin eor r3,r9,r10 @ a^b, b^c in next round 355 1.1 martin ldr r1,[sp,#2*4] @ from future BODY_16_xx 356 1.1 martin #endif 357 1.1 martin eor r0,r0,r9,ror#20 @ Sigma0(a) 358 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 359 1.1 martin add r4,r4,r8 @ d+=h 360 1.1 martin eor r12,r12,r10 @ Maj(a,b,c) 361 1.1 martin add r8,r8,r0,ror#2 @ h+=Sigma0(a) 362 1.1 martin @ add r8,r8,r12 @ h+=Maj(a,b,c) 363 1.1 martin #if __ARM_ARCH__>=7 364 1.1 martin @ ldr r2,[r1],#4 @ 4 365 1.1 martin # if 4==15 366 1.1 martin str r1,[sp,#17*4] @ make room for r1 367 1.1 martin # endif 368 1.1 martin eor r0,r4,r4,ror#5 369 1.1 martin add r8,r8,r12 @ h+=Maj(a,b,c) from the past 370 1.1 martin eor r0,r0,r4,ror#19 @ Sigma1(e) 371 1.3 christos # ifndef __ARMEB__ 372 1.1 martin rev r2,r2 373 1.3 christos # endif 374 1.1 martin #else 375 1.1 martin @ ldrb r2,[r1,#3] @ 4 376 1.1 martin add r8,r8,r12 @ h+=Maj(a,b,c) from the past 377 1.1 martin ldrb r12,[r1,#2] 378 1.1 martin ldrb r0,[r1,#1] 379 1.1 martin orr r2,r2,r12,lsl#8 380 1.1 martin ldrb r12,[r1],#4 381 1.1 martin orr r2,r2,r0,lsl#16 382 1.1 martin # if 4==15 383 1.1 martin str r1,[sp,#17*4] @ make room for r1 384 1.1 martin # endif 385 1.1 martin eor r0,r4,r4,ror#5 386 1.1 martin orr r2,r2,r12,lsl#24 387 1.1 martin eor r0,r0,r4,ror#19 @ Sigma1(e) 388 1.1 martin #endif 389 1.1 martin ldr r12,[r14],#4 @ *K256++ 390 1.1 martin add r7,r7,r2 @ h+=X[i] 391 1.1 martin str r2,[sp,#4*4] 392 1.1 martin eor r2,r5,r6 393 1.1 martin add r7,r7,r0,ror#6 @ h+=Sigma1(e) 394 1.1 martin and r2,r2,r4 395 1.1 martin add r7,r7,r12 @ h+=K256[i] 396 1.1 martin eor r2,r2,r6 @ Ch(e,f,g) 397 1.1 martin eor r0,r8,r8,ror#11 398 1.1 martin add r7,r7,r2 @ h+=Ch(e,f,g) 399 1.1 martin #if 4==31 400 1.1 martin and r12,r12,#0xff 401 1.1 martin cmp r12,#0xf2 @ done? 402 1.1 martin #endif 403 1.1 martin #if 4<15 404 1.1 martin # if __ARM_ARCH__>=7 405 1.1 martin ldr r2,[r1],#4 @ prefetch 406 1.1 martin # else 407 1.1 martin ldrb r2,[r1,#3] 408 1.1 martin # endif 409 1.1 martin eor r12,r8,r9 @ a^b, b^c in next round 410 1.1 martin #else 411 1.1 martin ldr r2,[sp,#6*4] @ from future BODY_16_xx 412 1.1 martin eor r12,r8,r9 @ a^b, b^c in next round 413 1.1 martin ldr r1,[sp,#3*4] @ from future BODY_16_xx 414 1.1 martin #endif 415 1.1 martin eor r0,r0,r8,ror#20 @ Sigma0(a) 416 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 417 1.1 martin add r11,r11,r7 @ d+=h 418 1.1 martin eor r3,r3,r9 @ Maj(a,b,c) 419 1.1 martin add r7,r7,r0,ror#2 @ h+=Sigma0(a) 420 1.1 martin @ add r7,r7,r3 @ h+=Maj(a,b,c) 421 1.1 martin #if __ARM_ARCH__>=7 422 1.1 martin @ ldr r2,[r1],#4 @ 5 423 1.1 martin # if 5==15 424 1.1 martin str r1,[sp,#17*4] @ make room for r1 425 1.1 martin # endif 426 1.1 martin eor r0,r11,r11,ror#5 427 1.1 martin add r7,r7,r3 @ h+=Maj(a,b,c) from the past 428 1.1 martin eor r0,r0,r11,ror#19 @ Sigma1(e) 429 1.3 christos # ifndef __ARMEB__ 430 1.1 martin rev r2,r2 431 1.3 christos # endif 432 1.1 martin #else 433 1.1 martin @ ldrb r2,[r1,#3] @ 5 434 1.1 martin add r7,r7,r3 @ h+=Maj(a,b,c) from the past 435 1.1 martin ldrb r3,[r1,#2] 436 1.1 martin ldrb r0,[r1,#1] 437 1.1 martin orr r2,r2,r3,lsl#8 438 1.1 martin ldrb r3,[r1],#4 439 1.1 martin orr r2,r2,r0,lsl#16 440 1.1 martin # if 5==15 441 1.1 martin str r1,[sp,#17*4] @ make room for r1 442 1.1 martin # endif 443 1.1 martin eor r0,r11,r11,ror#5 444 1.1 martin orr r2,r2,r3,lsl#24 445 1.1 martin eor r0,r0,r11,ror#19 @ Sigma1(e) 446 1.1 martin #endif 447 1.1 martin ldr r3,[r14],#4 @ *K256++ 448 1.1 martin add r6,r6,r2 @ h+=X[i] 449 1.1 martin str r2,[sp,#5*4] 450 1.1 martin eor r2,r4,r5 451 1.1 martin add r6,r6,r0,ror#6 @ h+=Sigma1(e) 452 1.1 martin and r2,r2,r11 453 1.1 martin add r6,r6,r3 @ h+=K256[i] 454 1.1 martin eor r2,r2,r5 @ Ch(e,f,g) 455 1.1 martin eor r0,r7,r7,ror#11 456 1.1 martin add r6,r6,r2 @ h+=Ch(e,f,g) 457 1.1 martin #if 5==31 458 1.1 martin and r3,r3,#0xff 459 1.1 martin cmp r3,#0xf2 @ done? 460 1.1 martin #endif 461 1.1 martin #if 5<15 462 1.1 martin # if __ARM_ARCH__>=7 463 1.1 martin ldr r2,[r1],#4 @ prefetch 464 1.1 martin # else 465 1.1 martin ldrb r2,[r1,#3] 466 1.1 martin # endif 467 1.1 martin eor r3,r7,r8 @ a^b, b^c in next round 468 1.1 martin #else 469 1.1 martin ldr r2,[sp,#7*4] @ from future BODY_16_xx 470 1.1 martin eor r3,r7,r8 @ a^b, b^c in next round 471 1.1 martin ldr r1,[sp,#4*4] @ from future BODY_16_xx 472 1.1 martin #endif 473 1.1 martin eor r0,r0,r7,ror#20 @ Sigma0(a) 474 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 475 1.1 martin add r10,r10,r6 @ d+=h 476 1.1 martin eor r12,r12,r8 @ Maj(a,b,c) 477 1.1 martin add r6,r6,r0,ror#2 @ h+=Sigma0(a) 478 1.1 martin @ add r6,r6,r12 @ h+=Maj(a,b,c) 479 1.1 martin #if __ARM_ARCH__>=7 480 1.1 martin @ ldr r2,[r1],#4 @ 6 481 1.1 martin # if 6==15 482 1.1 martin str r1,[sp,#17*4] @ make room for r1 483 1.1 martin # endif 484 1.1 martin eor r0,r10,r10,ror#5 485 1.1 martin add r6,r6,r12 @ h+=Maj(a,b,c) from the past 486 1.1 martin eor r0,r0,r10,ror#19 @ Sigma1(e) 487 1.3 christos # ifndef __ARMEB__ 488 1.1 martin rev r2,r2 489 1.3 christos # endif 490 1.1 martin #else 491 1.1 martin @ ldrb r2,[r1,#3] @ 6 492 1.1 martin add r6,r6,r12 @ h+=Maj(a,b,c) from the past 493 1.1 martin ldrb r12,[r1,#2] 494 1.1 martin ldrb r0,[r1,#1] 495 1.1 martin orr r2,r2,r12,lsl#8 496 1.1 martin ldrb r12,[r1],#4 497 1.1 martin orr r2,r2,r0,lsl#16 498 1.1 martin # if 6==15 499 1.1 martin str r1,[sp,#17*4] @ make room for r1 500 1.1 martin # endif 501 1.1 martin eor r0,r10,r10,ror#5 502 1.1 martin orr r2,r2,r12,lsl#24 503 1.1 martin eor r0,r0,r10,ror#19 @ Sigma1(e) 504 1.1 martin #endif 505 1.1 martin ldr r12,[r14],#4 @ *K256++ 506 1.1 martin add r5,r5,r2 @ h+=X[i] 507 1.1 martin str r2,[sp,#6*4] 508 1.1 martin eor r2,r11,r4 509 1.1 martin add r5,r5,r0,ror#6 @ h+=Sigma1(e) 510 1.1 martin and r2,r2,r10 511 1.1 martin add r5,r5,r12 @ h+=K256[i] 512 1.1 martin eor r2,r2,r4 @ Ch(e,f,g) 513 1.1 martin eor r0,r6,r6,ror#11 514 1.1 martin add r5,r5,r2 @ h+=Ch(e,f,g) 515 1.1 martin #if 6==31 516 1.1 martin and r12,r12,#0xff 517 1.1 martin cmp r12,#0xf2 @ done? 518 1.1 martin #endif 519 1.1 martin #if 6<15 520 1.1 martin # if __ARM_ARCH__>=7 521 1.1 martin ldr r2,[r1],#4 @ prefetch 522 1.1 martin # else 523 1.1 martin ldrb r2,[r1,#3] 524 1.1 martin # endif 525 1.1 martin eor r12,r6,r7 @ a^b, b^c in next round 526 1.1 martin #else 527 1.1 martin ldr r2,[sp,#8*4] @ from future BODY_16_xx 528 1.1 martin eor r12,r6,r7 @ a^b, b^c in next round 529 1.1 martin ldr r1,[sp,#5*4] @ from future BODY_16_xx 530 1.1 martin #endif 531 1.1 martin eor r0,r0,r6,ror#20 @ Sigma0(a) 532 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 533 1.1 martin add r9,r9,r5 @ d+=h 534 1.1 martin eor r3,r3,r7 @ Maj(a,b,c) 535 1.1 martin add r5,r5,r0,ror#2 @ h+=Sigma0(a) 536 1.1 martin @ add r5,r5,r3 @ h+=Maj(a,b,c) 537 1.1 martin #if __ARM_ARCH__>=7 538 1.1 martin @ ldr r2,[r1],#4 @ 7 539 1.1 martin # if 7==15 540 1.1 martin str r1,[sp,#17*4] @ make room for r1 541 1.1 martin # endif 542 1.1 martin eor r0,r9,r9,ror#5 543 1.1 martin add r5,r5,r3 @ h+=Maj(a,b,c) from the past 544 1.1 martin eor r0,r0,r9,ror#19 @ Sigma1(e) 545 1.3 christos # ifndef __ARMEB__ 546 1.1 martin rev r2,r2 547 1.3 christos # endif 548 1.1 martin #else 549 1.1 martin @ ldrb r2,[r1,#3] @ 7 550 1.1 martin add r5,r5,r3 @ h+=Maj(a,b,c) from the past 551 1.1 martin ldrb r3,[r1,#2] 552 1.1 martin ldrb r0,[r1,#1] 553 1.1 martin orr r2,r2,r3,lsl#8 554 1.1 martin ldrb r3,[r1],#4 555 1.1 martin orr r2,r2,r0,lsl#16 556 1.1 martin # if 7==15 557 1.1 martin str r1,[sp,#17*4] @ make room for r1 558 1.1 martin # endif 559 1.1 martin eor r0,r9,r9,ror#5 560 1.1 martin orr r2,r2,r3,lsl#24 561 1.1 martin eor r0,r0,r9,ror#19 @ Sigma1(e) 562 1.1 martin #endif 563 1.1 martin ldr r3,[r14],#4 @ *K256++ 564 1.1 martin add r4,r4,r2 @ h+=X[i] 565 1.1 martin str r2,[sp,#7*4] 566 1.1 martin eor r2,r10,r11 567 1.1 martin add r4,r4,r0,ror#6 @ h+=Sigma1(e) 568 1.1 martin and r2,r2,r9 569 1.1 martin add r4,r4,r3 @ h+=K256[i] 570 1.1 martin eor r2,r2,r11 @ Ch(e,f,g) 571 1.1 martin eor r0,r5,r5,ror#11 572 1.1 martin add r4,r4,r2 @ h+=Ch(e,f,g) 573 1.1 martin #if 7==31 574 1.1 martin and r3,r3,#0xff 575 1.1 martin cmp r3,#0xf2 @ done? 576 1.1 martin #endif 577 1.1 martin #if 7<15 578 1.1 martin # if __ARM_ARCH__>=7 579 1.1 martin ldr r2,[r1],#4 @ prefetch 580 1.1 martin # else 581 1.1 martin ldrb r2,[r1,#3] 582 1.1 martin # endif 583 1.1 martin eor r3,r5,r6 @ a^b, b^c in next round 584 1.1 martin #else 585 1.1 martin ldr r2,[sp,#9*4] @ from future BODY_16_xx 586 1.1 martin eor r3,r5,r6 @ a^b, b^c in next round 587 1.1 martin ldr r1,[sp,#6*4] @ from future BODY_16_xx 588 1.1 martin #endif 589 1.1 martin eor r0,r0,r5,ror#20 @ Sigma0(a) 590 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 591 1.1 martin add r8,r8,r4 @ d+=h 592 1.1 martin eor r12,r12,r6 @ Maj(a,b,c) 593 1.1 martin add r4,r4,r0,ror#2 @ h+=Sigma0(a) 594 1.1 martin @ add r4,r4,r12 @ h+=Maj(a,b,c) 595 1.1 martin #if __ARM_ARCH__>=7 596 1.1 martin @ ldr r2,[r1],#4 @ 8 597 1.1 martin # if 8==15 598 1.1 martin str r1,[sp,#17*4] @ make room for r1 599 1.1 martin # endif 600 1.1 martin eor r0,r8,r8,ror#5 601 1.1 martin add r4,r4,r12 @ h+=Maj(a,b,c) from the past 602 1.1 martin eor r0,r0,r8,ror#19 @ Sigma1(e) 603 1.3 christos # ifndef __ARMEB__ 604 1.1 martin rev r2,r2 605 1.3 christos # endif 606 1.1 martin #else 607 1.1 martin @ ldrb r2,[r1,#3] @ 8 608 1.1 martin add r4,r4,r12 @ h+=Maj(a,b,c) from the past 609 1.1 martin ldrb r12,[r1,#2] 610 1.1 martin ldrb r0,[r1,#1] 611 1.1 martin orr r2,r2,r12,lsl#8 612 1.1 martin ldrb r12,[r1],#4 613 1.1 martin orr r2,r2,r0,lsl#16 614 1.1 martin # if 8==15 615 1.1 martin str r1,[sp,#17*4] @ make room for r1 616 1.1 martin # endif 617 1.1 martin eor r0,r8,r8,ror#5 618 1.1 martin orr r2,r2,r12,lsl#24 619 1.1 martin eor r0,r0,r8,ror#19 @ Sigma1(e) 620 1.1 martin #endif 621 1.1 martin ldr r12,[r14],#4 @ *K256++ 622 1.1 martin add r11,r11,r2 @ h+=X[i] 623 1.1 martin str r2,[sp,#8*4] 624 1.1 martin eor r2,r9,r10 625 1.1 martin add r11,r11,r0,ror#6 @ h+=Sigma1(e) 626 1.1 martin and r2,r2,r8 627 1.1 martin add r11,r11,r12 @ h+=K256[i] 628 1.1 martin eor r2,r2,r10 @ Ch(e,f,g) 629 1.1 martin eor r0,r4,r4,ror#11 630 1.1 martin add r11,r11,r2 @ h+=Ch(e,f,g) 631 1.1 martin #if 8==31 632 1.1 martin and r12,r12,#0xff 633 1.1 martin cmp r12,#0xf2 @ done? 634 1.1 martin #endif 635 1.1 martin #if 8<15 636 1.1 martin # if __ARM_ARCH__>=7 637 1.1 martin ldr r2,[r1],#4 @ prefetch 638 1.1 martin # else 639 1.1 martin ldrb r2,[r1,#3] 640 1.1 martin # endif 641 1.1 martin eor r12,r4,r5 @ a^b, b^c in next round 642 1.1 martin #else 643 1.1 martin ldr r2,[sp,#10*4] @ from future BODY_16_xx 644 1.1 martin eor r12,r4,r5 @ a^b, b^c in next round 645 1.1 martin ldr r1,[sp,#7*4] @ from future BODY_16_xx 646 1.1 martin #endif 647 1.1 martin eor r0,r0,r4,ror#20 @ Sigma0(a) 648 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 649 1.1 martin add r7,r7,r11 @ d+=h 650 1.1 martin eor r3,r3,r5 @ Maj(a,b,c) 651 1.1 martin add r11,r11,r0,ror#2 @ h+=Sigma0(a) 652 1.1 martin @ add r11,r11,r3 @ h+=Maj(a,b,c) 653 1.1 martin #if __ARM_ARCH__>=7 654 1.1 martin @ ldr r2,[r1],#4 @ 9 655 1.1 martin # if 9==15 656 1.1 martin str r1,[sp,#17*4] @ make room for r1 657 1.1 martin # endif 658 1.1 martin eor r0,r7,r7,ror#5 659 1.1 martin add r11,r11,r3 @ h+=Maj(a,b,c) from the past 660 1.1 martin eor r0,r0,r7,ror#19 @ Sigma1(e) 661 1.3 christos # ifndef __ARMEB__ 662 1.1 martin rev r2,r2 663 1.3 christos # endif 664 1.1 martin #else 665 1.1 martin @ ldrb r2,[r1,#3] @ 9 666 1.1 martin add r11,r11,r3 @ h+=Maj(a,b,c) from the past 667 1.1 martin ldrb r3,[r1,#2] 668 1.1 martin ldrb r0,[r1,#1] 669 1.1 martin orr r2,r2,r3,lsl#8 670 1.1 martin ldrb r3,[r1],#4 671 1.1 martin orr r2,r2,r0,lsl#16 672 1.1 martin # if 9==15 673 1.1 martin str r1,[sp,#17*4] @ make room for r1 674 1.1 martin # endif 675 1.1 martin eor r0,r7,r7,ror#5 676 1.1 martin orr r2,r2,r3,lsl#24 677 1.1 martin eor r0,r0,r7,ror#19 @ Sigma1(e) 678 1.1 martin #endif 679 1.1 martin ldr r3,[r14],#4 @ *K256++ 680 1.1 martin add r10,r10,r2 @ h+=X[i] 681 1.1 martin str r2,[sp,#9*4] 682 1.1 martin eor r2,r8,r9 683 1.1 martin add r10,r10,r0,ror#6 @ h+=Sigma1(e) 684 1.1 martin and r2,r2,r7 685 1.1 martin add r10,r10,r3 @ h+=K256[i] 686 1.1 martin eor r2,r2,r9 @ Ch(e,f,g) 687 1.1 martin eor r0,r11,r11,ror#11 688 1.1 martin add r10,r10,r2 @ h+=Ch(e,f,g) 689 1.1 martin #if 9==31 690 1.1 martin and r3,r3,#0xff 691 1.1 martin cmp r3,#0xf2 @ done? 692 1.1 martin #endif 693 1.1 martin #if 9<15 694 1.1 martin # if __ARM_ARCH__>=7 695 1.1 martin ldr r2,[r1],#4 @ prefetch 696 1.1 martin # else 697 1.1 martin ldrb r2,[r1,#3] 698 1.1 martin # endif 699 1.1 martin eor r3,r11,r4 @ a^b, b^c in next round 700 1.1 martin #else 701 1.1 martin ldr r2,[sp,#11*4] @ from future BODY_16_xx 702 1.1 martin eor r3,r11,r4 @ a^b, b^c in next round 703 1.1 martin ldr r1,[sp,#8*4] @ from future BODY_16_xx 704 1.1 martin #endif 705 1.1 martin eor r0,r0,r11,ror#20 @ Sigma0(a) 706 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 707 1.1 martin add r6,r6,r10 @ d+=h 708 1.1 martin eor r12,r12,r4 @ Maj(a,b,c) 709 1.1 martin add r10,r10,r0,ror#2 @ h+=Sigma0(a) 710 1.1 martin @ add r10,r10,r12 @ h+=Maj(a,b,c) 711 1.1 martin #if __ARM_ARCH__>=7 712 1.1 martin @ ldr r2,[r1],#4 @ 10 713 1.1 martin # if 10==15 714 1.1 martin str r1,[sp,#17*4] @ make room for r1 715 1.1 martin # endif 716 1.1 martin eor r0,r6,r6,ror#5 717 1.1 martin add r10,r10,r12 @ h+=Maj(a,b,c) from the past 718 1.1 martin eor r0,r0,r6,ror#19 @ Sigma1(e) 719 1.3 christos # ifndef __ARMEB__ 720 1.1 martin rev r2,r2 721 1.3 christos # endif 722 1.1 martin #else 723 1.1 martin @ ldrb r2,[r1,#3] @ 10 724 1.1 martin add r10,r10,r12 @ h+=Maj(a,b,c) from the past 725 1.1 martin ldrb r12,[r1,#2] 726 1.1 martin ldrb r0,[r1,#1] 727 1.1 martin orr r2,r2,r12,lsl#8 728 1.1 martin ldrb r12,[r1],#4 729 1.1 martin orr r2,r2,r0,lsl#16 730 1.1 martin # if 10==15 731 1.1 martin str r1,[sp,#17*4] @ make room for r1 732 1.1 martin # endif 733 1.1 martin eor r0,r6,r6,ror#5 734 1.1 martin orr r2,r2,r12,lsl#24 735 1.1 martin eor r0,r0,r6,ror#19 @ Sigma1(e) 736 1.1 martin #endif 737 1.1 martin ldr r12,[r14],#4 @ *K256++ 738 1.1 martin add r9,r9,r2 @ h+=X[i] 739 1.1 martin str r2,[sp,#10*4] 740 1.1 martin eor r2,r7,r8 741 1.1 martin add r9,r9,r0,ror#6 @ h+=Sigma1(e) 742 1.1 martin and r2,r2,r6 743 1.1 martin add r9,r9,r12 @ h+=K256[i] 744 1.1 martin eor r2,r2,r8 @ Ch(e,f,g) 745 1.1 martin eor r0,r10,r10,ror#11 746 1.1 martin add r9,r9,r2 @ h+=Ch(e,f,g) 747 1.1 martin #if 10==31 748 1.1 martin and r12,r12,#0xff 749 1.1 martin cmp r12,#0xf2 @ done? 750 1.1 martin #endif 751 1.1 martin #if 10<15 752 1.1 martin # if __ARM_ARCH__>=7 753 1.1 martin ldr r2,[r1],#4 @ prefetch 754 1.1 martin # else 755 1.1 martin ldrb r2,[r1,#3] 756 1.1 martin # endif 757 1.1 martin eor r12,r10,r11 @ a^b, b^c in next round 758 1.1 martin #else 759 1.1 martin ldr r2,[sp,#12*4] @ from future BODY_16_xx 760 1.1 martin eor r12,r10,r11 @ a^b, b^c in next round 761 1.1 martin ldr r1,[sp,#9*4] @ from future BODY_16_xx 762 1.1 martin #endif 763 1.1 martin eor r0,r0,r10,ror#20 @ Sigma0(a) 764 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 765 1.1 martin add r5,r5,r9 @ d+=h 766 1.1 martin eor r3,r3,r11 @ Maj(a,b,c) 767 1.1 martin add r9,r9,r0,ror#2 @ h+=Sigma0(a) 768 1.1 martin @ add r9,r9,r3 @ h+=Maj(a,b,c) 769 1.1 martin #if __ARM_ARCH__>=7 770 1.1 martin @ ldr r2,[r1],#4 @ 11 771 1.1 martin # if 11==15 772 1.1 martin str r1,[sp,#17*4] @ make room for r1 773 1.1 martin # endif 774 1.1 martin eor r0,r5,r5,ror#5 775 1.1 martin add r9,r9,r3 @ h+=Maj(a,b,c) from the past 776 1.1 martin eor r0,r0,r5,ror#19 @ Sigma1(e) 777 1.3 christos # ifndef __ARMEB__ 778 1.1 martin rev r2,r2 779 1.3 christos # endif 780 1.1 martin #else 781 1.1 martin @ ldrb r2,[r1,#3] @ 11 782 1.1 martin add r9,r9,r3 @ h+=Maj(a,b,c) from the past 783 1.1 martin ldrb r3,[r1,#2] 784 1.1 martin ldrb r0,[r1,#1] 785 1.1 martin orr r2,r2,r3,lsl#8 786 1.1 martin ldrb r3,[r1],#4 787 1.1 martin orr r2,r2,r0,lsl#16 788 1.1 martin # if 11==15 789 1.1 martin str r1,[sp,#17*4] @ make room for r1 790 1.1 martin # endif 791 1.1 martin eor r0,r5,r5,ror#5 792 1.1 martin orr r2,r2,r3,lsl#24 793 1.1 martin eor r0,r0,r5,ror#19 @ Sigma1(e) 794 1.1 martin #endif 795 1.1 martin ldr r3,[r14],#4 @ *K256++ 796 1.1 martin add r8,r8,r2 @ h+=X[i] 797 1.1 martin str r2,[sp,#11*4] 798 1.1 martin eor r2,r6,r7 799 1.1 martin add r8,r8,r0,ror#6 @ h+=Sigma1(e) 800 1.1 martin and r2,r2,r5 801 1.1 martin add r8,r8,r3 @ h+=K256[i] 802 1.1 martin eor r2,r2,r7 @ Ch(e,f,g) 803 1.1 martin eor r0,r9,r9,ror#11 804 1.1 martin add r8,r8,r2 @ h+=Ch(e,f,g) 805 1.1 martin #if 11==31 806 1.1 martin and r3,r3,#0xff 807 1.1 martin cmp r3,#0xf2 @ done? 808 1.1 martin #endif 809 1.1 martin #if 11<15 810 1.1 martin # if __ARM_ARCH__>=7 811 1.1 martin ldr r2,[r1],#4 @ prefetch 812 1.1 martin # else 813 1.1 martin ldrb r2,[r1,#3] 814 1.1 martin # endif 815 1.1 martin eor r3,r9,r10 @ a^b, b^c in next round 816 1.1 martin #else 817 1.1 martin ldr r2,[sp,#13*4] @ from future BODY_16_xx 818 1.1 martin eor r3,r9,r10 @ a^b, b^c in next round 819 1.1 martin ldr r1,[sp,#10*4] @ from future BODY_16_xx 820 1.1 martin #endif 821 1.1 martin eor r0,r0,r9,ror#20 @ Sigma0(a) 822 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 823 1.1 martin add r4,r4,r8 @ d+=h 824 1.1 martin eor r12,r12,r10 @ Maj(a,b,c) 825 1.1 martin add r8,r8,r0,ror#2 @ h+=Sigma0(a) 826 1.1 martin @ add r8,r8,r12 @ h+=Maj(a,b,c) 827 1.1 martin #if __ARM_ARCH__>=7 828 1.1 martin @ ldr r2,[r1],#4 @ 12 829 1.1 martin # if 12==15 830 1.1 martin str r1,[sp,#17*4] @ make room for r1 831 1.1 martin # endif 832 1.1 martin eor r0,r4,r4,ror#5 833 1.1 martin add r8,r8,r12 @ h+=Maj(a,b,c) from the past 834 1.1 martin eor r0,r0,r4,ror#19 @ Sigma1(e) 835 1.3 christos # ifndef __ARMEB__ 836 1.1 martin rev r2,r2 837 1.3 christos # endif 838 1.1 martin #else 839 1.1 martin @ ldrb r2,[r1,#3] @ 12 840 1.1 martin add r8,r8,r12 @ h+=Maj(a,b,c) from the past 841 1.1 martin ldrb r12,[r1,#2] 842 1.1 martin ldrb r0,[r1,#1] 843 1.1 martin orr r2,r2,r12,lsl#8 844 1.1 martin ldrb r12,[r1],#4 845 1.1 martin orr r2,r2,r0,lsl#16 846 1.1 martin # if 12==15 847 1.1 martin str r1,[sp,#17*4] @ make room for r1 848 1.1 martin # endif 849 1.1 martin eor r0,r4,r4,ror#5 850 1.1 martin orr r2,r2,r12,lsl#24 851 1.1 martin eor r0,r0,r4,ror#19 @ Sigma1(e) 852 1.1 martin #endif 853 1.1 martin ldr r12,[r14],#4 @ *K256++ 854 1.1 martin add r7,r7,r2 @ h+=X[i] 855 1.1 martin str r2,[sp,#12*4] 856 1.1 martin eor r2,r5,r6 857 1.1 martin add r7,r7,r0,ror#6 @ h+=Sigma1(e) 858 1.1 martin and r2,r2,r4 859 1.1 martin add r7,r7,r12 @ h+=K256[i] 860 1.1 martin eor r2,r2,r6 @ Ch(e,f,g) 861 1.1 martin eor r0,r8,r8,ror#11 862 1.1 martin add r7,r7,r2 @ h+=Ch(e,f,g) 863 1.1 martin #if 12==31 864 1.1 martin and r12,r12,#0xff 865 1.1 martin cmp r12,#0xf2 @ done? 866 1.1 martin #endif 867 1.1 martin #if 12<15 868 1.1 martin # if __ARM_ARCH__>=7 869 1.1 martin ldr r2,[r1],#4 @ prefetch 870 1.1 martin # else 871 1.1 martin ldrb r2,[r1,#3] 872 1.1 martin # endif 873 1.1 martin eor r12,r8,r9 @ a^b, b^c in next round 874 1.1 martin #else 875 1.1 martin ldr r2,[sp,#14*4] @ from future BODY_16_xx 876 1.1 martin eor r12,r8,r9 @ a^b, b^c in next round 877 1.1 martin ldr r1,[sp,#11*4] @ from future BODY_16_xx 878 1.1 martin #endif 879 1.1 martin eor r0,r0,r8,ror#20 @ Sigma0(a) 880 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 881 1.1 martin add r11,r11,r7 @ d+=h 882 1.1 martin eor r3,r3,r9 @ Maj(a,b,c) 883 1.1 martin add r7,r7,r0,ror#2 @ h+=Sigma0(a) 884 1.1 martin @ add r7,r7,r3 @ h+=Maj(a,b,c) 885 1.1 martin #if __ARM_ARCH__>=7 886 1.1 martin @ ldr r2,[r1],#4 @ 13 887 1.1 martin # if 13==15 888 1.1 martin str r1,[sp,#17*4] @ make room for r1 889 1.1 martin # endif 890 1.1 martin eor r0,r11,r11,ror#5 891 1.1 martin add r7,r7,r3 @ h+=Maj(a,b,c) from the past 892 1.1 martin eor r0,r0,r11,ror#19 @ Sigma1(e) 893 1.3 christos # ifndef __ARMEB__ 894 1.1 martin rev r2,r2 895 1.3 christos # endif 896 1.1 martin #else 897 1.1 martin @ ldrb r2,[r1,#3] @ 13 898 1.1 martin add r7,r7,r3 @ h+=Maj(a,b,c) from the past 899 1.1 martin ldrb r3,[r1,#2] 900 1.1 martin ldrb r0,[r1,#1] 901 1.1 martin orr r2,r2,r3,lsl#8 902 1.1 martin ldrb r3,[r1],#4 903 1.1 martin orr r2,r2,r0,lsl#16 904 1.1 martin # if 13==15 905 1.1 martin str r1,[sp,#17*4] @ make room for r1 906 1.1 martin # endif 907 1.1 martin eor r0,r11,r11,ror#5 908 1.1 martin orr r2,r2,r3,lsl#24 909 1.1 martin eor r0,r0,r11,ror#19 @ Sigma1(e) 910 1.1 martin #endif 911 1.1 martin ldr r3,[r14],#4 @ *K256++ 912 1.1 martin add r6,r6,r2 @ h+=X[i] 913 1.1 martin str r2,[sp,#13*4] 914 1.1 martin eor r2,r4,r5 915 1.1 martin add r6,r6,r0,ror#6 @ h+=Sigma1(e) 916 1.1 martin and r2,r2,r11 917 1.1 martin add r6,r6,r3 @ h+=K256[i] 918 1.1 martin eor r2,r2,r5 @ Ch(e,f,g) 919 1.1 martin eor r0,r7,r7,ror#11 920 1.1 martin add r6,r6,r2 @ h+=Ch(e,f,g) 921 1.1 martin #if 13==31 922 1.1 martin and r3,r3,#0xff 923 1.1 martin cmp r3,#0xf2 @ done? 924 1.1 martin #endif 925 1.1 martin #if 13<15 926 1.1 martin # if __ARM_ARCH__>=7 927 1.1 martin ldr r2,[r1],#4 @ prefetch 928 1.1 martin # else 929 1.1 martin ldrb r2,[r1,#3] 930 1.1 martin # endif 931 1.1 martin eor r3,r7,r8 @ a^b, b^c in next round 932 1.1 martin #else 933 1.1 martin ldr r2,[sp,#15*4] @ from future BODY_16_xx 934 1.1 martin eor r3,r7,r8 @ a^b, b^c in next round 935 1.1 martin ldr r1,[sp,#12*4] @ from future BODY_16_xx 936 1.1 martin #endif 937 1.1 martin eor r0,r0,r7,ror#20 @ Sigma0(a) 938 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 939 1.1 martin add r10,r10,r6 @ d+=h 940 1.1 martin eor r12,r12,r8 @ Maj(a,b,c) 941 1.1 martin add r6,r6,r0,ror#2 @ h+=Sigma0(a) 942 1.1 martin @ add r6,r6,r12 @ h+=Maj(a,b,c) 943 1.1 martin #if __ARM_ARCH__>=7 944 1.1 martin @ ldr r2,[r1],#4 @ 14 945 1.1 martin # if 14==15 946 1.1 martin str r1,[sp,#17*4] @ make room for r1 947 1.1 martin # endif 948 1.1 martin eor r0,r10,r10,ror#5 949 1.1 martin add r6,r6,r12 @ h+=Maj(a,b,c) from the past 950 1.1 martin eor r0,r0,r10,ror#19 @ Sigma1(e) 951 1.3 christos # ifndef __ARMEB__ 952 1.1 martin rev r2,r2 953 1.3 christos # endif 954 1.1 martin #else 955 1.1 martin @ ldrb r2,[r1,#3] @ 14 956 1.1 martin add r6,r6,r12 @ h+=Maj(a,b,c) from the past 957 1.1 martin ldrb r12,[r1,#2] 958 1.1 martin ldrb r0,[r1,#1] 959 1.1 martin orr r2,r2,r12,lsl#8 960 1.1 martin ldrb r12,[r1],#4 961 1.1 martin orr r2,r2,r0,lsl#16 962 1.1 martin # if 14==15 963 1.1 martin str r1,[sp,#17*4] @ make room for r1 964 1.1 martin # endif 965 1.1 martin eor r0,r10,r10,ror#5 966 1.1 martin orr r2,r2,r12,lsl#24 967 1.1 martin eor r0,r0,r10,ror#19 @ Sigma1(e) 968 1.1 martin #endif 969 1.1 martin ldr r12,[r14],#4 @ *K256++ 970 1.1 martin add r5,r5,r2 @ h+=X[i] 971 1.1 martin str r2,[sp,#14*4] 972 1.1 martin eor r2,r11,r4 973 1.1 martin add r5,r5,r0,ror#6 @ h+=Sigma1(e) 974 1.1 martin and r2,r2,r10 975 1.1 martin add r5,r5,r12 @ h+=K256[i] 976 1.1 martin eor r2,r2,r4 @ Ch(e,f,g) 977 1.1 martin eor r0,r6,r6,ror#11 978 1.1 martin add r5,r5,r2 @ h+=Ch(e,f,g) 979 1.1 martin #if 14==31 980 1.1 martin and r12,r12,#0xff 981 1.1 martin cmp r12,#0xf2 @ done? 982 1.1 martin #endif 983 1.1 martin #if 14<15 984 1.1 martin # if __ARM_ARCH__>=7 985 1.1 martin ldr r2,[r1],#4 @ prefetch 986 1.1 martin # else 987 1.1 martin ldrb r2,[r1,#3] 988 1.1 martin # endif 989 1.1 martin eor r12,r6,r7 @ a^b, b^c in next round 990 1.1 martin #else 991 1.1 martin ldr r2,[sp,#0*4] @ from future BODY_16_xx 992 1.1 martin eor r12,r6,r7 @ a^b, b^c in next round 993 1.1 martin ldr r1,[sp,#13*4] @ from future BODY_16_xx 994 1.1 martin #endif 995 1.1 martin eor r0,r0,r6,ror#20 @ Sigma0(a) 996 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 997 1.1 martin add r9,r9,r5 @ d+=h 998 1.1 martin eor r3,r3,r7 @ Maj(a,b,c) 999 1.1 martin add r5,r5,r0,ror#2 @ h+=Sigma0(a) 1000 1.1 martin @ add r5,r5,r3 @ h+=Maj(a,b,c) 1001 1.1 martin #if __ARM_ARCH__>=7 1002 1.1 martin @ ldr r2,[r1],#4 @ 15 1003 1.1 martin # if 15==15 1004 1.1 martin str r1,[sp,#17*4] @ make room for r1 1005 1.1 martin # endif 1006 1.1 martin eor r0,r9,r9,ror#5 1007 1.1 martin add r5,r5,r3 @ h+=Maj(a,b,c) from the past 1008 1.1 martin eor r0,r0,r9,ror#19 @ Sigma1(e) 1009 1.3 christos # ifndef __ARMEB__ 1010 1.1 martin rev r2,r2 1011 1.3 christos # endif 1012 1.1 martin #else 1013 1.1 martin @ ldrb r2,[r1,#3] @ 15 1014 1.1 martin add r5,r5,r3 @ h+=Maj(a,b,c) from the past 1015 1.1 martin ldrb r3,[r1,#2] 1016 1.1 martin ldrb r0,[r1,#1] 1017 1.1 martin orr r2,r2,r3,lsl#8 1018 1.1 martin ldrb r3,[r1],#4 1019 1.1 martin orr r2,r2,r0,lsl#16 1020 1.1 martin # if 15==15 1021 1.1 martin str r1,[sp,#17*4] @ make room for r1 1022 1.1 martin # endif 1023 1.1 martin eor r0,r9,r9,ror#5 1024 1.1 martin orr r2,r2,r3,lsl#24 1025 1.1 martin eor r0,r0,r9,ror#19 @ Sigma1(e) 1026 1.1 martin #endif 1027 1.1 martin ldr r3,[r14],#4 @ *K256++ 1028 1.1 martin add r4,r4,r2 @ h+=X[i] 1029 1.1 martin str r2,[sp,#15*4] 1030 1.1 martin eor r2,r10,r11 1031 1.1 martin add r4,r4,r0,ror#6 @ h+=Sigma1(e) 1032 1.1 martin and r2,r2,r9 1033 1.1 martin add r4,r4,r3 @ h+=K256[i] 1034 1.1 martin eor r2,r2,r11 @ Ch(e,f,g) 1035 1.1 martin eor r0,r5,r5,ror#11 1036 1.1 martin add r4,r4,r2 @ h+=Ch(e,f,g) 1037 1.1 martin #if 15==31 1038 1.1 martin and r3,r3,#0xff 1039 1.1 martin cmp r3,#0xf2 @ done? 1040 1.1 martin #endif 1041 1.1 martin #if 15<15 1042 1.1 martin # if __ARM_ARCH__>=7 1043 1.1 martin ldr r2,[r1],#4 @ prefetch 1044 1.1 martin # else 1045 1.1 martin ldrb r2,[r1,#3] 1046 1.1 martin # endif 1047 1.1 martin eor r3,r5,r6 @ a^b, b^c in next round 1048 1.1 martin #else 1049 1.1 martin ldr r2,[sp,#1*4] @ from future BODY_16_xx 1050 1.1 martin eor r3,r5,r6 @ a^b, b^c in next round 1051 1.1 martin ldr r1,[sp,#14*4] @ from future BODY_16_xx 1052 1.1 martin #endif 1053 1.1 martin eor r0,r0,r5,ror#20 @ Sigma0(a) 1054 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1055 1.1 martin add r8,r8,r4 @ d+=h 1056 1.1 martin eor r12,r12,r6 @ Maj(a,b,c) 1057 1.1 martin add r4,r4,r0,ror#2 @ h+=Sigma0(a) 1058 1.1 martin @ add r4,r4,r12 @ h+=Maj(a,b,c) 1059 1.1 martin .Lrounds_16_xx: 1060 1.1 martin @ ldr r2,[sp,#1*4] @ 16 1061 1.1 martin @ ldr r1,[sp,#14*4] 1062 1.1 martin mov r0,r2,ror#7 1063 1.1 martin add r4,r4,r12 @ h+=Maj(a,b,c) from the past 1064 1.1 martin mov r12,r1,ror#17 1065 1.1 martin eor r0,r0,r2,ror#18 1066 1.1 martin eor r12,r12,r1,ror#19 1067 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1068 1.1 martin ldr r2,[sp,#0*4] 1069 1.1 martin eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) 1070 1.1 martin ldr r1,[sp,#9*4] 1071 1.1 martin 1072 1.1 martin add r12,r12,r0 1073 1.1 martin eor r0,r8,r8,ror#5 @ from BODY_00_15 1074 1.1 martin add r2,r2,r12 1075 1.1 martin eor r0,r0,r8,ror#19 @ Sigma1(e) 1076 1.1 martin add r2,r2,r1 @ X[i] 1077 1.1 martin ldr r12,[r14],#4 @ *K256++ 1078 1.1 martin add r11,r11,r2 @ h+=X[i] 1079 1.1 martin str r2,[sp,#0*4] 1080 1.1 martin eor r2,r9,r10 1081 1.1 martin add r11,r11,r0,ror#6 @ h+=Sigma1(e) 1082 1.1 martin and r2,r2,r8 1083 1.1 martin add r11,r11,r12 @ h+=K256[i] 1084 1.1 martin eor r2,r2,r10 @ Ch(e,f,g) 1085 1.1 martin eor r0,r4,r4,ror#11 1086 1.1 martin add r11,r11,r2 @ h+=Ch(e,f,g) 1087 1.1 martin #if 16==31 1088 1.1 martin and r12,r12,#0xff 1089 1.1 martin cmp r12,#0xf2 @ done? 1090 1.1 martin #endif 1091 1.1 martin #if 16<15 1092 1.1 martin # if __ARM_ARCH__>=7 1093 1.1 martin ldr r2,[r1],#4 @ prefetch 1094 1.1 martin # else 1095 1.1 martin ldrb r2,[r1,#3] 1096 1.1 martin # endif 1097 1.1 martin eor r12,r4,r5 @ a^b, b^c in next round 1098 1.1 martin #else 1099 1.1 martin ldr r2,[sp,#2*4] @ from future BODY_16_xx 1100 1.1 martin eor r12,r4,r5 @ a^b, b^c in next round 1101 1.1 martin ldr r1,[sp,#15*4] @ from future BODY_16_xx 1102 1.1 martin #endif 1103 1.1 martin eor r0,r0,r4,ror#20 @ Sigma0(a) 1104 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 1105 1.1 martin add r7,r7,r11 @ d+=h 1106 1.1 martin eor r3,r3,r5 @ Maj(a,b,c) 1107 1.1 martin add r11,r11,r0,ror#2 @ h+=Sigma0(a) 1108 1.1 martin @ add r11,r11,r3 @ h+=Maj(a,b,c) 1109 1.1 martin @ ldr r2,[sp,#2*4] @ 17 1110 1.1 martin @ ldr r1,[sp,#15*4] 1111 1.1 martin mov r0,r2,ror#7 1112 1.1 martin add r11,r11,r3 @ h+=Maj(a,b,c) from the past 1113 1.1 martin mov r3,r1,ror#17 1114 1.1 martin eor r0,r0,r2,ror#18 1115 1.1 martin eor r3,r3,r1,ror#19 1116 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1117 1.1 martin ldr r2,[sp,#1*4] 1118 1.1 martin eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) 1119 1.1 martin ldr r1,[sp,#10*4] 1120 1.1 martin 1121 1.1 martin add r3,r3,r0 1122 1.1 martin eor r0,r7,r7,ror#5 @ from BODY_00_15 1123 1.1 martin add r2,r2,r3 1124 1.1 martin eor r0,r0,r7,ror#19 @ Sigma1(e) 1125 1.1 martin add r2,r2,r1 @ X[i] 1126 1.1 martin ldr r3,[r14],#4 @ *K256++ 1127 1.1 martin add r10,r10,r2 @ h+=X[i] 1128 1.1 martin str r2,[sp,#1*4] 1129 1.1 martin eor r2,r8,r9 1130 1.1 martin add r10,r10,r0,ror#6 @ h+=Sigma1(e) 1131 1.1 martin and r2,r2,r7 1132 1.1 martin add r10,r10,r3 @ h+=K256[i] 1133 1.1 martin eor r2,r2,r9 @ Ch(e,f,g) 1134 1.1 martin eor r0,r11,r11,ror#11 1135 1.1 martin add r10,r10,r2 @ h+=Ch(e,f,g) 1136 1.1 martin #if 17==31 1137 1.1 martin and r3,r3,#0xff 1138 1.1 martin cmp r3,#0xf2 @ done? 1139 1.1 martin #endif 1140 1.1 martin #if 17<15 1141 1.1 martin # if __ARM_ARCH__>=7 1142 1.1 martin ldr r2,[r1],#4 @ prefetch 1143 1.1 martin # else 1144 1.1 martin ldrb r2,[r1,#3] 1145 1.1 martin # endif 1146 1.1 martin eor r3,r11,r4 @ a^b, b^c in next round 1147 1.1 martin #else 1148 1.1 martin ldr r2,[sp,#3*4] @ from future BODY_16_xx 1149 1.1 martin eor r3,r11,r4 @ a^b, b^c in next round 1150 1.1 martin ldr r1,[sp,#0*4] @ from future BODY_16_xx 1151 1.1 martin #endif 1152 1.1 martin eor r0,r0,r11,ror#20 @ Sigma0(a) 1153 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1154 1.1 martin add r6,r6,r10 @ d+=h 1155 1.1 martin eor r12,r12,r4 @ Maj(a,b,c) 1156 1.1 martin add r10,r10,r0,ror#2 @ h+=Sigma0(a) 1157 1.1 martin @ add r10,r10,r12 @ h+=Maj(a,b,c) 1158 1.1 martin @ ldr r2,[sp,#3*4] @ 18 1159 1.1 martin @ ldr r1,[sp,#0*4] 1160 1.1 martin mov r0,r2,ror#7 1161 1.1 martin add r10,r10,r12 @ h+=Maj(a,b,c) from the past 1162 1.1 martin mov r12,r1,ror#17 1163 1.1 martin eor r0,r0,r2,ror#18 1164 1.1 martin eor r12,r12,r1,ror#19 1165 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1166 1.1 martin ldr r2,[sp,#2*4] 1167 1.1 martin eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) 1168 1.1 martin ldr r1,[sp,#11*4] 1169 1.1 martin 1170 1.1 martin add r12,r12,r0 1171 1.1 martin eor r0,r6,r6,ror#5 @ from BODY_00_15 1172 1.1 martin add r2,r2,r12 1173 1.1 martin eor r0,r0,r6,ror#19 @ Sigma1(e) 1174 1.1 martin add r2,r2,r1 @ X[i] 1175 1.1 martin ldr r12,[r14],#4 @ *K256++ 1176 1.1 martin add r9,r9,r2 @ h+=X[i] 1177 1.1 martin str r2,[sp,#2*4] 1178 1.1 martin eor r2,r7,r8 1179 1.1 martin add r9,r9,r0,ror#6 @ h+=Sigma1(e) 1180 1.1 martin and r2,r2,r6 1181 1.1 martin add r9,r9,r12 @ h+=K256[i] 1182 1.1 martin eor r2,r2,r8 @ Ch(e,f,g) 1183 1.1 martin eor r0,r10,r10,ror#11 1184 1.1 martin add r9,r9,r2 @ h+=Ch(e,f,g) 1185 1.1 martin #if 18==31 1186 1.1 martin and r12,r12,#0xff 1187 1.1 martin cmp r12,#0xf2 @ done? 1188 1.1 martin #endif 1189 1.1 martin #if 18<15 1190 1.1 martin # if __ARM_ARCH__>=7 1191 1.1 martin ldr r2,[r1],#4 @ prefetch 1192 1.1 martin # else 1193 1.1 martin ldrb r2,[r1,#3] 1194 1.1 martin # endif 1195 1.1 martin eor r12,r10,r11 @ a^b, b^c in next round 1196 1.1 martin #else 1197 1.1 martin ldr r2,[sp,#4*4] @ from future BODY_16_xx 1198 1.1 martin eor r12,r10,r11 @ a^b, b^c in next round 1199 1.1 martin ldr r1,[sp,#1*4] @ from future BODY_16_xx 1200 1.1 martin #endif 1201 1.1 martin eor r0,r0,r10,ror#20 @ Sigma0(a) 1202 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 1203 1.1 martin add r5,r5,r9 @ d+=h 1204 1.1 martin eor r3,r3,r11 @ Maj(a,b,c) 1205 1.1 martin add r9,r9,r0,ror#2 @ h+=Sigma0(a) 1206 1.1 martin @ add r9,r9,r3 @ h+=Maj(a,b,c) 1207 1.1 martin @ ldr r2,[sp,#4*4] @ 19 1208 1.1 martin @ ldr r1,[sp,#1*4] 1209 1.1 martin mov r0,r2,ror#7 1210 1.1 martin add r9,r9,r3 @ h+=Maj(a,b,c) from the past 1211 1.1 martin mov r3,r1,ror#17 1212 1.1 martin eor r0,r0,r2,ror#18 1213 1.1 martin eor r3,r3,r1,ror#19 1214 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1215 1.1 martin ldr r2,[sp,#3*4] 1216 1.1 martin eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) 1217 1.1 martin ldr r1,[sp,#12*4] 1218 1.1 martin 1219 1.1 martin add r3,r3,r0 1220 1.1 martin eor r0,r5,r5,ror#5 @ from BODY_00_15 1221 1.1 martin add r2,r2,r3 1222 1.1 martin eor r0,r0,r5,ror#19 @ Sigma1(e) 1223 1.1 martin add r2,r2,r1 @ X[i] 1224 1.1 martin ldr r3,[r14],#4 @ *K256++ 1225 1.1 martin add r8,r8,r2 @ h+=X[i] 1226 1.1 martin str r2,[sp,#3*4] 1227 1.1 martin eor r2,r6,r7 1228 1.1 martin add r8,r8,r0,ror#6 @ h+=Sigma1(e) 1229 1.1 martin and r2,r2,r5 1230 1.1 martin add r8,r8,r3 @ h+=K256[i] 1231 1.1 martin eor r2,r2,r7 @ Ch(e,f,g) 1232 1.1 martin eor r0,r9,r9,ror#11 1233 1.1 martin add r8,r8,r2 @ h+=Ch(e,f,g) 1234 1.1 martin #if 19==31 1235 1.1 martin and r3,r3,#0xff 1236 1.1 martin cmp r3,#0xf2 @ done? 1237 1.1 martin #endif 1238 1.1 martin #if 19<15 1239 1.1 martin # if __ARM_ARCH__>=7 1240 1.1 martin ldr r2,[r1],#4 @ prefetch 1241 1.1 martin # else 1242 1.1 martin ldrb r2,[r1,#3] 1243 1.1 martin # endif 1244 1.1 martin eor r3,r9,r10 @ a^b, b^c in next round 1245 1.1 martin #else 1246 1.1 martin ldr r2,[sp,#5*4] @ from future BODY_16_xx 1247 1.1 martin eor r3,r9,r10 @ a^b, b^c in next round 1248 1.1 martin ldr r1,[sp,#2*4] @ from future BODY_16_xx 1249 1.1 martin #endif 1250 1.1 martin eor r0,r0,r9,ror#20 @ Sigma0(a) 1251 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1252 1.1 martin add r4,r4,r8 @ d+=h 1253 1.1 martin eor r12,r12,r10 @ Maj(a,b,c) 1254 1.1 martin add r8,r8,r0,ror#2 @ h+=Sigma0(a) 1255 1.1 martin @ add r8,r8,r12 @ h+=Maj(a,b,c) 1256 1.1 martin @ ldr r2,[sp,#5*4] @ 20 1257 1.1 martin @ ldr r1,[sp,#2*4] 1258 1.1 martin mov r0,r2,ror#7 1259 1.1 martin add r8,r8,r12 @ h+=Maj(a,b,c) from the past 1260 1.1 martin mov r12,r1,ror#17 1261 1.1 martin eor r0,r0,r2,ror#18 1262 1.1 martin eor r12,r12,r1,ror#19 1263 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1264 1.1 martin ldr r2,[sp,#4*4] 1265 1.1 martin eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) 1266 1.1 martin ldr r1,[sp,#13*4] 1267 1.1 martin 1268 1.1 martin add r12,r12,r0 1269 1.1 martin eor r0,r4,r4,ror#5 @ from BODY_00_15 1270 1.1 martin add r2,r2,r12 1271 1.1 martin eor r0,r0,r4,ror#19 @ Sigma1(e) 1272 1.1 martin add r2,r2,r1 @ X[i] 1273 1.1 martin ldr r12,[r14],#4 @ *K256++ 1274 1.1 martin add r7,r7,r2 @ h+=X[i] 1275 1.1 martin str r2,[sp,#4*4] 1276 1.1 martin eor r2,r5,r6 1277 1.1 martin add r7,r7,r0,ror#6 @ h+=Sigma1(e) 1278 1.1 martin and r2,r2,r4 1279 1.1 martin add r7,r7,r12 @ h+=K256[i] 1280 1.1 martin eor r2,r2,r6 @ Ch(e,f,g) 1281 1.1 martin eor r0,r8,r8,ror#11 1282 1.1 martin add r7,r7,r2 @ h+=Ch(e,f,g) 1283 1.1 martin #if 20==31 1284 1.1 martin and r12,r12,#0xff 1285 1.1 martin cmp r12,#0xf2 @ done? 1286 1.1 martin #endif 1287 1.1 martin #if 20<15 1288 1.1 martin # if __ARM_ARCH__>=7 1289 1.1 martin ldr r2,[r1],#4 @ prefetch 1290 1.1 martin # else 1291 1.1 martin ldrb r2,[r1,#3] 1292 1.1 martin # endif 1293 1.1 martin eor r12,r8,r9 @ a^b, b^c in next round 1294 1.1 martin #else 1295 1.1 martin ldr r2,[sp,#6*4] @ from future BODY_16_xx 1296 1.1 martin eor r12,r8,r9 @ a^b, b^c in next round 1297 1.1 martin ldr r1,[sp,#3*4] @ from future BODY_16_xx 1298 1.1 martin #endif 1299 1.1 martin eor r0,r0,r8,ror#20 @ Sigma0(a) 1300 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 1301 1.1 martin add r11,r11,r7 @ d+=h 1302 1.1 martin eor r3,r3,r9 @ Maj(a,b,c) 1303 1.1 martin add r7,r7,r0,ror#2 @ h+=Sigma0(a) 1304 1.1 martin @ add r7,r7,r3 @ h+=Maj(a,b,c) 1305 1.1 martin @ ldr r2,[sp,#6*4] @ 21 1306 1.1 martin @ ldr r1,[sp,#3*4] 1307 1.1 martin mov r0,r2,ror#7 1308 1.1 martin add r7,r7,r3 @ h+=Maj(a,b,c) from the past 1309 1.1 martin mov r3,r1,ror#17 1310 1.1 martin eor r0,r0,r2,ror#18 1311 1.1 martin eor r3,r3,r1,ror#19 1312 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1313 1.1 martin ldr r2,[sp,#5*4] 1314 1.1 martin eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) 1315 1.1 martin ldr r1,[sp,#14*4] 1316 1.1 martin 1317 1.1 martin add r3,r3,r0 1318 1.1 martin eor r0,r11,r11,ror#5 @ from BODY_00_15 1319 1.1 martin add r2,r2,r3 1320 1.1 martin eor r0,r0,r11,ror#19 @ Sigma1(e) 1321 1.1 martin add r2,r2,r1 @ X[i] 1322 1.1 martin ldr r3,[r14],#4 @ *K256++ 1323 1.1 martin add r6,r6,r2 @ h+=X[i] 1324 1.1 martin str r2,[sp,#5*4] 1325 1.1 martin eor r2,r4,r5 1326 1.1 martin add r6,r6,r0,ror#6 @ h+=Sigma1(e) 1327 1.1 martin and r2,r2,r11 1328 1.1 martin add r6,r6,r3 @ h+=K256[i] 1329 1.1 martin eor r2,r2,r5 @ Ch(e,f,g) 1330 1.1 martin eor r0,r7,r7,ror#11 1331 1.1 martin add r6,r6,r2 @ h+=Ch(e,f,g) 1332 1.1 martin #if 21==31 1333 1.1 martin and r3,r3,#0xff 1334 1.1 martin cmp r3,#0xf2 @ done? 1335 1.1 martin #endif 1336 1.1 martin #if 21<15 1337 1.1 martin # if __ARM_ARCH__>=7 1338 1.1 martin ldr r2,[r1],#4 @ prefetch 1339 1.1 martin # else 1340 1.1 martin ldrb r2,[r1,#3] 1341 1.1 martin # endif 1342 1.1 martin eor r3,r7,r8 @ a^b, b^c in next round 1343 1.1 martin #else 1344 1.1 martin ldr r2,[sp,#7*4] @ from future BODY_16_xx 1345 1.1 martin eor r3,r7,r8 @ a^b, b^c in next round 1346 1.1 martin ldr r1,[sp,#4*4] @ from future BODY_16_xx 1347 1.1 martin #endif 1348 1.1 martin eor r0,r0,r7,ror#20 @ Sigma0(a) 1349 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1350 1.1 martin add r10,r10,r6 @ d+=h 1351 1.1 martin eor r12,r12,r8 @ Maj(a,b,c) 1352 1.1 martin add r6,r6,r0,ror#2 @ h+=Sigma0(a) 1353 1.1 martin @ add r6,r6,r12 @ h+=Maj(a,b,c) 1354 1.1 martin @ ldr r2,[sp,#7*4] @ 22 1355 1.1 martin @ ldr r1,[sp,#4*4] 1356 1.1 martin mov r0,r2,ror#7 1357 1.1 martin add r6,r6,r12 @ h+=Maj(a,b,c) from the past 1358 1.1 martin mov r12,r1,ror#17 1359 1.1 martin eor r0,r0,r2,ror#18 1360 1.1 martin eor r12,r12,r1,ror#19 1361 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1362 1.1 martin ldr r2,[sp,#6*4] 1363 1.1 martin eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) 1364 1.1 martin ldr r1,[sp,#15*4] 1365 1.1 martin 1366 1.1 martin add r12,r12,r0 1367 1.1 martin eor r0,r10,r10,ror#5 @ from BODY_00_15 1368 1.1 martin add r2,r2,r12 1369 1.1 martin eor r0,r0,r10,ror#19 @ Sigma1(e) 1370 1.1 martin add r2,r2,r1 @ X[i] 1371 1.1 martin ldr r12,[r14],#4 @ *K256++ 1372 1.1 martin add r5,r5,r2 @ h+=X[i] 1373 1.1 martin str r2,[sp,#6*4] 1374 1.1 martin eor r2,r11,r4 1375 1.1 martin add r5,r5,r0,ror#6 @ h+=Sigma1(e) 1376 1.1 martin and r2,r2,r10 1377 1.1 martin add r5,r5,r12 @ h+=K256[i] 1378 1.1 martin eor r2,r2,r4 @ Ch(e,f,g) 1379 1.1 martin eor r0,r6,r6,ror#11 1380 1.1 martin add r5,r5,r2 @ h+=Ch(e,f,g) 1381 1.1 martin #if 22==31 1382 1.1 martin and r12,r12,#0xff 1383 1.1 martin cmp r12,#0xf2 @ done? 1384 1.1 martin #endif 1385 1.1 martin #if 22<15 1386 1.1 martin # if __ARM_ARCH__>=7 1387 1.1 martin ldr r2,[r1],#4 @ prefetch 1388 1.1 martin # else 1389 1.1 martin ldrb r2,[r1,#3] 1390 1.1 martin # endif 1391 1.1 martin eor r12,r6,r7 @ a^b, b^c in next round 1392 1.1 martin #else 1393 1.1 martin ldr r2,[sp,#8*4] @ from future BODY_16_xx 1394 1.1 martin eor r12,r6,r7 @ a^b, b^c in next round 1395 1.1 martin ldr r1,[sp,#5*4] @ from future BODY_16_xx 1396 1.1 martin #endif 1397 1.1 martin eor r0,r0,r6,ror#20 @ Sigma0(a) 1398 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 1399 1.1 martin add r9,r9,r5 @ d+=h 1400 1.1 martin eor r3,r3,r7 @ Maj(a,b,c) 1401 1.1 martin add r5,r5,r0,ror#2 @ h+=Sigma0(a) 1402 1.1 martin @ add r5,r5,r3 @ h+=Maj(a,b,c) 1403 1.1 martin @ ldr r2,[sp,#8*4] @ 23 1404 1.1 martin @ ldr r1,[sp,#5*4] 1405 1.1 martin mov r0,r2,ror#7 1406 1.1 martin add r5,r5,r3 @ h+=Maj(a,b,c) from the past 1407 1.1 martin mov r3,r1,ror#17 1408 1.1 martin eor r0,r0,r2,ror#18 1409 1.1 martin eor r3,r3,r1,ror#19 1410 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1411 1.1 martin ldr r2,[sp,#7*4] 1412 1.1 martin eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) 1413 1.1 martin ldr r1,[sp,#0*4] 1414 1.1 martin 1415 1.1 martin add r3,r3,r0 1416 1.1 martin eor r0,r9,r9,ror#5 @ from BODY_00_15 1417 1.1 martin add r2,r2,r3 1418 1.1 martin eor r0,r0,r9,ror#19 @ Sigma1(e) 1419 1.1 martin add r2,r2,r1 @ X[i] 1420 1.1 martin ldr r3,[r14],#4 @ *K256++ 1421 1.1 martin add r4,r4,r2 @ h+=X[i] 1422 1.1 martin str r2,[sp,#7*4] 1423 1.1 martin eor r2,r10,r11 1424 1.1 martin add r4,r4,r0,ror#6 @ h+=Sigma1(e) 1425 1.1 martin and r2,r2,r9 1426 1.1 martin add r4,r4,r3 @ h+=K256[i] 1427 1.1 martin eor r2,r2,r11 @ Ch(e,f,g) 1428 1.1 martin eor r0,r5,r5,ror#11 1429 1.1 martin add r4,r4,r2 @ h+=Ch(e,f,g) 1430 1.1 martin #if 23==31 1431 1.1 martin and r3,r3,#0xff 1432 1.1 martin cmp r3,#0xf2 @ done? 1433 1.1 martin #endif 1434 1.1 martin #if 23<15 1435 1.1 martin # if __ARM_ARCH__>=7 1436 1.1 martin ldr r2,[r1],#4 @ prefetch 1437 1.1 martin # else 1438 1.1 martin ldrb r2,[r1,#3] 1439 1.1 martin # endif 1440 1.1 martin eor r3,r5,r6 @ a^b, b^c in next round 1441 1.1 martin #else 1442 1.1 martin ldr r2,[sp,#9*4] @ from future BODY_16_xx 1443 1.1 martin eor r3,r5,r6 @ a^b, b^c in next round 1444 1.1 martin ldr r1,[sp,#6*4] @ from future BODY_16_xx 1445 1.1 martin #endif 1446 1.1 martin eor r0,r0,r5,ror#20 @ Sigma0(a) 1447 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1448 1.1 martin add r8,r8,r4 @ d+=h 1449 1.1 martin eor r12,r12,r6 @ Maj(a,b,c) 1450 1.1 martin add r4,r4,r0,ror#2 @ h+=Sigma0(a) 1451 1.1 martin @ add r4,r4,r12 @ h+=Maj(a,b,c) 1452 1.1 martin @ ldr r2,[sp,#9*4] @ 24 1453 1.1 martin @ ldr r1,[sp,#6*4] 1454 1.1 martin mov r0,r2,ror#7 1455 1.1 martin add r4,r4,r12 @ h+=Maj(a,b,c) from the past 1456 1.1 martin mov r12,r1,ror#17 1457 1.1 martin eor r0,r0,r2,ror#18 1458 1.1 martin eor r12,r12,r1,ror#19 1459 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1460 1.1 martin ldr r2,[sp,#8*4] 1461 1.1 martin eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) 1462 1.1 martin ldr r1,[sp,#1*4] 1463 1.1 martin 1464 1.1 martin add r12,r12,r0 1465 1.1 martin eor r0,r8,r8,ror#5 @ from BODY_00_15 1466 1.1 martin add r2,r2,r12 1467 1.1 martin eor r0,r0,r8,ror#19 @ Sigma1(e) 1468 1.1 martin add r2,r2,r1 @ X[i] 1469 1.1 martin ldr r12,[r14],#4 @ *K256++ 1470 1.1 martin add r11,r11,r2 @ h+=X[i] 1471 1.1 martin str r2,[sp,#8*4] 1472 1.1 martin eor r2,r9,r10 1473 1.1 martin add r11,r11,r0,ror#6 @ h+=Sigma1(e) 1474 1.1 martin and r2,r2,r8 1475 1.1 martin add r11,r11,r12 @ h+=K256[i] 1476 1.1 martin eor r2,r2,r10 @ Ch(e,f,g) 1477 1.1 martin eor r0,r4,r4,ror#11 1478 1.1 martin add r11,r11,r2 @ h+=Ch(e,f,g) 1479 1.1 martin #if 24==31 1480 1.1 martin and r12,r12,#0xff 1481 1.1 martin cmp r12,#0xf2 @ done? 1482 1.1 martin #endif 1483 1.1 martin #if 24<15 1484 1.1 martin # if __ARM_ARCH__>=7 1485 1.1 martin ldr r2,[r1],#4 @ prefetch 1486 1.1 martin # else 1487 1.1 martin ldrb r2,[r1,#3] 1488 1.1 martin # endif 1489 1.1 martin eor r12,r4,r5 @ a^b, b^c in next round 1490 1.1 martin #else 1491 1.1 martin ldr r2,[sp,#10*4] @ from future BODY_16_xx 1492 1.1 martin eor r12,r4,r5 @ a^b, b^c in next round 1493 1.1 martin ldr r1,[sp,#7*4] @ from future BODY_16_xx 1494 1.1 martin #endif 1495 1.1 martin eor r0,r0,r4,ror#20 @ Sigma0(a) 1496 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 1497 1.1 martin add r7,r7,r11 @ d+=h 1498 1.1 martin eor r3,r3,r5 @ Maj(a,b,c) 1499 1.1 martin add r11,r11,r0,ror#2 @ h+=Sigma0(a) 1500 1.1 martin @ add r11,r11,r3 @ h+=Maj(a,b,c) 1501 1.1 martin @ ldr r2,[sp,#10*4] @ 25 1502 1.1 martin @ ldr r1,[sp,#7*4] 1503 1.1 martin mov r0,r2,ror#7 1504 1.1 martin add r11,r11,r3 @ h+=Maj(a,b,c) from the past 1505 1.1 martin mov r3,r1,ror#17 1506 1.1 martin eor r0,r0,r2,ror#18 1507 1.1 martin eor r3,r3,r1,ror#19 1508 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1509 1.1 martin ldr r2,[sp,#9*4] 1510 1.1 martin eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) 1511 1.1 martin ldr r1,[sp,#2*4] 1512 1.1 martin 1513 1.1 martin add r3,r3,r0 1514 1.1 martin eor r0,r7,r7,ror#5 @ from BODY_00_15 1515 1.1 martin add r2,r2,r3 1516 1.1 martin eor r0,r0,r7,ror#19 @ Sigma1(e) 1517 1.1 martin add r2,r2,r1 @ X[i] 1518 1.1 martin ldr r3,[r14],#4 @ *K256++ 1519 1.1 martin add r10,r10,r2 @ h+=X[i] 1520 1.1 martin str r2,[sp,#9*4] 1521 1.1 martin eor r2,r8,r9 1522 1.1 martin add r10,r10,r0,ror#6 @ h+=Sigma1(e) 1523 1.1 martin and r2,r2,r7 1524 1.1 martin add r10,r10,r3 @ h+=K256[i] 1525 1.1 martin eor r2,r2,r9 @ Ch(e,f,g) 1526 1.1 martin eor r0,r11,r11,ror#11 1527 1.1 martin add r10,r10,r2 @ h+=Ch(e,f,g) 1528 1.1 martin #if 25==31 1529 1.1 martin and r3,r3,#0xff 1530 1.1 martin cmp r3,#0xf2 @ done? 1531 1.1 martin #endif 1532 1.1 martin #if 25<15 1533 1.1 martin # if __ARM_ARCH__>=7 1534 1.1 martin ldr r2,[r1],#4 @ prefetch 1535 1.1 martin # else 1536 1.1 martin ldrb r2,[r1,#3] 1537 1.1 martin # endif 1538 1.1 martin eor r3,r11,r4 @ a^b, b^c in next round 1539 1.1 martin #else 1540 1.1 martin ldr r2,[sp,#11*4] @ from future BODY_16_xx 1541 1.1 martin eor r3,r11,r4 @ a^b, b^c in next round 1542 1.1 martin ldr r1,[sp,#8*4] @ from future BODY_16_xx 1543 1.1 martin #endif 1544 1.1 martin eor r0,r0,r11,ror#20 @ Sigma0(a) 1545 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1546 1.1 martin add r6,r6,r10 @ d+=h 1547 1.1 martin eor r12,r12,r4 @ Maj(a,b,c) 1548 1.1 martin add r10,r10,r0,ror#2 @ h+=Sigma0(a) 1549 1.1 martin @ add r10,r10,r12 @ h+=Maj(a,b,c) 1550 1.1 martin @ ldr r2,[sp,#11*4] @ 26 1551 1.1 martin @ ldr r1,[sp,#8*4] 1552 1.1 martin mov r0,r2,ror#7 1553 1.1 martin add r10,r10,r12 @ h+=Maj(a,b,c) from the past 1554 1.1 martin mov r12,r1,ror#17 1555 1.1 martin eor r0,r0,r2,ror#18 1556 1.1 martin eor r12,r12,r1,ror#19 1557 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1558 1.1 martin ldr r2,[sp,#10*4] 1559 1.1 martin eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) 1560 1.1 martin ldr r1,[sp,#3*4] 1561 1.1 martin 1562 1.1 martin add r12,r12,r0 1563 1.1 martin eor r0,r6,r6,ror#5 @ from BODY_00_15 1564 1.1 martin add r2,r2,r12 1565 1.1 martin eor r0,r0,r6,ror#19 @ Sigma1(e) 1566 1.1 martin add r2,r2,r1 @ X[i] 1567 1.1 martin ldr r12,[r14],#4 @ *K256++ 1568 1.1 martin add r9,r9,r2 @ h+=X[i] 1569 1.1 martin str r2,[sp,#10*4] 1570 1.1 martin eor r2,r7,r8 1571 1.1 martin add r9,r9,r0,ror#6 @ h+=Sigma1(e) 1572 1.1 martin and r2,r2,r6 1573 1.1 martin add r9,r9,r12 @ h+=K256[i] 1574 1.1 martin eor r2,r2,r8 @ Ch(e,f,g) 1575 1.1 martin eor r0,r10,r10,ror#11 1576 1.1 martin add r9,r9,r2 @ h+=Ch(e,f,g) 1577 1.1 martin #if 26==31 1578 1.1 martin and r12,r12,#0xff 1579 1.1 martin cmp r12,#0xf2 @ done? 1580 1.1 martin #endif 1581 1.1 martin #if 26<15 1582 1.1 martin # if __ARM_ARCH__>=7 1583 1.1 martin ldr r2,[r1],#4 @ prefetch 1584 1.1 martin # else 1585 1.1 martin ldrb r2,[r1,#3] 1586 1.1 martin # endif 1587 1.1 martin eor r12,r10,r11 @ a^b, b^c in next round 1588 1.1 martin #else 1589 1.1 martin ldr r2,[sp,#12*4] @ from future BODY_16_xx 1590 1.1 martin eor r12,r10,r11 @ a^b, b^c in next round 1591 1.1 martin ldr r1,[sp,#9*4] @ from future BODY_16_xx 1592 1.1 martin #endif 1593 1.1 martin eor r0,r0,r10,ror#20 @ Sigma0(a) 1594 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 1595 1.1 martin add r5,r5,r9 @ d+=h 1596 1.1 martin eor r3,r3,r11 @ Maj(a,b,c) 1597 1.1 martin add r9,r9,r0,ror#2 @ h+=Sigma0(a) 1598 1.1 martin @ add r9,r9,r3 @ h+=Maj(a,b,c) 1599 1.1 martin @ ldr r2,[sp,#12*4] @ 27 1600 1.1 martin @ ldr r1,[sp,#9*4] 1601 1.1 martin mov r0,r2,ror#7 1602 1.1 martin add r9,r9,r3 @ h+=Maj(a,b,c) from the past 1603 1.1 martin mov r3,r1,ror#17 1604 1.1 martin eor r0,r0,r2,ror#18 1605 1.1 martin eor r3,r3,r1,ror#19 1606 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1607 1.1 martin ldr r2,[sp,#11*4] 1608 1.1 martin eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) 1609 1.1 martin ldr r1,[sp,#4*4] 1610 1.1 martin 1611 1.1 martin add r3,r3,r0 1612 1.1 martin eor r0,r5,r5,ror#5 @ from BODY_00_15 1613 1.1 martin add r2,r2,r3 1614 1.1 martin eor r0,r0,r5,ror#19 @ Sigma1(e) 1615 1.1 martin add r2,r2,r1 @ X[i] 1616 1.1 martin ldr r3,[r14],#4 @ *K256++ 1617 1.1 martin add r8,r8,r2 @ h+=X[i] 1618 1.1 martin str r2,[sp,#11*4] 1619 1.1 martin eor r2,r6,r7 1620 1.1 martin add r8,r8,r0,ror#6 @ h+=Sigma1(e) 1621 1.1 martin and r2,r2,r5 1622 1.1 martin add r8,r8,r3 @ h+=K256[i] 1623 1.1 martin eor r2,r2,r7 @ Ch(e,f,g) 1624 1.1 martin eor r0,r9,r9,ror#11 1625 1.1 martin add r8,r8,r2 @ h+=Ch(e,f,g) 1626 1.1 martin #if 27==31 1627 1.1 martin and r3,r3,#0xff 1628 1.1 martin cmp r3,#0xf2 @ done? 1629 1.1 martin #endif 1630 1.1 martin #if 27<15 1631 1.1 martin # if __ARM_ARCH__>=7 1632 1.1 martin ldr r2,[r1],#4 @ prefetch 1633 1.1 martin # else 1634 1.1 martin ldrb r2,[r1,#3] 1635 1.1 martin # endif 1636 1.1 martin eor r3,r9,r10 @ a^b, b^c in next round 1637 1.1 martin #else 1638 1.1 martin ldr r2,[sp,#13*4] @ from future BODY_16_xx 1639 1.1 martin eor r3,r9,r10 @ a^b, b^c in next round 1640 1.1 martin ldr r1,[sp,#10*4] @ from future BODY_16_xx 1641 1.1 martin #endif 1642 1.1 martin eor r0,r0,r9,ror#20 @ Sigma0(a) 1643 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1644 1.1 martin add r4,r4,r8 @ d+=h 1645 1.1 martin eor r12,r12,r10 @ Maj(a,b,c) 1646 1.1 martin add r8,r8,r0,ror#2 @ h+=Sigma0(a) 1647 1.1 martin @ add r8,r8,r12 @ h+=Maj(a,b,c) 1648 1.1 martin @ ldr r2,[sp,#13*4] @ 28 1649 1.1 martin @ ldr r1,[sp,#10*4] 1650 1.1 martin mov r0,r2,ror#7 1651 1.1 martin add r8,r8,r12 @ h+=Maj(a,b,c) from the past 1652 1.1 martin mov r12,r1,ror#17 1653 1.1 martin eor r0,r0,r2,ror#18 1654 1.1 martin eor r12,r12,r1,ror#19 1655 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1656 1.1 martin ldr r2,[sp,#12*4] 1657 1.1 martin eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) 1658 1.1 martin ldr r1,[sp,#5*4] 1659 1.1 martin 1660 1.1 martin add r12,r12,r0 1661 1.1 martin eor r0,r4,r4,ror#5 @ from BODY_00_15 1662 1.1 martin add r2,r2,r12 1663 1.1 martin eor r0,r0,r4,ror#19 @ Sigma1(e) 1664 1.1 martin add r2,r2,r1 @ X[i] 1665 1.1 martin ldr r12,[r14],#4 @ *K256++ 1666 1.1 martin add r7,r7,r2 @ h+=X[i] 1667 1.1 martin str r2,[sp,#12*4] 1668 1.1 martin eor r2,r5,r6 1669 1.1 martin add r7,r7,r0,ror#6 @ h+=Sigma1(e) 1670 1.1 martin and r2,r2,r4 1671 1.1 martin add r7,r7,r12 @ h+=K256[i] 1672 1.1 martin eor r2,r2,r6 @ Ch(e,f,g) 1673 1.1 martin eor r0,r8,r8,ror#11 1674 1.1 martin add r7,r7,r2 @ h+=Ch(e,f,g) 1675 1.1 martin #if 28==31 1676 1.1 martin and r12,r12,#0xff 1677 1.1 martin cmp r12,#0xf2 @ done? 1678 1.1 martin #endif 1679 1.1 martin #if 28<15 1680 1.1 martin # if __ARM_ARCH__>=7 1681 1.1 martin ldr r2,[r1],#4 @ prefetch 1682 1.1 martin # else 1683 1.1 martin ldrb r2,[r1,#3] 1684 1.1 martin # endif 1685 1.1 martin eor r12,r8,r9 @ a^b, b^c in next round 1686 1.1 martin #else 1687 1.1 martin ldr r2,[sp,#14*4] @ from future BODY_16_xx 1688 1.1 martin eor r12,r8,r9 @ a^b, b^c in next round 1689 1.1 martin ldr r1,[sp,#11*4] @ from future BODY_16_xx 1690 1.1 martin #endif 1691 1.1 martin eor r0,r0,r8,ror#20 @ Sigma0(a) 1692 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 1693 1.1 martin add r11,r11,r7 @ d+=h 1694 1.1 martin eor r3,r3,r9 @ Maj(a,b,c) 1695 1.1 martin add r7,r7,r0,ror#2 @ h+=Sigma0(a) 1696 1.1 martin @ add r7,r7,r3 @ h+=Maj(a,b,c) 1697 1.1 martin @ ldr r2,[sp,#14*4] @ 29 1698 1.1 martin @ ldr r1,[sp,#11*4] 1699 1.1 martin mov r0,r2,ror#7 1700 1.1 martin add r7,r7,r3 @ h+=Maj(a,b,c) from the past 1701 1.1 martin mov r3,r1,ror#17 1702 1.1 martin eor r0,r0,r2,ror#18 1703 1.1 martin eor r3,r3,r1,ror#19 1704 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1705 1.1 martin ldr r2,[sp,#13*4] 1706 1.1 martin eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) 1707 1.1 martin ldr r1,[sp,#6*4] 1708 1.1 martin 1709 1.1 martin add r3,r3,r0 1710 1.1 martin eor r0,r11,r11,ror#5 @ from BODY_00_15 1711 1.1 martin add r2,r2,r3 1712 1.1 martin eor r0,r0,r11,ror#19 @ Sigma1(e) 1713 1.1 martin add r2,r2,r1 @ X[i] 1714 1.1 martin ldr r3,[r14],#4 @ *K256++ 1715 1.1 martin add r6,r6,r2 @ h+=X[i] 1716 1.1 martin str r2,[sp,#13*4] 1717 1.1 martin eor r2,r4,r5 1718 1.1 martin add r6,r6,r0,ror#6 @ h+=Sigma1(e) 1719 1.1 martin and r2,r2,r11 1720 1.1 martin add r6,r6,r3 @ h+=K256[i] 1721 1.1 martin eor r2,r2,r5 @ Ch(e,f,g) 1722 1.1 martin eor r0,r7,r7,ror#11 1723 1.1 martin add r6,r6,r2 @ h+=Ch(e,f,g) 1724 1.1 martin #if 29==31 1725 1.1 martin and r3,r3,#0xff 1726 1.1 martin cmp r3,#0xf2 @ done? 1727 1.1 martin #endif 1728 1.1 martin #if 29<15 1729 1.1 martin # if __ARM_ARCH__>=7 1730 1.1 martin ldr r2,[r1],#4 @ prefetch 1731 1.1 martin # else 1732 1.1 martin ldrb r2,[r1,#3] 1733 1.1 martin # endif 1734 1.1 martin eor r3,r7,r8 @ a^b, b^c in next round 1735 1.1 martin #else 1736 1.1 martin ldr r2,[sp,#15*4] @ from future BODY_16_xx 1737 1.1 martin eor r3,r7,r8 @ a^b, b^c in next round 1738 1.1 martin ldr r1,[sp,#12*4] @ from future BODY_16_xx 1739 1.1 martin #endif 1740 1.1 martin eor r0,r0,r7,ror#20 @ Sigma0(a) 1741 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1742 1.1 martin add r10,r10,r6 @ d+=h 1743 1.1 martin eor r12,r12,r8 @ Maj(a,b,c) 1744 1.1 martin add r6,r6,r0,ror#2 @ h+=Sigma0(a) 1745 1.1 martin @ add r6,r6,r12 @ h+=Maj(a,b,c) 1746 1.1 martin @ ldr r2,[sp,#15*4] @ 30 1747 1.1 martin @ ldr r1,[sp,#12*4] 1748 1.1 martin mov r0,r2,ror#7 1749 1.1 martin add r6,r6,r12 @ h+=Maj(a,b,c) from the past 1750 1.1 martin mov r12,r1,ror#17 1751 1.1 martin eor r0,r0,r2,ror#18 1752 1.1 martin eor r12,r12,r1,ror#19 1753 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1754 1.1 martin ldr r2,[sp,#14*4] 1755 1.1 martin eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) 1756 1.1 martin ldr r1,[sp,#7*4] 1757 1.1 martin 1758 1.1 martin add r12,r12,r0 1759 1.1 martin eor r0,r10,r10,ror#5 @ from BODY_00_15 1760 1.1 martin add r2,r2,r12 1761 1.1 martin eor r0,r0,r10,ror#19 @ Sigma1(e) 1762 1.1 martin add r2,r2,r1 @ X[i] 1763 1.1 martin ldr r12,[r14],#4 @ *K256++ 1764 1.1 martin add r5,r5,r2 @ h+=X[i] 1765 1.1 martin str r2,[sp,#14*4] 1766 1.1 martin eor r2,r11,r4 1767 1.1 martin add r5,r5,r0,ror#6 @ h+=Sigma1(e) 1768 1.1 martin and r2,r2,r10 1769 1.1 martin add r5,r5,r12 @ h+=K256[i] 1770 1.1 martin eor r2,r2,r4 @ Ch(e,f,g) 1771 1.1 martin eor r0,r6,r6,ror#11 1772 1.1 martin add r5,r5,r2 @ h+=Ch(e,f,g) 1773 1.1 martin #if 30==31 1774 1.1 martin and r12,r12,#0xff 1775 1.1 martin cmp r12,#0xf2 @ done? 1776 1.1 martin #endif 1777 1.1 martin #if 30<15 1778 1.1 martin # if __ARM_ARCH__>=7 1779 1.1 martin ldr r2,[r1],#4 @ prefetch 1780 1.1 martin # else 1781 1.1 martin ldrb r2,[r1,#3] 1782 1.1 martin # endif 1783 1.1 martin eor r12,r6,r7 @ a^b, b^c in next round 1784 1.1 martin #else 1785 1.1 martin ldr r2,[sp,#0*4] @ from future BODY_16_xx 1786 1.1 martin eor r12,r6,r7 @ a^b, b^c in next round 1787 1.1 martin ldr r1,[sp,#13*4] @ from future BODY_16_xx 1788 1.1 martin #endif 1789 1.1 martin eor r0,r0,r6,ror#20 @ Sigma0(a) 1790 1.1 martin and r3,r3,r12 @ (b^c)&=(a^b) 1791 1.1 martin add r9,r9,r5 @ d+=h 1792 1.1 martin eor r3,r3,r7 @ Maj(a,b,c) 1793 1.1 martin add r5,r5,r0,ror#2 @ h+=Sigma0(a) 1794 1.1 martin @ add r5,r5,r3 @ h+=Maj(a,b,c) 1795 1.1 martin @ ldr r2,[sp,#0*4] @ 31 1796 1.1 martin @ ldr r1,[sp,#13*4] 1797 1.1 martin mov r0,r2,ror#7 1798 1.1 martin add r5,r5,r3 @ h+=Maj(a,b,c) from the past 1799 1.1 martin mov r3,r1,ror#17 1800 1.1 martin eor r0,r0,r2,ror#18 1801 1.1 martin eor r3,r3,r1,ror#19 1802 1.1 martin eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) 1803 1.1 martin ldr r2,[sp,#15*4] 1804 1.1 martin eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) 1805 1.1 martin ldr r1,[sp,#8*4] 1806 1.1 martin 1807 1.1 martin add r3,r3,r0 1808 1.1 martin eor r0,r9,r9,ror#5 @ from BODY_00_15 1809 1.1 martin add r2,r2,r3 1810 1.1 martin eor r0,r0,r9,ror#19 @ Sigma1(e) 1811 1.1 martin add r2,r2,r1 @ X[i] 1812 1.1 martin ldr r3,[r14],#4 @ *K256++ 1813 1.1 martin add r4,r4,r2 @ h+=X[i] 1814 1.1 martin str r2,[sp,#15*4] 1815 1.1 martin eor r2,r10,r11 1816 1.1 martin add r4,r4,r0,ror#6 @ h+=Sigma1(e) 1817 1.1 martin and r2,r2,r9 1818 1.1 martin add r4,r4,r3 @ h+=K256[i] 1819 1.1 martin eor r2,r2,r11 @ Ch(e,f,g) 1820 1.1 martin eor r0,r5,r5,ror#11 1821 1.1 martin add r4,r4,r2 @ h+=Ch(e,f,g) 1822 1.1 martin #if 31==31 1823 1.1 martin and r3,r3,#0xff 1824 1.1 martin cmp r3,#0xf2 @ done? 1825 1.1 martin #endif 1826 1.1 martin #if 31<15 1827 1.1 martin # if __ARM_ARCH__>=7 1828 1.1 martin ldr r2,[r1],#4 @ prefetch 1829 1.1 martin # else 1830 1.1 martin ldrb r2,[r1,#3] 1831 1.1 martin # endif 1832 1.1 martin eor r3,r5,r6 @ a^b, b^c in next round 1833 1.1 martin #else 1834 1.1 martin ldr r2,[sp,#1*4] @ from future BODY_16_xx 1835 1.1 martin eor r3,r5,r6 @ a^b, b^c in next round 1836 1.1 martin ldr r1,[sp,#14*4] @ from future BODY_16_xx 1837 1.1 martin #endif 1838 1.1 martin eor r0,r0,r5,ror#20 @ Sigma0(a) 1839 1.1 martin and r12,r12,r3 @ (b^c)&=(a^b) 1840 1.1 martin add r8,r8,r4 @ d+=h 1841 1.1 martin eor r12,r12,r6 @ Maj(a,b,c) 1842 1.1 martin add r4,r4,r0,ror#2 @ h+=Sigma0(a) 1843 1.1 martin @ add r4,r4,r12 @ h+=Maj(a,b,c) 1844 1.4 christos #ifdef __thumb2__ 1845 1.3 christos ite eq @ Thumb2 thing, sanity check in ARM 1846 1.3 christos #endif 1847 1.1 martin ldreq r3,[sp,#16*4] @ pull ctx 1848 1.1 martin bne .Lrounds_16_xx 1849 1.1 martin 1850 1.1 martin add r4,r4,r12 @ h+=Maj(a,b,c) from the past 1851 1.1 martin ldr r0,[r3,#0] 1852 1.1 martin ldr r2,[r3,#4] 1853 1.1 martin ldr r12,[r3,#8] 1854 1.1 martin add r4,r4,r0 1855 1.1 martin ldr r0,[r3,#12] 1856 1.1 martin add r5,r5,r2 1857 1.1 martin ldr r2,[r3,#16] 1858 1.1 martin add r6,r6,r12 1859 1.1 martin ldr r12,[r3,#20] 1860 1.1 martin add r7,r7,r0 1861 1.1 martin ldr r0,[r3,#24] 1862 1.1 martin add r8,r8,r2 1863 1.1 martin ldr r2,[r3,#28] 1864 1.1 martin add r9,r9,r12 1865 1.1 martin ldr r1,[sp,#17*4] @ pull inp 1866 1.1 martin ldr r12,[sp,#18*4] @ pull inp+len 1867 1.1 martin add r10,r10,r0 1868 1.1 martin add r11,r11,r2 1869 1.1 martin stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} 1870 1.1 martin cmp r1,r12 1871 1.1 martin sub r14,r14,#256 @ rewind Ktbl 1872 1.1 martin bne .Loop 1873 1.1 martin 1874 1.1 martin add sp,sp,#19*4 @ destroy frame 1875 1.1 martin #if __ARM_ARCH__>=5 1876 1.3 christos ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} 1877 1.1 martin #else 1878 1.3 christos ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,lr} 1879 1.1 martin tst lr,#1 1880 1.1 martin moveq pc,lr @ be binary compatible with V4, yet 1881 1.3 christos .word 0xe12fff1e @ interoperable with Thumb ISA:-) 1882 1.1 martin #endif 1883 1.1 martin .size sha256_block_data_order,.-sha256_block_data_order 1884 1.1 martin #if __ARM_MAX_ARCH__>=7 1885 1.1 martin .arch armv7-a 1886 1.1 martin .fpu neon 1887 1.1 martin 1888 1.3 christos .globl sha256_block_data_order_neon 1889 1.1 martin .type sha256_block_data_order_neon,%function 1890 1.3 christos .align 5 1891 1.3 christos .skip 16 1892 1.1 martin sha256_block_data_order_neon: 1893 1.1 martin .LNEON: 1894 1.3 christos stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} 1895 1.1 martin 1896 1.3 christos sub r11,sp,#16*4+16 1897 1.3 christos adr r14,K256 1898 1.3 christos bic r11,r11,#15 @ align for 128-bit stores 1899 1.1 martin mov r12,sp 1900 1.3 christos mov sp,r11 @ alloca 1901 1.3 christos add r2,r1,r2,lsl#6 @ len to point at the end of inp 1902 1.1 martin 1903 1.3 christos vld1.8 {q0},[r1]! 1904 1.3 christos vld1.8 {q1},[r1]! 1905 1.3 christos vld1.8 {q2},[r1]! 1906 1.3 christos vld1.8 {q3},[r1]! 1907 1.3 christos vld1.32 {q8},[r14,:128]! 1908 1.3 christos vld1.32 {q9},[r14,:128]! 1909 1.3 christos vld1.32 {q10},[r14,:128]! 1910 1.3 christos vld1.32 {q11},[r14,:128]! 1911 1.1 martin vrev32.8 q0,q0 @ yes, even on 1912 1.3 christos str r0,[sp,#64] 1913 1.1 martin vrev32.8 q1,q1 @ big-endian 1914 1.3 christos str r1,[sp,#68] 1915 1.3 christos mov r1,sp 1916 1.1 martin vrev32.8 q2,q2 1917 1.3 christos str r2,[sp,#72] 1918 1.1 martin vrev32.8 q3,q3 1919 1.3 christos str r12,[sp,#76] @ save original sp 1920 1.1 martin vadd.i32 q8,q8,q0 1921 1.1 martin vadd.i32 q9,q9,q1 1922 1.3 christos vst1.32 {q8},[r1,:128]! 1923 1.1 martin vadd.i32 q10,q10,q2 1924 1.3 christos vst1.32 {q9},[r1,:128]! 1925 1.1 martin vadd.i32 q11,q11,q3 1926 1.3 christos vst1.32 {q10},[r1,:128]! 1927 1.3 christos vst1.32 {q11},[r1,:128]! 1928 1.1 martin 1929 1.3 christos ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} 1930 1.3 christos sub r1,r1,#64 1931 1.3 christos ldr r2,[sp,#0] 1932 1.3 christos eor r12,r12,r12 1933 1.3 christos eor r3,r5,r6 1934 1.3 christos b .L_00_48 1935 1.1 martin 1936 1.1 martin .align 4 1937 1.1 martin .L_00_48: 1938 1.1 martin vext.8 q8,q0,q1,#4 1939 1.1 martin add r11,r11,r2 1940 1.1 martin eor r2,r9,r10 1941 1.1 martin eor r0,r8,r8,ror#5 1942 1.1 martin vext.8 q9,q2,q3,#4 1943 1.1 martin add r4,r4,r12 1944 1.1 martin and r2,r2,r8 1945 1.1 martin eor r12,r0,r8,ror#19 1946 1.1 martin vshr.u32 q10,q8,#7 1947 1.1 martin eor r0,r4,r4,ror#11 1948 1.1 martin eor r2,r2,r10 1949 1.1 martin vadd.i32 q0,q0,q9 1950 1.1 martin add r11,r11,r12,ror#6 1951 1.1 martin eor r12,r4,r5 1952 1.1 martin vshr.u32 q9,q8,#3 1953 1.1 martin eor r0,r0,r4,ror#20 1954 1.1 martin add r11,r11,r2 1955 1.1 martin vsli.32 q10,q8,#25 1956 1.1 martin ldr r2,[sp,#4] 1957 1.1 martin and r3,r3,r12 1958 1.1 martin vshr.u32 q11,q8,#18 1959 1.1 martin add r7,r7,r11 1960 1.1 martin add r11,r11,r0,ror#2 1961 1.1 martin eor r3,r3,r5 1962 1.1 martin veor q9,q9,q10 1963 1.1 martin add r10,r10,r2 1964 1.1 martin vsli.32 q11,q8,#14 1965 1.1 martin eor r2,r8,r9 1966 1.1 martin eor r0,r7,r7,ror#5 1967 1.1 martin vshr.u32 d24,d7,#17 1968 1.1 martin add r11,r11,r3 1969 1.1 martin and r2,r2,r7 1970 1.1 martin veor q9,q9,q11 1971 1.1 martin eor r3,r0,r7,ror#19 1972 1.1 martin eor r0,r11,r11,ror#11 1973 1.1 martin vsli.32 d24,d7,#15 1974 1.1 martin eor r2,r2,r9 1975 1.1 martin add r10,r10,r3,ror#6 1976 1.1 martin vshr.u32 d25,d7,#10 1977 1.1 martin eor r3,r11,r4 1978 1.1 martin eor r0,r0,r11,ror#20 1979 1.1 martin vadd.i32 q0,q0,q9 1980 1.1 martin add r10,r10,r2 1981 1.1 martin ldr r2,[sp,#8] 1982 1.1 martin veor d25,d25,d24 1983 1.1 martin and r12,r12,r3 1984 1.1 martin add r6,r6,r10 1985 1.1 martin vshr.u32 d24,d7,#19 1986 1.1 martin add r10,r10,r0,ror#2 1987 1.1 martin eor r12,r12,r4 1988 1.1 martin vsli.32 d24,d7,#13 1989 1.1 martin add r9,r9,r2 1990 1.1 martin eor r2,r7,r8 1991 1.1 martin veor d25,d25,d24 1992 1.1 martin eor r0,r6,r6,ror#5 1993 1.1 martin add r10,r10,r12 1994 1.1 martin vadd.i32 d0,d0,d25 1995 1.1 martin and r2,r2,r6 1996 1.1 martin eor r12,r0,r6,ror#19 1997 1.1 martin vshr.u32 d24,d0,#17 1998 1.1 martin eor r0,r10,r10,ror#11 1999 1.1 martin eor r2,r2,r8 2000 1.1 martin vsli.32 d24,d0,#15 2001 1.1 martin add r9,r9,r12,ror#6 2002 1.1 martin eor r12,r10,r11 2003 1.1 martin vshr.u32 d25,d0,#10 2004 1.1 martin eor r0,r0,r10,ror#20 2005 1.1 martin add r9,r9,r2 2006 1.1 martin veor d25,d25,d24 2007 1.1 martin ldr r2,[sp,#12] 2008 1.1 martin and r3,r3,r12 2009 1.1 martin vshr.u32 d24,d0,#19 2010 1.1 martin add r5,r5,r9 2011 1.1 martin add r9,r9,r0,ror#2 2012 1.1 martin eor r3,r3,r11 2013 1.1 martin vld1.32 {q8},[r14,:128]! 2014 1.1 martin add r8,r8,r2 2015 1.1 martin vsli.32 d24,d0,#13 2016 1.1 martin eor r2,r6,r7 2017 1.1 martin eor r0,r5,r5,ror#5 2018 1.1 martin veor d25,d25,d24 2019 1.1 martin add r9,r9,r3 2020 1.1 martin and r2,r2,r5 2021 1.1 martin vadd.i32 d1,d1,d25 2022 1.1 martin eor r3,r0,r5,ror#19 2023 1.1 martin eor r0,r9,r9,ror#11 2024 1.1 martin vadd.i32 q8,q8,q0 2025 1.1 martin eor r2,r2,r7 2026 1.1 martin add r8,r8,r3,ror#6 2027 1.1 martin eor r3,r9,r10 2028 1.1 martin eor r0,r0,r9,ror#20 2029 1.1 martin add r8,r8,r2 2030 1.1 martin ldr r2,[sp,#16] 2031 1.1 martin and r12,r12,r3 2032 1.1 martin add r4,r4,r8 2033 1.1 martin vst1.32 {q8},[r1,:128]! 2034 1.1 martin add r8,r8,r0,ror#2 2035 1.1 martin eor r12,r12,r10 2036 1.1 martin vext.8 q8,q1,q2,#4 2037 1.1 martin add r7,r7,r2 2038 1.1 martin eor r2,r5,r6 2039 1.1 martin eor r0,r4,r4,ror#5 2040 1.1 martin vext.8 q9,q3,q0,#4 2041 1.1 martin add r8,r8,r12 2042 1.1 martin and r2,r2,r4 2043 1.1 martin eor r12,r0,r4,ror#19 2044 1.1 martin vshr.u32 q10,q8,#7 2045 1.1 martin eor r0,r8,r8,ror#11 2046 1.1 martin eor r2,r2,r6 2047 1.1 martin vadd.i32 q1,q1,q9 2048 1.1 martin add r7,r7,r12,ror#6 2049 1.1 martin eor r12,r8,r9 2050 1.1 martin vshr.u32 q9,q8,#3 2051 1.1 martin eor r0,r0,r8,ror#20 2052 1.1 martin add r7,r7,r2 2053 1.1 martin vsli.32 q10,q8,#25 2054 1.1 martin ldr r2,[sp,#20] 2055 1.1 martin and r3,r3,r12 2056 1.1 martin vshr.u32 q11,q8,#18 2057 1.1 martin add r11,r11,r7 2058 1.1 martin add r7,r7,r0,ror#2 2059 1.1 martin eor r3,r3,r9 2060 1.1 martin veor q9,q9,q10 2061 1.1 martin add r6,r6,r2 2062 1.1 martin vsli.32 q11,q8,#14 2063 1.1 martin eor r2,r4,r5 2064 1.1 martin eor r0,r11,r11,ror#5 2065 1.1 martin vshr.u32 d24,d1,#17 2066 1.1 martin add r7,r7,r3 2067 1.1 martin and r2,r2,r11 2068 1.1 martin veor q9,q9,q11 2069 1.1 martin eor r3,r0,r11,ror#19 2070 1.1 martin eor r0,r7,r7,ror#11 2071 1.1 martin vsli.32 d24,d1,#15 2072 1.1 martin eor r2,r2,r5 2073 1.1 martin add r6,r6,r3,ror#6 2074 1.1 martin vshr.u32 d25,d1,#10 2075 1.1 martin eor r3,r7,r8 2076 1.1 martin eor r0,r0,r7,ror#20 2077 1.1 martin vadd.i32 q1,q1,q9 2078 1.1 martin add r6,r6,r2 2079 1.1 martin ldr r2,[sp,#24] 2080 1.1 martin veor d25,d25,d24 2081 1.1 martin and r12,r12,r3 2082 1.1 martin add r10,r10,r6 2083 1.1 martin vshr.u32 d24,d1,#19 2084 1.1 martin add r6,r6,r0,ror#2 2085 1.1 martin eor r12,r12,r8 2086 1.1 martin vsli.32 d24,d1,#13 2087 1.1 martin add r5,r5,r2 2088 1.1 martin eor r2,r11,r4 2089 1.1 martin veor d25,d25,d24 2090 1.1 martin eor r0,r10,r10,ror#5 2091 1.1 martin add r6,r6,r12 2092 1.1 martin vadd.i32 d2,d2,d25 2093 1.1 martin and r2,r2,r10 2094 1.1 martin eor r12,r0,r10,ror#19 2095 1.1 martin vshr.u32 d24,d2,#17 2096 1.1 martin eor r0,r6,r6,ror#11 2097 1.1 martin eor r2,r2,r4 2098 1.1 martin vsli.32 d24,d2,#15 2099 1.1 martin add r5,r5,r12,ror#6 2100 1.1 martin eor r12,r6,r7 2101 1.1 martin vshr.u32 d25,d2,#10 2102 1.1 martin eor r0,r0,r6,ror#20 2103 1.1 martin add r5,r5,r2 2104 1.1 martin veor d25,d25,d24 2105 1.1 martin ldr r2,[sp,#28] 2106 1.1 martin and r3,r3,r12 2107 1.1 martin vshr.u32 d24,d2,#19 2108 1.1 martin add r9,r9,r5 2109 1.1 martin add r5,r5,r0,ror#2 2110 1.1 martin eor r3,r3,r7 2111 1.1 martin vld1.32 {q8},[r14,:128]! 2112 1.1 martin add r4,r4,r2 2113 1.1 martin vsli.32 d24,d2,#13 2114 1.1 martin eor r2,r10,r11 2115 1.1 martin eor r0,r9,r9,ror#5 2116 1.1 martin veor d25,d25,d24 2117 1.1 martin add r5,r5,r3 2118 1.1 martin and r2,r2,r9 2119 1.1 martin vadd.i32 d3,d3,d25 2120 1.1 martin eor r3,r0,r9,ror#19 2121 1.1 martin eor r0,r5,r5,ror#11 2122 1.1 martin vadd.i32 q8,q8,q1 2123 1.1 martin eor r2,r2,r11 2124 1.1 martin add r4,r4,r3,ror#6 2125 1.1 martin eor r3,r5,r6 2126 1.1 martin eor r0,r0,r5,ror#20 2127 1.1 martin add r4,r4,r2 2128 1.1 martin ldr r2,[sp,#32] 2129 1.1 martin and r12,r12,r3 2130 1.1 martin add r8,r8,r4 2131 1.1 martin vst1.32 {q8},[r1,:128]! 2132 1.1 martin add r4,r4,r0,ror#2 2133 1.1 martin eor r12,r12,r6 2134 1.1 martin vext.8 q8,q2,q3,#4 2135 1.1 martin add r11,r11,r2 2136 1.1 martin eor r2,r9,r10 2137 1.1 martin eor r0,r8,r8,ror#5 2138 1.1 martin vext.8 q9,q0,q1,#4 2139 1.1 martin add r4,r4,r12 2140 1.1 martin and r2,r2,r8 2141 1.1 martin eor r12,r0,r8,ror#19 2142 1.1 martin vshr.u32 q10,q8,#7 2143 1.1 martin eor r0,r4,r4,ror#11 2144 1.1 martin eor r2,r2,r10 2145 1.1 martin vadd.i32 q2,q2,q9 2146 1.1 martin add r11,r11,r12,ror#6 2147 1.1 martin eor r12,r4,r5 2148 1.1 martin vshr.u32 q9,q8,#3 2149 1.1 martin eor r0,r0,r4,ror#20 2150 1.1 martin add r11,r11,r2 2151 1.1 martin vsli.32 q10,q8,#25 2152 1.1 martin ldr r2,[sp,#36] 2153 1.1 martin and r3,r3,r12 2154 1.1 martin vshr.u32 q11,q8,#18 2155 1.1 martin add r7,r7,r11 2156 1.1 martin add r11,r11,r0,ror#2 2157 1.1 martin eor r3,r3,r5 2158 1.1 martin veor q9,q9,q10 2159 1.1 martin add r10,r10,r2 2160 1.1 martin vsli.32 q11,q8,#14 2161 1.1 martin eor r2,r8,r9 2162 1.1 martin eor r0,r7,r7,ror#5 2163 1.1 martin vshr.u32 d24,d3,#17 2164 1.1 martin add r11,r11,r3 2165 1.1 martin and r2,r2,r7 2166 1.1 martin veor q9,q9,q11 2167 1.1 martin eor r3,r0,r7,ror#19 2168 1.1 martin eor r0,r11,r11,ror#11 2169 1.1 martin vsli.32 d24,d3,#15 2170 1.1 martin eor r2,r2,r9 2171 1.1 martin add r10,r10,r3,ror#6 2172 1.1 martin vshr.u32 d25,d3,#10 2173 1.1 martin eor r3,r11,r4 2174 1.1 martin eor r0,r0,r11,ror#20 2175 1.1 martin vadd.i32 q2,q2,q9 2176 1.1 martin add r10,r10,r2 2177 1.1 martin ldr r2,[sp,#40] 2178 1.1 martin veor d25,d25,d24 2179 1.1 martin and r12,r12,r3 2180 1.1 martin add r6,r6,r10 2181 1.1 martin vshr.u32 d24,d3,#19 2182 1.1 martin add r10,r10,r0,ror#2 2183 1.1 martin eor r12,r12,r4 2184 1.1 martin vsli.32 d24,d3,#13 2185 1.1 martin add r9,r9,r2 2186 1.1 martin eor r2,r7,r8 2187 1.1 martin veor d25,d25,d24 2188 1.1 martin eor r0,r6,r6,ror#5 2189 1.1 martin add r10,r10,r12 2190 1.1 martin vadd.i32 d4,d4,d25 2191 1.1 martin and r2,r2,r6 2192 1.1 martin eor r12,r0,r6,ror#19 2193 1.1 martin vshr.u32 d24,d4,#17 2194 1.1 martin eor r0,r10,r10,ror#11 2195 1.1 martin eor r2,r2,r8 2196 1.1 martin vsli.32 d24,d4,#15 2197 1.1 martin add r9,r9,r12,ror#6 2198 1.1 martin eor r12,r10,r11 2199 1.1 martin vshr.u32 d25,d4,#10 2200 1.1 martin eor r0,r0,r10,ror#20 2201 1.1 martin add r9,r9,r2 2202 1.1 martin veor d25,d25,d24 2203 1.1 martin ldr r2,[sp,#44] 2204 1.1 martin and r3,r3,r12 2205 1.1 martin vshr.u32 d24,d4,#19 2206 1.1 martin add r5,r5,r9 2207 1.1 martin add r9,r9,r0,ror#2 2208 1.1 martin eor r3,r3,r11 2209 1.1 martin vld1.32 {q8},[r14,:128]! 2210 1.1 martin add r8,r8,r2 2211 1.1 martin vsli.32 d24,d4,#13 2212 1.1 martin eor r2,r6,r7 2213 1.1 martin eor r0,r5,r5,ror#5 2214 1.1 martin veor d25,d25,d24 2215 1.1 martin add r9,r9,r3 2216 1.1 martin and r2,r2,r5 2217 1.1 martin vadd.i32 d5,d5,d25 2218 1.1 martin eor r3,r0,r5,ror#19 2219 1.1 martin eor r0,r9,r9,ror#11 2220 1.1 martin vadd.i32 q8,q8,q2 2221 1.1 martin eor r2,r2,r7 2222 1.1 martin add r8,r8,r3,ror#6 2223 1.1 martin eor r3,r9,r10 2224 1.1 martin eor r0,r0,r9,ror#20 2225 1.1 martin add r8,r8,r2 2226 1.1 martin ldr r2,[sp,#48] 2227 1.1 martin and r12,r12,r3 2228 1.1 martin add r4,r4,r8 2229 1.1 martin vst1.32 {q8},[r1,:128]! 2230 1.1 martin add r8,r8,r0,ror#2 2231 1.1 martin eor r12,r12,r10 2232 1.1 martin vext.8 q8,q3,q0,#4 2233 1.1 martin add r7,r7,r2 2234 1.1 martin eor r2,r5,r6 2235 1.1 martin eor r0,r4,r4,ror#5 2236 1.1 martin vext.8 q9,q1,q2,#4 2237 1.1 martin add r8,r8,r12 2238 1.1 martin and r2,r2,r4 2239 1.1 martin eor r12,r0,r4,ror#19 2240 1.1 martin vshr.u32 q10,q8,#7 2241 1.1 martin eor r0,r8,r8,ror#11 2242 1.1 martin eor r2,r2,r6 2243 1.1 martin vadd.i32 q3,q3,q9 2244 1.1 martin add r7,r7,r12,ror#6 2245 1.1 martin eor r12,r8,r9 2246 1.1 martin vshr.u32 q9,q8,#3 2247 1.1 martin eor r0,r0,r8,ror#20 2248 1.1 martin add r7,r7,r2 2249 1.1 martin vsli.32 q10,q8,#25 2250 1.1 martin ldr r2,[sp,#52] 2251 1.1 martin and r3,r3,r12 2252 1.1 martin vshr.u32 q11,q8,#18 2253 1.1 martin add r11,r11,r7 2254 1.1 martin add r7,r7,r0,ror#2 2255 1.1 martin eor r3,r3,r9 2256 1.1 martin veor q9,q9,q10 2257 1.1 martin add r6,r6,r2 2258 1.1 martin vsli.32 q11,q8,#14 2259 1.1 martin eor r2,r4,r5 2260 1.1 martin eor r0,r11,r11,ror#5 2261 1.1 martin vshr.u32 d24,d5,#17 2262 1.1 martin add r7,r7,r3 2263 1.1 martin and r2,r2,r11 2264 1.1 martin veor q9,q9,q11 2265 1.1 martin eor r3,r0,r11,ror#19 2266 1.1 martin eor r0,r7,r7,ror#11 2267 1.1 martin vsli.32 d24,d5,#15 2268 1.1 martin eor r2,r2,r5 2269 1.1 martin add r6,r6,r3,ror#6 2270 1.1 martin vshr.u32 d25,d5,#10 2271 1.1 martin eor r3,r7,r8 2272 1.1 martin eor r0,r0,r7,ror#20 2273 1.1 martin vadd.i32 q3,q3,q9 2274 1.1 martin add r6,r6,r2 2275 1.1 martin ldr r2,[sp,#56] 2276 1.1 martin veor d25,d25,d24 2277 1.1 martin and r12,r12,r3 2278 1.1 martin add r10,r10,r6 2279 1.1 martin vshr.u32 d24,d5,#19 2280 1.1 martin add r6,r6,r0,ror#2 2281 1.1 martin eor r12,r12,r8 2282 1.1 martin vsli.32 d24,d5,#13 2283 1.1 martin add r5,r5,r2 2284 1.1 martin eor r2,r11,r4 2285 1.1 martin veor d25,d25,d24 2286 1.1 martin eor r0,r10,r10,ror#5 2287 1.1 martin add r6,r6,r12 2288 1.1 martin vadd.i32 d6,d6,d25 2289 1.1 martin and r2,r2,r10 2290 1.1 martin eor r12,r0,r10,ror#19 2291 1.1 martin vshr.u32 d24,d6,#17 2292 1.1 martin eor r0,r6,r6,ror#11 2293 1.1 martin eor r2,r2,r4 2294 1.1 martin vsli.32 d24,d6,#15 2295 1.1 martin add r5,r5,r12,ror#6 2296 1.1 martin eor r12,r6,r7 2297 1.1 martin vshr.u32 d25,d6,#10 2298 1.1 martin eor r0,r0,r6,ror#20 2299 1.1 martin add r5,r5,r2 2300 1.1 martin veor d25,d25,d24 2301 1.1 martin ldr r2,[sp,#60] 2302 1.1 martin and r3,r3,r12 2303 1.1 martin vshr.u32 d24,d6,#19 2304 1.1 martin add r9,r9,r5 2305 1.1 martin add r5,r5,r0,ror#2 2306 1.1 martin eor r3,r3,r7 2307 1.1 martin vld1.32 {q8},[r14,:128]! 2308 1.1 martin add r4,r4,r2 2309 1.1 martin vsli.32 d24,d6,#13 2310 1.1 martin eor r2,r10,r11 2311 1.1 martin eor r0,r9,r9,ror#5 2312 1.1 martin veor d25,d25,d24 2313 1.1 martin add r5,r5,r3 2314 1.1 martin and r2,r2,r9 2315 1.1 martin vadd.i32 d7,d7,d25 2316 1.1 martin eor r3,r0,r9,ror#19 2317 1.1 martin eor r0,r5,r5,ror#11 2318 1.1 martin vadd.i32 q8,q8,q3 2319 1.1 martin eor r2,r2,r11 2320 1.1 martin add r4,r4,r3,ror#6 2321 1.1 martin eor r3,r5,r6 2322 1.1 martin eor r0,r0,r5,ror#20 2323 1.1 martin add r4,r4,r2 2324 1.1 martin ldr r2,[r14] 2325 1.1 martin and r12,r12,r3 2326 1.1 martin add r8,r8,r4 2327 1.1 martin vst1.32 {q8},[r1,:128]! 2328 1.1 martin add r4,r4,r0,ror#2 2329 1.1 martin eor r12,r12,r6 2330 1.1 martin teq r2,#0 @ check for K256 terminator 2331 1.1 martin ldr r2,[sp,#0] 2332 1.1 martin sub r1,r1,#64 2333 1.1 martin bne .L_00_48 2334 1.1 martin 2335 1.3 christos ldr r1,[sp,#68] 2336 1.3 christos ldr r0,[sp,#72] 2337 1.3 christos sub r14,r14,#256 @ rewind r14 2338 1.3 christos teq r1,r0 2339 1.3 christos it eq 2340 1.3 christos subeq r1,r1,#64 @ avoid SEGV 2341 1.3 christos vld1.8 {q0},[r1]! @ load next input block 2342 1.3 christos vld1.8 {q1},[r1]! 2343 1.3 christos vld1.8 {q2},[r1]! 2344 1.3 christos vld1.8 {q3},[r1]! 2345 1.3 christos it ne 2346 1.3 christos strne r1,[sp,#68] 2347 1.3 christos mov r1,sp 2348 1.1 martin add r11,r11,r2 2349 1.1 martin eor r2,r9,r10 2350 1.1 martin eor r0,r8,r8,ror#5 2351 1.1 martin add r4,r4,r12 2352 1.1 martin vld1.32 {q8},[r14,:128]! 2353 1.1 martin and r2,r2,r8 2354 1.1 martin eor r12,r0,r8,ror#19 2355 1.1 martin eor r0,r4,r4,ror#11 2356 1.1 martin eor r2,r2,r10 2357 1.1 martin vrev32.8 q0,q0 2358 1.1 martin add r11,r11,r12,ror#6 2359 1.1 martin eor r12,r4,r5 2360 1.1 martin eor r0,r0,r4,ror#20 2361 1.1 martin add r11,r11,r2 2362 1.1 martin vadd.i32 q8,q8,q0 2363 1.1 martin ldr r2,[sp,#4] 2364 1.1 martin and r3,r3,r12 2365 1.1 martin add r7,r7,r11 2366 1.1 martin add r11,r11,r0,ror#2 2367 1.1 martin eor r3,r3,r5 2368 1.1 martin add r10,r10,r2 2369 1.1 martin eor r2,r8,r9 2370 1.1 martin eor r0,r7,r7,ror#5 2371 1.1 martin add r11,r11,r3 2372 1.1 martin and r2,r2,r7 2373 1.1 martin eor r3,r0,r7,ror#19 2374 1.1 martin eor r0,r11,r11,ror#11 2375 1.1 martin eor r2,r2,r9 2376 1.1 martin add r10,r10,r3,ror#6 2377 1.1 martin eor r3,r11,r4 2378 1.1 martin eor r0,r0,r11,ror#20 2379 1.1 martin add r10,r10,r2 2380 1.1 martin ldr r2,[sp,#8] 2381 1.1 martin and r12,r12,r3 2382 1.1 martin add r6,r6,r10 2383 1.1 martin add r10,r10,r0,ror#2 2384 1.1 martin eor r12,r12,r4 2385 1.1 martin add r9,r9,r2 2386 1.1 martin eor r2,r7,r8 2387 1.1 martin eor r0,r6,r6,ror#5 2388 1.1 martin add r10,r10,r12 2389 1.1 martin and r2,r2,r6 2390 1.1 martin eor r12,r0,r6,ror#19 2391 1.1 martin eor r0,r10,r10,ror#11 2392 1.1 martin eor r2,r2,r8 2393 1.1 martin add r9,r9,r12,ror#6 2394 1.1 martin eor r12,r10,r11 2395 1.1 martin eor r0,r0,r10,ror#20 2396 1.1 martin add r9,r9,r2 2397 1.1 martin ldr r2,[sp,#12] 2398 1.1 martin and r3,r3,r12 2399 1.1 martin add r5,r5,r9 2400 1.1 martin add r9,r9,r0,ror#2 2401 1.1 martin eor r3,r3,r11 2402 1.1 martin add r8,r8,r2 2403 1.1 martin eor r2,r6,r7 2404 1.1 martin eor r0,r5,r5,ror#5 2405 1.1 martin add r9,r9,r3 2406 1.1 martin and r2,r2,r5 2407 1.1 martin eor r3,r0,r5,ror#19 2408 1.1 martin eor r0,r9,r9,ror#11 2409 1.1 martin eor r2,r2,r7 2410 1.1 martin add r8,r8,r3,ror#6 2411 1.1 martin eor r3,r9,r10 2412 1.1 martin eor r0,r0,r9,ror#20 2413 1.1 martin add r8,r8,r2 2414 1.1 martin ldr r2,[sp,#16] 2415 1.1 martin and r12,r12,r3 2416 1.1 martin add r4,r4,r8 2417 1.1 martin add r8,r8,r0,ror#2 2418 1.1 martin eor r12,r12,r10 2419 1.1 martin vst1.32 {q8},[r1,:128]! 2420 1.1 martin add r7,r7,r2 2421 1.1 martin eor r2,r5,r6 2422 1.1 martin eor r0,r4,r4,ror#5 2423 1.1 martin add r8,r8,r12 2424 1.1 martin vld1.32 {q8},[r14,:128]! 2425 1.1 martin and r2,r2,r4 2426 1.1 martin eor r12,r0,r4,ror#19 2427 1.1 martin eor r0,r8,r8,ror#11 2428 1.1 martin eor r2,r2,r6 2429 1.1 martin vrev32.8 q1,q1 2430 1.1 martin add r7,r7,r12,ror#6 2431 1.1 martin eor r12,r8,r9 2432 1.1 martin eor r0,r0,r8,ror#20 2433 1.1 martin add r7,r7,r2 2434 1.1 martin vadd.i32 q8,q8,q1 2435 1.1 martin ldr r2,[sp,#20] 2436 1.1 martin and r3,r3,r12 2437 1.1 martin add r11,r11,r7 2438 1.1 martin add r7,r7,r0,ror#2 2439 1.1 martin eor r3,r3,r9 2440 1.1 martin add r6,r6,r2 2441 1.1 martin eor r2,r4,r5 2442 1.1 martin eor r0,r11,r11,ror#5 2443 1.1 martin add r7,r7,r3 2444 1.1 martin and r2,r2,r11 2445 1.1 martin eor r3,r0,r11,ror#19 2446 1.1 martin eor r0,r7,r7,ror#11 2447 1.1 martin eor r2,r2,r5 2448 1.1 martin add r6,r6,r3,ror#6 2449 1.1 martin eor r3,r7,r8 2450 1.1 martin eor r0,r0,r7,ror#20 2451 1.1 martin add r6,r6,r2 2452 1.1 martin ldr r2,[sp,#24] 2453 1.1 martin and r12,r12,r3 2454 1.1 martin add r10,r10,r6 2455 1.1 martin add r6,r6,r0,ror#2 2456 1.1 martin eor r12,r12,r8 2457 1.1 martin add r5,r5,r2 2458 1.1 martin eor r2,r11,r4 2459 1.1 martin eor r0,r10,r10,ror#5 2460 1.1 martin add r6,r6,r12 2461 1.1 martin and r2,r2,r10 2462 1.1 martin eor r12,r0,r10,ror#19 2463 1.1 martin eor r0,r6,r6,ror#11 2464 1.1 martin eor r2,r2,r4 2465 1.1 martin add r5,r5,r12,ror#6 2466 1.1 martin eor r12,r6,r7 2467 1.1 martin eor r0,r0,r6,ror#20 2468 1.1 martin add r5,r5,r2 2469 1.1 martin ldr r2,[sp,#28] 2470 1.1 martin and r3,r3,r12 2471 1.1 martin add r9,r9,r5 2472 1.1 martin add r5,r5,r0,ror#2 2473 1.1 martin eor r3,r3,r7 2474 1.1 martin add r4,r4,r2 2475 1.1 martin eor r2,r10,r11 2476 1.1 martin eor r0,r9,r9,ror#5 2477 1.1 martin add r5,r5,r3 2478 1.1 martin and r2,r2,r9 2479 1.1 martin eor r3,r0,r9,ror#19 2480 1.1 martin eor r0,r5,r5,ror#11 2481 1.1 martin eor r2,r2,r11 2482 1.1 martin add r4,r4,r3,ror#6 2483 1.1 martin eor r3,r5,r6 2484 1.1 martin eor r0,r0,r5,ror#20 2485 1.1 martin add r4,r4,r2 2486 1.1 martin ldr r2,[sp,#32] 2487 1.1 martin and r12,r12,r3 2488 1.1 martin add r8,r8,r4 2489 1.1 martin add r4,r4,r0,ror#2 2490 1.1 martin eor r12,r12,r6 2491 1.1 martin vst1.32 {q8},[r1,:128]! 2492 1.1 martin add r11,r11,r2 2493 1.1 martin eor r2,r9,r10 2494 1.1 martin eor r0,r8,r8,ror#5 2495 1.1 martin add r4,r4,r12 2496 1.1 martin vld1.32 {q8},[r14,:128]! 2497 1.1 martin and r2,r2,r8 2498 1.1 martin eor r12,r0,r8,ror#19 2499 1.1 martin eor r0,r4,r4,ror#11 2500 1.1 martin eor r2,r2,r10 2501 1.1 martin vrev32.8 q2,q2 2502 1.1 martin add r11,r11,r12,ror#6 2503 1.1 martin eor r12,r4,r5 2504 1.1 martin eor r0,r0,r4,ror#20 2505 1.1 martin add r11,r11,r2 2506 1.1 martin vadd.i32 q8,q8,q2 2507 1.1 martin ldr r2,[sp,#36] 2508 1.1 martin and r3,r3,r12 2509 1.1 martin add r7,r7,r11 2510 1.1 martin add r11,r11,r0,ror#2 2511 1.1 martin eor r3,r3,r5 2512 1.1 martin add r10,r10,r2 2513 1.1 martin eor r2,r8,r9 2514 1.1 martin eor r0,r7,r7,ror#5 2515 1.1 martin add r11,r11,r3 2516 1.1 martin and r2,r2,r7 2517 1.1 martin eor r3,r0,r7,ror#19 2518 1.1 martin eor r0,r11,r11,ror#11 2519 1.1 martin eor r2,r2,r9 2520 1.1 martin add r10,r10,r3,ror#6 2521 1.1 martin eor r3,r11,r4 2522 1.1 martin eor r0,r0,r11,ror#20 2523 1.1 martin add r10,r10,r2 2524 1.1 martin ldr r2,[sp,#40] 2525 1.1 martin and r12,r12,r3 2526 1.1 martin add r6,r6,r10 2527 1.1 martin add r10,r10,r0,ror#2 2528 1.1 martin eor r12,r12,r4 2529 1.1 martin add r9,r9,r2 2530 1.1 martin eor r2,r7,r8 2531 1.1 martin eor r0,r6,r6,ror#5 2532 1.1 martin add r10,r10,r12 2533 1.1 martin and r2,r2,r6 2534 1.1 martin eor r12,r0,r6,ror#19 2535 1.1 martin eor r0,r10,r10,ror#11 2536 1.1 martin eor r2,r2,r8 2537 1.1 martin add r9,r9,r12,ror#6 2538 1.1 martin eor r12,r10,r11 2539 1.1 martin eor r0,r0,r10,ror#20 2540 1.1 martin add r9,r9,r2 2541 1.1 martin ldr r2,[sp,#44] 2542 1.1 martin and r3,r3,r12 2543 1.1 martin add r5,r5,r9 2544 1.1 martin add r9,r9,r0,ror#2 2545 1.1 martin eor r3,r3,r11 2546 1.1 martin add r8,r8,r2 2547 1.1 martin eor r2,r6,r7 2548 1.1 martin eor r0,r5,r5,ror#5 2549 1.1 martin add r9,r9,r3 2550 1.1 martin and r2,r2,r5 2551 1.1 martin eor r3,r0,r5,ror#19 2552 1.1 martin eor r0,r9,r9,ror#11 2553 1.1 martin eor r2,r2,r7 2554 1.1 martin add r8,r8,r3,ror#6 2555 1.1 martin eor r3,r9,r10 2556 1.1 martin eor r0,r0,r9,ror#20 2557 1.1 martin add r8,r8,r2 2558 1.1 martin ldr r2,[sp,#48] 2559 1.1 martin and r12,r12,r3 2560 1.1 martin add r4,r4,r8 2561 1.1 martin add r8,r8,r0,ror#2 2562 1.1 martin eor r12,r12,r10 2563 1.1 martin vst1.32 {q8},[r1,:128]! 2564 1.1 martin add r7,r7,r2 2565 1.1 martin eor r2,r5,r6 2566 1.1 martin eor r0,r4,r4,ror#5 2567 1.1 martin add r8,r8,r12 2568 1.1 martin vld1.32 {q8},[r14,:128]! 2569 1.1 martin and r2,r2,r4 2570 1.1 martin eor r12,r0,r4,ror#19 2571 1.1 martin eor r0,r8,r8,ror#11 2572 1.1 martin eor r2,r2,r6 2573 1.1 martin vrev32.8 q3,q3 2574 1.1 martin add r7,r7,r12,ror#6 2575 1.1 martin eor r12,r8,r9 2576 1.1 martin eor r0,r0,r8,ror#20 2577 1.1 martin add r7,r7,r2 2578 1.1 martin vadd.i32 q8,q8,q3 2579 1.1 martin ldr r2,[sp,#52] 2580 1.1 martin and r3,r3,r12 2581 1.1 martin add r11,r11,r7 2582 1.1 martin add r7,r7,r0,ror#2 2583 1.1 martin eor r3,r3,r9 2584 1.1 martin add r6,r6,r2 2585 1.1 martin eor r2,r4,r5 2586 1.1 martin eor r0,r11,r11,ror#5 2587 1.1 martin add r7,r7,r3 2588 1.1 martin and r2,r2,r11 2589 1.1 martin eor r3,r0,r11,ror#19 2590 1.1 martin eor r0,r7,r7,ror#11 2591 1.1 martin eor r2,r2,r5 2592 1.1 martin add r6,r6,r3,ror#6 2593 1.1 martin eor r3,r7,r8 2594 1.1 martin eor r0,r0,r7,ror#20 2595 1.1 martin add r6,r6,r2 2596 1.1 martin ldr r2,[sp,#56] 2597 1.1 martin and r12,r12,r3 2598 1.1 martin add r10,r10,r6 2599 1.1 martin add r6,r6,r0,ror#2 2600 1.1 martin eor r12,r12,r8 2601 1.1 martin add r5,r5,r2 2602 1.1 martin eor r2,r11,r4 2603 1.1 martin eor r0,r10,r10,ror#5 2604 1.1 martin add r6,r6,r12 2605 1.1 martin and r2,r2,r10 2606 1.1 martin eor r12,r0,r10,ror#19 2607 1.1 martin eor r0,r6,r6,ror#11 2608 1.1 martin eor r2,r2,r4 2609 1.1 martin add r5,r5,r12,ror#6 2610 1.1 martin eor r12,r6,r7 2611 1.1 martin eor r0,r0,r6,ror#20 2612 1.1 martin add r5,r5,r2 2613 1.1 martin ldr r2,[sp,#60] 2614 1.1 martin and r3,r3,r12 2615 1.1 martin add r9,r9,r5 2616 1.1 martin add r5,r5,r0,ror#2 2617 1.1 martin eor r3,r3,r7 2618 1.1 martin add r4,r4,r2 2619 1.1 martin eor r2,r10,r11 2620 1.1 martin eor r0,r9,r9,ror#5 2621 1.1 martin add r5,r5,r3 2622 1.1 martin and r2,r2,r9 2623 1.1 martin eor r3,r0,r9,ror#19 2624 1.1 martin eor r0,r5,r5,ror#11 2625 1.1 martin eor r2,r2,r11 2626 1.1 martin add r4,r4,r3,ror#6 2627 1.1 martin eor r3,r5,r6 2628 1.1 martin eor r0,r0,r5,ror#20 2629 1.1 martin add r4,r4,r2 2630 1.1 martin ldr r2,[sp,#64] 2631 1.1 martin and r12,r12,r3 2632 1.1 martin add r8,r8,r4 2633 1.1 martin add r4,r4,r0,ror#2 2634 1.1 martin eor r12,r12,r6 2635 1.1 martin vst1.32 {q8},[r1,:128]! 2636 1.1 martin ldr r0,[r2,#0] 2637 1.1 martin add r4,r4,r12 @ h+=Maj(a,b,c) from the past 2638 1.1 martin ldr r12,[r2,#4] 2639 1.1 martin ldr r3,[r2,#8] 2640 1.1 martin ldr r1,[r2,#12] 2641 1.1 martin add r4,r4,r0 @ accumulate 2642 1.1 martin ldr r0,[r2,#16] 2643 1.1 martin add r5,r5,r12 2644 1.1 martin ldr r12,[r2,#20] 2645 1.1 martin add r6,r6,r3 2646 1.1 martin ldr r3,[r2,#24] 2647 1.1 martin add r7,r7,r1 2648 1.1 martin ldr r1,[r2,#28] 2649 1.1 martin add r8,r8,r0 2650 1.1 martin str r4,[r2],#4 2651 1.1 martin add r9,r9,r12 2652 1.1 martin str r5,[r2],#4 2653 1.1 martin add r10,r10,r3 2654 1.1 martin str r6,[r2],#4 2655 1.1 martin add r11,r11,r1 2656 1.1 martin str r7,[r2],#4 2657 1.3 christos stmia r2,{r8,r9,r10,r11} 2658 1.1 martin 2659 1.3 christos ittte ne 2660 1.1 martin movne r1,sp 2661 1.1 martin ldrne r2,[sp,#0] 2662 1.1 martin eorne r12,r12,r12 2663 1.1 martin ldreq sp,[sp,#76] @ restore original sp 2664 1.3 christos itt ne 2665 1.1 martin eorne r3,r5,r6 2666 1.1 martin bne .L_00_48 2667 1.1 martin 2668 1.3 christos ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} 2669 1.1 martin .size sha256_block_data_order_neon,.-sha256_block_data_order_neon 2670 1.1 martin #endif 2671 1.3 christos #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) 2672 1.3 christos 2673 1.3 christos # if defined(__thumb2__) 2674 1.3 christos # define INST(a,b,c,d) .byte c,d|0xc,a,b 2675 1.3 christos # else 2676 1.3 christos # define INST(a,b,c,d) .byte a,b,c,d 2677 1.3 christos # endif 2678 1.3 christos 2679 1.1 martin .type sha256_block_data_order_armv8,%function 2680 1.1 martin .align 5 2681 1.1 martin sha256_block_data_order_armv8: 2682 1.1 martin .LARMv8: 2683 1.1 martin vld1.32 {q0,q1},[r0] 2684 1.3 christos sub r3,r3,#256+32 2685 1.3 christos add r2,r1,r2,lsl#6 @ len to point at the end of inp 2686 1.3 christos b .Loop_v8 2687 1.1 martin 2688 1.3 christos .align 4 2689 1.1 martin .Loop_v8: 2690 1.3 christos vld1.8 {q8,q9},[r1]! 2691 1.3 christos vld1.8 {q10,q11},[r1]! 2692 1.3 christos vld1.32 {q12},[r3]! 2693 1.1 martin vrev32.8 q8,q8 2694 1.1 martin vrev32.8 q9,q9 2695 1.1 martin vrev32.8 q10,q10 2696 1.1 martin vrev32.8 q11,q11 2697 1.3 christos vmov q14,q0 @ offload 2698 1.3 christos vmov q15,q1 2699 1.3 christos teq r1,r2 2700 1.3 christos vld1.32 {q13},[r3]! 2701 1.1 martin vadd.i32 q12,q12,q8 2702 1.3 christos INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 2703 1.3 christos vmov q2,q0 2704 1.3 christos INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 2705 1.3 christos INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 2706 1.3 christos INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 2707 1.3 christos vld1.32 {q12},[r3]! 2708 1.1 martin vadd.i32 q13,q13,q9 2709 1.3 christos INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 2710 1.3 christos vmov q2,q0 2711 1.3 christos INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 2712 1.3 christos INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 2713 1.3 christos INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 2714 1.3 christos vld1.32 {q13},[r3]! 2715 1.1 martin vadd.i32 q12,q12,q10 2716 1.3 christos INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 2717 1.3 christos vmov q2,q0 2718 1.3 christos INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 2719 1.3 christos INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 2720 1.3 christos INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 2721 1.3 christos vld1.32 {q12},[r3]! 2722 1.1 martin vadd.i32 q13,q13,q11 2723 1.3 christos INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 2724 1.3 christos vmov q2,q0 2725 1.3 christos INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 2726 1.3 christos INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 2727 1.3 christos INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 2728 1.3 christos vld1.32 {q13},[r3]! 2729 1.1 martin vadd.i32 q12,q12,q8 2730 1.3 christos INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 2731 1.3 christos vmov q2,q0 2732 1.3 christos INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 2733 1.3 christos INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 2734 1.3 christos INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 2735 1.3 christos vld1.32 {q12},[r3]! 2736 1.1 martin vadd.i32 q13,q13,q9 2737 1.3 christos INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 2738 1.3 christos vmov q2,q0 2739 1.3 christos INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 2740 1.3 christos INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 2741 1.3 christos INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 2742 1.3 christos vld1.32 {q13},[r3]! 2743 1.1 martin vadd.i32 q12,q12,q10 2744 1.3 christos INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 2745 1.3 christos vmov q2,q0 2746 1.3 christos INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 2747 1.3 christos INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 2748 1.3 christos INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 2749 1.3 christos vld1.32 {q12},[r3]! 2750 1.1 martin vadd.i32 q13,q13,q11 2751 1.3 christos INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 2752 1.3 christos vmov q2,q0 2753 1.3 christos INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 2754 1.3 christos INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 2755 1.3 christos INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 2756 1.3 christos vld1.32 {q13},[r3]! 2757 1.1 martin vadd.i32 q12,q12,q8 2758 1.3 christos INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 2759 1.3 christos vmov q2,q0 2760 1.3 christos INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 2761 1.3 christos INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 2762 1.3 christos INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 2763 1.3 christos vld1.32 {q12},[r3]! 2764 1.1 martin vadd.i32 q13,q13,q9 2765 1.3 christos INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 2766 1.3 christos vmov q2,q0 2767 1.3 christos INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 2768 1.3 christos INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 2769 1.3 christos INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 2770 1.3 christos vld1.32 {q13},[r3]! 2771 1.1 martin vadd.i32 q12,q12,q10 2772 1.3 christos INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 2773 1.3 christos vmov q2,q0 2774 1.3 christos INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 2775 1.3 christos INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 2776 1.3 christos INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 2777 1.3 christos vld1.32 {q12},[r3]! 2778 1.1 martin vadd.i32 q13,q13,q11 2779 1.3 christos INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 2780 1.3 christos vmov q2,q0 2781 1.3 christos INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 2782 1.3 christos INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 2783 1.3 christos INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 2784 1.3 christos vld1.32 {q13},[r3]! 2785 1.1 martin vadd.i32 q12,q12,q8 2786 1.3 christos vmov q2,q0 2787 1.3 christos INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 2788 1.3 christos INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 2789 1.1 martin 2790 1.3 christos vld1.32 {q12},[r3]! 2791 1.1 martin vadd.i32 q13,q13,q9 2792 1.3 christos vmov q2,q0 2793 1.3 christos INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 2794 1.3 christos INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 2795 1.1 martin 2796 1.3 christos vld1.32 {q13},[r3] 2797 1.1 martin vadd.i32 q12,q12,q10 2798 1.3 christos sub r3,r3,#256-16 @ rewind 2799 1.3 christos vmov q2,q0 2800 1.3 christos INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 2801 1.3 christos INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 2802 1.1 martin 2803 1.1 martin vadd.i32 q13,q13,q11 2804 1.3 christos vmov q2,q0 2805 1.3 christos INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 2806 1.3 christos INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 2807 1.1 martin 2808 1.1 martin vadd.i32 q0,q0,q14 2809 1.1 martin vadd.i32 q1,q1,q15 2810 1.3 christos it ne 2811 1.3 christos bne .Loop_v8 2812 1.1 martin 2813 1.3 christos vst1.32 {q0,q1},[r0] 2814 1.1 martin 2815 1.5 martin RET @ bx lr 2816 1.1 martin .size sha256_block_data_order_armv8,.-sha256_block_data_order_armv8 2817 1.1 martin #endif 2818 1.3 christos .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,47,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 2819 1.3 christos .align 2 2820 1.1 martin .align 2 2821 1.3 christos #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) 2822 1.3 christos .comm OPENSSL_armcap_P,4,4 2823 1.1 martin #endif 2824