#define KID_REG(A) bnode->kids[A]->reg
#define KIDKID_REG(A,B) bnode->kids[A]->kids[B]->reg
+#define KIDKIDKID_REG(A,B,C) bnode->kids[A]->kids[B]->kids[C]->reg
#define KID_VAL(A) bnode->kids[A]->val
#define KIDKID_VAL(A,B) bnode->kids[A]->kids[B]->val
+#define KIDKIDKID_VAL(A,B,C) bnode->kids[A]->kids[B]->kids[C]->val
#define BN_REG bnode->reg
#define BN_VAL bnode->val
* register verwendet werden */
#define KIDREG2PARM(A) if(bnode->kids[A]->param_index > -1) { bnode->kids[A]->reg = param_reg(bnode->kids[A]->param_index); }
#define KIDKIDREG2PARM(A,B) if(bnode->kids[A]->kids[B]->param_index > -1) { bnode->kids[A]->kids[B]->reg = param_reg(bnode->kids[A]->kids[B]->param_index); }
+#define KIDKIDKIDREG2PARM(A,B,C) if(bnode->kids[A]->kids[B]->kids[C]->param_index > -1) { bnode->kids[A]->kids[B]->kids[C]->reg = param_reg(bnode->kids[A]->kids[B]->kids[C]->param_index); }
#define KIDREG2ID(A) if(bnode->kids[A]->op == O_ID && bnode->kids[A]->param_index > -1) move(param_reg(bnode->kids[A]->param_index), bnode->kids[A]->reg);
}
}
-void gen_eqless(struct treenode *bnode, char *op, short e0, short e1)
+void gen_eqless(struct treenode *bnode, char *op, short e0, short e1, short deep)
{
- printf("\t//gen_eqless_%i%i\n", e0, e1);
+ printf("\t//gen_eqless_%i%i @ %i\n", e0, e1, deep);
if(e0) { KIDREG2PARM(0); } else { KIDREG2ID(0); }
if(e1) { KIDREG2PARM(1); } else { KIDREG2ID(1); }
if(e0 && e1) {
printf("\tcmp %%%s, %%%s\n", KID_REG(1), KID_REG(0));
} else if(e0 && !e1) {
- printf("\tcmp $%d, %%%s\n", KID_VAL(1), KID_REG(0));
+ if (deep == 0) {
+ printf("\tcmp $%d, %%%s\n", KID_VAL(1), KID_REG(0));
+ } else if (deep == 1) {
+ KIDKIDREG2PARM(0,0);
+ printf("\tcmp $%d, %%%s\n", KID_VAL(1), KIDKID_REG(0,0));
+ } else if (deep == 2) {
+ KIDKIDKIDREG2PARM(0,0,0);
+ printf("\tcmp $%d, %%%s\n", KID_VAL(1), KIDKIDKID_REG(0,0,0));
+ }
} else if(!e0 && e1) {
if(strcmp("e", op) == 0) {
printf("\tcmp $%d, %%%s\n", KID_VAL(0), KID_REG(1));
expr: O_OR(expr,expr) # 1 # gen_e_eno(bnode, "orq");
expr: O_OR(expr,imm) # 2 # gen_e_imm(bnode, "orq");
-expr: O_LESS(expr,expr) # 3 # gen_eqless(bnode, "l", 1, 1);
-expr: O_LESS(expr,imm) # 3 # gen_eqless(bnode, "l", 1, 0);
-expr: O_LESS(imm,expr) # 3 # gen_eqless(bnode, "l", 0, 1);
+expr: O_LESS(expr,expr) # 3 # gen_eqless(bnode, "l", 1, 1, 0);
+expr: O_LESS(expr,imm) # 3 # gen_eqless(bnode, "l", 1, 0, 0);
+expr: O_LESS(imm,expr) # 3 # gen_eqless(bnode, "l", 0, 1, 0);
-expr: O_EQ(expr,expr) # 3 # gen_eqless(bnode, "e", 1, 1);
-expr: O_EQ(expr,imm) # 3 # gen_eqless(bnode, "e", 1, 0);
-expr: O_EQ(imm,expr) # 3 # gen_eqless(bnode, "e", 0, 1);
-expr: O_EQ(nexpr,O_NULL) # 0 #
-expr: O_EQ(expr,O_NULL) # 3 # gen_eqless(bnode, "e", 1, 0);
+expr: O_EQ(expr,expr) # 3 # gen_eqless(bnode, "e", 1, 1, 0);
+expr: O_EQ(expr,imm) # 3 # gen_eqless(bnode, "e", 1, 0, 0);
+expr: O_EQ(imm,expr) # 3 # gen_eqless(bnode, "e", 0, 1, 0);
+expr: O_EQ(expr,O_NULL) # 3 # gen_eqless(bnode, "e", 1, 0, 0);
+expr: O_EQ(O_EQ(expr,O_NULL),O_NULL) # 3 # gen_eqless(bnode, "ne", 1, 0, 1);
+expr: O_EQ(O_EQ(O_EQ(expr,O_NULL),O_NULL),O_NULL) # 3 # gen_eqless(bnode, "e", 1, 0, 2);
expr: O_FIELD(expr) # 1 # printf("\t//field(expr)\n"); KIDREG2PARM(0); printf("\tmovq %d(%%%s), %%%s\n", bnode->soffset * 8, KID_REG(0), BN_REG);
expr: O_FIELD(imm) # 1 # printf("\t//field(imm)\n"); printf("\tmovq %d, %%%s\n", KID_VAL(0) + (bnode->soffset * 8), BN_REG);
-nexpr: O_EQ(expr,O_NULL) # 0 # gen_eqless(bnode, "ne", 1, 0);
-
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);