FreeCalypso > hg > gsm-codec-lib
annotate libgsmhr1/mathhalf.c @ 585:3c6bf0d26ee7
TW-TS-005 reader: fix maximum line length bug
TW-TS-005 section 4.1 states:
The maximum allowed length of each line is 80 characters, not
including the OS-specific newline encoding.
The implementation of this line length limit in the TW-TS-005 hex file
reader function in the present suite was wrong, such that lines of
the full maximum length could not be read. Fix it.
Note that this bug affects comment lines too, not just actual RTP
payloads. Neither Annex A nor Annex B features an RTP payload format
that goes to the maximum of 40 bytes, but if a comment line goes to
the maximum allowed length of 80 characters not including the
terminating newline, the bug will be triggered, necessitating
the present fix.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 25 Feb 2025 07:49:28 +0000 |
parents | b0333fa167c3 |
children |
rev | line source |
---|---|
500
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * File Name: mathhalf.c |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * Purpose: Contains functions which implement the primitive |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * arithmetic operations. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 * The functions in this file are listed below. Some of them are |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * defined in terms of other basic operations. One of the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * routines, saturate() is static. This is not a basic |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * operation, and is not referenced outside the scope of this |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * file. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 * abs_s() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 * add() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 * divide_s() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 * extract_h() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 * extract_l() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 * L_abs() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 * L_add() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 * L_deposit_h() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 * L_deposit_l() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 * L_mac() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 * L_msu() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 * L_mult() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 * L_negate() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 * L_shift_r() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 * L_shl() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 * L_shr() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 * L_sub() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 * mac_r() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 * msu_r() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 * mult() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 * mult_r() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 * negate() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 * norm_l() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 * norm_s() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 * round() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 * saturate() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 * shift_r() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 * shl() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 * shr() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 * sub() |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 **************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 /*_________________________________________________________________________ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 | | |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 | Include Files | |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 |_________________________________________________________________________| |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 #include "typedefs.h" |
502
b0333fa167c3
libgsmhr1: compile mathhalf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
500
diff
changeset
|
55 #include "namespace.h" |
500
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 #include "mathhalf.h" |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 * FUNCTION NAME: saturate |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 * Limit the 32 bit input to the range of a 16 bit word. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 * KEYWORDS: saturation, limiting, limit, saturate, 16 bits |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 static Shortword saturate(Longword L_var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 if (L_var1 > SW_MAX) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 swOut = SW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 else if (L_var1 < SW_MIN) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 swOut = SW_MIN; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 swOut = (Shortword) L_var1; /* automatic type conversion */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 * FUNCTION NAME: abs_s |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 * Take the absolute value of the 16 bit input. An input of |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 * -0x8000 results in a return value of 0x7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 * 0x0000 0000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 * Take the absolute value of the 16 bit input. An input of |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 * -0x8000 results in a return value of 0x7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 * KEYWORDS: absolute value, abs |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 Shortword abs_s(Shortword var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 if (var1 == SW_MIN) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 swOut = SW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 if (var1 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 swOut = -var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 swOut = var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 * FUNCTION NAME: add |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 * Perform the addition of the two 16 bit input variable with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 * Perform the addition of the two 16 bit input variable with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 * swOut = var1 + var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 * swOut is set to 0x7fff if the operation results in an |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 * overflow. swOut is set to 0x8000 if the operation results |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 * in an underflow. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 * KEYWORDS: add, addition |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 Shortword add(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 Longword L_sum; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 L_sum = (Longword) var1 + var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 swOut = saturate(L_sum); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 * FUNCTION NAME: divide_s |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 * Divide var1 by var2. Note that both must be positive, and |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 * var1 >= var2. The output is set to 0 if invalid input is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 * provided. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 * In the case where var1==var2 the function returns 0x7fff. The output |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 * is undefined for invalid inputs. This implementation returns zero |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 * and issues a warning via stdio if invalid input is presented. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 * KEYWORDS: divide |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 Shortword divide_s(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 Longword L_div; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 if (var1 < 0 || var2 < 0 || var1 > var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 /* undefined output for invalid input into divide_s */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 return (0); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 if (var1 == var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 return (0x7fff); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 L_div = ((0x00008000L * (Longword) var1) / (Longword) var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 swOut = saturate(L_div); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 * FUNCTION NAME: extract_h |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 * Extract the 16 MS bits of a 32 bit Longword. Return the 16 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 * number as a Shortword. This is used as a "truncation" of a fractional |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 * number. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 * KEYWORDS: assign, truncate |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 Shortword extract_h(Longword L_var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 Shortword var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 var2 = (Shortword) (0x0000ffffL & (L_var1 >> 16)); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 return (var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 * FUNCTION NAME: extract_l |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 * Extract the 16 LS bits of a 32 bit Longword. Return the 16 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 * number as a Shortword. The upper portion of the input Longword |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 * has no impact whatsoever on the output. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 * KEYWORDS: extract, assign |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 Shortword extract_l(Longword L_var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 Shortword var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 var2 = (Shortword) (0x0000ffffL & L_var1); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 return (var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 * FUNCTION NAME: L_abs |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 * Take the absolute value of the 32 bit input. An input of |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 * -0x8000 0000 results in a return value of 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 * KEYWORDS: absolute value, abs |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 Longword L_abs(Longword L_var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 Longword L_Out; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391 if (L_var1 == LW_MIN) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 L_Out = LW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397 if (L_var1 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 L_Out = -L_var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 L_Out = L_var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 return (L_Out); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 * FUNCTION NAME: L_add |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 * Perform the addition of the two 32 bit input variables with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 * L_var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423 * 0x8000 0000 <= L_var2 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 * Perform the addition of the two 32 bit input variables with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 * L_Out = L_var1 + L_var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443 * L_Out is set to 0x7fff ffff if the operation results in an |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444 * overflow. L_Out is set to 0x8000 0000 if the operation |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 * results in an underflow. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 * KEYWORDS: add, addition |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450 Longword L_add(Longword L_var1, Longword L_var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453 Longword L_Sum, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 L_SumLow, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455 L_SumHigh; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457 L_Sum = L_var1 + L_var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 if ((L_var1 > 0 && L_var2 > 0) || (L_var1 < 0 && L_var2 < 0)) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 /* an overflow is possible */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 L_SumLow = (L_var1 & 0xffff) + (L_var2 & 0xffff); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 L_SumHigh = ((L_var1 >> 16) & 0xffff) + ((L_var2 >> 16) & 0xffff); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 if (L_SumLow & 0x10000) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468 /* carry into high word is set */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469 L_SumHigh += 1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 /* update sum only if there is an overflow or underflow */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473 /*------------------------------------------------------*/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475 if ((0x10000 & L_SumHigh) && !(0x8000 & L_SumHigh)) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476 L_Sum = LW_MIN; /* underflow */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477 else if (!(0x10000 & L_SumHigh) && (0x8000 & L_SumHigh)) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 L_Sum = LW_MAX; /* overflow */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481 return (L_Sum); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487 * FUNCTION NAME: L_deposit_h |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 * Put the 16 bit input into the 16 MSB's of the output Longword. The |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492 * LS 16 bits are zeroed. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
502 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
503 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
504 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
505 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
506 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
507 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
508 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
509 * 0x8000 0000 <= L_var1 <= 0x7fff 0000. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
510 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
511 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
512 * KEYWORDS: deposit, assign, fractional assign |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
513 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
514 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
515 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
516 Longword L_deposit_h(Shortword var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
517 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
518 Longword L_var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
519 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
520 L_var2 = (Longword) var1 << 16; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
521 return (L_var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
522 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
523 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
524 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
525 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
526 * FUNCTION NAME: L_deposit_l |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
527 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
528 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
529 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
530 * Put the 16 bit input into the 16 LSB's of the output Longword with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
531 * sign extension i.e. the top 16 bits are set to either 0 or 0xffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
532 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
533 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
534 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
535 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
536 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
537 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
538 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
539 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
540 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
541 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
542 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
543 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
544 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
545 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
546 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
547 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
548 * 0xffff 8000 <= L_var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
549 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
550 * KEYWORDS: deposit, assign |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
551 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
552 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
553 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
554 Longword L_deposit_l(Shortword var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
555 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
556 Longword L_Out; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
557 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
558 L_Out = var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
559 return (L_Out); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
560 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
561 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
562 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
563 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
564 * FUNCTION NAME: L_mac |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
565 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
566 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
567 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
568 * Multiply accumulate. Fractionally multiply two 16 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
569 * numbers together with saturation. Add that result to the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
570 * 32 bit input with saturation. Return the 32 bit result. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
571 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
572 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
573 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
574 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
575 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
576 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
577 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
578 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
579 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
580 * L_var3 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
581 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
582 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
583 * 0x8000 0000 <= L_var2 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
584 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
585 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
586 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
587 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
588 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
589 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
590 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
591 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
592 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
593 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
594 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
595 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
596 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
597 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
598 * Fractionally multiply two 16 bit numbers together with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
599 * saturation. The only numbers which will cause saturation on |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
600 * the multiply are 0x8000 * 0x8000. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
601 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
602 * Add that result to the 32 bit input with saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
603 * Return the 32 bit result. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
604 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
605 * Please note that this is not a true multiply accumulate as |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
606 * most processors would implement it. The 0x8000*0x8000 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
607 * causes and overflow for this instruction. On most |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
608 * processors this would cause an overflow only if the 32 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
609 * input added to it were positive or zero. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
610 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
611 * KEYWORDS: mac, multiply accumulate |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
612 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
613 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
614 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
615 Longword L_mac(Longword L_var3, Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
616 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
617 return (L_add(L_var3, L_mult(var1, var2))); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
618 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
619 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
620 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
621 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
622 * FUNCTION NAME: L_msu |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
623 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
624 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
625 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
626 * Multiply and subtract. Fractionally multiply two 16 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
627 * numbers together with saturation. Subtract that result from |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
628 * the 32 bit input with saturation. Return the 32 bit result. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
629 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
630 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
631 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
632 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
633 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
634 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
635 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
636 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
637 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
638 * L_var3 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
639 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
640 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
641 * 0x8000 0000 <= L_var2 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
642 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
643 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
644 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
645 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
646 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
647 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
648 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
649 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
650 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
651 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
652 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
653 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
654 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
655 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
656 * Fractionally multiply two 16 bit numbers together with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
657 * saturation. The only numbers which will cause saturation on |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
658 * the multiply are 0x8000 * 0x8000. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
659 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
660 * Subtract that result from the 32 bit input with saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
661 * Return the 32 bit result. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
662 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
663 * Please note that this is not a true multiply accumulate as |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
664 * most processors would implement it. The 0x8000*0x8000 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
665 * causes and overflow for this instruction. On most |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
666 * processors this would cause an overflow only if the 32 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
667 * input added to it were negative or zero. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
668 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
669 * KEYWORDS: mac, multiply accumulate, msu |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
670 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
671 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
672 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
673 Longword L_msu(Longword L_var3, Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
674 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
675 return (L_sub(L_var3, L_mult(var1, var2))); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
676 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
677 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
678 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
679 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
680 * FUNCTION NAME: L_mult |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
681 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
682 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
683 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
684 * Perform a fractional multipy of the two 16 bit input numbers |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
685 * with saturation. Output a 32 bit number. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
686 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
687 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
688 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
689 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
690 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
691 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
692 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
693 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
694 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
695 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
696 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
697 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
698 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
699 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
700 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
701 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
702 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
703 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
704 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
705 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
706 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
707 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
708 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
709 * Multiply the two the two 16 bit input numbers. If the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
710 * result is within this range, left shift the result by one |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
711 * and output the 32 bit number. The only possible overflow |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
712 * occurs when var1==var2==-0x8000. In this case output |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
713 * 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
714 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
715 * KEYWORDS: multiply, mult, mpy |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
716 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
717 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
718 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
719 Longword L_mult(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
720 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
721 Longword L_product; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
722 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
723 if (var1 == SW_MIN && var2 == SW_MIN) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
724 L_product = LW_MAX; /* overflow */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
725 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
726 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
727 L_product = (Longword) var1 *var2; /* integer multiply */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
728 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
729 L_product = L_product << 1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
730 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
731 return (L_product); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
732 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
733 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
734 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
735 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
736 * FUNCTION NAME: L_negate |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
737 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
738 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
739 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
740 * Negate the 32 bit input. 0x8000 0000's negated value is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
741 * 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
742 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
743 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
744 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
745 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
746 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
747 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
748 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
749 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
750 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
751 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
752 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
753 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
754 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
755 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
756 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
757 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
758 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
759 * 0x8000 0001 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
760 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
761 * KEYWORDS: negate, negative |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
762 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
763 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
764 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
765 Longword L_negate(Longword L_var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
766 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
767 Longword L_Out; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
768 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
769 if (L_var1 == LW_MIN) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
770 L_Out = LW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
771 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
772 L_Out = -L_var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
773 return (L_Out); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
774 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
775 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
776 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
777 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
778 * FUNCTION NAME: L_shift_r |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
779 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
780 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
781 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
782 * Shift and round. Perform a shift right. After shifting, use |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
783 * the last bit shifted out of the LSB to round the result up |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
784 * or down. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
785 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
786 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
787 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
788 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
789 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
790 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
791 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
792 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
793 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
794 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
795 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
796 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
797 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
798 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
799 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
800 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
801 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
802 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
803 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
804 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
805 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
806 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
807 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
808 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
809 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
810 * Shift and round. Perform a shift right. After shifting, use |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
811 * the last bit shifted out of the LSB to round the result up |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
812 * or down. This is just like shift_r above except that the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
813 * input/output is 32 bits as opposed to 16. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
814 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
815 * if var2 is positve perform a arithmetic left shift |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
816 * with saturation (see L_shl() above). |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
817 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
818 * If var2 is zero simply return L_var1. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
819 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
820 * If var2 is negative perform a arithmetic right shift (L_shr) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
821 * of L_var1 by (-var2)+1. Add the LS bit of the result to |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
822 * L_var1 shifted right (L_shr) by -var2. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
823 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
824 * Note that there is no constraint on var2, so if var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
825 * -0xffff 8000 then -var2 is 0x0000 8000, not 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
826 * This is the reason the L_shl function is used. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
827 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
828 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
829 * KEYWORDS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
830 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
831 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
832 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
833 Longword L_shift_r(Longword L_var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
834 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
835 Longword L_Out, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
836 L_rnd; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
837 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
838 if (var2 < -31) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
839 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
840 L_Out = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
841 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
842 else if (var2 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
843 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
844 /* right shift */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
845 L_rnd = L_shl(L_var1, var2 + 1) & 0x1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
846 L_Out = L_add(L_shl(L_var1, var2), L_rnd); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
847 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
848 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
849 L_Out = L_shl(L_var1, var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
850 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
851 return (L_Out); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
852 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
853 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
854 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
855 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
856 * FUNCTION NAME: L_shl |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
857 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
858 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
859 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
860 * Arithmetic shift left (or right). |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
861 * Arithmetically shift the input left by var2. If var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
862 * negative then an arithmetic shift right (L_shr) of L_var1 by |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
863 * -var2 is performed. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
864 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
865 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
866 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
867 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
868 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
869 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
870 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
871 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
872 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
873 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
874 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
875 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
876 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
877 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
878 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
879 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
880 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
881 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
882 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
883 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
884 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
885 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
886 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
887 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
888 * Arithmetically shift the 32 bit input left by var2. This |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
889 * operation maintains the sign of the input number. If var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
890 * negative then an arithmetic shift right (L_shr) of L_var1 by |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
891 * -var2 is performed. See description of L_shr for details. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
892 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
893 * Equivalent to the Full-Rate GSM ">> n" operation. Note that |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
894 * ANSI-C does not guarantee operation of the C ">>" or "<<" |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
895 * operator for negative numbers. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
896 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
897 * KEYWORDS: shift, arithmetic shift left, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
898 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
899 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
900 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
901 Longword L_shl(Longword L_var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
902 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
903 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
904 Longword L_Mask, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
905 L_Out; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
906 int i, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
907 iOverflow = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
908 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
909 if (var2 == 0 || L_var1 == 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
910 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
911 L_Out = L_var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
912 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
913 else if (var2 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
914 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
915 if (var2 <= -31) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
916 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
917 if (L_var1 > 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
918 L_Out = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
919 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
920 L_Out = 0xffffffffL; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
921 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
922 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
923 L_Out = L_shr(L_var1, -var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
924 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
925 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
926 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
927 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
928 if (var2 >= 31) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
929 iOverflow = 1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
930 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
931 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
932 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
933 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
934 if (L_var1 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
935 L_Mask = LW_SIGN; /* sign bit mask */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
936 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
937 L_Mask = 0x0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
938 L_Out = L_var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
939 for (i = 0; i < var2 && !iOverflow; i++) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
940 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
941 /* check the sign bit */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
942 L_Out = (L_Out & 0x7fffffffL) << 1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
943 if ((L_Mask ^ L_Out) & LW_SIGN) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
944 iOverflow = 1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
945 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
946 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
947 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
948 if (iOverflow) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
949 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
950 /* saturate */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
951 if (L_var1 > 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
952 L_Out = LW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
953 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
954 L_Out = LW_MIN; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
955 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
956 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
957 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
958 return (L_Out); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
959 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
960 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
961 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
962 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
963 * FUNCTION NAME: L_shr |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
964 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
965 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
966 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
967 * Arithmetic shift right (or left). |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
968 * Arithmetically shift the input right by var2. If var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
969 * negative then an arithmetic shift left (shl) of var1 by |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
970 * -var2 is performed. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
971 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
972 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
973 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
974 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
975 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
976 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
977 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
978 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
979 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
980 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
981 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
982 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
983 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
984 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
985 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
986 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
987 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
988 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
989 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
990 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
991 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
992 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
993 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
994 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
995 * Arithmetically shift the input right by var2. This |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
996 * operation maintains the sign of the input number. If var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
997 * negative then an arithmetic shift left (shl) of L_var1 by |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
998 * -var2 is performed. See description of L_shl for details. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
999 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1000 * The input is a 32 bit number, as is the output. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1001 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1002 * Equivalent to the Full-Rate GSM ">> n" operation. Note that |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1003 * ANSI-C does not guarantee operation of the C ">>" or "<<" |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1004 * operator for negative numbers. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1005 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1006 * KEYWORDS: shift, arithmetic shift right, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1007 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1008 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1009 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1010 Longword L_shr(Longword L_var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1011 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1012 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1013 Longword L_Mask, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1014 L_Out; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1015 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1016 if (var2 == 0 || L_var1 == 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1017 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1018 L_Out = L_var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1019 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1020 else if (var2 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1021 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1022 /* perform a left shift */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1023 /*----------------------*/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1024 if (var2 <= -31) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1025 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1026 /* saturate */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1027 if (L_var1 > 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1028 L_Out = LW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1029 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1030 L_Out = LW_MIN; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1031 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1032 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1033 L_Out = L_shl(L_var1, -var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1034 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1035 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1036 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1037 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1038 if (var2 >= 31) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1039 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1040 if (L_var1 > 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1041 L_Out = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1042 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1043 L_Out = 0xffffffffL; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1044 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1045 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1046 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1047 L_Mask = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1048 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1049 if (L_var1 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1050 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1051 L_Mask = ~L_Mask << (32 - var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1052 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1053 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1054 L_var1 >>= var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1055 L_Out = L_Mask | L_var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1056 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1057 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1058 return (L_Out); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1059 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1060 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1061 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1062 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1063 * FUNCTION NAME: L_sub |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1064 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1065 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1066 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1067 * Perform the subtraction of the two 32 bit input variables with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1068 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1069 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1070 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1071 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1072 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1073 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1074 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1075 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1076 * L_var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1077 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1078 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1079 * 0x8000 0000 <= L_var2 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1080 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1081 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1082 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1083 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1084 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1085 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1086 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1087 * L_Out |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1088 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1089 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1090 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1091 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1092 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1093 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1094 * Perform the subtraction of the two 32 bit input variables with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1095 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1096 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1097 * L_Out = L_var1 - L_var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1098 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1099 * L_Out is set to 0x7fff ffff if the operation results in an |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1100 * overflow. L_Out is set to 0x8000 0000 if the operation |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1101 * results in an underflow. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1102 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1103 * KEYWORDS: sub, subtraction |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1104 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1105 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1106 Longword L_sub(Longword L_var1, Longword L_var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1107 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1108 Longword L_Sum; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1109 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1110 /* check for overflow */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1111 if ((L_var1 > 0 && L_var2 < 0) || (L_var1 < 0 && L_var2 > 0)) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1112 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1113 if (L_var2 == LW_MIN) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1114 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1115 L_Sum = L_add(L_var1, LW_MAX); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1116 L_Sum = L_add(L_Sum, 1); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1117 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1118 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1119 L_Sum = L_add(L_var1, -L_var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1120 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1121 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1122 { /* no overflow possible */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1123 L_Sum = L_var1 - L_var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1124 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1125 return (L_Sum); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1126 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1127 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1128 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1129 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1130 * FUNCTION NAME:mac_r |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1131 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1132 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1133 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1134 * Multiply accumulate and round. Fractionally multiply two 16 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1135 * bit numbers together with saturation. Add that result to |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1136 * the 32 bit input with saturation. Finally round the result |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1137 * into a 16 bit number. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1138 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1139 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1140 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1141 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1142 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1143 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1144 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1145 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1146 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1147 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1148 * L_var3 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1149 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1150 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1151 * 0x8000 0000 <= L_var2 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1152 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1153 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1154 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1155 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1156 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1157 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1158 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1159 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1160 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1161 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1162 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1163 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1164 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1165 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1166 * Fractionally multiply two 16 bit numbers together with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1167 * saturation. The only numbers which will cause saturation on |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1168 * the multiply are 0x8000 * 0x8000. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1169 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1170 * Add that result to the 32 bit input with saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1171 * Round the 32 bit result by adding 0x0000 8000 to the input. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1172 * The result may overflow due to the add. If so, the result |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1173 * is saturated. The 32 bit rounded number is then shifted |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1174 * down 16 bits and returned as a Shortword. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1175 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1176 * Please note that this is not a true multiply accumulate as |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1177 * most processors would implement it. The 0x8000*0x8000 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1178 * causes and overflow for this instruction. On most |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1179 * processors this would cause an overflow only if the 32 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1180 * input added to it were positive or zero. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1181 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1182 * KEYWORDS: mac, multiply accumulate, macr |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1183 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1184 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1185 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1186 Shortword mac_r(Longword L_var3, Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1187 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1188 return (round(L_add(L_var3, L_mult(var1, var2)))); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1189 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1190 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1191 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1192 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1193 * FUNCTION NAME: msu_r |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1194 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1195 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1196 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1197 * Multiply subtract and round. Fractionally multiply two 16 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1198 * bit numbers together with saturation. Subtract that result from |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1199 * the 32 bit input with saturation. Finally round the result |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1200 * into a 16 bit number. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1201 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1202 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1203 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1204 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1205 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1206 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1207 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1208 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1209 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1210 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1211 * L_var3 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1212 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1213 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1214 * 0x8000 0000 <= L_var2 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1215 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1216 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1217 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1218 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1219 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1220 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1221 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1222 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1223 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1224 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1225 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1226 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1227 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1228 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1229 * Fractionally multiply two 16 bit numbers together with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1230 * saturation. The only numbers which will cause saturation on |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1231 * the multiply are 0x8000 * 0x8000. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1232 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1233 * Subtract that result from the 32 bit input with saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1234 * Round the 32 bit result by adding 0x0000 8000 to the input. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1235 * The result may overflow due to the add. If so, the result |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1236 * is saturated. The 32 bit rounded number is then shifted |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1237 * down 16 bits and returned as a Shortword. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1238 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1239 * Please note that this is not a true multiply accumulate as |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1240 * most processors would implement it. The 0x8000*0x8000 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1241 * causes and overflow for this instruction. On most |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1242 * processors this would cause an overflow only if the 32 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1243 * input added to it were positive or zero. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1244 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1245 * KEYWORDS: mac, multiply accumulate, macr |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1246 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1247 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1248 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1249 Shortword msu_r(Longword L_var3, Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1250 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1251 return (round(L_sub(L_var3, L_mult(var1, var2)))); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1252 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1253 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1254 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1255 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1256 * FUNCTION NAME: mult |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1257 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1258 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1259 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1260 * Perform a fractional multipy of the two 16 bit input numbers |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1261 * with saturation and truncation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1262 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1263 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1264 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1265 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1266 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1267 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1268 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1269 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1270 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1271 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1272 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1273 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1274 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1275 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1276 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1277 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1278 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1279 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1280 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1281 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1282 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1283 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1284 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1285 * Perform a fractional multipy of the two 16 bit input |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1286 * numbers. If var1 == var2 == -0x8000, output 0x7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1287 * Otherwise output var1*var2 >> 15. The output is a |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1288 * 16 bit number. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1289 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1290 * KEYWORDS: mult, mulitply, mpy |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1291 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1292 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1293 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1294 Shortword mult(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1295 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1296 Longword L_product; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1297 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1298 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1299 L_product = L_mult(var1, var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1300 swOut = extract_h(L_product); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1301 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1302 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1303 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1304 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1305 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1306 * FUNCTION NAME: mult_r |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1307 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1308 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1309 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1310 * Perform a fractional multipy and round of the two 16 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1311 * input numbers with saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1312 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1313 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1314 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1315 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1316 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1317 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1318 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1319 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1320 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1321 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1322 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1323 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1324 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1325 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1326 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1327 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1328 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1329 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1330 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1331 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1332 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1333 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1334 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1335 * This routine is defined as the concatenation of the multiply |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1336 * operation and the round operation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1337 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1338 * The fractional multiply (L_mult) produces a saturated 32 bit |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1339 * output. This is followed by a an add of 0x0000 8000 to the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1340 * 32 bit result. The result may overflow due to the add. If |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1341 * so, the result is saturated. The 32 bit rounded number is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1342 * then shifted down 16 bits and returned as a Shortword. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1343 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1344 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1345 * KEYWORDS: multiply and round, round, mult_r, mpyr |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1346 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1347 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1348 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1349 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1350 Shortword mult_r(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1351 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1352 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1353 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1354 swOut = round(L_mult(var1, var2)); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1355 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1356 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1357 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1358 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1359 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1360 * FUNCTION NAME: negate |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1361 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1362 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1363 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1364 * Negate the 16 bit input. 0x8000's negated value is 0x7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1365 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1366 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1367 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1368 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1369 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1370 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1371 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1372 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1373 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1374 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1375 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1376 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1377 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1378 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1379 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1380 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1381 * 0xffff 8001 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1382 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1383 * KEYWORDS: negate, negative, invert |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1384 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1385 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1386 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1387 Shortword negate(Shortword var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1388 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1389 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1390 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1391 if (var1 == SW_MIN) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1392 swOut = SW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1393 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1394 swOut = -var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1395 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1396 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1397 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1398 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1399 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1400 * FUNCTION NAME: norm_l |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1401 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1402 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1403 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1404 * Get normalize shift count: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1405 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1406 * A 32 bit number is input (possiblly unnormalized). Output |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1407 * the positive (or zero) shift count required to normalize the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1408 * input. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1409 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1410 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1411 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1412 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1413 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1414 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1415 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1416 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1417 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1418 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1419 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1420 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1421 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1422 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1423 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1424 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1425 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1426 * 0 <= swOut <= 31 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1427 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1428 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1429 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1430 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1431 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1432 * Get normalize shift count: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1433 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1434 * A 32 bit number is input (possiblly unnormalized). Output |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1435 * the positive (or zero) shift count required to normalize the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1436 * input. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1437 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1438 * If zero in input, return 0 as the shift count. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1439 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1440 * For non-zero numbers, count the number of left shift |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1441 * required to get the number to fall into the range: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1442 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1443 * 0x4000 0000 >= normlzd number >= 0x7fff ffff (positive number) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1444 * or |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1445 * 0x8000 0000 <= normlzd number < 0xc000 0000 (negative number) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1446 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1447 * Return the number of shifts. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1448 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1449 * This instruction corresponds exactly to the Full-Rate "norm" |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1450 * instruction. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1451 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1452 * KEYWORDS: norm, normalization |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1453 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1454 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1455 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1456 Shortword norm_l(Longword L_var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1457 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1458 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1459 Shortword swShiftCnt; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1460 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1461 if (L_var1 != 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1462 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1463 if (!(L_var1 & LW_SIGN)) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1464 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1465 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1466 /* positive input */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1467 for (swShiftCnt = 0; !(L_var1 <= LW_MAX && L_var1 >= 0x40000000L); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1468 swShiftCnt++) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1469 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1470 L_var1 = L_var1 << 1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1471 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1472 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1473 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1474 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1475 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1476 /* negative input */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1477 for (swShiftCnt = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1478 !(L_var1 >= LW_MIN && L_var1 < (Longword) 0xc0000000L); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1479 swShiftCnt++) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1480 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1481 L_var1 = L_var1 << 1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1482 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1483 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1484 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1485 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1486 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1487 swShiftCnt = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1488 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1489 return (swShiftCnt); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1490 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1491 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1492 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1493 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1494 * FUNCTION NAME: norm_s |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1495 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1496 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1497 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1498 * Get normalize shift count: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1499 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1500 * A 16 bit number is input (possiblly unnormalized). Output |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1501 * the positive (or zero) shift count required to normalize the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1502 * input. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1503 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1504 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1505 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1506 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1507 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1508 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1509 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1510 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1511 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1512 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1513 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1514 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1515 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1516 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1517 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1518 * 0 <= swOut <= 15 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1519 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1520 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1521 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1522 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1523 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1524 * Get normalize shift count: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1525 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1526 * A 16 bit number is input (possiblly unnormalized). Output |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1527 * the positive (or zero) shift count required to normalize the |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1528 * input. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1529 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1530 * If zero in input, return 0 as the shift count. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1531 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1532 * For non-zero numbers, count the number of left shift |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1533 * required to get the number to fall into the range: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1534 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1535 * 0x4000 >= normlzd number >= 0x7fff (positive number) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1536 * or |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1537 * 0x8000 <= normlzd number < 0xc000 (negative number) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1538 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1539 * Return the number of shifts. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1540 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1541 * This instruction corresponds exactly to the Full-Rate "norm" |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1542 * instruction. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1543 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1544 * KEYWORDS: norm, normalization |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1545 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1546 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1547 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1548 Shortword norm_s(Shortword var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1549 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1550 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1551 short swShiftCnt; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1552 Longword L_var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1553 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1554 L_var1 = L_deposit_h(var1); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1555 swShiftCnt = norm_l(L_var1); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1556 return (swShiftCnt); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1557 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1558 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1559 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1560 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1561 * FUNCTION NAME: round |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1562 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1563 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1564 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1565 * Round the 32 bit Longword into a 16 bit shortword with saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1566 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1567 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1568 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1569 * L_var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1570 * 32 bit long signed integer (Longword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1571 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1572 * 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1573 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1574 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1575 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1576 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1577 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1578 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1579 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1580 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1581 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1582 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1583 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1584 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1585 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1586 * Perform a two's complement round on the input Longword with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1587 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1588 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1589 * This is equivalent to adding 0x0000 8000 to the input. The |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1590 * result may overflow due to the add. If so, the result is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1591 * saturated. The 32 bit rounded number is then shifted down |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1592 * 16 bits and returned as a Shortword. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1593 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1594 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1595 * KEYWORDS: round |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1596 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1597 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1598 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1599 Shortword round(Longword L_var1) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1600 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1601 Longword L_Prod; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1602 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1603 L_Prod = L_add(L_var1, 0x00008000L); /* round MSP */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1604 return (extract_h(L_Prod)); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1605 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1606 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1607 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1608 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1609 * FUNCTION NAME: shift_r |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1610 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1611 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1612 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1613 * Shift and round. Perform a shift right. After shifting, use |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1614 * the last bit shifted out of the LSB to round the result up |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1615 * or down. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1616 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1617 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1618 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1619 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1620 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1621 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1622 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1623 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1624 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1625 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1626 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1627 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1628 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1629 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1630 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1631 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1632 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1633 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1634 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1635 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1636 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1637 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1638 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1639 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1640 * Shift and round. Perform a shift right. After shifting, use |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1641 * the last bit shifted out of the LSB to round the result up |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1642 * or down. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1643 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1644 * If var2 is positive perform a arithmetic left shift |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1645 * with saturation (see shl() above). |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1646 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1647 * If var2 is zero simply return var1. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1648 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1649 * If var2 is negative perform a arithmetic right shift (shr) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1650 * of var1 by (-var2)+1. Add the LS bit of the result to var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1651 * shifted right (shr) by -var2. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1652 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1653 * Note that there is no constraint on var2, so if var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1654 * -0xffff 8000 then -var2 is 0x0000 8000, not 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1655 * This is the reason the shl function is used. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1656 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1657 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1658 * KEYWORDS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1659 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1660 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1661 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1662 Shortword shift_r(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1663 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1664 Shortword swOut, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1665 swRnd; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1666 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1667 if (var2 >= 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1668 swOut = shl(var1, var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1669 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1670 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1671 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1672 /* right shift */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1673 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1674 if (var2 < -15) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1675 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1676 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1677 swOut = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1678 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1679 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1680 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1681 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1682 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1683 swRnd = shl(var1, var2 + 1) & 0x1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1684 swOut = add(shl(var1, var2), swRnd); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1685 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1686 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1687 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1688 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1689 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1690 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1691 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1692 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1693 * FUNCTION NAME: shl |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1694 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1695 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1696 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1697 * Arithmetically shift the input left by var2. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1698 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1699 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1700 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1701 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1702 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1703 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1704 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1705 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1706 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1707 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1708 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1709 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1710 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1711 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1712 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1713 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1714 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1715 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1716 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1717 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1718 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1719 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1720 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1721 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1722 * If Arithmetically shift the input left by var2. If var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1723 * negative then an arithmetic shift right (shr) of var1 by |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1724 * -var2 is performed. See description of shr for details. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1725 * When an arithmetic shift left is performed the var2 LS bits |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1726 * are zero filled. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1727 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1728 * The only exception is if the left shift causes an overflow |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1729 * or underflow. In this case the LS bits are not modified. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1730 * The number returned is 0x8000 in the case of an underflow or |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1731 * 0x7fff in the case of an overflow. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1732 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1733 * The shl is equivalent to the Full-Rate GSM "<< n" operation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1734 * Note that ANSI-C does not guarantee operation of the C ">>" |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1735 * or "<<" operator for negative numbers - it is not specified |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1736 * whether this shift is an arithmetic or logical shift. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1737 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1738 * KEYWORDS: asl, arithmetic shift left, shift |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1739 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1740 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1741 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1742 Shortword shl(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1743 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1744 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1745 Longword L_Out; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1746 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1747 if (var2 == 0 || var1 == 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1748 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1749 swOut = var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1750 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1751 else if (var2 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1752 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1753 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1754 /* perform a right shift */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1755 /*-----------------------*/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1756 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1757 if (var2 <= -15) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1758 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1759 if (var1 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1760 swOut = (Shortword) 0xffff; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1761 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1762 swOut = 0x0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1763 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1764 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1765 swOut = shr(var1, -var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1766 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1767 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1768 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1769 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1770 /* var2 > 0 */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1771 if (var2 >= 15) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1772 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1773 /* saturate */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1774 if (var1 > 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1775 swOut = SW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1776 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1777 swOut = SW_MIN; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1778 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1779 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1780 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1781 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1782 L_Out = (Longword) var1 *(1 << var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1783 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1784 swOut = (Shortword) L_Out; /* copy low portion to swOut, overflow |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1785 * could have hpnd */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1786 if (swOut != L_Out) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1787 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1788 /* overflow */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1789 if (var1 > 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1790 swOut = SW_MAX; /* saturate */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1791 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1792 swOut = SW_MIN; /* saturate */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1793 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1794 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1795 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1796 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1797 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1798 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1799 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1800 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1801 * FUNCTION NAME: shr |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1802 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1803 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1804 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1805 * Arithmetic shift right (or left). |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1806 * Arithmetically shift the input right by var2. If var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1807 * negative then an arithmetic shift left (shl) of var1 by |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1808 * -var2 is performed. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1809 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1810 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1811 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1812 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1813 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1814 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1815 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1816 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1817 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1818 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1819 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1820 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1821 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1822 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1823 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1824 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1825 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1826 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1827 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1828 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1829 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1830 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1831 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1832 * Arithmetically shift the input right by var2. This |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1833 * operation maintains the sign of the input number. If var2 is |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1834 * negative then an arithmetic shift left (shl) of var1 by |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1835 * -var2 is performed. See description of shl for details. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1836 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1837 * Equivalent to the Full-Rate GSM ">> n" operation. Note that |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1838 * ANSI-C does not guarantee operation of the C ">>" or "<<" |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1839 * operator for negative numbers. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1840 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1841 * KEYWORDS: shift, arithmetic shift right, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1842 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1843 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1844 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1845 Shortword shr(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1846 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1847 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1848 Shortword swMask, |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1849 swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1850 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1851 if (var2 == 0 || var1 == 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1852 swOut = var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1853 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1854 else if (var2 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1855 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1856 /* perform an arithmetic left shift */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1857 /*----------------------------------*/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1858 if (var2 <= -15) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1859 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1860 /* saturate */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1861 if (var1 > 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1862 swOut = SW_MAX; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1863 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1864 swOut = SW_MIN; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1865 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1866 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1867 swOut = shl(var1, -var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1868 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1869 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1870 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1871 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1872 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1873 /* positive shift count */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1874 /*----------------------*/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1875 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1876 if (var2 >= 15) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1877 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1878 if (var1 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1879 swOut = (Shortword) 0xffff; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1880 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1881 swOut = 0x0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1882 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1883 else |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1884 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1885 /* take care of sign extension */ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1886 /*-----------------------------*/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1887 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1888 swMask = 0; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1889 if (var1 < 0) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1890 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1891 swMask = ~swMask << (16 - var2); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1892 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1893 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1894 var1 >>= var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1895 swOut = swMask | var1; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1896 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1897 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1898 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1899 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1900 } |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1901 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1902 /*************************************************************************** |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1903 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1904 * FUNCTION NAME: sub |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1905 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1906 * PURPOSE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1907 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1908 * Perform the subtraction of the two 16 bit input variable with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1909 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1910 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1911 * INPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1912 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1913 * var1 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1914 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1915 * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1916 * var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1917 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1918 * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1919 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1920 * OUTPUTS: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1921 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1922 * none |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1923 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1924 * RETURN VALUE: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1925 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1926 * swOut |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1927 * 16 bit short signed integer (Shortword) whose value |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1928 * falls in the range |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1929 * 0xffff 8000 <= swOut <= 0x0000 7fff. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1930 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1931 * IMPLEMENTATION: |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1932 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1933 * Perform the subtraction of the two 16 bit input variable with |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1934 * saturation. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1935 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1936 * swOut = var1 - var2 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1937 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1938 * swOut is set to 0x7fff if the operation results in an |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1939 * overflow. swOut is set to 0x8000 if the operation results |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1940 * in an underflow. |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1941 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1942 * KEYWORDS: sub, subtraction |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1943 * |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1944 *************************************************************************/ |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1945 Shortword sub(Shortword var1, Shortword var2) |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1946 { |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1947 Longword L_diff; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1948 Shortword swOut; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1949 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1950 L_diff = (Longword) var1 - var2; |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1951 swOut = saturate(L_diff); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1952 |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1953 return (swOut); |
66fb1fd032e6
libgsmhr1/mathhalf.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1954 } |