[llvm-commits] CVS: llvm/include/llvm/Reoptimizer/BinInterface/regmask.h
Anand Shukla
ashukla at cs.uiuc.edu
Sat May 31 17:17:01 PDT 2003
Changes in directory llvm/include/llvm/Reoptimizer/BinInterface:
regmask.h added (r1.1)
---
Log message:
First version of working bininterface API/implementation
---
Diffs of the changes:
Index: llvm/include/llvm/Reoptimizer/BinInterface/regmask.h
diff -c /dev/null llvm/include/llvm/Reoptimizer/BinInterface/regmask.h:1.1
*** /dev/null Sat May 31 17:16:57 2003
--- llvm/include/llvm/Reoptimizer/BinInterface/regmask.h Sat May 31 17:16:47 2003
***************
*** 0 ****
--- 1,162 ----
+ //===--------llvm/Reoptimizer/BinInterface/regmask.h--------------*- C++ -*--=//
+ //
+ // Efficient bitfield based register tracker
+ // Register Allocator
+ //===----------------------------------------------------------------------===//
+
+
+ #ifndef __REGMASK_H__
+ #define __REGMASK_H__
+
+ #include "bitmath.h"
+ #include <vector>
+ #include <iostream>
+
+ #define VREG_ISMEM(x) (x >= 32)
+ #define VREG_ISREG(x) (x < 32)
+ #define VREG_GETMEM(x) ((x-32) * 8)
+
+ using std::vector;
+
+ class regmask32
+ {
+ private:
+ unsigned freemap;
+
+ public:
+
+ // Construct freemap, initially mark everyone free
+ regmask32()
+ : freemap(~0)
+ {
+ //allocreg(); //alloc reg 0 so its never allocated
+ }
+
+ // returns 0 on failure
+ unsigned allocreg()
+ {
+
+ //freemap &= ~1;
+ unsigned mask = LOWEST_BIT(freemap); // on fail this will be 0
+ freemap &= ~mask; // on fail this will be a nop
+
+ // log2(0) == log2(1) == 0 (in this implementation!)
+ //std::cout<<log2_bits32(mask)<<"\t -----\n";
+ //printf("Mask = %x\n", mask);
+ return log2_bits32(mask);
+
+ // I fully realize log2(0) is undefined
+ // mathematically
+ }
+
+ // free a register
+ void freereg(unsigned idx)
+ {
+ //if(idx == 0)
+ //return;
+
+ freemap |= 1 << (idx & 31); // mark it free
+ }
+
+ // force the register 'in-use'
+ void grabreg(unsigned idx)
+ {
+ freemap &= ~(1 << (idx & 31)); // grab it
+ }
+
+ void set(unsigned mask)
+ {
+ freemap = mask;
+ // freemap &= ~1; //so first reg is allocated
+ }
+
+ // count how many are free in the lowest 32.
+ unsigned count()
+ {
+ return countbits_dense(freemap);
+ }
+
+ // get the mask of free registers
+ unsigned free()
+ {
+ return freemap;
+ }
+ };
+
+
+ class regmask
+ {
+ private:
+ vector<regmask32> freemap;
+
+ unsigned i_allocreg(unsigned int baseindex)
+ {
+ for (;baseindex<freemap.size(); baseindex++)
+ if (freemap[baseindex].free())
+ {
+ unsigned d = freemap[baseindex].allocreg();
+ return (baseindex << 5) + d;
+ }
+ return 0;
+ }
+
+ public:
+ // Construct freemap, initially mark everyone free
+ regmask(unsigned maxregs)
+ {
+ // make sure maxregs is a multiple of 32
+ assert(!(maxregs & 0x1F));
+
+ // calculate size of freemap
+ //freemap.inc( maxregs >> 5 );
+ freemap.resize(maxregs >> 5);
+ for (unsigned int k = 0; k < freemap.size(); k++)
+ freemap[k].set(~0);
+ }
+
+ // returns 0 on failure
+ unsigned allocreg()
+ {
+ return i_allocreg(0); // alloc physical or memory
+ }
+
+ unsigned allocmemreg()
+ {
+ return i_allocreg(1); // force memory
+ }
+
+ // returns 0 on failure
+ unsigned allocreg32() // allocate register from first 32 only
+ {
+ return freemap[0].allocreg();
+ }
+
+ void freereg(unsigned idx)
+ {
+ freemap[idx >> 5].freereg(idx & 31);
+ }
+
+ void grabreg(unsigned idx)
+ {
+ freemap[idx >> 5].grabreg(idx & 31); // grab it
+ }
+
+ void set32(unsigned mask)
+ {
+ freemap[0].set(mask);
+ }
+
+ // count how many are free in the lowest 32.
+ unsigned count32()
+ {
+ return freemap[0].count();
+ }
+
+ unsigned free32()
+ {
+ return freemap[0].free();
+ }
+ };
+
+ #endif
+
More information about the llvm-commits
mailing list