1 /*****************************************************************************/
5 /* Test an expression and jump */
9 /* (C) 2004 Ullrich von Bassewitz */
11 /* D-70794 Filderstadt */
12 /* EMail: uz@cc65.org */
15 /* This software is provided 'as-is', without any expressed or implied */
16 /* warranty. In no event will the authors be held liable for any damages */
17 /* arising from the use of this software. */
19 /* Permission is granted to anyone to use this software for any purpose, */
20 /* including commercial applications, and to alter it and redistribute it */
21 /* freely, subject to the following restrictions: */
23 /* 1. The origin of this software must not be misrepresented; you must not */
24 /* claim that you wrote the original software. If you use this software */
25 /* in a product, an acknowledgment in the product documentation would be */
26 /* appreciated but is not required. */
27 /* 2. Altered source versions must be plainly marked as such, and must not */
28 /* be misrepresented as being the original software. */
29 /* 3. This notice may not be removed or altered from any source */
32 /*****************************************************************************/
44 /*****************************************************************************/
46 /*****************************************************************************/
50 unsigned Test (unsigned Label, int Invert)
51 /* Evaluate a boolean test expression and jump depending on the result of
52 * the test and on Invert. The function returns one of the TESTEXPR_xx codes
53 * defined above. If the jump is always true, a warning is output.
59 /* Evaluate the expression */
60 expr (hie0, InitExprDesc (&lval));
62 /* Check for a boolean expression */
63 CheckBoolExpr (&lval);
65 /* Check for a constant expression */
66 if (ED_IsRVal (&lval) && lval.Flags == E_MCONST) {
68 /* Result is constant, so we know the outcome */
69 Result = (lval.ConstVal != 0);
72 if (!Invert && lval.ConstVal == 0) {
74 Warning ("Unreachable code");
75 } else if (Invert && lval.ConstVal != 0) {
81 /* Result is unknown */
82 Result = TESTEXPR_UNKNOWN;
84 /* If the expr hasn't set condition codes, set the force-test flag */
85 if ((lval.Test & E_CC) == 0) {
86 lval.Test |= E_FORCETEST;
89 /* Load the value into the primary register */
90 ExprLoad (CF_FORCECHAR, &lval);
92 /* Generate the jump */
94 g_truejump (CF_NONE, Label);
96 g_falsejump (CF_NONE, Label);
100 /* Return the result */
106 unsigned TestInParens (unsigned Label, int Invert)
107 /* Evaluate a boolean test expression in parenthesis and jump depending on
108 * the result of the test * and on Invert. The function returns one of the
109 * TESTEXPR_xx codes defined above. If the jump is always true, a warning is
115 /* Eat the parenthesis */
119 Result = Test (Label, Invert);
121 /* Check for the closing brace */
124 /* Return the result of the expression */