nv50_ir_util.h revision 57594065c30feec9376be9b2132659f7d87362ee
157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#ifndef __NV50_IR_UTIL_H__ 357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define __NV50_IR_UTIL_H__ 457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include <new> 657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include <assert.h> 757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include <stdio.h> 857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include "util/u_inlines.h" 1057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include "util/u_memory.h" 1157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define ERROR(args...) debug_printf("ERROR: " args) 1357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define WARN(args...) debug_printf("WARNING: " args) 1457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define INFO(args...) debug_printf(args) 1557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define INFO_DBG(m, f, args...) \ 1757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller do { \ 1857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (m & NV50_IR_DEBUG_##f) \ 1957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller debug_printf(args); \ 2057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } while(0) 2157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define FATAL(args...) \ 2357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller do { \ 2457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fprintf(stderr, args); \ 2557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller abort(); \ 2657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } while(0) 2757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define NV50_IR_FUNC_ALLOC_OBJ_DEF(obj, f, args...) \ 3057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller new ((f)->getProgram()->mem_##obj.allocate()) obj(f, args) 3157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 3257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define new_Instruction(f, args...) \ 3357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_FUNC_ALLOC_OBJ_DEF(Instruction, f, args) 3457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define new_CmpInstruction(f, args...) \ 3557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_FUNC_ALLOC_OBJ_DEF(CmpInstruction, f, args) 3657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define new_TexInstruction(f, args...) \ 3757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_FUNC_ALLOC_OBJ_DEF(TexInstruction, f, args) 3857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define new_FlowInstruction(f, args...) \ 3957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_FUNC_ALLOC_OBJ_DEF(FlowInstruction, f, args) 4057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define new_LValue(f, args...) \ 4257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_FUNC_ALLOC_OBJ_DEF(LValue, f, args) 4357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define NV50_IR_PROG_ALLOC_OBJ_DEF(obj, p, args...) \ 4657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller new ((p)->mem_##obj.allocate()) obj(p, args) 4757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define new_Symbol(p, args...) \ 4957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_PROG_ALLOC_OBJ_DEF(Symbol, p, args) 5057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define new_ImmediateValue(p, args...) \ 5157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_PROG_ALLOC_OBJ_DEF(ImmediateValue, p, args) 5257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 5357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 5457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define delete_Instruction(p, insn) (p)->releaseInstruction(insn) 5557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define delete_Value(p, val) (p)->releaseValue(val) 5657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 5757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 5857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace nv50_ir { 5957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 6057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Iterator 6157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 6257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 6357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual void next() = 0; 6457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual void *get() const = 0; 6557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual bool end() const = 0; // if true, get will return 0 6657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 6757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 6857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass ManipIterator : public Iterator 6957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 7057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 7157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual bool insert(void *) = 0; // insert after current position 7257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual void erase() = 0; 7357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 7457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 7557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// WARNING: do not use a->prev/next for __item or __list 7657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 7757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define DLLIST_DEL(__item) \ 7857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller do { \ 7957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__item)->prev->next = (__item)->next; \ 8057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__item)->next->prev = (__item)->prev; \ 8157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__item)->next = (__item); \ 8257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__item)->prev = (__item); \ 8357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } while(0) 8457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 8557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define DLLIST_ADDTAIL(__list, __item) \ 8657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller do { \ 8757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__item)->next = (__list); \ 8857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__item)->prev = (__list)->prev; \ 8957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__list)->prev->next = (__item); \ 9057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__list)->prev = (__item); \ 9157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } while(0) 9257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 9357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define DLLIST_ADDHEAD(__list, __item) \ 9457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller do { \ 9557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__item)->prev = (__list); \ 9657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__item)->next = (__list)->next; \ 9757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__list)->next->prev = (__item); \ 9857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__list)->next = (__item); \ 9957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } while(0) 10057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 10157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define DLLIST_MERGE(__listA, __listB, ty) \ 10257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller do { \ 10357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ty prevB = (__listB)->prev; \ 10457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__listA)->prev->next = (__listB); \ 10557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__listB)->prev->next = (__listA); \ 10657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__listB)->prev = (__listA)->prev; \ 10757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (__listA)->prev = prevB; \ 10857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } while(0) 10957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 11057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define DLLIST_FOR_EACH(list, it) \ 11157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (DLList::Iterator (it) = (list)->iterator(); !(it).end(); (it).next()) 11257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 11357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass DLList 11457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 11557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 11657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller class Item 11757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 11857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 11957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item(void *priv) : next(this), prev(this), data(priv) { } 12057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 12257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item *next; 12357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item *prev; 12457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void *data; 12557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 12657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DLList() : head(0) { } 12857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~DLList() { clear(); } 12957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void insertHead(void *data) 13157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 13257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item *item = new Item(data); 13357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(data); 13557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller item->prev = &head; 13757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller item->next = head.next; 13857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller head.next->prev = item; 13957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller head.next = item; 14057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 14157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 14257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void insertTail(void *data) 14357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 14457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item *item = new Item(data); 14557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 14657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(data); 14757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 14857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DLLIST_ADDTAIL(&head, item); 14957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 15057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void insert(void *data) { insertTail(data); } 15257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void clear(); 15457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller class Iterator : public ManipIterator 15657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 15757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 15857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Iterator(Item *head, bool r) : rev(r), pos(r ? head->prev : head->next), 15957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller term(head) { } 16057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual void next() { if (!end()) pos = rev ? pos->prev : pos->next; } 16257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual void *get() const { return pos->data; } 16357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual bool end() const { return pos == term; } 16457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // caution: if you're at end-2 and erase it, then do next, you're at end 16657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual void erase(); 16757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual bool insert(void *data); 16857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // move item to a another list, no consistency with its iterators though 17057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void moveToList(DLList&); 17157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 17257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller private: 17357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const bool rev; 17457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item *pos; 17557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item *term; 17657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 17757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller friend class DLList; 17857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 17957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 18057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void erase(Iterator& pos) 18157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 18257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller pos.erase(); 18357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 18457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 18557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Iterator iterator() 18657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 18757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return Iterator(&head, false); 18857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 18957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 19057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Iterator revIterator() 19157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 19257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return Iterator(&head, true); 19357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 19457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 19557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 19657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item head; 19757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 19857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 19957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Stack 20057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 20157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 20257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller class Item { 20357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 20457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller union { 20557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void *p; 20657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int i; 20757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int u; 20857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller float f; 20957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller double d; 21057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } u; 21157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 21257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item() { memset(&u, 0, sizeof(u)); } 21357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 21457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 21557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack() : size(0), limit(0), array(0) { } 21657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~Stack() { if (array) FREE(array); } 21757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 21857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void push(int i) { Item data; data.u.i = i; push(data); } 21957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void push(unsigned int u) { Item data; data.u.u = u; push(data); } 22057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void push(void *p) { Item data; data.u.p = p; push(data); } 22157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void push(float f) { Item data; data.u.f = f; push(data); } 22257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 22357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void push(Item data) 22457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 22557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (size == limit) 22657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller resize(); 22757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller array[size++] = data; 22857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 22957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 23057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline Item pop() 23157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 23257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!size) { 23357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item data; 23457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 23557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return data; 23657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 23757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return array[--size]; 23857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 23957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline unsigned int getSize() { return size; } 24157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline Item& peek() { assert(size); return array[size - 1]; } 24357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void clear(bool releaseStorage = false) 24557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 24657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (releaseStorage && array) 24757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(array); 24857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller size = limit = 0; 24957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 25057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void moveTo(Stack&); // move all items to target (not like push(pop())) 25257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 25457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void resize() 25557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 25657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int sizeOld, sizeNew; 25757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sizeOld = limit * sizeof(Item); 25957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller limit = MAX2(4, limit + limit); 26057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sizeNew = limit * sizeof(Item); 26157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 26257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller array = (Item *)REALLOC(array, sizeOld, sizeNew); 26357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 26457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 26557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int size; 26657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int limit; 26757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item *array; 26857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 26957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 27057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass DynArray 27157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 27257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 27357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller class Item 27457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 27557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 27657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller union { 27757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t u32; 27857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void *p; 27957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 28057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 28157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DynArray() : data(NULL), size(0) { } 28357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~DynArray() { if (data) FREE(data); } 28557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline Item& operator[](unsigned int i) 28757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 28857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i >= size) 28957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller resize(i); 29057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return data[i]; 29157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 29257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 29357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline const Item operator[](unsigned int i) const 29457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 29557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return data[i]; 29657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 29757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 29857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void resize(unsigned int index) 29957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 30057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned int oldSize = size * sizeof(Item); 30157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 30257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!size) 30357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller size = 8; 30457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller while (size <= index) 30557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller size <<= 1; 30657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 30757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller data = (Item *)REALLOC(data, oldSize, size * sizeof(Item)); 30857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 30957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 31057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 31157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Item *data; 31257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int size; 31357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 31457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 31557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass ArrayList 31657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 31757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 31857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ArrayList() : size(0) { } 31957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 32057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void insert(void *item, int& id) 32157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 32257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller id = ids.getSize() ? ids.pop().u.i : size++; 32357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller data[id].p = item; 32457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 32557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 32657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void remove(int& id) 32757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 32857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned int uid = id; 32957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(uid < size && data[id].p); 33057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ids.push(uid); 33157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller data[uid].p = NULL; 33257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller id = -1; 33357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 33457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline int getSize() const { return size; } 33657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void *get(unsigned int id) { assert(id < size); return data[id].p; } 33857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller class Iterator : public nv50_ir::Iterator 34057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 34157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 34257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Iterator(const ArrayList *array) : pos(0), data(array->data) 34357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 34457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller size = array->getSize(); 34557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (size) 34657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nextValid(); 34757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 34857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 34957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void nextValid() { while ((pos < size) && !data[pos].p) ++pos; } 35057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 35157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void next() { if (pos < size) { ++pos; nextValid(); } } 35257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void *get() const { assert(pos < size); return data[pos].p; } 35357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool end() const { return pos >= size; } 35457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 35557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller private: 35657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int pos; 35757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int size; 35857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const DynArray& data; 35957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 36057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller friend class ArrayList; 36157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 36257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 36357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Iterator iterator() const { return Iterator(this); } 36457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 36557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 36657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DynArray data; 36757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack ids; 36857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int size; 36957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 37057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 37157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Interval 37257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 37357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 37457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Interval() : head(0), tail(0) { } 37557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~Interval(); 37657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 37757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool extend(int, int); 37857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void unify(Interval&); // clears source interval 37957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void clear(); 38057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 38157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline int begin() { return head ? head->bgn : -1; } 38257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline int end() { checkTail(); return tail ? tail->end : -1; } 38357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline bool isEmpty() const { return !head; } 38457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool overlaps(const Interval&) const; 38557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool contains(int pos); 38657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 38757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void print() const; 38857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 38957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void checkTail() const; 39057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 39157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 39257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller class Range 39357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 39457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 39557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Range(int a, int b) : next(0), bgn(a), end(b) { } 39657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 39757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Range *next; 39857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int bgn; 39957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int end; 40057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 40157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void coalesce(Range **ptail) 40257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 40357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Range *rnn; 40457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 40557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller while (next && end >= next->bgn) { 40657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(bgn <= next->bgn); 40757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller rnn = next->next; 40857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller end = MAX2(end, next->end); 40957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller delete next; 41057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller next = rnn; 41157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 41257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!next) 41357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller *ptail = this; 41457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 41557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 41657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 41757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Range *head; 41857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Range *tail; 41957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 42057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 42157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass BitSet 42257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 42357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 42457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BitSet() : marker(false), data(0), size(0) { } 42557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BitSet(unsigned int nBits, bool zero) : marker(false), data(0), size(0) 42657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 42757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller allocate(nBits, zero); 42857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 42957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~BitSet() 43057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 43157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (data) 43257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(data); 43357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 43457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 43557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool allocate(unsigned int nBits, bool zero); 43657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 43757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline unsigned int getSize() const { return size; } 43857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 43957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void fill(uint32_t val); 44057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 44157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void setOr(BitSet *, BitSet *); // second BitSet may be NULL 44257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 44357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void set(unsigned int i) 44457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 44557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i < size); 44657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller data[i / 32] |= 1 << (i % 32); 44757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 44857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 44957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void clr(unsigned int i) 45057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 45157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i < size); 45257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller data[i / 32] &= ~(1 << (i % 32)); 45357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 45457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 45557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline bool test(unsigned int i) const 45657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 45757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i < size); 45857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return data[i / 32] & (1 << (i % 32)); 45957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 46057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 46157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BitSet& operator|=(const BitSet&); 46257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 46357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BitSet& operator=(const BitSet& set) 46457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 46557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(data && set.data); 46657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(size == set.size); 46757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller memcpy(data, set.data, (set.size + 7) / 8); 46857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return *this; 46957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 47057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void andNot(const BitSet&); 47257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int popCount() const; 47457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void print() const; 47657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 47857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool marker; // for user 47957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 48057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 48157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t *data; 48257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int size; 48357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 48457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 48557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Interval::checkTail() const 48657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 48757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#if NV50_DEBUG & NV50_DEBUG_PROG_RA 48857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Range *r = head; 48957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller while (r->next) 49057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller r = r->next; 49157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(tail == r); 49257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif 49357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 49457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass MemoryPool 49657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 49757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 49857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline bool enlargeAllocationsArray(const unsigned int id, unsigned int nr) 49957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 50057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned int size = sizeof(uint8_t *) * id; 50157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned int incr = sizeof(uint8_t *) * nr; 50257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 50357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint8_t **alloc = (uint8_t **)REALLOC(allocArray, size, size + incr); 50457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!alloc) 50557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 50657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller allocArray = alloc; 50757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 50857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 50957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 51057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline bool enlargeCapacity() 51157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 51257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned int id = count >> objStepLog2; 51357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 51457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint8_t *const mem = (uint8_t *)MALLOC(objSize << objStepLog2); 51557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!mem) 51657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 51757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 51857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!(id % 32)) { 51957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!enlargeAllocationsArray(id, 32)) { 52057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(mem); 52157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 52257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 52357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 52457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller allocArray[id] = mem; 52557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 52657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 52757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 52857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 52957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller MemoryPool(unsigned int size, unsigned int incr) : objSize(size), 53057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller objStepLog2(incr) 53157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 53257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller allocArray = NULL; 53357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller released = NULL; 53457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller count = 0; 53557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 53657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 53757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~MemoryPool() 53857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 53957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int allocCount = (count + (1 << objStepLog2) - 1) >> objStepLog2; 54057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned int i = 0; i < allocCount && allocArray[i]; ++i) 54157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(allocArray[i]); 54257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (allocArray) 54357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(allocArray); 54457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 54557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 54657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void *allocate() 54757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 54857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void *ret; 54957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned int mask = (1 << objStepLog2) - 1; 55057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 55157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (released) { 55257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ret = released; 55357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller released = *(void **)released; 55457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return ret; 55557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 55657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 55757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!(count & mask)) 55857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!enlargeCapacity()) 55957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 56057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 56157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ret = allocArray[count >> objStepLog2] + (count & mask) * objSize; 56257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ++count; 56357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return ret; 56457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 56557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 56657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void release(void *ptr) 56757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 56857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller *(void **)ptr = released; 56957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller released = ptr; 57057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 57157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 57257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 57357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint8_t **allocArray; // array (list) of MALLOC allocations 57457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 57557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void *released; // list of released objects 57657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 57757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int count; // highest allocated object 57857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 57957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned int objSize; 58057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned int objStepLog2; 58157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 58257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 58357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace nv50_ir 58457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 58557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif // __NV50_IR_UTIL_H__ 586