> +"fLSBNEW(P"{LOWER_PRE}"N)" { yylval->rvalue.type = PREDICATE;
> +                           yylval->rvalue.pre.id = yytext[9];
> +                           yylval->rvalue.bit_width = 32;
> +                           yylval->rvalue.is_dotnew = true;
> +                           return PRE; }
> +"fLSBNEW0"               { yylval->rvalue.type = PREDICATE;
> +                           yylval->rvalue.pre.id = '0';
> +                           yylval->rvalue.bit_width = 32;
> +                           yylval->rvalue.is_dotnew = true;
> +                           return PRE; }
> +"fLSBNEW1"               { yylval->rvalue.type = PREDICATE;
> +                           yylval->rvalue.pre.id = '1';
> +                           yylval->rvalue.bit_width = 32;
> +                           yylval->rvalue.is_dotnew = true;
> +                           return PRE; }
> +"fLSBNEW1NOT"            { yylval->rvalue.type = PREDICATE;
> +                           yylval->rvalue.pre.id = '1';
> +                           yylval->rvalue.bit_width = 32;
> +                           yylval->rvalue.is_dotnew = true;
> +                           return PRE; }

These represent the least significant bit of the operand.  Perhaps you should set the bit_width to 1?  Or do tcg_gen_andi_tl(..., 1)?

What I ended up doing is reworking how LSB* are handled.
Now there's a special token `LSBNEW` that's implemented as a `tcg_gen_andi` in the parser, and it's used only for `fLSBNEW`.
The other cases are expanded in the preprocessing part like this:

/* Least significant bit operations */
#define fLSBNEW0 fLSBNEW(P0N)
#define fLSBNEW1 fLSBNEW(P1N)
#define fLSBOLDNOT(VAL) fGETBIT(0, ~VAL)
#define fLSBNEWNOT(PRED) (fLSBNEW(~PRED))
#define fLSBNEW0NOT fLSBNEW(~P0N)
#define fLSBNEW1NOT fLSBNEW(~P1N)

Let me know what you think.

~Paolo