1*ce95e1b3SDavid du Colombier #include "../cc/cc.h" 2*ce95e1b3SDavid du Colombier #include "../ic/i.out.h" 3*ce95e1b3SDavid du Colombier 4*ce95e1b3SDavid du Colombier /* 5*ce95e1b3SDavid du Colombier * zc/riscv 6*ce95e1b3SDavid du Colombier * RISC-V 32-bit 7*ce95e1b3SDavid du Colombier */ 8*ce95e1b3SDavid du Colombier #define SZ_CHAR 1 9*ce95e1b3SDavid du Colombier #define SZ_SHORT 2 10*ce95e1b3SDavid du Colombier #define SZ_INT 4 11*ce95e1b3SDavid du Colombier #define SZ_LONG 4 12*ce95e1b3SDavid du Colombier #define SZ_IND 4 13*ce95e1b3SDavid du Colombier #define SZ_FLOAT 4 14*ce95e1b3SDavid du Colombier #define SZ_VLONG 8 15*ce95e1b3SDavid du Colombier #define SZ_DOUBLE 8 16*ce95e1b3SDavid du Colombier #define FNX 100 17*ce95e1b3SDavid du Colombier 18*ce95e1b3SDavid du Colombier typedef struct Adr Adr; 19*ce95e1b3SDavid du Colombier typedef struct Prog Prog; 20*ce95e1b3SDavid du Colombier typedef struct Case Case; 21*ce95e1b3SDavid du Colombier typedef struct C1 C1; 22*ce95e1b3SDavid du Colombier typedef struct Multab Multab; 23*ce95e1b3SDavid du Colombier typedef struct Hintab Hintab; 24*ce95e1b3SDavid du Colombier typedef struct Var Var; 25*ce95e1b3SDavid du Colombier typedef struct Reg Reg; 26*ce95e1b3SDavid du Colombier typedef struct Rgn Rgn; 27*ce95e1b3SDavid du Colombier 28*ce95e1b3SDavid du Colombier struct Adr 29*ce95e1b3SDavid du Colombier { 30*ce95e1b3SDavid du Colombier long offset; 31*ce95e1b3SDavid du Colombier double dval; 32*ce95e1b3SDavid du Colombier char sval[NSNAME]; 33*ce95e1b3SDavid du Colombier Ieee ieee; 34*ce95e1b3SDavid du Colombier 35*ce95e1b3SDavid du Colombier Sym* sym; 36*ce95e1b3SDavid du Colombier char type; 37*ce95e1b3SDavid du Colombier char reg; 38*ce95e1b3SDavid du Colombier char name; 39*ce95e1b3SDavid du Colombier char etype; 40*ce95e1b3SDavid du Colombier }; 41*ce95e1b3SDavid du Colombier #define A ((Adr*)0) 42*ce95e1b3SDavid du Colombier 43*ce95e1b3SDavid du Colombier #define INDEXED 9 44*ce95e1b3SDavid du Colombier struct Prog 45*ce95e1b3SDavid du Colombier { 46*ce95e1b3SDavid du Colombier Adr from; 47*ce95e1b3SDavid du Colombier Adr to; 48*ce95e1b3SDavid du Colombier Prog* link; 49*ce95e1b3SDavid du Colombier long lineno; 50*ce95e1b3SDavid du Colombier char as; 51*ce95e1b3SDavid du Colombier char reg; 52*ce95e1b3SDavid du Colombier }; 53*ce95e1b3SDavid du Colombier #define P ((Prog*)0) 54*ce95e1b3SDavid du Colombier 55*ce95e1b3SDavid du Colombier struct Case 56*ce95e1b3SDavid du Colombier { 57*ce95e1b3SDavid du Colombier Case* link; 58*ce95e1b3SDavid du Colombier vlong val; 59*ce95e1b3SDavid du Colombier long label; 60*ce95e1b3SDavid du Colombier char def; 61*ce95e1b3SDavid du Colombier char isv; 62*ce95e1b3SDavid du Colombier }; 63*ce95e1b3SDavid du Colombier #define C ((Case*)0) 64*ce95e1b3SDavid du Colombier 65*ce95e1b3SDavid du Colombier struct C1 66*ce95e1b3SDavid du Colombier { 67*ce95e1b3SDavid du Colombier vlong val; 68*ce95e1b3SDavid du Colombier long label; 69*ce95e1b3SDavid du Colombier }; 70*ce95e1b3SDavid du Colombier 71*ce95e1b3SDavid du Colombier struct Multab 72*ce95e1b3SDavid du Colombier { 73*ce95e1b3SDavid du Colombier long val; 74*ce95e1b3SDavid du Colombier char code[20]; 75*ce95e1b3SDavid du Colombier }; 76*ce95e1b3SDavid du Colombier 77*ce95e1b3SDavid du Colombier struct Hintab 78*ce95e1b3SDavid du Colombier { 79*ce95e1b3SDavid du Colombier ushort val; 80*ce95e1b3SDavid du Colombier char hint[10]; 81*ce95e1b3SDavid du Colombier }; 82*ce95e1b3SDavid du Colombier 83*ce95e1b3SDavid du Colombier struct Var 84*ce95e1b3SDavid du Colombier { 85*ce95e1b3SDavid du Colombier long offset; 86*ce95e1b3SDavid du Colombier Sym* sym; 87*ce95e1b3SDavid du Colombier char name; 88*ce95e1b3SDavid du Colombier char etype; 89*ce95e1b3SDavid du Colombier }; 90*ce95e1b3SDavid du Colombier 91*ce95e1b3SDavid du Colombier struct Reg 92*ce95e1b3SDavid du Colombier { 93*ce95e1b3SDavid du Colombier long pc; 94*ce95e1b3SDavid du Colombier long rpo; /* reverse post ordering */ 95*ce95e1b3SDavid du Colombier 96*ce95e1b3SDavid du Colombier Bits set; 97*ce95e1b3SDavid du Colombier Bits use1; 98*ce95e1b3SDavid du Colombier Bits use2; 99*ce95e1b3SDavid du Colombier 100*ce95e1b3SDavid du Colombier Bits refbehind; 101*ce95e1b3SDavid du Colombier Bits refahead; 102*ce95e1b3SDavid du Colombier Bits calbehind; 103*ce95e1b3SDavid du Colombier Bits calahead; 104*ce95e1b3SDavid du Colombier Bits regdiff; 105*ce95e1b3SDavid du Colombier Bits act; 106*ce95e1b3SDavid du Colombier 107*ce95e1b3SDavid du Colombier long regu; 108*ce95e1b3SDavid du Colombier long loop; /* could be shorter */ 109*ce95e1b3SDavid du Colombier 110*ce95e1b3SDavid du Colombier Reg* log5; 111*ce95e1b3SDavid du Colombier long active; 112*ce95e1b3SDavid du Colombier 113*ce95e1b3SDavid du Colombier Reg* p1; 114*ce95e1b3SDavid du Colombier Reg* p2; 115*ce95e1b3SDavid du Colombier Reg* p2link; 116*ce95e1b3SDavid du Colombier Reg* s1; 117*ce95e1b3SDavid du Colombier Reg* s2; 118*ce95e1b3SDavid du Colombier Reg* link; 119*ce95e1b3SDavid du Colombier Prog* prog; 120*ce95e1b3SDavid du Colombier }; 121*ce95e1b3SDavid du Colombier #define R ((Reg*)0) 122*ce95e1b3SDavid du Colombier 123*ce95e1b3SDavid du Colombier #define NRGN 600 124*ce95e1b3SDavid du Colombier struct Rgn 125*ce95e1b3SDavid du Colombier { 126*ce95e1b3SDavid du Colombier Reg* enter; 127*ce95e1b3SDavid du Colombier short cost; 128*ce95e1b3SDavid du Colombier short varno; 129*ce95e1b3SDavid du Colombier short regno; 130*ce95e1b3SDavid du Colombier }; 131*ce95e1b3SDavid du Colombier 132*ce95e1b3SDavid du Colombier EXTERN long breakpc; 133*ce95e1b3SDavid du Colombier EXTERN long nbreak; 134*ce95e1b3SDavid du Colombier EXTERN Case* cases; 135*ce95e1b3SDavid du Colombier EXTERN Node constnode; 136*ce95e1b3SDavid du Colombier EXTERN Node fconstnode; 137*ce95e1b3SDavid du Colombier EXTERN Node vconstnode; 138*ce95e1b3SDavid du Colombier EXTERN long continpc; 139*ce95e1b3SDavid du Colombier EXTERN long curarg; 140*ce95e1b3SDavid du Colombier EXTERN long cursafe; 141*ce95e1b3SDavid du Colombier EXTERN Prog* firstp; 142*ce95e1b3SDavid du Colombier EXTERN Prog* lastp; 143*ce95e1b3SDavid du Colombier EXTERN long maxargsafe; 144*ce95e1b3SDavid du Colombier EXTERN int mnstring; 145*ce95e1b3SDavid du Colombier EXTERN Multab multab[20]; 146*ce95e1b3SDavid du Colombier EXTERN int hintabsize; 147*ce95e1b3SDavid du Colombier EXTERN Node* nodrat; 148*ce95e1b3SDavid du Colombier EXTERN Node* nodret; 149*ce95e1b3SDavid du Colombier EXTERN Node* nodsafe; 150*ce95e1b3SDavid du Colombier EXTERN long nrathole; 151*ce95e1b3SDavid du Colombier EXTERN long nstring; 152*ce95e1b3SDavid du Colombier EXTERN Prog* p; 153*ce95e1b3SDavid du Colombier EXTERN long pc; 154*ce95e1b3SDavid du Colombier EXTERN Node regnode; 155*ce95e1b3SDavid du Colombier EXTERN Node vregnode; 156*ce95e1b3SDavid du Colombier EXTERN char string[NSNAME]; 157*ce95e1b3SDavid du Colombier EXTERN Sym* symrathole; 158*ce95e1b3SDavid du Colombier EXTERN Node znode; 159*ce95e1b3SDavid du Colombier EXTERN Prog zprog; 160*ce95e1b3SDavid du Colombier EXTERN int reg[NREG+NREG]; 161*ce95e1b3SDavid du Colombier EXTERN long exregoffset; 162*ce95e1b3SDavid du Colombier EXTERN long exfregoffset; 163*ce95e1b3SDavid du Colombier 164*ce95e1b3SDavid du Colombier #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 165*ce95e1b3SDavid du Colombier #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 166*ce95e1b3SDavid du Colombier #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 167*ce95e1b3SDavid du Colombier #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 168*ce95e1b3SDavid du Colombier 169*ce95e1b3SDavid du Colombier #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 170*ce95e1b3SDavid du Colombier 171*ce95e1b3SDavid du Colombier #define CLOAD 4 172*ce95e1b3SDavid du Colombier #define CREF 5 173*ce95e1b3SDavid du Colombier #define CINF 1000 174*ce95e1b3SDavid du Colombier #define LOOP 3 175*ce95e1b3SDavid du Colombier 176*ce95e1b3SDavid du Colombier EXTERN Rgn region[NRGN]; 177*ce95e1b3SDavid du Colombier EXTERN Rgn* rgp; 178*ce95e1b3SDavid du Colombier EXTERN int nregion; 179*ce95e1b3SDavid du Colombier EXTERN int nvar; 180*ce95e1b3SDavid du Colombier 181*ce95e1b3SDavid du Colombier EXTERN Bits externs; 182*ce95e1b3SDavid du Colombier EXTERN Bits params; 183*ce95e1b3SDavid du Colombier EXTERN Bits consts; 184*ce95e1b3SDavid du Colombier EXTERN Bits addrs; 185*ce95e1b3SDavid du Colombier 186*ce95e1b3SDavid du Colombier EXTERN long regbits; 187*ce95e1b3SDavid du Colombier EXTERN long exregbits; 188*ce95e1b3SDavid du Colombier 189*ce95e1b3SDavid du Colombier EXTERN int change; 190*ce95e1b3SDavid du Colombier EXTERN int suppress; 191*ce95e1b3SDavid du Colombier 192*ce95e1b3SDavid du Colombier EXTERN Reg* firstr; 193*ce95e1b3SDavid du Colombier EXTERN Reg* lastr; 194*ce95e1b3SDavid du Colombier EXTERN Reg zreg; 195*ce95e1b3SDavid du Colombier EXTERN Reg* freer; 196*ce95e1b3SDavid du Colombier EXTERN Var var[NVAR]; 197*ce95e1b3SDavid du Colombier EXTERN long* idom; 198*ce95e1b3SDavid du Colombier EXTERN Reg** rpo2r; 199*ce95e1b3SDavid du Colombier EXTERN long maxnr; 200*ce95e1b3SDavid du Colombier 201*ce95e1b3SDavid du Colombier extern char* anames[]; 202*ce95e1b3SDavid du Colombier extern Hintab hintab[]; 203*ce95e1b3SDavid du Colombier 204*ce95e1b3SDavid du Colombier /* 205*ce95e1b3SDavid du Colombier * sgen.c 206*ce95e1b3SDavid du Colombier */ 207*ce95e1b3SDavid du Colombier void codgen(Node*, Node*); 208*ce95e1b3SDavid du Colombier void gen(Node*); 209*ce95e1b3SDavid du Colombier void noretval(int); 210*ce95e1b3SDavid du Colombier void xcom(Node*); 211*ce95e1b3SDavid du Colombier int bcomplex(Node*, Node*); 212*ce95e1b3SDavid du Colombier void usedset(Node*, int); 213*ce95e1b3SDavid du Colombier 214*ce95e1b3SDavid du Colombier /* 215*ce95e1b3SDavid du Colombier * cgen.c 216*ce95e1b3SDavid du Colombier */ 217*ce95e1b3SDavid du Colombier void cgen(Node*, Node*); 218*ce95e1b3SDavid du Colombier void reglcgen(Node*, Node*, Node*); 219*ce95e1b3SDavid du Colombier void lcgen(Node*, Node*); 220*ce95e1b3SDavid du Colombier void bcgen(Node*, int); 221*ce95e1b3SDavid du Colombier void boolgen(Node*, int, Node*); 222*ce95e1b3SDavid du Colombier void sugen(Node*, Node*, long); 223*ce95e1b3SDavid du Colombier void layout(Node*, Node*, int, int, Node*); 224*ce95e1b3SDavid du Colombier 225*ce95e1b3SDavid du Colombier /* 226*ce95e1b3SDavid du Colombier * txt.c 227*ce95e1b3SDavid du Colombier */ 228*ce95e1b3SDavid du Colombier void ginit(void); 229*ce95e1b3SDavid du Colombier void gclean(void); 230*ce95e1b3SDavid du Colombier void nextpc(void); 231*ce95e1b3SDavid du Colombier void gargs(Node*, Node*, Node*); 232*ce95e1b3SDavid du Colombier void garg1(Node*, Node*, Node*, int, Node**); 233*ce95e1b3SDavid du Colombier Node* nodconst(long); 234*ce95e1b3SDavid du Colombier Node* nod32const(vlong); 235*ce95e1b3SDavid du Colombier Node* nodfconst(double); 236*ce95e1b3SDavid du Colombier Node* nodgconst(vlong, Type*); 237*ce95e1b3SDavid du Colombier void nodreg(Node*, Node*, int); 238*ce95e1b3SDavid du Colombier void regret(Node*, Node*); 239*ce95e1b3SDavid du Colombier void regalloc(Node*, Node*, Node*); 240*ce95e1b3SDavid du Colombier void regfree(Node*); 241*ce95e1b3SDavid du Colombier void regialloc(Node*, Node*, Node*); 242*ce95e1b3SDavid du Colombier void regsalloc(Node*, Node*); 243*ce95e1b3SDavid du Colombier void regaalloc1(Node*, Node*); 244*ce95e1b3SDavid du Colombier void regaalloc(Node*, Node*); 245*ce95e1b3SDavid du Colombier void regind(Node*, Node*); 246*ce95e1b3SDavid du Colombier void gprep(Node*, Node*); 247*ce95e1b3SDavid du Colombier void raddr(Node*, Prog*); 248*ce95e1b3SDavid du Colombier void naddr(Node*, Adr*); 249*ce95e1b3SDavid du Colombier void gmove(Node*, Node*); 250*ce95e1b3SDavid du Colombier void gins(int a, Node*, Node*); 251*ce95e1b3SDavid du Colombier void gopcode(int, Node*, Node*, Node*); 252*ce95e1b3SDavid du Colombier int samaddr(Node*, Node*); 253*ce95e1b3SDavid du Colombier void gbranch(int); 254*ce95e1b3SDavid du Colombier void patch(Prog*, long); 255*ce95e1b3SDavid du Colombier int sconst(Node*); 256*ce95e1b3SDavid du Colombier int sval(long); 257*ce95e1b3SDavid du Colombier void gpseudo(int, Sym*, Node*); 258*ce95e1b3SDavid du Colombier 259*ce95e1b3SDavid du Colombier /* 260*ce95e1b3SDavid du Colombier * swt.c 261*ce95e1b3SDavid du Colombier */ 262*ce95e1b3SDavid du Colombier int swcmp(void*, void*); 263*ce95e1b3SDavid du Colombier void doswit(Node*); 264*ce95e1b3SDavid du Colombier void swit1(C1*, int, long, Node*); 265*ce95e1b3SDavid du Colombier void swit2(C1*, int, long, Node*, Node*); 266*ce95e1b3SDavid du Colombier void casf(void); 267*ce95e1b3SDavid du Colombier void bitload(Node*, Node*, Node*, Node*, Node*); 268*ce95e1b3SDavid du Colombier void bitstore(Node*, Node*, Node*, Node*, Node*); 269*ce95e1b3SDavid du Colombier long outstring(char*, long); 270*ce95e1b3SDavid du Colombier int mulcon(Node*, Node*); 271*ce95e1b3SDavid du Colombier Multab* mulcon0(long); 272*ce95e1b3SDavid du Colombier void nullwarn(Node*, Node*); 273*ce95e1b3SDavid du Colombier void gextern(Sym*, Node*, long, long); 274*ce95e1b3SDavid du Colombier void outcode(void); 275*ce95e1b3SDavid du Colombier void ieeedtod(Ieee*, double); 276*ce95e1b3SDavid du Colombier 277*ce95e1b3SDavid du Colombier /* 278*ce95e1b3SDavid du Colombier * list 279*ce95e1b3SDavid du Colombier */ 280*ce95e1b3SDavid du Colombier void listinit(void); 281*ce95e1b3SDavid du Colombier int Pconv(Fmt*); 282*ce95e1b3SDavid du Colombier int Aconv(Fmt*); 283*ce95e1b3SDavid du Colombier int Dconv(Fmt*); 284*ce95e1b3SDavid du Colombier int Sconv(Fmt*); 285*ce95e1b3SDavid du Colombier int Nconv(Fmt*); 286*ce95e1b3SDavid du Colombier int Bconv(Fmt*); 287*ce95e1b3SDavid du Colombier 288*ce95e1b3SDavid du Colombier /* 289*ce95e1b3SDavid du Colombier * reg.c 290*ce95e1b3SDavid du Colombier */ 291*ce95e1b3SDavid du Colombier Reg* rega(void); 292*ce95e1b3SDavid du Colombier int rcmp(void*, void*); 293*ce95e1b3SDavid du Colombier void regopt(Prog*); 294*ce95e1b3SDavid du Colombier void addmove(Reg*, int, int, int); 295*ce95e1b3SDavid du Colombier Bits mkvar(Adr*, int); 296*ce95e1b3SDavid du Colombier void prop(Reg*, Bits, Bits); 297*ce95e1b3SDavid du Colombier void loopit(Reg*, long); 298*ce95e1b3SDavid du Colombier void synch(Reg*, Bits); 299*ce95e1b3SDavid du Colombier ulong allreg(ulong, Rgn*); 300*ce95e1b3SDavid du Colombier void paint1(Reg*, int); 301*ce95e1b3SDavid du Colombier ulong paint2(Reg*, int); 302*ce95e1b3SDavid du Colombier void paint3(Reg*, int, long, int); 303*ce95e1b3SDavid du Colombier void addreg(Adr*, int); 304*ce95e1b3SDavid du Colombier 305*ce95e1b3SDavid du Colombier /* 306*ce95e1b3SDavid du Colombier * peep.c 307*ce95e1b3SDavid du Colombier */ 308*ce95e1b3SDavid du Colombier void peep(void); 309*ce95e1b3SDavid du Colombier void excise(Reg*); 310*ce95e1b3SDavid du Colombier Reg* uniqp(Reg*); 311*ce95e1b3SDavid du Colombier Reg* uniqs(Reg*); 312*ce95e1b3SDavid du Colombier int regtyp(Adr*); 313*ce95e1b3SDavid du Colombier int regzer(Adr*); 314*ce95e1b3SDavid du Colombier int anyvar(Adr*); 315*ce95e1b3SDavid du Colombier int subprop(Reg*); 316*ce95e1b3SDavid du Colombier int copyprop(Reg*); 317*ce95e1b3SDavid du Colombier int copy1(Adr*, Adr*, Reg*, int); 318*ce95e1b3SDavid du Colombier int copyu(Prog*, Adr*, Adr*); 319*ce95e1b3SDavid du Colombier 320*ce95e1b3SDavid du Colombier int copyas(Adr*, Adr*); 321*ce95e1b3SDavid du Colombier int copyau(Adr*, Adr*); 322*ce95e1b3SDavid du Colombier int copyau1(Prog*, Adr*); 323*ce95e1b3SDavid du Colombier int copysub(Adr*, Adr*, Adr*, int); 324*ce95e1b3SDavid du Colombier int copysub1(Prog*, Adr*, Adr*, int); 325*ce95e1b3SDavid du Colombier 326*ce95e1b3SDavid du Colombier long RtoB(int); 327*ce95e1b3SDavid du Colombier long FtoB(int); 328*ce95e1b3SDavid du Colombier int BtoR(long); 329*ce95e1b3SDavid du Colombier int BtoF(long); 330*ce95e1b3SDavid du Colombier 331*ce95e1b3SDavid du Colombier #pragma varargck type "A" int 332*ce95e1b3SDavid du Colombier #pragma varargck type "B" Bits 333*ce95e1b3SDavid du Colombier #pragma varargck type "D" Adr* 334*ce95e1b3SDavid du Colombier #pragma varargck type "N" Adr* 335*ce95e1b3SDavid du Colombier #pragma varargck type "P" Prog* 336*ce95e1b3SDavid du Colombier #pragma varargck type "S" char* 337