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