/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.osr.bytecodes;
import static org.jikesrvm.classloader.BytecodeConstants.JBC_impdep1;
import static org.jikesrvm.classloader.BytecodeConstants.JBC_wide;
import static org.jikesrvm.runtime.JavaSizeConstants.LOG_BITS_IN_BYTE;
import static org.jikesrvm.runtime.UnboxedSizeConstants.BYTES_IN_ADDRESS;
import org.vmmagic.unboxed.Word;
/**
* OSR_PseudoBytecode is super class of all pseudo instructions.
*/
public abstract class PseudoBytecode {
public PseudoBytecode next;
public abstract byte[] getBytes();
public abstract int getSize();
public abstract int stackChanges();
public static byte[] initBytes(int size, int instruction) {
byte[] code = new byte[size];
code[0] = (byte) JBC_impdep1;
code[1] = (byte) instruction;
return code;
}
public static void int2bytes(byte[] to, int p, int value) {
for (int i = 3; i >= 0; i--) {
to[p++] = (byte) ((value >>> (i << LOG_BITS_IN_BYTE)) & 0x0FF);
}
}
public static void long2bytes(byte[] to, int p, long value) {
for (int i = 7; i >= 0; i--) {
to[p++] = (byte) ((value >>> (i << LOG_BITS_IN_BYTE)) & 0x0FF);
}
}
public static void word2bytes(byte[] to, int p, Word value) {
for (int i = BYTES_IN_ADDRESS - 1; i >= 0; i--) {
to[p++] = (byte) (value.rshl(i << LOG_BITS_IN_BYTE).toInt() & 0x0FF);
}
}
public static void float2bytes(byte[] to, int p, float value) {
int v = Float.floatToIntBits(value);
int2bytes(to, p, v);
}
public static void double2bytes(byte[] to, int p, double value) {
long v = Double.doubleToLongBits(value);
long2bytes(to, p, v);
}
public static byte[] makeOUUcode(int op, int idx) {
byte[] codes = new byte[3];
codes[0] = (byte) op;
codes[1] = (byte) ((idx >> 8) & 0x0FF);
codes[2] = (byte) (idx & 0x0FF);
return codes;
}
public static byte[] makeWOUUcode(int op, int idx) {
byte[] codes = new byte[4];
codes[0] = (byte) JBC_wide;
codes[1] = (byte) op;
codes[2] = (byte) ((idx >> 8) & 0x0FF);
codes[3] = (byte) (idx & 0x0FF);
return codes;
}
public static byte[] makeOUcode(int op, int idx) {
byte[] codes = new byte[2];
codes[0] = (byte) op;
codes[1] = (byte) (idx & 0x0FF);
return codes;
}
}