Label tmp1 = new Label(curInstrLabel + "$tmp1"); Label tmp2 = new Label(curInstrLabel + "$tmp2");
helper.writePOP64(Register.EBX, Register.ECX); helper.writePOP64(Register.ESI, Register.EDI);
	public final void visit_lmul() {		//TODO: port to orp-style		vstack.push(eContext);		Item v2 = vstack.popItem(Item.LONG);		Item v1 = vstack.popItem(Item.LONG);		v2.release(eContext);		v1.release(eContext);		vstack.pushItem(LongItem.createStack());				helper.writePOP64(Register.EBX, Register.ECX); // Value 2		helper.writePOP64(Register.ESI, Register.EDI); // Value 1		Label tmp1 = new Label(curInstrLabel + "$tmp1");		Label tmp2 = new Label(curInstrLabel + "$tmp2");		os.writeMOV(INTSIZE, Register.EAX, Register.EDI); // hi2		os.writeOR(Register.EAX, Register.ECX); // hi1 | hi2		os.writeJCC(tmp1, X86Constants.JNZ);		os.writeMOV(INTSIZE, Register.EAX, Register.ESI); // lo2		os.writeMUL_EAX(Register.EBX); // lo1*lo2		os.writeJMP(tmp2);		os.setObjectRef(tmp1);		os.writeMOV(INTSIZE, Register.EAX, Register.ESI); // lo2		os.writeMUL_EAX(Register.ECX); // hi1*lo2		os.writeMOV(INTSIZE, Register.ECX, Register.EAX);		os.writeMOV(INTSIZE, Register.EAX, Register.EDI); // hi2		os.writeMUL_EAX(Register.EBX); // hi2*lo1		os.writeADD(Register.ECX, Register.EAX); // hi2*lo1 + hi1*lo2		os.writeMOV(INTSIZE, Register.EAX, Register.ESI); // lo2		os.writeMUL_EAX(Register.EBX); // lo1*lo2		os.writeADD(Register.EDX, Register.ECX); // hi2*lo1 + hi1*lo2 + hi(lo1*lo2)		os.setObjectRef(tmp2);		// Reload the statics table, since it was destroyed here		helper.writeLoadSTATICS(curInstrLabel, "lmul", false);		helper.writePUSH64(Register.EAX, Register.EDX);	}