1*49fe348cSAndroid Build Coastguard Worker /******************************************************************************
2*49fe348cSAndroid Build Coastguard Worker *
3*49fe348cSAndroid Build Coastguard Worker * Copyright 2022 Google LLC
4*49fe348cSAndroid Build Coastguard Worker *
5*49fe348cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*49fe348cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*49fe348cSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*49fe348cSAndroid Build Coastguard Worker *
9*49fe348cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*49fe348cSAndroid Build Coastguard Worker *
11*49fe348cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*49fe348cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*49fe348cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*49fe348cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*49fe348cSAndroid Build Coastguard Worker * limitations under the License.
16*49fe348cSAndroid Build Coastguard Worker *
17*49fe348cSAndroid Build Coastguard Worker ******************************************************************************/
18*49fe348cSAndroid Build Coastguard Worker
19*49fe348cSAndroid Build Coastguard Worker /**
20*49fe348cSAndroid Build Coastguard Worker * The bitstream is written by the 2 ends of the buffer :
21*49fe348cSAndroid Build Coastguard Worker *
22*49fe348cSAndroid Build Coastguard Worker * - Arthmetic coder put bits while increasing memory addresses
23*49fe348cSAndroid Build Coastguard Worker * in the buffer (forward)
24*49fe348cSAndroid Build Coastguard Worker *
25*49fe348cSAndroid Build Coastguard Worker * - Plain bits are puts starting the end of the buffer, with memeory
26*49fe348cSAndroid Build Coastguard Worker * addresses decreasing (backward)
27*49fe348cSAndroid Build Coastguard Worker *
28*49fe348cSAndroid Build Coastguard Worker * .---------------------------------------------------.
29*49fe348cSAndroid Build Coastguard Worker * | > > > > > > > > > > : : < < < < < < < < < |
30*49fe348cSAndroid Build Coastguard Worker * '---------------------------------------------------'
31*49fe348cSAndroid Build Coastguard Worker * |---------------------> - - - - - - - - - - - - - ->|
32*49fe348cSAndroid Build Coastguard Worker * |< - - - <-------------------|
33*49fe348cSAndroid Build Coastguard Worker * Arithmetic coding Plain bits
34*49fe348cSAndroid Build Coastguard Worker * `lc3_put_symbol()` `lc3_put_bits()`
35*49fe348cSAndroid Build Coastguard Worker *
36*49fe348cSAndroid Build Coastguard Worker * - The forward writing is protected against buffer overflow, it cannot
37*49fe348cSAndroid Build Coastguard Worker * write after the buffer, but can overwrite plain bits previously
38*49fe348cSAndroid Build Coastguard Worker * written in the buffer.
39*49fe348cSAndroid Build Coastguard Worker *
40*49fe348cSAndroid Build Coastguard Worker * - The backward writing is protected against overwrite of the arithmetic
41*49fe348cSAndroid Build Coastguard Worker * coder bitstream. In such way, the backward bitstream is always limited
42*49fe348cSAndroid Build Coastguard Worker * by the aritmetic coder bitstream, and can be overwritten by him.
43*49fe348cSAndroid Build Coastguard Worker *
44*49fe348cSAndroid Build Coastguard Worker * .---------------------------------------------------.
45*49fe348cSAndroid Build Coastguard Worker * | > > > > > > > > > > : : < < < < < < < < < |
46*49fe348cSAndroid Build Coastguard Worker * '---------------------------------------------------'
47*49fe348cSAndroid Build Coastguard Worker * |---------------------> - - - - - - - - - - - - - ->|
48*49fe348cSAndroid Build Coastguard Worker * |< - - - - - - - - - - - - - - <-------------------|
49*49fe348cSAndroid Build Coastguard Worker * Arithmetic coding Plain bits
50*49fe348cSAndroid Build Coastguard Worker * `lc3_get_symbol()` `lc3_get_bits()`
51*49fe348cSAndroid Build Coastguard Worker *
52*49fe348cSAndroid Build Coastguard Worker * - Reading is limited to read of the complementary end of the buffer.
53*49fe348cSAndroid Build Coastguard Worker *
54*49fe348cSAndroid Build Coastguard Worker * - The procedure `lc3_check_bits()` returns indication that read has been
55*49fe348cSAndroid Build Coastguard Worker * made crossing the other bit plane.
56*49fe348cSAndroid Build Coastguard Worker *
57*49fe348cSAndroid Build Coastguard Worker */
58*49fe348cSAndroid Build Coastguard Worker
59*49fe348cSAndroid Build Coastguard Worker #ifndef __LC3_BITS_H
60*49fe348cSAndroid Build Coastguard Worker #define __LC3_BITS_H
61*49fe348cSAndroid Build Coastguard Worker
62*49fe348cSAndroid Build Coastguard Worker #include "common.h"
63*49fe348cSAndroid Build Coastguard Worker
64*49fe348cSAndroid Build Coastguard Worker
65*49fe348cSAndroid Build Coastguard Worker /**
66*49fe348cSAndroid Build Coastguard Worker * Bitstream mode
67*49fe348cSAndroid Build Coastguard Worker */
68*49fe348cSAndroid Build Coastguard Worker
69*49fe348cSAndroid Build Coastguard Worker enum lc3_bits_mode {
70*49fe348cSAndroid Build Coastguard Worker LC3_BITS_MODE_READ,
71*49fe348cSAndroid Build Coastguard Worker LC3_BITS_MODE_WRITE,
72*49fe348cSAndroid Build Coastguard Worker };
73*49fe348cSAndroid Build Coastguard Worker
74*49fe348cSAndroid Build Coastguard Worker /**
75*49fe348cSAndroid Build Coastguard Worker * Arithmetic coder symbol interval
76*49fe348cSAndroid Build Coastguard Worker * The model split the interval in 17 symbols
77*49fe348cSAndroid Build Coastguard Worker */
78*49fe348cSAndroid Build Coastguard Worker
79*49fe348cSAndroid Build Coastguard Worker struct lc3_ac_symbol {
80*49fe348cSAndroid Build Coastguard Worker uint16_t low : 16;
81*49fe348cSAndroid Build Coastguard Worker uint16_t range : 16;
82*49fe348cSAndroid Build Coastguard Worker };
83*49fe348cSAndroid Build Coastguard Worker
84*49fe348cSAndroid Build Coastguard Worker struct lc3_ac_model {
85*49fe348cSAndroid Build Coastguard Worker struct lc3_ac_symbol s[17];
86*49fe348cSAndroid Build Coastguard Worker };
87*49fe348cSAndroid Build Coastguard Worker
88*49fe348cSAndroid Build Coastguard Worker /**
89*49fe348cSAndroid Build Coastguard Worker * Bitstream context
90*49fe348cSAndroid Build Coastguard Worker */
91*49fe348cSAndroid Build Coastguard Worker
92*49fe348cSAndroid Build Coastguard Worker #define LC3_ACCU_BITS (int)(8 * sizeof(unsigned))
93*49fe348cSAndroid Build Coastguard Worker
94*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_accu {
95*49fe348cSAndroid Build Coastguard Worker unsigned v;
96*49fe348cSAndroid Build Coastguard Worker int n, nover;
97*49fe348cSAndroid Build Coastguard Worker };
98*49fe348cSAndroid Build Coastguard Worker
99*49fe348cSAndroid Build Coastguard Worker #define LC3_AC_BITS (int)(24)
100*49fe348cSAndroid Build Coastguard Worker
101*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_ac {
102*49fe348cSAndroid Build Coastguard Worker unsigned low, range;
103*49fe348cSAndroid Build Coastguard Worker int cache, carry, carry_count;
104*49fe348cSAndroid Build Coastguard Worker bool error;
105*49fe348cSAndroid Build Coastguard Worker };
106*49fe348cSAndroid Build Coastguard Worker
107*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_buffer {
108*49fe348cSAndroid Build Coastguard Worker const uint8_t *start, *end;
109*49fe348cSAndroid Build Coastguard Worker uint8_t *p_fw, *p_bw;
110*49fe348cSAndroid Build Coastguard Worker };
111*49fe348cSAndroid Build Coastguard Worker
112*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_bits {
113*49fe348cSAndroid Build Coastguard Worker enum lc3_bits_mode mode;
114*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_ac ac;
115*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_accu accu;
116*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_buffer buffer;
117*49fe348cSAndroid Build Coastguard Worker } lc3_bits_t;
118*49fe348cSAndroid Build Coastguard Worker
119*49fe348cSAndroid Build Coastguard Worker
120*49fe348cSAndroid Build Coastguard Worker /**
121*49fe348cSAndroid Build Coastguard Worker * Setup bitstream reading/writing
122*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
123*49fe348cSAndroid Build Coastguard Worker * mode Either READ or WRITE mode
124*49fe348cSAndroid Build Coastguard Worker * buffer, len Output buffer and length (in bytes)
125*49fe348cSAndroid Build Coastguard Worker */
126*49fe348cSAndroid Build Coastguard Worker void lc3_setup_bits(lc3_bits_t *bits,
127*49fe348cSAndroid Build Coastguard Worker enum lc3_bits_mode mode, void *buffer, int len);
128*49fe348cSAndroid Build Coastguard Worker
129*49fe348cSAndroid Build Coastguard Worker /**
130*49fe348cSAndroid Build Coastguard Worker * Return number of bits left in the bitstream
131*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
132*49fe348cSAndroid Build Coastguard Worker * return Number of bits left
133*49fe348cSAndroid Build Coastguard Worker */
134*49fe348cSAndroid Build Coastguard Worker int lc3_get_bits_left(const lc3_bits_t *bits);
135*49fe348cSAndroid Build Coastguard Worker
136*49fe348cSAndroid Build Coastguard Worker /**
137*49fe348cSAndroid Build Coastguard Worker * Check if error occured on bitstream reading/writing
138*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
139*49fe348cSAndroid Build Coastguard Worker * return 0: Ok -1: Bitstream overflow or AC reading error
140*49fe348cSAndroid Build Coastguard Worker */
141*49fe348cSAndroid Build Coastguard Worker int lc3_check_bits(const lc3_bits_t *bits);
142*49fe348cSAndroid Build Coastguard Worker
143*49fe348cSAndroid Build Coastguard Worker /**
144*49fe348cSAndroid Build Coastguard Worker * Put a bit
145*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
146*49fe348cSAndroid Build Coastguard Worker * v Bit value, 0 or 1
147*49fe348cSAndroid Build Coastguard Worker */
148*49fe348cSAndroid Build Coastguard Worker static inline void lc3_put_bit(lc3_bits_t *bits, int v);
149*49fe348cSAndroid Build Coastguard Worker
150*49fe348cSAndroid Build Coastguard Worker /**
151*49fe348cSAndroid Build Coastguard Worker * Put from 1 to 32 bits
152*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
153*49fe348cSAndroid Build Coastguard Worker * v, n Value, in range 0 to 2^n - 1, and bits count (1 to 32)
154*49fe348cSAndroid Build Coastguard Worker */
155*49fe348cSAndroid Build Coastguard Worker static inline void lc3_put_bits(lc3_bits_t *bits, unsigned v, int n);
156*49fe348cSAndroid Build Coastguard Worker
157*49fe348cSAndroid Build Coastguard Worker /**
158*49fe348cSAndroid Build Coastguard Worker * Put arithmetic coder symbol
159*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
160*49fe348cSAndroid Build Coastguard Worker * model, s Model distribution and symbol value
161*49fe348cSAndroid Build Coastguard Worker */
162*49fe348cSAndroid Build Coastguard Worker static inline void lc3_put_symbol(lc3_bits_t *bits,
163*49fe348cSAndroid Build Coastguard Worker const struct lc3_ac_model *model, unsigned s);
164*49fe348cSAndroid Build Coastguard Worker
165*49fe348cSAndroid Build Coastguard Worker /**
166*49fe348cSAndroid Build Coastguard Worker * Flush and terminate bitstream writing
167*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
168*49fe348cSAndroid Build Coastguard Worker */
169*49fe348cSAndroid Build Coastguard Worker void lc3_flush_bits(lc3_bits_t *bits);
170*49fe348cSAndroid Build Coastguard Worker
171*49fe348cSAndroid Build Coastguard Worker /**
172*49fe348cSAndroid Build Coastguard Worker * Get a bit
173*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
174*49fe348cSAndroid Build Coastguard Worker */
175*49fe348cSAndroid Build Coastguard Worker static inline int lc3_get_bit(lc3_bits_t *bits);
176*49fe348cSAndroid Build Coastguard Worker
177*49fe348cSAndroid Build Coastguard Worker /**
178*49fe348cSAndroid Build Coastguard Worker * Get from 1 to 32 bits
179*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
180*49fe348cSAndroid Build Coastguard Worker * n Number of bits to read (1 to 32)
181*49fe348cSAndroid Build Coastguard Worker * return The value read
182*49fe348cSAndroid Build Coastguard Worker */
183*49fe348cSAndroid Build Coastguard Worker static inline unsigned lc3_get_bits(lc3_bits_t *bits, int n);
184*49fe348cSAndroid Build Coastguard Worker
185*49fe348cSAndroid Build Coastguard Worker /**
186*49fe348cSAndroid Build Coastguard Worker * Get arithmetic coder symbol
187*49fe348cSAndroid Build Coastguard Worker * bits Bitstream context
188*49fe348cSAndroid Build Coastguard Worker * model Model distribution
189*49fe348cSAndroid Build Coastguard Worker * return The value read
190*49fe348cSAndroid Build Coastguard Worker */
191*49fe348cSAndroid Build Coastguard Worker static inline unsigned lc3_get_symbol(lc3_bits_t *bits,
192*49fe348cSAndroid Build Coastguard Worker const struct lc3_ac_model *model);
193*49fe348cSAndroid Build Coastguard Worker
194*49fe348cSAndroid Build Coastguard Worker
195*49fe348cSAndroid Build Coastguard Worker
196*49fe348cSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------------
197*49fe348cSAndroid Build Coastguard Worker * Inline implementations
198*49fe348cSAndroid Build Coastguard Worker * -------------------------------------------------------------------------- */
199*49fe348cSAndroid Build Coastguard Worker
200*49fe348cSAndroid Build Coastguard Worker void lc3_put_bits_generic(lc3_bits_t *bits, unsigned v, int n);
201*49fe348cSAndroid Build Coastguard Worker unsigned lc3_get_bits_generic(struct lc3_bits *bits, int n);
202*49fe348cSAndroid Build Coastguard Worker
203*49fe348cSAndroid Build Coastguard Worker void lc3_ac_read_renorm(lc3_bits_t *bits);
204*49fe348cSAndroid Build Coastguard Worker void lc3_ac_write_renorm(lc3_bits_t *bits);
205*49fe348cSAndroid Build Coastguard Worker
206*49fe348cSAndroid Build Coastguard Worker
207*49fe348cSAndroid Build Coastguard Worker /**
208*49fe348cSAndroid Build Coastguard Worker * Put a bit
209*49fe348cSAndroid Build Coastguard Worker */
lc3_put_bit(lc3_bits_t * bits,int v)210*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline void lc3_put_bit(lc3_bits_t *bits, int v)
211*49fe348cSAndroid Build Coastguard Worker {
212*49fe348cSAndroid Build Coastguard Worker lc3_put_bits(bits, v, 1);
213*49fe348cSAndroid Build Coastguard Worker }
214*49fe348cSAndroid Build Coastguard Worker
215*49fe348cSAndroid Build Coastguard Worker /**
216*49fe348cSAndroid Build Coastguard Worker * Put from 1 to 32 bits
217*49fe348cSAndroid Build Coastguard Worker */
lc3_put_bits(struct lc3_bits * bits,unsigned v,int n)218*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline void lc3_put_bits(
219*49fe348cSAndroid Build Coastguard Worker struct lc3_bits *bits, unsigned v, int n)
220*49fe348cSAndroid Build Coastguard Worker {
221*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_accu *accu = &bits->accu;
222*49fe348cSAndroid Build Coastguard Worker
223*49fe348cSAndroid Build Coastguard Worker if (accu->n + n <= LC3_ACCU_BITS) {
224*49fe348cSAndroid Build Coastguard Worker accu->v |= v << accu->n;
225*49fe348cSAndroid Build Coastguard Worker accu->n += n;
226*49fe348cSAndroid Build Coastguard Worker } else {
227*49fe348cSAndroid Build Coastguard Worker lc3_put_bits_generic(bits, v, n);
228*49fe348cSAndroid Build Coastguard Worker }
229*49fe348cSAndroid Build Coastguard Worker }
230*49fe348cSAndroid Build Coastguard Worker
231*49fe348cSAndroid Build Coastguard Worker /**
232*49fe348cSAndroid Build Coastguard Worker * Get a bit
233*49fe348cSAndroid Build Coastguard Worker */
lc3_get_bit(lc3_bits_t * bits)234*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline int lc3_get_bit(lc3_bits_t *bits)
235*49fe348cSAndroid Build Coastguard Worker {
236*49fe348cSAndroid Build Coastguard Worker return lc3_get_bits(bits, 1);
237*49fe348cSAndroid Build Coastguard Worker }
238*49fe348cSAndroid Build Coastguard Worker
239*49fe348cSAndroid Build Coastguard Worker /**
240*49fe348cSAndroid Build Coastguard Worker * Get from 1 to 32 bits
241*49fe348cSAndroid Build Coastguard Worker */
lc3_get_bits(struct lc3_bits * bits,int n)242*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline unsigned lc3_get_bits(struct lc3_bits *bits, int n)
243*49fe348cSAndroid Build Coastguard Worker {
244*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_accu *accu = &bits->accu;
245*49fe348cSAndroid Build Coastguard Worker
246*49fe348cSAndroid Build Coastguard Worker if (accu->n + n <= LC3_ACCU_BITS) {
247*49fe348cSAndroid Build Coastguard Worker int v = (accu->v >> accu->n) & ((1u << n) - 1);
248*49fe348cSAndroid Build Coastguard Worker return (accu->n += n), v;
249*49fe348cSAndroid Build Coastguard Worker }
250*49fe348cSAndroid Build Coastguard Worker else {
251*49fe348cSAndroid Build Coastguard Worker return lc3_get_bits_generic(bits, n);
252*49fe348cSAndroid Build Coastguard Worker }
253*49fe348cSAndroid Build Coastguard Worker }
254*49fe348cSAndroid Build Coastguard Worker
255*49fe348cSAndroid Build Coastguard Worker /**
256*49fe348cSAndroid Build Coastguard Worker * Put arithmetic coder symbol
257*49fe348cSAndroid Build Coastguard Worker */
lc3_put_symbol(struct lc3_bits * bits,const struct lc3_ac_model * model,unsigned s)258*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline void lc3_put_symbol(
259*49fe348cSAndroid Build Coastguard Worker struct lc3_bits *bits, const struct lc3_ac_model *model, unsigned s)
260*49fe348cSAndroid Build Coastguard Worker {
261*49fe348cSAndroid Build Coastguard Worker const struct lc3_ac_symbol *symbols = model->s;
262*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_ac *ac = &bits->ac;
263*49fe348cSAndroid Build Coastguard Worker unsigned range = ac->range >> 10;
264*49fe348cSAndroid Build Coastguard Worker
265*49fe348cSAndroid Build Coastguard Worker ac->low += range * symbols[s].low;
266*49fe348cSAndroid Build Coastguard Worker ac->range = range * symbols[s].range;
267*49fe348cSAndroid Build Coastguard Worker
268*49fe348cSAndroid Build Coastguard Worker ac->carry |= ac->low >> 24;
269*49fe348cSAndroid Build Coastguard Worker ac->low &= 0xffffff;
270*49fe348cSAndroid Build Coastguard Worker
271*49fe348cSAndroid Build Coastguard Worker if (ac->range < 0x10000)
272*49fe348cSAndroid Build Coastguard Worker lc3_ac_write_renorm(bits);
273*49fe348cSAndroid Build Coastguard Worker }
274*49fe348cSAndroid Build Coastguard Worker
275*49fe348cSAndroid Build Coastguard Worker /**
276*49fe348cSAndroid Build Coastguard Worker * Get arithmetic coder symbol
277*49fe348cSAndroid Build Coastguard Worker */
lc3_get_symbol(lc3_bits_t * bits,const struct lc3_ac_model * model)278*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline unsigned lc3_get_symbol(
279*49fe348cSAndroid Build Coastguard Worker lc3_bits_t *bits, const struct lc3_ac_model *model)
280*49fe348cSAndroid Build Coastguard Worker {
281*49fe348cSAndroid Build Coastguard Worker const struct lc3_ac_symbol *symbols = model->s;
282*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_ac *ac = &bits->ac;
283*49fe348cSAndroid Build Coastguard Worker
284*49fe348cSAndroid Build Coastguard Worker unsigned range = (ac->range >> 10) & 0xffff;
285*49fe348cSAndroid Build Coastguard Worker
286*49fe348cSAndroid Build Coastguard Worker ac->error |= (ac->low >= (range << 10));
287*49fe348cSAndroid Build Coastguard Worker if (ac->error)
288*49fe348cSAndroid Build Coastguard Worker ac->low = 0;
289*49fe348cSAndroid Build Coastguard Worker
290*49fe348cSAndroid Build Coastguard Worker int s = 16;
291*49fe348cSAndroid Build Coastguard Worker
292*49fe348cSAndroid Build Coastguard Worker if (ac->low < range * symbols[s].low) {
293*49fe348cSAndroid Build Coastguard Worker s >>= 1;
294*49fe348cSAndroid Build Coastguard Worker s -= ac->low < range * symbols[s].low ? 4 : -4;
295*49fe348cSAndroid Build Coastguard Worker s -= ac->low < range * symbols[s].low ? 2 : -2;
296*49fe348cSAndroid Build Coastguard Worker s -= ac->low < range * symbols[s].low ? 1 : -1;
297*49fe348cSAndroid Build Coastguard Worker s -= ac->low < range * symbols[s].low;
298*49fe348cSAndroid Build Coastguard Worker }
299*49fe348cSAndroid Build Coastguard Worker
300*49fe348cSAndroid Build Coastguard Worker ac->low -= range * symbols[s].low;
301*49fe348cSAndroid Build Coastguard Worker ac->range = range * symbols[s].range;
302*49fe348cSAndroid Build Coastguard Worker
303*49fe348cSAndroid Build Coastguard Worker if (ac->range < 0x10000)
304*49fe348cSAndroid Build Coastguard Worker lc3_ac_read_renorm(bits);
305*49fe348cSAndroid Build Coastguard Worker
306*49fe348cSAndroid Build Coastguard Worker return s;
307*49fe348cSAndroid Build Coastguard Worker }
308*49fe348cSAndroid Build Coastguard Worker
309*49fe348cSAndroid Build Coastguard Worker #endif /* __LC3_BITS_H */
310