+void gen_e_eno(struct treenode *bnode, char *instr)
+{
+ printf("\t//gen_e_eno(%s)\n", instr);
+ KIDREG2ID(0);
+ KIDREG2PARM(1);
+ printf("\t%s %%%s, %%%s\n", instr, KID_REG(1), KID_REG(0));
+}
+
+void gen_id_eno(struct treenode *bnode)
+{
+ printf("\t//gen_id_eno\n");
+ KIDKIDREG2PARM(1,0);
+ printf("\taddq %%%s, %%%s\n", KIDKID_REG(1,0), KIDKID_REG(1,1));
+ printf("\tsubq %%%s, %%%s\n", KIDKID_REG(1,1), BN_REG);
+}
+
+void gen_e_field(struct treenode *bnode, char *instr)
+{
+ printf("\t//gen_e_field(%s)\n", instr);
+ KIDREG2ID(0);
+ KIDKIDREG2PARM(1,0);
+ printf("\t%s %d(%%%s), %%%s\n", instr, bnode->kids[1]->soffset * 8, KIDKID_REG(1,0), KID_REG(0));
+}
+
+void gen_field_imm(struct treenode *bnode)
+{
+ printf("\t//gen_field_imm\n");
+ KIDKIDREG2PARM(0,0);
+ KIDREG2ID(1);
+
+ if(KID_VAL(1) == 1 && strcmp(KID_REG(0), BN_REG) == 0) {
+ printf("\t//multiplikation mit 1 wegoptimiert\n");
+ } else {
+ printf("\timulq $%d, %d(%%%s), %%%s\n", KID_VAL(1), bnode->kids[0]->soffset * 8, KIDKID_REG(0, 0), BN_REG);
+ }
+}
+
+void gen_e_imm(struct treenode *bnode, char *instr)
+{
+ printf("\t//gen_e_imm(%s)\n", instr);
+ KIDREG2PARM(0);
+ KIDREG2ID(1);
+ /* man kann sich ein move der konstante bei der multiplikation ersparen */
+ if(strcmp(instr, "imulq") == 0) {
+ if(KID_VAL(1) == 1 && strcmp(KID_REG(0), BN_REG) == 0) {
+ printf("\t//multiplikation mit 1 wegoptimiert\n");
+ } else {
+ printf("\timulq $%d, %%%s, %%%s\n", KID_VAL(1), KID_REG(0), BN_REG);
+ }
+ } else {
+ if(strcmp(instr, "subq") == 0 && KID_VAL(1) == 0) {
+ printf("\t//subtraktion mit 0 wegoptimiert\n");
+ move(KID_REG(0), BN_REG);
+ } else {
+ move(KID_REG(0), BN_REG);
+ printf("\t%s $%d, %%%s\n", instr, KID_VAL(1), BN_REG);
+ }
+ }
+}
+
+void gen_imm_field(struct treenode *bnode)
+{
+ printf("\t//gen_imm_field\n");
+ KIDREG2ID(0);
+ KIDKIDREG2PARM(1, 0);
+
+ moveimm(KID_VAL(0), BN_REG);
+ printf("\tsubq %d(%%%s), %%%s\n", bnode->kids[1]->soffset * 8, KIDKID_REG(1, 0), BN_REG);
+}
+
+void gen_imm_eno(struct treenode *bnode, char *instr)
+{
+ printf("\t//gen_imm_eno(%s)\n", instr);
+ KIDREG2ID(0);
+ KIDREG2PARM(1);
+ /* man kann sich ein move der konstante bei der multiplikation ersparen */
+ if(strcmp(instr, "imulq") == 0) {
+ if(KID_VAL(0) == 1 && strcmp(KID_REG(1), BN_REG) == 0) {
+ printf("\t//multiplikation mit 1 wegoptimiert\n");
+ } else {
+ printf("\timulq $%d, %%%s, %%%s\n", KID_VAL(0), KID_REG(1), BN_REG);
+ }
+ } else { /* addq */
+ printf("\taddq $%d, %%%s\n", KID_VAL(0), BN_REG);
+ }
+}
+
+void gen_eqless(struct treenode *bnode, char *op, short e0, short e1, short deep)
+{
+ 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) {
+ if(deep) {
+ KIDKIDREG2PARM(1,0);
+ printf("\tcmp %d(%%%s), %%%s\n", bnode->kids[1]->soffset *8, KIDKID_REG(1,0), KID_REG(0));
+ } else {
+ printf("\tcmp %%%s, %%%s\n", KID_REG(1), KID_REG(0));
+ }
+ } else if(e0 && !e1) {
+ 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) {
+ printf("\tcmp $%d, %%%s\n", KID_VAL(0), KID_REG(1));
+ }
+ printf("\tset%s %%%s\n", op, reg_64to8l(BN_REG));
+ printf("\tand $1, %%%s\n", BN_REG);
+}
+
+void gen_lea(struct treenode *bnode, short e)
+{
+ printf("\t//gen_lea(e: %i)\n", e);
+ KIDREG2PARM(0);
+ if(e) {
+ KIDKIDREG2PARM(1,0);
+ printf("\tlea (%%%s,%%%s,%d), %%%s\n", KID_REG(0), KIDKID_REG(1,0), -1 * KIDKID_VAL(1,1), BN_REG);
+ } else {
+ KIDKIDREG2PARM(1,1);
+ printf("\tlea (%%%s,%%%s,%d), %%%s\n", KID_REG(0), KIDKID_REG(1,1), -1 * KIDKID_VAL(1,0), BN_REG);
+ }
+}
+
+void gen_subspecial(struct treenode *bnode, short e)
+{
+ /* tritt z.b. bei snafu_05.0 auf */
+ printf("\t//gen_subspecial(%i)\n", e);
+ KIDREG2ID(0);
+ KIDKIDREG2PARM(1,0);
+
+ if(e) {
+ printf("\tsubq $%d, %%%s\n", KIDKID_VAL(1,0), BN_REG);
+ } else {
+ printf("\tsubq %%%s, %%%s\n", KIDKID_REG(1,0), BN_REG);
+ }
+ if(e) KIDKIDREG2PARM(1,1);
+ printf("\taddq %%%s, %%%s\n", KIDKID_REG(1,1), BN_REG);
+}
+