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 /* Read a boolean expression */
60 BoolExpr (hie0, &Expr);
62 /* Check for a constant expression */
63 if (ED_IsConstAbs (&Expr)) {
65 /* Result is constant, so we know the outcome */
66 Result = (Expr.Val != 0);
69 if (!Invert && Expr.Val == 0) {
71 Warning ("Unreachable code");
72 } else if (Invert && Expr.Val != 0) {
78 /* Result is unknown */
79 Result = TESTEXPR_UNKNOWN;
81 /* If the expr hasn't set condition codes, set the force-test flag */
82 if ((Expr.Test & E_CC) == 0) {
83 Expr.Test |= E_FORCETEST;
86 /* Load the value into the primary register */
87 ExprLoad (CF_FORCECHAR, &Expr);
89 /* Generate the jump */
91 g_truejump (CF_NONE, Label);
93 g_falsejump (CF_NONE, Label);
97 /* Return the result */
103 unsigned TestInParens (unsigned Label, int Invert)
104 /* Evaluate a boolean test expression in parenthesis and jump depending on
105 * the result of the test * and on Invert. The function returns one of the
106 * TESTEXPR_xx codes defined above. If the jump is always true, a warning is
112 /* Eat the parenthesis */
116 Result = Test (Label, Invert);
118 /* Check for the closing brace */
121 /* Return the result of the expression */