12befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres/*
22befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * Copyright 2014 Martin Peres <martin.peres@free.fr>
32befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres *
42befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * Permission is hereby granted, free of charge, to any person obtaining a
52befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * copy of this software and associated documentation files (the "Software"),
62befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * to deal in the Software without restriction, including without limitation
72befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * the rights to use, copy, modify, merge, publish, distribute, sublicense,
82befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * and/or sell copies of the Software, and to permit persons to whom the
92befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * Software is furnished to do so, subject to the folloing conditions:
102befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres *
112befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * The above copyright notice and this permission notice shall be included in
122befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * all copies or substantial portions of the Software.
132befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres *
142befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
152befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
162befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
172befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
182befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
192befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
202befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * OTHER DEALINGS IN THE SOFTWARE.
212befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres *
222befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * Authors: Martin Peres
232befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres */
242befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
252befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres/******************************************************************************
262befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * arith data segment
272befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres *****************************************************************************/
282befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres#ifdef INCLUDE_PROC
292befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres#endif
302befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
312befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres#ifdef INCLUDE_DATA
322befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres#endif
332befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
342befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres/******************************************************************************
352befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres * arith code segment
362befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres *****************************************************************************/
372befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres#ifdef INCLUDE_CODE
382befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
392befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres// does a 32x32 -> 64 multiplication
402befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres//
412befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres// A * B = A_lo * B_lo
422befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres//        + ( A_hi * B_lo ) << 16
432befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres//        + ( A_lo * B_hi ) << 16
442befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres//        + ( A_hi * B_hi ) << 32
452befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres//
462befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres// $r15 - current
472befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres// $r14 - A
482befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres// $r13 - B
492befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres// $r12 - mul_lo (return)
502befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres// $r11 - mul_hi (return)
512befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres// $r0  - zero
522befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peresmulu32_32_64:
532befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	push $r1 // A_hi
542befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	push $r2 // B_hi
552befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	push $r3 // tmp0
562befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	push $r4 // tmp1
572befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
582befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	shr b32 $r1 $r14 16
592befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	shr b32 $r2 $r13 16
602befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
612befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	clear b32 $r12
622befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	clear b32 $r11
632befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
642befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	// A_lo * B_lo
652befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	mulu $r12 $r14 $r13
662befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
672befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	// ( A_hi * B_lo ) << 16
682befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	mulu $r3 $r1 $r13 // tmp0 = A_hi * B_lo
692befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	mov b32 $r4 $r3
702befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	and $r3 0xffff // tmp0 = tmp0_lo
712befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	shl b32 $r3 16
722befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	shr b32 $r4 16 // tmp1 = tmp0_hi
732befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	add b32 $r12 $r3
742befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	adc b32 $r11 $r4
752befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
762befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	// ( A_lo * B_hi ) << 16
772befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	mulu $r3 $r14 $r2 // tmp0 = A_lo * B_hi
782befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	mov b32 $r4 $r3
792befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	and $r3 0xffff // tmp0 = tmp0_lo
802befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	shl b32 $r3 16
812befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	shr b32 $r4 16 // tmp1 = tmp0_hi
822befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	add b32 $r12 $r3
832befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	adc b32 $r11 $r4
842befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
852befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	// ( A_hi * B_hi ) << 32
862befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	mulu $r3 $r1 $r2 // tmp0 = A_hi * B_hi
872befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	add b32 $r11 $r3
882befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres
892befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	pop $r4
902befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	pop $r3
912befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	pop $r2
922befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	pop $r1
932befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres	ret
942befd17de2dff0238800ffa0b8364e2053f65e9fMartin Peres#endif
95