}
}
-void gen_less0(struct treenode *bnode)
+void gen_eqless_footer(struct treenode *bnode, char *op)
{
- printf("\t//gen_less0\n");
+ moveimm(1, BN_REG);
+ printf("\tcmov%s %%%2$s, %%%2$s\n", op, BN_REG);
+ moveimm(0, KID_REG(1));
+ printf("\tcmovn%s %%%s, %%%s\n", op, KID_REG(1), BN_REG);
+}
+
+void gen_eqless_ee(struct treenode *bnode, char *op)
+{
+ printf("\t//gen_eqless_ee\n");
KIDREG2PARM(0);
#if 0
/* TODO */
KIDREG2PARM(1)
#endif
printf("\tcmp %%%s, %%%s\n", KID_REG(1), KID_REG(0));
- moveimm(1, BN_REG);
- printf("\tcmovl %%%1$s, %%%1$s\n", BN_REG);
- moveimm(0, KID_REG(1));
- printf("\tcmovnl %%%s, %%%s\n", KID_REG(1), BN_REG);
+
+ gen_eqless_footer(bnode, op);
}
-void gen_less1(struct treenode *bnode)
+void gen_eqless_ei(struct treenode *bnode, char *op)
{
- printf("\t//gen_less1\n");
+ printf("\t//gen_eqless_ei\n");
KIDREG2PARM(0);
#if 0
/* TODO */
KIDREG2PARM(1)
#endif
printf("\tcmp $%li, %%%s\n", KID_VAL(1), KID_REG(0));
- moveimm(1, BN_REG);
- printf("\tcmovl %%%1$s, %%%1$s\n", BN_REG);
- moveimm(0, KID_REG(1));
- printf("\tcmovnl %%%s, %%%s\n", KID_REG(1), BN_REG);
+
+ gen_eqless_footer(bnode, op);
}
-void gen_less2(struct treenode *bnode)
+void gen_eqless_ie(struct treenode *bnode, char *op)
{
- printf("\t//gen_less2\n");
-
+ printf("\t//gen_eqless_ie\n");
moveimm(KID_VAL(0), BN_REG);
printf("\tcmp %%%s, %%%s\n", KID_REG(1), BN_REG);
- moveimm(1, BN_REG);
- printf("\tcmovl %%%1$s, %%%1$s\n", BN_REG);
- moveimm(0, KID_REG(1));
- printf("\tcmovnl %%%s, %%%s\n", KID_REG(1), BN_REG);
+ gen_eqless_footer(bnode, op);
}
%}
expr: O_OR(expr,exprno) # 1 # gen_e_eno(bnode, "orq");
expr: O_OR(expr,imm) # 2 # gen_e_imm(bnode, "orq");
-expr: O_LESS(expr,expr) # 5 # gen_less0(bnode);
-expr: O_LESS(expr,imm) # 5 # gen_less1(bnode);
-expr: O_LESS(imm,expr) # 6 # gen_less2(bnode);
+expr: O_LESS(expr,expr) # 5 # gen_eqless_ee(bnode, "l");
+expr: O_LESS(expr,imm) # 5 # gen_eqless_ei(bnode, "l");
+expr: O_LESS(imm,expr) # 6 # gen_eqless_ie(bnode, "l");
+
+expr: O_EQ(expr,expr) # 5 # gen_eqless_ee(bnode, "e");
+expr: O_EQ(expr,imm) # 5 # gen_eqless_ei(bnode, "e");
+expr: O_EQ(imm,expr) # 6 # gen_eqless_ie(bnode, "e");
exprno: O_ID # 0 # /* brauchen wir nicht 'zwischenlagern', weil nur gelesen wird */
exprno: expr
-imm: O_ADD(imm,imm) # 0 # BN_VAL = KID_VAL(0) + KID_VAL(1);
-imm: O_SUB(imm,imm) # 0 # BN_VAL = KID_VAL(0) - KID_VAL(1);
-imm: O_MUL(imm,imm) # 0 # BN_VAL = KID_VAL(0) * KID_VAL(1);
+imm: O_ADD(imm,imm) # 0 # BN_VAL = KID_VAL(0) + KID_VAL(1);
+imm: O_SUB(imm,imm) # 0 # BN_VAL = KID_VAL(0) - KID_VAL(1);
+imm: O_MUL(imm,imm) # 0 # BN_VAL = KID_VAL(0) * KID_VAL(1);
imm: O_LESS(imm,imm) # 0 # BN_VAL = KID_VAL(0) < KID_VAL(1) ? 1 : 0;
+imm: O_EQ(imm,imm) # 0 # BN_VAL = KID_VAL(0) = KID_VAL(1) ? 1 : 0;
imm: O_NUM # 0 #
%%