}
}
+void gen_less0(struct treenode *bnode)
+{
+ printf("\t//gen_less0\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);
+}
+
+void gen_less1(struct treenode *bnode)
+{
+ printf("\t//gen_less1\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);
+}
+
+void gen_less2(struct treenode *bnode)
+{
+ printf("\t//gen_less2\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);
+}
+
%}
%start begin
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);
+
+
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_NUM # 0 #
%%