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 /*****************************************************************************/
46 /*****************************************************************************/
48 /*****************************************************************************/
52 unsigned Test (unsigned Label, int Invert)
53 /* Evaluate a boolean test expression and jump depending on the result of
54 * the test and on Invert. The function returns one of the TESTEXPR_xx codes
55 * defined above. If the jump is always true, a warning is output.
61 /* Read a boolean expression */
62 BoolExpr (hie0, &Expr);
64 /* Check for a constant expression */
65 if (ED_IsConstAbs (&Expr)) {
67 /* Result is constant, so we know the outcome */
68 Result = (Expr.IVal != 0);
71 if (!Invert && Expr.IVal == 0) {
73 Warning ("Unreachable code");
74 } else if (Invert && Expr.IVal != 0) {
80 /* Result is unknown */
81 Result = TESTEXPR_UNKNOWN;
83 /* If the expr hasn't set condition codes, set the force-test flag */
84 if (!ED_IsTested (&Expr)) {
85 ED_MarkForTest (&Expr);
88 /* Load the value into the primary register */
89 LoadExpr (CF_FORCECHAR, &Expr);
91 /* Generate the jump */
93 g_truejump (CF_NONE, Label);
95 g_falsejump (CF_NONE, Label);
99 /* Return the result */
105 unsigned TestInParens (unsigned Label, int Invert)
106 /* Evaluate a boolean test expression in parenthesis and jump depending on
107 * the result of the test * and on Invert. The function returns one of the
108 * TESTEXPR_xx codes defined above. If the jump is always true, a warning is
114 /* Eat the parenthesis */
118 Result = Test (Label, Invert);
120 /* Check for the closing brace */
123 /* Return the result of the expression */