xref: /aosp_15_r20/external/bc/include/program.h (revision 5a6e848804d15c18a0125914844ee4eb0bda4fcf)
1*5a6e8488SAndroid Build Coastguard Worker /*
2*5a6e8488SAndroid Build Coastguard Worker  * *****************************************************************************
3*5a6e8488SAndroid Build Coastguard Worker  *
4*5a6e8488SAndroid Build Coastguard Worker  * SPDX-License-Identifier: BSD-2-Clause
5*5a6e8488SAndroid Build Coastguard Worker  *
6*5a6e8488SAndroid Build Coastguard Worker  * Copyright (c) 2018-2024 Gavin D. Howard and contributors.
7*5a6e8488SAndroid Build Coastguard Worker  *
8*5a6e8488SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*5a6e8488SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions are met:
10*5a6e8488SAndroid Build Coastguard Worker  *
11*5a6e8488SAndroid Build Coastguard Worker  * * Redistributions of source code must retain the above copyright notice, this
12*5a6e8488SAndroid Build Coastguard Worker  *   list of conditions and the following disclaimer.
13*5a6e8488SAndroid Build Coastguard Worker  *
14*5a6e8488SAndroid Build Coastguard Worker  * * Redistributions in binary form must reproduce the above copyright notice,
15*5a6e8488SAndroid Build Coastguard Worker  *   this list of conditions and the following disclaimer in the documentation
16*5a6e8488SAndroid Build Coastguard Worker  *   and/or other materials provided with the distribution.
17*5a6e8488SAndroid Build Coastguard Worker  *
18*5a6e8488SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*5a6e8488SAndroid Build Coastguard Worker  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*5a6e8488SAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*5a6e8488SAndroid Build Coastguard Worker  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*5a6e8488SAndroid Build Coastguard Worker  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*5a6e8488SAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*5a6e8488SAndroid Build Coastguard Worker  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*5a6e8488SAndroid Build Coastguard Worker  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*5a6e8488SAndroid Build Coastguard Worker  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*5a6e8488SAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*5a6e8488SAndroid Build Coastguard Worker  * POSSIBILITY OF SUCH DAMAGE.
29*5a6e8488SAndroid Build Coastguard Worker  *
30*5a6e8488SAndroid Build Coastguard Worker  * *****************************************************************************
31*5a6e8488SAndroid Build Coastguard Worker  *
32*5a6e8488SAndroid Build Coastguard Worker  * Definitions for bc programs.
33*5a6e8488SAndroid Build Coastguard Worker  *
34*5a6e8488SAndroid Build Coastguard Worker  */
35*5a6e8488SAndroid Build Coastguard Worker 
36*5a6e8488SAndroid Build Coastguard Worker #ifndef BC_PROGRAM_H
37*5a6e8488SAndroid Build Coastguard Worker #define BC_PROGRAM_H
38*5a6e8488SAndroid Build Coastguard Worker 
39*5a6e8488SAndroid Build Coastguard Worker #include <assert.h>
40*5a6e8488SAndroid Build Coastguard Worker #include <stddef.h>
41*5a6e8488SAndroid Build Coastguard Worker 
42*5a6e8488SAndroid Build Coastguard Worker #include <status.h>
43*5a6e8488SAndroid Build Coastguard Worker #include <parse.h>
44*5a6e8488SAndroid Build Coastguard Worker #include <lang.h>
45*5a6e8488SAndroid Build Coastguard Worker #include <num.h>
46*5a6e8488SAndroid Build Coastguard Worker #include <rand.h>
47*5a6e8488SAndroid Build Coastguard Worker 
48*5a6e8488SAndroid Build Coastguard Worker /// The index of ibase in the globals array.
49*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBALS_IBASE (0)
50*5a6e8488SAndroid Build Coastguard Worker 
51*5a6e8488SAndroid Build Coastguard Worker /// The index of obase in the globals array.
52*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBALS_OBASE (1)
53*5a6e8488SAndroid Build Coastguard Worker 
54*5a6e8488SAndroid Build Coastguard Worker /// The index of scale in the globals array.
55*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBALS_SCALE (2)
56*5a6e8488SAndroid Build Coastguard Worker 
57*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
58*5a6e8488SAndroid Build Coastguard Worker 
59*5a6e8488SAndroid Build Coastguard Worker /// The index of the rand max in the maxes array.
60*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_MAX_RAND (3)
61*5a6e8488SAndroid Build Coastguard Worker 
62*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
63*5a6e8488SAndroid Build Coastguard Worker 
64*5a6e8488SAndroid Build Coastguard Worker /// The length of the globals array.
65*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBALS_LEN (3 + BC_ENABLE_EXTRA_MATH)
66*5a6e8488SAndroid Build Coastguard Worker 
67*5a6e8488SAndroid Build Coastguard Worker typedef struct BcProgram
68*5a6e8488SAndroid Build Coastguard Worker {
69*5a6e8488SAndroid Build Coastguard Worker 	/// The array of globals values.
70*5a6e8488SAndroid Build Coastguard Worker 	BcBigDig globals[BC_PROG_GLOBALS_LEN];
71*5a6e8488SAndroid Build Coastguard Worker 
72*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
73*5a6e8488SAndroid Build Coastguard Worker 	/// The array of globals stacks.
74*5a6e8488SAndroid Build Coastguard Worker 	BcVec globals_v[BC_PROG_GLOBALS_LEN];
75*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
76*5a6e8488SAndroid Build Coastguard Worker 
77*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
78*5a6e8488SAndroid Build Coastguard Worker 
79*5a6e8488SAndroid Build Coastguard Worker 	/// The pseudo-random number generator.
80*5a6e8488SAndroid Build Coastguard Worker 	BcRNG rng;
81*5a6e8488SAndroid Build Coastguard Worker 
82*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
83*5a6e8488SAndroid Build Coastguard Worker 
84*5a6e8488SAndroid Build Coastguard Worker 	/// The results stack.
85*5a6e8488SAndroid Build Coastguard Worker 	BcVec results;
86*5a6e8488SAndroid Build Coastguard Worker 
87*5a6e8488SAndroid Build Coastguard Worker 	/// The execution stack.
88*5a6e8488SAndroid Build Coastguard Worker 	BcVec stack;
89*5a6e8488SAndroid Build Coastguard Worker 
90*5a6e8488SAndroid Build Coastguard Worker 	/// The constants encountered in the program. They are global to the program
91*5a6e8488SAndroid Build Coastguard Worker 	/// to prevent bad accesses when functions that used non-auto variables are
92*5a6e8488SAndroid Build Coastguard Worker 	/// replaced.
93*5a6e8488SAndroid Build Coastguard Worker 	BcVec consts;
94*5a6e8488SAndroid Build Coastguard Worker 
95*5a6e8488SAndroid Build Coastguard Worker 	/// The map of constants to go with consts.
96*5a6e8488SAndroid Build Coastguard Worker 	BcVec const_map;
97*5a6e8488SAndroid Build Coastguard Worker 
98*5a6e8488SAndroid Build Coastguard Worker 	/// The strings encountered in the program. They are global to the program
99*5a6e8488SAndroid Build Coastguard Worker 	/// to prevent bad accesses when functions that used non-auto variables are
100*5a6e8488SAndroid Build Coastguard Worker 	/// replaced.
101*5a6e8488SAndroid Build Coastguard Worker 	BcVec strs;
102*5a6e8488SAndroid Build Coastguard Worker 
103*5a6e8488SAndroid Build Coastguard Worker 	/// The map of strings to go with strs.
104*5a6e8488SAndroid Build Coastguard Worker 	BcVec str_map;
105*5a6e8488SAndroid Build Coastguard Worker 
106*5a6e8488SAndroid Build Coastguard Worker 	/// The array of functions.
107*5a6e8488SAndroid Build Coastguard Worker 	BcVec fns;
108*5a6e8488SAndroid Build Coastguard Worker 
109*5a6e8488SAndroid Build Coastguard Worker 	/// The map of functions to go with fns.
110*5a6e8488SAndroid Build Coastguard Worker 	BcVec fn_map;
111*5a6e8488SAndroid Build Coastguard Worker 
112*5a6e8488SAndroid Build Coastguard Worker 	/// The array of variables.
113*5a6e8488SAndroid Build Coastguard Worker 	BcVec vars;
114*5a6e8488SAndroid Build Coastguard Worker 
115*5a6e8488SAndroid Build Coastguard Worker 	/// The map of variables to go with vars.
116*5a6e8488SAndroid Build Coastguard Worker 	BcVec var_map;
117*5a6e8488SAndroid Build Coastguard Worker 
118*5a6e8488SAndroid Build Coastguard Worker 	/// The array of arrays.
119*5a6e8488SAndroid Build Coastguard Worker 	BcVec arrs;
120*5a6e8488SAndroid Build Coastguard Worker 
121*5a6e8488SAndroid Build Coastguard Worker 	/// The map of arrays to go with arrs.
122*5a6e8488SAndroid Build Coastguard Worker 	BcVec arr_map;
123*5a6e8488SAndroid Build Coastguard Worker 
124*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED
125*5a6e8488SAndroid Build Coastguard Worker 
126*5a6e8488SAndroid Build Coastguard Worker 	/// A vector of tail calls. These are just integers, which are the number of
127*5a6e8488SAndroid Build Coastguard Worker 	/// tail calls that have been executed for each function (string) on the
128*5a6e8488SAndroid Build Coastguard Worker 	/// stack for dc. This is to prevent dc from constantly growing memory use
129*5a6e8488SAndroid Build Coastguard Worker 	/// because of pushing more and more string executions on the stack.
130*5a6e8488SAndroid Build Coastguard Worker 	BcVec tail_calls;
131*5a6e8488SAndroid Build Coastguard Worker 
132*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED
133*5a6e8488SAndroid Build Coastguard Worker 
134*5a6e8488SAndroid Build Coastguard Worker 	/// A BcNum that has the proper base for asciify.
135*5a6e8488SAndroid Build Coastguard Worker 	BcNum strmb;
136*5a6e8488SAndroid Build Coastguard Worker 
137*5a6e8488SAndroid Build Coastguard Worker 	// A BcNum to run asciify. This is to prevent GCC longjmp() clobbering
138*5a6e8488SAndroid Build Coastguard Worker 	// warnings.
139*5a6e8488SAndroid Build Coastguard Worker 	BcNum asciify;
140*5a6e8488SAndroid Build Coastguard Worker 
141*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
142*5a6e8488SAndroid Build Coastguard Worker 
143*5a6e8488SAndroid Build Coastguard Worker 	/// The last printed value for bc.
144*5a6e8488SAndroid Build Coastguard Worker 	BcNum last;
145*5a6e8488SAndroid Build Coastguard Worker 
146*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
147*5a6e8488SAndroid Build Coastguard Worker 
148*5a6e8488SAndroid Build Coastguard Worker 	// The BcDig array for strmb. This uses BC_NUM_LONG_LOG10 because it is used
149*5a6e8488SAndroid Build Coastguard Worker 	// in bc_num_ulong2num(), which attempts to realloc, unless it is big
150*5a6e8488SAndroid Build Coastguard Worker 	// enough. This is big enough.
151*5a6e8488SAndroid Build Coastguard Worker 	BcDig strmb_num[BC_NUM_BIGDIG_LOG10];
152*5a6e8488SAndroid Build Coastguard Worker 
153*5a6e8488SAndroid Build Coastguard Worker } BcProgram;
154*5a6e8488SAndroid Build Coastguard Worker 
155*5a6e8488SAndroid Build Coastguard Worker /**
156*5a6e8488SAndroid Build Coastguard Worker  * Returns true if the stack @a s has at least @a n items, false otherwise.
157*5a6e8488SAndroid Build Coastguard Worker  * @param s  The stack to check.
158*5a6e8488SAndroid Build Coastguard Worker  * @param n  The number of items the stack must have.
159*5a6e8488SAndroid Build Coastguard Worker  * @return   True if @a s has at least @a n items, false otherwise.
160*5a6e8488SAndroid Build Coastguard Worker  */
161*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_STACK(s, n) ((s)->len >= ((size_t) (n)))
162*5a6e8488SAndroid Build Coastguard Worker 
163*5a6e8488SAndroid Build Coastguard Worker /**
164*5a6e8488SAndroid Build Coastguard Worker  * Get a pointer to the top value in a global value stack.
165*5a6e8488SAndroid Build Coastguard Worker  * @param v  The global value stack.
166*5a6e8488SAndroid Build Coastguard Worker  * @return   A pointer to the top value in @a v.
167*5a6e8488SAndroid Build Coastguard Worker  */
168*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBAL_PTR(v) (bc_vec_top(v))
169*5a6e8488SAndroid Build Coastguard Worker 
170*5a6e8488SAndroid Build Coastguard Worker /**
171*5a6e8488SAndroid Build Coastguard Worker  * Get the top value in a global value stack.
172*5a6e8488SAndroid Build Coastguard Worker  * @param v  The global value stack.
173*5a6e8488SAndroid Build Coastguard Worker  * @return   The top value in @a v.
174*5a6e8488SAndroid Build Coastguard Worker  */
175*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBAL(v) (*((BcBigDig*) BC_PROG_GLOBAL_PTR(v)))
176*5a6e8488SAndroid Build Coastguard Worker 
177*5a6e8488SAndroid Build Coastguard Worker /**
178*5a6e8488SAndroid Build Coastguard Worker  * Returns the current value of ibase.
179*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program.
180*5a6e8488SAndroid Build Coastguard Worker  * @return   The current ibase.
181*5a6e8488SAndroid Build Coastguard Worker  */
182*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_IBASE(p) ((p)->globals[BC_PROG_GLOBALS_IBASE])
183*5a6e8488SAndroid Build Coastguard Worker 
184*5a6e8488SAndroid Build Coastguard Worker /**
185*5a6e8488SAndroid Build Coastguard Worker  * Returns the current value of obase.
186*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program.
187*5a6e8488SAndroid Build Coastguard Worker  * @return   The current obase.
188*5a6e8488SAndroid Build Coastguard Worker  */
189*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_OBASE(p) ((p)->globals[BC_PROG_GLOBALS_OBASE])
190*5a6e8488SAndroid Build Coastguard Worker 
191*5a6e8488SAndroid Build Coastguard Worker /**
192*5a6e8488SAndroid Build Coastguard Worker  * Returns the current value of scale.
193*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program.
194*5a6e8488SAndroid Build Coastguard Worker  * @return   The current scale.
195*5a6e8488SAndroid Build Coastguard Worker  */
196*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_SCALE(p) ((p)->globals[BC_PROG_GLOBALS_SCALE])
197*5a6e8488SAndroid Build Coastguard Worker 
198*5a6e8488SAndroid Build Coastguard Worker /// The index for the main function in the functions array.//
199*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_MAIN (0)
200*5a6e8488SAndroid Build Coastguard Worker 
201*5a6e8488SAndroid Build Coastguard Worker /// The index for the read function in the functions array.
202*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_READ (1)
203*5a6e8488SAndroid Build Coastguard Worker 
204*5a6e8488SAndroid Build Coastguard Worker /**
205*5a6e8488SAndroid Build Coastguard Worker  * Retires (completes the execution of) an instruction. Some instructions
206*5a6e8488SAndroid Build Coastguard Worker  * require special retirement, but most can use this. This basically pops the
207*5a6e8488SAndroid Build Coastguard Worker  * operands while preserving the result (which we assumed was pushed before the
208*5a6e8488SAndroid Build Coastguard Worker  * actual operation).
209*5a6e8488SAndroid Build Coastguard Worker  * @param p     The program.
210*5a6e8488SAndroid Build Coastguard Worker  * @param nres  The number of results returned by the instruction.
211*5a6e8488SAndroid Build Coastguard Worker  * @param nops  The number of operands used by the instruction.
212*5a6e8488SAndroid Build Coastguard Worker  */
213*5a6e8488SAndroid Build Coastguard Worker #define bc_program_retire(p, nres, nops) \
214*5a6e8488SAndroid Build Coastguard Worker 	(bc_vec_npopAt(&(p)->results, (nops), (p)->results.len - (nres + nops)))
215*5a6e8488SAndroid Build Coastguard Worker 
216*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED
217*5a6e8488SAndroid Build Coastguard Worker 
218*5a6e8488SAndroid Build Coastguard Worker /// A constant that tells how many functions are required in dc.
219*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_REQ_FUNCS (2)
220*5a6e8488SAndroid Build Coastguard Worker 
221*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLED
222*5a6e8488SAndroid Build Coastguard Worker 
223*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should pop after printing.
224*5a6e8488SAndroid Build Coastguard Worker #define BC_PROGRAM_POP(pop) (pop)
225*5a6e8488SAndroid Build Coastguard Worker 
226*5a6e8488SAndroid Build Coastguard Worker #else // !BC_ENABLED
227*5a6e8488SAndroid Build Coastguard Worker 
228*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should pop after printing.
229*5a6e8488SAndroid Build Coastguard Worker #define BC_PROGRAM_POP(pop) (BC_IS_BC || (pop))
230*5a6e8488SAndroid Build Coastguard Worker 
231*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLED
232*5a6e8488SAndroid Build Coastguard Worker 
233*5a6e8488SAndroid Build Coastguard Worker // This is here to satisfy a clang warning about recursive macros.
234*5a6e8488SAndroid Build Coastguard Worker #define bc_program_pushVar(p, code, bgn, pop, copy) \
235*5a6e8488SAndroid Build Coastguard Worker 	bc_program_pushVar_impl(p, code, bgn, pop, copy)
236*5a6e8488SAndroid Build Coastguard Worker 
237*5a6e8488SAndroid Build Coastguard Worker #else // DC_ENABLED
238*5a6e8488SAndroid Build Coastguard Worker 
239*5a6e8488SAndroid Build Coastguard Worker // This define disappears pop and copy because for bc, 'pop' and 'copy' are
240*5a6e8488SAndroid Build Coastguard Worker // always false.
241*5a6e8488SAndroid Build Coastguard Worker #define bc_program_pushVar(p, code, bgn, pop, copy) \
242*5a6e8488SAndroid Build Coastguard Worker 	bc_program_pushVar_impl(p, code, bgn)
243*5a6e8488SAndroid Build Coastguard Worker 
244*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should pop after printing.
245*5a6e8488SAndroid Build Coastguard Worker #define BC_PROGRAM_POP(pop) (BC_IS_BC)
246*5a6e8488SAndroid Build Coastguard Worker 
247*5a6e8488SAndroid Build Coastguard Worker // In debug mode, we want bc to check the stack, but otherwise, we don't because
248*5a6e8488SAndroid Build Coastguard Worker // the bc language implicitly mandates that the stack should always have enough
249*5a6e8488SAndroid Build Coastguard Worker // items.
250*5a6e8488SAndroid Build Coastguard Worker #ifdef BC_DEBUG
251*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_NO_STACK_CHECK
252*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG
253*5a6e8488SAndroid Build Coastguard Worker 
254*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED
255*5a6e8488SAndroid Build Coastguard Worker 
256*5a6e8488SAndroid Build Coastguard Worker /**
257*5a6e8488SAndroid Build Coastguard Worker  * Returns true if the BcNum @a n is acting as a string.
258*5a6e8488SAndroid Build Coastguard Worker  * @param n  The BcNum to test.
259*5a6e8488SAndroid Build Coastguard Worker  * @return   True if @a n is acting as a string, false otherwise.
260*5a6e8488SAndroid Build Coastguard Worker  */
261*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_STR(n) ((n)->num == NULL && !(n)->cap)
262*5a6e8488SAndroid Build Coastguard Worker 
263*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
264*5a6e8488SAndroid Build Coastguard Worker 
265*5a6e8488SAndroid Build Coastguard Worker /**
266*5a6e8488SAndroid Build Coastguard Worker  * Returns true if the result @a r and @a n is a number.
267*5a6e8488SAndroid Build Coastguard Worker  * @param r  The result.
268*5a6e8488SAndroid Build Coastguard Worker  * @param n  The number corresponding to the result.
269*5a6e8488SAndroid Build Coastguard Worker  * @return   True if the result holds a number, false otherwise.
270*5a6e8488SAndroid Build Coastguard Worker  */
271*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_NUM(r, n) \
272*5a6e8488SAndroid Build Coastguard Worker 	((r)->t != BC_RESULT_ARRAY && (r)->t != BC_RESULT_STR && !BC_PROG_STR(n))
273*5a6e8488SAndroid Build Coastguard Worker 
274*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLED
275*5a6e8488SAndroid Build Coastguard Worker 
276*5a6e8488SAndroid Build Coastguard Worker /**
277*5a6e8488SAndroid Build Coastguard Worker  * Returns true if the result @a r and @a n is a number.
278*5a6e8488SAndroid Build Coastguard Worker  * @param r  The result.
279*5a6e8488SAndroid Build Coastguard Worker  * @param n  The number corresponding to the result.
280*5a6e8488SAndroid Build Coastguard Worker  * @return   True if the result holds a number, false otherwise.
281*5a6e8488SAndroid Build Coastguard Worker  */
282*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_NUM(r, n) ((r)->t != BC_RESULT_STR && !BC_PROG_STR(n))
283*5a6e8488SAndroid Build Coastguard Worker 
284*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
285*5a6e8488SAndroid Build Coastguard Worker 
286*5a6e8488SAndroid Build Coastguard Worker /**
287*5a6e8488SAndroid Build Coastguard Worker  * This is a function type for unary operations. Currently, these include
288*5a6e8488SAndroid Build Coastguard Worker  * boolean not, negation, and truncation with extra math.
289*5a6e8488SAndroid Build Coastguard Worker  * @param r  The BcResult to store the result into.
290*5a6e8488SAndroid Build Coastguard Worker  * @param n  The parameter to the unary operation.
291*5a6e8488SAndroid Build Coastguard Worker  */
292*5a6e8488SAndroid Build Coastguard Worker typedef void (*BcProgramUnary)(BcResult* r, BcNum* n);
293*5a6e8488SAndroid Build Coastguard Worker 
294*5a6e8488SAndroid Build Coastguard Worker /**
295*5a6e8488SAndroid Build Coastguard Worker  * Initializes the BcProgram.
296*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program to initialize.
297*5a6e8488SAndroid Build Coastguard Worker  */
298*5a6e8488SAndroid Build Coastguard Worker void
299*5a6e8488SAndroid Build Coastguard Worker bc_program_init(BcProgram* p);
300*5a6e8488SAndroid Build Coastguard Worker 
301*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG
302*5a6e8488SAndroid Build Coastguard Worker 
303*5a6e8488SAndroid Build Coastguard Worker /**
304*5a6e8488SAndroid Build Coastguard Worker  * Frees a BcProgram. This is only used in debug builds because a BcProgram is
305*5a6e8488SAndroid Build Coastguard Worker  * only freed on program exit, and we don't care about freeing resources on
306*5a6e8488SAndroid Build Coastguard Worker  * exit.
307*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program to initialize.
308*5a6e8488SAndroid Build Coastguard Worker  */
309*5a6e8488SAndroid Build Coastguard Worker void
310*5a6e8488SAndroid Build Coastguard Worker bc_program_free(BcProgram* p);
311*5a6e8488SAndroid Build Coastguard Worker 
312*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG
313*5a6e8488SAndroid Build Coastguard Worker 
314*5a6e8488SAndroid Build Coastguard Worker /**
315*5a6e8488SAndroid Build Coastguard Worker  * Prints a stack trace of the bc functions or dc strings currently executing.
316*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program.
317*5a6e8488SAndroid Build Coastguard Worker  */
318*5a6e8488SAndroid Build Coastguard Worker void
319*5a6e8488SAndroid Build Coastguard Worker bc_program_printStackTrace(BcProgram* p);
320*5a6e8488SAndroid Build Coastguard Worker 
321*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG_CODE
322*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED && DC_ENABLED
323*5a6e8488SAndroid Build Coastguard Worker 
324*5a6e8488SAndroid Build Coastguard Worker /**
325*5a6e8488SAndroid Build Coastguard Worker  * Prints the bytecode in a function. This is a debug-only function.
326*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program.
327*5a6e8488SAndroid Build Coastguard Worker  */
328*5a6e8488SAndroid Build Coastguard Worker void
329*5a6e8488SAndroid Build Coastguard Worker bc_program_code(const BcProgram* p);
330*5a6e8488SAndroid Build Coastguard Worker 
331*5a6e8488SAndroid Build Coastguard Worker /**
332*5a6e8488SAndroid Build Coastguard Worker  * Prints an instruction. This is a debug-only function.
333*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program.
334*5a6e8488SAndroid Build Coastguard Worker  * @param code  The bytecode array.
335*5a6e8488SAndroid Build Coastguard Worker  * @param bgn   A pointer to the current index. It is also updated to the next
336*5a6e8488SAndroid Build Coastguard Worker  *              index.
337*5a6e8488SAndroid Build Coastguard Worker  */
338*5a6e8488SAndroid Build Coastguard Worker void
339*5a6e8488SAndroid Build Coastguard Worker bc_program_printInst(const BcProgram* p, const char* code,
340*5a6e8488SAndroid Build Coastguard Worker                      size_t* restrict bgn);
341*5a6e8488SAndroid Build Coastguard Worker 
342*5a6e8488SAndroid Build Coastguard Worker /**
343*5a6e8488SAndroid Build Coastguard Worker  * Prints the stack. This is a debug-only function.
344*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program.
345*5a6e8488SAndroid Build Coastguard Worker  */
346*5a6e8488SAndroid Build Coastguard Worker void
347*5a6e8488SAndroid Build Coastguard Worker bc_program_printStackDebug(BcProgram* p);
348*5a6e8488SAndroid Build Coastguard Worker 
349*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED && DC_ENABLED
350*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG_CODE
351*5a6e8488SAndroid Build Coastguard Worker 
352*5a6e8488SAndroid Build Coastguard Worker /**
353*5a6e8488SAndroid Build Coastguard Worker  * Returns the index of the variable or array in their respective arrays.
354*5a6e8488SAndroid Build Coastguard Worker  * @param p     The program.
355*5a6e8488SAndroid Build Coastguard Worker  * @param name  The name of the variable or array.
356*5a6e8488SAndroid Build Coastguard Worker  * @param var   True if the search should be for a variable, false for an array.
357*5a6e8488SAndroid Build Coastguard Worker  * @return      The index of the variable or array in the correct array.
358*5a6e8488SAndroid Build Coastguard Worker  */
359*5a6e8488SAndroid Build Coastguard Worker size_t
360*5a6e8488SAndroid Build Coastguard Worker bc_program_search(BcProgram* p, const char* name, bool var);
361*5a6e8488SAndroid Build Coastguard Worker 
362*5a6e8488SAndroid Build Coastguard Worker /**
363*5a6e8488SAndroid Build Coastguard Worker  * Adds a string to the program and returns the string's index in the program.
364*5a6e8488SAndroid Build Coastguard Worker  * @param p    The program.
365*5a6e8488SAndroid Build Coastguard Worker  * @param str  The string to add.
366*5a6e8488SAndroid Build Coastguard Worker  * @return     The string's index in the program.
367*5a6e8488SAndroid Build Coastguard Worker  */
368*5a6e8488SAndroid Build Coastguard Worker size_t
369*5a6e8488SAndroid Build Coastguard Worker bc_program_addString(BcProgram* p, const char* str);
370*5a6e8488SAndroid Build Coastguard Worker 
371*5a6e8488SAndroid Build Coastguard Worker /**
372*5a6e8488SAndroid Build Coastguard Worker  * Inserts a function into the program and returns the index of the function in
373*5a6e8488SAndroid Build Coastguard Worker  * the fns array.
374*5a6e8488SAndroid Build Coastguard Worker  * @param p     The program.
375*5a6e8488SAndroid Build Coastguard Worker  * @param name  The name of the function.
376*5a6e8488SAndroid Build Coastguard Worker  * @return      The index of the function after insertion.
377*5a6e8488SAndroid Build Coastguard Worker  */
378*5a6e8488SAndroid Build Coastguard Worker size_t
379*5a6e8488SAndroid Build Coastguard Worker bc_program_insertFunc(BcProgram* p, const char* name);
380*5a6e8488SAndroid Build Coastguard Worker 
381*5a6e8488SAndroid Build Coastguard Worker /**
382*5a6e8488SAndroid Build Coastguard Worker  * Resets a program, usually because of resetting after an error.
383*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program to reset.
384*5a6e8488SAndroid Build Coastguard Worker  */
385*5a6e8488SAndroid Build Coastguard Worker void
386*5a6e8488SAndroid Build Coastguard Worker bc_program_reset(BcProgram* p);
387*5a6e8488SAndroid Build Coastguard Worker 
388*5a6e8488SAndroid Build Coastguard Worker /**
389*5a6e8488SAndroid Build Coastguard Worker  * Executes bc or dc code in the BcProgram.
390*5a6e8488SAndroid Build Coastguard Worker  * @param p  The program.
391*5a6e8488SAndroid Build Coastguard Worker  */
392*5a6e8488SAndroid Build Coastguard Worker void
393*5a6e8488SAndroid Build Coastguard Worker bc_program_exec(BcProgram* p);
394*5a6e8488SAndroid Build Coastguard Worker 
395*5a6e8488SAndroid Build Coastguard Worker /**
396*5a6e8488SAndroid Build Coastguard Worker  * Negates a copy of a BcNum. This is a BcProgramUnary function.
397*5a6e8488SAndroid Build Coastguard Worker  * @param r  The BcResult to store the result into.
398*5a6e8488SAndroid Build Coastguard Worker  * @param n  The parameter to the unary operation.
399*5a6e8488SAndroid Build Coastguard Worker  */
400*5a6e8488SAndroid Build Coastguard Worker void
401*5a6e8488SAndroid Build Coastguard Worker bc_program_negate(BcResult* r, BcNum* n);
402*5a6e8488SAndroid Build Coastguard Worker 
403*5a6e8488SAndroid Build Coastguard Worker /**
404*5a6e8488SAndroid Build Coastguard Worker  * Returns a boolean not of a BcNum. This is a BcProgramUnary function.
405*5a6e8488SAndroid Build Coastguard Worker  * @param r  The BcResult to store the result into.
406*5a6e8488SAndroid Build Coastguard Worker  * @param n  The parameter to the unary operation.
407*5a6e8488SAndroid Build Coastguard Worker  */
408*5a6e8488SAndroid Build Coastguard Worker void
409*5a6e8488SAndroid Build Coastguard Worker bc_program_not(BcResult* r, BcNum* n);
410*5a6e8488SAndroid Build Coastguard Worker 
411*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
412*5a6e8488SAndroid Build Coastguard Worker 
413*5a6e8488SAndroid Build Coastguard Worker /**
414*5a6e8488SAndroid Build Coastguard Worker  * Truncates a copy of a BcNum. This is a BcProgramUnary function.
415*5a6e8488SAndroid Build Coastguard Worker  * @param r  The BcResult to store the result into.
416*5a6e8488SAndroid Build Coastguard Worker  * @param n  The parameter to the unary operation.
417*5a6e8488SAndroid Build Coastguard Worker  */
418*5a6e8488SAndroid Build Coastguard Worker void
419*5a6e8488SAndroid Build Coastguard Worker bc_program_trunc(BcResult* r, BcNum* n);
420*5a6e8488SAndroid Build Coastguard Worker 
421*5a6e8488SAndroid Build Coastguard Worker /**
422*5a6e8488SAndroid Build Coastguard Worker  * Assigns a value to the seed builtin variable.
423*5a6e8488SAndroid Build Coastguard Worker  * @param p    The program.
424*5a6e8488SAndroid Build Coastguard Worker  * @param val  The value to assign to the seed.
425*5a6e8488SAndroid Build Coastguard Worker  */
426*5a6e8488SAndroid Build Coastguard Worker void
427*5a6e8488SAndroid Build Coastguard Worker bc_program_assignSeed(BcProgram* p, BcNum* val);
428*5a6e8488SAndroid Build Coastguard Worker 
429*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
430*5a6e8488SAndroid Build Coastguard Worker 
431*5a6e8488SAndroid Build Coastguard Worker /**
432*5a6e8488SAndroid Build Coastguard Worker  * Assigns a value to a builtin value that is not seed.
433*5a6e8488SAndroid Build Coastguard Worker  * @param p      The program.
434*5a6e8488SAndroid Build Coastguard Worker  * @param scale  True if the builtin is scale.
435*5a6e8488SAndroid Build Coastguard Worker  * @param obase  True if the builtin is obase. This cannot be true at the same
436*5a6e8488SAndroid Build Coastguard Worker  *               time @a scale is.
437*5a6e8488SAndroid Build Coastguard Worker  * @param val    The value to assign to the builtin.
438*5a6e8488SAndroid Build Coastguard Worker  */
439*5a6e8488SAndroid Build Coastguard Worker void
440*5a6e8488SAndroid Build Coastguard Worker bc_program_assignBuiltin(BcProgram* p, bool scale, bool obase, BcBigDig val);
441*5a6e8488SAndroid Build Coastguard Worker 
442*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of binary operator functions.
443*5a6e8488SAndroid Build Coastguard Worker extern const BcNumBinaryOp bc_program_ops[];
444*5a6e8488SAndroid Build Coastguard Worker 
445*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of binary operator allocation request functions.
446*5a6e8488SAndroid Build Coastguard Worker extern const BcNumBinaryOpReq bc_program_opReqs[];
447*5a6e8488SAndroid Build Coastguard Worker 
448*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of unary operator functions.
449*5a6e8488SAndroid Build Coastguard Worker extern const BcProgramUnary bc_program_unarys[];
450*5a6e8488SAndroid Build Coastguard Worker 
451*5a6e8488SAndroid Build Coastguard Worker /// A reference to a filename for command-line expressions.
452*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_exprs_name[];
453*5a6e8488SAndroid Build Coastguard Worker 
454*5a6e8488SAndroid Build Coastguard Worker /// A reference to a filename for stdin.
455*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_stdin_name[];
456*5a6e8488SAndroid Build Coastguard Worker 
457*5a6e8488SAndroid Build Coastguard Worker /// A reference to the ready message printed on SIGINT.
458*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_ready_msg[];
459*5a6e8488SAndroid Build Coastguard Worker 
460*5a6e8488SAndroid Build Coastguard Worker /// A reference to the length of the ready message.
461*5a6e8488SAndroid Build Coastguard Worker extern const size_t bc_program_ready_msg_len;
462*5a6e8488SAndroid Build Coastguard Worker 
463*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of escape characters for the print statement.
464*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_esc_chars[];
465*5a6e8488SAndroid Build Coastguard Worker 
466*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of the characters corresponding to the escape
467*5a6e8488SAndroid Build Coastguard Worker /// characters in bc_program_esc_chars.
468*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_esc_seqs[];
469*5a6e8488SAndroid Build Coastguard Worker 
470*5a6e8488SAndroid Build Coastguard Worker #if BC_HAS_COMPUTED_GOTO
471*5a6e8488SAndroid Build Coastguard Worker 
472*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG_CODE
473*5a6e8488SAndroid Build Coastguard Worker 
474*5a6e8488SAndroid Build Coastguard Worker // clang-format off
475*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_JUMP(inst, code, ip)                                  \
476*5a6e8488SAndroid Build Coastguard Worker 	do                                                                \
477*5a6e8488SAndroid Build Coastguard Worker 	{                                                                 \
478*5a6e8488SAndroid Build Coastguard Worker 		inst = (uchar) (code)[(ip)->idx++];                           \
479*5a6e8488SAndroid Build Coastguard Worker 		bc_file_printf(&vm->ferr, "inst: %s\n", bc_inst_names[inst]); \
480*5a6e8488SAndroid Build Coastguard Worker 		bc_file_flush(&vm->ferr, bc_flush_none);                      \
481*5a6e8488SAndroid Build Coastguard Worker 		goto *bc_program_inst_lbls[inst];                             \
482*5a6e8488SAndroid Build Coastguard Worker 	}                                                                 \
483*5a6e8488SAndroid Build Coastguard Worker 	while (0)
484*5a6e8488SAndroid Build Coastguard Worker // clang-format on
485*5a6e8488SAndroid Build Coastguard Worker 
486*5a6e8488SAndroid Build Coastguard Worker #else // BC_DEBUG_CODE
487*5a6e8488SAndroid Build Coastguard Worker 
488*5a6e8488SAndroid Build Coastguard Worker // clang-format off
489*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_JUMP(inst, code, ip)        \
490*5a6e8488SAndroid Build Coastguard Worker 	do                                      \
491*5a6e8488SAndroid Build Coastguard Worker 	{                                       \
492*5a6e8488SAndroid Build Coastguard Worker 		inst = (uchar) (code)[(ip)->idx++]; \
493*5a6e8488SAndroid Build Coastguard Worker 		goto *bc_program_inst_lbls[inst];   \
494*5a6e8488SAndroid Build Coastguard Worker 	}                                       \
495*5a6e8488SAndroid Build Coastguard Worker 	while (0)
496*5a6e8488SAndroid Build Coastguard Worker // clang-format on
497*5a6e8488SAndroid Build Coastguard Worker 
498*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG_CODE
499*5a6e8488SAndroid Build Coastguard Worker 
500*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_DIRECT_JUMP(l) goto lbl_##l;
501*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBL(l) lbl_##l
502*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_FALLTHROUGH
503*5a6e8488SAndroid Build Coastguard Worker 
504*5a6e8488SAndroid Build Coastguard Worker #if BC_C11
505*5a6e8488SAndroid Build Coastguard Worker 
506*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS_SIZE (sizeof(bc_program_inst_lbls) / sizeof(void*))
507*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS_ASSERT                                  \
508*5a6e8488SAndroid Build Coastguard Worker 	_Static_assert(BC_PROG_LBLS_SIZE == BC_INST_INVALID + 1, \
509*5a6e8488SAndroid Build Coastguard Worker 	               "bc_program_inst_lbls[] mismatches the instructions")
510*5a6e8488SAndroid Build Coastguard Worker 
511*5a6e8488SAndroid Build Coastguard Worker #else // BC_C11
512*5a6e8488SAndroid Build Coastguard Worker 
513*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS_ASSERT
514*5a6e8488SAndroid Build Coastguard Worker 
515*5a6e8488SAndroid Build Coastguard Worker #endif // BC_C11
516*5a6e8488SAndroid Build Coastguard Worker 
517*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
518*5a6e8488SAndroid Build Coastguard Worker 
519*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED
520*5a6e8488SAndroid Build Coastguard Worker 
521*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
522*5a6e8488SAndroid Build Coastguard Worker 
523*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS                                    \
524*5a6e8488SAndroid Build Coastguard Worker 	static const void* const bc_program_inst_lbls[] = { \
525*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INC,                              \
526*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DEC,                              \
527*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NEG,                              \
528*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_NOT,                         \
529*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_TRUNC,                            \
530*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POWER,                            \
531*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MULTIPLY,                         \
532*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVIDE,                           \
533*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODULUS,                          \
534*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PLUS,                             \
535*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MINUS,                            \
536*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PLACES,                           \
537*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LSHIFT,                           \
538*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RSHIFT,                           \
539*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_EQ,                           \
540*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LE,                           \
541*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GE,                           \
542*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_NE,                           \
543*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LT,                           \
544*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GT,                           \
545*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_OR,                          \
546*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_AND,                         \
547*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_POWER,                     \
548*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MULTIPLY,                  \
549*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_DIVIDE,                    \
550*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MODULUS,                   \
551*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLUS,                      \
552*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MINUS,                     \
553*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLACES,                    \
554*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_LSHIFT,                    \
555*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_RSHIFT,                    \
556*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN,                           \
557*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_POWER_NO_VAL,              \
558*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MULTIPLY_NO_VAL,           \
559*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_DIVIDE_NO_VAL,             \
560*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MODULUS_NO_VAL,            \
561*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLUS_NO_VAL,               \
562*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MINUS_NO_VAL,              \
563*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLACES_NO_VAL,             \
564*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_LSHIFT_NO_VAL,             \
565*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_RSHIFT_NO_VAL,             \
566*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_NO_VAL,                    \
567*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NUM,                              \
568*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_VAR,                              \
569*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY_ELEM,                       \
570*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY,                            \
571*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ZERO,                             \
572*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ONE,                              \
573*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LAST,                             \
574*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IBASE,                            \
575*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_OBASE,                            \
576*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE,                            \
577*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SEED,                             \
578*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LENGTH,                           \
579*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE_FUNC,                       \
580*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SQRT,                             \
581*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ABS,                              \
582*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_NUMBER,                        \
583*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_STRING,                        \
584*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IRAND,                            \
585*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASCIIFY,                          \
586*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_READ,                             \
587*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RAND,                             \
588*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXIBASE,                         \
589*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXOBASE,                         \
590*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXSCALE,                         \
591*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXRAND,                          \
592*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LINE_LENGTH,                      \
593*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_GLOBAL_STACKS,                    \
594*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LEADING_ZERO,                     \
595*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT,                            \
596*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_POP,                        \
597*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_STR,                              \
598*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STR,                        \
599*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_JUMP,                             \
600*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_JUMP_ZERO,                        \
601*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_CALL,                             \
602*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET,                              \
603*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET0,                             \
604*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET_VOID,                         \
605*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_HALT,                             \
606*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP,                              \
607*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SWAP,                             \
608*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODEXP,                           \
609*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVMOD,                           \
610*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STREAM,                     \
611*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXTENDED_REGISTERS,               \
612*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP_EXEC,                         \
613*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXECUTE,                          \
614*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXEC_COND,                        \
615*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STACK,                      \
616*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_CLEAR_STACK,                      \
617*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REG_STACK_LEN,                    \
618*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_STACK_LEN,                        \
619*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DUPLICATE,                        \
620*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LOAD,                             \
621*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PUSH_VAR,                         \
622*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PUSH_TO_VAR,                      \
623*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_QUIT,                             \
624*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NQUIT,                            \
625*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXEC_STACK_LEN,                   \
626*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INVALID,                          \
627*5a6e8488SAndroid Build Coastguard Worker 	}
628*5a6e8488SAndroid Build Coastguard Worker 
629*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_EXTRA_MATH
630*5a6e8488SAndroid Build Coastguard Worker 
631*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS                                    \
632*5a6e8488SAndroid Build Coastguard Worker 	static const void* const bc_program_inst_lbls[] = { \
633*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INC,                              \
634*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DEC,                              \
635*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NEG,                              \
636*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_NOT,                         \
637*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POWER,                            \
638*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MULTIPLY,                         \
639*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVIDE,                           \
640*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODULUS,                          \
641*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PLUS,                             \
642*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MINUS,                            \
643*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_EQ,                           \
644*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LE,                           \
645*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GE,                           \
646*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_NE,                           \
647*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LT,                           \
648*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GT,                           \
649*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_OR,                          \
650*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_AND,                         \
651*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_POWER,                     \
652*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MULTIPLY,                  \
653*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_DIVIDE,                    \
654*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MODULUS,                   \
655*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLUS,                      \
656*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MINUS,                     \
657*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN,                           \
658*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_POWER_NO_VAL,              \
659*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MULTIPLY_NO_VAL,           \
660*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_DIVIDE_NO_VAL,             \
661*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MODULUS_NO_VAL,            \
662*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLUS_NO_VAL,               \
663*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MINUS_NO_VAL,              \
664*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_NO_VAL,                    \
665*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NUM,                              \
666*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_VAR,                              \
667*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY_ELEM,                       \
668*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY,                            \
669*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ZERO,                             \
670*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ONE,                              \
671*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LAST,                             \
672*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IBASE,                            \
673*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_OBASE,                            \
674*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE,                            \
675*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LENGTH,                           \
676*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE_FUNC,                       \
677*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SQRT,                             \
678*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ABS,                              \
679*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_NUMBER,                        \
680*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_STRING,                        \
681*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASCIIFY,                          \
682*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_READ,                             \
683*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXIBASE,                         \
684*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXOBASE,                         \
685*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXSCALE,                         \
686*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LINE_LENGTH,                      \
687*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_GLOBAL_STACKS,                    \
688*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LEADING_ZERO,                     \
689*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT,                            \
690*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_POP,                        \
691*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_STR,                              \
692*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STR,                        \
693*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_JUMP,                             \
694*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_JUMP_ZERO,                        \
695*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_CALL,                             \
696*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET,                              \
697*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET0,                             \
698*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET_VOID,                         \
699*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_HALT,                             \
700*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP,                              \
701*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SWAP,                             \
702*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODEXP,                           \
703*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVMOD,                           \
704*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STREAM,                     \
705*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXTENDED_REGISTERS,               \
706*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP_EXEC,                         \
707*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXECUTE,                          \
708*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXEC_COND,                        \
709*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STACK,                      \
710*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_CLEAR_STACK,                      \
711*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REG_STACK_LEN,                    \
712*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_STACK_LEN,                        \
713*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DUPLICATE,                        \
714*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LOAD,                             \
715*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PUSH_VAR,                         \
716*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PUSH_TO_VAR,                      \
717*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_QUIT,                             \
718*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NQUIT,                            \
719*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXEC_STACK_LEN,                   \
720*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INVALID,                          \
721*5a6e8488SAndroid Build Coastguard Worker 	}
722*5a6e8488SAndroid Build Coastguard Worker 
723*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
724*5a6e8488SAndroid Build Coastguard Worker 
725*5a6e8488SAndroid Build Coastguard Worker #else // DC_ENABLED
726*5a6e8488SAndroid Build Coastguard Worker 
727*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
728*5a6e8488SAndroid Build Coastguard Worker 
729*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS                                    \
730*5a6e8488SAndroid Build Coastguard Worker 	static const void* const bc_program_inst_lbls[] = { \
731*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INC,                              \
732*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DEC,                              \
733*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NEG,                              \
734*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_NOT,                         \
735*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_TRUNC,                            \
736*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POWER,                            \
737*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MULTIPLY,                         \
738*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVIDE,                           \
739*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODULUS,                          \
740*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PLUS,                             \
741*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MINUS,                            \
742*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PLACES,                           \
743*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LSHIFT,                           \
744*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RSHIFT,                           \
745*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_EQ,                           \
746*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LE,                           \
747*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GE,                           \
748*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_NE,                           \
749*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LT,                           \
750*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GT,                           \
751*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_OR,                          \
752*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_AND,                         \
753*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_POWER,                     \
754*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MULTIPLY,                  \
755*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_DIVIDE,                    \
756*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MODULUS,                   \
757*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLUS,                      \
758*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MINUS,                     \
759*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLACES,                    \
760*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_LSHIFT,                    \
761*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_RSHIFT,                    \
762*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN,                           \
763*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_POWER_NO_VAL,              \
764*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MULTIPLY_NO_VAL,           \
765*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_DIVIDE_NO_VAL,             \
766*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MODULUS_NO_VAL,            \
767*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLUS_NO_VAL,               \
768*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MINUS_NO_VAL,              \
769*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLACES_NO_VAL,             \
770*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_LSHIFT_NO_VAL,             \
771*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_RSHIFT_NO_VAL,             \
772*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_NO_VAL,                    \
773*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NUM,                              \
774*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_VAR,                              \
775*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY_ELEM,                       \
776*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY,                            \
777*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ZERO,                             \
778*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ONE,                              \
779*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LAST,                             \
780*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IBASE,                            \
781*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_OBASE,                            \
782*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE,                            \
783*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SEED,                             \
784*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LENGTH,                           \
785*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE_FUNC,                       \
786*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SQRT,                             \
787*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ABS,                              \
788*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_NUMBER,                        \
789*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_STRING,                        \
790*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IRAND,                            \
791*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASCIIFY,                          \
792*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_READ,                             \
793*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RAND,                             \
794*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXIBASE,                         \
795*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXOBASE,                         \
796*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXSCALE,                         \
797*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXRAND,                          \
798*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LINE_LENGTH,                      \
799*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_GLOBAL_STACKS,                    \
800*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LEADING_ZERO,                     \
801*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT,                            \
802*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_POP,                        \
803*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_STR,                              \
804*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STR,                        \
805*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_JUMP,                             \
806*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_JUMP_ZERO,                        \
807*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_CALL,                             \
808*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET,                              \
809*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET0,                             \
810*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET_VOID,                         \
811*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_HALT,                             \
812*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP,                              \
813*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SWAP,                             \
814*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODEXP,                           \
815*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVMOD,                           \
816*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STREAM,                     \
817*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INVALID,                          \
818*5a6e8488SAndroid Build Coastguard Worker 	}
819*5a6e8488SAndroid Build Coastguard Worker 
820*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_EXTRA_MATH
821*5a6e8488SAndroid Build Coastguard Worker 
822*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS                                    \
823*5a6e8488SAndroid Build Coastguard Worker 	static const void* const bc_program_inst_lbls[] = { \
824*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INC,                              \
825*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DEC,                              \
826*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NEG,                              \
827*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_NOT,                         \
828*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POWER,                            \
829*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MULTIPLY,                         \
830*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVIDE,                           \
831*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODULUS,                          \
832*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PLUS,                             \
833*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MINUS,                            \
834*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_EQ,                           \
835*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LE,                           \
836*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GE,                           \
837*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_NE,                           \
838*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LT,                           \
839*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GT,                           \
840*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_OR,                          \
841*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_AND,                         \
842*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_POWER,                     \
843*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MULTIPLY,                  \
844*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_DIVIDE,                    \
845*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MODULUS,                   \
846*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLUS,                      \
847*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MINUS,                     \
848*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN,                           \
849*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_POWER_NO_VAL,              \
850*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MULTIPLY_NO_VAL,           \
851*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_DIVIDE_NO_VAL,             \
852*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MODULUS_NO_VAL,            \
853*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_PLUS_NO_VAL,               \
854*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_MINUS_NO_VAL,              \
855*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_NO_VAL,                    \
856*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NUM,                              \
857*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_VAR,                              \
858*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY_ELEM,                       \
859*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY,                            \
860*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ZERO,                             \
861*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ONE,                              \
862*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LAST,                             \
863*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IBASE,                            \
864*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_OBASE,                            \
865*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE,                            \
866*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LENGTH,                           \
867*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE_FUNC,                       \
868*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SQRT,                             \
869*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ABS,                              \
870*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_NUMBER,                        \
871*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_STRING,                        \
872*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASCIIFY,                          \
873*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_READ,                             \
874*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXIBASE,                         \
875*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXOBASE,                         \
876*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXSCALE,                         \
877*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LINE_LENGTH,                      \
878*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_GLOBAL_STACKS,                    \
879*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LEADING_ZERO,                     \
880*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT,                            \
881*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_POP,                        \
882*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_STR,                              \
883*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STR,                        \
884*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_JUMP,                             \
885*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_JUMP_ZERO,                        \
886*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_CALL,                             \
887*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET,                              \
888*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET0,                             \
889*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RET_VOID,                         \
890*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_HALT,                             \
891*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP,                              \
892*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SWAP,                             \
893*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODEXP,                           \
894*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVMOD,                           \
895*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STREAM,                     \
896*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INVALID,                          \
897*5a6e8488SAndroid Build Coastguard Worker 	}
898*5a6e8488SAndroid Build Coastguard Worker 
899*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
900*5a6e8488SAndroid Build Coastguard Worker 
901*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED
902*5a6e8488SAndroid Build Coastguard Worker 
903*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLED
904*5a6e8488SAndroid Build Coastguard Worker 
905*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
906*5a6e8488SAndroid Build Coastguard Worker 
907*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS                                                   \
908*5a6e8488SAndroid Build Coastguard Worker 	static const void* const bc_program_inst_lbls[] = {                \
909*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NEG,           &&lbl_BC_INST_BOOL_NOT,           \
910*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_TRUNC,         &&lbl_BC_INST_POWER,              \
911*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MULTIPLY,      &&lbl_BC_INST_DIVIDE,             \
912*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODULUS,       &&lbl_BC_INST_PLUS,               \
913*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MINUS,         &&lbl_BC_INST_PLACES,             \
914*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LSHIFT,        &&lbl_BC_INST_RSHIFT,             \
915*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_EQ,        &&lbl_BC_INST_REL_LE,             \
916*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GE,        &&lbl_BC_INST_REL_NE,             \
917*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LT,        &&lbl_BC_INST_REL_GT,             \
918*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_OR,       &&lbl_BC_INST_BOOL_AND,           \
919*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_NO_VAL, &&lbl_BC_INST_NUM,                \
920*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_VAR,           &&lbl_BC_INST_ARRAY_ELEM,         \
921*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY,         &&lbl_BC_INST_ZERO,               \
922*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ONE,           &&lbl_BC_INST_IBASE,              \
923*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_OBASE,         &&lbl_BC_INST_SCALE,              \
924*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SEED,          &&lbl_BC_INST_LENGTH,             \
925*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SCALE_FUNC,    &&lbl_BC_INST_SQRT,               \
926*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ABS,           &&lbl_BC_INST_IS_NUMBER,          \
927*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_STRING,     &&lbl_BC_INST_IRAND,              \
928*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASCIIFY,       &&lbl_BC_INST_READ,               \
929*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_RAND,          &&lbl_BC_INST_MAXIBASE,           \
930*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXOBASE,      &&lbl_BC_INST_MAXSCALE,           \
931*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXRAND,       &&lbl_BC_INST_LINE_LENGTH,        \
932*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LEADING_ZERO,  &&lbl_BC_INST_PRINT,              \
933*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_POP,     &&lbl_BC_INST_STR,                \
934*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP,           &&lbl_BC_INST_SWAP,               \
935*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODEXP,        &&lbl_BC_INST_DIVMOD,             \
936*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STREAM,  &&lbl_BC_INST_EXTENDED_REGISTERS, \
937*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP_EXEC,      &&lbl_BC_INST_EXECUTE,            \
938*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXEC_COND,     &&lbl_BC_INST_PRINT_STACK,        \
939*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_CLEAR_STACK,   &&lbl_BC_INST_REG_STACK_LEN,      \
940*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_STACK_LEN,     &&lbl_BC_INST_DUPLICATE,          \
941*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LOAD,          &&lbl_BC_INST_PUSH_VAR,           \
942*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PUSH_TO_VAR,   &&lbl_BC_INST_QUIT,               \
943*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NQUIT,         &&lbl_BC_INST_EXEC_STACK_LEN,     \
944*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INVALID,                                         \
945*5a6e8488SAndroid Build Coastguard Worker 	}
946*5a6e8488SAndroid Build Coastguard Worker 
947*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_EXTRA_MATH
948*5a6e8488SAndroid Build Coastguard Worker 
949*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS                                                   \
950*5a6e8488SAndroid Build Coastguard Worker 	static const void* const bc_program_inst_lbls[] = {                \
951*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NEG,           &&lbl_BC_INST_BOOL_NOT,           \
952*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POWER,         &&lbl_BC_INST_MULTIPLY,           \
953*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_DIVIDE,        &&lbl_BC_INST_MODULUS,            \
954*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PLUS,          &&lbl_BC_INST_MINUS,              \
955*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_EQ,        &&lbl_BC_INST_REL_LE,             \
956*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_GE,        &&lbl_BC_INST_REL_NE,             \
957*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_REL_LT,        &&lbl_BC_INST_REL_GT,             \
958*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_BOOL_OR,       &&lbl_BC_INST_BOOL_AND,           \
959*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASSIGN_NO_VAL, &&lbl_BC_INST_NUM,                \
960*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_VAR,           &&lbl_BC_INST_ARRAY_ELEM,         \
961*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ARRAY,         &&lbl_BC_INST_ZERO,               \
962*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ONE,           &&lbl_BC_INST_IBASE,              \
963*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_OBASE,         &&lbl_BC_INST_SCALE,              \
964*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LENGTH,        &&lbl_BC_INST_SCALE_FUNC,         \
965*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_SQRT,          &&lbl_BC_INST_ABS,                \
966*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_IS_NUMBER,     &&lbl_BC_INST_IS_STRING,          \
967*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_ASCIIFY,       &&lbl_BC_INST_READ,               \
968*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXIBASE,      &&lbl_BC_INST_MAXOBASE,           \
969*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MAXSCALE,      &&lbl_BC_INST_LINE_LENGTH,        \
970*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LEADING_ZERO,  &&lbl_BC_INST_PRINT,              \
971*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_POP,     &&lbl_BC_INST_STR,                \
972*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP,           &&lbl_BC_INST_SWAP,               \
973*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_MODEXP,        &&lbl_BC_INST_DIVMOD,             \
974*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PRINT_STREAM,  &&lbl_BC_INST_EXTENDED_REGISTERS, \
975*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_POP_EXEC,      &&lbl_BC_INST_EXECUTE,            \
976*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_EXEC_COND,     &&lbl_BC_INST_PRINT_STACK,        \
977*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_CLEAR_STACK,   &&lbl_BC_INST_REG_STACK_LEN,      \
978*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_STACK_LEN,     &&lbl_BC_INST_DUPLICATE,          \
979*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_LOAD,          &&lbl_BC_INST_PUSH_VAR,           \
980*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_PUSH_TO_VAR,   &&lbl_BC_INST_QUIT,               \
981*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_NQUIT,         &&lbl_BC_INST_EXEC_STACK_LEN,     \
982*5a6e8488SAndroid Build Coastguard Worker 		&&lbl_BC_INST_INVALID,                                         \
983*5a6e8488SAndroid Build Coastguard Worker 	}
984*5a6e8488SAndroid Build Coastguard Worker 
985*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
986*5a6e8488SAndroid Build Coastguard Worker 
987*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
988*5a6e8488SAndroid Build Coastguard Worker 
989*5a6e8488SAndroid Build Coastguard Worker #else // BC_HAS_COMPUTED_GOTO
990*5a6e8488SAndroid Build Coastguard Worker 
991*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_JUMP(inst, code, ip) break
992*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_DIRECT_JUMP(l)
993*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBL(l) case l
994*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_FALLTHROUGH BC_FALLTHROUGH
995*5a6e8488SAndroid Build Coastguard Worker 
996*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS
997*5a6e8488SAndroid Build Coastguard Worker 
998*5a6e8488SAndroid Build Coastguard Worker #endif // BC_HAS_COMPUTED_GOTO
999*5a6e8488SAndroid Build Coastguard Worker 
1000*5a6e8488SAndroid Build Coastguard Worker #endif // BC_PROGRAM_H
1001