001    
002    /*
003     * THIS FILE IS MACHINE_GENERATED. DO NOT EDIT.
004     * See InstructionFormats.template, InstructionFormatList.dat,
005     * OperatorList.dat, etc.
006     */
007    
008    package org.jikesrvm.compilers.opt.ir;
009    
010    import org.jikesrvm.Configuration;
011    import org.jikesrvm.compilers.opt.ir.operand.ia32.IA32ConditionOperand; //NOPMD
012    import org.jikesrvm.compilers.opt.ir.operand.*;
013    
014    /**
015     * The LookupSwitch InstructionFormat class.
016     *
017     * The header comment for {@link Instruction} contains
018     * an explanation of the role of InstructionFormats in the
019     * opt compiler's IR.
020     */
021    @SuppressWarnings("unused")  // Machine generated code is never 100% clean
022    public final class LookupSwitch extends InstructionFormat {
023      /**
024       * InstructionFormat identification method for LookupSwitch.
025       * @param i an instruction
026       * @return <code>true</code> if the InstructionFormat of the argument
027       *         instruction is LookupSwitch or <code>false</code>
028       *         if it is not.
029       */
030      public static boolean conforms(Instruction i) {
031        return conforms(i.operator);
032      }
033      /**
034       * InstructionFormat identification method for LookupSwitch.
035       * @param o an instruction
036       * @return <code>true</code> if the InstructionFormat of the argument
037       *         operator is LookupSwitch or <code>false</code>
038       *         if it is not.
039       */
040      public static boolean conforms(Operator o) {
041        return o.format == LookupSwitch_format;
042      }
043    
044      /**
045       * Get the operand called Value from the
046       * argument instruction. Note that the returned operand
047       * will still point to its containing instruction.
048       * @param i the instruction to fetch the operand from
049       * @return the operand called Value
050       */
051      public static Operand getValue(Instruction i) {
052        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
053        return (Operand) i.getOperand(0);
054      }
055      /**
056       * Get the operand called Value from the argument
057       * instruction clearing its instruction pointer. The returned
058       * operand will not point to any containing instruction.
059       * @param i the instruction to fetch the operand from
060       * @return the operand called Value
061       */
062      public static Operand getClearValue(Instruction i) {
063        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
064        return (Operand) i.getClearOperand(0);
065      }
066      /**
067       * Set the operand called Value in the argument
068       * instruction to the argument operand. The operand will
069       * now point to the argument instruction as its containing
070       * instruction.
071       * @param i the instruction in which to store the operand
072       * @param Value the operand to store
073       */
074      public static void setValue(Instruction i, Operand Value) {
075        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
076        i.putOperand(0, Value);
077      }
078      /**
079       * Return the index of the operand called Value
080       * in the argument instruction.
081       * @param i the instruction to access.
082       * @return the index of the operand called Value
083       *         in the argument instruction
084       */
085      public static int indexOfValue(Instruction i) {
086        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
087        return 0;
088      }
089      /**
090       * Does the argument instruction have a non-null
091       * operand named Value?
092       * @param i the instruction to access.
093       * @return <code>true</code> if the instruction has an non-null
094       *         operand named Value or <code>false</code>
095       *         if it does not.
096       */
097      public static boolean hasValue(Instruction i) {
098        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
099        return i.getOperand(0) != null;
100      }
101    
102      /**
103       * Get the operand called Unknown1 from the
104       * argument instruction. Note that the returned operand
105       * will still point to its containing instruction.
106       * @param i the instruction to fetch the operand from
107       * @return the operand called Unknown1
108       */
109      public static Operand getUnknown1(Instruction i) {
110        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
111        return (Operand) i.getOperand(1);
112      }
113      /**
114       * Get the operand called Unknown1 from the argument
115       * instruction clearing its instruction pointer. The returned
116       * operand will not point to any containing instruction.
117       * @param i the instruction to fetch the operand from
118       * @return the operand called Unknown1
119       */
120      public static Operand getClearUnknown1(Instruction i) {
121        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
122        return (Operand) i.getClearOperand(1);
123      }
124      /**
125       * Set the operand called Unknown1 in the argument
126       * instruction to the argument operand. The operand will
127       * now point to the argument instruction as its containing
128       * instruction.
129       * @param i the instruction in which to store the operand
130       * @param Unknown1 the operand to store
131       */
132      public static void setUnknown1(Instruction i, Operand Unknown1) {
133        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
134        i.putOperand(1, Unknown1);
135      }
136      /**
137       * Return the index of the operand called Unknown1
138       * in the argument instruction.
139       * @param i the instruction to access.
140       * @return the index of the operand called Unknown1
141       *         in the argument instruction
142       */
143      public static int indexOfUnknown1(Instruction i) {
144        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
145        return 1;
146      }
147      /**
148       * Does the argument instruction have a non-null
149       * operand named Unknown1?
150       * @param i the instruction to access.
151       * @return <code>true</code> if the instruction has an non-null
152       *         operand named Unknown1 or <code>false</code>
153       *         if it does not.
154       */
155      public static boolean hasUnknown1(Instruction i) {
156        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
157        return i.getOperand(1) != null;
158      }
159    
160      /**
161       * Get the operand called Unknown2 from the
162       * argument instruction. Note that the returned operand
163       * will still point to its containing instruction.
164       * @param i the instruction to fetch the operand from
165       * @return the operand called Unknown2
166       */
167      public static Operand getUnknown2(Instruction i) {
168        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
169        return (Operand) i.getOperand(2);
170      }
171      /**
172       * Get the operand called Unknown2 from the argument
173       * instruction clearing its instruction pointer. The returned
174       * operand will not point to any containing instruction.
175       * @param i the instruction to fetch the operand from
176       * @return the operand called Unknown2
177       */
178      public static Operand getClearUnknown2(Instruction i) {
179        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
180        return (Operand) i.getClearOperand(2);
181      }
182      /**
183       * Set the operand called Unknown2 in the argument
184       * instruction to the argument operand. The operand will
185       * now point to the argument instruction as its containing
186       * instruction.
187       * @param i the instruction in which to store the operand
188       * @param Unknown2 the operand to store
189       */
190      public static void setUnknown2(Instruction i, Operand Unknown2) {
191        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
192        i.putOperand(2, Unknown2);
193      }
194      /**
195       * Return the index of the operand called Unknown2
196       * in the argument instruction.
197       * @param i the instruction to access.
198       * @return the index of the operand called Unknown2
199       *         in the argument instruction
200       */
201      public static int indexOfUnknown2(Instruction i) {
202        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
203        return 2;
204      }
205      /**
206       * Does the argument instruction have a non-null
207       * operand named Unknown2?
208       * @param i the instruction to access.
209       * @return <code>true</code> if the instruction has an non-null
210       *         operand named Unknown2 or <code>false</code>
211       *         if it does not.
212       */
213      public static boolean hasUnknown2(Instruction i) {
214        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
215        return i.getOperand(2) != null;
216      }
217    
218      /**
219       * Get the operand called Default from the
220       * argument instruction. Note that the returned operand
221       * will still point to its containing instruction.
222       * @param i the instruction to fetch the operand from
223       * @return the operand called Default
224       */
225      public static BranchOperand getDefault(Instruction i) {
226        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
227        return (BranchOperand) i.getOperand(3);
228      }
229      /**
230       * Get the operand called Default from the argument
231       * instruction clearing its instruction pointer. The returned
232       * operand will not point to any containing instruction.
233       * @param i the instruction to fetch the operand from
234       * @return the operand called Default
235       */
236      public static BranchOperand getClearDefault(Instruction i) {
237        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
238        return (BranchOperand) i.getClearOperand(3);
239      }
240      /**
241       * Set the operand called Default in the argument
242       * instruction to the argument operand. The operand will
243       * now point to the argument instruction as its containing
244       * instruction.
245       * @param i the instruction in which to store the operand
246       * @param Default the operand to store
247       */
248      public static void setDefault(Instruction i, BranchOperand Default) {
249        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
250        i.putOperand(3, Default);
251      }
252      /**
253       * Return the index of the operand called Default
254       * in the argument instruction.
255       * @param i the instruction to access.
256       * @return the index of the operand called Default
257       *         in the argument instruction
258       */
259      public static int indexOfDefault(Instruction i) {
260        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
261        return 3;
262      }
263      /**
264       * Does the argument instruction have a non-null
265       * operand named Default?
266       * @param i the instruction to access.
267       * @return <code>true</code> if the instruction has an non-null
268       *         operand named Default or <code>false</code>
269       *         if it does not.
270       */
271      public static boolean hasDefault(Instruction i) {
272        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
273        return i.getOperand(3) != null;
274      }
275    
276      /**
277       * Get the operand called DefaultBranchProfile from the
278       * argument instruction. Note that the returned operand
279       * will still point to its containing instruction.
280       * @param i the instruction to fetch the operand from
281       * @return the operand called DefaultBranchProfile
282       */
283      public static BranchProfileOperand getDefaultBranchProfile(Instruction i) {
284        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
285        return (BranchProfileOperand) i.getOperand(4);
286      }
287      /**
288       * Get the operand called DefaultBranchProfile from the argument
289       * instruction clearing its instruction pointer. The returned
290       * operand will not point to any containing instruction.
291       * @param i the instruction to fetch the operand from
292       * @return the operand called DefaultBranchProfile
293       */
294      public static BranchProfileOperand getClearDefaultBranchProfile(Instruction i) {
295        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
296        return (BranchProfileOperand) i.getClearOperand(4);
297      }
298      /**
299       * Set the operand called DefaultBranchProfile in the argument
300       * instruction to the argument operand. The operand will
301       * now point to the argument instruction as its containing
302       * instruction.
303       * @param i the instruction in which to store the operand
304       * @param DefaultBranchProfile the operand to store
305       */
306      public static void setDefaultBranchProfile(Instruction i, BranchProfileOperand DefaultBranchProfile) {
307        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
308        i.putOperand(4, DefaultBranchProfile);
309      }
310      /**
311       * Return the index of the operand called DefaultBranchProfile
312       * in the argument instruction.
313       * @param i the instruction to access.
314       * @return the index of the operand called DefaultBranchProfile
315       *         in the argument instruction
316       */
317      public static int indexOfDefaultBranchProfile(Instruction i) {
318        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
319        return 4;
320      }
321      /**
322       * Does the argument instruction have a non-null
323       * operand named DefaultBranchProfile?
324       * @param i the instruction to access.
325       * @return <code>true</code> if the instruction has an non-null
326       *         operand named DefaultBranchProfile or <code>false</code>
327       *         if it does not.
328       */
329      public static boolean hasDefaultBranchProfile(Instruction i) {
330        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
331        return i.getOperand(4) != null;
332      }
333    
334      /**
335       * Get the k'th operand called Match from the
336       * argument instruction. Note that the returned operand
337       * will still point to its containing instruction.
338       * @param i the instruction to fetch the operand from
339       * @param k the index of the operand
340       * @return the k'th operand called Match
341       */
342      public static IntConstantOperand getMatch(Instruction i, int k) {
343        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
344        return (IntConstantOperand) i.getOperand(5+k*3+0);
345      }
346      /**
347       * Get the k'th operand called Match from the argument
348       * instruction clearing its instruction pointer. The returned
349       * operand will not point to any containing instruction.
350       * @param i the instruction to fetch the operand from
351       * @param k the index of the operand
352       * @return the k'th operand called Match
353       */
354      public static IntConstantOperand getClearMatch(Instruction i, int k) {
355        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
356        return (IntConstantOperand) i.getClearOperand(5+k*3+0);
357      }
358      /**
359       * Set the k'th operand called Match in the argument
360       * instruction to the argument operand. The operand will
361       * now point to the argument instruction as its containing
362       * instruction.
363       * @param i the instruction in which to store the operand
364       * @param k the index of the operand
365       * @param o the operand to store
366       */
367      public static void setMatch(Instruction i, int k, IntConstantOperand o) {
368        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
369        i.putOperand(5+k*3+0, o);
370      }
371      /**
372       * Return the index of the k'th operand called Match
373       * in the argument instruction.
374       * @param i the instruction to access.
375       * @param k the index of the operand.
376       * @return the index of the k'th operand called Match
377       *         in the argument instruction
378       */
379      public static int indexOfMatch(Instruction i, int k) {
380        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
381        return 5+k*3+0;
382      }
383      /**
384       * Does the argument instruction have a non-null
385       * k'th operand named Match?
386       * @param i the instruction to access.
387       * @param k the index of the operand.
388       * @return <code>true</code> if the instruction has an non-null
389       *         k'th operand named Match or <code>false</code>
390       *         if it does not.
391       */
392      public static boolean hasMatch(Instruction i, int k) {
393        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
394        return i.getOperand(5+k*3+0) != null;
395      }
396    
397      /**
398       * Return the index of the first operand called Matches
399       * in the argument instruction.
400       * @param i the instruction to access.
401       * @return the index of the first operand called Matches
402       *         in the argument instruction
403       */
404      public static int indexOfMatches(Instruction i)
405      {
406        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
407        return 5;
408      }
409      /**
410       * Does the argument instruction have any Matches
411       * operands?
412       * @param i the instruction to access.
413       * @return <code>true</code> if the instruction has
414       *         Matches operands or <code>false</code>
415       *         if it does not.
416       */
417      public static boolean hasMatches(Instruction i)
418      {
419        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
420        return i.getNumberOfOperands()-5 > 0 && i.getOperand(5) != null;
421      }
422    
423      /**
424       * How many variable-length operands called Matches
425       * does the argument instruction have?
426       * @param i the instruction to access
427       * @return the number of Matches operands the instruction has
428       */
429      public static int getNumberOfMatches(Instruction i)
430      {
431        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
432        return (i.getNumberOfOperands()-5)/3;
433      }
434    
435      /**
436       * Change the number of Matches operands that may be stored in
437       * the argument instruction to numVarOps.
438       * @param i the instruction to access
439       * @param numVarOps the new number of variable operands called Matches
440       *        that may be stored in the instruction
441       */
442      public static void resizeNumberOfMatches(Instruction i, int numVarOps)
443      {
444        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
445      if (5+numVarOps*3>MIN_OPERAND_ARRAY_LENGTH)
446        i.resizeNumberOfOperands(5+numVarOps*3);
447      else
448        for (int j = 5+numVarOps*3; j < MIN_OPERAND_ARRAY_LENGTH; j++)
449          i.putOperand(j, null);
450      }
451      /**
452       * Get the k'th operand called Target from the
453       * argument instruction. Note that the returned operand
454       * will still point to its containing instruction.
455       * @param i the instruction to fetch the operand from
456       * @param k the index of the operand
457       * @return the k'th operand called Target
458       */
459      public static BranchOperand getTarget(Instruction i, int k) {
460        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
461        return (BranchOperand) i.getOperand(5+k*3+1);
462      }
463      /**
464       * Get the k'th operand called Target from the argument
465       * instruction clearing its instruction pointer. The returned
466       * operand will not point to any containing instruction.
467       * @param i the instruction to fetch the operand from
468       * @param k the index of the operand
469       * @return the k'th operand called Target
470       */
471      public static BranchOperand getClearTarget(Instruction i, int k) {
472        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
473        return (BranchOperand) i.getClearOperand(5+k*3+1);
474      }
475      /**
476       * Set the k'th operand called Target in the argument
477       * instruction to the argument operand. The operand will
478       * now point to the argument instruction as its containing
479       * instruction.
480       * @param i the instruction in which to store the operand
481       * @param k the index of the operand
482       * @param o the operand to store
483       */
484      public static void setTarget(Instruction i, int k, BranchOperand o) {
485        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
486        i.putOperand(5+k*3+1, o);
487      }
488      /**
489       * Return the index of the k'th operand called Target
490       * in the argument instruction.
491       * @param i the instruction to access.
492       * @param k the index of the operand.
493       * @return the index of the k'th operand called Target
494       *         in the argument instruction
495       */
496      public static int indexOfTarget(Instruction i, int k) {
497        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
498        return 5+k*3+1;
499      }
500      /**
501       * Does the argument instruction have a non-null
502       * k'th operand named Target?
503       * @param i the instruction to access.
504       * @param k the index of the operand.
505       * @return <code>true</code> if the instruction has an non-null
506       *         k'th operand named Target or <code>false</code>
507       *         if it does not.
508       */
509      public static boolean hasTarget(Instruction i, int k) {
510        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
511        return i.getOperand(5+k*3+1) != null;
512      }
513    
514      /**
515       * Return the index of the first operand called Target
516       * in the argument instruction.
517       * @param i the instruction to access.
518       * @return the index of the first operand called Target
519       *         in the argument instruction
520       */
521      public static int indexOfTargets(Instruction i)
522      {
523        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
524        return 6;
525      }
526      /**
527       * Does the argument instruction have any operands
528       * named Target?
529       * @param i the instruction to access.
530       * @return <code>true</code> if the instruction has operands
531       *         named Target or <code>false</code> if it does not.
532       */
533      public static boolean hasTargets(Instruction i)
534      {
535        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
536        return i.getNumberOfOperands()-6 > 0 && i.getOperand(6) != null;
537      }
538    
539      /**
540       * How many variable-length operands called Targets
541       * does the argument instruction have?
542       * @param i the instruction to access
543       * @return the number of operands called Targets the instruction has
544       */
545      public static int getNumberOfTargets(Instruction i)
546      {
547        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
548        return (i.getNumberOfOperands()-5)/3;
549      }
550    
551      /**
552       * Change the number of Targets that may be stored in
553       * the argument instruction to numVarOps.
554       * @param i the instruction to access
555       * @param numVarOps the new number of variable operands called Targets
556       *        that may be stored in the instruction
557       */
558      public static void resizeNumberOfTargets(Instruction i, int numVarOps)
559      {
560        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
561      if (5+numVarOps*3>MIN_OPERAND_ARRAY_LENGTH)
562        i.resizeNumberOfOperands(5+numVarOps*3);
563      else
564        for (int j = 5+numVarOps*3; j < MIN_OPERAND_ARRAY_LENGTH; j++)
565          i.putOperand(j, null);
566      }
567      /**
568       * Get the k'th operand called BranchProfile from the
569       * argument instruction. Note that the returned operand
570       * will still point to its containing instruction.
571       * @param i the instruction to fetch the operand from
572       * @param k the index of the operand
573       * @return the k'th operand called BranchProfile
574       */
575      public static BranchProfileOperand getBranchProfile(Instruction i, int k) {
576        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
577        return (BranchProfileOperand) i.getOperand(5+k*3+2);
578      }
579      /**
580       * Get the k'th operand called BranchProfile from the argument
581       * instruction clearing its instruction pointer. The returned
582       * operand will not point to any containing instruction.
583       * @param i the instruction to fetch the operand from
584       * @param k the index of the operand
585       * @return the k'th operand called BranchProfile
586       */
587      public static BranchProfileOperand getClearBranchProfile(Instruction i, int k) {
588        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
589        return (BranchProfileOperand) i.getClearOperand(5+k*3+2);
590      }
591      /**
592       * Set the k'th operand called BranchProfile in the argument
593       * instruction to the argument operand. The operand will
594       * now point to the argument instruction as its containing
595       * instruction.
596       * @param i the instruction in which to store the operand
597       * @param k the index of the operand
598       * @param o the operand to store
599       */
600      public static void setBranchProfile(Instruction i, int k, BranchProfileOperand o) {
601        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
602        i.putOperand(5+k*3+2, o);
603      }
604      /**
605       * Return the index of the k'th operand called BranchProfile
606       * in the argument instruction.
607       * @param i the instruction to access.
608       * @param k the index of the operand.
609       * @return the index of the k'th operand called BranchProfile
610       *         in the argument instruction
611       */
612      public static int indexOfBranchProfile(Instruction i, int k) {
613        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
614        return 5+k*3+2;
615      }
616      /**
617       * Does the argument instruction have a non-null
618       * k'th operand named BranchProfile?
619       * @param i the instruction to access.
620       * @param k the index of the operand.
621       * @return <code>true</code> if the instruction has an non-null
622       *         k'th operand named BranchProfile or <code>false</code>
623       *         if it does not.
624       */
625      public static boolean hasBranchProfile(Instruction i, int k) {
626        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
627        return i.getOperand(5+k*3+2) != null;
628      }
629    
630      /**
631       * Return the index of the first operand called BranchProfile
632       * in the argument instruction.
633       * @param i the instruction to access.
634       * @return the index of the first operand called BranchProfile
635       *         in the argument instruction
636       */
637      public static int indexOfBranchProfiles(Instruction i)
638      {
639        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
640        return 7;
641      }
642      /**
643       * Does the argument instruction have any operands
644       * named BranchProfile?
645       * @param i the instruction to access.
646       * @return <code>true</code> if the instruction has operands
647       *         named BranchProfile or <code>false</code> if it does not.
648       */
649      public static boolean hasBranchProfiles(Instruction i)
650      {
651        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
652        return i.getNumberOfOperands()-7 > 0 && i.getOperand(7) != null;
653      }
654    
655      /**
656       * How many variable-length operands called BranchProfiles
657       * does the argument instruction have?
658       * @param i the instruction to access
659       * @return the number of operands called BranchProfiles the instruction has
660       */
661      public static int getNumberOfBranchProfiles(Instruction i)
662      {
663        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
664        return (i.getNumberOfOperands()-5)/3;
665      }
666    
667      /**
668       * Change the number of BranchProfiles that may be stored in
669       * the argument instruction to numVarOps.
670       * @param i the instruction to access
671       * @param numVarOps the new number of variable operands called BranchProfiles
672       *        that may be stored in the instruction
673       */
674      public static void resizeNumberOfBranchProfiles(Instruction i, int numVarOps)
675      {
676        if (Configuration.ExtremeAssertions && !conforms(i)) fail(i, "LookupSwitch");
677      if (5+numVarOps*3>MIN_OPERAND_ARRAY_LENGTH)
678        i.resizeNumberOfOperands(5+numVarOps*3);
679      else
680        for (int j = 5+numVarOps*3; j < MIN_OPERAND_ARRAY_LENGTH; j++)
681          i.putOperand(j, null);
682      }
683    
684      /**
685       * Create an instruction of the LookupSwitch instruction format.
686       * @param o the instruction's operator
687       * @param Value the instruction's Value operand
688       * @param Unknown1 the instruction's Unknown1 operand
689       * @param Unknown2 the instruction's Unknown2 operand
690       * @param Default the instruction's Default operand
691       * @param DefaultBranchProfile the instruction's DefaultBranchProfile operand
692       * @param numVarOps the number of variable length operands that
693       *                 will be stored in the insruction.
694       * @return the newly created LookupSwitch instruction
695       */
696      public static Instruction create(Operator o
697                       , Operand Value
698                       , Operand Unknown1
699                       , Operand Unknown2
700                       , BranchOperand Default
701                       , BranchProfileOperand DefaultBranchProfile
702                       , int numVarOps
703                    )
704      {
705        if (Configuration.ExtremeAssertions && !conforms(o)) fail(o, "LookupSwitch");
706        Instruction i = new Instruction(o, Math.max(5+numVarOps*3, MIN_OPERAND_ARRAY_LENGTH));
707        i.putOperand(0, Value);
708        i.putOperand(1, Unknown1);
709        i.putOperand(2, Unknown2);
710        i.putOperand(3, Default);
711        i.putOperand(4, DefaultBranchProfile);
712        return i;
713      }
714    
715      /**
716       * Mutate the argument instruction into an instruction of the
717       * LookupSwitch instruction format having the specified
718       * operator and operands.
719       * @param i the instruction to mutate
720       * @param o the instruction's operator
721       * @param Value the instruction's Value operand
722       * @param Unknown1 the instruction's Unknown1 operand
723       * @param Unknown2 the instruction's Unknown2 operand
724       * @param Default the instruction's Default operand
725       * @param DefaultBranchProfile the instruction's DefaultBranchProfile operand
726       * @param numVarOps the number of variable length operands that
727       *                  will be stored in the insruction.
728       * @return the mutated instruction
729       */
730      public static Instruction mutate(Instruction i, Operator o
731                       , Operand Value
732                       , Operand Unknown1
733                       , Operand Unknown2
734                       , BranchOperand Default
735                       , BranchProfileOperand DefaultBranchProfile
736                       , int numVarOps
737                    )
738      {
739        if (Configuration.ExtremeAssertions && !conforms(o)) fail(o, "LookupSwitch");
740        if (5+numVarOps*3>MIN_OPERAND_ARRAY_LENGTH)
741          i.resizeNumberOfOperands(5+numVarOps*3);
742    
743        i.operator = o;
744        i.putOperand(0, Value);
745        i.putOperand(1, Unknown1);
746        i.putOperand(2, Unknown2);
747        i.putOperand(3, Default);
748        i.putOperand(4, DefaultBranchProfile);
749        return i;
750      }
751    }
752