CGIR.xcc
Benoit Dupont de Dinechin (Benoit.Dupont-de-Dinechinst.com). Christophe Guillon (Christophe.Guillonst.com).
Copyright 2002 - 2007 STMicroelectronics. Copyright 1995 - 1998 Commissariat a l'Energie Atomique.
This program is free software; you can redistribute it and/or modify it under the terms of either (at your option): the GNU General Public License (GPL) version 2; the GNU Lesser General Public License (LGPL) version 2.1; any later version of these licences as published by the Free Software Foundation.
Host compiler CGIR types.
typedef uint32_t CGIR_LAB; typedef uint32_t CGIR_SYM; typedef struct WN *CGIR_WN; typedef struct tn *CGIR_TN; typedef struct op *CGIR_OP; typedef struct bb *CGIR_BB; typedef struct LOOP_DESCR *CGIR_LD; typedef struct region_id *CGIR_RID;
CGIROperationFlags— Used to pass OperationFlag to CGIR_OP.
typedef enum { CGIROperationFlags_SafeAccess = 0x1, CGIROperationFlags_Hoisted = 0x2, CGIROperationFlags_Volatile = 0x4, CGIROperationFlags_Prefetch = 0x8, CGIROperationFlags_Preload = 0x10, CGIROperationFlags_Barrier = 0x20, CGIROperationFlags_SpillCode = 0x40, CGIROperationFlags_SafePerfs = 0x80, } enum_CGIROperationFlags; typedef uint8_t CGIROperationFlags;
CGIRBasicBlockFlags— Used to pass BasicBlockFlag to CGIR_OP.
typedef enum { CGIRBasicBlockFlags_Allocated = 0x1, CGIRBasicBlockFlags_Scheduled = 0x2, } CGIRBasicBlockFlags;
uint32_t CGIR_LAB_identity(CGIR_LAB cgir_lab); -- Identity of a CGIR_LAB.
#define CGIR_LAB_identity(cgir_lab) \ (uint32_t)(cgir_lab)
uint32_t CGIR_SYM_identity(CGIR_SYM cgir_sym); -- Identity of a CGIR_SYM.
#define CGIR_SYM_identity(cgir_sym) \ (uint32_t)(cgir_sym)
uint32_t CGIR_TN_identity(CGIR_TN cgir_tn); -- Identity of a CGIR_TN.
#define CGIR_TN_identity(cgir_tn) \ (uint32_t)(cgir_tn)
uint32_t CGIR_OP_identity(CGIR_OP cgir_op); -- Identity of a CGIR_OP.
#define CGIR_OP_identity(cgir_op) \ (uint32_t)(cgir_op)
uint32_t CGIR_BB_identity(CGIR_BB cgir_bb); -- Identity of a CGIR_BB.
#define CGIR_BB_identity(cgir_bb) \ (uint32_t)(cgir_bb)
uint32_t CGIR_LD_identity(CGIR_LD cgir_ld); -- Identity of a CGIR_LD.
#define CGIR_LD_identity(cgir_ld) \ (uint32_t)(cgir_ld)
CGIR_LAB_make— Update a CGIR_LAB.
static CGIR_LAB CGIR_LAB_make(CGIR_LAB cgir_lab, const char *name);
CGIR_SYM_make— Update a CGIR_SYM.
static CGIR_SYM CGIR_SYM_make(CGIR_SYM cgir_sym, const char *name, bool isSpill, NativeType lai_nativeType);
CGIR_TN_make— Update a CGIR_TN.
static CGIR_TN CGIR_TN_make(CGIR_TN cgir_tn, CGIRType cgir_type, ...);
CGIR_OP_make— Update a CGIR_OP from a LIR Operation.
static CGIR_OP CGIR_OP_make(CGIR_OP cgir_op, Operator lai_operator, CGIR_TN arguments[], CGIR_TN results[], CGIR_OP orig_op);
void CGIR_BB_make -- Update a CGIR_BB.
static CGIR_BB CGIR_BB_make(CGIR_BB cgir_bb, CGIR_LAB labels[], CGIR_OP operations[], CGIR_RID cgir_rid, float frequency);
CGIR_LD_make— Update a CGIR_LD.
static CGIR_LD CGIR_LD_make(CGIR_LD cgir_ld, CGIR_BB head_bb, CGIR_TN trip_count_tn, int unrolled);
CGIR_BB_chain— Chain two CGIR_BBs in the CGIR.
static void CGIR_BB_chain(CGIR_BB cgir_bb, CGIR_BB succ_cgir_bb);
CGIR_BB_unchain— Unchain a CGIR_BB in the CGIR.
static void CGIR_BB_unchain(CGIR_BB cgir_bb);
CGIR_BB_link— Link two CGIR_BBs in the CGIR with the given branch probability.
static void CGIR_BB_link(CGIR_BB tail_cgir_bb, CGIR_BB head_cgir_bb, float probability);
void CGIR_BB_unlink(CGIR_BB cgir_bb, bool preds, bool succs);
Unlink the predecessors and/or the successors of a CGIR_BB in the CGIR.
static void CGIR_BB_unlink(CGIR_BB cgir_bb, bool preds, bool succs);
void CGIR_BB_discard(CGIR_BB cgir_bb);
Discard a CGIR_BB in the CGIR.
static void CGIR_BB_discard(CGIR_BB cgir_bb);
CGIR_CallBack— Call back functions.
struct CGIR_CallBack_ { CGIR_LAB (*LAB_make)(CGIR_LAB cgir_lab, const char *name); CGIR_SYM (*SYM_make)(CGIR_SYM cgir_sym, const char *name, bool isSpill, NativeType lai_nativeType); CGIR_TN (*TN_make)(CGIR_TN cgir_tn, CGIRType cgir_type, ...); CGIR_OP (*OP_make)(CGIR_OP cgir_op, Operator lai_operator, CGIR_TN arguments[], CGIR_TN results[], CGIR_OP orig_op); void (*OP_more)(CGIR_OP cgir_op, int iteration, int startDate, unsigned flags); CGIR_BB (*BB_make)(CGIR_BB cgir_bb, CGIR_LAB labels[], CGIR_OP operations[], CGIR_RID cgir_rid, float frequency); void (*BB_more)(CGIR_BB cgir_bb, CGIR_BB loop_bb, intptr_t traceId, int unrolled, unsigned flags); CGIR_LD (*LD_make)(CGIR_LD cgir_ld, CGIR_BB head_bb, CGIR_TN trip_count_tn, int unrolled); void (*BB_chain)(CGIR_BB cgir_bb, CGIR_BB succ_cgir_bb); void (*BB_unchain)(CGIR_BB cgir_bb); void (*BB_link)(CGIR_BB tail_cgir_bb, CGIR_BB head_cgir_bb, float probability); void (*BB_unlink)(CGIR_BB cgir_bb, bool preds, bool succs); void (*BB_discard)(CGIR_BB cgir_bb); };
O64_Interface— O64 Interface object. All functions for the LAO Interface are available from this object.
struct O64_Interface_ { int size; void (*Interface_Initialize)(void); void (*Interface_Finalize)(void); struct Interface_* (*Interface_getInstance)(void); void (*Interface_setMaxIssue)(struct Interface_* this, Processor processor, int maxIssue); void (*Interface_setMinTaken)(struct Interface_* this, Processor processor, int minTaken); void (*Interface_setReserved)(struct Interface_* this, Convention convention, Register reserved); bool (*Interface_setArgStage)(struct Interface_* this, Processor processor, Operator operator, int index, int stage); bool (*Interface_setResStage)(struct Interface_* this, Processor processor, Operator operator, int index, int stage); Label (*Interface_makeLabel)(struct Interface_* this, CGIR_LAB cgir_lab, const char *name); Label (*Interface_findLabel)(struct Interface_* this, CGIR_LAB cgir_lab); Symbol (*Interface_makeSymbol)(struct Interface_* this, CGIR_SYM cgir_sym, const char *name); void (*Interface_Symbol_setClasses)(struct Interface_* this, Symbol symbol, SymbolClass sclass, SymbolStore sstore, SymbolExport sexport); Symbol (*Interface_findSymbol)(struct Interface_* this, CGIR_SYM cgir_sym); Temporary (*Interface_makeDedicatedTemporary)(struct Interface_* this, CGIR_TN cgir_tn, Register registre); Temporary (*Interface_makeAssignedTemporary)(struct Interface_* this, CGIR_TN cgir_tn, Register registre); Temporary (*Interface_makeVirtualTemporary)(struct Interface_* this, CGIR_TN cgir_tn, RegFile regFile); Temporary (*Interface_makeAbsoluteTemporary)(struct Interface_* this, CGIR_TN cgir_tn, Immediate immediate, int64_t value); Temporary (*Interface_makeSymbolTemporary)(struct Interface_* this, CGIR_TN cgir_tn, Immediate immediate, Symbol symbol, int64_t offset); Temporary (*Interface_makeLabelTemporary)(struct Interface_* this, CGIR_TN cgir_tn, Immediate immediate, Label label); void (*Interface_Temporary_setWidth)(struct Interface_* this, Temporary temporary, unsigned width); void (*Interface_Temporary_setRemater)(struct Interface_* this, Temporary temporary, Temporary value); void (*Interface_Temporary_setHomeable)(struct Interface_* this, Temporary temporary, Temporary location); void (*Interface_Temporary_setDedicated)(struct Interface_* this, Temporary temporary); Temporary (*Interface_findTemporary)(struct Interface_* this, CGIR_TN cgir_tn); uint32_t (*Interface_Temporary_identity)(Temporary temporary); int (*Interface_Temporary_isAbsolute)(Temporary temporary); int64_t (*Interface_Temporary_value)(Temporary temporary); int (*Interface_Temporary_isSymbol)(Temporary temporary); Symbol (*Interface_Temporary_symbol)(Temporary temporary); int64_t (*Interface_Temporary_offset)(Temporary temporary); Immediate (*Interface_Temporary_invariant)(Temporary temporary); int (*Interface_Temporary_isVirtual)(Temporary temporary); int (*Interface_Temporary_isDedicated)(Temporary temporary); int (*Interface_Temporary_isAssigned)(Temporary temporary); Register (*Interface_Temporary_register)(Temporary temporary); RegFile (*Interface_Temporary_regFile)(Temporary temporary); uint32_t (*Interface_Symbol_identity)(Symbol symbol); const char * (*Interface_Symbol_name)(Symbol symbol); int (*Interface_Symbol_isSpill)(Symbol symbol); NativeType (*Interface_Symbol_nativeType)(Symbol symbol); uint32_t (*Interface_Operation_identity)(Operation operation); Operator (*Interface_Operation_operator)(Operation operation); int (*Interface_Operation_iteration)(Operation operation); int (*Interface_Operation_startDate)(Operation operation); int (*Interface_Operation_isSpillCode)(Operation operation); int (*Interface_Operation_isVolatile)(Operation operation); int (*Interface_Operation_isHoisted)(Operation operation); uint32_t (*Interface_Label_identity)(Label label); const char * (*Interface_Label_name)(Label label); uint32_t (*Interface_BasicBlock_identity)(BasicBlock basicBlock); int (*Interface_BasicBlock_unrolled)(BasicBlock basicBlock); intptr_t (*Interface_BasicBlock_traceId)(BasicBlock basicBlock); uint32_t (*Interface_LoopScope_identity)(LoopScope loopScope); int (*Interface_LoopScope_unrolled)(LoopScope loopScope); Operation (*Interface_makeOperation)(struct Interface_* this, CGIR_OP cgir_op, Operator operator, int iteration, int argCount, Temporary arguments[], int resCount, Temporary results[], int regCount, int registers[]); Operation (*Interface_findOperation)(struct Interface_* this, CGIR_OP cgir_op); void (*Interface_Operation_setSafeAccess)(struct Interface_* this, Operation operation); void (*Interface_Operation_setHoisted)(struct Interface_* this, Operation operation); void (*Interface_Operation_setVolatile)(struct Interface_* this, Operation operation); void (*Interface_Operation_setPrefetch)(struct Interface_* this, Operation operation); void (*Interface_Operation_setPreload)(struct Interface_* this, Operation operation); void (*Interface_Operation_setBarrier)(struct Interface_* this, Operation operation); void (*Interface_Operation_setSafePerfs)(struct Interface_* this, Operation operation); void (*Interface_Operation_setSpillCode)(struct Interface_* this, Operation operation, Symbol symbol); BasicBlock (*Interface_makeBasicBlock)(struct Interface_* this, CGIR_BB cgir_bb, Processor processor, int unrolled, int labelCount, Label labels[], int operationCount, Operation operations[], intptr_t regionId, float frequency); BasicBlock (*Interface_findBasicBlock)(struct Interface_* this, CGIR_BB cgir_bb); void (*Interface_linkBasicBlocks)(struct Interface_* this, BasicBlock tail_block, BasicBlock head_block, float probability); LoopScope (*Interface_makeLoopScope)(struct Interface_* this, CGIR_LD cgir_ld, BasicBlock basicBlock, Temporary temporary, ConfigureItem item, ...); LoopScope (*Interface_findLoopScope)(struct Interface_* this, CGIR_LD cgir_ld); void (*Interface_LoopScope_setDependenceNode)(struct Interface_* this, LoopScope loopScope, Operation operation, DependenceNode node); void (*Interface_LoopScope_setDependenceArc)(struct Interface_* this, LoopScope loopScope, Operation tail_operation, Operation head_operation, int latency, int omega, DependenceKind type); void (*Interface_setBody)(struct Interface_* this, BasicBlock basicBlock); void (*Interface_setEntry)(struct Interface_* this, BasicBlock basicBlock); void (*Interface_setExit)(struct Interface_* this, BasicBlock basicBlock); void (*Interface_setStart)(struct Interface_* this, BasicBlock basicBlock); void (*Interface_updateCGIR)(struct Interface_* this, CGIR_CallBack callback); void (*Interface_open)(struct Interface_* this, const char *name, ConfigureItem item, ...); unsigned (*Interface_optimize)(struct Interface_* this, OptimizeItem item, ...); void (*Interface_close)(struct Interface_* this); };
O64_getInstance— The singleton O64_Interface instance.
O64_Interface O64_getInstance(void);
Accessors to the O64_Interface functions. O64_instance must be an O64_Interface object.
#define O64_Interface_Initialize (*O64_instance->Interface_Initialize) #define O64_Interface_Finalize (*O64_instance->Interface_Finalize) #define O64_Interface_getInstance (*O64_instance->Interface_getInstance) #define O64_Interface_setMaxIssue (*O64_instance->Interface_setMaxIssue) #define O64_Interface_setMinTaken (*O64_instance->Interface_setMinTaken) #define O64_Interface_setReserved (*O64_instance->Interface_setReserved) #define O64_Interface_setArgStage (*O64_instance->Interface_setArgStage) #define O64_Interface_setResStage (*O64_instance->Interface_setResStage) #define O64_Interface_makeLabel (*O64_instance->Interface_makeLabel) #define O64_Interface_findLabel (*O64_instance->Interface_findLabel) #define O64_Interface_makeSymbol (*O64_instance->Interface_makeSymbol) #define O64_Interface_Symbol_setClasses (*O64_instance->Interface_Symbol_setClasses) #define O64_Interface_findSymbol (*O64_instance->Interface_findSymbol) #define O64_Interface_makeDedicatedTemporary (*O64_instance->Interface_makeDedicatedTemporary) #define O64_Interface_makeAssignedTemporary (*O64_instance->Interface_makeAssignedTemporary) #define O64_Interface_makeVirtualTemporary (*O64_instance->Interface_makeVirtualTemporary) #define O64_Interface_makeAbsoluteTemporary (*O64_instance->Interface_makeAbsoluteTemporary) #define O64_Interface_makeSymbolTemporary (*O64_instance->Interface_makeSymbolTemporary) #define O64_Interface_makeLabelTemporary (*O64_instance->Interface_makeLabelTemporary) #define O64_Interface_Temporary_setWidth (*O64_instance->Interface_Temporary_setWidth) #define O64_Interface_Temporary_setRemater (*O64_instance->Interface_Temporary_setRemater) #define O64_Interface_Temporary_setHomeable (*O64_instance->Interface_Temporary_setHomeable) #define O64_Interface_Temporary_setDedicated (*O64_instance->Interface_Temporary_setDedicated) #define O64_Interface_findTemporary (*O64_instance->Interface_findTemporary) #define O64_Interface_Temporary_identity (*O64_instance->Interface_Temporary_identity) #define O64_Interface_Temporary_isAbsolute (*O64_instance->Interface_Temporary_isAbsolute) #define O64_Interface_Temporary_value (*O64_instance->Interface_Temporary_value) #define O64_Interface_Temporary_isSymbol (*O64_instance->Interface_Temporary_isSymbol) #define O64_Interface_Temporary_symbol (*O64_instance->Interface_Temporary_symbol) #define O64_Interface_Temporary_offset (*O64_instance->Interface_Temporary_offset) #define O64_Interface_Temporary_invariant (*O64_instance->Interface_Temporary_invariant) #define O64_Interface_Temporary_isVirtual (*O64_instance->Interface_Temporary_isVirtual) #define O64_Interface_Temporary_isDedicated (*O64_instance->Interface_Temporary_isDedicated) #define O64_Interface_Temporary_isAssigned (*O64_instance->Interface_Temporary_isAssigned) #define O64_Interface_Temporary_register (*O64_instance->Interface_Temporary_register) #define O64_Interface_Temporary_regFile (*O64_instance->Interface_Temporary_regFile) #define O64_Interface_Symbol_identity (*O64_instance->Interface_Symbol_identity) #define O64_Interface_Symbol_name (*O64_instance->Interface_Symbol_name) #define O64_Interface_Symbol_isSpill (*O64_instance->Interface_Symbol_isSpill) #define O64_Interface_Symbol_nativeType (*O64_instance->Interface_Symbol_nativeType) #define O64_Interface_Operation_identity (*O64_instance->Interface_Operation_identity) #define O64_Interface_Operation_operator (*O64_instance->Interface_Operation_operator) #define O64_Interface_Operation_iteration (*O64_instance->Interface_Operation_iteration) #define O64_Interface_Operation_startDate (*O64_instance->Interface_Operation_startDate) #define O64_Interface_Operation_isSpillCode (*O64_instance->Interface_Operation_isSpillCode) #define O64_Interface_Operation_isVolatile (*O64_instance->Interface_Operation_isVolatile) #define O64_Interface_Operation_isHoisted (*O64_instance->Interface_Operation_isHoisted) #define O64_Interface_Label_identity (*O64_instance->Interface_Label_identity) #define O64_Interface_Label_name (*O64_instance->Interface_Label_name) #define O64_Interface_BasicBlock_identity (*O64_instance->Interface_BasicBlock_identity) #define O64_Interface_BasicBlock_unrolled (*O64_instance->Interface_BasicBlock_unrolled) #define O64_Interface_BasicBlock_traceId (*O64_instance->Interface_BasicBlock_traceId) #define O64_Interface_LoopScope_identity (*O64_instance->Interface_LoopScope_identity) #define O64_Interface_LoopScope_unrolled (*O64_instance->Interface_LoopScope_unrolled) #define O64_Interface_makeOperation (*O64_instance->Interface_makeOperation) #define O64_Interface_findOperation (*O64_instance->Interface_findOperation) #define O64_Interface_Operation_setSafeAccess (*O64_instance->Interface_Operation_setSafeAccess) #define O64_Interface_Operation_setHoisted (*O64_instance->Interface_Operation_setHoisted) #define O64_Interface_Operation_setVolatile (*O64_instance->Interface_Operation_setVolatile) #define O64_Interface_Operation_setPrefetch (*O64_instance->Interface_Operation_setPrefetch) #define O64_Interface_Operation_setPreload (*O64_instance->Interface_Operation_setPreload) #define O64_Interface_Operation_setBarrier (*O64_instance->Interface_Operation_setBarrier) #define O64_Interface_Operation_setSafePerfs (*O64_instance->Interface_Operation_setSafePerfs) #define O64_Interface_Operation_setSpillCode (*O64_instance->Interface_Operation_setSpillCode) #define O64_Interface_makeBasicBlock (*O64_instance->Interface_makeBasicBlock) #define O64_Interface_findBasicBlock (*O64_instance->Interface_findBasicBlock) #define O64_Interface_linkBasicBlocks (*O64_instance->Interface_linkBasicBlocks) #define O64_Interface_makeLoopScope (*O64_instance->Interface_makeLoopScope) #define O64_Interface_findLoopScope (*O64_instance->Interface_findLoopScope) #define O64_Interface_LoopScope_setDependenceNode (*O64_instance->Interface_LoopScope_setDependenceNode) #define O64_Interface_LoopScope_setDependenceArc (*O64_instance->Interface_LoopScope_setDependenceArc) #define O64_Interface_setBody (*O64_instance->Interface_setBody) #define O64_Interface_setEntry (*O64_instance->Interface_setEntry) #define O64_Interface_setExit (*O64_instance->Interface_setExit) #define O64_Interface_setStart (*O64_instance->Interface_setStart) #define O64_Interface_updateCGIR (*O64_instance->Interface_updateCGIR) #define O64_Interface_open (*O64_instance->Interface_open) #define O64_Interface_optimize (*O64_instance->Interface_optimize) #define O64_Interface_close (*O64_instance->Interface_close)