X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpic%2Fralloc.h;h=7835c48fec8d85c84dd0e5169e7472b51840d0cc;hb=80972b2e54c9b88f11c27b878874fd2a6a681391;hp=5c6d77b839c74e288fb47712beafcc0901360971;hpb=b84cf8c09bd4d579e1fe6ba9d4da20d4030fa738;p=fw%2Fsdcc diff --git a/src/pic/ralloc.h b/src/pic/ralloc.h index 5c6d77b8..7835c48f 100644 --- a/src/pic/ralloc.h +++ b/src/pic/ralloc.h @@ -3,7 +3,7 @@ SDCCralloc.h - header file register allocation Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998) - PIC port - T. Scott Dattalo scott@dattalo.com (2000) + PIC port - T. Scott Dattalo scott@dattalo.com (2000) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -23,65 +23,51 @@ You are forbidden to forbid anyone else to use, share and improve what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ -#include "SDCCicode.h" -#include "SDCCBBlock.h" + #ifndef SDCCRALLOC_H #define SDCCRALLOC_H 1 -#include "pcoderegs.h" +#include "common.h" +#include "pcoderegs.h" -enum - { - R2_IDX = 0, R3_IDX, R4_IDX, - R5_IDX, R6_IDX, R7_IDX, - R0_IDX, R1_IDX, X8_IDX, - X9_IDX, X10_IDX, X11_IDX, - X12_IDX, CND_IDX - }; enum { - REG_PTR=1, - REG_GPR, - REG_CND, - REG_SFR, - REG_STK, - REG_TMP + REG_PTR=1, + REG_GPR, + REG_CND, + REG_SFR, + REG_STK, + REG_TMP }; -//#define REG_PTR 0x01 -//#define REG_GPR 0x02 -//#define REG_CND 0x04 -//#define REG_SFR 0x08 -//#define REG_STK 0x10 /* Use a register as a psuedo stack */ -//#define REG_TMP 0x20 /* definition for the registers */ typedef struct regs - { - short type; /* can have value - * REG_GPR, REG_PTR or REG_CND - * This like the "meta-type" */ - short pc_type; /* pcode type */ - short rIdx; /* index into register table */ - // short otype; - char *name; /* name */ - - unsigned isFree:1; /* is currently unassigned */ - unsigned wasUsed:1; /* becomes true if register has been used */ - unsigned isFixed:1; /* True if address can't change */ - unsigned isMapped:1; /* The Register's address has been mapped to physical RAM */ - unsigned isBitField:1; /* True if reg is type bit OR is holder for several bits */ - unsigned isEmitted:1; /* True if the reg has been written to a .asm file */ - unsigned address; /* reg's address if isFixed | isMapped is true */ - unsigned size; /* 0 for byte, 1 for int, 4 for long */ - unsigned alias; /* Alias mask if register appears in multiple banks */ - struct regs *reg_alias; /* If more than one register share the same address - * then they'll point to each other. (primarily for bits)*/ - pCodeRegLives reglives; /* live range mapping */ - } +{ + short type; /* can have value + * REG_GPR, REG_PTR or REG_CND + * This like the "meta-type" */ + short pc_type; /* pcode type */ + short rIdx; /* index into register table */ + char *name; /* name */ + + unsigned isFree:1; /* is currently unassigned */ + unsigned wasUsed:1; /* becomes true if register has been used */ + unsigned isFixed:1; /* True if address can't change */ + unsigned isMapped:1; /* The Register's address has been mapped to physical RAM */ + unsigned isBitField:1; /* True if reg is type bit OR is holder for several bits */ + unsigned isEmitted:1; /* True if the reg has been written to a .asm file */ + unsigned isPublic:1; /* True if the reg is not static and can be modified in another module (ie a another c or asm file) */ + unsigned isExtern:1; /* True if the reg is in another module */ + unsigned address; /* reg's address if isFixed | isMapped is true */ + unsigned size; /* 0 for byte, 1 for int, 4 for long */ + unsigned alias; /* Alias mask if register appears in multiple banks */ + struct regs *reg_alias; /* If more than one register share the same address + * then they'll point to each other. (primarily for bits)*/ + pCodeRegLives reglives; /* live range mapping */ +} regs; extern regs regspic14[]; -extern int pic14_nRegs; extern int Gstack_base_addr; /* @@ -97,16 +83,23 @@ extern set *dynDirectBitRegs; extern set *dynInternalRegs; +void initStack(int base_address, int size, int shared); regs *pic14_regWithIdx (int); regs *dirregWithName (char *name ); -void pic14_freeAllRegs (); -void pic14_deallocateAllRegs (); +void pic14_assignRegisters (ebbIndex *ebbi); regs *pic14_findFreeReg(short type); regs *pic14_allocWithIdx (int idx); regs *typeRegWithIdx (int idx, int type, int fixed); +regs *regFindWithName (const char *name); + +void pic14_debugLogClose(void); +void writeUsedRegs(FILE *of); regs *allocDirReg (operand *op ); +regs *allocInternalRegister(int rIdx, char * name, PIC_OPTYPE po_type, int alias); +regs *allocProcessorRegister(int rIdx, char * name, short po_type, int alias); regs *allocRegByName (char *name, int size ); +regs *allocNewDirReg (sym_link *symlnk,const char *name); /* Define register address that are constant across PIC family */ #define IDX_INDF 0 @@ -124,4 +117,6 @@ regs *allocRegByName (char *name, int size ); #define IDX_SSAVE 0x7ffd #define IDX_PSAVE 0x7ffc +#define pic14_nRegs 128 + #endif