List of usage examples for org.objectweb.asm Opcodes IASTORE
int IASTORE
To view the source code for org.objectweb.asm Opcodes IASTORE.
Click Source Link
From source file:jpcsp.Allegrex.compiler.CompilerContext.java
License:Open Source License
private void storeVRegister(int vsize, int reg, int n, VfpuPfxDstState pfxDstState, boolean isFloat) { if (log.isTraceEnabled() && pfxDstState != null && pfxDstState.isKnown() && pfxDstState.pfxDst.enabled) { log.trace(String.format("PFX %08X - storeVRegister %d, %d, %d", getCodeInstruction().getAddress(), vsize, reg, n));/*from ww w . j a v a 2 s. c o m*/ } if (preparedRegisterForStore == reg) { if (isPfxDstMasked(pfxDstState, n)) { if (log.isTraceEnabled() && pfxDstState != null && pfxDstState.isKnown() && pfxDstState.pfxDst.enabled) { log.trace(String.format("PFX %08X - storeVRegister %d masked", getCodeInstruction().getAddress(), n)); } mv.visitInsn(Opcodes.POP); } else { applyPfxDstPostfix(pfxDstState, n, isFloat); if (isFloat) { // Keep a copy of the value for the int value mv.visitInsn(Opcodes.DUP_X2); mv.visitInsn(Opcodes.FASTORE); // First store the float value convertVFloatToInt(); mv.visitInsn(Opcodes.IASTORE); // Second store the int value } else { // Keep a copy of the value for the float value mv.visitInsn(Opcodes.DUP_X2); mv.visitInsn(Opcodes.IASTORE); // First store the int value convertVIntToFloat(); mv.visitInsn(Opcodes.FASTORE); // Second store the float value } } preparedRegisterForStore = -1; } else { log.error("storeVRegister with non-prepared register is not supported"); } }
From source file:jpcsp.Allegrex.compiler.CompilerContext.java
License:Open Source License
@Override public void memWrite32(int registerIndex, int offset) { if (!memWritePrepared) { if (useMMIO()) { loadMMIO();//from w w w . ja va 2 s. co m } else if (!RuntimeContext.hasMemoryInt()) { loadMemory(); } else { loadMemoryInt(); } mv.visitInsn(Opcodes.SWAP); loadRegister(registerIndex); if (offset != 0) { loadImm(offset); mv.visitInsn(Opcodes.IADD); } if (checkMemoryAccess()) { loadImm(codeInstruction.getAddress()); mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeContextInternalName, "checkMemoryWrite32", "(II)I"); } mv.visitInsn(Opcodes.SWAP); } if (RuntimeContext.debugMemoryWrite) { if (!RuntimeContext.debugMemoryReadWriteNoSP || registerIndex != _sp) { mv.visitInsn(Opcodes.DUP2); mv.visitInsn(Opcodes.SWAP); loadImm(2); mv.visitInsn(Opcodes.ISHL); mv.visitInsn(Opcodes.SWAP); loadImm(codeInstruction.getAddress()); loadImm(0); loadImm(32); mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeContextInternalName, "debugMemoryReadWrite", "(IIIZI)V"); } } if (useMMIO() || !RuntimeContext.hasMemoryInt()) { mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, memoryInternalName, "write32", "(II)V"); } else { mv.visitInsn(Opcodes.IASTORE); } memWritePrepared = false; }
From source file:jpcsp.Allegrex.compiler.CompilerContext.java
License:Open Source License
@Override public void memWrite16(int registerIndex, int offset) { if (!memWritePrepared) { if (useMMIO()) { loadMMIO();// w w w .j a va2 s . com } else if (!RuntimeContext.hasMemoryInt()) { loadMemory(); } else { loadMemoryInt(); } mv.visitInsn(Opcodes.SWAP); loadRegister(registerIndex); if (offset != 0) { loadImm(offset); mv.visitInsn(Opcodes.IADD); } if (RuntimeContext.hasMemoryInt()) { if (checkMemoryAccess()) { loadImm(codeInstruction.getAddress()); mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeContextInternalName, "checkMemoryWrite16", "(II)I"); } } mv.visitInsn(Opcodes.SWAP); } if (useMMIO() || !RuntimeContext.hasMemoryInt()) { mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, memoryInternalName, "write16", "(IS)V"); } else { // tmp2 = value & 0xFFFF; // tmp1 = (address & 2) << 3; // memoryInt[address >> 2] = (memoryInt[address >> 2] & ((0xFFFF << tmp1) ^ 0xFFFFFFFF)) | (tmp2 << tmp1); loadImm(0xFFFF); mv.visitInsn(Opcodes.IAND); storeTmp2(); mv.visitInsn(Opcodes.DUP); loadImm(2); mv.visitInsn(Opcodes.IAND); loadImm(3); mv.visitInsn(Opcodes.ISHL); storeTmp1(); if (checkMemoryAccess()) { loadImm(2); mv.visitInsn(Opcodes.ISHR); } else { loadImm(3); mv.visitInsn(Opcodes.ISHL); loadImm(5); mv.visitInsn(Opcodes.IUSHR); } mv.visitInsn(Opcodes.DUP2); mv.visitInsn(Opcodes.IALOAD); loadImm(0xFFFF); loadTmp1(); mv.visitInsn(Opcodes.ISHL); loadImm(-1); mv.visitInsn(Opcodes.IXOR); mv.visitInsn(Opcodes.IAND); loadTmp2(); loadTmp1(); mv.visitInsn(Opcodes.ISHL); mv.visitInsn(Opcodes.IOR); mv.visitInsn(Opcodes.IASTORE); } memWritePrepared = false; }
From source file:jpcsp.Allegrex.compiler.CompilerContext.java
License:Open Source License
@Override public void memWrite8(int registerIndex, int offset) { if (!memWritePrepared) { if (useMMIO()) { loadMMIO();//from ww w . java2 s .com } else if (!RuntimeContext.hasMemoryInt()) { loadMemory(); } else { loadMemoryInt(); } mv.visitInsn(Opcodes.SWAP); loadRegister(registerIndex); if (offset != 0) { loadImm(offset); mv.visitInsn(Opcodes.IADD); } if (RuntimeContext.hasMemoryInt()) { if (checkMemoryAccess()) { loadImm(codeInstruction.getAddress()); mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeContextInternalName, "checkMemoryWrite8", "(II)I"); } } mv.visitInsn(Opcodes.SWAP); } if (useMMIO() || !RuntimeContext.hasMemoryInt()) { mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, memoryInternalName, "write8", "(IB)V"); } else { // tmp2 = value & 0xFF; // tmp1 = (address & 3) << 3; // memoryInt[address >> 2] = (memoryInt[address >> 2] & ((0xFF << tmp1) ^ 0xFFFFFFFF)) | (tmp2 << tmp1); loadImm(0xFF); mv.visitInsn(Opcodes.IAND); storeTmp2(); mv.visitInsn(Opcodes.DUP); loadImm(3); mv.visitInsn(Opcodes.IAND); loadImm(3); mv.visitInsn(Opcodes.ISHL); storeTmp1(); if (checkMemoryAccess()) { loadImm(2); mv.visitInsn(Opcodes.ISHR); } else { loadImm(3); mv.visitInsn(Opcodes.ISHL); loadImm(5); mv.visitInsn(Opcodes.IUSHR); } mv.visitInsn(Opcodes.DUP2); mv.visitInsn(Opcodes.IALOAD); loadImm(0xFF); loadTmp1(); mv.visitInsn(Opcodes.ISHL); loadImm(-1); mv.visitInsn(Opcodes.IXOR); mv.visitInsn(Opcodes.IAND); loadTmp2(); loadTmp1(); mv.visitInsn(Opcodes.ISHL); mv.visitInsn(Opcodes.IOR); mv.visitInsn(Opcodes.IASTORE); } memWritePrepared = false; }
From source file:jpcsp.Allegrex.compiler.CompilerContext.java
License:Open Source License
@Override public void memWriteZero8(int registerIndex, int offset) { if (useMMIO()) { loadMMIO();//w w w . j a va 2 s .c o m } else if (!RuntimeContext.hasMemoryInt()) { loadMemory(); } else { loadMemoryInt(); } loadRegister(registerIndex); if (offset != 0) { loadImm(offset); mv.visitInsn(Opcodes.IADD); } if (RuntimeContext.hasMemoryInt()) { if (checkMemoryAccess()) { loadImm(codeInstruction.getAddress()); mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeContextInternalName, "checkMemoryWrite8", "(II)I"); } } if (useMMIO() || !RuntimeContext.hasMemoryInt()) { loadImm(0); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, memoryInternalName, "write8", "(IB)V"); } else { // tmp1 = (address & 3) << 3; // memoryInt[address >> 2] = (memoryInt[address >> 2] & ((0xFF << tmp1) ^ 0xFFFFFFFF)); mv.visitInsn(Opcodes.DUP); loadImm(3); mv.visitInsn(Opcodes.IAND); loadImm(3); mv.visitInsn(Opcodes.ISHL); storeTmp1(); if (checkMemoryAccess()) { loadImm(2); mv.visitInsn(Opcodes.ISHR); } else { loadImm(3); mv.visitInsn(Opcodes.ISHL); loadImm(5); mv.visitInsn(Opcodes.IUSHR); } mv.visitInsn(Opcodes.DUP2); mv.visitInsn(Opcodes.IALOAD); loadImm(0xFF); loadTmp1(); mv.visitInsn(Opcodes.ISHL); loadImm(-1); mv.visitInsn(Opcodes.IXOR); mv.visitInsn(Opcodes.IAND); mv.visitInsn(Opcodes.IASTORE); } }
From source file:jpcsp.Allegrex.compiler.CompilerContext.java
License:Open Source License
private boolean compileSWLWsequence(int baseRegister, int[] offsets, int[] registers, boolean isLW) { // Optimization only possible for memoryInt if (useMMIO() || !RuntimeContext.hasMemoryInt()) { return false; }/* www . ja va 2 s . c om*/ // Disable optimizations when the profiler is enabled. if (Profiler.isProfilerEnabled()) { return false; } // Disable optimizations when the debugger is open if (State.debugger != null) { return false; } if (!isLW) { if (compileSWsequenceZR(baseRegister, offsets, registers)) { return true; } } int offset = offsets[0]; prepareMemIndex(baseRegister, offset, isLW, 32); storeTmp1(); for (int i = 0; i < offsets.length; i++) { int rt = registers[i]; if (offset != offsets[i]) { mv.visitIincInsn(LOCAL_TMP1, (offsets[i] - offset) >> 2); offset = offsets[i]; } if (isLW) { if (rt != _zr) { prepareRegisterForStore(rt); loadMemoryInt(); loadTmp1(); mv.visitInsn(Opcodes.IALOAD); storeRegister(rt); } } else { loadMemoryInt(); loadTmp1(); loadRegister(rt); mv.visitInsn(Opcodes.IASTORE); } } return true; }
From source file:net.sourceforge.cobertura.instrument.pass3.AbstractCodeProvider.java
License:GNU General Public License
private void classMapContent(ClassVisitor cv, int nr, List<TouchPointDescriptor> touchPointDescriptors) { MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, COBERTURA_CLASSMAP_METHOD_NAME + "_" + nr, "(" + Type.getType(LightClassmapListener.class).toString() + ")V", null, null); mv.visitCode();/* ww w . ja v a 2 s .c o m*/ mv.visitVarInsn(Opcodes.ALOAD, 0); for (TouchPointDescriptor tpd : touchPointDescriptors) { mv.visitInsn(Opcodes.DUP); mv.visitLdcInsn(tpd.getLineNumber()); if (tpd instanceof LineTouchPointDescriptor) { mv.visitLdcInsn(((LineTouchPointDescriptor) tpd).getCounterId()); mv.visitLdcInsn(((LineTouchPointDescriptor) tpd).getMethodName()); mv.visitLdcInsn(((LineTouchPointDescriptor) tpd).getMethodSignature()); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "putLineTouchPoint", "(IILjava/lang/String;Ljava/lang/String;)V"); } else if (tpd instanceof JumpTouchPointDescriptor) { mv.visitLdcInsn(((JumpTouchPointDescriptor) tpd).getCounterIdForTrue()); mv.visitLdcInsn(((JumpTouchPointDescriptor) tpd).getCounterIdForFalse()); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "putJumpTouchPoint", "(III)V"); } else if (tpd instanceof SwitchTouchPointDescriptor) { SwitchTouchPointDescriptor stpd = (SwitchTouchPointDescriptor) tpd; final String enum_sign = ((SwitchTouchPointDescriptor) tpd).getEnumType(); if (enum_sign == null) { mv.visitLdcInsn(Integer.MAX_VALUE); } else { mv.visitMethodInsn(Opcodes.INVOKESTATIC, enum_sign, "values", "()[L" + enum_sign + ";"); mv.visitInsn(Opcodes.ARRAYLENGTH); } Collection<Integer> ci = stpd.getCountersForLabels(); mv.visitLdcInsn(ci.size());//Size of a new table mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT); int i = 0; for (Integer counterId : ci) { mv.visitInsn(Opcodes.DUP); //First for addition of items, second ad putSwitchTouchPoint parameter (or next loop iteration) mv.visitLdcInsn(i); mv.visitLdcInsn(counterId); mv.visitInsn(Opcodes.IASTORE); i++; } mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "putSwitchTouchPoint", "(II[I)V"); } } mv.visitInsn(Opcodes.POP); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(0, 0);//will be recalculated by writer mv.visitEnd(); }
From source file:net.sourceforge.cobertura.instrument.pass3.AtomicArrayCodeProvider.java
License:GNU General Public License
/** * <pre>/*w w w .j a v a 2 s . co m*/ * int[] __cobertura_get_and_reset_counters() { * int[] res = new int[counters.length()]; * for(int i=0; i<counters.length(); i++){ * res[i]=counters.getAndSet(i, 0); * } * return res; * } * </pre> */ public void generateCoberturaGetAndResetCountersMethod(ClassVisitor cv, String className) { MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, COBERTURA_GET_AND_RESET_COUNTERS_METHOD_NAME, "()[I", null, null); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "length", "()I"); mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT); mv.visitVarInsn(Opcodes.ASTORE, 0); mv.visitInsn(Opcodes.ICONST_0); mv.visitVarInsn(Opcodes.ISTORE, 1); Label l3 = new Label(); mv.visitJumpInsn(Opcodes.GOTO, l3); Label l4 = new Label(); mv.visitLabel(l4); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitInsn(Opcodes.ICONST_0); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "getAndSet", "(II)I"); mv.visitInsn(Opcodes.IASTORE); mv.visitIincInsn(1, 1); mv.visitLabel(l3); mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "length", "()I"); mv.visitJumpInsn(Opcodes.IF_ICMPLT, l4); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(0, 0);//will be recalculated by writer mv.visitEnd(); }
From source file:net.sourceforge.cobertura.instrument.pass3.FastArrayCodeProvider.java
License:GNU General Public License
public void generateCodeThatIncrementsCoberturaCounterFromInternalVariable(MethodVisitor nextMethodVisitor, int lastJumpIdVariableIndex, String className) { /*cobertura_counters[value('lastJumpIdVariableIndex')]++;*/ /*cobertura_counters.*/ nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); /*index:*/// w w w.ja va 2 s .co m nextMethodVisitor.visitVarInsn(Opcodes.ILOAD, lastJumpIdVariableIndex); nextMethodVisitor.visitInsn(Opcodes.DUP2); nextMethodVisitor.visitInsn(Opcodes.IALOAD); nextMethodVisitor.visitLdcInsn(1); nextMethodVisitor.visitInsn(Opcodes.IADD); nextMethodVisitor.visitInsn(Opcodes.IASTORE); }
From source file:net.sourceforge.cobertura.instrument.pass3.FastArrayCodeProvider.java
License:GNU General Public License
public void generateCodeThatIncrementsCoberturaCounter(MethodVisitor nextMethodVisitor, Integer counterId, String className) {//from w ww .j a va 2 s . c om /*cobertura_counters[value('lastJumpIdVariableIndex')]++;*/ /*cobertura_counters.*/ nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); /*index:*/ nextMethodVisitor.visitLdcInsn((int) counterId); nextMethodVisitor.visitInsn(Opcodes.DUP2); nextMethodVisitor.visitInsn(Opcodes.IALOAD); nextMethodVisitor.visitLdcInsn(1); nextMethodVisitor.visitInsn(Opcodes.IADD); nextMethodVisitor.visitInsn(Opcodes.IASTORE); }