/* * Evaluate AND/OR/ER. p1 and p2 are pointers to ti struct. */ static NODE * gcc_andorer(int op, NODE *p1, NODE *p2) { char *n = tistack(); NODE *p, *t1, *t2, *p3; t1 = tempnode(0, p1->n_type, p1->n_df, p1->n_ap); t2 = tempnode(0, p2->n_type, p2->n_df, p2->n_ap); p1 = buildtree(ASSIGN, ccopy(t1), p1); p2 = buildtree(ASSIGN, ccopy(t2), p2); p = buildtree(COMOP, p1, p2); p3 = buildtree(ADDROF, eve(bdty(NAME, n)), NIL); p1 = buildtree(ASSIGN, structref(ccopy(p3), STREF, hiti), buildtree(op, structref(ccopy(t1), STREF, hiti), structref(ccopy(t2), STREF, hiti))); p = buildtree(COMOP, p, p1); p1 = buildtree(ASSIGN, structref(ccopy(p3), STREF, loti), buildtree(op, structref(t1, STREF, loti), structref(t2, STREF, loti))); p = buildtree(COMOP, p, p1); p = buildtree(COMOP, p, buildtree(UMUL, p3, NIL)); return p; }
/* * Create a ti node from something not a ti node. * This usually means: allocate space on stack, store val, give stack address. */ static NODE * ticast(NODE *p, int u) { CONSZ val; NODE *q; char *n; int u2; n = tistack(); /* store val */ switch (p->n_op) { case ICON: val = 0; if (u == 0 && p->n_lval < 0) val = -1; q = eve(biop(DOT, bdty(NAME, n), bdty(NAME, loti))); q = buildtree(ASSIGN, q, p); p = biop(DOT, bdty(NAME, n), bdty(NAME, hiti)); p = eve(biop(ASSIGN, p, bcon(val))); q = buildtree(COMOP, q, p); p = buildtree(COMOP, q, eve(bdty(NAME, n))); break; default: u2 = ISUNSIGNED(p->n_type); q = eve(biop(DOT, bdty(NAME, n), bdty(NAME, loti))); q = buildtree(ASSIGN, q, p); p = biop(DOT, bdty(NAME, n), bdty(NAME, hiti)); if (u2) { p = eve(biop(ASSIGN, p, bcon(0))); } else { q = buildtree(ASSIGN, eve(ccopy(p)), q); p = buildtree(RSEQ, eve(p), bcon(SZLONG-1)); } q = buildtree(COMOP, q, p); p = buildtree(COMOP, q, eve(bdty(NAME, n))); break; } return p; }
void bjobcode(void) { struct symtab *sp; struct rstack *rp; NODE *p, *q; char *c; /* amd64 names for some asm constant printouts */ astypnames[INT] = astypnames[UNSIGNED] = "\t.long"; astypnames[LONG] = astypnames[ULONG] = "\t.quad"; gp_offset = addname("gp_offset"); fp_offset = addname("fp_offset"); overflow_arg_area = addname("overflow_arg_area"); reg_save_area = addname("reg_save_area"); rp = bstruct(NULL, STNAME, NULL); p = block(NAME, NIL, NIL, UNSIGNED, 0, 0); soumemb(p, gp_offset, 0); soumemb(p, fp_offset, 0); p->n_type = VOID+PTR; p->n_ap = NULL; soumemb(p, overflow_arg_area, 0); soumemb(p, reg_save_area, 0); nfree(p); q = dclstruct(rp); c = addname("__builtin_va_list"); p = block(LB, bdty(NAME, c), bcon(1), INT, 0, 0); p = tymerge(q, p); p->n_sp = lookup(c, 0); defid(p, TYPEDEF); nfree(q); nfree(p); /* for the static varargs functions */ #define MKN(vn, rn, tp) \ { vn = addname(rn); sp = lookup(vn, SNORMAL); \ sp->sclass = USTATIC; sp->stype = tp; } MKN(gpnext, "__pcc_gpnext", FTN|LONG); MKN(fpnext, "__pcc_fpnext", FTN|DOUBLE); MKN(_1regref, "__pcc_1regref", FTN|VOID|(PTR<<TSHIFT)); MKN(_2regref, "__pcc_2regref", FTN|VOID|(PTR<<TSHIFT)); MKN(memref, "__pcc_memref", FTN|VOID|(PTR<<TSHIFT)); }