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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }