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