static {
   String[] regName = registerName;
   for (GPR r : GPR.values()) {
     regName[r.ordinal() + FIRST_INT] = r.toString();
   }
   if (SSE2_FULL) {
     for (XMM r : XMM.values()) {
       regName[r.ordinal() + FIRST_DOUBLE] = r.toString();
     }
   } else {
     for (FPR r : FPR.values()) {
       regName[r.ordinal() + FIRST_DOUBLE] = r.toString();
     }
   }
   regName[THREAD_REGISTER.value()] = "TR";
   regName[AF] = "AF";
   regName[CF] = "CF";
   regName[OF] = "OF";
   regName[PF] = "PF";
   regName[SF] = "SF";
   regName[ZF] = "ZF";
   regName[ST0] = "ST0";
   regName[ST1] = "ST1";
 }
  public PhysicalRegisterSet() {

    // 1. Create all the physical registers in the pool.
    for (int i = 0; i < reg.length; i++) {
      Register r = new Register(i);
      r.setPhysical();
      reg[i] = r;
    }

    // 2. Set the 'integer' attribute on each GPR
    for (int i = FIRST_INT; i < FIRST_DOUBLE; i++) {
      reg[i].setInteger();
    }

    // 3. Set the 'double' attribute on each FPR
    for (int i = FIRST_DOUBLE; i < FIRST_SPECIAL; i++) {
      reg[i].setDouble();
    }

    // 4. set up the volatile GPRs
    for (Enumeration<Register> e = enumerateVolatileGPRs(); e.hasMoreElements(); ) {
      Register r = e.nextElement();
      r.setVolatile();
    }

    // 5. set up the non-volatile GPRs
    for (Enumeration<Register> e = enumerateNonvolatileGPRs(); e.hasMoreElements(); ) {
      Register r = e.nextElement();
      r.setNonVolatile();
    }

    // 6. set properties on some special registers
    reg[AF].setSpansBasicBlock();
    reg[CF].setSpansBasicBlock();
    reg[OF].setSpansBasicBlock();
    reg[PF].setSpansBasicBlock();
    reg[SF].setSpansBasicBlock();
    reg[ZF].setSpansBasicBlock();
    reg[C0].setSpansBasicBlock();
    reg[C1].setSpansBasicBlock();
    reg[C2].setSpansBasicBlock();
    reg[C3].setSpansBasicBlock();
    reg[THREAD_REGISTER.value()].setSpansBasicBlock();

    // For SSE2
    reg[ST0].setDouble();
    reg[ST1].setDouble();

    // 7. set up the volatile FPRs
    for (Enumeration<Register> e = enumerateVolatileFPRs(); e.hasMoreElements(); ) {
      Register r = e.nextElement();
      r.setVolatile();
    }

    // 8. set up the non-volatile FPRs
    for (Enumeration<Register> e = enumerateNonvolatileFPRs(); e.hasMoreElements(); ) {
      Register r = e.nextElement();
      r.setNonVolatile();
    }

    // 9. Cache the volatile registers for efficiency
    volatileSet = new BitSet(this);
    for (Enumeration<Register> e = enumerateVolatiles(); e.hasMoreElements(); ) {
      Register r = e.nextElement();
      volatileSet.add(r);
    }

    // 10. Cache the FPRs for efficiency
    fpSet = new BitSet(this);
    for (Enumeration<Register> e = enumerateFPRs(); e.hasMoreElements(); ) {
      Register r = e.nextElement();
      fpSet.add(r);
    }

    // Note no registers are excluded from live analysis (as is done for PPC)

  }