001/*
002 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 *  This file is licensed to You under the Eclipse Public License (EPL);
005 *  You may not use this file except in compliance with the License. You
006 *  may obtain a copy of the License at
007 *
008 *      http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 *  See the COPYRIGHT.txt file distributed with this work for information
011 *  regarding copyright ownership.
012 */
013package org.jikesrvm.compilers.opt.lir2mir.ppc_64;
014
015import static org.jikesrvm.compilers.opt.ir.Operators.*;
016import static org.jikesrvm.compilers.opt.lir2mir.ppc_64.BURS_Definitions.*;
017
018import org.jikesrvm.*;
019import org.jikesrvm.compilers.opt.*;
020import org.jikesrvm.compilers.opt.depgraph.DepGraphNode;
021import org.jikesrvm.compilers.opt.ir.*;
022import org.jikesrvm.compilers.opt.ir.operand.*;
023import org.jikesrvm.compilers.opt.ir.operand.ppc.*;
024import org.jikesrvm.compilers.opt.lir2mir.AbstractBURS_TreeNode;
025
026import org.vmmagic.pragma.Inline;
027
028/**
029 * An BURS_TreeNode is a node in a binary tree that is fed
030 * as input to BURS.
031 * <p>
032 * Machine-generated, do not edit! If you need to make changes
033 * to this file, edit BURS_TreeNode.template.
034 *
035 * @see org.jikesrvm.compilers.opt.lir2mir.BURS
036 * @see BURS_STATE
037 */
038public class BURS_TreeNode extends AbstractBURS_TreeNode {
039
040  /**
041   * Constructor for interior node.
042   *
043   * @param n corresponding node from the dependence graph
044   */
045  public BURS_TreeNode(DepGraphNode n) {
046    super(n);
047  }
048
049  /**
050   * Constructor for leaf/auxiliary node.
051   *
052   * @param opcode the opcode to use for the node
053   */
054  public BURS_TreeNode(char opcode) {
055    super(opcode);
056  }
057
058/**** remainder will be inserted by the BURS generator *********/
059
060// program generated file, do not edit
061
062  // cost for each non-terminal
063  private char cost_stm;
064  private char cost_r;
065  private char cost_czr;
066  private char cost_rs;
067  private char cost_rz;
068  private char cost_rp;
069  private char cost_any;
070  private char cost_boolcmp;
071
072  // rule for each non-terminal
073  private int word0;
074     // stm; word:0 offset:0, bits:7, 82 rules);
075     // r; word:0 offset:7, bits:7, 122 rules);
076     // czr; word:0 offset:14, bits:1, 1 rules);
077     // rs; word:0 offset:15, bits:5, 19 rules);
078     // rz; word:0 offset:20, bits:4, 10 rules);
079     // rp; word:0 offset:24, bits:4, 15 rules);
080     // any; word:0 offset:28, bits:3, 6 rules);
081  private int word1;
082     // boolcmp; word:1 offset:0, bits:4, 8 rules);
083
084  public final char getCost(int goalNT) {
085    switch(goalNT) {
086    case stm_NT:    return cost_stm;
087    case r_NT:    return cost_r;
088    case czr_NT:    return cost_czr;
089    case rs_NT:    return cost_rs;
090    case rz_NT:    return cost_rz;
091    case rp_NT:    return cost_rp;
092    case any_NT:    return cost_any;
093    default:       return cost_boolcmp;
094    }
095  }
096
097  public final void setCost(int goalNT, char cost) {
098    switch(goalNT) {
099    case stm_NT:    cost_stm = cost; break;
100    case r_NT:    cost_r = cost; break;
101    case czr_NT:    cost_czr = cost; break;
102    case rs_NT:    cost_rs = cost; break;
103    case rz_NT:    cost_rz = cost; break;
104    case rp_NT:    cost_rp = cost; break;
105    case any_NT:    cost_any = cost; break;
106    default:       cost_boolcmp = cost; break;
107    }
108  }
109
110  @Override
111  public final void initCost() {
112    cost_stm = 
113    cost_r = 
114    cost_czr = 
115    cost_rs = 
116    cost_rz = 
117    cost_rp = 
118    cost_any = 
119    cost_boolcmp = 
120          0x7fff;
121    word0 = 0;
122    word1 = 0;
123
124  }
125
126  @Override
127  public final void writePacked(int word, int mask, int shiftedValue) {
128
129    switch(word) {
130    case 0: word0 = (word0 & mask) | shiftedValue; break;
131    case 1: word1 = (word1 & mask) | shiftedValue; break;
132
133    default: OptimizingCompilerException.UNREACHABLE();
134    }
135
136  }
137
138  @Override
139  public final int readPacked(int word, int shift, int mask) {
140
141    switch(word) {
142    case 0: return (word0 >>> shift) & mask;
143    case 1: return (word1 >>> shift) & mask;
144
145    default: OptimizingCompilerException.UNREACHABLE(); return -1;
146    }
147
148  }
149
150  /**
151   * Get the BURS rule number associated with this tree node for a given non-terminal
152   *
153   * @param goalNT the non-terminal we want to know the rule for (e.g. stm_NT)
154   * @return the rule number
155   */
156  @Inline
157  public final int rule(int goalNT) {
158    int stateNT;
159    switch(goalNT) {
160    case stm_NT:
161      stateNT = readPacked(0, 0, 0x7F);
162      break;
163    case r_NT:
164      stateNT = readPacked(0, 7, 0x7F);
165      break;
166    case czr_NT:
167      stateNT = readPacked(0, 14, 0x1);
168      break;
169    case rs_NT:
170      stateNT = readPacked(0, 15, 0x1F);
171      break;
172    case rz_NT:
173      stateNT = readPacked(0, 20, 0xF);
174      break;
175    case rp_NT:
176      stateNT = readPacked(0, 24, 0xF);
177      break;
178    case any_NT:
179      stateNT = readPacked(0, 28, 0x7);
180      break;
181    default: // boolcmp_NT
182      stateNT = readPacked(1, 0, 0xF);
183      break;
184    }
185    return BURS_STATE.decode(goalNT, stateNT);
186  }
187}
188