@Override public void caseDup2_x1Inst(Dup2_x1Inst i) { Type op1Type = i.getOp1Type(); Type op2Type = i.getOp2Type(); Type under1Type = i.getUnder1Type(); // 07-20-2006 Michael Batchelder // NOW handling all types of dup2_x1 /* * From VM Spec: cat1 = category 1 (word type) cat2 = category 2 (doubleword) * * Form 1: [..., cat1_value3, cat1_value2, cat1_value1]->[..., cat1_value2, cat1_value1, cat1_value3, cat1_value2, * cat1_value1] Form 2: [..., cat1_value2, cat2_value1]->[..., cat2_value1, cat1_value2, cat2_value1] */ if (isDwordType(under1Type)) { if (!isDwordType(op1Type) && !isDwordType(op2Type)) { throw new RuntimeException("magic not implemented yet"); } else { emit("dup2_x2"); // (form 3) } } else { if ((isDwordType(op1Type) && op2Type != null) || isDwordType(op2Type)) { throw new RuntimeException("magic not implemented yet"); } } emit("dup2_x1"); // (form 1) }
@Override public void caseDup1_x2Inst(Dup1_x2Inst i) { Type opType = i.getOp1Type(); Type under1Type = i.getUnder1Type(); Type under2Type = i.getUnder2Type(); // 07-20-2006 Michael Batchelder // NOW handling all types of dup1_x2 /* * From VM Spec: cat1 = category 1 (word type) cat2 = category 2 (doubleword) * * Form 1: [..., cat1_value3, cat1_value2, cat1_value1]->[..., cat1_value2, cat1_value1, cat1_value3, cat1_value2, * cat1_value1] Form 2: [..., cat1_value2, cat2_value1]->[..., cat2_value1, cat1_value2, cat2_value1] */ if (isDwordType(opType)) { if (!isDwordType(under1Type) && !isDwordType(under2Type)) { emit("dup2_x2"); // (form 2) } else { throw new RuntimeException("magic not implemented yet"); } } else { if (isDwordType(under1Type) || isDwordType(under2Type)) { throw new RuntimeException("magic not implemented yet"); } } emit("dup_x2"); // (form 1) }
if (isDwordType(op1Type)) { if (op2Type == null && under1Type != null) { if ((under2Type == null && isDwordType(under1Type)) || (!isDwordType(under1Type) && under2Type != null && !isDwordType(under2Type))) { malformed = false; } else if (op1Type != null && op2Type != null && !isDwordType(op2Type)) { if ((under2Type == null && isDwordType(under1Type)) || (under1Type != null && !isDwordType(under1Type) && under2Type != null && !isDwordType(under2Type))) { malformed = false;
@Override public void caseDup2Inst(Dup2Inst i) { Type firstOpType = i.getOp1Type(); Type secondOpType = i.getOp2Type(); // The first two cases have no real bytecode equivalents. // Use a pair of insts to simulate them. if (isDwordType(firstOpType)) { emit("dup2"); // (form 2) if (isDwordType(secondOpType)) { emit("dup2"); // (form 2 -- by simulation) } else { emit("dup"); // also a simulation } } else if (isDwordType(secondOpType)) { if (isDwordType(firstOpType)) { emit("dup2"); // (form 2) } else { emit("dup"); } emit("dup2"); // (form 2 -- complete the simulation) } else { emit("dup2"); // form 1 } }
@Override public void caseDup1_x1Inst(Dup1_x1Inst i) { Type opType = i.getOp1Type(); Type underType = i.getUnder1Type(); if (isDwordType(opType)) { if (isDwordType(underType)) { emit("dup2_x2"); // (form 4) } else { emit("dup2_x1"); // (form 2) } } else { if (isDwordType(underType)) { emit("dup_x2"); // (form 2) } else { emit("dup_x1"); // (only one form) } } }
@Override public void caseDup1Inst(Dup1Inst i) { Type firstOpType = i.getOp1Type(); if (isDwordType(firstOpType)) { emit("dup2"); // (form 2) } else { emit("dup"); } }