]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/sparc/vlop.s
fltfmt: %.ng is supposed to print a number with n significant figures, but it prints...
[plan9front.git] / sys / src / libc / sparc / vlop.s
1 TEXT    _mulv(SB), $0
2         MOVW    u1+8(FP), R8
3         MOVW    u2+16(FP), R13
4
5         MOVW    R13, R16                /* save low parts for later */
6         MOVW    R8, R12
7
8         /*
9          * unsigned 32x32 => 64 multiply
10          */
11         CMP     R13, R8
12         BLE     mul1
13         MOVW    R12, R13
14         MOVW    R16, R8
15 mul1:
16         MOVW    R13, Y
17         ANDNCC  $0xFFF, R13, R0
18         BE      mul_shortway
19         ANDCC   R0, R0, R9              /* zero partial product and clear N and V cond's */
20
21         /* long multiply */
22         MULSCC  R8, R9, R9              /* 0 */
23         MULSCC  R8, R9, R9              /* 1 */
24         MULSCC  R8, R9, R9              /* 2 */
25         MULSCC  R8, R9, R9              /* 3 */
26         MULSCC  R8, R9, R9              /* 4 */
27         MULSCC  R8, R9, R9              /* 5 */
28         MULSCC  R8, R9, R9              /* 6 */
29         MULSCC  R8, R9, R9              /* 7 */
30         MULSCC  R8, R9, R9              /* 8 */
31         MULSCC  R8, R9, R9              /* 9 */
32         MULSCC  R8, R9, R9              /* 10 */
33         MULSCC  R8, R9, R9              /* 11 */
34         MULSCC  R8, R9, R9              /* 12 */
35         MULSCC  R8, R9, R9              /* 13 */
36         MULSCC  R8, R9, R9              /* 14 */
37         MULSCC  R8, R9, R9              /* 15 */
38         MULSCC  R8, R9, R9              /* 16 */
39         MULSCC  R8, R9, R9              /* 17 */
40         MULSCC  R8, R9, R9              /* 18 */
41         MULSCC  R8, R9, R9              /* 19 */
42         MULSCC  R8, R9, R9              /* 20 */
43         MULSCC  R8, R9, R9              /* 21 */
44         MULSCC  R8, R9, R9              /* 22 */
45         MULSCC  R8, R9, R9              /* 23 */
46         MULSCC  R8, R9, R9              /* 24 */
47         MULSCC  R8, R9, R9              /* 25 */
48         MULSCC  R8, R9, R9              /* 26 */
49         MULSCC  R8, R9, R9              /* 27 */
50         MULSCC  R8, R9, R9              /* 28 */
51         MULSCC  R8, R9, R9              /* 29 */
52         MULSCC  R8, R9, R9              /* 30 */
53         MULSCC  R8, R9, R9              /* 31 */
54         MULSCC  R0, R9, R9              /* 32; shift only; r9 is high part */
55
56         /*
57          * need to correct top word if top bit set
58          */
59         CMP     R8, R0
60         BGE     mul_tstlow
61         ADD     R13, R9                 /* adjust the high parts */
62
63 mul_tstlow:
64         MOVW    Y, R13                  /* get low part */
65         BA      mul_done
66
67 mul_shortway:
68         ANDCC   R0, R0, R9              /* zero partial product and clear N and V cond's */
69         MULSCC  R8, R9, R9              /*  0 */
70         MULSCC  R8, R9, R9              /*  1 */
71         MULSCC  R8, R9, R9              /*  2 */
72         MULSCC  R8, R9, R9              /*  3 */
73         MULSCC  R8, R9, R9              /*  4 */
74         MULSCC  R8, R9, R9              /*  5 */
75         MULSCC  R8, R9, R9              /*  6 */
76         MULSCC  R8, R9, R9              /*  7 */
77         MULSCC  R8, R9, R9              /*  8 */
78         MULSCC  R8, R9, R9              /*  9 */
79         MULSCC  R8, R9, R9              /* 10 */
80         MULSCC  R8, R9, R9              /* 11 */
81         MULSCC  R0, R9, R9              /* 12; shift only; r9 is high part */
82
83         MOVW    Y, R8                   /* make low part of partial low part & high part */
84         SLL     $12, R9, R13
85         SRL     $20, R8
86         OR      R8, R13
87
88         SRA     $20, R9                 /* high part */
89
90 mul_done:
91
92         /*
93          * mul by high halves if needed
94          */
95         MOVW    R13, 4(R7)
96         MOVW    u2+12(FP), R11
97         CMP     R11, R0
98         BE      nomul1
99         MUL     R11, R12
100         ADD     R12, R9
101
102 nomul1:
103         MOVW    u1+4(FP), R11
104         CMP     R11, R0
105         BE      nomul2
106         MUL     R11, R16
107         ADD     R16, R9
108
109 nomul2:
110
111         MOVW    R9, 0(R7)
112         RETURN