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