Remove building with NOCRYPTO option
[minix.git] / common / lib / libc / arch / or1k / gen / mulsi3.S
blob6b49b2e39df44d7a8f438a136175673d33d281a6
1 /* $NetBSD: mulsi3.S,v 1.1 2014/09/03 19:34:25 matt Exp $ */
3 /*-
4  * Copyright (c) 2014 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Matt Thomas of 3am Software Foundry.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
32 #include <machine/asm.h>
34 __RCSID("$NetBSD: mulsi3.S,v 1.1 2014/09/03 19:34:25 matt Exp $")
36 ENTRY(__mulsi3)
37         l.movhi r11, 0
39         l.sfeqi r3, 0
40         l.bf    .Lret
41         l.nop
43         l.sfeqi r4, 0
44         l.bf    .Lret
45         l.nop
47         l.sfleu r3, r4          # is r3 < r4 (unsigned)
48 #if 0
49         l.ori   r6, r3, 0       # move r3 to r6
50         l.bf    .Lloop          #   yes, r6 already has smaller value, 
51         l.nop
52         l.ori   r6, r4, 0       # move r4 to r6 because it's smaller than r3
53 #else
54         l.cmov  r6, r3, r4      # choose lesser of r3 or r4
55 #endif
57 .Lloop:
58         l.andi  r5, r6, 1       # get LSB
59         l.sub   r8, r0, r5      # 0 -> 0, 1 -> 0xffffffff
60         l.and   r8, r8, r4      # r8 = r6 & 1 ? r4 : 0
61         l.add   r11, r11, r8    # add to result
62         l.srli  r4, r4, 1       # discard LSB
63         l.slli  r6, r6, 1       # multiply by 2
64 .Lentry:
65         l.sfeqi r4, 0           # only 0 left?
66         l.bf    .Lret           #   yes, we're done
67         l.nop
68         l.sfeqi r6, 0           # only 0 left?
69         l.bnf   .Lloop          #   no, another round of long multiplication.
70         l.nop
72 .Lret:  l.jr    lr
73         l.nop
74 END(__mulsi3)