| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: mulsi3.S,v 1.4 2013/07/16 23:24:18 matt Exp $ */ | | 1 | /* $NetBSD: mulsi3.S,v 1.5 2020/03/09 08:29:11 rin Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 1990 The Regents of the University of California. | | 4 | * Copyright (c) 1990 The Regents of the University of California. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to Berkeley by | | 7 | * This code is derived from software contributed to Berkeley by |
8 | * the Systems Programming Group of the University of Utah Computer | | 8 | * the Systems Programming Group of the University of Utah Computer |
9 | * Science Department. | | 9 | * Science Department. |
10 | * | | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | | 11 | * Redistribution and use in source and binary forms, with or without |
12 | * modification, are permitted provided that the following conditions | | 12 | * modification, are permitted provided that the following conditions |
13 | * are met: | | 13 | * are met: |
14 | * 1. Redistributions of source code must retain the above copyright | | 14 | * 1. Redistributions of source code must retain the above copyright |
| @@ -29,38 +29,36 @@ | | | @@ -29,38 +29,36 @@ |
29 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 29 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
30 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 30 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
31 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 31 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
32 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 32 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
33 | * SUCH DAMAGE. | | 33 | * SUCH DAMAGE. |
34 | */ | | 34 | */ |
35 | | | 35 | |
36 | #include <machine/asm.h> | | 36 | #include <machine/asm.h> |
37 | | | 37 | |
38 | #if defined(LIBC_SCCS) && !defined(lint) | | 38 | #if defined(LIBC_SCCS) && !defined(lint) |
39 | #if 0 | | 39 | #if 0 |
40 | RCSID("from: @(#)mulsi3.s 5.1 (Berkeley) 6/7/90") | | 40 | RCSID("from: @(#)mulsi3.s 5.1 (Berkeley) 6/7/90") |
41 | #else | | 41 | #else |
42 | RCSID("$NetBSD: mulsi3.S,v 1.4 2013/07/16 23:24:18 matt Exp $") | | 42 | RCSID("$NetBSD: mulsi3.S,v 1.5 2020/03/09 08:29:11 rin Exp $") |
43 | #endif | | 43 | #endif |
44 | #endif /* LIBC_SCCS and not lint */ | | 44 | #endif /* LIBC_SCCS and not lint */ |
45 | | | 45 | |
46 | /* int * int */ | | 46 | /* int * int */ |
47 | ENTRY(__mulsi3) | | 47 | ENTRY(__mulsi3) |
48 | #ifndef __mc68010__ | | 48 | #ifndef __mc68010__ |
49 | movel 4(%sp),%d0 | | 49 | movel 4(%sp),%d0 |
50 | mulsl 8(%sp),%d0 | | 50 | mulsl 8(%sp),%d0 |
51 | #else | | 51 | #else |
52 | | NB: this requires that __udivsi3 preserve %a0 and return | | | |
53 | | the modulus in %d1: | | | |
54 | movew 6(%sp), %d0 | | 52 | movew 6(%sp), %d0 |
55 | movel %d0, %a0 | save B | | 53 | movel %d0, %a0 | save B |
56 | muluw 8(%sp), %d0 | %d0 holds B * C | | 54 | muluw 8(%sp), %d0 | %d0 holds B * C |
57 | movew 10(%sp), %d1 | | 55 | movew 10(%sp), %d1 |
58 | movel %d1, %a1 | save D | | 56 | movel %d1, %a1 | save D |
59 | muluw 4(%sp), %d1 | %d1 holds A * D | | 57 | muluw 4(%sp), %d1 | %d1 holds A * D |
60 | addw %d1, %d0 | %d0 holds (B * C) + (A * D) | | 58 | addw %d1, %d0 | %d0 holds (B * C) + (A * D) |
61 | swap %d0 | | 59 | swap %d0 |
62 | clrw %d0 | %d0 holds ((B * C) + (A * D)) << 16 | | 60 | clrw %d0 | %d0 holds ((B * C) + (A * D)) << 16 |
63 | exg %a0, %d0 | restore B | | 61 | exg %a0, %d0 | restore B |
64 | movel %a1, %d1 | restore D | | 62 | movel %a1, %d1 | restore D |
65 | muluw %d1, %d0 | %d0 holds B * D | | 63 | muluw %d1, %d0 | %d0 holds B * D |
66 | addl %a0, %d0 | final result | | 64 | addl %a0, %d0 | final result |