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