X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;f=avr-asm-macros.S;h=63f9303519f69172b1b180dbcff2f471b8081978;hb=bcad01af2c86830bd59bd2fc719e81a7eaf2f13b;hp=698e23e11a7d5c9a3279fc6a0c12060bba683a03;hpb=288c82e97b3c37666b1c11475b45a956b3e5e8e0;p=avr-crypto-lib.git diff --git a/avr-asm-macros.S b/avr-asm-macros.S index 698e23e..63f9303 100644 --- a/avr-asm-macros.S +++ b/avr-asm-macros.S @@ -1,6 +1,6 @@ /* avr-asm-macros.S */ /* - This file is part of the Crypto-avr-lib/microcrypt-lib. + This file is part of the AVR-Crypto-Lib. Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) This program is free software: you can redistribute it and/or modify @@ -17,15 +17,15 @@ along with this program. If not, see . */ -/* +/* * File: avr-asm-macros.S * Author: Daniel Otte * Date: 2008-08-13 * License: GPLv3 or later * Description: some macros which are quite usefull - * + * */ - + #include /******************************************************************************* @@ -34,14 +34,14 @@ .macro push_ p1:req, p2:vararg push \p1 -.ifnb \p2 +.ifnb \p2 push_ \p2 .endif .endm .macro pop_ p1:req, p2:vararg pop \p1 -.ifnb \p2 +.ifnb \p2 pop_ \p2 .endif .endm @@ -50,13 +50,13 @@ push \from .if \to-\from push_range "(\from+1)",\to -.endif +.endif .endm .macro pop_range from:req, to:req pop \to .if \to-\from - pop_range \from,"(\to-1)" + pop_range \from,"(\to-1)" .endif .endm @@ -64,7 +64,7 @@ in r0, _SFR_IO_ADDR(SREG) in \reg1, _SFR_IO_ADDR(SPL) in \reg2, _SFR_IO_ADDR(SPH) - sbiw \reg1, \size + sbiw \reg1, \size cli out _SFR_IO_ADDR(SPH), \reg2 out _SFR_IO_ADDR(SREG), r0 @@ -75,7 +75,7 @@ in r0, _SFR_IO_ADDR(SREG) in \reg1, _SFR_IO_ADDR(SPL) in \reg2, _SFR_IO_ADDR(SPH) - adiw \reg1, \size + adiw \reg1, \size cli out _SFR_IO_ADDR(SPH), \reg2 out _SFR_IO_ADDR(SREG), r0 @@ -88,7 +88,7 @@ in \reg1, _SFR_IO_ADDR(SPL) in \reg2, _SFR_IO_ADDR(SPH) subi \reg1, lo8(\size) - sbci \reg2, hi8(\size) + sbci \reg2, hi8(\size) cli out _SFR_IO_ADDR(SPH), \reg2 out _SFR_IO_ADDR(SREG), r0 @@ -100,7 +100,7 @@ in \reg1, _SFR_IO_ADDR(SPL) in \reg2, _SFR_IO_ADDR(SPH) adiw \reg1, 63 - adiw \reg1, (\size-63) + adiw \reg1, (\size-63) cli out _SFR_IO_ADDR(SPH), \reg2 out _SFR_IO_ADDR(SREG), r0 @@ -113,7 +113,25 @@ in \reg2, _SFR_IO_ADDR(SPH) adiw \reg1, 63 adiw \reg1, 63 - adiw \reg1, (\size-63*2) + adiw \reg1, (\size-63*2) + cli + out _SFR_IO_ADDR(SPH), \reg2 + out _SFR_IO_ADDR(SREG), r0 + out _SFR_IO_ADDR(SPL), \reg1 +.endm + +.macro stack_free_large3 size:req, reg1=r30, reg2=r31 + in r0, _SFR_IO_ADDR(SREG) + in \reg1, _SFR_IO_ADDR(SPL) + in \reg2, _SFR_IO_ADDR(SPH) + push r16 + push r17 + ldi r16, lo8(\size) + ldi r17, hi8(\size) + add \reg1, r16 + adc \reg2, r17 + pop r17 + pop r16 cli out _SFR_IO_ADDR(SPH), \reg2 out _SFR_IO_ADDR(SREG), r0