1 bdemsky  1.1.2.1  // Jasmin.java, created Mon Aug  2 13:55:50 1999 by bdemsky
   2 bdemsky  1.1.2.1  // Copyright (C) 1999 Brian Demsky <bdemsky@mit.edu>
   3 bdemsky  1.1.2.1  // Licensed under the terms of the GNU GPL; see COPYING for details.
   4 bdemsky  1.1.2.1  package harpoon.IR.Jasmin;
   5 bdemsky  1.1.2.1  
   6 cananian 1.1.2.32 import harpoon.IR.Quads.AGET;
   7 cananian 1.1.2.32 import harpoon.IR.Quads.ALENGTH;
   8 cananian 1.1.2.32 import harpoon.IR.Quads.ANEW;
   9 cananian 1.1.2.32 import harpoon.IR.Quads.ARRAYINIT;
  10 cananian 1.1.2.32 import harpoon.IR.Quads.ASET;
  11 cananian 1.1.2.32 import harpoon.IR.Quads.CALL;
  12 cananian 1.1.2.32 import harpoon.IR.Quads.CJMP;
  13 cananian 1.1.2.32 import harpoon.IR.Quads.COMPONENTOF;
  14 cananian 1.1.2.32 import harpoon.IR.Quads.CONST;
  15 cananian 1.1.2.32 import harpoon.IR.Quads.FOOTER;
  16 cananian 1.1.2.32 import harpoon.IR.Quads.GET;
  17 cananian 1.1.2.32 import harpoon.IR.Quads.HANDLER;
  18 cananian 1.1.2.32 import harpoon.IR.Quads.HEADER;
  19 cananian 1.1.2.32 import harpoon.IR.Quads.INSTANCEOF;
  20 cananian 1.1.2.32 import harpoon.IR.Quads.LABEL;
  21 cananian 1.1.2.32 import harpoon.IR.Quads.METHOD;
  22 cananian 1.1.2.32 import harpoon.IR.Quads.MONITORENTER;
  23 cananian 1.1.2.32 import harpoon.IR.Quads.MONITOREXIT;
  24 cananian 1.1.2.32 import harpoon.IR.Quads.MOVE;
  25 cananian 1.1.2.32 import harpoon.IR.Quads.NEW;
  26 cananian 1.1.2.32 import harpoon.IR.Quads.NOP;
  27 cananian 1.1.2.32 import harpoon.IR.Quads.OPER;
  28 cananian 1.1.2.32 import harpoon.IR.Quads.PHI;
  29 cananian 1.1.2.32 import harpoon.IR.Quads.Qop;
  30 cananian 1.1.2.32 import harpoon.IR.Quads.Quad;
  31 cananian 1.1.2.32 import harpoon.IR.Quads.QuadVisitor;
  32 cananian 1.1.2.32 import harpoon.IR.Quads.QuadWithTry;
  33 cananian 1.1.2.32 import harpoon.IR.Quads.RETURN;
  34 cananian 1.1.2.32 import harpoon.IR.Quads.SET;
  35 cananian 1.1.2.32 import harpoon.IR.Quads.SWITCH;
  36 cananian 1.1.2.32 import harpoon.IR.Quads.THROW;
  37 cananian 1.1.2.32 import harpoon.IR.Quads.TYPECAST;
  38 cananian 1.1.2.35 import harpoon.IR.Quads.TYPESWITCH;
  39 bdemsky  1.1.2.1  import harpoon.Temp.Temp;
  40 cananian 1.1.2.32 import harpoon.ClassFile.HClass;
  41 cananian 1.1.2.32 import harpoon.ClassFile.HCode;
  42 cananian 1.1.2.32 import harpoon.ClassFile.HCodeElement;
  43 cananian 1.1.2.32 import harpoon.ClassFile.HField;
  44 cananian 1.1.2.32 import harpoon.ClassFile.HMethod;
  45 bdemsky  1.1.2.1  import harpoon.Analysis.UseDef;
  46 cananian 1.5      import net.cscott.jutil.WorkSet;
  47 bdemsky  1.1.2.16 import harpoon.Util.Util;
  48 bdemsky  1.1.2.1  import harpoon.Analysis.Maps.TypeMap;
  49 bdemsky  1.1.2.1  
  50 cananian 1.1.2.32 import java.io.PrintStream;
  51 bdemsky  1.1.2.1  import java.util.Set;
  52 bdemsky  1.1.2.1  import java.util.Map;
  53 bdemsky  1.1.2.1  import java.util.HashMap;
  54 bdemsky  1.1.2.1  import java.lang.reflect.Modifier;
  55 bdemsky  1.1.2.1  import java.util.Enumeration;
  56 bdemsky  1.1.2.1  import java.util.Iterator;
  57 bdemsky  1.1.2.1  
  58 bdemsky  1.1.2.1  /**
  59 bdemsky  1.1.2.13  * <code>Jasmin</code> converts from QuadWithTry to bytecode
  60 bdemsky  1.1.2.13  * formatted for the Jasmin assembler.  
  61 bdemsky  1.1.2.13  * Note:  Requires patch on 1.06 to do sane things with
  62 bdemsky  1.1.2.13  * fields.
  63 bdemsky  1.1.2.1   * @author  Brian Demsky <bdemsky@mit.edu>
  64 cananian 1.6       * @version $Id: Jasmin.java,v 1.6 2004/02/08 03:21:15 cananian Exp $
  65 bdemsky  1.1.2.1   */
  66 bdemsky  1.1.2.1  public class Jasmin {
  67 bdemsky  1.1.2.1      HCode[] hc;
  68 bdemsky  1.1.2.1      HMethod[] hm;
  69 bdemsky  1.1.2.1      HClass hclass;
  70 bdemsky  1.1.2.1      String classname;
  71 cananian 1.1.2.31     int andmask,  ormask;
  72 bdemsky  1.1.2.1  
  73 bdemsky  1.1.2.13     /**Creates a <code>Jasmin</code> object.*/
  74 bdemsky  1.1.2.1      public Jasmin(HCode[] hc, HMethod[] hm, HClass hclass) {
  75 bdemsky  1.1.2.1          this.hc = hc;
  76 bdemsky  1.1.2.1          this.hm = hm;
  77 bdemsky  1.1.2.1          this.hclass=hclass;
  78 bdemsky  1.1.2.1          this.classname=hclass.getName();
  79 cananian 1.1.2.31         this.andmask=Modifier.ABSTRACT|Modifier.FINAL|Modifier.INTERFACE|
  80 cananian 1.1.2.31             Modifier.NATIVE|Modifier.PRIVATE|Modifier.PROTECTED|Modifier.PUBLIC|
  81 cananian 1.1.2.31             Modifier.STATIC|Modifier.SYNCHRONIZED|Modifier.TRANSIENT|Modifier.VOLATILE;
  82 cananian 1.1.2.31         this.ormask=0;
  83 cananian 1.1.2.31     }
  84 cananian 1.1.2.31 
  85 cananian 1.1.2.31     /**Creates a <code>Jasmin</code> object.*/
  86 cananian 1.1.2.31     public Jasmin(HCode[] hc, HMethod[] hm, HClass hclass, int andmask, int ormask) {
  87 cananian 1.1.2.31         this.hc = hc;
  88 cananian 1.1.2.31         this.hm = hm;
  89 cananian 1.1.2.31         this.hclass=hclass;
  90 cananian 1.1.2.31         this.classname=hclass.getName();
  91 cananian 1.1.2.31         this.andmask=andmask;
  92 cananian 1.1.2.31         this.ormask=ormask;
  93 bdemsky  1.1.2.1      }
  94 bdemsky  1.1.2.1  
  95 bdemsky  1.1.2.13     /**Takes in a <code>PrintStream</code> 'out' and dumps
  96 bdemsky  1.1.2.13      * Jasmin formatted assembly code to it.*/
  97 bdemsky  1.1.2.1      public void outputClass(PrintStream out) {
  98 bdemsky  1.1.2.1          if (hclass.isInterface()) 
  99 cananian 1.1.2.31             out.println(".interface "+Modifier.toString(ormask|(andmask&hclass.getModifiers()))+" "+Util.jasminEscape(hclass.getName().replace('.','/')));
 100 bdemsky  1.1.2.1              else
 101 cananian 1.1.2.31         out.println(".class "+Modifier.toString(ormask|(andmask&hclass.getModifiers()))+" "+Util.jasminEscape(hclass.getName().replace('.','/')));
 102 cananian 1.1.2.31 
 103 bdemsky  1.1.2.20         if (hclass.getSuperclass()!=null)
 104 bdemsky  1.1.2.20             out.println(".super "+Util.jasminEscape(hclass.getSuperclass().getName().replace('.','/')));
 105 bdemsky  1.1.2.20         else
 106 cananian 1.1.2.31             if (hclass.isInterface())
 107 cananian 1.1.2.31                 out.println(".super java/lang/Object");
 108 bdemsky  1.1.2.13 
 109 bdemsky  1.1.2.13         //List the interfaces
 110 bdemsky  1.1.2.1          HClass[] interfaces=hclass.getInterfaces();
 111 bdemsky  1.1.2.1          for (int i=0;i<interfaces.length;i++)
 112 bdemsky  1.1.2.19             out.println(".implements "+Util.jasminEscape(interfaces[i].getName().replace('.','/')));
 113 bdemsky  1.1.2.1          HField[] hfields=hclass.getDeclaredFields();
 114 bdemsky  1.1.2.13 
 115 bdemsky  1.1.2.13         //List the fields
 116 bdemsky  1.1.2.1          for (int i=0;i<hfields.length;i++) {
 117 bdemsky  1.1.2.1              String value="";
 118 bdemsky  1.1.2.1              if (hfields[i].isConstant())
 119 cananian 1.1.2.31                 if (hfields[i].getType().getName().equals("java.lang.String"))
 120 bdemsky  1.1.2.19                     value=" = "+'"'+Util.jasminEscape(hfields[i].getConstant().toString())+'"';
 121 bdemsky  1.1.2.29                 else if (hfields[i].getType()==HClass.Float)
 122 bdemsky  1.1.2.29                     value=" = "+escapeFloat((Float)hfields[i].getConstant());
 123 bdemsky  1.1.2.29                 else if (hfields[i].getType()==HClass.Double)
 124 bdemsky  1.1.2.29                     value=" = "+escapeDouble((Double)hfields[i].getConstant());
 125 bdemsky  1.1.2.1                  else
 126 bdemsky  1.1.2.29                     value=" = "+Util.jasminEscape(hfields[i].getConstant().toString());
 127 cananian 1.1.2.31             out.println(".field "+Modifier.toString(ormask|(andmask&hfields[i].getModifiers()))+" "+Util.jasminEscape(hfields[i].getName()) +" "+Util.jasminEscape(hfields[i].getDescriptor())+value);
 128 bdemsky  1.1.2.1          }
 129 bdemsky  1.1.2.13 
 130 bdemsky  1.1.2.13         //List the methods
 131 bdemsky  1.1.2.1          for(int i=0;i<hc.length;i++) {
 132 bdemsky  1.1.2.1              outputMethod(out, i);
 133 bdemsky  1.1.2.1          }
 134 bdemsky  1.1.2.1      }
 135 bdemsky  1.1.2.1  
 136 bdemsky  1.1.2.13    
 137 bdemsky  1.1.2.13     private void outputMethod(PrintStream out, int i) {
 138 cananian 1.1.2.31         out.println(".method "+Modifier.toString(ormask|(andmask&hm[i].getModifiers()))+" "+Util.jasminEscape(hm[i].getName().replace('.','/'))
 139 bdemsky  1.1.2.19                     +Util.jasminEscape(hm[i].getDescriptor().replace('.','/')));
 140 bdemsky  1.1.2.13         //Get modifiers
 141 bdemsky  1.1.2.9          int modifiers=hm[i].getModifiers();
 142 bdemsky  1.1.2.13         //Only print method quads if it isn't Abstract
 143 bdemsky  1.1.2.28         if ((!Modifier.isAbstract(modifiers))&&
 144 bdemsky  1.1.2.28             (!Modifier.isNative(modifiers)))
 145 bdemsky  1.1.2.9              outputQuads(out, hm[i], hc[i]);
 146 bdemsky  1.1.2.13 
 147 bdemsky  1.1.2.1          out.println(".end method");
 148 bdemsky  1.1.2.1      }
 149 bdemsky  1.1.2.1  
 150 bdemsky  1.1.2.13     private void outputQuads(PrintStream out,HMethod hm, HCode hc) {
 151 bdemsky  1.1.2.13         //Output assembly from the quads
 152 bdemsky  1.1.2.13 
 153 bdemsky  1.1.2.16         TypeMap tp=((QuadWithTry)hc).typeMap();
 154 cananian 1.3.2.1          assert tp!=null : "Need TypeMap support";
 155 bdemsky  1.1.2.13         //Build mapping from temps to localvars/stack
 156 bdemsky  1.1.2.1          Object[] tuple=buildmap(hc,tp);
 157 bdemsky  1.1.2.13         //Store the map
 158 bdemsky  1.1.2.1          Map map=(Map) tuple[0];
 159 bdemsky  1.1.2.13         //Print out the number of local variables
 160 bdemsky  1.1.2.1          out.println("    .limit locals "+((Integer)tuple[1]).toString());
 161 bdemsky  1.1.2.13 
 162 bdemsky  1.1.2.13         //FIX ME
 163 bdemsky  1.1.2.1          //This is wrong....
 164 bdemsky  1.1.2.25         int depth=finddepth(map, tp, hm, hc);
 165 bdemsky  1.1.2.25 
 166 bdemsky  1.1.2.25         out.println("    .limit stack "+depth);
 167 bdemsky  1.1.2.1          WorkSet done=new WorkSet();
 168 bdemsky  1.1.2.1          Visitor visitor=new Visitor(out, map,hc,tp);
 169 bdemsky  1.1.2.1          Quad start=(Quad)hc.getRootElement();
 170 bdemsky  1.1.2.1          METHOD m=(METHOD)start.next(1);
 171 bdemsky  1.1.2.13         //Loop through the handlers
 172 bdemsky  1.1.2.13         //We do this to label the quad ranges protected by the handler
 173 bdemsky  1.1.2.1          for (int i=1;i<m.nextLength();i++) {
 174 bdemsky  1.1.2.1              HANDLER h=(HANDLER)m.next(i);
 175 bdemsky  1.1.2.1              visitor.labeler(h.next(0));
 176 bdemsky  1.1.2.1              Enumeration e=h.protectedQuads();
 177 bdemsky  1.1.2.1              while(e.hasMoreElements()) {
 178 bdemsky  1.1.2.1                  Quad q=(Quad)e.nextElement();
 179 bdemsky  1.1.2.1                  String tmp=visitor.labeler(q);
 180 bdemsky  1.1.2.22                 //tmp=visitor.labeler(q.next(0));
 181 bdemsky  1.1.2.1              }
 182 bdemsky  1.1.2.1          }
 183 bdemsky  1.1.2.13         //Visit all the quads
 184 bdemsky  1.1.2.1          visitAll(out,visitor,start.next(1), done);
 185 bdemsky  1.1.2.1      }
 186 bdemsky  1.1.2.1                   
 187 bdemsky  1.1.2.1      private static final void visitAll(PrintStream out, Visitor visitor, Quad start, Set qm) {
 188 bdemsky  1.1.2.13         //Visit the node passed to us
 189 cananian 1.1.2.14         start.accept(visitor);
 190 bdemsky  1.1.2.13         //If we have a node after us, but we've already printed it
 191 bdemsky  1.1.2.13         //we need to do a goto
 192 bdemsky  1.1.2.34         boolean sup=visitor.supGoto();
 193 bdemsky  1.1.2.34         if (sup==false)
 194 bdemsky  1.1.2.34             if (start.next().length!=0)
 195 bdemsky  1.1.2.34                 if (qm.contains(start.next(0)))
 196 bdemsky  1.1.2.33                     out.println("    goto "+visitor.labeler(start.next(0)));
 197 bdemsky  1.1.2.13         //add this node to the done list
 198 bdemsky  1.1.2.1          qm.add(start);
 199 bdemsky  1.1.2.13         //visit the kids
 200 bdemsky  1.1.2.1          Quad[] ql = start.next();
 201 bdemsky  1.1.2.1          for (int i=0; i<ql.length; i++) {
 202 bdemsky  1.1.2.1              if (qm.contains(ql[i])) continue; // skip if already done.
 203 bdemsky  1.1.2.1              visitAll(out, visitor, ql[i],qm);
 204 bdemsky  1.1.2.1          }
 205 bdemsky  1.1.2.1      }
 206 bdemsky  1.1.2.1  
 207 bdemsky  1.1.2.15     class CJMPVisitor extends QuadVisitor {
 208 bdemsky  1.1.2.15         private boolean cjmp;
 209 bdemsky  1.1.2.15         CJMPVisitor() {
 210 bdemsky  1.1.2.15             cjmp=false;
 211 bdemsky  1.1.2.15         }
 212 bdemsky  1.1.2.15         public void visit(Quad q) {
 213 bdemsky  1.1.2.15             cjmp=false;
 214 bdemsky  1.1.2.15         }
 215 bdemsky  1.1.2.15         public void visit(CJMP q) {
 216 bdemsky  1.1.2.15             cjmp=true;
 217 bdemsky  1.1.2.15         }
 218 bdemsky  1.1.2.15         public boolean cjmp() {
 219 bdemsky  1.1.2.15             return cjmp;
 220 bdemsky  1.1.2.15         }
 221 bdemsky  1.1.2.15     }
 222 bdemsky  1.1.2.15 
 223 bdemsky  1.1.2.13     /** This Visitor prints out opcodes for each quad visited.*/
 224 bdemsky  1.1.2.1  
 225 bdemsky  1.1.2.1      class Visitor extends QuadVisitor {
 226 bdemsky  1.1.2.1          PrintStream out;
 227 bdemsky  1.1.2.1          int label;
 228 bdemsky  1.1.2.1          Map tempmap;
 229 bdemsky  1.1.2.1          HashMap labelmap;
 230 bdemsky  1.1.2.1          HCode hc;
 231 bdemsky  1.1.2.1          TypeMap tm;
 232 bdemsky  1.1.2.15         UseDef ud;
 233 bdemsky  1.1.2.15         WorkSet skip;
 234 bdemsky  1.1.2.15         CJMPVisitor cjmp;
 235 bdemsky  1.1.2.33         boolean supGoto;
 236 bdemsky  1.1.2.1  
 237 bdemsky  1.1.2.1          Visitor(PrintStream out, Map tempmap, HCode hc, TypeMap tm) {
 238 bdemsky  1.1.2.1              this.out=out;
 239 bdemsky  1.1.2.1              this.label=0;
 240 bdemsky  1.1.2.1              this.tempmap=tempmap;
 241 bdemsky  1.1.2.1              this.hc=hc;
 242 bdemsky  1.1.2.1              labelmap=new HashMap();
 243 bdemsky  1.1.2.1              this.tm=tm;
 244 bdemsky  1.1.2.15             this.skip=new WorkSet();
 245 bdemsky  1.1.2.15             this.ud=new UseDef();
 246 bdemsky  1.1.2.15             this.cjmp=new CJMPVisitor();
 247 bdemsky  1.1.2.33             this.supGoto=false;
 248 bdemsky  1.1.2.1          }
 249 bdemsky  1.1.2.1  
 250 bdemsky  1.1.2.33         public boolean supGoto() {
 251 bdemsky  1.1.2.33             if (supGoto) {
 252 bdemsky  1.1.2.33                 supGoto=false;
 253 bdemsky  1.1.2.33                 return true;}
 254 bdemsky  1.1.2.33             return false;
 255 bdemsky  1.1.2.33         }
 256 bdemsky  1.1.2.33             
 257 bdemsky  1.1.2.33 
 258 bdemsky  1.1.2.1          public void visit(Quad q) {
 259 bdemsky  1.1.2.1              System.out.println("**********Unhandled quad"+q.toString());
 260 bdemsky  1.1.2.1          }
 261 bdemsky  1.1.2.1  
 262 bdemsky  1.1.2.1          public void visit(AGET q) {
 263 bdemsky  1.1.2.1              String operand="***AGET error";
 264 bdemsky  1.1.2.1  
 265 duncan   1.1.2.2              HClass ty = tm.typeMap(q, q.objectref());
 266 bdemsky  1.1.2.1              HClass tp=ty.getComponentType();
 267 bdemsky  1.1.2.1              if (tp==HClass.Boolean)
 268 bdemsky  1.1.2.1                  operand="baload";
 269 bdemsky  1.1.2.1              else if (tp==HClass.Byte)
 270 bdemsky  1.1.2.1                  operand="baload";
 271 bdemsky  1.1.2.1              else if(tp==HClass.Char)
 272 bdemsky  1.1.2.1                  operand="caload";
 273 bdemsky  1.1.2.1              else if (tp==HClass.Short)
 274 bdemsky  1.1.2.1                  operand="saload";
 275 bdemsky  1.1.2.1              else if (tp==HClass.Int)
 276 bdemsky  1.1.2.1                  operand="iaload";
 277 bdemsky  1.1.2.1              else if (tp==HClass.Double)
 278 bdemsky  1.1.2.1                  operand="daload";
 279 bdemsky  1.1.2.1              else if (tp==HClass.Float)
 280 bdemsky  1.1.2.1                  operand="faload";
 281 bdemsky  1.1.2.1              else if (tp==HClass.Long)
 282 bdemsky  1.1.2.1                  operand="laload";
 283 bdemsky  1.1.2.1              else
 284 bdemsky  1.1.2.1                  operand="aaload";
 285 bdemsky  1.1.2.1  
 286 bdemsky  1.1.2.1              out.println(iflabel(q));
 287 bdemsky  1.1.2.16             load(q,q.objectref());
 288 bdemsky  1.1.2.16             load(q,q.index());
 289 bdemsky  1.1.2.1              out.println("    "+operand);
 290 bdemsky  1.1.2.16             store(q,q.dst());
 291 bdemsky  1.1.2.22             out.println(iflabel2(q));
 292 bdemsky  1.1.2.1          }
 293 bdemsky  1.1.2.1  
 294 bdemsky  1.1.2.1          public void visit(ALENGTH q) {
 295 bdemsky  1.1.2.1              out.println(iflabel(q));
 296 bdemsky  1.1.2.16             load(q,q.objectref());
 297 bdemsky  1.1.2.1              out.println("    arraylength");
 298 bdemsky  1.1.2.16             store(q,q.dst());
 299 bdemsky  1.1.2.22             out.println(iflabel2(q));
 300 bdemsky  1.1.2.1          }
 301 bdemsky  1.1.2.1  
 302 bdemsky  1.1.2.1          public void visit(ANEW q) {
 303 bdemsky  1.1.2.1              out.println(iflabel(q));
 304 bdemsky  1.1.2.1              for (int i=0;i<q.dimsLength();i++)
 305 bdemsky  1.1.2.16                 load(q,q.dims(i));
 306 bdemsky  1.1.2.19             out.println("    multianewarray "+Util.jasminEscape(q.hclass().getName().replace('.','/')) +" "+q.dimsLength());
 307 bdemsky  1.1.2.16             store(q,q.dst());
 308 bdemsky  1.1.2.22             out.println(iflabel2(q));
 309 bdemsky  1.1.2.8          }
 310 bdemsky  1.1.2.8  
 311 bdemsky  1.1.2.8          public void visit(ARRAYINIT q) {
 312 bdemsky  1.1.2.8              out.println(iflabel(q));
 313 bdemsky  1.1.2.8              if (q.value().length>0)
 314 bdemsky  1.1.2.16                 load(q,q.objectref());
 315 bdemsky  1.1.2.8              for (int i=0;i<q.value().length;i++) {
 316 bdemsky  1.1.2.8                  if (q.type()==HClass.Boolean) {
 317 bdemsky  1.1.2.8                      Boolean b=(Boolean)q.value()[i];
 318 bdemsky  1.1.2.8                      dup(i,q.value().length);
 319 bdemsky  1.1.2.8                      out.println("    bipush "+(i+q.offset()));
 320 bdemsky  1.1.2.8                      if (b.booleanValue())
 321 bdemsky  1.1.2.8                          out.println("    iconst_1");
 322 bdemsky  1.1.2.8                      else
 323 bdemsky  1.1.2.8                          out.println("    iconst_0");
 324 bdemsky  1.1.2.8                      out.println("    bastore");
 325 bdemsky  1.1.2.8                  }
 326 bdemsky  1.1.2.8                  else if (q.type()==HClass.Int) {
 327 bdemsky  1.1.2.8                      dup(i,q.value().length);
 328 bdemsky  1.1.2.8                      out.println("    bipush "+(i+q.offset()));
 329 bdemsky  1.1.2.11                     out.println("    ldc "+q.value()[i].toString());
 330 bdemsky  1.1.2.8                      out.println("    iastore");
 331 bdemsky  1.1.2.8                  }
 332 bdemsky  1.1.2.11                 else if (q.type()==HClass.Byte) {
 333 bdemsky  1.1.2.8                      dup(i,q.value().length);
 334 bdemsky  1.1.2.8                      out.println("    bipush "+(i+q.offset()));
 335 bdemsky  1.1.2.8                      out.println("    bipush "+q.value()[i].toString());
 336 bdemsky  1.1.2.11                     out.println("    bastore");
 337 bdemsky  1.1.2.11                 }
 338 bdemsky  1.1.2.11                 else if (q.type()==HClass.Char) {
 339 bdemsky  1.1.2.11                     dup(i,q.value().length);
 340 bdemsky  1.1.2.11                     out.println("    bipush "+(i+q.offset()));
 341 bdemsky  1.1.2.23                     out.println("    sipush "+((int) (((Character)q.value()[i]).charValue())));
 342 bdemsky  1.1.2.8                      out.println("    castore");
 343 bdemsky  1.1.2.8                  }
 344 bdemsky  1.1.2.8                  else if (q.type()==HClass.Short) {
 345 bdemsky  1.1.2.8                      dup(i,q.value().length);
 346 bdemsky  1.1.2.8                      out.println("    bipush "+(i+q.offset()));
 347 bdemsky  1.1.2.8                      out.println("    sipush "+q.value()[i].toString());
 348 bdemsky  1.1.2.8                      out.println("    sastore");
 349 bdemsky  1.1.2.8                  }
 350 bdemsky  1.1.2.8                  else if (q.type()==HClass.Long) {
 351 bdemsky  1.1.2.8                      dup(i,q.value().length);
 352 bdemsky  1.1.2.8                      out.println("    bipush "+(i+q.offset()));
 353 bdemsky  1.1.2.8                      out.println("    ldc2_w "+q.value()[i].toString());
 354 bdemsky  1.1.2.8                      out.println("    lastore");
 355 bdemsky  1.1.2.8                  }
 356 bdemsky  1.1.2.8                  else if (q.type()==HClass.Double) {
 357 bdemsky  1.1.2.8                      dup(i,q.value().length);
 358 bdemsky  1.1.2.8                      out.println("    bipush "+(i+q.offset()));
 359 bdemsky  1.1.2.29                     out.println("    ldc2_w "+escapeDouble((Double)q.value()[i]));
 360 bdemsky  1.1.2.8                      out.println("    dastore");
 361 bdemsky  1.1.2.8                  }
 362 bdemsky  1.1.2.8                  else if (q.type()==HClass.Float) {
 363 bdemsky  1.1.2.8                      dup(i,q.value().length);
 364 bdemsky  1.1.2.8                      out.println("    bipush "+(i+q.offset()));
 365 bdemsky  1.1.2.29                     out.println("    ldc "+escapeFloat((Float)q.value()[i]));
 366 bdemsky  1.1.2.8                      out.println("    fastore");
 367 bdemsky  1.1.2.8                  }
 368 bdemsky  1.1.2.8              }
 369 bdemsky  1.1.2.22             out.println(iflabel2(q));
 370 bdemsky  1.1.2.8          }
 371 bdemsky  1.1.2.8         
 372 bdemsky  1.1.2.8          private void dup(int i, int last) {
 373 bdemsky  1.1.2.8              if ((i+1)!=last)
 374 bdemsky  1.1.2.8                  out.println("    dup");
 375 bdemsky  1.1.2.1          }
 376 bdemsky  1.1.2.1  
 377 bdemsky  1.1.2.1          public void visit(ASET q) {
 378 bdemsky  1.1.2.1              out.println(iflabel(q));
 379 bdemsky  1.1.2.1              String operand="***ASET error";
 380 duncan   1.1.2.2              HClass ty = tm.typeMap(q, q.objectref());
 381 bdemsky  1.1.2.1              HClass tp=ty.getComponentType();
 382 bdemsky  1.1.2.1              if (tp==HClass.Boolean)
 383 bdemsky  1.1.2.1                  operand="bastore";
 384 bdemsky  1.1.2.1              else if (tp==HClass.Byte)
 385 bdemsky  1.1.2.1                  operand="bastore";
 386 bdemsky  1.1.2.1              else if(tp==HClass.Char)
 387 bdemsky  1.1.2.1                  operand="castore";
 388 bdemsky  1.1.2.1              else if (tp==HClass.Short)
 389 bdemsky  1.1.2.1                  operand="sastore";
 390 bdemsky  1.1.2.1              else if (tp==HClass.Int)
 391 bdemsky  1.1.2.1                  operand="iastore";
 392 bdemsky  1.1.2.1              else if (tp==HClass.Double)
 393 bdemsky  1.1.2.1                  operand="dastore";
 394 bdemsky  1.1.2.1              else if (tp==HClass.Float)
 395 bdemsky  1.1.2.1                  operand="fastore";
 396 bdemsky  1.1.2.1              else if (tp==HClass.Long)
 397 bdemsky  1.1.2.1                  operand="lastore";
 398 bdemsky  1.1.2.1              else
 399 bdemsky  1.1.2.1                  operand="aastore";
 400 bdemsky  1.1.2.1  
 401 bdemsky  1.1.2.16             load(q,q.objectref());
 402 bdemsky  1.1.2.16             load(q,q.index());
 403 bdemsky  1.1.2.16             load(q,q.src());
 404 bdemsky  1.1.2.1              out.println("    "+operand); 
 405 bdemsky  1.1.2.22             out.println(iflabel2(q));
 406 bdemsky  1.1.2.1          }
 407 bdemsky  1.1.2.1  
 408 bdemsky  1.1.2.1          public void visit(COMPONENTOF q) {
 409 bdemsky  1.1.2.1              //kludge
 410 bdemsky  1.1.2.1              //fix me
 411 bdemsky  1.1.2.18             System.out.println("ERROR: "+q.toString());
 412 bdemsky  1.1.2.1              out.println(iflabel(q));
 413 bdemsky  1.1.2.1              TempInfo dest=(TempInfo)tempmap.get(q.objectref());     
 414 bdemsky  1.1.2.1              if (dest.stack)
 415 bdemsky  1.1.2.1                  out.println("    pop");
 416 bdemsky  1.1.2.1              dest=(TempInfo)tempmap.get(q.arrayref());
 417 bdemsky  1.1.2.1              if (dest.stack)
 418 bdemsky  1.1.2.1                  out.println("    pop");
 419 bdemsky  1.1.2.1              out.println("    bipush 1");
 420 bdemsky  1.1.2.16             store(q,q.dst());
 421 bdemsky  1.1.2.22             out.println(iflabel2(q));
 422 bdemsky  1.1.2.1          }
 423 bdemsky  1.1.2.1  
 424 bdemsky  1.1.2.1          public void visit(METHOD q) {
 425 bdemsky  1.1.2.1          }
 426 bdemsky  1.1.2.1  
 427 bdemsky  1.1.2.1          public void visit(HEADER q) {
 428 bdemsky  1.1.2.1          }
 429 bdemsky  1.1.2.1  
 430 bdemsky  1.1.2.1          public void visit(PHI q) {
 431 bdemsky  1.1.2.1              out.println(labeler(q)+":");
 432 bdemsky  1.1.2.22             out.println(iflabel2(q));
 433 bdemsky  1.1.2.1          }
 434 bdemsky  1.1.2.1  
 435 bdemsky  1.1.2.1          public void visit(FOOTER q) {
 436 bdemsky  1.1.2.1              out.println(labeler(q)+":");
 437 bdemsky  1.1.2.33             //not needed
 438 bdemsky  1.1.2.33             //      out.println("    return");
 439 bdemsky  1.1.2.22             out.println(iflabel2(q));
 440 bdemsky  1.1.2.1          }
 441 bdemsky  1.1.2.1  
 442 bdemsky  1.1.2.1          public void visit(HANDLER q) {
 443 bdemsky  1.1.2.1              Enumeration e=q.protectedQuads();
 444 bdemsky  1.1.2.1              String h=labeler(q);
 445 bdemsky  1.1.2.1              out.println(h+":");
 446 bdemsky  1.1.2.16             store(q,q.exceptionTemp());
 447 bdemsky  1.1.2.21             //out.println("    goto "+labeler(q.next(0)));
 448 bdemsky  1.1.2.21             //covered by default...
 449 bdemsky  1.1.2.1              while(e.hasMoreElements()) {
 450 bdemsky  1.1.2.1                  Quad qd=(Quad)e.nextElement();
 451 bdemsky  1.1.2.1                  String start=labeler(qd);
 452 bdemsky  1.1.2.22                 String stop=labeler2(qd);
 453 bdemsky  1.1.2.1                  String handler=labeler(q);
 454 bdemsky  1.1.2.1                  if (q.caughtException()!=null)
 455 bdemsky  1.1.2.19                     out.println(".catch "+Util.jasminEscape(q.caughtException().getName().replace('.','/'))+" from "+start+" to "+stop+" using "+handler);
 456 bdemsky  1.1.2.1                  else
 457 bdemsky  1.1.2.1                      out.println(".catch all from "+start+" to "+stop+" using "+handler);
 458 bdemsky  1.1.2.1              }
 459 bdemsky  1.1.2.1          }
 460 bdemsky  1.1.2.1  
 461 bdemsky  1.1.2.1          public void visit(INSTANCEOF q) {
 462 bdemsky  1.1.2.1              out.println(iflabel(q));
 463 bdemsky  1.1.2.16             load(q,q.src());
 464 bdemsky  1.1.2.19             out.println("    instanceof "+Util.jasminEscape(q.hclass().getName().replace('.','/')));
 465 bdemsky  1.1.2.16             store(q,q.dst());
 466 bdemsky  1.1.2.22             out.println(iflabel2(q));
 467 bdemsky  1.1.2.1          }
 468 bdemsky  1.1.2.1          
 469 bdemsky  1.1.2.1          public void visit(CALL q) {
 470 bdemsky  1.1.2.1              if (q.isVirtual()&&!q.isInterfaceMethod()) {
 471 bdemsky  1.1.2.1                  //virtual method
 472 bdemsky  1.1.2.1                  out.println(iflabel(q));
 473 bdemsky  1.1.2.1                  for(int i=0;i<q.params().length;i++) {
 474 bdemsky  1.1.2.16                     load(q,q.params(i)); 
 475 bdemsky  1.1.2.1                  }
 476 bdemsky  1.1.2.1                  out.println("    invokevirtual "+
 477 bdemsky  1.1.2.19                             Util.jasminEscape(q.method().getDeclaringClass().getName().replace('.','/'))
 478 bdemsky  1.1.2.19                             +"/"+Util.jasminEscape(q.method().getName().replace('.','/'))
 479 bdemsky  1.1.2.19                             +Util.jasminEscape(q.method().getDescriptor().replace('.','/')));
 480 bdemsky  1.1.2.1                  if (q.retval()!=null)
 481 bdemsky  1.1.2.16                     store(q,q.retval());
 482 bdemsky  1.1.2.1              } 
 483 bdemsky  1.1.2.1              else {
 484 bdemsky  1.1.2.1                  if (q.isInterfaceMethod()) {
 485 bdemsky  1.1.2.1                      out.println(iflabel(q));
 486 bdemsky  1.1.2.1                      for(int i=0;i<q.params().length;i++) {
 487 bdemsky  1.1.2.16                         load(q,q.params(i)); 
 488 bdemsky  1.1.2.1                      }
 489 bdemsky  1.1.2.1                      out.println("    invokeinterface "+
 490 bdemsky  1.1.2.19                                 Util.jasminEscape(q.method().getDeclaringClass().getName().replace('.','/'))
 491 bdemsky  1.1.2.19                                 +"/"+Util.jasminEscape(q.method().getName().replace('.','/'))
 492 bdemsky  1.1.2.19                                 +Util.jasminEscape(q.method().getDescriptor().replace('.','/'))
 493 bdemsky  1.1.2.1                                  +" "+q.params().length);
 494 bdemsky  1.1.2.1                      if (q.retval()!=null)
 495 bdemsky  1.1.2.16                         store(q,q.retval());
 496 bdemsky  1.1.2.1                  }
 497 bdemsky  1.1.2.1                  else
 498 bdemsky  1.1.2.1                      if(q.isStatic()) {
 499 bdemsky  1.1.2.1                          //static method
 500 bdemsky  1.1.2.1                          out.println(iflabel(q));
 501 bdemsky  1.1.2.1                          for(int i=0;i<q.params().length;i++) {
 502 bdemsky  1.1.2.16                             load(q,q.params(i)); 
 503 bdemsky  1.1.2.1                          }
 504 bdemsky  1.1.2.1                          out.println("    invokestatic "+
 505 bdemsky  1.1.2.19                             Util.jasminEscape(q.method().getDeclaringClass().getName().replace('.','/'))
 506 bdemsky  1.1.2.19                             +"/"+Util.jasminEscape(q.method().getName().replace('.','/'))
 507 bdemsky  1.1.2.19                             +Util.jasminEscape(q.method().getDescriptor().replace('.','/')));
 508 bdemsky  1.1.2.1                          if (q.retval()!=null)
 509 bdemsky  1.1.2.16                             store(q,q.retval());
 510 bdemsky  1.1.2.1                      }
 511 bdemsky  1.1.2.1                      else {
 512 bdemsky  1.1.2.1                                          //non-virtual method
 513 bdemsky  1.1.2.1                          out.println(iflabel(q));
 514 bdemsky  1.1.2.1                          for(int i=0;i<q.params().length;i++) {
 515 bdemsky  1.1.2.16                             load(q,q.params(i)); 
 516 bdemsky  1.1.2.1                          }
 517 bdemsky  1.1.2.1                          out.println("    invokespecial "+
 518 bdemsky  1.1.2.19                             Util.jasminEscape(q.method().getDeclaringClass().getName().replace('.','/'))
 519 bdemsky  1.1.2.19                             +"/"+Util.jasminEscape(q.method().getName().replace('.','/'))
 520 bdemsky  1.1.2.19                             +Util.jasminEscape(q.method().getDescriptor().replace('.','/')));
 521 bdemsky  1.1.2.1                          if (q.retval()!=null)
 522 bdemsky  1.1.2.16                             store(q,q.retval());
 523 bdemsky  1.1.2.1                      }
 524 bdemsky  1.1.2.1              }
 525 bdemsky  1.1.2.22             out.println(iflabel2(q));
 526 bdemsky  1.1.2.1          }
 527 bdemsky  1.1.2.1  
 528 bdemsky  1.1.2.1          public void visit(GET q) {
 529 bdemsky  1.1.2.1              if (q.objectref()==null) {
 530 bdemsky  1.1.2.1                  //Static
 531 bdemsky  1.1.2.1                  out.println(iflabel(q));
 532 bdemsky  1.1.2.1                  out.println("    getstatic "
 533 bdemsky  1.1.2.19                             +Util.jasminEscape(q.field().getDeclaringClass().getName().replace('.','/'))
 534 bdemsky  1.1.2.19                             +"/"+Util.jasminEscape(q.field().getName().replace('.','/'))
 535 bdemsky  1.1.2.19                             +" "+Util.jasminEscape(q.field().getDescriptor().replace('.','/')));
 536 bdemsky  1.1.2.1              }
 537 bdemsky  1.1.2.1              else {
 538 bdemsky  1.1.2.1                  out.println(iflabel(q));
 539 bdemsky  1.1.2.16                 load(q,q.objectref());
 540 bdemsky  1.1.2.1                  out.println("    getfield "
 541 bdemsky  1.1.2.19                             +Util.jasminEscape(q.field().getDeclaringClass().getName().replace('.','/'))
 542 bdemsky  1.1.2.19                             +"/"+Util.jasminEscape(q.field().getName().replace('.','/'))
 543 bdemsky  1.1.2.19                             +" "+Util.jasminEscape(q.field().getDescriptor().replace('.','/')));
 544 bdemsky  1.1.2.1              }
 545 bdemsky  1.1.2.16             store(q,q.dst());
 546 bdemsky  1.1.2.22             out.println(iflabel2(q));
 547 bdemsky  1.1.2.1          }
 548 bdemsky  1.1.2.1  
 549 bdemsky  1.1.2.1          public void visit(CJMP q) {
 550 bdemsky  1.1.2.24             out.println(iflabel(q));
 551 bdemsky  1.1.2.15             if (!skip.contains(q)) {
 552 bdemsky  1.1.2.16                 load(q,q.test());
 553 bdemsky  1.1.2.15                 out.println("    ifne "+labeler(q.next(1)));
 554 bdemsky  1.1.2.15             }
 555 bdemsky  1.1.2.22             out.println(iflabel2(q));
 556 bdemsky  1.1.2.1          }
 557 bdemsky  1.1.2.1  
 558 bdemsky  1.1.2.1          public void visit(THROW q) {
 559 bdemsky  1.1.2.33             supGoto=true;
 560 bdemsky  1.1.2.1              out.println(iflabel(q));
 561 bdemsky  1.1.2.16             load(q,q.throwable());
 562 bdemsky  1.1.2.1              out.println("    athrow");
 563 bdemsky  1.1.2.22             out.println(iflabel2(q));
 564 bdemsky  1.1.2.1          }
 565 bdemsky  1.1.2.1  
 566 bdemsky  1.1.2.1          public void visit(MONITORENTER q) {
 567 bdemsky  1.1.2.1              out.println(iflabel(q));
 568 bdemsky  1.1.2.16             load(q,q.lock());
 569 bdemsky  1.1.2.1              out.println("    monitorenter");
 570 bdemsky  1.1.2.22             out.println(iflabel2(q));
 571 bdemsky  1.1.2.1          }
 572 bdemsky  1.1.2.1  
 573 bdemsky  1.1.2.1          public void visit(MONITOREXIT q) {
 574 bdemsky  1.1.2.1              out.println(iflabel(q));
 575 bdemsky  1.1.2.16             load(q,q.lock());
 576 bdemsky  1.1.2.1              out.println("    monitorexit");
 577 bdemsky  1.1.2.22             out.println(iflabel2(q));
 578 bdemsky  1.1.2.1          }
 579 bdemsky  1.1.2.1  
 580 bdemsky  1.1.2.1          public void visit(MOVE q) {
 581 bdemsky  1.1.2.1              out.println(iflabel(q));
 582 bdemsky  1.1.2.16             load(q,q.src());
 583 bdemsky  1.1.2.16             store(q,q.dst());
 584 bdemsky  1.1.2.22             out.println(iflabel2(q));
 585 bdemsky  1.1.2.1          }
 586 bdemsky  1.1.2.1  
 587 bdemsky  1.1.2.1          public void visit(NEW q) {
 588 bdemsky  1.1.2.1              out.println(iflabel(q));
 589 bdemsky  1.1.2.19             out.println("    new "+Util.jasminEscape(q.hclass().getName().replace('.','/')));
 590 bdemsky  1.1.2.16             store(q,q.dst());
 591 bdemsky  1.1.2.22             out.println(iflabel2(q));
 592 bdemsky  1.1.2.1          }
 593 bdemsky  1.1.2.1  
 594 bdemsky  1.1.2.1          public void visit(LABEL q) {
 595 bdemsky  1.1.2.1              out.println(iflabel(q));
 596 bdemsky  1.1.2.1              out.println(";"+q.toString());
 597 bdemsky  1.1.2.22             out.println(iflabel2(q));
 598 bdemsky  1.1.2.1          }
 599 bdemsky  1.1.2.1  
 600 bdemsky  1.1.2.1          public void visit(NOP q) {
 601 bdemsky  1.1.2.1              out.println(iflabel(q));
 602 bdemsky  1.1.2.1              out.println("    nop");
 603 bdemsky  1.1.2.22             out.println(iflabel2(q));
 604 bdemsky  1.1.2.1          }
 605 bdemsky  1.1.2.1  
 606 bdemsky  1.1.2.1          public void visit(CONST q) {
 607 bdemsky  1.1.2.1              out.println(iflabel(q));
 608 bdemsky  1.1.2.1              if (q.value()!=null) {
 609 bdemsky  1.1.2.1                  HClass hclass=q.type();
 610 cananian 1.1.2.31                 if (hclass.getName().equals("java.lang.String"))
 611 bdemsky  1.1.2.19                     out.println("    ldc "+'"'+Util.jasminEscape(q.value().toString())+'"');
 612 bdemsky  1.1.2.1                  else
 613 bdemsky  1.1.2.29                     if (hclass==HClass.Double)
 614 bdemsky  1.1.2.29                         out.println("    ldc2_w "+escapeDouble((Double)q.value()));
 615 bdemsky  1.1.2.29                     else if (hclass==HClass.Long)
 616 bdemsky  1.1.2.1                          out.println("    ldc2_w "+q.value().toString());
 617 bdemsky  1.1.2.29                     else if (hclass==HClass.Float)
 618 bdemsky  1.1.2.29                         out.println("    ldc "+escapeFloat((Float)q.value()));
 619 bdemsky  1.1.2.1                      else
 620 bdemsky  1.1.2.1                          out.println("    ldc "+q.value().toString());
 621 bdemsky  1.1.2.1              }
 622 bdemsky  1.1.2.1              else out.println("    aconst_null");
 623 bdemsky  1.1.2.16             store(q,q.dst());
 624 bdemsky  1.1.2.22             out.println(iflabel2(q));
 625 bdemsky  1.1.2.1              //HClass.Void
 626 bdemsky  1.1.2.1          }
 627 bdemsky  1.1.2.1          
 628 bdemsky  1.1.2.1          public void visit(RETURN q) {
 629 bdemsky  1.1.2.33             supGoto=true;
 630 bdemsky  1.1.2.1              out.println(iflabel(q));
 631 bdemsky  1.1.2.1              if (q.retval()!=null) {
 632 bdemsky  1.1.2.1                  String operand="Error";
 633 duncan   1.1.2.2                  HClass tp=tm.typeMap(q,q.retval());
 634 bdemsky  1.1.2.1                  if ((tp==HClass.Boolean)||
 635 bdemsky  1.1.2.1                  (tp==HClass.Byte)||
 636 bdemsky  1.1.2.1                  (tp==HClass.Char)||
 637 bdemsky  1.1.2.1                  (tp==HClass.Short)||
 638 bdemsky  1.1.2.1                  (tp==HClass.Int))
 639 bdemsky  1.1.2.1                  operand="    ireturn";
 640 bdemsky  1.1.2.1              else
 641 bdemsky  1.1.2.1                  if (tp==HClass.Double)
 642 bdemsky  1.1.2.1                      operand="    dreturn";
 643 bdemsky  1.1.2.1                  else
 644 bdemsky  1.1.2.1                      if (tp==HClass.Float)
 645 bdemsky  1.1.2.1                          operand="    freturn";
 646 bdemsky  1.1.2.1                      else
 647 bdemsky  1.1.2.1                          if (tp==HClass.Long)
 648 bdemsky  1.1.2.1                              operand="    lreturn";
 649 bdemsky  1.1.2.1                          else
 650 bdemsky  1.1.2.1                              operand="    areturn";
 651 bdemsky  1.1.2.16                 load(q,q.retval());
 652 bdemsky  1.1.2.1                  out.println(operand);
 653 bdemsky  1.1.2.1              }
 654 bdemsky  1.1.2.1              else
 655 bdemsky  1.1.2.1                  out.println("    return");
 656 bdemsky  1.1.2.22             out.println(iflabel2(q));
 657 bdemsky  1.1.2.1          }
 658 bdemsky  1.1.2.1  
 659 bdemsky  1.1.2.1          public void visit(SET q) {
 660 bdemsky  1.1.2.1              if (q.objectref()==null) {
 661 bdemsky  1.1.2.1                  //Static
 662 bdemsky  1.1.2.1                  out.println(iflabel(q));
 663 bdemsky  1.1.2.16                 load(q,q.src());
 664 bdemsky  1.1.2.1                  out.println("    putstatic "
 665 bdemsky  1.1.2.19                             +Util.jasminEscape(q.field().getDeclaringClass().getName().replace('.','/'))
 666 bdemsky  1.1.2.19                             +"/"+Util.jasminEscape(q.field().getName().replace('.','/'))
 667 bdemsky  1.1.2.19                             +" "+Util.jasminEscape(q.field().getDescriptor().replace('.','/')));
 668 bdemsky  1.1.2.1              }
 669 bdemsky  1.1.2.1              else {
 670 bdemsky  1.1.2.1                  out.println(iflabel(q));
 671 bdemsky  1.1.2.16                 load(q,q.objectref());
 672 bdemsky  1.1.2.16                 load(q,q.src());
 673 bdemsky  1.1.2.1                  out.println("    putfield "
 674 bdemsky  1.1.2.19                             +Util.jasminEscape(q.field().getDeclaringClass().getName().replace('.','/'))
 675 bdemsky  1.1.2.19                             +"/"+Util.jasminEscape(q.field().getName().replace('.','/'))
 676 bdemsky  1.1.2.19                             +" "+Util.jasminEscape(q.field().getDescriptor().replace('.','/')));
 677 bdemsky  1.1.2.1              }
 678 bdemsky  1.1.2.22             out.println(iflabel2(q));
 679 bdemsky  1.1.2.1          }
 680 bdemsky  1.1.2.1  
 681 bdemsky  1.1.2.1          public void visit(SWITCH q) {
 682 bdemsky  1.1.2.1              out.println(iflabel(q));
 683 bdemsky  1.1.2.16             load(q,q.index());
 684 bdemsky  1.1.2.1              out.println("    lookupswitch");
 685 bdemsky  1.1.2.1              for(int i=0;i<q.keysLength();i++)
 686 bdemsky  1.1.2.1                  out.println("    "+q.keys(i)+" : "+labeler(q.next(i)));
 687 bdemsky  1.1.2.1              out.println("    default : "+labeler(q.next(q.keysLength())));
 688 bdemsky  1.1.2.22             out.println(iflabel2(q));
 689 cananian 1.1.2.35         }
 690 cananian 1.1.2.35         public void visit(TYPESWITCH q) {
 691 cananian 1.1.2.35             throw new Error("TYPESWITCH quads should be removed before "+
 692 cananian 1.1.2.35                             "running this pass!  Use TypeSwitchRemover.");
 693 bdemsky  1.1.2.1          }
 694 bdemsky  1.1.2.1  
 695 bdemsky  1.1.2.1          public void visit(TYPECAST q) {
 696 bdemsky  1.1.2.1              out.println(iflabel(q));
 697 bdemsky  1.1.2.16             load(q,q.objectref());
 698 bdemsky  1.1.2.19             out.println("    checkcast "+Util.jasminEscape(q.hclass().getName().replace('.','/')));
 699 bdemsky  1.1.2.4              TempInfo dest=(TempInfo)tempmap.get(q.objectref());
 700 bdemsky  1.1.2.24             store(q,q.objectref());
 701 bdemsky  1.1.2.22             out.println(iflabel2(q));
 702 bdemsky  1.1.2.1          }
 703 bdemsky  1.1.2.1  
 704 bdemsky  1.1.2.13         //This method handles operands
 705 bdemsky  1.1.2.13         //really 3 cases:
 706 bdemsky  1.1.2.13         //normal, compares that are done with compares,
 707 bdemsky  1.1.2.13         //compares done with conditional branches
 708 bdemsky  1.1.2.13 
 709 bdemsky  1.1.2.1          public void visit(OPER q) {
 710 bdemsky  1.1.2.1              out.println(iflabel(q));
 711 bdemsky  1.1.2.1              switch (q.opcode()) {
 712 bdemsky  1.1.2.1              case Qop.LCMPEQ:
 713 bdemsky  1.1.2.15                 
 714 bdemsky  1.1.2.1                  String l1=label(),l2=label();
 715 bdemsky  1.1.2.1                  for (int i=0;i<q.operandsLength();i++)
 716 bdemsky  1.1.2.16                     load(q,q.operands(i));
 717 bdemsky  1.1.2.1                  out.println("    lcmp");
 718 bdemsky  1.1.2.15                 q.next(0).accept(cjmp);
 719 bdemsky  1.1.2.15                 boolean testcjmp=cjmp.cjmp();
 720 bdemsky  1.1.2.15                 if (testcjmp) {
 721 bdemsky  1.1.2.15                     CJMP qnext=(CJMP)q.next(0);
 722 bdemsky  1.1.2.15                     if ((qnext.test()==q.dst())&&
 723 bdemsky  1.1.2.15                         (ud.useMap(hc, q.dst()).length==1)) {
 724 bdemsky  1.1.2.15                         skip.add(qnext);
 725 bdemsky  1.1.2.15                         out.println("    ifeq "+labeler(qnext.next(1)));
 726 bdemsky  1.1.2.15                     } else
 727 bdemsky  1.1.2.15                         testcjmp=false;
 728 bdemsky  1.1.2.15                 } 
 729 bdemsky  1.1.2.15                 if (!testcjmp) {
 730 bdemsky  1.1.2.15                     out.println("    ifeq "+l1);
 731 bdemsky  1.1.2.15                     out.println("    bipush 0");
 732 bdemsky  1.1.2.15                     out.println("    goto "+l2);
 733 bdemsky  1.1.2.15                     out.println(l1+":");
 734 bdemsky  1.1.2.15                     out.println("    bipush 1");
 735 bdemsky  1.1.2.15                     out.println(l2+":");
 736 bdemsky  1.1.2.16                     store(q,q.dst());
 737 bdemsky  1.1.2.15                 }
 738 bdemsky  1.1.2.1                  break;
 739 bdemsky  1.1.2.15 
 740 bdemsky  1.1.2.1              case Qop.LCMPGT:
 741 bdemsky  1.1.2.1                  l1=label();l2=label();
 742 bdemsky  1.1.2.1                  for (int i=0;i<q.operandsLength();i++)
 743 bdemsky  1.1.2.16                     load(q,q.operands(i));
 744 bdemsky  1.1.2.1                  out.println("    lcmp");
 745 bdemsky  1.1.2.15 
 746 bdemsky  1.1.2.15                 q.next(0).accept(cjmp);
 747 bdemsky  1.1.2.15                 testcjmp=cjmp.cjmp();
 748 bdemsky  1.1.2.15                 if (testcjmp) {
 749 bdemsky  1.1.2.15                     CJMP qnext=(CJMP)q.next(0);
 750 bdemsky  1.1.2.15                     if ((qnext.test()==q.dst())&&
 751 bdemsky  1.1.2.15                         (ud.useMap(hc, q.dst()).length==1)) {
 752 bdemsky  1.1.2.15                         skip.add(qnext);
 753 bdemsky  1.1.2.15                         out.println("    ifgt "+labeler(qnext.next(1)));
 754 bdemsky  1.1.2.15                     } else
 755 bdemsky  1.1.2.15                         testcjmp=false;
 756 bdemsky  1.1.2.15                 } 
 757 bdemsky  1.1.2.15                 if (!testcjmp) {
 758 bdemsky  1.1.2.15                     out.println("    ifgt "+l1);
 759 bdemsky  1.1.2.15                     out.println("    bipush 0");
 760 bdemsky  1.1.2.15                     out.println("    goto "+l2);
 761 bdemsky  1.1.2.15                     out.println(l1+":");
 762 bdemsky  1.1.2.15                     out.println("    bipush 1");
 763 bdemsky  1.1.2.15                     out.println(l2+":");
 764 bdemsky  1.1.2.16                     store(q,q.dst());
 765 bdemsky  1.1.2.15                 }
 766 bdemsky  1.1.2.1                  break;
 767 bdemsky  1.1.2.1              case Qop.DCMPEQ:
 768 bdemsky  1.1.2.1              case Qop.DCMPGE:
 769 bdemsky  1.1.2.1              case Qop.DCMPGT:
 770 bdemsky  1.1.2.1                  l1=label();l2=label();
 771 bdemsky  1.1.2.1                  for (int i=0;i<q.operandsLength();i++)
 772 bdemsky  1.1.2.16                     load(q,q.operands(i));
 773 bdemsky  1.1.2.1                  out.println("    dcmpl");
 774 bdemsky  1.1.2.15 
 775 bdemsky  1.1.2.15                 q.next(0).accept(cjmp);
 776 bdemsky  1.1.2.15                 testcjmp=cjmp.cjmp();
 777 bdemsky  1.1.2.15                 if (testcjmp) {
 778 bdemsky  1.1.2.15                     CJMP qnext=(CJMP)q.next(0);
 779 bdemsky  1.1.2.15                     if ((qnext.test()==q.dst())&&
 780 bdemsky  1.1.2.15                         (ud.useMap(hc, q.dst()).length==1)) {
 781 bdemsky  1.1.2.15                         skip.add(qnext);
 782 bdemsky  1.1.2.15                     if (q.opcode()==Qop.DCMPEQ)
 783 bdemsky  1.1.2.15                         out.println("    ifeq "+labeler(qnext.next(1)));
 784 bdemsky  1.1.2.15                     if (q.opcode()==Qop.DCMPGE)
 785 bdemsky  1.1.2.15                         out.println("    ifge "+labeler(qnext.next(1)));
 786 bdemsky  1.1.2.15                     if (q.opcode()==Qop.DCMPGT)
 787 bdemsky  1.1.2.15                         out.println("    ifgt "+labeler(qnext.next(1)));
 788 bdemsky  1.1.2.15                     } else
 789 bdemsky  1.1.2.15                         testcjmp=false;
 790 bdemsky  1.1.2.15                 }
 791 bdemsky  1.1.2.15                 if (!testcjmp) {
 792 bdemsky  1.1.2.15                     if (q.opcode()==Qop.DCMPEQ)
 793 bdemsky  1.1.2.15                         out.println("    ifeq "+l1);
 794 bdemsky  1.1.2.15                     if (q.opcode()==Qop.DCMPGE)
 795 bdemsky  1.1.2.15                         out.println("    ifge "+l1);
 796 bdemsky  1.1.2.15                     if (q.opcode()==Qop.DCMPGT)
 797 bdemsky  1.1.2.15                         out.println("    ifgt "+l1);
 798 bdemsky  1.1.2.15                     out.println("    bipush 0");
 799 bdemsky  1.1.2.15                     out.println("    goto "+l2);
 800 bdemsky  1.1.2.15                     out.println(l1+":");
 801 bdemsky  1.1.2.15                     out.println("    bipush 1");
 802 bdemsky  1.1.2.15                     out.println(l2+":");
 803 bdemsky  1.1.2.16                     store(q,q.dst());
 804 bdemsky  1.1.2.15                 }
 805 bdemsky  1.1.2.1                  break;
 806 bdemsky  1.1.2.1  
 807 bdemsky  1.1.2.1              case Qop.FCMPEQ:
 808 bdemsky  1.1.2.1              case Qop.FCMPGE:
 809 bdemsky  1.1.2.1              case Qop.FCMPGT:
 810 bdemsky  1.1.2.1                  l1=label();l2=label();
 811 bdemsky  1.1.2.1                  for (int i=0;i<q.operandsLength();i++)
 812 bdemsky  1.1.2.16                     load(q,q.operands(i));
 813 bdemsky  1.1.2.1                  out.println("    fcmpl");
 814 bdemsky  1.1.2.15 
 815 bdemsky  1.1.2.15                 q.next(0).accept(cjmp);
 816 bdemsky  1.1.2.15                 testcjmp=cjmp.cjmp();
 817 bdemsky  1.1.2.15                 if (testcjmp) {
 818 bdemsky  1.1.2.15                     CJMP qnext=(CJMP)q.next(0);
 819 bdemsky  1.1.2.15                     if ((qnext.test()==q.dst())&&
 820 bdemsky  1.1.2.15                         (ud.useMap(hc, q.dst()).length==1)) {
 821 bdemsky  1.1.2.15                         skip.add(qnext);
 822 bdemsky  1.1.2.15                     if (q.opcode()==Qop.FCMPEQ)
 823 bdemsky  1.1.2.15                         out.println("    ifeq "+labeler(qnext.next(1)));
 824 bdemsky  1.1.2.15                     if (q.opcode()==Qop.FCMPGE)
 825 bdemsky  1.1.2.15                         out.println("    ifge "+labeler(qnext.next(1)));
 826 bdemsky  1.1.2.15                     if (q.opcode()==Qop.FCMPGT)
 827 bdemsky  1.1.2.15                         out.println("    ifgt "+labeler(qnext.next(1)));
 828 bdemsky  1.1.2.15                     } else
 829 bdemsky  1.1.2.15                         testcjmp=false;
 830 bdemsky  1.1.2.15                 }
 831 bdemsky  1.1.2.15 
 832 bdemsky  1.1.2.15                 if (!testcjmp) {
 833 bdemsky  1.1.2.15                     if (q.opcode()==Qop.FCMPEQ)
 834 bdemsky  1.1.2.15                         out.println("    ifeq "+l1);
 835 bdemsky  1.1.2.15                     if (q.opcode()==Qop.FCMPGE)
 836 bdemsky  1.1.2.15                         out.println("    ifge "+l1);
 837 bdemsky  1.1.2.15                     if (q.opcode()==Qop.FCMPGT)
 838 bdemsky  1.1.2.15                         out.println("    ifgt "+l1);
 839 bdemsky  1.1.2.15                     out.println("    bipush 0");
 840 bdemsky  1.1.2.15                     out.println("    goto "+l2);
 841 bdemsky  1.1.2.15                     out.println(l1+":");
 842 bdemsky  1.1.2.15                     out.println("    bipush 1");
 843 bdemsky  1.1.2.15                     out.println(l2+":");
 844 bdemsky  1.1.2.16                     store(q,q.dst());
 845 bdemsky  1.1.2.15                 }
 846 bdemsky  1.1.2.1                  break;
 847 bdemsky  1.1.2.1  
 848 bdemsky  1.1.2.1              case Qop.ACMPEQ:
 849 bdemsky  1.1.2.1              case Qop.ICMPEQ:
 850 bdemsky  1.1.2.1              case Qop.ICMPGT:
 851 bdemsky  1.1.2.1                  String base=Qop.toString(q.opcode());
 852 bdemsky  1.1.2.1                  l1=label();
 853 bdemsky  1.1.2.1                  l2=label();
 854 bdemsky  1.1.2.1                  for (int i=0;i<q.operandsLength();i++) {
 855 bdemsky  1.1.2.16                     load(q,q.operands(i));
 856 bdemsky  1.1.2.1                  }
 857 bdemsky  1.1.2.15                 q.next(0).accept(cjmp);
 858 bdemsky  1.1.2.15                 testcjmp=cjmp.cjmp();
 859 bdemsky  1.1.2.15                 if (testcjmp) {
 860 bdemsky  1.1.2.15                     CJMP qnext=(CJMP)q.next(0);
 861 bdemsky  1.1.2.15                     
 862 bdemsky  1.1.2.15                     if ((qnext.test()==q.dst())&&
 863 bdemsky  1.1.2.15                         (ud.useMap(hc, q.dst()).length==1)) {
 864 bdemsky  1.1.2.15                         skip.add(qnext);
 865 bdemsky  1.1.2.15                         out.println("    if_"+base+" "+labeler(qnext.next(1)));
 866 bdemsky  1.1.2.15                     } else
 867 bdemsky  1.1.2.15                         testcjmp=false;
 868 bdemsky  1.1.2.15                 }
 869 bdemsky  1.1.2.15                 if (!testcjmp) {
 870 bdemsky  1.1.2.15                     out.println("    if_"+base+" "+l1);
 871 bdemsky  1.1.2.15                     out.println("    bipush 0");
 872 bdemsky  1.1.2.15                     out.println("    goto "+l2);
 873 bdemsky  1.1.2.15                     out.println(l1+":");
 874 bdemsky  1.1.2.15                     out.println("    bipush 1");
 875 bdemsky  1.1.2.15                     out.println(l2+":");
 876 bdemsky  1.1.2.15                     //Need code to do jump/etc...
 877 bdemsky  1.1.2.15                     //To store 0/1
 878 bdemsky  1.1.2.16                     store(q,q.dst());
 879 bdemsky  1.1.2.15                 }
 880 bdemsky  1.1.2.1                  break;
 881 bdemsky  1.1.2.1              case Qop.D2F:
 882 bdemsky  1.1.2.1              case Qop.D2I:
 883 bdemsky  1.1.2.1              case Qop.D2L:
 884 bdemsky  1.1.2.1              case Qop.DADD:
 885 bdemsky  1.1.2.1              case Qop.DDIV:
 886 bdemsky  1.1.2.1              case Qop.DMUL:
 887 bdemsky  1.1.2.1              case Qop.DNEG:
 888 bdemsky  1.1.2.1              case Qop.DREM:
 889 bdemsky  1.1.2.1              case Qop.F2D:
 890 bdemsky  1.1.2.1              case Qop.F2I:
 891 bdemsky  1.1.2.1              case Qop.F2L:
 892 bdemsky  1.1.2.1              case Qop.FADD:
 893 bdemsky  1.1.2.1              case Qop.FDIV:
 894 bdemsky  1.1.2.1              case Qop.FMUL:
 895 bdemsky  1.1.2.1              case Qop.FNEG:
 896 bdemsky  1.1.2.1              case Qop.FREM:
 897 bdemsky  1.1.2.1              case Qop.I2B:
 898 bdemsky  1.1.2.1              case Qop.I2C:
 899 bdemsky  1.1.2.1              case Qop.I2D:
 900 bdemsky  1.1.2.7              case Qop.I2F:
 901 bdemsky  1.1.2.1              case Qop.I2L:
 902 bdemsky  1.1.2.1              case Qop.I2S:
 903 bdemsky  1.1.2.1              case Qop.IADD:
 904 bdemsky  1.1.2.1              case Qop.IAND:
 905 bdemsky  1.1.2.1              case Qop.IDIV:
 906 bdemsky  1.1.2.1              case Qop.IMUL:
 907 bdemsky  1.1.2.1              case Qop.INEG:
 908 bdemsky  1.1.2.1              case Qop.IOR:
 909 bdemsky  1.1.2.1              case Qop.IREM:
 910 bdemsky  1.1.2.1              case Qop.ISHL:
 911 bdemsky  1.1.2.1              case Qop.ISHR:
 912 bdemsky  1.1.2.1              case Qop.IUSHR:
 913 bdemsky  1.1.2.1              case Qop.IXOR:
 914 bdemsky  1.1.2.1              case Qop.L2D:
 915 bdemsky  1.1.2.5              case Qop.L2I:
 916 bdemsky  1.1.2.1              case Qop.L2F:
 917 bdemsky  1.1.2.1              case Qop.LADD:
 918 bdemsky  1.1.2.1              case Qop.LAND:
 919 bdemsky  1.1.2.1              case Qop.LDIV:
 920 bdemsky  1.1.2.1              case Qop.LMUL:
 921 bdemsky  1.1.2.1              case Qop.LNEG:
 922 bdemsky  1.1.2.1              case Qop.LOR:
 923 bdemsky  1.1.2.1              case Qop.LREM:
 924 bdemsky  1.1.2.1              case Qop.LSHL:
 925 bdemsky  1.1.2.1              case Qop.LSHR:
 926 bdemsky  1.1.2.1              case Qop.LUSHR:
 927 bdemsky  1.1.2.1              case Qop.LXOR:
 928 bdemsky  1.1.2.1                  String cbase=Qop.toString(q.opcode());
 929 bdemsky  1.1.2.1                  for (int i=0;i<q.operandsLength();i++) {
 930 bdemsky  1.1.2.16                     load(q,q.operands(i));
 931 bdemsky  1.1.2.1                  }
 932 bdemsky  1.1.2.1                  out.println("    "+cbase);
 933 bdemsky  1.1.2.16                 store(q,q.dst());
 934 bdemsky  1.1.2.1                  break;
 935 bdemsky  1.1.2.1              default:
 936 bdemsky  1.1.2.1                  out.println(q.toString()+" unimplemented");
 937 bdemsky  1.1.2.1              }
 938 bdemsky  1.1.2.22             out.println(iflabel2(q));
 939 bdemsky  1.1.2.1          }
 940 bdemsky  1.1.2.1  
 941 bdemsky  1.1.2.16         private void store(Quad q,Temp t) {
 942 duncan   1.1.2.2              // Should be ok to pass null for HCodeElement param
 943 bdemsky  1.1.2.16             HClass tp=tm.typeMap(q,t); 
 944 bdemsky  1.1.2.1              String operand="***store error";
 945 bdemsky  1.1.2.1              if ((tp==HClass.Boolean)||
 946 bdemsky  1.1.2.1                  (tp==HClass.Byte)||
 947 bdemsky  1.1.2.1                  (tp==HClass.Char)||
 948 bdemsky  1.1.2.1                  (tp==HClass.Short)||
 949 bdemsky  1.1.2.1                  (tp==HClass.Int))
 950 bdemsky  1.1.2.1                  operand="istore ";
 951 bdemsky  1.1.2.1              else
 952 bdemsky  1.1.2.1                  if (tp==HClass.Double)
 953 bdemsky  1.1.2.1                      operand="dstore ";
 954 bdemsky  1.1.2.1                  else
 955 bdemsky  1.1.2.1                      if (tp==HClass.Float)
 956 bdemsky  1.1.2.1                          operand="fstore ";
 957 bdemsky  1.1.2.1                      else
 958 bdemsky  1.1.2.1                          if (tp==HClass.Long)
 959 bdemsky  1.1.2.1                              operand="lstore ";
 960 bdemsky  1.1.2.1                          else
 961 bdemsky  1.1.2.1                              operand="astore ";
 962 bdemsky  1.1.2.1              TempInfo dest=(TempInfo)tempmap.get(t);
 963 bdemsky  1.1.2.1              if (!dest.stack)
 964 bdemsky  1.1.2.1                  out.println("    "+operand+(new Integer(dest.localvar)).toString());
 965 bdemsky  1.1.2.1          }
 966 bdemsky  1.1.2.1  
 967 bdemsky  1.1.2.16         private void load(Quad q,Temp t) {
 968 bdemsky  1.1.2.1              String operand="***load error";
 969 duncan   1.1.2.2              // Should be ok to pass null for HCodeElement param
 970 bdemsky  1.1.2.16             HClass tp=tm.typeMap(q,t);
 971 bdemsky  1.1.2.1              if ((tp==HClass.Boolean)||
 972 bdemsky  1.1.2.1                  (tp==HClass.Byte)||
 973 bdemsky  1.1.2.1                  (tp==HClass.Char)||
 974 bdemsky  1.1.2.1                  (tp==HClass.Short)||
 975 bdemsky  1.1.2.1                  (tp==HClass.Int))
 976 bdemsky  1.1.2.1                  operand="iload ";
 977 bdemsky  1.1.2.1              else
 978 bdemsky  1.1.2.1                  if (tp==HClass.Double)
 979 bdemsky  1.1.2.1                      operand="dload ";
 980 bdemsky  1.1.2.1                  else
 981 bdemsky  1.1.2.1                      if (tp==HClass.Float)
 982 bdemsky  1.1.2.1                          operand="fload ";
 983 bdemsky  1.1.2.1                      else
 984 bdemsky  1.1.2.1                          if (tp==HClass.Long)
 985 bdemsky  1.1.2.1                              operand="lload ";
 986 bdemsky  1.1.2.1                          else
 987 bdemsky  1.1.2.1                              operand="aload ";
 988 bdemsky  1.1.2.1              TempInfo dest=(TempInfo)tempmap.get(t);
 989 bdemsky  1.1.2.1              if (!dest.stack)
 990 bdemsky  1.1.2.1                  out.println("    "+operand+(new Integer(dest.localvar)).toString());
 991 bdemsky  1.1.2.1          }
 992 bdemsky  1.1.2.1  
 993 bdemsky  1.1.2.1          private void astore(TempInfo t) {
 994 bdemsky  1.1.2.1              if (!t.stack)
 995 bdemsky  1.1.2.1                  out.println("    astore "+(new Integer(t.localvar)).toString());
 996 bdemsky  1.1.2.1          }
 997 bdemsky  1.1.2.1  
 998 bdemsky  1.1.2.1          private void aload(TempInfo t) {
 999 bdemsky  1.1.2.1              if (!t.stack)
1000 bdemsky  1.1.2.1                  out.println("    aload "+(new Integer(t.localvar)).toString());
1001 bdemsky  1.1.2.1          }
1002 bdemsky  1.1.2.1          private void dstore(TempInfo t) {
1003 bdemsky  1.1.2.1              if (!t.stack)
1004 bdemsky  1.1.2.1                  out.println("    dstore "+(new Integer(t.localvar)).toString());
1005 bdemsky  1.1.2.1          }
1006 bdemsky  1.1.2.1  
1007 bdemsky  1.1.2.1          private void lstore(TempInfo t) {
1008 bdemsky  1.1.2.1              if (!t.stack)
1009 bdemsky  1.1.2.1                  out.println("    lstore "+(new Integer(t.localvar)).toString());
1010 bdemsky  1.1.2.1          }
1011 bdemsky  1.1.2.1  
1012 bdemsky  1.1.2.1          private void fstore(TempInfo t) {
1013 bdemsky  1.1.2.1              if (!t.stack)
1014 bdemsky  1.1.2.1                  out.println("    fstore "+(new Integer(t.localvar)).toString());
1015 bdemsky  1.1.2.1          }
1016 bdemsky  1.1.2.1  
1017 bdemsky  1.1.2.1          private void istore(TempInfo t) {
1018 bdemsky  1.1.2.1              if (!t.stack)
1019 bdemsky  1.1.2.1                  out.println("    istore "+(new Integer(t.localvar)).toString());
1020 bdemsky  1.1.2.1          }
1021 bdemsky  1.1.2.1          
1022 bdemsky  1.1.2.1          private void iload(TempInfo t) {
1023 bdemsky  1.1.2.1              if (!t.stack)
1024 bdemsky  1.1.2.1                  out.println("    iload "+(new Integer(t.localvar)).toString());
1025 bdemsky  1.1.2.1          }
1026 bdemsky  1.1.2.1  
1027 bdemsky  1.1.2.13         //Give unique labels to quads
1028 bdemsky  1.1.2.1          private String labeler(Quad q) {
1029 bdemsky  1.1.2.1              if (labelmap.containsKey(q))
1030 bdemsky  1.1.2.1                  return (String)labelmap.get(q);
1031 bdemsky  1.1.2.1              else {
1032 bdemsky  1.1.2.1                  String label=label();
1033 bdemsky  1.1.2.1                  labelmap.put(q,label);
1034 bdemsky  1.1.2.1                  return label;
1035 bdemsky  1.1.2.1              }
1036 bdemsky  1.1.2.1          }
1037 bdemsky  1.1.2.22         //End of quad label
1038 bdemsky  1.1.2.22         private String labeler2(Quad q) {
1039 bdemsky  1.1.2.22             if (labelmap.containsKey(q))
1040 bdemsky  1.1.2.22                 return (new String ("E"))+(String)labelmap.get(q);
1041 bdemsky  1.1.2.22             else {
1042 bdemsky  1.1.2.22                 String label=label();
1043 bdemsky  1.1.2.22                 labelmap.put(q,label);
1044 bdemsky  1.1.2.22                 return (new String("E"))+(String)label;
1045 bdemsky  1.1.2.22             }
1046 bdemsky  1.1.2.22         }
1047 bdemsky  1.1.2.1  
1048 bdemsky  1.1.2.13         //Returns string with label in it
1049 bdemsky  1.1.2.1          private String iflabel(Quad q) {
1050 bdemsky  1.1.2.1              if (labelmap.containsKey(q))
1051 bdemsky  1.1.2.1                  return (String)labelmap.get(q)+(new String(":"));
1052 bdemsky  1.1.2.22             else return new String("");
1053 bdemsky  1.1.2.22         }
1054 bdemsky  1.1.2.22 
1055 bdemsky  1.1.2.22         //Returns string with label in it
1056 bdemsky  1.1.2.22         private String iflabel2(Quad q) {
1057 bdemsky  1.1.2.22             if (labelmap.containsKey(q))
1058 bdemsky  1.1.2.22                 return (new String("E"))+(String)labelmap.get(q)+(new String(":"));
1059 bdemsky  1.1.2.1              else return new String("");
1060 bdemsky  1.1.2.1          }
1061 bdemsky  1.1.2.1  
1062 bdemsky  1.1.2.13         //Assigns label numbers
1063 bdemsky  1.1.2.1          private String label() {
1064 bdemsky  1.1.2.1              return "L"+(new Integer(label++)).toString();
1065 bdemsky  1.1.2.1          }
1066 bdemsky  1.1.2.1      }
1067 bdemsky  1.1.2.13 
1068 bdemsky  1.1.2.13     /** <code>buildmap</code> takes in a <code>HCode</code> and a <code>TypeMap</code>
1069 bdemsky  1.1.2.13      *  and returns a Map and number of local variables used.
1070 bdemsky  1.1.2.13      *  Buildmap maps each temp either to the stack or to a localvariable.*/
1071 bdemsky  1.1.2.1  
1072 bdemsky  1.1.2.1      public final Object[] buildmap(final HCode code, TypeMap tp) {
1073 bdemsky  1.1.2.1          Quad q=(Quad)code.getRootElement();
1074 bdemsky  1.1.2.1          METHOD m=(METHOD) q.next(1);
1075 bdemsky  1.1.2.1          UseDef ud=new UseDef();
1076 bdemsky  1.1.2.1          Temp[] alltemp=ud.allTemps(code);
1077 bdemsky  1.1.2.1          HashMap stacktemps=new HashMap();
1078 bdemsky  1.1.2.1          WorkSet badquads=new WorkSet();
1079 bdemsky  1.1.2.1          int j=0;
1080 bdemsky  1.1.2.12 
1081 bdemsky  1.1.2.12         //Cycle through the formal parameters...Assign them to their
1082 bdemsky  1.1.2.12         //appropriate local variables
1083 bdemsky  1.1.2.1          for(int i=0;i<m.params().length;i++) {
1084 bdemsky  1.1.2.1              stacktemps.put(m.params(i),new TempInfo(j++));
1085 bdemsky  1.1.2.17             HCodeElement[] defs=ud.defMap(code,m.params(i));
1086 bdemsky  1.1.2.17             //gross hack...cycle through all defs
1087 bdemsky  1.1.2.17             for (int k=0; k<defs.length;k++) {
1088 bdemsky  1.1.2.17                 HClass hclass=tp.typeMap(defs[k],m.params(i));
1089 bdemsky  1.1.2.17                 if ((hclass==HClass.Double)||(hclass==HClass.Long)) {
1090 bdemsky  1.1.2.17                     j++;
1091 bdemsky  1.1.2.17                     break;
1092 bdemsky  1.1.2.17                 }
1093 bdemsky  1.1.2.17             }
1094 bdemsky  1.1.2.1          }
1095 bdemsky  1.1.2.12 
1096 bdemsky  1.1.2.12 
1097 bdemsky  1.1.2.12         //Make a set containing all of the quads protected
1098 bdemsky  1.1.2.12         //by handler quads...
1099 bdemsky  1.1.2.1          for (int i=1;i<m.nextLength();i++) {
1100 bdemsky  1.1.2.1              HANDLER h=(HANDLER)m.next(i);
1101 bdemsky  1.1.2.1              Enumeration e=h.protectedQuads();
1102 bdemsky  1.1.2.1              while(e.hasMoreElements())
1103 bdemsky  1.1.2.1                  badquads.add((Quad)e.nextElement());
1104 bdemsky  1.1.2.1          }
1105 bdemsky  1.1.2.1  
1106 bdemsky  1.1.2.12         //Cycled through all temps defined and used once
1107 bdemsky  1.1.2.12         //Consider them for placement on stack
1108 bdemsky  1.1.2.12 
1109 bdemsky  1.1.2.1          for (int i=0;i<alltemp.length;i++) {
1110 bdemsky  1.1.2.1              Temp next=alltemp[i];
1111 bdemsky  1.1.2.1              HCodeElement[] defs=ud.defMap(code,next);
1112 bdemsky  1.1.2.1              if (!stacktemps.containsKey(next)) {
1113 bdemsky  1.1.2.1                  if (defs.length==1) {
1114 bdemsky  1.1.2.1                      HCodeElement[] uses=ud.useMap(code,next);
1115 bdemsky  1.1.2.1                      if (uses.length==1) {
1116 bdemsky  1.1.2.1                          checkPair(stacktemps, (Quad)  uses[0], (Quad) defs[0], next, badquads);
1117 bdemsky  1.1.2.1                      }
1118 bdemsky  1.1.2.1                  }
1119 bdemsky  1.1.2.1              }
1120 bdemsky  1.1.2.1          }
1121 bdemsky  1.1.2.12 
1122 bdemsky  1.1.2.12         //Iterate through the temps we've placed so far
1123 bdemsky  1.1.2.12 
1124 cananian 1.6              for (Object nextO : stacktemps.keySet()) {
1125 cananian 1.6                  Temp next = (Temp) nextO;
1126 bdemsky  1.1.2.12 
1127 bdemsky  1.1.2.12             //Only worry about the ones on the stack
1128 bdemsky  1.1.2.1              if (((TempInfo)stacktemps.get(next)).stack) {
1129 bdemsky  1.1.2.1                  HCodeElement[] huses=ud.useMap(code,next);
1130 bdemsky  1.1.2.1                  HCodeElement[] hdefs=ud.defMap(code,next);
1131 bdemsky  1.1.2.1                  Quad use=(Quad)huses[0];
1132 bdemsky  1.1.2.1                  Quad def=(Quad)hdefs[0];
1133 bdemsky  1.1.2.1                  Temp[] uses=use.use();
1134 bdemsky  1.1.2.1                  Temp[] defs=def.def();
1135 bdemsky  1.1.2.1                  boolean flag=true;
1136 bdemsky  1.1.2.1                  boolean broken=false;
1137 bdemsky  1.1.2.12 
1138 bdemsky  1.1.2.12                 //go through the using quad
1139 bdemsky  1.1.2.1                  for (int i=0;i<uses.length;i++) {
1140 bdemsky  1.1.2.12                     //If we have an temp before 'next'
1141 bdemsky  1.1.2.12                     //that isn't on the stack, we can't put it
1142 bdemsky  1.1.2.12                     //under 'next'
1143 bdemsky  1.1.2.12 
1144 bdemsky  1.1.2.1                      if (!stacktemps.containsKey(uses[i]))
1145 bdemsky  1.1.2.1                          flag=false;
1146 bdemsky  1.1.2.1                      else
1147 bdemsky  1.1.2.12                         if (!((TempInfo)stacktemps.get(uses[i])).stack)
1148 bdemsky  1.1.2.1                              flag=false;
1149 bdemsky  1.1.2.1                      if ((flag==false)&&(uses[i]==next)) {
1150 bdemsky  1.1.2.1                          broken=true;
1151 bdemsky  1.1.2.1                          break;
1152 bdemsky  1.1.2.1                      }
1153 bdemsky  1.1.2.1                  }
1154 bdemsky  1.1.2.1                  flag=true;
1155 bdemsky  1.1.2.12 
1156 bdemsky  1.1.2.12                 //if we need a temp under 'next'
1157 bdemsky  1.1.2.12                 //we can't put 'next' on the stack
1158 bdemsky  1.1.2.1                  for (int i=0;i<defs.length;i++) {
1159 bdemsky  1.1.2.1                      if (!stacktemps.containsKey(defs[i]))
1160 bdemsky  1.1.2.1                          flag=false;
1161 bdemsky  1.1.2.12                     else if (!((TempInfo)stacktemps.get(defs[i])).stack)
1162 bdemsky  1.1.2.12                         flag=false;
1163 bdemsky  1.1.2.1                      if ((flag==false)&&(uses[i]==next)) {
1164 bdemsky  1.1.2.1                          broken=true;
1165 bdemsky  1.1.2.1                          break;
1166 bdemsky  1.1.2.1                      }
1167 bdemsky  1.1.2.1                  }
1168 bdemsky  1.1.2.12 
1169 bdemsky  1.1.2.1                  if (broken) {
1170 bdemsky  1.1.2.12                     // If this stack allocation failed,
1171 bdemsky  1.1.2.12                     // allocate it to a local variable.
1172 bdemsky  1.1.2.1                      stacktemps.put(next,new TempInfo(j++));
1173 bdemsky  1.1.2.17                     
1174 bdemsky  1.1.2.17                     //gross hack...cycle through all defs
1175 bdemsky  1.1.2.17                     for (int k=0; k<defs.length;k++) {
1176 bdemsky  1.1.2.17                         HClass hclass=tp.typeMap(hdefs[k],next);
1177 bdemsky  1.1.2.17                         if ((hclass==HClass.Double)||(hclass==HClass.Long)) {
1178 bdemsky  1.1.2.17                             j++;
1179 bdemsky  1.1.2.17                             break;
1180 bdemsky  1.1.2.17                         }
1181 bdemsky  1.1.2.17                     }
1182 bdemsky  1.1.2.1                  }
1183 bdemsky  1.1.2.1              }
1184 bdemsky  1.1.2.1          }
1185 bdemsky  1.1.2.1  
1186 bdemsky  1.1.2.12         //loop through the rest of the temps
1187 bdemsky  1.1.2.12         //assign them to local variables...
1188 bdemsky  1.1.2.1          for (int i=0;i<alltemp.length;i++) {
1189 bdemsky  1.1.2.1              if (!stacktemps.containsKey(alltemp[i])) {
1190 duncan   1.1.2.2                  // Should be ok to pass null as HCodeElement param
1191 bdemsky  1.1.2.17 
1192 bdemsky  1.1.2.1                  stacktemps.put(alltemp[i],new TempInfo(j++));
1193 bdemsky  1.1.2.17 
1194 bdemsky  1.1.2.17                 HCodeElement[] defs=ud.defMap(code,alltemp[i]);
1195 bdemsky  1.1.2.17                 //gross hack...cycle through all defs
1196 bdemsky  1.1.2.17                 for (int k=0; k<defs.length;k++) {
1197 bdemsky  1.1.2.17                     HClass hclass=tp.typeMap(defs[k],alltemp[i]);
1198 bdemsky  1.1.2.17                     if ((hclass==HClass.Double)||(hclass==HClass.Long)) {
1199 bdemsky  1.1.2.17                         j++;
1200 bdemsky  1.1.2.17                         break;
1201 bdemsky  1.1.2.17                     }
1202 bdemsky  1.1.2.17                 }
1203 bdemsky  1.1.2.1              }
1204 bdemsky  1.1.2.1          }
1205 bdemsky  1.1.2.1          return new Object[] {stacktemps, new Integer(j)};
1206 bdemsky  1.1.2.1      }
1207 bdemsky  1.1.2.1  
1208 bdemsky  1.1.2.1      void checkPair(Map stacktemps, final Quad use, final Quad def, Temp t, Set badquads) {
1209 bdemsky  1.1.2.1          Quad ptr=def;
1210 bdemsky  1.1.2.1          boolean flag=true;
1211 bdemsky  1.1.2.1          WorkSet track=new WorkSet();
1212 bdemsky  1.1.2.12         //make sure that the definition quad
1213 bdemsky  1.1.2.12         //isn't covered by a handler and that it only defines one temp
1214 bdemsky  1.1.2.1          if ((ptr.def().length==1)&&(!badquads.contains(ptr))) {
1215 bdemsky  1.1.2.12             //while we haven't found the use
1216 bdemsky  1.1.2.1              while (ptr!=use) {
1217 bdemsky  1.1.2.12                 //make sure we aren't at a sigma quad
1218 bdemsky  1.1.2.12                 //don't want to stack allocate across them
1219 bdemsky  1.1.2.1                  if (ptr.next().length!=1) {
1220 bdemsky  1.1.2.1                      flag=false;break;}
1221 bdemsky  1.1.2.12                 
1222 bdemsky  1.1.2.12                 //Look at the temp's defined by this quad
1223 bdemsky  1.1.2.1                  Temp[] defs=ptr.def();
1224 bdemsky  1.1.2.12                 //if any of them are on the stack
1225 bdemsky  1.1.2.12                 //add them to our stack tracking list
1226 bdemsky  1.1.2.1                  for (int i=0;i<defs.length;i++)
1227 bdemsky  1.1.2.1                      if (stacktemps.containsKey(defs[i]))
1228 bdemsky  1.1.2.1                          track.push(defs[i]);
1229 bdemsky  1.1.2.12 
1230 bdemsky  1.1.2.12                 //go to the next quad
1231 bdemsky  1.1.2.1                  ptr=ptr.next(0);
1232 bdemsky  1.1.2.12 
1233 bdemsky  1.1.2.12                 //make sure that this isn't a phi...
1234 bdemsky  1.1.2.12                 //don't want the possibility of the analysis
1235 bdemsky  1.1.2.12                 //following a loop...
1236 bdemsky  1.1.2.12                 //also make sure that this quad isn't covered by a handler
1237 bdemsky  1.1.2.1                  if ((ptr.prev().length!=1)||(badquads.contains(ptr))) {
1238 bdemsky  1.1.2.1                      flag=false;break;}
1239 bdemsky  1.1.2.12                 //check the uses of this quad....
1240 bdemsky  1.1.2.12                 //if it is our temp, we are done...
1241 bdemsky  1.1.2.12                 //if it is another temp, check to see
1242 bdemsky  1.1.2.12                 //if it is stack allocated...
1243 bdemsky  1.1.2.12                 //if it is in our track list remove it, if it is
1244 bdemsky  1.1.2.12                 //not bail on this temp
1245 bdemsky  1.1.2.1                  Temp[] uses=ptr.use();
1246 bdemsky  1.1.2.1                  for (int i=uses.length-1;i>=0;i--) {
1247 bdemsky  1.1.2.1                      if (uses[i]==t) break;
1248 bdemsky  1.1.2.1                      if (stacktemps.containsKey(uses[i])) {
1249 bdemsky  1.1.2.1                          if (track.contains(uses[i]))
1250 bdemsky  1.1.2.1                              track.remove(uses[i]);
1251 bdemsky  1.1.2.1                          else
1252 bdemsky  1.1.2.1                              {flag=false; break;}
1253 bdemsky  1.1.2.1                      }
1254 bdemsky  1.1.2.1                  }
1255 bdemsky  1.1.2.1              }
1256 bdemsky  1.1.2.12             //if we made it here, and our tracking list is empty
1257 bdemsky  1.1.2.12             //we add it to our list of possibilities
1258 bdemsky  1.1.2.1              if ((flag)&&(track.isEmpty())) {
1259 bdemsky  1.1.2.1                  stacktemps.put(t, new TempInfo(true));
1260 bdemsky  1.1.2.1              } 
1261 bdemsky  1.1.2.1          }
1262 bdemsky  1.1.2.1      }
1263 bdemsky  1.1.2.24 
1264 bdemsky  1.1.2.25     private int finddepth(Map map, TypeMap tp, HMethod hm, HCode hc) {
1265 bdemsky  1.1.2.25         //Output assembly from the quads
1266 bdemsky  1.1.2.25         //Build mapping from temps to localvars/stack
1267 bdemsky  1.1.2.24 
1268 bdemsky  1.1.2.25         WorkSet done=new WorkSet();
1269 bdemsky  1.1.2.25         DepthVisitor visitor=new DepthVisitor(map,hc,tp);
1270 bdemsky  1.1.2.25         Quad start=(Quad)hc.getRootElement();
1271 bdemsky  1.1.2.25         METHOD m=(METHOD)start.next(1);
1272 bdemsky  1.1.2.25         //Loop through the handlers
1273 bdemsky  1.1.2.25         //We do this to label the quad ranges protected by the handler
1274 bdemsky  1.1.2.25         for (int i=1;i<m.nextLength();i++) {
1275 bdemsky  1.1.2.25             HANDLER h=(HANDLER)m.next(i);
1276 bdemsky  1.1.2.25             Enumeration e=h.protectedQuads();
1277 bdemsky  1.1.2.25             while(e.hasMoreElements()) {
1278 bdemsky  1.1.2.25                 Quad q=(Quad)e.nextElement();
1279 bdemsky  1.1.2.25             }
1280 bdemsky  1.1.2.25         }
1281 bdemsky  1.1.2.25         //Visit all the quads
1282 bdemsky  1.1.2.25         visitAllDepth(visitor,start.next(1), done);
1283 bdemsky  1.1.2.25         return visitor.max();
1284 bdemsky  1.1.2.25     }
1285 bdemsky  1.1.2.24 
1286 bdemsky  1.1.2.25     private static final void visitAllDepth(DepthVisitor visitor, Quad start, Set qm) {
1287 bdemsky  1.1.2.25         //Visit the node passed to us
1288 bdemsky  1.1.2.25         start.accept(visitor);
1289 bdemsky  1.1.2.25         //add this node to the done list
1290 bdemsky  1.1.2.25         qm.add(start);
1291 bdemsky  1.1.2.25         //visit the kids
1292 bdemsky  1.1.2.25         Quad[] ql = start.next();
1293 bdemsky  1.1.2.25         for (int i=0; i<ql.length; i++) {
1294 bdemsky  1.1.2.25             if (qm.contains(ql[i])) continue; // skip if already done.
1295 bdemsky  1.1.2.25             visitAllDepth(visitor, ql[i],qm);
1296 bdemsky  1.1.2.25         }
1297 bdemsky  1.1.2.25     }
1298 bdemsky  1.1.2.24 
1299 bdemsky  1.1.2.24     class DepthVisitor extends QuadVisitor {
1300 bdemsky  1.1.2.24         Map tempmap;
1301 bdemsky  1.1.2.24         HCode hc;
1302 bdemsky  1.1.2.24         TypeMap tm;
1303 bdemsky  1.1.2.24         UseDef ud;
1304 bdemsky  1.1.2.24         WorkSet skip;
1305 bdemsky  1.1.2.24         CJMPVisitor cjmp;
1306 bdemsky  1.1.2.24         HashMap depth;
1307 bdemsky  1.1.2.24         int max;
1308 bdemsky  1.1.2.24 
1309 bdemsky  1.1.2.24         DepthVisitor(Map tempmap, HCode hc, TypeMap tm) {
1310 bdemsky  1.1.2.24             this.max=0;
1311 bdemsky  1.1.2.24             this.tempmap=tempmap;
1312 bdemsky  1.1.2.24             this.hc=hc;
1313 bdemsky  1.1.2.24             this.tm=tm;
1314 bdemsky  1.1.2.24             this.skip=new WorkSet();
1315 bdemsky  1.1.2.24             this.ud=new UseDef();
1316 bdemsky  1.1.2.24             this.cjmp=new CJMPVisitor();
1317 bdemsky  1.1.2.24             depth=new HashMap();
1318 bdemsky  1.1.2.24         }
1319 bdemsky  1.1.2.24 
1320 bdemsky  1.1.2.24         public void visit(Quad q) {
1321 bdemsky  1.1.2.24         }
1322 bdemsky  1.1.2.24 
1323 bdemsky  1.1.2.24         public void visit(AGET q) {
1324 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1325 bdemsky  1.1.2.24             depth1+=load(q,q.objectref());
1326 bdemsky  1.1.2.24             depth1+=load(q,q.index());
1327 bdemsky  1.1.2.24             maxcheck(depth1);
1328 bdemsky  1.1.2.24             depth1-=load2(q, q.objectref());
1329 bdemsky  1.1.2.24             depth1+=load2(q,q.dst());
1330 bdemsky  1.1.2.24             maxcheck(depth1);
1331 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1332 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1333 bdemsky  1.1.2.24         }
1334 bdemsky  1.1.2.24 
1335 bdemsky  1.1.2.25         int max() {
1336 bdemsky  1.1.2.25             return max;
1337 bdemsky  1.1.2.25         }
1338 bdemsky  1.1.2.25 
1339 bdemsky  1.1.2.24         void maxcheck(int t) {
1340 bdemsky  1.1.2.27             if (t<0)
1341 bdemsky  1.1.2.27                 System.out.println("ERROR: Negative Stack Depth Calculated in Jasmin"+t);
1342 bdemsky  1.1.2.24             if (t>max) max=t;
1343 bdemsky  1.1.2.24         }
1344 bdemsky  1.1.2.24 
1345 bdemsky  1.1.2.24         public void visit(ALENGTH q) {
1346 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1347 bdemsky  1.1.2.24             depth1+=load(q,q.objectref());
1348 bdemsky  1.1.2.24             maxcheck(depth1);
1349 bdemsky  1.1.2.24             depth1-=load2(q,q.objectref());
1350 bdemsky  1.1.2.24             depth1+=1;
1351 bdemsky  1.1.2.24             maxcheck(depth1);
1352 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1353 bdemsky  1.1.2.24             depth.put(q, new Integer (depth1));
1354 bdemsky  1.1.2.24         }
1355 bdemsky  1.1.2.24 
1356 bdemsky  1.1.2.24         public void visit(ANEW q) {
1357 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1358 bdemsky  1.1.2.24             for (int i=0;i<q.dimsLength();i++)
1359 bdemsky  1.1.2.24                 depth1+=load(q,q.dims(i));
1360 bdemsky  1.1.2.24             maxcheck(depth1);
1361 bdemsky  1.1.2.24             depth1+=1;
1362 bdemsky  1.1.2.24             for (int i=0;i<q.dimsLength();i++)
1363 bdemsky  1.1.2.24                 depth1-=load2(q,q.dims(i));
1364 bdemsky  1.1.2.24             maxcheck(depth1);
1365 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1366 bdemsky  1.1.2.24             depth.put(q, new Integer (depth1));
1367 bdemsky  1.1.2.24         }
1368 bdemsky  1.1.2.24 
1369 bdemsky  1.1.2.24         public void visit(ARRAYINIT q) {
1370 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1371 bdemsky  1.1.2.24             if (q.value().length>0)
1372 bdemsky  1.1.2.24                 depth1+=load(q,q.objectref());
1373 bdemsky  1.1.2.24             if ((q.type()==HClass.Boolean)||
1374 bdemsky  1.1.2.24                 (q.type()==HClass.Int)||
1375 bdemsky  1.1.2.24                 (q.type()==HClass.Byte)||
1376 bdemsky  1.1.2.24                 (q.type()==HClass.Char)||
1377 bdemsky  1.1.2.24                 (q.type()==HClass.Short)||              
1378 bdemsky  1.1.2.24                 (q.type()==HClass.Float)||
1379 bdemsky  1.1.2.24                 (q.type()==HClass.Boolean)) {
1380 bdemsky  1.1.2.24                     maxcheck(depth1+3);
1381 bdemsky  1.1.2.24                 }
1382 bdemsky  1.1.2.24             else if ((q.type()==HClass.Long)||
1383 bdemsky  1.1.2.24                      (q.type()==HClass.Double)) {
1384 bdemsky  1.1.2.24                 maxcheck(depth1+1+1+2);
1385 bdemsky  1.1.2.24             }
1386 bdemsky  1.1.2.24             depth1-=load2(q,q.objectref());
1387 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1388 bdemsky  1.1.2.24         }
1389 bdemsky  1.1.2.24        
1390 bdemsky  1.1.2.24         public void visit(ASET q) {
1391 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1392 bdemsky  1.1.2.24             depth1+=load(q,q.objectref());
1393 bdemsky  1.1.2.24             depth1+=load(q,q.index());
1394 bdemsky  1.1.2.24             depth1+=load(q,q.src());
1395 bdemsky  1.1.2.24             maxcheck(depth1);
1396 bdemsky  1.1.2.24             depth1-=load2(q,q.objectref());
1397 bdemsky  1.1.2.24             depth1-=load2(q,q.index());
1398 bdemsky  1.1.2.24             depth1-=load2(q,q.src());
1399 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1400 bdemsky  1.1.2.24         }
1401 bdemsky  1.1.2.24 
1402 bdemsky  1.1.2.24         public void visit(COMPONENTOF q) {
1403 bdemsky  1.1.2.24             //kludge
1404 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1405 bdemsky  1.1.2.24             maxcheck(depth1);
1406 bdemsky  1.1.2.24             depth1+=load(q,q.objectref());
1407 bdemsky  1.1.2.24             depth1+=load(q,q.arrayref());
1408 bdemsky  1.1.2.24             depth1-=load2(q,q.objectref());
1409 bdemsky  1.1.2.24             depth1-=load2(q,q.arrayref());
1410 bdemsky  1.1.2.24             depth1+=1;
1411 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1412 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1413 bdemsky  1.1.2.24         }
1414 bdemsky  1.1.2.24 
1415 bdemsky  1.1.2.24         public void visit(METHOD q) {
1416 bdemsky  1.1.2.24             depth.put(q, new Integer(0));
1417 bdemsky  1.1.2.24         }
1418 bdemsky  1.1.2.24 
1419 bdemsky  1.1.2.24         public void visit(HEADER q) {
1420 bdemsky  1.1.2.24             depth.put(q, new Integer(0));
1421 bdemsky  1.1.2.24         }
1422 bdemsky  1.1.2.24 
1423 bdemsky  1.1.2.24         public void visit(PHI q) {
1424 bdemsky  1.1.2.25             int depth1=0;
1425 bdemsky  1.1.2.25             for (int i=0;i<q.prevLength();i++) {
1426 bdemsky  1.1.2.25                 if (depth.containsKey(q.prev(i))) {
1427 bdemsky  1.1.2.25                     depth1=((Integer) (depth.get(q.prev(i)))).intValue();
1428 bdemsky  1.1.2.25                     break;
1429 bdemsky  1.1.2.25                 }
1430 bdemsky  1.1.2.25             }
1431 bdemsky  1.1.2.24             maxcheck(depth1);
1432 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1433 bdemsky  1.1.2.24         }
1434 bdemsky  1.1.2.24 
1435 bdemsky  1.1.2.24         public void visit(FOOTER q) {
1436 bdemsky  1.1.2.25             int depth1=0;
1437 bdemsky  1.1.2.25             for (int i=0;i<q.prevLength();i++) {
1438 bdemsky  1.1.2.25                 if (depth.containsKey(q.prev(i))) {
1439 bdemsky  1.1.2.25                     depth1=((Integer) (depth.get(q.prev(i)))).intValue();
1440 bdemsky  1.1.2.25                     break;
1441 bdemsky  1.1.2.25                 }
1442 bdemsky  1.1.2.25             }
1443 bdemsky  1.1.2.24             maxcheck(depth1);
1444 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1445 bdemsky  1.1.2.24         }
1446 bdemsky  1.1.2.24 
1447 bdemsky  1.1.2.24         public void visit(HANDLER q) {
1448 bdemsky  1.1.2.24             maxcheck(1);
1449 bdemsky  1.1.2.24             depth.put(q, new Integer(1));
1450 bdemsky  1.1.2.24         }
1451 bdemsky  1.1.2.24 
1452 bdemsky  1.1.2.24         public void visit(INSTANCEOF q) {
1453 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1454 bdemsky  1.1.2.24             depth1+=load(q,q.src());
1455 bdemsky  1.1.2.24             maxcheck(depth1);
1456 bdemsky  1.1.2.24             depth1-=load2(q, q.src());
1457 bdemsky  1.1.2.24             depth1+=1;
1458 bdemsky  1.1.2.24             maxcheck(depth1);
1459 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1460 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1461 bdemsky  1.1.2.24         }
1462 bdemsky  1.1.2.24         
1463 bdemsky  1.1.2.24         public void visit(CALL q) {
1464 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1465 bdemsky  1.1.2.24 
1466 bdemsky  1.1.2.24             if (q.isVirtual()&&!q.isInterfaceMethod()) {
1467 bdemsky  1.1.2.24                 //virtual method
1468 bdemsky  1.1.2.24                 for(int i=0;i<q.params().length;i++) {
1469 bdemsky  1.1.2.24                     depth1+=load(q,q.params(i)); 
1470 bdemsky  1.1.2.24                 }
1471 bdemsky  1.1.2.24                 maxcheck(depth1);
1472 bdemsky  1.1.2.24                 for(int i=0;i<q.params().length;i++) {
1473 bdemsky  1.1.2.24                     depth1-=load2(q,q.params(i)); 
1474 bdemsky  1.1.2.24                 }
1475 bdemsky  1.1.2.24                 if (q.retval()!=null)
1476 bdemsky  1.1.2.24                     depth1+=load2(q,q.retval());
1477 bdemsky  1.1.2.24                 maxcheck(depth1);
1478 bdemsky  1.1.2.24                 if (q.retval()!=null)
1479 bdemsky  1.1.2.24                     depth1+=store(q,q.retval());
1480 bdemsky  1.1.2.24                 depth.put(q, new Integer(depth1));
1481 bdemsky  1.1.2.24             } 
1482 bdemsky  1.1.2.24             else {
1483 bdemsky  1.1.2.24                 if (q.isInterfaceMethod()) {
1484 bdemsky  1.1.2.24                     for(int i=0;i<q.params().length;i++) {
1485 bdemsky  1.1.2.24                         depth1+=load(q,q.params(i)); 
1486 bdemsky  1.1.2.24                     }
1487 bdemsky  1.1.2.24                     maxcheck(depth1);
1488 bdemsky  1.1.2.24                     for(int i=0;i<q.params().length;i++) {
1489 bdemsky  1.1.2.24                         depth1-=load2(q,q.params(i)); 
1490 bdemsky  1.1.2.24                     }
1491 bdemsky  1.1.2.24                     if (q.retval()!=null)
1492 bdemsky  1.1.2.24                         depth1+=load2(q,q.retval());
1493 bdemsky  1.1.2.24                     maxcheck(depth1);
1494 bdemsky  1.1.2.24                     if (q.retval()!=null)
1495 bdemsky  1.1.2.24                         depth1+=store(q,q.retval());
1496 bdemsky  1.1.2.24                     depth.put(q, new Integer(depth1));
1497 bdemsky  1.1.2.24                 }
1498 bdemsky  1.1.2.24                 else
1499 bdemsky  1.1.2.24                     if(q.isStatic()) {
1500 bdemsky  1.1.2.24                         //static method
1501 bdemsky  1.1.2.24                         for(int i=0;i<q.params().length;i++) {
1502 bdemsky  1.1.2.24                             depth1+=load(q,q.params(i)); 
1503 bdemsky  1.1.2.24                         }
1504 bdemsky  1.1.2.24                         maxcheck(depth1);
1505 bdemsky  1.1.2.24                         for(int i=0;i<q.params().length;i++) {
1506 bdemsky  1.1.2.24                             depth1-=load2(q,q.params(i)); 
1507 bdemsky  1.1.2.24                         }
1508 bdemsky  1.1.2.24                         if (q.retval()!=null)
1509 bdemsky  1.1.2.24                             depth1+=load2(q,q.retval());
1510 bdemsky  1.1.2.24                         maxcheck(depth1);
1511 bdemsky  1.1.2.24                         if (q.retval()!=null)
1512 bdemsky  1.1.2.24                             depth1+=store(q,q.retval());
1513 bdemsky  1.1.2.24                         depth.put(q, new Integer(depth1));
1514 bdemsky  1.1.2.24                     }
1515 bdemsky  1.1.2.24                     else {
1516 bdemsky  1.1.2.24                                         //non-virtual method
1517 bdemsky  1.1.2.24                         for(int i=0;i<q.params().length;i++) {
1518 bdemsky  1.1.2.24                             depth1+=load(q,q.params(i)); 
1519 bdemsky  1.1.2.24                         }
1520 bdemsky  1.1.2.24                         maxcheck(depth1);
1521 bdemsky  1.1.2.24                         for(int i=0;i<q.params().length;i++) {
1522 bdemsky  1.1.2.24                             depth1-=load2(q,q.params(i)); 
1523 bdemsky  1.1.2.24                         }
1524 bdemsky  1.1.2.24                         if (q.retval()!=null)
1525 bdemsky  1.1.2.24                             depth1+=load2(q,q.retval());
1526 bdemsky  1.1.2.24                         maxcheck(depth1);
1527 bdemsky  1.1.2.24                         if (q.retval()!=null)
1528 bdemsky  1.1.2.24                             depth1+=store(q,q.retval());
1529 bdemsky  1.1.2.24                         depth.put(q, new Integer(depth1));
1530 bdemsky  1.1.2.24                     }
1531 bdemsky  1.1.2.24             }
1532 bdemsky  1.1.2.24         }
1533 bdemsky  1.1.2.24 
1534 bdemsky  1.1.2.24         public void visit(GET q) {
1535 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1536 bdemsky  1.1.2.24             if (q.objectref()==null) {
1537 bdemsky  1.1.2.24                 //Static
1538 bdemsky  1.1.2.26                 depth1+=load2(q, q.dst());
1539 bdemsky  1.1.2.24                 maxcheck(depth1);
1540 bdemsky  1.1.2.24             }
1541 bdemsky  1.1.2.24             else {
1542 bdemsky  1.1.2.24                 depth1+=load(q,q.objectref());
1543 bdemsky  1.1.2.24                 maxcheck(depth1);
1544 bdemsky  1.1.2.24                 depth1-=load2(q,q.objectref());
1545 bdemsky  1.1.2.26                 depth1+=load2(q, q.dst());
1546 bdemsky  1.1.2.26                 maxcheck(depth1);
1547 bdemsky  1.1.2.24             }
1548 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1549 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1550 bdemsky  1.1.2.24         }
1551 bdemsky  1.1.2.24 
1552 bdemsky  1.1.2.24         public void visit(CJMP q) {
1553 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1554 bdemsky  1.1.2.24             if (!skip.contains(q)) {
1555 bdemsky  1.1.2.24                 depth1+=load(q,q.test());
1556 bdemsky  1.1.2.24                 maxcheck(depth1);
1557 bdemsky  1.1.2.24                 depth1-=load2(q,q.test());
1558 bdemsky  1.1.2.24             }
1559 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1560 bdemsky  1.1.2.24         }
1561 bdemsky  1.1.2.24 
1562 bdemsky  1.1.2.24         public void visit(THROW q) {
1563 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1564 bdemsky  1.1.2.24             depth1+=load(q,q.throwable());
1565 bdemsky  1.1.2.24             maxcheck(depth1);
1566 bdemsky  1.1.2.24             depth1-=load2(q, q.throwable());
1567 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1568 bdemsky  1.1.2.24         }
1569 bdemsky  1.1.2.24 
1570 bdemsky  1.1.2.24         public void visit(MONITORENTER q) {
1571 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1572 bdemsky  1.1.2.24             depth1+=load(q,q.lock());
1573 bdemsky  1.1.2.24             maxcheck(depth1);
1574 bdemsky  1.1.2.24             depth1-=load2(q,q.lock());
1575 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1576 bdemsky  1.1.2.24         }
1577 bdemsky  1.1.2.24 
1578 bdemsky  1.1.2.24         public void visit(MONITOREXIT q) {
1579 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1580 bdemsky  1.1.2.24             depth1+=load(q,q.lock());
1581 bdemsky  1.1.2.24             maxcheck(depth1);
1582 bdemsky  1.1.2.24             depth1-=load2(q,q.lock());
1583 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1584 bdemsky  1.1.2.24         }
1585 bdemsky  1.1.2.24 
1586 bdemsky  1.1.2.24         public void visit(MOVE q) {
1587 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1588 bdemsky  1.1.2.24             depth1+=load(q,q.src());
1589 bdemsky  1.1.2.24             maxcheck(depth1);
1590 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1591 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1592 bdemsky  1.1.2.24         }
1593 bdemsky  1.1.2.24 
1594 bdemsky  1.1.2.24         public void visit(NEW q) {
1595 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1596 bdemsky  1.1.2.24             depth1+=load2(q,q.dst());
1597 bdemsky  1.1.2.24             maxcheck(depth1);
1598 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1599 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1600 bdemsky  1.1.2.24         }
1601 bdemsky  1.1.2.24 
1602 bdemsky  1.1.2.24         public void visit(LABEL q) {
1603 bdemsky  1.1.2.24             int depth1=0;
1604 bdemsky  1.1.2.24             for (int i=0;i<q.prevLength();i++) {
1605 bdemsky  1.1.2.24                 if (depth.containsKey(q.prev(i))) {
1606 bdemsky  1.1.2.24                     depth1=((Integer) (depth.get(q.prev(i)))).intValue();
1607 bdemsky  1.1.2.24                     break;
1608 bdemsky  1.1.2.24                 }
1609 bdemsky  1.1.2.24             }
1610 bdemsky  1.1.2.24             maxcheck(depth1);
1611 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1612 bdemsky  1.1.2.24         }
1613 bdemsky  1.1.2.24 
1614 bdemsky  1.1.2.24         public void visit(NOP q) {
1615 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1616 bdemsky  1.1.2.24             maxcheck(depth1);
1617 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1618 bdemsky  1.1.2.24         }
1619 bdemsky  1.1.2.24 
1620 bdemsky  1.1.2.24         public void visit(CONST q) {
1621 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1622 bdemsky  1.1.2.24             depth1+=load2(q,q.dst());
1623 bdemsky  1.1.2.24             maxcheck(depth1);
1624 bdemsky  1.1.2.24             depth1+=store(q,q.dst());
1625 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1626 bdemsky  1.1.2.24         }
1627 bdemsky  1.1.2.24         
1628 bdemsky  1.1.2.24         public void visit(RETURN q) {
1629 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1630 bdemsky  1.1.2.24             if (q.retval()!=null)
1631 bdemsky  1.1.2.24                 depth1+=load(q,q.retval());
1632 bdemsky  1.1.2.24             maxcheck(depth1);
1633 bdemsky  1.1.2.24             //doesn't matter...end of method
1634 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1635 bdemsky  1.1.2.24         }
1636 bdemsky  1.1.2.24 
1637 bdemsky  1.1.2.24         public void visit(SET q) {
1638 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1639 bdemsky  1.1.2.24             if (q.objectref()==null) {
1640 bdemsky  1.1.2.24                 //Static
1641 bdemsky  1.1.2.24                 depth1+=load(q,q.src());
1642 bdemsky  1.1.2.24                 maxcheck(depth1);
1643 bdemsky  1.1.2.24                 depth1-=load2(q,q.src());
1644 bdemsky  1.1.2.24             }
1645 bdemsky  1.1.2.24             else {
1646 bdemsky  1.1.2.24                 load(q,q.objectref());
1647 bdemsky  1.1.2.24                 load(q,q.src());
1648 bdemsky  1.1.2.24                 depth1+=load(q,q.objectref());
1649 bdemsky  1.1.2.24                 depth1+=load(q,q.src());
1650 bdemsky  1.1.2.24                 maxcheck(depth1);
1651 bdemsky  1.1.2.24                 depth1-=load2(q,q.objectref());
1652 bdemsky  1.1.2.24                 depth1-=load2(q,q.src());
1653 bdemsky  1.1.2.24             }
1654 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1655 bdemsky  1.1.2.24         }
1656 bdemsky  1.1.2.24 
1657 bdemsky  1.1.2.24         public void visit(SWITCH q) {
1658 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1659 bdemsky  1.1.2.24             depth1+=load(q,q.index());
1660 bdemsky  1.1.2.24             maxcheck(depth1);
1661 bdemsky  1.1.2.24             depth1-=load2(q,q.index());
1662 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1663 bdemsky  1.1.2.24         }
1664 bdemsky  1.1.2.24 
1665 bdemsky  1.1.2.24         public void visit(TYPECAST q) {
1666 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1667 bdemsky  1.1.2.24             depth1+=load(q,q.objectref());
1668 bdemsky  1.1.2.24             maxcheck(depth1);
1669 bdemsky  1.1.2.24             depth1+=store(q,q.objectref());
1670 bdemsky  1.1.2.24             depth.put(q, new Integer(depth1));
1671 bdemsky  1.1.2.24         }
1672 bdemsky  1.1.2.24 
1673 bdemsky  1.1.2.24         //This method handles operands
1674 bdemsky  1.1.2.24         //really 3 cases:
1675 bdemsky  1.1.2.24         //normal, compares that are done with compares,
1676 bdemsky  1.1.2.24         //compares done with conditional branches
1677 bdemsky  1.1.2.24 
1678 bdemsky  1.1.2.24         public void visit(OPER q) {
1679 bdemsky  1.1.2.24             int depth1=((Integer) (depth.get(q.prev(0)))).intValue();
1680 bdemsky  1.1.2.24 
1681 bdemsky  1.1.2.24             switch (q.opcode()) {
1682 bdemsky  1.1.2.24             case Qop.LCMPEQ:
1683 bdemsky  1.1.2.24                 
1684 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++)
1685 bdemsky  1.1.2.24                     depth1+=load(q,q.operands(i));
1686 bdemsky  1.1.2.24                 maxcheck(depth1);
1687 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++)
1688 bdemsky  1.1.2.24                     depth1-=load2(q,q.operands(i));
1689 bdemsky  1.1.2.24                 depth1+=1;
1690 bdemsky  1.1.2.24                 maxcheck(depth1);
1691 bdemsky  1.1.2.24 
1692 bdemsky  1.1.2.24                 q.next(0).accept(cjmp);
1693 bdemsky  1.1.2.24                 boolean testcjmp=cjmp.cjmp();
1694 bdemsky  1.1.2.24                 if (testcjmp) {
1695 bdemsky  1.1.2.24                     CJMP qnext=(CJMP)q.next(0);
1696 bdemsky  1.1.2.24                     if ((qnext.test()==q.dst())&&
1697 bdemsky  1.1.2.24                         (ud.useMap(hc, q.dst()).length==1)) {
1698 bdemsky  1.1.2.24                         skip.add(qnext);
1699 bdemsky  1.1.2.24                         depth1-=1;
1700 bdemsky  1.1.2.24                     } else
1701 bdemsky  1.1.2.24                         testcjmp=false;
1702 bdemsky  1.1.2.24                 } 
1703 bdemsky  1.1.2.24                 if (!testcjmp) {
1704 bdemsky  1.1.2.24                     depth1+=store(q,q.dst());
1705 bdemsky  1.1.2.24                 }
1706 bdemsky  1.1.2.24                 depth.put(q, new Integer(depth1));
1707 bdemsky  1.1.2.24                 break;
1708 bdemsky  1.1.2.24 
1709 bdemsky  1.1.2.24             case Qop.LCMPGT:
1710 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++)
1711 bdemsky  1.1.2.24                     depth1+=load(q,q.operands(i));
1712 bdemsky  1.1.2.24                 maxcheck(depth1);
1713 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++)
1714 bdemsky  1.1.2.24                     depth1-=load2(q,q.operands(i));
1715 bdemsky  1.1.2.24                 depth1+=1;
1716 bdemsky  1.1.2.24                 maxcheck(depth1);
1717 bdemsky  1.1.2.24 
1718 bdemsky  1.1.2.24                 q.next(0).accept(cjmp);
1719 bdemsky  1.1.2.24                 testcjmp=cjmp.cjmp();
1720 bdemsky  1.1.2.24                 if (testcjmp) {
1721 bdemsky  1.1.2.24                     CJMP qnext=(CJMP)q.next(0);
1722 bdemsky  1.1.2.24                     if ((qnext.test()==q.dst())&&
1723 bdemsky  1.1.2.24                         (ud.useMap(hc, q.dst()).length==1)) {
1724 bdemsky  1.1.2.24                         skip.add(qnext);
1725 bdemsky  1.1.2.24                         depth1-=1;
1726 bdemsky  1.1.2.24                     } else
1727 bdemsky  1.1.2.24                         testcjmp=false;
1728 bdemsky  1.1.2.24                 } 
1729 bdemsky  1.1.2.24                 if (!testcjmp) {
1730 bdemsky  1.1.2.24                     depth1+=store(q,q.dst());
1731 bdemsky  1.1.2.24                 }
1732 bdemsky  1.1.2.24                 depth.put(q, new Integer(depth1));
1733 bdemsky  1.1.2.24                 break;
1734 bdemsky  1.1.2.24             case Qop.DCMPEQ:
1735 bdemsky  1.1.2.24             case Qop.DCMPGE:
1736 bdemsky  1.1.2.24             case Qop.DCMPGT:
1737 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++)
1738 bdemsky  1.1.2.24                     depth1+=load(q,q.operands(i));
1739 bdemsky  1.1.2.24                 maxcheck(depth1);
1740 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++)
1741 bdemsky  1.1.2.24                     depth1-=load2(q,q.operands(i));
1742 bdemsky  1.1.2.24                 depth1+=1;
1743 bdemsky  1.1.2.24                 maxcheck(depth1);
1744 bdemsky  1.1.2.24 
1745 bdemsky  1.1.2.24 
1746 bdemsky  1.1.2.24                 q.next(0).accept(cjmp);
1747 bdemsky  1.1.2.24                 testcjmp=cjmp.cjmp();
1748 bdemsky  1.1.2.24                 if (testcjmp) {
1749 bdemsky  1.1.2.24                     CJMP qnext=(CJMP)q.next(0);
1750 bdemsky  1.1.2.24                     if ((qnext.test()==q.dst())&&
1751 bdemsky  1.1.2.24                         (ud.useMap(hc, q.dst()).length==1)) {
1752 bdemsky  1.1.2.24                         skip.add(qnext);
1753 bdemsky  1.1.2.24                         depth1-=1;
1754 bdemsky  1.1.2.24                     } else
1755 bdemsky  1.1.2.24                         testcjmp=false;
1756 bdemsky  1.1.2.24                 }
1757 bdemsky  1.1.2.24                 if (!testcjmp) {
1758 bdemsky  1.1.2.24                     depth1+=store(q,q.dst());
1759 bdemsky  1.1.2.24                 }
1760 bdemsky  1.1.2.24                 depth.put(q, new Integer(depth1));
1761 bdemsky  1.1.2.24                 break;
1762 bdemsky  1.1.2.24 
1763 bdemsky  1.1.2.24             case Qop.FCMPEQ:
1764 bdemsky  1.1.2.24             case Qop.FCMPGE:
1765 bdemsky  1.1.2.24             case Qop.FCMPGT:
1766 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++)
1767 bdemsky  1.1.2.24                     depth1+=load(q,q.operands(i));
1768 bdemsky  1.1.2.24                 maxcheck(depth1);
1769 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++)
1770 bdemsky  1.1.2.24                     depth1-=load2(q,q.operands(i));
1771 bdemsky  1.1.2.24                 depth1+=1;
1772 bdemsky  1.1.2.24                 maxcheck(depth1);
1773 bdemsky  1.1.2.24                 
1774 bdemsky  1.1.2.24                 q.next(0).accept(cjmp);
1775 bdemsky  1.1.2.24                 testcjmp=cjmp.cjmp();
1776 bdemsky  1.1.2.24                 if (testcjmp) {
1777 bdemsky  1.1.2.24                     CJMP qnext=(CJMP)q.next(0);
1778 bdemsky  1.1.2.24                     if ((qnext.test()==q.dst())&&
1779 bdemsky  1.1.2.24                         (ud.useMap(hc, q.dst()).length==1)) {
1780 bdemsky  1.1.2.24                         skip.add(qnext);
1781 bdemsky  1.1.2.24                         depth1-=1;
1782 bdemsky  1.1.2.24                     } else
1783 bdemsky  1.1.2.24                         testcjmp=false;
1784 bdemsky  1.1.2.24                 }
1785 bdemsky  1.1.2.24                 if (!testcjmp) {
1786 bdemsky  1.1.2.24                     depth1+=store(q,q.dst());
1787 bdemsky  1.1.2.24                 }
1788 bdemsky  1.1.2.24                 depth.put(q, new Integer(depth1));
1789 bdemsky  1.1.2.24                 break;
1790 bdemsky  1.1.2.24 
1791 bdemsky  1.1.2.24             case Qop.ACMPEQ:
1792 bdemsky  1.1.2.24             case Qop.ICMPEQ:
1793 bdemsky  1.1.2.24             case Qop.ICMPGT:
1794 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++) {
1795 bdemsky  1.1.2.24                     depth1+=load(q,q.operands(i));
1796 bdemsky  1.1.2.24                 }
1797 bdemsky  1.1.2.24                 maxcheck(depth1);
1798 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++) {
1799 bdemsky  1.1.2.24                     depth1-=load2(q,q.operands(i));
1800 bdemsky  1.1.2.24                 }
1801 bdemsky  1.1.2.24                 q.next(0).accept(cjmp);
1802 bdemsky  1.1.2.24                 testcjmp=cjmp.cjmp();
1803 bdemsky  1.1.2.24                 if (testcjmp) {
1804 bdemsky  1.1.2.24                     CJMP qnext=(CJMP)q.next(0);
1805 bdemsky  1.1.2.24                     
1806 bdemsky  1.1.2.24                     if ((qnext.test()==q.dst())&&
1807 bdemsky  1.1.2.24                         (ud.useMap(hc, q.dst()).length==1)) {
1808 bdemsky  1.1.2.24                         skip.add(qnext);
1809 bdemsky  1.1.2.24                     } else
1810 bdemsky  1.1.2.24                         testcjmp=false;
1811 bdemsky  1.1.2.24                 }
1812 bdemsky  1.1.2.24                 if (!testcjmp) {
1813 bdemsky  1.1.2.24                     depth1+=store(q,q.dst());
1814 bdemsky  1.1.2.24                 }
1815 bdemsky  1.1.2.24                 depth.put(q, new Integer(depth1));
1816 bdemsky  1.1.2.24                 break;
1817 bdemsky  1.1.2.24             case Qop.D2F:
1818 bdemsky  1.1.2.24             case Qop.D2I:
1819 bdemsky  1.1.2.24             case Qop.D2L:
1820 bdemsky  1.1.2.24             case Qop.DADD:
1821 bdemsky  1.1.2.24             case Qop.DDIV:
1822 bdemsky  1.1.2.24             case Qop.DMUL:
1823 bdemsky  1.1.2.24             case Qop.DNEG:
1824 bdemsky  1.1.2.24             case Qop.DREM:
1825 bdemsky  1.1.2.24             case Qop.F2D:
1826 bdemsky  1.1.2.24             case Qop.F2I:
1827 bdemsky  1.1.2.24             case Qop.F2L:
1828 bdemsky  1.1.2.24             case Qop.FADD:
1829 bdemsky  1.1.2.24             case Qop.FDIV:
1830 bdemsky  1.1.2.24             case Qop.FMUL:
1831 bdemsky  1.1.2.24             case Qop.FNEG:
1832 bdemsky  1.1.2.24             case Qop.FREM:
1833 bdemsky  1.1.2.24             case Qop.I2B:
1834 bdemsky  1.1.2.24             case Qop.I2C:
1835 bdemsky  1.1.2.24             case Qop.I2D:
1836 bdemsky  1.1.2.24             case Qop.I2F:
1837 bdemsky  1.1.2.24             case Qop.I2L:
1838 bdemsky  1.1.2.24             case Qop.I2S:
1839 bdemsky  1.1.2.24             case Qop.IADD:
1840 bdemsky  1.1.2.24             case Qop.IAND:
1841 bdemsky  1.1.2.24             case Qop.IDIV:
1842 bdemsky  1.1.2.24             case Qop.IMUL:
1843 bdemsky  1.1.2.24             case Qop.INEG:
1844 bdemsky  1.1.2.24             case Qop.IOR:
1845 bdemsky  1.1.2.24             case Qop.IREM:
1846 bdemsky  1.1.2.24             case Qop.ISHL:
1847 bdemsky  1.1.2.24             case Qop.ISHR:
1848 bdemsky  1.1.2.24             case Qop.IUSHR:
1849 bdemsky  1.1.2.24             case Qop.IXOR:
1850 bdemsky  1.1.2.24             case Qop.L2D:
1851 bdemsky  1.1.2.24             case Qop.L2I:
1852 bdemsky  1.1.2.24             case Qop.L2F:
1853 bdemsky  1.1.2.24             case Qop.LADD:
1854 bdemsky  1.1.2.24             case Qop.LAND:
1855 bdemsky  1.1.2.24             case Qop.LDIV:
1856 bdemsky  1.1.2.24             case Qop.LMUL:
1857 bdemsky  1.1.2.24             case Qop.LNEG:
1858 bdemsky  1.1.2.24             case Qop.LOR:
1859 bdemsky  1.1.2.24             case Qop.LREM:
1860 bdemsky  1.1.2.24             case Qop.LSHL:
1861 bdemsky  1.1.2.24             case Qop.LSHR:
1862 bdemsky  1.1.2.24             case Qop.LUSHR:
1863 bdemsky  1.1.2.24             case Qop.LXOR:
1864 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++) {
1865 bdemsky  1.1.2.24                     depth1+=load(q,q.operands(i));
1866 bdemsky  1.1.2.24                 }
1867 bdemsky  1.1.2.24                 maxcheck(depth1);
1868 bdemsky  1.1.2.24                 for (int i=0;i<q.operandsLength();i++) {
1869 bdemsky  1.1.2.24                     depth1-=load2(q,q.operands(i));
1870 bdemsky  1.1.2.24                 }
1871 bdemsky  1.1.2.24                 depth1+=load2(q,q.dst());
1872 bdemsky  1.1.2.24                 depth1+=store(q,q.dst());
1873 bdemsky  1.1.2.24                 depth.put(q, new Integer(depth1));
1874 bdemsky  1.1.2.24                 break;
1875 bdemsky  1.1.2.24             default:
1876 bdemsky  1.1.2.24             }
1877 bdemsky  1.1.2.24         }
1878 bdemsky  1.1.2.24 
1879 bdemsky  1.1.2.24         private int store(Quad q,Temp t) {
1880 bdemsky  1.1.2.24             // Should be ok to pass null for HCodeElement param
1881 bdemsky  1.1.2.24             HClass tp=tm.typeMap(q,t); 
1882 bdemsky  1.1.2.24             int size;
1883 bdemsky  1.1.2.24             if ((tp==HClass.Boolean)||
1884 bdemsky  1.1.2.24                 (tp==HClass.Byte)||
1885 bdemsky  1.1.2.24                 (tp==HClass.Char)||
1886 bdemsky  1.1.2.24                 (tp==HClass.Short)||
1887 bdemsky  1.1.2.24                 (tp==HClass.Int))
1888 bdemsky  1.1.2.24                 size=-1;
1889 bdemsky  1.1.2.24             else
1890 bdemsky  1.1.2.24                 if (tp==HClass.Double)
1891 bdemsky  1.1.2.24                     size=-2;
1892 bdemsky  1.1.2.24                 else
1893 bdemsky  1.1.2.24                     if (tp==HClass.Float)
1894 bdemsky  1.1.2.24                         size=-1;
1895 bdemsky  1.1.2.24                     else
1896 bdemsky  1.1.2.24                         if (tp==HClass.Long)
1897 bdemsky  1.1.2.24                             size=-2;
1898 bdemsky  1.1.2.24                         else
1899 bdemsky  1.1.2.24                             size=-1;
1900 bdemsky  1.1.2.24             TempInfo dest=(TempInfo)tempmap.get(t);
1901 bdemsky  1.1.2.24             if (!dest.stack)
1902 bdemsky  1.1.2.24                 return size;
1903 bdemsky  1.1.2.24             else
1904 bdemsky  1.1.2.24                 return 0;
1905 bdemsky  1.1.2.24         }
1906 bdemsky  1.1.2.24 
1907 bdemsky  1.1.2.24         private int load2(Quad q,Temp t) {
1908 bdemsky  1.1.2.24             // Should be ok to pass null for HCodeElement param
1909 bdemsky  1.1.2.24             int size=0;
1910 bdemsky  1.1.2.24             HClass tp=tm.typeMap(q,t);
1911 bdemsky  1.1.2.24             if ((tp==HClass.Boolean)||
1912 bdemsky  1.1.2.24                 (tp==HClass.Byte)||
1913 bdemsky  1.1.2.24                 (tp==HClass.Char)||
1914 bdemsky  1.1.2.24                 (tp==HClass.Short)||
1915 bdemsky  1.1.2.24                 (tp==HClass.Int))
1916 bdemsky  1.1.2.24                 size=1;
1917 bdemsky  1.1.2.24             else
1918 bdemsky  1.1.2.24                 if (tp==HClass.Double)
1919 bdemsky  1.1.2.24                     size=2;
1920 bdemsky  1.1.2.24                 else
1921 bdemsky  1.1.2.24                     if (tp==HClass.Float)
1922 bdemsky  1.1.2.24                         size=1;
1923 bdemsky  1.1.2.24                     else
1924 bdemsky  1.1.2.24                         if (tp==HClass.Long)
1925 bdemsky  1.1.2.24                             size=2;
1926 bdemsky  1.1.2.24                         else
1927 bdemsky  1.1.2.24                             size=1;
1928 bdemsky  1.1.2.24             return size;
1929 bdemsky  1.1.2.24         }
1930 bdemsky  1.1.2.24         private int load(Quad q,Temp t) {
1931 bdemsky  1.1.2.24             // Should be ok to pass null for HCodeElement param
1932 bdemsky  1.1.2.24             int size=0;
1933 bdemsky  1.1.2.24             HClass tp=tm.typeMap(q,t);
1934 bdemsky  1.1.2.24             if ((tp==HClass.Boolean)||
1935 bdemsky  1.1.2.24                 (tp==HClass.Byte)||
1936 bdemsky  1.1.2.24                 (tp==HClass.Char)||
1937 bdemsky  1.1.2.24                 (tp==HClass.Short)||
1938 bdemsky  1.1.2.24                 (tp==HClass.Int))
1939 bdemsky  1.1.2.24                 size=1;
1940 bdemsky  1.1.2.24             else
1941 bdemsky  1.1.2.24                 if (tp==HClass.Double)
1942 bdemsky  1.1.2.24                     size=2;
1943 bdemsky  1.1.2.24                 else
1944 bdemsky  1.1.2.24                     if (tp==HClass.Float)
1945 bdemsky  1.1.2.24                         size=1;
1946 bdemsky  1.1.2.24                     else
1947 bdemsky  1.1.2.24                         if (tp==HClass.Long)
1948 bdemsky  1.1.2.24                             size=2;
1949 bdemsky  1.1.2.24                         else
1950 bdemsky  1.1.2.24                             size=1;
1951 bdemsky  1.1.2.24             TempInfo dest=(TempInfo)tempmap.get(t);
1952 bdemsky  1.1.2.24             if (!dest.stack)
1953 bdemsky  1.1.2.24                 return size;
1954 bdemsky  1.1.2.24             else
1955 bdemsky  1.1.2.24                 return 0;
1956 bdemsky  1.1.2.24         }
1957 bdemsky  1.1.2.24     }
1958 bdemsky  1.1.2.29     String escapeFloat(Float f) {
1959 bdemsky  1.1.2.30         //      if (f.isNaN()||f.isInfinite()) {
1960 bdemsky  1.1.2.29             int i=Float.floatToIntBits(f.floatValue());
1961 bdemsky  1.1.2.29             String s=Integer.toHexString(i);
1962 bdemsky  1.1.2.29             while (s.length()!=8) 
1963 bdemsky  1.1.2.29                 s=new String("0"+s);
1964 bdemsky  1.1.2.29             return new String("0\\"+s);
1965 bdemsky  1.1.2.30             //}
1966 bdemsky  1.1.2.30             //else return f.toString();
1967 bdemsky  1.1.2.29     }
1968 bdemsky  1.1.2.24 
1969 bdemsky  1.1.2.29     String escapeDouble(Double f) {
1970 bdemsky  1.1.2.30         //if (f.isNaN()||f.isInfinite()) {
1971 bdemsky  1.1.2.29             long i=Double.doubleToLongBits(f.doubleValue());
1972 bdemsky  1.1.2.29             String s=Long.toHexString(i);
1973 bdemsky  1.1.2.29             while (s.length()!=16) 
1974 bdemsky  1.1.2.29                 s=new String("0"+s);
1975 bdemsky  1.1.2.29             return new String("1\\"+s);
1976 bdemsky  1.1.2.30             //}
1977 bdemsky  1.1.2.30             //else return f.toString();
1978 bdemsky  1.1.2.29     }
1979 bdemsky  1.1.2.1  }
1980 bdemsky  1.1.2.12 
1981 bdemsky  1.1.2.12 
1982 cananian 1.2