avr-crypto-lib/seed-asm.S

91 lines
1.8 KiB
ArmAsm

/**
* \file seed-asm.S
* \author Daniel Otte
* \date 2007-06-1
* \brief SEED parts in assembler for AVR
* \par License
* GPL
*
*/
SPL = 0x3D
SPH = 0x3E
SREG = 0x3F
/*******************************************************************************
void changeendian32(uint32_t * a){
*a = (*a & 0x000000FF) << 24 |
(*a & 0x0000FF00) << 8 |
(*a & 0x00FF0000) >> 8 |
(*a & 0xFF000000) >> 24;
}
*/
/*
.global changeendian32
; === change_endian32 ===
; function that changes the endianess of a 32-bit word
; param1: the 32-bit word
; given in r25,r24,r23,22 (r25 is most significant)
; modifys: r21, r22
changeendian32:
movw r20, r22 ; (r22,r23) --> (r20,r21)
mov r22, r25
mov r23, r24
mov r24, r21
mov r25, r20
ret
*/
/*******************************************************************************
uint32_t bigendian_sum32(uint32_t a, uint32_t b){
changeendian32(&a);
changeendian32(&b);
a += b;
changeendian32(&a);
return a;
}
*/
.global bigendian_sum32
; === bigendian_sum32 ===
; function that adds two 32-bit words in the bigendian way and returns the result
; param1: the first 32-bit word
; given in r25,r24,r23,22 (r25 is most significant for little endian)
; param2: the second 32-bit word
; given in r21,r20,r19,18 (r21 is most significant for little endian)
; modifys:
bigendian_sum32:
add r25, r21
adc r24, r20
adc r23, r19
adc r22, r18
ret
.global bigendian_sub32
; === bigendian_sub32 ===
; function that subtracts a 32-bit words from another in the bigendian way and returns the result
; param1: the minuend 32-bit word
; given in r25,r24,r23,22 (r25 is most significant for little endian)
; param2: the subtrahend 32-bit word
; given in r21,r20,r19,18 (r21 is most significant for little endian)
; modifys:
bigendian_sub32:
sub r25, r21
sbc r24, r20
sbc r23, r19
sbc r22, r18
ret