	/* gf256mul.S */
	/*
	    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
	    it under the terms of the GNU General Public License as published by
	    the Free Software Foundation, either version 3 of the License, or
	    (at your option) any later version.
	
	    This program is distributed in the hope that it will be useful,
	    but WITHOUT ANY WARRANTY; without even the implied warranty of
	    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	    GNU General Public License for more details.
	
	    You should have received a copy of the GNU General Public License
	    along with this program.  If not, see <http://www.gnu.org/licenses/>.
	*/
	
	/*
	 * File:        gf256mul.S
	 * Author:      Daniel Otte
	 * Date:        2008-12-19
	 * License:     GPLv3 or later
	 * Description: peasant's algorithm for multiplication in GF(2^8)
	 *
	 */
	
	#include <avr/io.h>
	#define OPTIMIZE_SMALL_A
	
	/*
	 * param a: r24
	 * param b: r22
	 * param reducer: r20
	 */
	A = 23
	B = 22
	P = 24
	.global gf256mul
	
	#ifdef OPTIMIZE_SMALL_A
	gf256mul:
	        mov A, r24
	        clr r24
	1:     
	        lsr A
	        breq 4f
	        brcc 2f
	        eor P, B
	2:
	        lsl B
	        brcc 3f
	        eor B, r20     
	3:
	        rjmp 1b
	4:
	        brcc 2f
	        eor P, B
	2:
	        ret
	
	#else
	
	gf256mul:
	        mov r21, r24
	        clr r24
	        ldi r25, 8
	1:     
	        lsr A
	        brcc 2f
	        eor P, B
	2:
	        lsl B
	        brcc 3f
	        eor B, r20     
	3:
	        dec r25
	        brne 1b
	        ret
	
	#endif