6879063: SA should use hsdis for disassembly

We should in SA to use hsdis for it like the JVM does to replace the current java based disassembler.

Reviewed-by: twisti, jrose, sla
This commit is contained in:
Yumin Qi 2012-09-24 12:44:00 -07:00 committed by Yumin Qi
parent d37f7326ce
commit 22544e7a7c
303 changed files with 1150 additions and 20650 deletions
hotspot/agent
make
src
os
share/classes/sun/jvm/hotspot
CommandProcessor.javaHotSpotAgent.javaTestDebugger.java
asm
AbstractInstruction.javaAddress.javaArithmetic.javaArithmeticInstruction.javaBaseIndexScaleDispAddress.javaBranchInstruction.javaCPUHelper.javaCallInstruction.javaDirectAddress.javaDisassembler.javaImmediate.javaIndirectAddress.javaInstruction.javaInstructionVisitor.javaLoadInstruction.javaLogicInstruction.javaMemoryInstruction.javaMoveInstruction.javaPCRelativeAddress.javaRTLDataTypes.javaRTLOperations.javaReturnInstruction.javaShiftInstruction.javaStoreInstruction.java
amd64
ia64
sparc

@ -1,254 +0,0 @@
/*
* Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
import java.io.*;
import java.util.*;
/**
<p> This class finds transitive closure of dependencies from a given
root set of classes. If your project has lots of .class files and you
want to ship only those .class files which are used (transitively)
from a root set of classes, then you can use this utility. </p> <p>
How does it work?</p>
<p> We walk through all constant pool entries of a given class and
find all modified UTF-8 entries. Anything that looks like a class name is
considered as a class and we search for that class in the given
classpath. If we find a .class of that name, then we add that class to
list.</p>
<p> We could have used CONSTANT_ClassInfo type constants only. But
that will miss classes used through Class.forName or xyz.class
construct. But, if you refer to a class name in some other string we
would include it as dependency :(. But this is quite unlikely
anyway. To look for exact Class.forName argument(s) would involve
bytecode analysis. Also, we handle only simple reflection. If you
accept name of a class from externally (for eg properties file or
command line args for example, this utility will not be able to find
that dependency. In such cases, include those classes in the root set.
</p>
*/
public class ClosureFinder {
private Collection roots; // root class names Collection<String>
private Map visitedClasses; // set of all dependencies as a Map
private String classPath; // classpath to look for .class files
private String[] pathComponents; // classpath components
private static final boolean isWindows = File.separatorChar != '/';
public ClosureFinder(Collection roots, String classPath) {
this.roots = roots;
this.classPath = classPath;
parseClassPath();
}
// parse classPath into pathComponents array
private void parseClassPath() {
List paths = new ArrayList();
StringTokenizer st = new StringTokenizer(classPath, File.pathSeparator);
while (st.hasMoreTokens())
paths.add(st.nextToken());
Object[] arr = paths.toArray();
pathComponents = new String[arr.length];
System.arraycopy(arr, 0, pathComponents, 0, arr.length);
}
// if output is aleady not computed, compute it now
// result is a map from class file name to base path where the .class was found
public Map find() {
if (visitedClasses == null) {
visitedClasses = new HashMap();
computeClosure();
}
return visitedClasses;
}
// compute closure for all given root classes
private void computeClosure() {
for (Iterator rootsItr = roots.iterator(); rootsItr.hasNext();) {
String name = (String) rootsItr.next();
name = name.substring(0, name.indexOf(".class"));
computeClosure(name);
}
}
// looks up for .class in pathComponents and returns
// base path if found, else returns null
private String lookupClassFile(String classNameAsPath) {
for (int i = 0; i < pathComponents.length; i++) {
File f = new File(pathComponents[i] + File.separator +
classNameAsPath + ".class");
if (f.exists()) {
if (isWindows) {
String name = f.getName();
// Windows reports special devices AUX,NUL,CON as files
// under any directory. It does not care about file extention :-(
if (name.compareToIgnoreCase("AUX.class") == 0 ||
name.compareToIgnoreCase("NUL.class") == 0 ||
name.compareToIgnoreCase("CON.class") == 0) {
return null;
}
}
return pathComponents[i];
}
}
return null;
}
// from JVM spec. 2'nd edition section 4.4
private static final int CONSTANT_Class = 7;
private static final int CONSTANT_FieldRef = 9;
private static final int CONSTANT_MethodRef = 10;
private static final int CONSTANT_InterfaceMethodRef = 11;
private static final int CONSTANT_String = 8;
private static final int CONSTANT_Integer = 3;
private static final int CONSTANT_Float = 4;
private static final int CONSTANT_Long = 5;
private static final int CONSTANT_Double = 6;
private static final int CONSTANT_NameAndType = 12;
private static final int CONSTANT_Utf8 = 1;
// whether a given string may be a class name?
private boolean mayBeClassName(String internalClassName) {
int len = internalClassName.length();
for (int s = 0; s < len; s++) {
char c = internalClassName.charAt(s);
if (!Character.isJavaIdentifierPart(c) && c != '/')
return false;
}
return true;
}
// compute closure for a given class
private void computeClosure(String className) {
if (visitedClasses.get(className) != null) return;
String basePath = lookupClassFile(className);
if (basePath != null) {
visitedClasses.put(className, basePath);
try {
File classFile = new File(basePath + File.separator + className + ".class");
FileInputStream fis = new FileInputStream(classFile);
DataInputStream dis = new DataInputStream(fis);
// look for .class signature
if (dis.readInt() != 0xcafebabe) {
System.err.println(classFile.getAbsolutePath() + " is not a valid .class file");
return;
}
// ignore major and minor version numbers
dis.readShort();
dis.readShort();
// read number of constant pool constants
int numConsts = (int) dis.readShort();
String[] strings = new String[numConsts];
// zero'th entry is unused
for (int cpIndex = 1; cpIndex < numConsts; cpIndex++) {
int constType = (int) dis.readByte();
switch (constType) {
case CONSTANT_Class:
case CONSTANT_String:
dis.readShort(); // string name index;
break;
case CONSTANT_FieldRef:
case CONSTANT_MethodRef:
case CONSTANT_InterfaceMethodRef:
case CONSTANT_NameAndType:
case CONSTANT_Integer:
case CONSTANT_Float:
// all these are 4 byte constants
dis.readInt();
break;
case CONSTANT_Long:
case CONSTANT_Double:
// 8 byte constants
dis.readLong();
// occupies 2 cp entries
cpIndex++;
break;
case CONSTANT_Utf8: {
strings[cpIndex] = dis.readUTF();
break;
}
default:
System.err.println("invalid constant pool entry");
return;
}
}
// now walk thru the string constants and look for class names
for (int s = 0; s < numConsts; s++) {
if (strings[s] != null && mayBeClassName(strings[s]))
computeClosure(strings[s].replace('/', File.separatorChar));
}
} catch (IOException exp) {
// ignore for now
}
}
}
// a sample main that accepts roots classes in a file and classpath as args
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("Usage: ClosureFinder <root class file> <class path>");
System.exit(1);
}
List roots = new ArrayList();
try {
FileInputStream fis = new FileInputStream(args[0]);
DataInputStream dis = new DataInputStream(fis);
String line = null;
while ((line = dis.readLine()) != null) {
if (isWindows) {
line = line.replace('/', File.separatorChar);
}
roots.add(line);
}
} catch (IOException exp) {
System.err.println(exp.getMessage());
System.exit(2);
}
ClosureFinder cf = new ClosureFinder(roots, args[1]);
Map out = cf.find();
Iterator res = out.keySet().iterator();
for(; res.hasNext(); ) {
String className = (String) res.next();
System.out.println(className + ".class");
}
}
}

@ -1,5 +1,5 @@
#
# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -41,10 +41,7 @@ endif
PKGLIST = \
sun.jvm.hotspot \
sun.jvm.hotspot.asm \
sun.jvm.hotspot.asm.amd64 \
sun.jvm.hotspot.asm.ia64 \
sun.jvm.hotspot.asm.sparc \
sun.jvm.hotspot.asm.x86 \
sun.jvm.hotspot.bugspot \
sun.jvm.hotspot.bugspot.tree \
sun.jvm.hotspot.c1 \
@ -138,10 +135,7 @@ com.sun.java.swing.ui
FILELIST = \
sun/jvm/hotspot/*.java \
sun/jvm/hotspot/asm/*.java \
sun/jvm/hotspot/asm/amd64/*.java \
sun/jvm/hotspot/asm/ia64/*.java \
sun/jvm/hotspot/asm/sparc/*.java \
sun/jvm/hotspot/asm/x86/*.java \
sun/jvm/hotspot/bugspot/*.java \
sun/jvm/hotspot/bugspot/tree/*.java \
sun/jvm/hotspot/c1/*.java \

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -31,7 +31,13 @@
#import <mach/mach.h>
#import <mach/mach_types.h>
#import <sys/sysctl.h>
#import <stdio.h>
#import <stdarg.h>
#import <stdlib.h>
#import <strings.h>
#import <dlfcn.h>
#import <limits.h>
#import <errno.h>
jboolean debug = JNI_FALSE;
@ -60,6 +66,9 @@ static task_t getTask(JNIEnv *env, jobject this_obj) {
#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
#define CHECK_EXCEPTION_CLEAR if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); }
#define CHECK_EXCEPTION_CLEAR_VOID if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return; }
#define CHECK_EXCEPTION_CLEAR_(value) if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return value; }
static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
(*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
@ -404,3 +413,164 @@ JNF_COCOA_ENTER(env);
}
JNF_COCOA_EXIT(env);
}
/*
* Class: sun_jvm_hotspot_asm_Disassembler
* Method: load_library
* Signature: (Ljava/lang/String;)L
*/
JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_asm_Disassembler_load_1library(JNIEnv * env,
jclass disclass,
jstring jrepath_s,
jstring libname_s) {
uintptr_t func = 0;
const char* error_message = NULL;
const char* java_home;
jboolean isCopy;
uintptr_t *handle = NULL;
const char * jrepath = (*env)->GetStringUTFChars(env, jrepath_s, &isCopy); // like $JAVA_HOME/jre/lib/sparc/
const char * libname = (*env)->GetStringUTFChars(env, libname_s, &isCopy);
char buffer[128];
/* Load the hsdis library */
void* hsdis_handle;
hsdis_handle = dlopen(libname, RTLD_LAZY | RTLD_GLOBAL);
if (hsdis_handle == NULL) {
snprintf(buffer, sizeof(buffer), "%s%s", jrepath, libname);
hsdis_handle = dlopen(buffer, RTLD_LAZY | RTLD_GLOBAL);
}
if (hsdis_handle != NULL) {
func = (uintptr_t)dlsym(hsdis_handle, "decode_instructions_virtual");
}
if (func == 0) {
error_message = dlerror();
fprintf(stderr, "%s\n", error_message);
}
(*env)->ReleaseStringUTFChars(env, libname_s, libname);
(*env)->ReleaseStringUTFChars(env, jrepath_s, jrepath);
if (func == 0) {
/* Couldn't find entry point. error_message should contain some
* platform dependent error message.
*/
THROW_NEW_DEBUGGER_EXCEPTION(error_message);
}
return (jlong)func;
}
/* signature of decode_instructions_virtual from hsdis.h */
typedef void* (*decode_func)(uintptr_t start_va, uintptr_t end_va,
unsigned char* start, uintptr_t length,
void* (*event_callback)(void*, const char*, void*),
void* event_stream,
int (*printf_callback)(void*, const char*, ...),
void* printf_stream,
const char* options);
/* container for call back state when decoding instructions */
typedef struct {
JNIEnv* env;
jobject dis;
jobject visitor;
jmethodID handle_event;
jmethodID raw_print;
char buffer[4096];
} decode_env;
/* event callback binding to Disassembler.handleEvent */
static void* event_to_env(void* env_pv, const char* event, void* arg) {
decode_env* denv = (decode_env*)env_pv;
JNIEnv* env = denv->env;
jstring event_string = (*env)->NewStringUTF(env, event);
jlong result = (*env)->CallLongMethod(env, denv->dis, denv->handle_event, denv->visitor,
event_string, (jlong) (uintptr_t)arg);
/* ignore exceptions for now */
CHECK_EXCEPTION_CLEAR_((void *)0);
return (void*)(uintptr_t)result;
}
/* printing callback binding to Disassembler.rawPrint */
static int printf_to_env(void* env_pv, const char* format, ...) {
jstring output;
va_list ap;
int cnt;
decode_env* denv = (decode_env*)env_pv;
JNIEnv* env = denv->env;
size_t flen = strlen(format);
const char* raw = NULL;
if (flen == 0) return 0;
if (flen < 2 ||
strchr(format, '%') == NULL) {
raw = format;
} else if (format[0] == '%' && format[1] == '%' &&
strchr(format+2, '%') == NULL) {
// happens a lot on machines with names like %foo
flen--;
raw = format+1;
}
if (raw != NULL) {
jstring output = (*env)->NewStringUTF(env, raw);
(*env)->CallVoidMethod(env, denv->dis, denv->raw_print, denv->visitor, output);
CHECK_EXCEPTION_CLEAR;
return (int) flen;
}
va_start(ap, format);
cnt = vsnprintf(denv->buffer, sizeof(denv->buffer), format, ap);
va_end(ap);
output = (*env)->NewStringUTF(env, denv->buffer);
(*env)->CallVoidMethod(env, denv->dis, denv->raw_print, denv->visitor, output);
CHECK_EXCEPTION_CLEAR;
return cnt;
}
/*
* Class: sun_jvm_hotspot_asm_Disassembler
* Method: decode
* Signature: (Lsun/jvm/hotspot/asm/InstructionVisitor;J[BLjava/lang/String;J)V
*/
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_asm_Disassembler_decode(JNIEnv * env,
jobject dis,
jobject visitor,
jlong startPc,
jbyteArray code,
jstring options_s,
jlong decode_instructions_virtual) {
jboolean isCopy;
jbyte* start = (*env)->GetByteArrayElements(env, code, &isCopy);
jbyte* end = start + (*env)->GetArrayLength(env, code);
const char * options = (*env)->GetStringUTFChars(env, options_s, &isCopy);
jclass disclass = (*env)->GetObjectClass(env, dis);
decode_env denv;
denv.env = env;
denv.dis = dis;
denv.visitor = visitor;
/* find Disassembler.handleEvent callback */
denv.handle_event = (*env)->GetMethodID(env, disclass, "handleEvent",
"(Lsun/jvm/hotspot/asm/InstructionVisitor;Ljava/lang/String;J)J");
CHECK_EXCEPTION_CLEAR_VOID
/* find Disassembler.rawPrint callback */
denv.raw_print = (*env)->GetMethodID(env, disclass, "rawPrint",
"(Lsun/jvm/hotspot/asm/InstructionVisitor;Ljava/lang/String;)V");
CHECK_EXCEPTION_CLEAR_VOID
/* decode the buffer */
(*(decode_func)(uintptr_t)decode_instructions_virtual)(startPc,
startPc + end - start,
(unsigned char*)start,
end - start,
&event_to_env, (void*) &denv,
&printf_to_env, (void*) &denv,
options);
/* cleanup */
(*env)->ReleaseByteArrayElements(env, code, start, JNI_ABORT);
(*env)->ReleaseStringUTFChars(env, options_s, options);
}

@ -36,25 +36,33 @@ SOURCES = salibelf.c \
INCLUDES = -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux
OBJS = $(SOURCES:.c=.o)
OBJS = $(SOURCES:%.c=$(ARCH)/%.o) $(ARCH)/sadis.o
LIBS = -lthread_db
CFLAGS = -c -fPIC -g -D_GNU_SOURCE -D$(ARCH) $(INCLUDES) -D_FILE_OFFSET_BITS=64
CFLAGS = -c -fPIC -g -D_GNU_SOURCE -D$(ARCH) $(INCLUDES) -I$(ARCH)
LIBSA = $(ARCH)/libsaproc.so
all: $(LIBSA)
LinuxDebuggerLocal.o: LinuxDebuggerLocal.c
$(JAVAH) -jni -classpath ../../../build/classes \
$(ARCH):
mkdir $(ARCH)
$(ARCH)/LinuxDebuggerLocal.o: LinuxDebuggerLocal.c
$(JAVAH) -jni -classpath ../../../build/classes -d $(ARCH) \
sun.jvm.hotspot.debugger.x86.X86ThreadContext \
sun.jvm.hotspot.debugger.sparc.SPARCThreadContext \
sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext
$(GCC) $(CFLAGS) $<
$(GCC) $(CFLAGS) $< -o $@
.c.obj:
$(GCC) $(CFLAGS)
$(ARCH)/sadis.o: ../../share/native/sadis.c
$(JAVAH) -jni -classpath ../../../build/classes -d $(ARCH) \
sun.jvm.hotspot.asm.Disassembler
$(GCC) $(CFLAGS) $< -o $@
$(ARCH)/%.o: %.c
$(GCC) $(CFLAGS) $< -o $@
ifndef LDNOMAP
LFLAGS_LIBSA = -Xlinker --version-script=mapfile
@ -68,9 +76,8 @@ ifneq ($(_HAS_HASH_STYLE_GNU),)
endif
LFLAGS_LIBSA += $(LDFLAGS_HASH_STYLE)
$(LIBSA): $(OBJS) mapfile
if [ ! -d $(ARCH) ] ; then mkdir $(ARCH) ; fi
$(GCC) -shared $(LFLAGS_LIBSA) -o $(LIBSA) $(OBJS) $(LIBS)
$(LIBSA): $(ARCH) $(OBJS) mapfile
$(GCC) -shared $(LFLAGS_LIBSA) -o $(LIBSA) $(OBJS) $(LIBS)
test.o: test.c
$(GCC) -c -o test.o -g -D_GNU_SOURCE -D$(ARCH) $(INCLUDES) test.c
@ -79,7 +86,4 @@ test: test.o
$(GCC) -o test test.o -L$(ARCH) -lsaproc $(LIBS)
clean:
rm -rf $(LIBSA)
rm -rf $(OBJS)
rmdir $(ARCH)
rm -fr $(ARCH)

@ -1,7 +1,5 @@
#
#
# Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -22,7 +20,6 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# Define public interface.
@ -40,6 +37,10 @@ SUNWprivate_1.1 {
Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0;
Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0;
# Disassembler interface
Java_sun_jvm_hotspot_asm_Disassembler_decode;
Java_sun_jvm_hotspot_asm_Disassembler_load_1library;
# proc_service.h functions - to be used by libthread_db
ps_getpid;
ps_pglobal_lookup;

@ -1,5 +1,5 @@
#
# Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -27,7 +27,7 @@
# sparcv9: Build the 64 bit sparcv9 version in ./sparcv9
# i386: Build the 32 bit i386 version in ./i386
.PHONY: sparc sparcv9 i386
.PHONY: sparc sparcv9 i386 amd64
ARCH_ORIG = $(shell uname -p)
@ -36,6 +36,8 @@ RM := /usr/bin/rm
MKDIRS := /usr/bin/mkdir -p
CLASSES_DIR = ../../../../build/classes
SAPROC_INCLUDES=-I${JAVA_HOME}/include -I${JAVA_HOME}/include/solaris
SADIS=../../../share/native/sadis.c
ifeq "$(ARCH_ORIG)" "i386"
ALL_TARGET = i386 $(filter amd64,$(shell isalist))
@ -43,6 +45,11 @@ else
ALL_TARGET = sparc sparcv9
endif
CFLAGS/i386 =
CFLAGS/amd64 = -xarch=amd64
CFLAGS/sparc = -xarch=v8
CFLAGS/sparv9 = -xarch=v9
all:: $(ALL_TARGET)
javahomecheck::
@ -51,34 +58,13 @@ javahomecheck::
exit 1 ; \
fi
i386:: javahomecheck
i386 amd64 sparc sparcv9:: javahomecheck
$(MKDIRS) $@
@javah -classpath $(CLASSES_DIR) -jni sun.jvm.hotspot.debugger.proc.ProcDebuggerLocal
CC -G -KPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/solaris saproc.cpp \
-M mapfile -o $@/libsaproc.so -ldemangle
CC -o $@/libsaproc_audit.so -G -Kpic -z defs saproc_audit.cpp -lmapmalloc -ldl -lc
amd64:: javahomecheck
$(MKDIRS) $@
@javah -classpath $(CLASSES_DIR) -jni sun.jvm.hotspot.debugger.proc.ProcDebuggerLocal
CC -G -KPIC -xarch=amd64 -I${JAVA_HOME}/include -I${JAVA_HOME}/include/solaris saproc.cpp \
-M mapfile -o $@/libsaproc.so -ldemangle
CC -xarch=amd64 -o $@/libsaproc_audit.so -G -Kpic -z defs saproc_audit.cpp -lmapmalloc -ldl -lc
sparc:: javahomecheck
$(MKDIRS) $@
@javah -classpath $(CLASSES_DIR) -jni sun.jvm.hotspot.debugger.proc.ProcDebuggerLocal
CC -G -KPIC -xarch=v8 -I${JAVA_HOME}/include -I${JAVA_HOME}/include/solaris saproc.cpp \
-M mapfile -o $@/libsaproc.so -ldemangle
CC -xarch=v8 -o $@/libsaproc_audit.so -G -Kpic -z defs saproc_audit.cpp -lmapmalloc -ldl -lc
sparcv9:: javahomecheck
$(MKDIRS) $@
@javah -classpath $(CLASSES_DIR) -jni sun.jvm.hotspot.debugger.proc.ProcDebuggerLocal
CC -G -KPIC -xarch=v9 -I${JAVA_HOME}/include -I${JAVA_HOME}/include/solaris saproc.cpp \
-M mapfile -o $@/libsaproc.so -ldemangle
CC -xarch=v9 -o $@/libsaproc_audit.so -G -Kpic -z defs saproc_audit.cpp -lmapmalloc -ldl -lc
@$(JAVA_HOME)/bin/javah -classpath $(CLASSES_DIR) -d $@ -jni sun.jvm.hotspot.asm.Disassembler sun.jvm.hotspot.debugger.proc.ProcDebuggerLocal
CC $(CFLAGS/$@) -c -g -Kpic ${SAPROC_INCLUDES} -I$@ saproc.cpp -o $@/saproc.o
cc $(CFLAGS/$@) -c -g -Kpic ${SAPROC_INCLUDES} -I$@ $(SADIS) -o $@/sadis.o
CC $(CFLAGS/$@) -g -G -Kpic $@/saproc.o $@/sadis.o -M mapfile -o $@/libsaproc.so -ldemangle
CC $(CFLAGS/$@) -o $@/libsaproc_audit.so -G -Kpic -z defs saproc_audit.cpp -lmapmalloc -ldl -lc
clean::
$(RM) -rf sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal.h
$(RM) -rf sparc sparcv9 i386
$(RM) -rf sparc sparcv9 i386 amd64

@ -1,7 +1,5 @@
#
#
# Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -22,10 +20,8 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# Define public interface.
SUNWprivate_1.1 {
global:
Java_sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal_attach0__Ljava_lang_String_2;
@ -47,6 +43,9 @@ SUNWprivate_1.1 {
Java_sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal_writeBytesToProcess0;
# this is needed by saproc_audit.c to redirect opens in libproc.so
libsaproc_open;
local:
# Disassembler interface
Java_sun_jvm_hotspot_asm_Disassembler_decode;
Java_sun_jvm_hotspot_asm_Disassembler_load_1library;
local:
*;
};

@ -1,5 +1,5 @@
#
# Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -35,6 +35,8 @@ WINDBG_LIB32=$(WINDBG_HOME)/sdk/lib/i386
WINDBG_LIB_IA64=$(WINDBG_HOME)/sdk/lib/ia64
WINDBG_LIB_AMD64=$(WINDBG_HOME)/sdk/lib/amd64
SADIS=../../../share/native/sadis.c
# These do not need to be optimized (don't run a lot of code) and it
# will be useful to have the assertion checks in place
@ -57,23 +59,29 @@ ia64: ia64/$(SAWINDBGDLL)
amd64: amd64/$(SAWINDBGDLL)
i386/$(SAWINDBGDLL) : sawindbg.cpp
i386/$(SAWINDBGDLL) : sawindbg.cpp $(SADIS)
@ mkdir -p i386
@ $(JAVAH) -jni -classpath ../../../../build/classes sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal sun.jvm.hotspot.debugger.x86.X86ThreadContext
@ $(JAVAH) -jni -classpath ../../../../build/classes sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal sun.jvm.hotspot.debugger.x86.X86ThreadContext
@ $(JAVAH) -jni -classpath ../../../../build/classes sun.jvm.hotspot.asm.Disassembler
@ $(CPP32) /I$(JAVA_HOME)/include /I$(JAVA_HOME)/include/win32 /I$(WINDBG_INCLUDE) $(CFLAGS32) /Fp"i386/sawindbg.pch" /Fo"i386/" /Fd"i386/" /c sawindbg.cpp
$(LINK32) /out:$@ /DLL i386/sawindbg.obj $(LIBS32)
@ $(CPP32) /I$(JAVA_HOME)/include /I$(JAVA_HOME)/include/win32 /I$(WINDBG_INCLUDE) $(CFLAGS32) /Fp"i386/sadis.pch" /Fo"i386/" /Fd"i386/" /c $(SADIS)
$(LINK32) /out:$@ /DLL i386/sawindbg.obj i386/sadis.obj $(LIBS32)
ia64/$(SAWINDBGDLL) : sawindbg.cpp
ia64/$(SAWINDBGDLL) : sawindbg.cpp $(SADIS)
@ mkdir -p ia64
@ $(JAVAH) -jni -classpath ../../../../build/classes sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal sun.jvm.hotspot.debugger.ia64.IA64ThreadContext
@ $(JAVAH) -jni -classpath ../../../../build/classes sun.jvm.hotspot.asm.Disassembler
@ $(CPP64) /I$(JAVA_HOME)/include /I$(JAVA_HOME)/include/win32 /I$(WINDBG_INCLUDE) $(CFLAGS64) /Fp"ia64/sawindbg.pch" /Fo"ia64/" /Fd"ia64/" /c sawindbg.cpp
$(LINK64) /out:$@ /DLL ia64/sawindbg.obj $(LIBS_IA64)
@ $(CPP64) /I$(JAVA_HOME)/include /I$(JAVA_HOME)/include/win32 /I$(WINDBG_INCLUDE) $(CFLAGS64) /Fp"ia64/sadis.pch" /Fo"ia64/" /Fd"ia64/" /c $(SADIS)
$(LINK64) /out:$@ /DLL ia64/sawindbg.obj ia64/sadis.obj $(LIBS_IA64)
amd64/$(SAWINDBGDLL) : sawindbg.cpp
amd64/$(SAWINDBGDLL) : sawindbg.cpp $(SADIS)
@ mkdir -p amd64
@ $(JAVAH) -jni -classpath ../../../../build/classes sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext
@ $(JAVAH) -jni -classpath ../../../../build/classes sun.jvm.hotspot.asm.Disassembler
@ $(CPP64) /I$(JAVA_HOME)/include /I$(JAVA_HOME)/include/win32 /I$(WINDBG_INCLUDE) $(CFLAGS64) /Fp"amd64/sawindbg.pch" /Fo"amd64/" /Fd"amd64/" /c sawindbg.cpp
$(LINK64) /out:$@ /DLL amd64/sawindbg.obj $(LIBS_AMD64)
@ $(CPP64) /I$(JAVA_HOME)/include /I$(JAVA_HOME)/include/win32 /I$(WINDBG_INCLUDE) $(CFLAGS64) /Fp"amd64/sadis.pch" /Fo"amd64/" /Fd"amd64/" /c $(SADIS)
$(LINK64) /out:$@ /DLL amd64/sawindbg.obj amd64/sadis.obj $(LIBS_AMD64)
clean:
rm *.h

@ -42,6 +42,7 @@ import sun.jvm.hotspot.memory.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.opto.*;
import sun.jvm.hotspot.ci.*;
import sun.jvm.hotspot.asm.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.utilities.*;
import sun.jvm.hotspot.utilities.soql.*;
@ -564,6 +565,71 @@ public class CommandProcessor {
}
}
},
// decode raw address
new Command("dis", "dis address [length]", false) {
public void doit(Tokens t) {
int tokens = t.countTokens();
if (tokens != 1 && tokens != 2) {
usage();
return;
}
String name = t.nextToken();
Address addr = null;
int len = 0x10; // default length
try {
addr = VM.getVM().getDebugger().parseAddress(name);
} catch (NumberFormatException e) {
out.println(e);
return;
}
if (tokens == 2) {
try {
len = Integer.parseInt(t.nextToken());
} catch (NumberFormatException e) {
out.println(e);
return;
}
}
HTMLGenerator generator = new HTMLGenerator(false);
out.println(generator.genHTMLForRawDisassembly(addr, len));
}
},
// decode codeblob or nmethod
new Command("disassemble", "disassemble address", false) {
public void doit(Tokens t) {
int tokens = t.countTokens();
if (tokens != 1) {
usage();
return;
}
String name = t.nextToken();
Address addr = null;
try {
addr = VM.getVM().getDebugger().parseAddress(name);
} catch (NumberFormatException e) {
out.println(e);
return;
}
HTMLGenerator generator = new HTMLGenerator(false);
out.println(generator.genHTML(addr));
}
},
// print Java bytecode disassembly
new Command("jdis", "jdis address", false) {
public void doit(Tokens t) {
int tokens = t.countTokens();
if (tokens != 1) {
usage();
return;
}
Address a = VM.getVM().getDebugger().parseAddress(t.nextToken());
Method m = (Method)Metadata.instantiateWrapperFor(a);
HTMLGenerator html = new HTMLGenerator(false);
out.println(html.genHTML(m));
}
},
new Command("revptrs", "revptrs address", false) {
public void doit(Tokens t) {
int tokens = t.countTokens();

@ -43,10 +43,6 @@ import sun.jvm.hotspot.utilities.*;
* highest-level factory for VM data structures. It makes it simple
* to start up the debugging system. </P>
*
* <P> FIXME: need to add a way to configure the paths to dbx and the
* DSO from the outside. However, this should work for now for
* internal use. </P>
*
* <P> FIXME: especially with the addition of remote debugging, this
* has turned into a mess; needs rethinking. </P>
*/
@ -87,30 +83,7 @@ public class HotSpotAgent {
private String[] jvmLibNames;
// FIXME: make these configurable, i.e., via a dotfile; also
// consider searching within the JDK from which this Java executable
// comes to find them
private static final String defaultDbxPathPrefix = "/net/jano.sfbay/export/disk05/hotspot/sa";
private static final String defaultDbxSvcAgentDSOPathPrefix = "/net/jano.sfbay/export/disk05/hotspot/sa";
static void showUsage() {
System.out.println(" You can also pass these -D options to java to specify where to find dbx and the \n" +
" Serviceability Agent plugin for dbx:");
System.out.println(" -DdbxPathName=<path-to-dbx-executable>\n" +
" Default is derived from dbxPathPrefix");
System.out.println(" or");
System.out.println(" -DdbxPathPrefix=<xxx>\n" +
" where xxx is the path name of a dir structure that contains:\n" +
" <os>/<arch>/bin/dbx\n" +
" The default is " + defaultDbxPathPrefix);
System.out.println(" and");
System.out.println(" -DdbxSvcAgentDSOPathName=<path-to-dbx-serviceability-agent-module>\n" +
" Default is determined from dbxSvcAgentDSOPathPrefix");
System.out.println(" or");
System.out.println(" -DdbxSvcAgentDSOPathPrefix=<xxx>\n" +
" where xxx is the pathname of a dir structure that contains:\n" +
" <os>/<arch>/bin/lib/libsvc_agent_dbx.so\n" +
" The default is " + defaultDbxSvcAgentDSOPathPrefix);
}
public HotSpotAgent() {

@ -1,207 +0,0 @@
/*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.proc.*;
// A test of the debugger backend. This should be used to connect to
// the helloWorld.cpp program.
public class TestDebugger {
private static void usage() {
System.out.println("usage: java TestDebugger [pid]");
System.out.println("pid must be the process ID of the helloWorld process");
System.exit(1);
}
public static void main(String[] args) {
try {
if (args.length != 1) {
usage();
}
int pid = 0;
try {
pid = Integer.parseInt(args[0]);
}
catch (NumberFormatException e) {
usage();
}
JVMDebugger debugger = new ProcDebuggerLocal(null, true);
try {
debugger.attach(pid);
}
catch (DebuggerException e) {
System.err.print("Error attaching to process ID " + pid + ": ");
if (e.getMessage() != null) {
System.err.print(e.getMessage());
}
System.err.println();
System.exit(1);
}
// HACK: configure debugger with primitive type sizes to get
// Java types going
debugger.configureJavaPrimitiveTypeSizes(1, 1, 2, 8, 4, 4, 8, 2);
// FIXME: figure out how to canonicalize and/or eliminate
// loadobject specification
String loadObjectName = "-";
// long strAddr = debugger.lookup("helloWorld", "helloWorldString");
Address addr = debugger.lookup(loadObjectName, "helloWorldString");
if (addr == null) {
System.err.println("Error looking up symbol \"helloWorldString\" in context \"" +
loadObjectName + "\"");
System.exit(1);
}
// This is a pointer which points to the start of storage.
// Dereference it.
addr = addr.getAddressAt(0);
// Read the number of bytes we know we need
int helloWorldLen = 13;
byte[] data = new byte[helloWorldLen];
for (int i = 0; i < helloWorldLen; ++i) {
data[i] = (byte) addr.getCIntegerAt(i, 1, false);
}
// Convert to characters
char[] chars = new char[data.length];
for (int i = 0; i < data.length; ++i) {
chars[i] = (char) data[i];
}
String helloWorldStr = new String(chars);
System.out.println("Successfully read string \"" + helloWorldStr + "\" from target process\n");
// Test all Java data types (see helloWorld.cpp)
byte expectedByteValue = (byte) 132;
short expectedShortValue = (short) 27890;
int expectedIntValue = 1020304050;
long expectedLongValue = 102030405060708090L;
float expectedFloatValue = 35.4F;
double expectedDoubleValue = 1.23456789;
byte byteValue = 0;
short shortValue = 0;
int intValue = 0;
long longValue = 0;
float floatValue = 0;
double doubleValue = 0;
addr = debugger.lookup(loadObjectName, "testByte");
if (addr == null) {
System.err.println("Error looking up symbol \"testByte\" in context \"" +
loadObjectName + "\"");
System.exit(1);
}
byteValue = addr.getJByteAt(0);
if (byteValue != expectedByteValue) {
System.err.println("Error: unexpected byte value (got " +
byteValue + ", expected " + expectedByteValue + ")");
System.exit(1);
}
addr = debugger.lookup(loadObjectName, "testShort");
if (addr == null) {
System.err.println("Error looking up symbol \"testShort\" in context \"" +
loadObjectName + "\"");
System.exit(1);
}
shortValue = addr.getJShortAt(0);
if (shortValue != expectedShortValue) {
System.err.println("Error: unexpected short value (got " +
shortValue + ", expected " + expectedShortValue + ")");
System.exit(1);
}
addr = debugger.lookup(loadObjectName, "testInt");
if (addr == null) {
System.err.println("Error looking up symbol \"testInt\" in context \"" +
loadObjectName + "\"");
System.exit(1);
}
intValue = addr.getJIntAt(0);
if (intValue != expectedIntValue) {
System.err.println("Error: unexpected int value (got " +
intValue + ", expected " + expectedIntValue + ")");
System.exit(1);
}
addr = debugger.lookup(loadObjectName, "testLong");
if (addr == null) {
System.err.println("Error looking up symbol \"testLong\" in context \"" +
loadObjectName + "\"");
System.exit(1);
}
longValue = addr.getJLongAt(0);
if (longValue != expectedLongValue) {
System.err.println("Error: unexpected long value (got " +
longValue + ", expected " + expectedLongValue + ")");
System.exit(1);
}
addr = debugger.lookup(loadObjectName, "testFloat");
if (addr == null) {
System.err.println("Error looking up symbol \"testFloat\" in context \"" +
loadObjectName + "\"");
System.exit(1);
}
floatValue = addr.getJFloatAt(0);
if (floatValue != expectedFloatValue) {
System.err.println("Error: unexpected float value (got " +
floatValue + ", expected " + expectedFloatValue + ")");
System.exit(1);
}
addr = debugger.lookup(loadObjectName, "testDouble");
if (addr == null) {
System.err.println("Error looking up symbol \"testDouble\" in context \"" +
loadObjectName + "\"");
System.exit(1);
}
doubleValue = addr.getJDoubleAt(0);
if (doubleValue != expectedDoubleValue) {
System.err.println("Error: unexpected double value (got " +
doubleValue + ", expected " + expectedDoubleValue + ")");
System.exit(1);
}
System.err.println("All tests passed successfully.");
debugger.detach();
}
catch (AddressException e) {
System.err.println("Error occurred during test:");
e.printStackTrace();
System.exit(1);
}
}
}

@ -1,97 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public abstract class AbstractInstruction implements Instruction {
protected final String name;
public AbstractInstruction(String name) {
this.name = name;
}
public String getName() {
return name;
}
// some type testers
public boolean isIllegal() {
return false;
}
public boolean isArithmetic() {
return false;
}
public boolean isLogical() {
return false;
}
public boolean isShift() {
return false;
}
public boolean isMove() {
return false;
}
public boolean isBranch() {
return false;
}
public boolean isCall() {
return false;
}
public boolean isReturn() {
return false;
}
public boolean isLoad() {
return false;
}
public boolean isStore() {
return false;
}
public boolean isFloat() {
return false;
}
public boolean isTrap() {
return false;
}
public boolean isNoop() {
return false;
}
// convert the instruction as String given currentPc
// and SymbolFinder
public String asString(long currentPc, SymbolFinder symFinder) {
return name;
}
}

@ -1,33 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public abstract class Address extends Operand {
public boolean isAddress() {
return true;
}
public abstract String toString();
}

@ -1,31 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface Arithmetic extends Instruction, RTLOperations {
public Operand[] getArithmeticSources();
public Operand getArithmeticDestination();
public int getOperation(); // one of RTLOperations
}

@ -1,31 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface ArithmeticInstruction extends Instruction, RTLOperations {
public Operand[] getArithmeticSources();
public Operand getArithmeticDestination();
public int getOperation(); // one of RTLOperations
}

@ -1,88 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
// address is calculated as (base + (index * scale) + displacement)
// optionally index is auto incremented or decremented
public abstract class BaseIndexScaleDispAddress extends IndirectAddress {
private final Register base, index;
private final int scale;
private final long disp;
private boolean isAutoIncr;
private boolean isAutoDecr;
public BaseIndexScaleDispAddress(Register base, Register index, long disp, int scale) {
this.base = base;
this.index = index;
this.disp = disp;
this.scale = scale;
}
public BaseIndexScaleDispAddress(Register base, Register index, long disp) {
this(base, index, disp, 1);
}
public BaseIndexScaleDispAddress(Register base, Register index) {
this(base, index, 0L, 1);
}
public BaseIndexScaleDispAddress(Register base, long disp) {
this(base, null, disp, 1);
}
public Register getBase() {
return base;
}
public Register getIndex() {
return index;
}
public int getScale() {
return scale;
}
public long getDisplacement() {
return disp;
}
// is the index auto decremented or incremented?
public boolean isAutoIncrement() {
return isAutoIncr;
}
public void setAutoIncrement(boolean value) {
isAutoIncr = value;
}
public boolean isAutoDecrement() {
return isAutoDecr;
}
public void setAutoDecrement(boolean value) {
isAutoDecr = value;
}
}

@ -1,30 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface BranchInstruction extends Instruction {
public boolean isConditional();
public Address getBranchDestination();
}

@ -1,33 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface CPUHelper {
public Disassembler createDisassembler(long startPc, byte[] code);
public Register getIntegerRegister(int num);
public Register getFloatRegister(int num);
public Register getStackPointer();
public Register getFramePointer();
}

@ -1,28 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface CallInstruction extends BranchInstruction {
}

@ -1,40 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public class DirectAddress extends Address {
private long value;
public DirectAddress(long value) {
this.value = value;
}
public long getValue() {
return value;
}
public String toString() {
return Long.toHexString(value);
}
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -24,22 +24,134 @@
package sun.jvm.hotspot.asm;
public abstract class Disassembler {
protected long startPc;
protected byte[] code;
import java.io.PrintStream;
import java.util.Observer;
import java.util.Observable;
import sun.jvm.hotspot.code.CodeBlob;
import sun.jvm.hotspot.code.NMethod;
import sun.jvm.hotspot.debugger.Address;
import sun.jvm.hotspot.runtime.VM;
public Disassembler(long startPc, byte[] code) {
public class Disassembler {
private static String options = "";
private static long decode_function;
protected long startPc;
protected byte[] code;
private CodeBlob blob;
private NMethod nmethod;
public static void decode(InstructionVisitor visitor, CodeBlob blob) {
decode(visitor, blob, blob.codeBegin(), blob.codeEnd());
}
public static void decode(InstructionVisitor visitor, CodeBlob blob, Address begin, Address end) {
int codeSize = (int)end.minus(begin);
long startPc = VM.getAddressValue(begin);
byte[] code = new byte[codeSize];
for (int i = 0; i < code.length; i++)
code[i] = begin.getJByteAt(i);
Disassembler dis = new Disassembler(startPc, code);
dis.decode(visitor);
}
private Disassembler(long startPc, byte[] code) {
this.startPc = startPc;
this.code = code;
// Lazily load hsdis
if (decode_function == 0) {
StringBuilder path = new StringBuilder(System.getProperty("java.home"));
String sep = System.getProperty("file.separator");
String os = System.getProperty("os.name");
String libname = "hsdis";
String arch = System.getProperty("os.arch");
if (os.lastIndexOf("Windows", 0) != -1) {
path.append(sep + "bin" + sep);
libname += ".dll";
} else if (os.lastIndexOf("SunOS", 0) != -1) {
if (arch.equals("x86") || arch.equals("i386")) {
path.append(sep + "lib" + sep + "i386" + sep);
libname += "-i386" + ".so";
} else if (arch.equals("amd64")) {
path.append(sep + "lib" + sep + "amd64" + sep);
libname += "-amd64" + ".so";
} else {
path.append(sep + "lib" + sep + arch + sep);
libname += "-" + arch + ".so";
}
} else if (os.lastIndexOf("Linux", 0) != -1) {
if (arch.equals("x86") || arch.equals("i386")) {
path.append(sep + "lib" + sep + "i386" + sep);
libname += "-i386.so";
} else if (arch.equals("amd64") || arch.equals("x86_64")) {
path.append(sep + "lib" + sep + "amd64" + sep);
libname += "-amd64.so";
} else {
path.append(sep + "lib" + sep + arch + sep);
libname += "-" + arch + ".so";
}
} else if (os.lastIndexOf("Mac OS X", 0) != -1) {
path.append(sep + "lib" + sep);
libname += "-amd64" + ".dylib"; // x86_64 => amd64
} else {
path.append(sep + "lib" + sep + "arch" + sep);
libname += "-" + arch + ".so";
}
decode_function = load_library(path.toString(), libname);
}
}
public long getStartPC() {
return startPc;
private static native long load_library(String installed_jrepath, String hsdis_library_name);
private native void decode(InstructionVisitor visitor, long pc, byte[] code,
String options, long decode_function);
private void decode(InstructionVisitor visitor) {
visitor.prologue();
decode(visitor, startPc, code, options, decode_function);
visitor.epilogue();
}
public byte[] getCode() {
return code;
private boolean match(String event, String tag) {
if (!event.startsWith(tag))
return false;
int taglen = tag.length();
if (taglen == event.length()) return true;
char delim = event.charAt(taglen);
return delim == ' ' || delim == '/' || delim == '=';
}
public abstract void decode(InstructionVisitor visitor);
// This is called from the native code to process various markers
// in the dissassembly.
private long handleEvent(InstructionVisitor visitor, String event, long arg) {
if (match(event, "insn")) {
try {
visitor.beginInstruction(arg);
} catch (Throwable e) {
e.printStackTrace();
}
} else if (match(event, "/insn")) {
try {
visitor.endInstruction(arg);
} catch (Throwable e) {
e.printStackTrace();
}
} else if (match(event, "addr")) {
if (arg != 0) {
visitor.printAddress(arg);
}
return arg;
} else if (match(event, "mach")) {
// output().printf("[Disassembling for mach='%s']\n", arg);
} else {
// ignore unrecognized markup
}
return 0;
}
// This called from the native code to perform printing
private void rawPrint(InstructionVisitor visitor, String s) {
visitor.print(s);
}
}

@ -1,62 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
// Immediate is a Number operand
public class Immediate extends ImmediateOrRegister {
private final Number value;
public Immediate(Number value) {
this.value = value;
}
public Number getNumber() {
return value;
}
public boolean isImmediate() {
return true;
}
public String toString() {
return value.toString();
}
public int hashCode() {
return value.hashCode();
}
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Immediate other = (Immediate) obj;
return value.equals(other.value);
}
}

@ -1,28 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public abstract class IndirectAddress extends Address {
}

@ -1,53 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface Instruction {
public String getName();
// total size in bytes (operands + opcode).
// for eg. in sparc it is always 4 (= 32bits)
public int getSize();
// some type testers
public boolean isIllegal();
public boolean isArithmetic();
public boolean isLogical();
public boolean isShift();
public boolean isMove();
public boolean isBranch();
public boolean isCall();
public boolean isReturn();
public boolean isLoad();
public boolean isStore();
public boolean isFloat();
public boolean isTrap();
public boolean isNoop();
// convert the instruction as String given currentPc
// and SymbolFinder
public String asString(long currentPc, SymbolFinder symFinder);
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,9 @@ package sun.jvm.hotspot.asm;
public interface InstructionVisitor {
public void prologue();
public void visit(long currentPc, Instruction instr);
public void beginInstruction(long currentPc);
public void printAddress(long address);
public void print(String format);
public void endInstruction(long endPc);
public void epilogue();
}

@ -1,30 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface LoadInstruction extends MemoryInstruction {
public Address getLoadSource();
public Register[] getLoadDestinations();
}

@ -1,31 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface LogicInstruction extends Instruction, RTLOperations {
public Operand[] getLogicSources();
public Operand getLogicDestination();
public int getOperation(); // one of RTLOperations
}

@ -1,30 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface MemoryInstruction extends RTLDataTypes {
public int getDataType(); // one of the RTLDataTypes.
public boolean isConditional(); // conditional store like swap or v9 like non-faulting loads
}

@ -1,32 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface MoveInstruction extends Instruction {
public ImmediateOrRegister getMoveSource();
public Register getMoveDestination();
// for condition moves
public boolean isConditional();
}

@ -1,43 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
// address is specified as an offset from current PC
public class PCRelativeAddress extends IndirectAddress {
private final long disp;
public PCRelativeAddress(long disp) {
this.disp = disp;
}
public String toString() {
return new Long(disp).toString();
}
public long getDisplacement() {
return disp;
}
}

@ -1,53 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface RTLDataTypes {
// HALF = 16 bits, WORD = 32 bits, DWORD = 64 bits and QWORD = 128 bits.
public static final int RTLDT_SIGNED_BYTE = 0;
public static final int RTLDT_UNSIGNED_BYTE = 1;
public static final int RTLDT_SIGNED_HALF = 2;
public static final int RTLDT_UNSIGNED_HALF = 3;
public static final int RTLDT_SIGNED_WORD = 4;
public static final int RTLDT_UNSIGNED_WORD = 5;
public static final int RTLDT_SIGNED_DWORD = 6;
public static final int RTLDT_UNSIGNED_DWORD = 7;
public static final int RTLDT_SIGNED_QWORD = 8;
public static final int RTLDT_UNSIGNED_QWORD = 9;
// float is 4 bytes, double is 8 bytes, extended double is 10 bytes
// and quad is 16 bytes.
public static final int RTLDT_FL_SINGLE = 10;
public static final int RTLDT_FL_DOUBLE = 11;
public static final int RTLDT_FL_EXT_DOUBLE = 12;
public static final int RTLDT_FL_QUAD = 13;
public static final int RTLDT_STRING = 14;
public static final int RTLDT_UNKNOWN = Integer.MAX_VALUE;
}

@ -1,62 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface RTLOperations {
// arithmetic operations
public static final int RTLOP_ADD = 0;
// with carry
public static final int RTLOP_ADDC = 1;
public static final int RTLOP_SUB = 2;
// with carry
public static final int RTLOP_SUBC = 3;
public static final int RTLOP_SMUL = 4;
public static final int RTLOP_UMUL = 5;
public static final int RTLOP_SDIV = 6;
public static final int RTLOP_UDIV = 7;
public static final int RTLOP_MAX_ARITHMETIC = RTLOP_UDIV;
// logical operations
public static final int RTLOP_AND = 8;
public static final int RTLOP_OR = 9;
public static final int RTLOP_NOT = 10;
public static final int RTLOP_NAND = 11;
public static final int RTLOP_NOR = 12;
public static final int RTLOP_XOR = 13;
public static final int RTLOP_XNOR = 14;
public static final int RTLOP_MAX_LOGICAL = RTLOP_XNOR;
// shift operations
public static final int RTLOP_SRL = 15;
public static final int RTLOP_SRA = 16;
public static final int RTLOP_SLL = 17;
public static final int RTLOP_MAX_SHIFT = RTLOP_SLL;
public static final int RTLOP_UNKNOWN = Integer.MAX_VALUE;
}

@ -1,28 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface ReturnInstruction extends BranchInstruction {
}

@ -1,31 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface ShiftInstruction extends Instruction, RTLOperations {
public Operand getShiftSource();
public Operand getShiftLength(); // number of bits to shift
public Operand getShiftDestination();
}

@ -1,30 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm;
public interface StoreInstruction extends MemoryInstruction {
public Register[] getStoreSources();
public Address getStoreDestination();
}

@ -1,90 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.amd64;
import sun.jvm.hotspot.utilities.Assert;
public class AMD64FloatRegisters {
public static int getNumRegisters() {
return NUM_REGIXMMERS;
}
public static AMD64FloatRegister getRegister(int regNum) {
if (Assert.ASSERTS_ENABLED) {
Assert.that(regNum > -1 && regNum < NUM_REGIXMMERS, "invalid float register number!");
}
return registers[regNum];
}
public static String getRegisterName(int i) {
return "XMM(" + i + ")";
}
public static final AMD64FloatRegister XMM0;
public static final AMD64FloatRegister XMM1;
public static final AMD64FloatRegister XMM2;
public static final AMD64FloatRegister XMM3;
public static final AMD64FloatRegister XMM4;
public static final AMD64FloatRegister XMM5;
public static final AMD64FloatRegister XMM6;
public static final AMD64FloatRegister XMM7;
public static final AMD64FloatRegister XMM8;
public static final AMD64FloatRegister XMM9;
public static final AMD64FloatRegister XMM10;
public static final AMD64FloatRegister XMM11;
public static final AMD64FloatRegister XMM12;
public static final AMD64FloatRegister XMM13;
public static final AMD64FloatRegister XMM14;
public static final AMD64FloatRegister XMM15;
public static final int NUM_REGIXMMERS = 16;
private static final AMD64FloatRegister[] registers;
static {
XMM0 = new AMD64FloatRegister(0);
XMM1 = new AMD64FloatRegister(1);
XMM2 = new AMD64FloatRegister(2);
XMM3 = new AMD64FloatRegister(3);
XMM4 = new AMD64FloatRegister(4);
XMM5 = new AMD64FloatRegister(5);
XMM6 = new AMD64FloatRegister(6);
XMM7 = new AMD64FloatRegister(7);
XMM8 = new AMD64FloatRegister(8);
XMM9 = new AMD64FloatRegister(9);
XMM10 = new AMD64FloatRegister(10);
XMM11 = new AMD64FloatRegister(11);
XMM12 = new AMD64FloatRegister(12);
XMM13 = new AMD64FloatRegister(13);
XMM14 = new AMD64FloatRegister(14);
XMM15 = new AMD64FloatRegister(15);
registers = new AMD64FloatRegister[] {
XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15
};
}
}

@ -1,51 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.amd64;
import sun.jvm.hotspot.asm.*;
public class AMD64Helper implements CPUHelper {
public Disassembler createDisassembler(long startPc, byte[] code) {
// FIXME: no disassembler yet
return null;
}
public Register getIntegerRegister(int num) {
return AMD64Registers.getRegister(num);
}
public Register getFloatRegister(int num) {
return AMD64FloatRegisters.getRegister(num);
}
public Register getStackPointer() {
return AMD64Registers.RSP;
}
public Register getFramePointer() {
return AMD64Registers.RBP;
}
}

@ -1,53 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.amd64;
import sun.jvm.hotspot.asm.*;
public class AMD64Register extends Register {
protected String name;
public AMD64Register(int num, String name) {
super(num);
this.name = name;
}
public int getNumberOfRegisters() {
return AMD64Registers.getNumberOfRegisters();
}
public String toString() {
return name;
}
public boolean isFramePointer() {
return number == 5; //rbp
}
public boolean isStackPointer() {
return number == 4; //rsp
}
public boolean isFloat() {
return false;
}
public boolean isSegmentPointer() {
return false;
}
}

@ -1,92 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.amd64;
import sun.jvm.hotspot.utilities.*;
public class AMD64Registers {
public static final int NUM_REGISTERS = 16;
public static final AMD64Register RAX;
public static final AMD64Register RCX;
public static final AMD64Register RDX;
public static final AMD64Register RBX;
public static final AMD64Register RSP;
public static final AMD64Register RBP;
public static final AMD64Register RSI;
public static final AMD64Register RDI;
public static final AMD64Register R8;
public static final AMD64Register R9;
public static final AMD64Register R10;
public static final AMD64Register R11;
public static final AMD64Register R12;
public static final AMD64Register R13;
public static final AMD64Register R14;
public static final AMD64Register R15;
private static final AMD64Register[] registers;
static {
RAX = new AMD64Register(0, "rax");
RCX = new AMD64Register(1, "rcx");
RDX = new AMD64Register(2, "rdx");
RBX = new AMD64Register(3, "rbx");
RSP = new AMD64Register(4, "rsp");
RBP = new AMD64Register(5, "rbp");
RSI = new AMD64Register(6, "rsi");
RDI = new AMD64Register(7, "rdi");
R8 = new AMD64Register(8, "r8" );
R9 = new AMD64Register(9, "r9" );
R10 = new AMD64Register(10,"r10");
R11 = new AMD64Register(11,"r11");
R12 = new AMD64Register(12,"r12");
R13 = new AMD64Register(13,"r13");
R14 = new AMD64Register(14,"r14");
R15 = new AMD64Register(15,"r15");
registers = new AMD64Register[] {
RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI,
R8, R9, R10, R11, R12, R13, R14, R15
};
}
public static int getNumberOfRegisters() {
return NUM_REGISTERS;
}
public static AMD64Register getRegister(int regNum) {
if (Assert.ASSERTS_ENABLED) {
Assert.that(regNum > -1 && regNum < NUM_REGISTERS, "invalid integer register number!");
}
return registers[regNum];
}
//Return the register name
public static String getRegisterName(int regNum) {
if (Assert.ASSERTS_ENABLED) {
Assert.that(regNum > -1 && regNum < NUM_REGISTERS, "invalid integer register number!");
}
return registers[regNum].toString();
}
}

@ -1,73 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.ia64;
import sun.jvm.hotspot.asm.Register;
import sun.jvm.hotspot.utilities.Assert;
public class IA64FloatRegister extends IA64Register {
public IA64FloatRegister(int number) {
super(number);
}
public int getNumber() {
return number;
}
public static final int SINGLE_PRECISION = 1;
public static final int DOUBLE_PRECISION = 2;
public static final int QUAD_PRECISION = 3;
public int getNumber(int width) {
return number;
}
private static final int nofRegisters = 128;
public int getNumberOfRegisters() {
return nofRegisters;
}
public boolean isFloat() {
return true;
}
public boolean isFramePointer() {
return false;
}
public boolean isStackPointer() {
return false;
}
public boolean isValid() {
return number >= 0 && number < nofRegisters;
}
public String toString() {
return IA64FloatRegisters.getRegisterName(number);
}
}

@ -1,320 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.ia64;
import sun.jvm.hotspot.utilities.Assert;
public class IA64FloatRegisters {
public static int getNumRegisters() {
return 128;
}
public static IA64FloatRegister getRegister(int i) {
Assert.that(i >= 0 && i < 128, "float register number is invalid");
return registers[i];
}
public static String getRegisterName(int i) {
return "%f" + i;
}
public static final IA64FloatRegister F0;
public static final IA64FloatRegister F1;
public static final IA64FloatRegister F2;
public static final IA64FloatRegister F3;
public static final IA64FloatRegister F4;
public static final IA64FloatRegister F5;
public static final IA64FloatRegister F6;
public static final IA64FloatRegister F7;
public static final IA64FloatRegister F8;
public static final IA64FloatRegister F9;
public static final IA64FloatRegister F10;
public static final IA64FloatRegister F11;
public static final IA64FloatRegister F12;
public static final IA64FloatRegister F13;
public static final IA64FloatRegister F14;
public static final IA64FloatRegister F15;
public static final IA64FloatRegister F16;
public static final IA64FloatRegister F17;
public static final IA64FloatRegister F18;
public static final IA64FloatRegister F19;
public static final IA64FloatRegister F20;
public static final IA64FloatRegister F21;
public static final IA64FloatRegister F22;
public static final IA64FloatRegister F23;
public static final IA64FloatRegister F24;
public static final IA64FloatRegister F25;
public static final IA64FloatRegister F26;
public static final IA64FloatRegister F27;
public static final IA64FloatRegister F28;
public static final IA64FloatRegister F29;
public static final IA64FloatRegister F30;
public static final IA64FloatRegister F31;
public static final IA64FloatRegister F32;
public static final IA64FloatRegister F33;
public static final IA64FloatRegister F34;
public static final IA64FloatRegister F35;
public static final IA64FloatRegister F36;
public static final IA64FloatRegister F37;
public static final IA64FloatRegister F38;
public static final IA64FloatRegister F39;
public static final IA64FloatRegister F40;
public static final IA64FloatRegister F41;
public static final IA64FloatRegister F42;
public static final IA64FloatRegister F43;
public static final IA64FloatRegister F44;
public static final IA64FloatRegister F45;
public static final IA64FloatRegister F46;
public static final IA64FloatRegister F47;
public static final IA64FloatRegister F48;
public static final IA64FloatRegister F49;
public static final IA64FloatRegister F50;
public static final IA64FloatRegister F51;
public static final IA64FloatRegister F52;
public static final IA64FloatRegister F53;
public static final IA64FloatRegister F54;
public static final IA64FloatRegister F55;
public static final IA64FloatRegister F56;
public static final IA64FloatRegister F57;
public static final IA64FloatRegister F58;
public static final IA64FloatRegister F59;
public static final IA64FloatRegister F60;
public static final IA64FloatRegister F61;
public static final IA64FloatRegister F62;
public static final IA64FloatRegister F63;
public static final IA64FloatRegister F64;
public static final IA64FloatRegister F65;
public static final IA64FloatRegister F66;
public static final IA64FloatRegister F67;
public static final IA64FloatRegister F68;
public static final IA64FloatRegister F69;
public static final IA64FloatRegister F70;
public static final IA64FloatRegister F71;
public static final IA64FloatRegister F72;
public static final IA64FloatRegister F73;
public static final IA64FloatRegister F74;
public static final IA64FloatRegister F75;
public static final IA64FloatRegister F76;
public static final IA64FloatRegister F77;
public static final IA64FloatRegister F78;
public static final IA64FloatRegister F79;
public static final IA64FloatRegister F80;
public static final IA64FloatRegister F81;
public static final IA64FloatRegister F82;
public static final IA64FloatRegister F83;
public static final IA64FloatRegister F84;
public static final IA64FloatRegister F85;
public static final IA64FloatRegister F86;
public static final IA64FloatRegister F87;
public static final IA64FloatRegister F88;
public static final IA64FloatRegister F89;
public static final IA64FloatRegister F90;
public static final IA64FloatRegister F91;
public static final IA64FloatRegister F92;
public static final IA64FloatRegister F93;
public static final IA64FloatRegister F94;
public static final IA64FloatRegister F95;
public static final IA64FloatRegister F96;
public static final IA64FloatRegister F97;
public static final IA64FloatRegister F98;
public static final IA64FloatRegister F99;
public static final IA64FloatRegister F100;
public static final IA64FloatRegister F101;
public static final IA64FloatRegister F102;
public static final IA64FloatRegister F103;
public static final IA64FloatRegister F104;
public static final IA64FloatRegister F105;
public static final IA64FloatRegister F106;
public static final IA64FloatRegister F107;
public static final IA64FloatRegister F108;
public static final IA64FloatRegister F109;
public static final IA64FloatRegister F110;
public static final IA64FloatRegister F111;
public static final IA64FloatRegister F112;
public static final IA64FloatRegister F113;
public static final IA64FloatRegister F114;
public static final IA64FloatRegister F115;
public static final IA64FloatRegister F116;
public static final IA64FloatRegister F117;
public static final IA64FloatRegister F118;
public static final IA64FloatRegister F119;
public static final IA64FloatRegister F120;
public static final IA64FloatRegister F121;
public static final IA64FloatRegister F122;
public static final IA64FloatRegister F123;
public static final IA64FloatRegister F124;
public static final IA64FloatRegister F125;
public static final IA64FloatRegister F126;
public static final IA64FloatRegister F127;
public static final int NUM_REGISTERS = 128;
private static final IA64FloatRegister registers[];
static {
F0 = new IA64FloatRegister(0);
F1 = new IA64FloatRegister(1);
F2 = new IA64FloatRegister(2);
F3 = new IA64FloatRegister(3);
F4 = new IA64FloatRegister(4);
F5 = new IA64FloatRegister(5);
F6 = new IA64FloatRegister(6);
F7 = new IA64FloatRegister(7);
F8 = new IA64FloatRegister(8);
F9 = new IA64FloatRegister(9);
F10 = new IA64FloatRegister(10);
F11 = new IA64FloatRegister(11);
F12 = new IA64FloatRegister(12);
F13 = new IA64FloatRegister(13);
F14 = new IA64FloatRegister(14);
F15 = new IA64FloatRegister(15);
F16 = new IA64FloatRegister(16);
F17 = new IA64FloatRegister(17);
F18 = new IA64FloatRegister(18);
F19 = new IA64FloatRegister(19);
F20 = new IA64FloatRegister(20);
F21 = new IA64FloatRegister(21);
F22 = new IA64FloatRegister(22);
F23 = new IA64FloatRegister(23);
F24 = new IA64FloatRegister(24);
F25 = new IA64FloatRegister(25);
F26 = new IA64FloatRegister(26);
F27 = new IA64FloatRegister(27);
F28 = new IA64FloatRegister(28);
F29 = new IA64FloatRegister(29);
F30 = new IA64FloatRegister(30);
F31 = new IA64FloatRegister(31);
F32 = new IA64FloatRegister(32);
F33 = new IA64FloatRegister(33);
F34 = new IA64FloatRegister(34);
F35 = new IA64FloatRegister(35);
F36 = new IA64FloatRegister(36);
F37 = new IA64FloatRegister(37);
F38 = new IA64FloatRegister(38);
F39 = new IA64FloatRegister(39);
F40 = new IA64FloatRegister(40);
F41 = new IA64FloatRegister(41);
F42 = new IA64FloatRegister(42);
F43 = new IA64FloatRegister(43);
F44 = new IA64FloatRegister(44);
F45 = new IA64FloatRegister(45);
F46 = new IA64FloatRegister(46);
F47 = new IA64FloatRegister(47);
F48 = new IA64FloatRegister(48);
F49 = new IA64FloatRegister(49);
F50 = new IA64FloatRegister(50);
F51 = new IA64FloatRegister(51);
F52 = new IA64FloatRegister(52);
F53 = new IA64FloatRegister(53);
F54 = new IA64FloatRegister(54);
F55 = new IA64FloatRegister(55);
F56 = new IA64FloatRegister(56);
F57 = new IA64FloatRegister(57);
F58 = new IA64FloatRegister(58);
F59 = new IA64FloatRegister(59);
F60 = new IA64FloatRegister(60);
F61 = new IA64FloatRegister(61);
F62 = new IA64FloatRegister(62);
F63 = new IA64FloatRegister(63);
F64 = new IA64FloatRegister(64);
F65 = new IA64FloatRegister(65);
F66 = new IA64FloatRegister(66);
F67 = new IA64FloatRegister(67);
F68 = new IA64FloatRegister(68);
F69 = new IA64FloatRegister(69);
F70 = new IA64FloatRegister(70);
F71 = new IA64FloatRegister(71);
F72 = new IA64FloatRegister(72);
F73 = new IA64FloatRegister(73);
F74 = new IA64FloatRegister(74);
F75 = new IA64FloatRegister(75);
F76 = new IA64FloatRegister(76);
F77 = new IA64FloatRegister(77);
F78 = new IA64FloatRegister(78);
F79 = new IA64FloatRegister(79);
F80 = new IA64FloatRegister(80);
F81 = new IA64FloatRegister(81);
F82 = new IA64FloatRegister(82);
F83 = new IA64FloatRegister(83);
F84 = new IA64FloatRegister(84);
F85 = new IA64FloatRegister(85);
F86 = new IA64FloatRegister(86);
F87 = new IA64FloatRegister(87);
F88 = new IA64FloatRegister(88);
F89 = new IA64FloatRegister(89);
F90 = new IA64FloatRegister(90);
F91 = new IA64FloatRegister(91);
F92 = new IA64FloatRegister(92);
F93 = new IA64FloatRegister(93);
F94 = new IA64FloatRegister(94);
F95 = new IA64FloatRegister(95);
F96 = new IA64FloatRegister(96);
F97 = new IA64FloatRegister(97);
F98 = new IA64FloatRegister(98);
F99 = new IA64FloatRegister(99);
F100 = new IA64FloatRegister(100);
F101 = new IA64FloatRegister(101);
F102 = new IA64FloatRegister(102);
F103 = new IA64FloatRegister(103);
F104 = new IA64FloatRegister(104);
F105 = new IA64FloatRegister(105);
F106 = new IA64FloatRegister(106);
F107 = new IA64FloatRegister(107);
F108 = new IA64FloatRegister(108);
F109 = new IA64FloatRegister(109);
F110 = new IA64FloatRegister(110);
F111 = new IA64FloatRegister(111);
F112 = new IA64FloatRegister(112);
F113 = new IA64FloatRegister(113);
F114 = new IA64FloatRegister(114);
F115 = new IA64FloatRegister(115);
F116 = new IA64FloatRegister(116);
F117 = new IA64FloatRegister(117);
F118 = new IA64FloatRegister(118);
F119 = new IA64FloatRegister(119);
F120 = new IA64FloatRegister(120);
F121 = new IA64FloatRegister(121);
F122 = new IA64FloatRegister(122);
F123 = new IA64FloatRegister(123);
F124 = new IA64FloatRegister(124);
F125 = new IA64FloatRegister(125);
F126 = new IA64FloatRegister(126);
F127 = new IA64FloatRegister(127);
registers = (new IA64FloatRegister[] {
F0, F1, F2, F3, F4, F5, F6, F7, F8, F9,
F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
F20, F21, F22, F23, F24, F25, F26, F27, F28, F29,
F30, F31, F32, F33, F34, F35, F36, F37, F38, F39,
F40, F41, F42, F43, F44, F45, F46, F47, F48, F49,
F50, F51, F52, F53, F54, F55, F56, F57, F58, F59,
F60, F61, F62, F63, F64, F65, F66, F67, F68, F69,
F70, F71, F72, F73, F74, F75, F76, F77, F78, F79,
F80, F81, F82, F83, F84, F85, F86, F87, F88, F89,
F90, F91, F92, F93, F94, F95, F96, F97, F98, F99,
F100, F101, F102, F103, F104, F105, F106, F107, F108, F109,
F110, F111, F112, F113, F114, F115, F116, F117, F118, F119,
F120, F121, F122, F123, F124, F125, F126, F127
});
}
}

@ -1,54 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.ia64;
import sun.jvm.hotspot.asm.*;
public class IA64Helper implements CPUHelper {
public Disassembler createDisassembler(long startPc, byte[] code) {
// FIXME: IA64 disassembler not implemented
return null;
}
public Register getIntegerRegister(int num) {
// FIXME: IA64 disassembler not implemented
return null;
}
public Register getFloatRegister(int num) {
// FIXME: IA64 disassembler not implemented
return null;
}
public Register getStackPointer() {
// FIXME: IA64 disassembler not implemented
return null;
}
public Register getFramePointer() {
// FIXME: IA64 disassembler not implemented
return null;
}
}

@ -1,76 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.ia64;
import sun.jvm.hotspot.asm.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.utilities.*;
public class IA64Register extends Register {
//
private static final int STACKED_BASE = 32;
private static final int STACKED_END = 127;
// We put application registers here too rather than separate types
private static final int APPL_BASE = 128;
private static final int nofRegisters = 129; // total number of registers
/** Constructor for an explicitly numbered register */
public IA64Register(int number) {
super(number);
}
public int getNumberOfRegisters() {
return nofRegisters;
}
public boolean isStacked() {
return (32 <= getNumber());
}
/** NOTE: this returns an offset in BYTES in this system! */
public long spOffsetInSavedWindow() {
return 0;
}
public String toString() {
return IA64Registers.getRegisterName(number);
}
public boolean isFramePointer() {
return number == APPL_BASE;
}
public boolean isStackPointer() {
return number == 12;
}
public boolean isFloat() {
return false;
}
}

@ -1,353 +0,0 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.ia64;
import sun.jvm.hotspot.utilities.*;
public class IA64Registers {
public static final IA64Register GR0;
public static final IA64Register GR1;
public static final IA64Register GR2;
public static final IA64Register GR3;
public static final IA64Register GR4;
public static final IA64Register GR5;
public static final IA64Register GR6;
public static final IA64Register GR7;
public static final IA64Register GR8;
public static final IA64Register GR9;
public static final IA64Register GR10;
public static final IA64Register GR11;
public static final IA64Register GR12;
public static final IA64Register GR13;
public static final IA64Register GR14;
public static final IA64Register GR15;
public static final IA64Register GR16;
public static final IA64Register GR17;
public static final IA64Register GR18;
public static final IA64Register GR19;
public static final IA64Register GR20;
public static final IA64Register GR21;
public static final IA64Register GR22;
public static final IA64Register GR23;
public static final IA64Register GR24;
public static final IA64Register GR25;
public static final IA64Register GR26;
public static final IA64Register GR27;
public static final IA64Register GR28;
public static final IA64Register GR29;
public static final IA64Register GR30;
public static final IA64Register GR31;
public static final IA64Register GR32;
public static final IA64Register GR33;
public static final IA64Register GR34;
public static final IA64Register GR35;
public static final IA64Register GR36;
public static final IA64Register GR37;
public static final IA64Register GR38;
public static final IA64Register GR39;
public static final IA64Register GR40;
public static final IA64Register GR41;
public static final IA64Register GR42;
public static final IA64Register GR43;
public static final IA64Register GR44;
public static final IA64Register GR45;
public static final IA64Register GR46;
public static final IA64Register GR47;
public static final IA64Register GR48;
public static final IA64Register GR49;
public static final IA64Register GR50;
public static final IA64Register GR51;
public static final IA64Register GR52;
public static final IA64Register GR53;
public static final IA64Register GR54;
public static final IA64Register GR55;
public static final IA64Register GR56;
public static final IA64Register GR57;
public static final IA64Register GR58;
public static final IA64Register GR59;
public static final IA64Register GR60;
public static final IA64Register GR61;
public static final IA64Register GR62;
public static final IA64Register GR63;
public static final IA64Register GR64;
public static final IA64Register GR65;
public static final IA64Register GR66;
public static final IA64Register GR67;
public static final IA64Register GR68;
public static final IA64Register GR69;
public static final IA64Register GR70;
public static final IA64Register GR71;
public static final IA64Register GR72;
public static final IA64Register GR73;
public static final IA64Register GR74;
public static final IA64Register GR75;
public static final IA64Register GR76;
public static final IA64Register GR77;
public static final IA64Register GR78;
public static final IA64Register GR79;
public static final IA64Register GR80;
public static final IA64Register GR81;
public static final IA64Register GR82;
public static final IA64Register GR83;
public static final IA64Register GR84;
public static final IA64Register GR85;
public static final IA64Register GR86;
public static final IA64Register GR87;
public static final IA64Register GR88;
public static final IA64Register GR89;
public static final IA64Register GR90;
public static final IA64Register GR91;
public static final IA64Register GR92;
public static final IA64Register GR93;
public static final IA64Register GR94;
public static final IA64Register GR95;
public static final IA64Register GR96;
public static final IA64Register GR97;
public static final IA64Register GR98;
public static final IA64Register GR99;
public static final IA64Register GR100;
public static final IA64Register GR101;
public static final IA64Register GR102;
public static final IA64Register GR103;
public static final IA64Register GR104;
public static final IA64Register GR105;
public static final IA64Register GR106;
public static final IA64Register GR107;
public static final IA64Register GR108;
public static final IA64Register GR109;
public static final IA64Register GR110;
public static final IA64Register GR111;
public static final IA64Register GR112;
public static final IA64Register GR113;
public static final IA64Register GR114;
public static final IA64Register GR115;
public static final IA64Register GR116;
public static final IA64Register GR117;
public static final IA64Register GR118;
public static final IA64Register GR119;
public static final IA64Register GR120;
public static final IA64Register GR121;
public static final IA64Register GR122;
public static final IA64Register GR123;
public static final IA64Register GR124;
public static final IA64Register GR125;
public static final IA64Register GR126;
public static final IA64Register GR127;
public static final IA64Register AR_BSP;
public static final int NUM_REGISTERS = 129;
private static final IA64Register registers[];
static {
GR0 = new IA64Register(0);
GR1 = new IA64Register(1);
GR2 = new IA64Register(2);
GR3 = new IA64Register(3);
GR4 = new IA64Register(4);
GR5 = new IA64Register(5);
GR6 = new IA64Register(6);
GR7 = new IA64Register(7);
GR8 = new IA64Register(8);
GR9 = new IA64Register(9);
GR10 = new IA64Register(10);
GR11 = new IA64Register(11);
GR12 = new IA64Register(12);
GR13 = new IA64Register(13);
GR14 = new IA64Register(14);
GR15 = new IA64Register(15);
GR16 = new IA64Register(16);
GR17 = new IA64Register(17);
GR18 = new IA64Register(18);
GR19 = new IA64Register(19);
GR20 = new IA64Register(20);
GR21 = new IA64Register(21);
GR22 = new IA64Register(22);
GR23 = new IA64Register(23);
GR24 = new IA64Register(24);
GR25 = new IA64Register(25);
GR26 = new IA64Register(26);
GR27 = new IA64Register(27);
GR28 = new IA64Register(28);
GR29 = new IA64Register(29);
GR30 = new IA64Register(30);
GR31 = new IA64Register(31);
GR32 = new IA64Register(32);
GR33 = new IA64Register(33);
GR34 = new IA64Register(34);
GR35 = new IA64Register(35);
GR36 = new IA64Register(36);
GR37 = new IA64Register(37);
GR38 = new IA64Register(38);
GR39 = new IA64Register(39);
GR40 = new IA64Register(40);
GR41 = new IA64Register(41);
GR42 = new IA64Register(42);
GR43 = new IA64Register(43);
GR44 = new IA64Register(44);
GR45 = new IA64Register(45);
GR46 = new IA64Register(46);
GR47 = new IA64Register(47);
GR48 = new IA64Register(48);
GR49 = new IA64Register(49);
GR50 = new IA64Register(50);
GR51 = new IA64Register(51);
GR52 = new IA64Register(52);
GR53 = new IA64Register(53);
GR54 = new IA64Register(54);
GR55 = new IA64Register(55);
GR56 = new IA64Register(56);
GR57 = new IA64Register(57);
GR58 = new IA64Register(58);
GR59 = new IA64Register(59);
GR60 = new IA64Register(60);
GR61 = new IA64Register(61);
GR62 = new IA64Register(62);
GR63 = new IA64Register(63);
GR64 = new IA64Register(64);
GR65 = new IA64Register(65);
GR66 = new IA64Register(66);
GR67 = new IA64Register(67);
GR68 = new IA64Register(68);
GR69 = new IA64Register(69);
GR70 = new IA64Register(70);
GR71 = new IA64Register(71);
GR72 = new IA64Register(72);
GR73 = new IA64Register(73);
GR74 = new IA64Register(74);
GR75 = new IA64Register(75);
GR76 = new IA64Register(76);
GR77 = new IA64Register(77);
GR78 = new IA64Register(78);
GR79 = new IA64Register(79);
GR80 = new IA64Register(80);
GR81 = new IA64Register(81);
GR82 = new IA64Register(82);
GR83 = new IA64Register(83);
GR84 = new IA64Register(84);
GR85 = new IA64Register(85);
GR86 = new IA64Register(86);
GR87 = new IA64Register(87);
GR88 = new IA64Register(88);
GR89 = new IA64Register(89);
GR90 = new IA64Register(90);
GR91 = new IA64Register(91);
GR92 = new IA64Register(92);
GR93 = new IA64Register(93);
GR94 = new IA64Register(94);
GR95 = new IA64Register(95);
GR96 = new IA64Register(96);
GR97 = new IA64Register(97);
GR98 = new IA64Register(98);
GR99 = new IA64Register(99);
GR100 = new IA64Register(100);
GR101 = new IA64Register(101);
GR102 = new IA64Register(102);
GR103 = new IA64Register(103);
GR104 = new IA64Register(104);
GR105 = new IA64Register(105);
GR106 = new IA64Register(106);
GR107 = new IA64Register(107);
GR108 = new IA64Register(108);
GR109 = new IA64Register(109);
GR110 = new IA64Register(110);
GR111 = new IA64Register(111);
GR112 = new IA64Register(112);
GR113 = new IA64Register(113);
GR114 = new IA64Register(114);
GR115 = new IA64Register(115);
GR116 = new IA64Register(116);
GR117 = new IA64Register(117);
GR118 = new IA64Register(118);
GR119 = new IA64Register(119);
GR120 = new IA64Register(120);
GR121 = new IA64Register(121);
GR122 = new IA64Register(122);
GR123 = new IA64Register(123);
GR124 = new IA64Register(124);
GR125 = new IA64Register(125);
GR126 = new IA64Register(126);
GR127 = new IA64Register(127);
AR_BSP = new IA64Register(128);
registers = (new IA64Register[] {
GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7, GR8, GR9,
GR10, GR11, GR12, GR13, GR14, GR15, GR16, GR17, GR18, GR19,
GR20, GR21, GR22, GR23, GR24, GR25, GR26, GR27, GR28, GR29,
GR30, GR31, GR32, GR33, GR34, GR35, GR36, GR37, GR38, GR39,
GR40, GR41, GR42, GR43, GR44, GR45, GR46, GR47, GR48, GR49,
GR50, GR51, GR52, GR53, GR54, GR55, GR56, GR57, GR58, GR59,
GR60, GR61, GR62, GR63, GR64, GR65, GR66, GR67, GR68, GR69,
GR70, GR71, GR72, GR73, GR74, GR75, GR76, GR77, GR78, GR79,
GR80, GR81, GR82, GR83, GR84, GR85, GR86, GR87, GR88, GR89,
GR90, GR91, GR92, GR93, GR94, GR95, GR96, GR97, GR98, GR99,
GR100, GR101, GR102, GR103, GR104, GR105, GR106, GR107, GR108, GR109,
GR110, GR111, GR112, GR113, GR114, GR115, GR116, GR117, GR118, GR119,
GR120, GR121, GR122, GR123, GR124, GR125, GR126, GR127, AR_BSP
});
}
public static final IA64Register FP = AR_BSP;
public static final IA64Register SP = GR12;
/** Prefer to use this instead of the constant above */
public static int getNumRegisters() {
return NUM_REGISTERS;
}
public static String getRegisterName(int regNum) {
if (regNum < 0 || regNum >= NUM_REGISTERS) {
return "[Illegal register " + regNum + "]";
}
if (Assert.ASSERTS_ENABLED) {
Assert.that(regNum > -1 && regNum < NUM_REGISTERS, "invalid integer register number!");
}
if (regNum == 128 ) {
return "BSP";
}
if (regNum == 12) {
return "SP";
}
return "R" + regNum;
}
public static IA64Register getRegister(int regNum) {
if (Assert.ASSERTS_ENABLED) {
Assert.that(regNum > -1 && regNum < NUM_REGISTERS, "invalid register number!");
}
return registers[regNum];
}
}

@ -1,41 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class AlternateSpaceLdstubDecoder extends LdstubDecoder {
AlternateSpaceLdstubDecoder(int op3, String name, int dataType) {
super(op3, name, dataType);
}
Instruction decodeMemoryInstruction(int instruction,
SPARCRegisterIndirectAddress addr,
SPARCRegister rd,
SPARCInstructionFactory factory) {
setAddressSpace(instruction, addr);
return factory.newLdstubInstruction(name, addr, rd);
}
}

@ -1,41 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class AlternateSpaceLoadDecoder extends LoadDecoder {
AlternateSpaceLoadDecoder(int op3, String name, int dataType) {
super(op3, name, dataType);
}
Instruction decodeMemoryInstruction(int instruction,
SPARCRegisterIndirectAddress addr,
SPARCRegister rd,
SPARCInstructionFactory factory) {
setAddressSpace(instruction, addr);
return factory.newLoadInstruction(name, op3, addr, rd, dataType);
}
}

@ -1,41 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class AlternateSpaceStoreDecoder extends StoreDecoder {
AlternateSpaceStoreDecoder(int op3, String name, int dataType) {
super(op3, name, dataType);
}
protected Instruction decodeMemoryInstruction(int instruction,
SPARCRegisterIndirectAddress addr,
SPARCRegister rd,
SPARCInstructionFactory factory) {
setAddressSpace(instruction, addr);
return factory.newStoreInstruction(name, op3, addr, rd, dataType);
}
}

@ -1,41 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class AlternateSpaceSwapDecoder extends SwapDecoder {
AlternateSpaceSwapDecoder(int op3, String name, int dataType) {
super(op3, name, dataType);
}
Instruction decodeMemoryInstruction(int instruction,
SPARCRegisterIndirectAddress addr,
SPARCRegister rd,
SPARCInstructionFactory factory) {
setAddressSpace(instruction, addr);
return factory.newSwapInstruction(name, addr, rd);
}
}

@ -1,41 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class ArithmeticDecoder extends Format3ADecoder {
ArithmeticDecoder(int op3, String name, int rtlOperation) {
super(op3, name, rtlOperation);
}
Instruction decodeFormat3AInstruction(int instruction,
SPARCRegister rs1,
ImmediateOrRegister operand2,
SPARCRegister rd,
SPARCInstructionFactory factory) {
return factory.newArithmeticInstruction(name, op3, rtlOperation, rs1, operand2, rd);
}
}

@ -1,71 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
abstract class BranchDecoder extends InstructionDecoder {
// format 2 - condition code names.
// Appendix F - Opcodes and Condition Codes - Page 231 - Table F-7.
static final String integerConditionNames[] = {
"bn", "be", "ble", "bl", "bleu", "bcs", "bneg", "bvs",
"ba", "bne", "bg", "bge", "bgu", "bcc", "bpos", "bvc"
};
static final String integerAnnuledConditionNames[] = {
"bn,a", "be,a", "ble,a", "bl,a", "bleu,a", "bcs,a", "bneg,a", "bvs,a",
"ba,a", "bne,a", "bg,a", "bge,a", "bgu,a", "bcc,a", "bpos,a", "bvc,a"
};
// format 2 - condition code names.
// Appendix F - Opcodes and Condition Codes - Page 231 - Table F-7.
static final String floatConditionNames[] = {
"fbn", "fbne", "fblg", "fbul", "fbl", "fbug", "fbg", "fbu",
"fba", "fbe", "fbue", "fbge", "fbuge", "fble", "fbule", "fbo"
};
static final String floatAnnuledConditionNames[] = {
"fbn,a", "fbne,a", "fblg,a", "fbul,a", "fbl,a", "fbug,a", "fbg,a", "fbu,a",
"fba,a", "fbe,a", "fbue,a", "fbge,a", "fbuge,a", "fble,a", "fbule,a", "fbo,a"
};
static boolean getAnnuledBit(int instruction) {
return (instruction & ANNUL_MASK) != 0;
}
Instruction decode(int instruction, SPARCInstructionFactory factory) {
boolean isAnnuled = getAnnuledBit(instruction);
int conditionCode = getConditionCode(instruction);
String conditionName = getConditionName(conditionCode, isAnnuled);
int offset = extractSignedIntFromNBits(instruction, 22);
// word align the offset by right shifting 2 bits
offset <<= 2;
PCRelativeAddress addr = new PCRelativeAddress(offset);
return factory.newBranchInstruction(conditionName, addr, isAnnuled, conditionCode);
}
abstract String getConditionName(int conditionCode, boolean isAnnuled);
}

@ -1,35 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class CallDecoder extends InstructionDecoder {
Instruction decode(int instruction, SPARCInstructionFactory factory) {
// sign extend, word align the offset
int offset = (instruction & DISP_30_MASK) << 2;
return factory.newCallInstruction(new PCRelativeAddress(offset));
}
}

@ -1,45 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
// format 2 - condition code names.
// Appendix F - Opcodes and Condition Codes - Page 231 - Table F-7.
class CoprocessorBranchDecoder extends BranchDecoder {
private static final String coprocessorConditionNames[] = {
"cbn", "cb123", "cb12", "cb13", "cb1", "cb23", "cb2", "cb3",
"cba", "cb0", "cb03", "cb02", "cb023", "cb01", "cb013", "cb012"
};
private static final String coprocessorAnnuledConditionNames[] = {
"cbn,a", "cb123,a", "cb12,a", "cb13,a", "cb1,a", "cb23,a", "cb2,a", "cb3,a",
"cba,a", "cb0,a", "cb03,a", "cb02,a", "cb023,a", "cb01,a", "cb013,a", "cb012,a"
};
String getConditionName(int conditionCode, boolean isAnnuled) {
return isAnnuled ? coprocessorAnnuledConditionNames[conditionCode]
: coprocessorConditionNames[conditionCode];
}
}

@ -1,44 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class CoprocessorDecoder extends InstructionDecoder {
private int op3;
CoprocessorDecoder(int op3) {
this.op3 = op3;
}
Instruction decode(int instruction, SPARCInstructionFactory factory) {
int rs1Num = getSourceRegister1(instruction);
int rs2Num = getSourceRegister2(instruction);
int rdNum = getDestinationRegister(instruction);
return factory.newCoprocessorInstruction(instruction, op3,
(instruction & OPC_MASK) >> OPF_START_BIT,
rs1Num, rs2Num, rdNum);
}
}

@ -1,45 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
import sun.jvm.hotspot.utilities.Assert;
class FP2RegisterDecoder extends FloatDecoder {
FP2RegisterDecoder(int opf, String name, int srcType, int resultType) {
super(opf, name, srcType, resultType);
}
Instruction decodeFloatInstruction(int instruction,
SPARCRegister rs1, SPARCRegister rs2,
SPARCRegister rd,
SPARCInstructionFactory factory) {
if (Assert.ASSERTS_ENABLED)
Assert.that(rs2.isFloat() && rd.isFloat(), "rs2, rd have to be float registers");
return factory.newFP2RegisterInstruction(name, opf, (SPARCFloatRegister)rs2, (SPARCFloatRegister)rd);
}
}

@ -1,50 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
import sun.jvm.hotspot.utilities.Assert;
class FPArithmeticDecoder extends FloatDecoder {
private final int rtlOperation;
FPArithmeticDecoder(int opf, String name, int rtlOperation,
int src1Type, int src2Type, int resultType) {
super(opf, name, src1Type, src2Type, resultType);
this.rtlOperation = rtlOperation;
}
Instruction decodeFloatInstruction(int instruction,
SPARCRegister rs1, SPARCRegister rs2,
SPARCRegister rd,
SPARCInstructionFactory factory) {
if (Assert.ASSERTS_ENABLED)
Assert.that(rs1.isFloat() && rs2.isFloat() && rd.isFloat(), "rs1, rs2 and rd must be floats");
return factory.newFPArithmeticInstruction(name, opf, rtlOperation,
(SPARCFloatRegister)rs1,
(SPARCFloatRegister)rs2,
(SPARCFloatRegister)rd);
}
}

@ -1,45 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
import sun.jvm.hotspot.utilities.Assert;
class FPMoveDecoder extends FloatDecoder {
FPMoveDecoder(int opf, String name, int srcType, int resultType) {
super(opf, name, srcType, resultType);
}
Instruction decodeFloatInstruction(int instruction,
SPARCRegister rs1, SPARCRegister rs2,
SPARCRegister rd,
SPARCInstructionFactory factory) {
if (Assert.ASSERTS_ENABLED)
Assert.that(rs2.isFloat() && rd.isFloat(), "rs2, rd have to be float registers");
return factory.newFPMoveInstruction(name, opf, (SPARCFloatRegister)rs2, (SPARCFloatRegister)rd);
}
}

@ -1,38 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
abstract class FPopDecoder extends InstructionDecoder {
abstract InstructionDecoder getOpfDecoder(int opf);
Instruction decode(int instruction, SPARCInstructionFactory factory) {
int opf = getOpf(instruction);
InstructionDecoder decoder = getOpfDecoder(opf);
return (decoder == null) ? factory.newIllegalInstruction(instruction)
: decoder.decode(instruction, factory);
}
}

@ -1,32 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
class FloatBranchDecoder extends BranchDecoder {
String getConditionName(int conditionCode, boolean isAnnuled) {
return isAnnuled ? floatAnnuledConditionNames[conditionCode]
: floatConditionNames[conditionCode];
}
}

@ -1,80 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
abstract class FloatDecoder extends InstructionDecoder {
final int opf;
final String name;
final int numSources; // 1 or 2;
final int src1Type; // RTLDT_FL_SINGLE, _DOUBLE, _QUAD
final int src2Type; // RTLDT_FL_SINGLE, _DOUBLE, _QUAD
final int resultType; // RTLDT_FL_SINGLE, _DOUBLE, _QUAD
FloatDecoder(int opf, String name, int src1Type, int src2Type, int resultType) {
this.opf = opf;
this.name = name;
numSources = 2;
this.src1Type = src1Type;
this.src2Type = src2Type;
this.resultType = resultType;
}
FloatDecoder(int opf, String name, int src2Type, int resultType) {
this.opf = opf;
this.name = name;
numSources = 1;
this.src1Type = RTLOP_UNKNOWN;
this.src2Type = src2Type;
this.resultType = resultType;
}
abstract Instruction decodeFloatInstruction(int instruction,
SPARCRegister rs1, SPARCRegister rs2, SPARCRegister rd,
SPARCInstructionFactory factory);
Instruction decode(int instruction, SPARCInstructionFactory factory) {
int rs1Num = getSourceRegister1(instruction);
int rs2Num = getSourceRegister2(instruction);
int rdNum = getDestinationRegister(instruction);
SPARCRegister rs1 = null;
if (numSources == 2) {
rs1 = RegisterDecoder.decode(src1Type, rs1Num);
if (rs1 == null) {
return factory.newIllegalInstruction(instruction);
}
}
SPARCRegister rd = RegisterDecoder.decode(resultType, rdNum);
SPARCRegister rs2 = RegisterDecoder.decode(src2Type, rs2Num);
if (rd == null || rs2 == null) {
return factory.newIllegalInstruction(instruction);
}
return decodeFloatInstruction(instruction, rs1, rs2, rd, factory);
}
}

@ -1,38 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class FlushDecoder extends MemoryInstructionDecoder {
FlushDecoder() {
super(FLUSH, "flush", RTLDT_UNKNOWN);
}
Instruction decodeMemoryInstruction(int instruction, SPARCRegisterIndirectAddress addr,
SPARCRegister rd, SPARCInstructionFactory factory) {
return factory.newFlushInstruction(addr);
}
}

@ -1,53 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
abstract class Format3ADecoder extends InstructionDecoder
implements /* imports */ RTLOperations {
final int op3;
final String name;
final int rtlOperation;
Format3ADecoder(int op3, String name, int rtlOperation) {
this.op3 = op3;
this.name = name;
this.rtlOperation = rtlOperation;
}
Instruction decode(int instruction, SPARCInstructionFactory factory) {
SPARCRegister rs1 = SPARCRegisters.getRegister(getSourceRegister1(instruction));
SPARCRegister rd = SPARCRegisters.getRegister(getDestinationRegister(instruction));
ImmediateOrRegister operand2 = getOperand2(instruction);
return decodeFormat3AInstruction(instruction, rs1, operand2, rd, factory);
}
abstract Instruction decodeFormat3AInstruction(int instruction,
SPARCRegister rs1,
ImmediateOrRegister operand2,
SPARCRegister rd,
SPARCInstructionFactory factory);
}

@ -1,33 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class IllegalInstructionDecoder extends InstructionDecoder {
Instruction decode(int instruction, SPARCInstructionFactory factory) {
return factory.newIllegalInstruction(instruction);
}
}

@ -1,80 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
// basic instruction decoder class
abstract class InstructionDecoder implements /* imports */ SPARCOpcodes , RTLDataTypes, RTLOperations {
// some general utility functions - for format 2, 3 & 3A instructions
static int extractSignedIntFromNBits(int value, int num_bits) {
return (value << (32 - num_bits)) >> (32 - num_bits);
}
// "rs1"
static int getSourceRegister1(int instruction) {
return (instruction & RS1_MASK) >>> RS1_START_BIT;
}
// "rs2"
static int getSourceRegister2(int instruction) {
return (instruction & RS2_MASK);
}
// "rd"
static int getDestinationRegister(int instruction) {
return (instruction & RD_MASK) >>> RD_START_BIT;
}
static int getConditionCode(int instruction) {
return (instruction & CONDITION_CODE_MASK) >>> CONDITION_CODE_START_BIT;
}
// "i" bit - used to indicate whether second component in an indirect
// address is immediate value or a register. (format 3 & 3A).
static boolean isIBitSet(int instruction) {
return (instruction & I_MASK) != 0;
}
static ImmediateOrRegister getOperand2(int instruction) {
boolean iBit = isIBitSet(instruction);
ImmediateOrRegister operand2 = null;
if (iBit) {
operand2 = new Immediate(new Short((short)extractSignedIntFromNBits(instruction, 13)));
} else {
operand2 = SPARCRegisters.getRegister(getSourceRegister2(instruction));
}
return operand2;
}
// "opf" - floating point operation code.
static int getOpf(int instruction) {
return (instruction & OPF_MASK) >>> OPF_START_BIT;
}
abstract Instruction decode(int instruction, SPARCInstructionFactory factory);
}

@ -1,32 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
class IntegerBranchDecoder extends BranchDecoder {
String getConditionName(int conditionCode, boolean isAnnuled) {
return isAnnuled ? integerAnnuledConditionNames[conditionCode]
: integerConditionNames[conditionCode];
}
}

@ -1,55 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class JmplDecoder extends MemoryInstructionDecoder {
JmplDecoder() {
super(JMPL, "jmpl", RTLDT_UNSIGNED_WORD);
}
Instruction decodeMemoryInstruction(int instruction, SPARCRegisterIndirectAddress addr,
SPARCRegister rd, SPARCInstructionFactory factory) {
// this may be most probably indirect call or ret or retl
Instruction instr = null;
if (rd == SPARCRegisters.O7) {
instr = factory.newIndirectCallInstruction(addr, rd);
} else if (rd == SPARCRegisters.G0) {
int disp = (int) addr.getDisplacement();
Register base = addr.getBase();
if (base == SPARCRegisters.I7 && disp == 8) {
instr = factory.newReturnInstruction(addr, rd, false /* not leaf */);
} else if (base == SPARCRegisters.O7 && disp == 8) {
instr = factory.newReturnInstruction(addr, rd, true /* leaf */);
} else {
instr = factory.newJmplInstruction(addr, rd);
}
} else {
instr = factory.newJmplInstruction(addr, rd);
}
return instr;
}
}

@ -1,40 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class LdstubDecoder extends MemoryInstructionDecoder {
LdstubDecoder(int op3, String name, int dataType) {
super(op3, name, dataType);
}
Instruction decodeMemoryInstruction(int instruction,
SPARCRegisterIndirectAddress addr,
SPARCRegister rd,
SPARCInstructionFactory factory) {
return factory.newLdstubInstruction(name, addr, rd);
}
}

@ -1,40 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class LoadDecoder extends MemoryInstructionDecoder {
LoadDecoder(int op3, String name, int dataType) {
super(op3, name, dataType);
}
Instruction decodeMemoryInstruction(int instruction,
SPARCRegisterIndirectAddress addr,
SPARCRegister rd,
SPARCInstructionFactory factory) {
return factory.newLoadInstruction(name, op3, addr, rd, dataType);
}
}

@ -1,47 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class LogicDecoder extends Format3ADecoder {
LogicDecoder(int op3, String name, int rtlOperation) {
super(op3, name, rtlOperation);
}
Instruction decodeFormat3AInstruction(int instruction,
SPARCRegister rs1,
ImmediateOrRegister operand2,
SPARCRegister rd,
SPARCInstructionFactory factory) {
Instruction instr = null;
if (op3 == OR && rs1 == SPARCRegisters.G0 && rd != SPARCRegisters.G0) {
instr = factory.newMoveInstruction(name, op3, operand2, rd);
} else {
instr = factory.newLogicInstruction(name, op3, rtlOperation, rs1, operand2, rd);
}
return instr;
}
}

@ -1,86 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
abstract class MemoryInstructionDecoder extends InstructionDecoder {
final int op3;
final String name;
final int dataType;
SPARCRegisterIndirectAddress newRegisterIndirectAddress(SPARCRegister rs1, SPARCRegister rs2) {
return new SPARCRegisterIndirectAddress(rs1, rs2);
}
SPARCRegisterIndirectAddress newRegisterIndirectAddress(SPARCRegister rs1, int offset) {
return new SPARCRegisterIndirectAddress(rs1, offset);
}
static void setAddressSpace(int instruction, SPARCRegisterIndirectAddress addr) {
int asi = (instruction & ASI_MASK) >>> ASI_START_BIT;
addr.setAddressSpace(asi);
}
SPARCRegisterIndirectAddress getRegisterIndirectAddress(int instruction) {
SPARCRegister rs1 = SPARCRegisters.getRegister(getSourceRegister1(instruction));
boolean iBit = isIBitSet(instruction);
SPARCRegisterIndirectAddress addr = null;
if (iBit) {
int simm13 = extractSignedIntFromNBits(instruction, 13);
addr = newRegisterIndirectAddress(rs1,simm13);
} else {
SPARCRegister rs2 = SPARCRegisters.getRegister(getSourceRegister2(instruction));
addr = newRegisterIndirectAddress(rs1,rs2);
}
return addr;
}
MemoryInstructionDecoder(int op3, String name, int dataType) {
this.op3 = op3;
this.name = name;
this.dataType = dataType;
}
Instruction decode(int instruction, SPARCInstructionFactory factory) {
SPARCRegisterIndirectAddress addr = getRegisterIndirectAddress(instruction);
SPARCRegister rd = getDestination(instruction);
boolean isV9Okay = (factory instanceof SPARCV9InstructionFactory);
if ( (rd == null) || (! isV9Okay && rd.isV9Only()) )
return factory.newIllegalInstruction(instruction);
return decodeMemoryInstruction(instruction, addr, rd, factory);
}
SPARCRegister getDestination(int instruction) {
int rdNum = getDestinationRegister(instruction);
SPARCRegister rd = RegisterDecoder.decode(dataType, rdNum);
return rd;
}
abstract Instruction decodeMemoryInstruction(int instruction,
SPARCRegisterIndirectAddress addr,
SPARCRegister rd, SPARCInstructionFactory factory);
}

@ -1,48 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class ReadDecoder extends ReadWriteDecoder {
ReadDecoder(int specialRegNum) {
super(specialRegNum);
}
Instruction decodeReadWrite(int instruction, SPARCInstructionFactory factory,
int rs1Num, int rdNum) {
Instruction instr = null;
int specialReg = specialRegNum;
if (rs1Num == 0)
specialReg = SPARCSpecialRegisters.Y;
if (rs1Num == 15 && rdNum == 0) {
instr = factory.newStbarInstruction();
} else {
instr = factory.newReadInstruction(specialReg, rs1Num,
SPARCRegisters.getRegister(rdNum));
}
return instr;
}
}

@ -1,46 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
abstract class ReadWriteDecoder extends InstructionDecoder {
final int specialRegNum;
abstract Instruction decodeReadWrite(int instruction,
SPARCInstructionFactory factory,
int rs1Num, int rdNum);
ReadWriteDecoder(int specialRegNum) {
this.specialRegNum = specialRegNum;
}
Instruction decode(int instruction, SPARCInstructionFactory factory) {
Instruction instr = null;
int rs1Num = getSourceRegister1(instruction);
int rdNum = getDestinationRegister(instruction);
return decodeReadWrite(instruction, factory, rs1Num, rdNum);
}
}

@ -1,85 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.RTLDataTypes;
class RegisterDecoder implements /* imports */ RTLDataTypes {
// refer to page 40 - section 5.1.4.1 - Floating-point Register Number Encoding
private static SPARCFloatRegister decodeDouble(int num) {
// 6 bit double precision registers are encoded in 5 bits as
// b<4> b<3> b<2> b<1> b<5>.
boolean lsb = (0x1 & num) != 0;
if (lsb)
num |= 0x20; // 10000b
if ((num % 2) != 0)
return null;
return SPARCFloatRegisters.getRegister(num);
}
private static SPARCFloatRegister decodeQuad(int num) {
// 6 bit quad precision registers are encoded in 5 bits as
// b<4> b<3> b<2> 0 b<5>
boolean lsb = (0x1 & num) != 0;
if (lsb)
num |= 0x20; // 10000b
if ((num % 4) != 0)
return null;
return SPARCFloatRegisters.getRegister(num);
}
static SPARCRegister decode(int dataType, int regNum) {
regNum &= 0x1F; // mask out all but lsb 5 bits
SPARCRegister result = null;
switch (dataType) {
case RTLDT_FL_SINGLE:
result = SPARCFloatRegisters.getRegister(regNum);
break;
case RTLDT_FL_DOUBLE:
result = decodeDouble(regNum);
break;
case RTLDT_FL_QUAD:
result = decodeQuad(regNum);
break;
case RTLDT_UNKNOWN:
result = null;
break;
default: // some integer register
result = SPARCRegisters.getRegister(regNum);
break;
}
return result;
}
}

@ -1,41 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class RestoreDecoder extends Format3ADecoder {
RestoreDecoder() {
super(RESTORE, "restore", RTLOP_UNKNOWN);
}
Instruction decodeFormat3AInstruction(int instruction,
SPARCRegister rs1,
ImmediateOrRegister operand2,
SPARCRegister rd,
SPARCInstructionFactory factory) {
return factory.newRestoreInstruction(rs1, operand2, rd);
}
}

@ -1,38 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
class RettDecoder extends MemoryInstructionDecoder {
RettDecoder() {
super(RETT, "rett", RTLDT_UNKNOWN);
}
Instruction decodeMemoryInstruction(int instruction, SPARCRegisterIndirectAddress addr,
SPARCRegister rd, SPARCInstructionFactory factory) {
return factory.newRettInstruction(addr);
}
}

@ -1,103 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCArithmeticInstruction extends SPARCFormat3AInstruction
implements ArithmeticInstruction {
final private int operation;
public SPARCArithmeticInstruction(String name, int opcode, int operation, SPARCRegister rs1,
ImmediateOrRegister operand2, SPARCRegister rd) {
super(name, opcode, rs1, operand2, rd);
this.operation = operation;
}
protected String getDescription() {
if (rd == rs1 && operand2.isImmediate()) {
int value = ((Immediate)operand2).getNumber().intValue();
StringBuffer buf = new StringBuffer();
switch (opcode) {
case ADD:
buf.append("inc");
break;
case ADDcc:
buf.append("inccc");
break;
case SUB:
buf.append("dec");
break;
case SUBcc:
buf.append("deccc");
break;
default:
return super.getDescription();
}
buf.append(spaces);
if (value != 1) {
buf.append(getOperand2String()); buf.append(comma);
}
buf.append(rd.toString());
return buf.toString();
} else if (rd == SPARCRegisters.G0 && opcode == SUBcc) {
StringBuffer buf = new StringBuffer();
buf.append("cmp");
buf.append(spaces);
buf.append(rs1.toString());
buf.append(comma);
buf.append(getOperand2String());
return buf.toString();
} else if (rs1 == SPARCRegisters.G0 && opcode == SUB && operand2.isRegister()) {
StringBuffer buf = new StringBuffer();
buf.append("neg");
buf.append(spaces);
buf.append(operand2.toString());
if (operand2 != rd) {
buf.append(comma);
buf.append(rd.toString());
}
return buf.toString();
}
return super.getDescription();
}
public Operand getArithmeticDestination() {
return getDestinationRegister();
}
public Operand[] getArithmeticSources() {
return (new Operand[] { rs1, operand2 });
}
public int getOperation() {
return operation;
}
public boolean isArithmetic() {
return true;
}
}

@ -1,81 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public abstract class SPARCAtomicLoadStoreInstruction extends SPARCInstruction
implements LoadInstruction, StoreInstruction {
final protected SPARCRegisterIndirectAddress addr;
final protected SPARCRegister rd;
final protected Register[] regs = new Register[1];
final protected String description;
public SPARCAtomicLoadStoreInstruction(String name, SPARCRegisterIndirectAddress addr, SPARCRegister rd) {
super(name);
this.addr = addr;
this.rd = rd;
regs[0] = rd;
description = initDescription();
}
private String initDescription() {
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(addr.toString());
buf.append(comma);
buf.append(rd.toString());
return buf.toString();
}
public Address getLoadSource() {
return addr;
}
public Address getStoreDestination() {
return addr;
}
public Register[] getLoadDestinations() {
return regs;
}
public Register[] getStoreSources() {
return regs;
}
public boolean isLoad() {
return true;
}
public boolean isStore() {
return true;
}
public String asString(long currentPc, SymbolFinder symFinder) {
return description;
}
}

@ -1,70 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCBranchInstruction extends SPARCInstruction
implements BranchInstruction {
final protected PCRelativeAddress addr;
final protected int conditionCode;
final protected boolean isAnnuled;
public SPARCBranchInstruction(String name, PCRelativeAddress addr, boolean isAnnuled, int conditionCode) {
super(name);
this.addr = addr;
this.conditionCode = conditionCode;
this.isAnnuled = isAnnuled;
}
public String asString(long currentPc, SymbolFinder symFinder) {
long address = addr.getDisplacement() + currentPc;
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(symFinder.getSymbolFor(address));
return buf.toString();
}
public Address getBranchDestination() {
return addr;
}
public int getConditionCode() {
return conditionCode;
}
public boolean isAnnuledBranch() {
return isAnnuled;
}
public boolean isBranch() {
return true;
}
public boolean isConditional() {
return conditionCode != CONDITION_BN && conditionCode != CONDITION_BA;
}
}

@ -1,58 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCCallInstruction extends SPARCInstruction
implements CallInstruction {
final private PCRelativeAddress addr;
public SPARCCallInstruction(PCRelativeAddress addr) {
super("call");
this.addr = addr;
}
public String asString(long currentPc, SymbolFinder symFinder) {
long address = addr.getDisplacement() + currentPc;
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(symFinder.getSymbolFor(address));
return buf.toString();
}
public Address getBranchDestination() {
return addr;
}
public boolean isCall() {
return true;
}
public boolean isConditional() {
return false;
}
}

@ -1,144 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
import java.io.*;
import java.util.*;
public abstract class SPARCDisassembler extends Disassembler
implements /* imports */ SPARCOpcodes, RTLDataTypes, RTLOperations {
// instruction cache - Map<Integer, Instruction>.
protected static Map instructionCache = new HashMap();
protected final SPARCInstructionFactory factory;
public SPARCDisassembler(long startPc, byte[] code, SPARCInstructionFactory factory) {
super(startPc, code);
this.factory = factory;
}
protected static InstructionDecoder illegalDecoder = new IllegalInstructionDecoder();
protected static InstructionDecoder callDecoder = new CallDecoder();
// direct call instruction
protected Instruction decodeFormat1Instruction(int instruction) {
return callDecoder.decode(instruction, factory);
}
protected abstract InstructionDecoder getFormat2Decoder(int op2);
protected Instruction decodeFormat2Instruction(int instruction) {
int op2 = (instruction & OP_2_MASK) >>> OP_2_START_BIT;
InstructionDecoder decoder = getFormat2Decoder(op2);
return decoder.decode(instruction, factory);
}
// "op3" - used in format 3 & 3A instructions - 6 bits width
protected static int getOp3(int instruction) {
return (instruction & OP_3_MASK) >>> OP_3_START_BIT;
}
// op3 opcodes is broken up into column and row. MSB 2 bits form column.
// LSB 4 bits form row number.
protected static int getOp3Row(int op3) {
return op3 & 0xF;
}
protected static int getOp3Column(int op3) {
return (op3 >>> 4) & 0x3;
}
protected abstract InstructionDecoder getFormat3Decoder(int row, int column);
// memory instructions
protected Instruction decodeFormat3Instruction(int instruction) {
int op3 = getOp3(instruction);
int row = getOp3Row(op3);
int column = getOp3Column(op3);
return getFormat3Decoder(row, column).decode(instruction, factory);
}
protected abstract InstructionDecoder getFormat3ADecoder(int row, int column);
// arithmetic, logic, shift and the rest
protected Instruction decodeFormat3AInstruction(int instruction) {
int op3 = getOp3(instruction);
int row = getOp3Row(op3);
int column = getOp3Column(op3);
return getFormat3ADecoder(row, column).decode(instruction, factory);
}
public void decode(InstructionVisitor visitor) {
visitor.prologue();
try {
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(code));
int instruction = -1;
int format = -1;
Instruction instr = null;
int len = 0;
while (len < code.length) {
instr = null;
instruction = dis.readInt();
// check whether we have this in cache.
instr = (Instruction) instructionCache.get(new Integer(instruction));
if (instr == null) {
format = (instruction & FORMAT_MASK) >>> FORMAT_START_BIT;
switch (format) {
case FORMAT_2: // 0
instr = decodeFormat2Instruction(instruction);
break;
case FORMAT_1: // 1
instr = decodeFormat1Instruction(instruction);
break;
case FORMAT_3A: // 2
instr = decodeFormat3AInstruction(instruction);
break;
case FORMAT_3: // 3
instr = decodeFormat3Instruction(instruction);
break;
}
// add the new instruction to cache.
instructionCache.put(new Integer(instruction), instr);
}
visitor.visit(startPc + len, instr);
len += 4;
}
} catch (IOException ioExp) {
// ignore, can't happen
} finally {
visitor.epilogue();
}
}
}

@ -1,59 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCFP2RegisterInstruction extends SPARCInstruction {
final SPARCFloatRegister rs;
final SPARCFloatRegister rd;
final int opf;
public SPARCFP2RegisterInstruction(String name, int opf, SPARCFloatRegister rs, SPARCFloatRegister rd) {
super(name);
this.rs = rs;
this.rd = rd;
this.opf = opf;
}
public String asString(long currentPc, SymbolFinder symFinder) {
return getDescription();
}
protected String getDescription() {
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(rs.toString());
buf.append(comma);
buf.append(rd.toString());
return buf.toString();
}
public boolean isFloat() {
return true;
}
}

@ -1,69 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCFPArithmeticInstruction extends SPARCFormat3AInstruction
implements ArithmeticInstruction {
final private SPARCRegister rs2;
final private int rtlOperation;
public SPARCFPArithmeticInstruction(String name, int opcode, int rtlOperation,
SPARCRegister rs1, SPARCRegister rs2,
SPARCRegister rd) {
super(name, opcode, rs1, rs2, rd);
this.rs2 = rs2;
this.rtlOperation = rtlOperation;
}
protected String getDescription() {
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(rs1.toString());
buf.append(comma);
buf.append(rs2.toString());
buf.append(comma);
buf.append(rd.toString());
return buf.toString();
}
public int getOperation() {
return rtlOperation;
}
public Operand[] getArithmeticSources() {
return new Operand[] { rs1, rs2 };
}
public Operand getArithmeticDestination() {
return rd;
}
public boolean isFloat() {
return true;
}
}

@ -1,55 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCFPMoveInstruction extends SPARCFP2RegisterInstruction
implements MoveInstruction {
public SPARCFPMoveInstruction(String name, int opf, SPARCFloatRegister rs, SPARCFloatRegister rd) {
super(name, opf, rs, rd);
}
public Register getMoveDestination() {
return rd;
}
public ImmediateOrRegister getMoveSource() {
return rs;
}
public int getMoveOpcode() {
return opf;
}
public boolean isConditional() {
return false;
}
public boolean isMove() {
return true;
}
}

@ -1,90 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.Register;
import sun.jvm.hotspot.utilities.Assert;
public class SPARCFloatRegister extends SPARCRegister {
public SPARCFloatRegister(int number) {
super(number);
}
public int getNumber() {
return number;
}
public static final int SINGLE_PRECISION = 1;
public static final int DOUBLE_PRECISION = 2;
public static final int QUAD_PRECISION = 3;
public int getNumber(int width) {
switch (width) {
case SINGLE_PRECISION:
Assert.that(number < 32, "bad single-prec fp register");
return number;
case DOUBLE_PRECISION:
Assert.that(number < 64 && (number & 1) == 0, "bad double-prec fp register");
return number & 0x1e | (number & 0x20) >> 5;
case QUAD_PRECISION:
Assert.that(number < 64 && (number & 3) == 0, "bad quad-prec fp register");
return number & 0x1c | (number & 0x20) >> 5;
}
throw new RuntimeException("Invalid floating point width supplied");
}
private static final int nofRegisters = 63;
public int getNumberOfRegisters() {
return nofRegisters;
}
public boolean isFloat() {
return true;
}
public boolean isFramePointer() {
return false;
}
public boolean isStackPointer() {
return false;
}
public boolean isV9Only() {
return number > 31;
}
public boolean isValid() {
return number >= 0 && number < nofRegisters;
}
public String toString() {
return SPARCFloatRegisters.getRegisterName(number);
}
}

@ -1,153 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.utilities.Assert;
public class SPARCFloatRegisters {
public static int getNumRegisters() {
return 64;
}
public static SPARCFloatRegister getRegister(int i) {
Assert.that(i >= 0 && i < 64, "float register number is invalid");
return registers[i];
}
public static String getRegisterName(int i) {
return "%f" + i;
}
public static final SPARCFloatRegister F0;
public static final SPARCFloatRegister F1;
public static final SPARCFloatRegister F2;
public static final SPARCFloatRegister F3;
public static final SPARCFloatRegister F4;
public static final SPARCFloatRegister F5;
public static final SPARCFloatRegister F6;
public static final SPARCFloatRegister F7;
public static final SPARCFloatRegister F8;
public static final SPARCFloatRegister F9;
public static final SPARCFloatRegister F10;
public static final SPARCFloatRegister F11;
public static final SPARCFloatRegister F12;
public static final SPARCFloatRegister F13;
public static final SPARCFloatRegister F14;
public static final SPARCFloatRegister F15;
public static final SPARCFloatRegister F16;
public static final SPARCFloatRegister F17;
public static final SPARCFloatRegister F18;
public static final SPARCFloatRegister F19;
public static final SPARCFloatRegister F20;
public static final SPARCFloatRegister F21;
public static final SPARCFloatRegister F22;
public static final SPARCFloatRegister F23;
public static final SPARCFloatRegister F24;
public static final SPARCFloatRegister F25;
public static final SPARCFloatRegister F26;
public static final SPARCFloatRegister F27;
public static final SPARCFloatRegister F28;
public static final SPARCFloatRegister F29;
public static final SPARCFloatRegister F30;
public static final SPARCFloatRegister F31;
public static final SPARCFloatRegister F32;
public static final SPARCFloatRegister F34;
public static final SPARCFloatRegister F36;
public static final SPARCFloatRegister F38;
public static final SPARCFloatRegister F40;
public static final SPARCFloatRegister F42;
public static final SPARCFloatRegister F44;
public static final SPARCFloatRegister F46;
public static final SPARCFloatRegister F48;
public static final SPARCFloatRegister F50;
public static final SPARCFloatRegister F52;
public static final SPARCFloatRegister F54;
public static final SPARCFloatRegister F56;
public static final SPARCFloatRegister F58;
public static final SPARCFloatRegister F60;
public static final SPARCFloatRegister F62;
public static final int NUM_REGISTERS = 64;
private static final SPARCFloatRegister registers[];
static {
F0 = new SPARCFloatRegister(0);
F1 = new SPARCFloatRegister(1);
F2 = new SPARCFloatRegister(2);
F3 = new SPARCFloatRegister(3);
F4 = new SPARCFloatRegister(4);
F5 = new SPARCFloatRegister(5);
F6 = new SPARCFloatRegister(6);
F7 = new SPARCFloatRegister(7);
F8 = new SPARCFloatRegister(8);
F9 = new SPARCFloatRegister(9);
F10 = new SPARCFloatRegister(10);
F11 = new SPARCFloatRegister(11);
F12 = new SPARCFloatRegister(12);
F13 = new SPARCFloatRegister(13);
F14 = new SPARCFloatRegister(14);
F15 = new SPARCFloatRegister(15);
F16 = new SPARCFloatRegister(16);
F17 = new SPARCFloatRegister(17);
F18 = new SPARCFloatRegister(18);
F19 = new SPARCFloatRegister(19);
F20 = new SPARCFloatRegister(20);
F21 = new SPARCFloatRegister(21);
F22 = new SPARCFloatRegister(22);
F23 = new SPARCFloatRegister(23);
F24 = new SPARCFloatRegister(24);
F25 = new SPARCFloatRegister(25);
F26 = new SPARCFloatRegister(26);
F27 = new SPARCFloatRegister(27);
F28 = new SPARCFloatRegister(28);
F29 = new SPARCFloatRegister(29);
F30 = new SPARCFloatRegister(30);
F31 = new SPARCFloatRegister(31);
F32 = new SPARCFloatRegister(32);
F34 = new SPARCFloatRegister(34);
F36 = new SPARCFloatRegister(36);
F38 = new SPARCFloatRegister(38);
F40 = new SPARCFloatRegister(40);
F42 = new SPARCFloatRegister(42);
F44 = new SPARCFloatRegister(44);
F46 = new SPARCFloatRegister(46);
F48 = new SPARCFloatRegister(48);
F50 = new SPARCFloatRegister(50);
F52 = new SPARCFloatRegister(52);
F54 = new SPARCFloatRegister(54);
F56 = new SPARCFloatRegister(56);
F58 = new SPARCFloatRegister(58);
F60 = new SPARCFloatRegister(60);
F62 = new SPARCFloatRegister(62);
registers = (new SPARCFloatRegister[] {
F0, F2, F3, F4, F5, F6, F7, F8, F9, F10,
F11, F12, F13, F14, F15, F16, F17, F18, F19, F20,
F21, F22, F23, F24, F25, F26, F27, F28, F29, F30,
F31, F32, null, F34, null, F36, null, F38, null, F40,
null, F42, null, F44, null, F46, null, F48, null, F50,
null, F52, null, F54, null, F56, null, F58, null, F60,
null, F62, null
});
}
}

@ -1,50 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCFlushInstruction extends SPARCInstruction {
final protected SPARCRegisterIndirectAddress addr;
final String description;
public SPARCFlushInstruction(SPARCRegisterIndirectAddress addr) {
super("flush");
this.addr = addr;
description = initDescription();
}
private String initDescription() {
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(addr.toString());
return buf.toString();
}
public String asString(long currentPc, SymbolFinder symFinder) {
return description;
}
}

@ -1,87 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public abstract class SPARCFormat3AInstruction extends SPARCInstruction {
final protected int opcode;
final protected SPARCRegister rs1;
final protected ImmediateOrRegister operand2;
final protected SPARCRegister rd;
public SPARCFormat3AInstruction(String name, int opcode, SPARCRegister rs1,
ImmediateOrRegister operand2, SPARCRegister rd) {
super(name);
this.opcode = opcode;
this.rs1 = rs1;
this.operand2 = operand2;
this.rd = rd;
}
protected String getOperand2String() {
StringBuffer buf = new StringBuffer();
if (operand2.isRegister()) {
buf.append(operand2.toString());
} else {
Number number = ((Immediate)operand2).getNumber();
buf.append("0x");
buf.append(Integer.toHexString(number.intValue()));
}
return buf.toString();
}
protected String getDescription() {
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(rs1.toString());
buf.append(comma);
buf.append(getOperand2String());
buf.append(comma);
buf.append(rd.toString());
return buf.toString();
}
public String asString(long currentPc, SymbolFinder symFinder) {
return getDescription();
}
public int getOpcode() {
return opcode;
}
public SPARCRegister getDestinationRegister() {
return rd;
}
public ImmediateOrRegister getOperand2() {
return operand2;
}
public SPARCRegister getSourceRegister1() {
return rs1;
}
}

@ -1,49 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCHelper implements CPUHelper {
public Disassembler createDisassembler(long startPc, byte[] code) {
return new SPARCV9Disassembler(startPc, code);
}
public Register getIntegerRegister(int num) {
return SPARCRegisters.getRegister(num);
}
public Register getFloatRegister(int num) {
return SPARCFloatRegisters.getRegister(num);
}
public Register getStackPointer() {
return SPARCRegisters.O7;
}
public Register getFramePointer() {
return SPARCRegisters.I7;
}
}

@ -1,50 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.SymbolFinder;
public final class SPARCIllegalInstruction extends SPARCInstruction {
final private int instruction;
final private String description;
public SPARCIllegalInstruction(int instruction) {
super("illegal");
this.instruction = instruction;
description = "bad opcode - " + Integer.toHexString(instruction);
}
public String asString(long currentPc, SymbolFinder symFinder) {
return description;
}
public int getInstruction() {
return instruction;
}
public boolean isIllegal() {
return true;
}
}

@ -1,45 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCIndirectCallInstruction extends SPARCJmplInstruction
implements CallInstruction {
public SPARCIndirectCallInstruction(SPARCRegisterIndirectAddress addr, SPARCRegister rd) {
super("call", addr, rd);
}
protected String getDescription() {
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
// remove '[' & ']' from jmp address
String addrStr = addr.toString();
buf.append(addrStr.substring(1, addrStr.length() - 1));
return buf.toString();
}
}

@ -1,42 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public abstract class SPARCInstruction
extends AbstractInstruction
implements /* imports */ SPARCOpcodes {
public SPARCInstruction(String name) {
super(name);
}
public int getSize() {
return 4;
}
protected static String comma = ", ";
protected static String spaces = "\t";
}

@ -1,110 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public interface SPARCInstructionFactory {
public SPARCInstruction newCallInstruction(PCRelativeAddress addr);
public SPARCInstruction newNoopInstruction();
public SPARCInstruction newSethiInstruction(int imm22, SPARCRegister rd);
public SPARCInstruction newUnimpInstruction(int const22);
public SPARCInstruction newBranchInstruction(String name, PCRelativeAddress addr, boolean isAnnuled, int conditionCode);
public SPARCInstruction newSpecialLoadInstruction(String name, int specialReg, int cregNum,
SPARCRegisterIndirectAddress addr);
public SPARCInstruction newSpecialStoreInstruction(String name, int specialReg, int cregNum,
SPARCRegisterIndirectAddress addr);
public SPARCInstruction newLoadInstruction(String name, int opcode,
SPARCRegisterIndirectAddress addr, SPARCRegister rd,
int dataType);
public SPARCInstruction newStoreInstruction(String name, int opcode,
SPARCRegisterIndirectAddress addr, SPARCRegister rd,
int dataType);
public SPARCInstruction newStbarInstruction();
public SPARCInstruction newReadInstruction(int specialReg, int asrRegNum, SPARCRegister rd);
public SPARCInstruction newWriteInstruction(int specialReg, int asrRegNum, SPARCRegister rs1,
ImmediateOrRegister operand2);
public SPARCInstruction newIllegalInstruction(int instruction);
public SPARCInstruction newIndirectCallInstruction(SPARCRegisterIndirectAddress addr,
SPARCRegister rd);
public SPARCInstruction newReturnInstruction(SPARCRegisterIndirectAddress addr,
SPARCRegister rd, boolean isLeaf);
public SPARCInstruction newJmplInstruction(SPARCRegisterIndirectAddress addr,
SPARCRegister rd);
public SPARCInstruction newFP2RegisterInstruction(String name, int opf, SPARCFloatRegister rs, SPARCFloatRegister rd);
public SPARCInstruction newFPMoveInstruction(String name, int opf, SPARCFloatRegister rs, SPARCFloatRegister rd);
public SPARCInstruction newFPArithmeticInstruction(String name, int opf, int rtlOperation,
SPARCFloatRegister rs1, SPARCFloatRegister rs2,
SPARCFloatRegister rd);
public SPARCInstruction newFlushInstruction(SPARCRegisterIndirectAddress addr);
public SPARCInstruction newSaveInstruction(SPARCRegister rs1, ImmediateOrRegister operand2, SPARCRegister rd);
public SPARCInstruction newRestoreInstruction(SPARCRegister rs1, ImmediateOrRegister operand2, SPARCRegister rd);
public SPARCInstruction newTrapInstruction(String name, int conditionCode);
public SPARCInstruction newRettInstruction(SPARCRegisterIndirectAddress addr);
public SPARCInstruction newArithmeticInstruction(String name, int opcode, int rtlOperation,
SPARCRegister rs1, ImmediateOrRegister operand2,
SPARCRegister rd);
public SPARCInstruction newLogicInstruction(String name, int opcode, int rtlOperation,
SPARCRegister rs1, ImmediateOrRegister operand2,
SPARCRegister rd);
public SPARCInstruction newMoveInstruction(String name, int opcode,
ImmediateOrRegister operand2,
SPARCRegister rd);
public SPARCInstruction newShiftInstruction(String name, int opcode, int rtlOperation,
SPARCRegister rs1, ImmediateOrRegister operand2,
SPARCRegister rd);
public SPARCInstruction newCoprocessorInstruction(int instruction, int cpopcode, int opc,
int rs1Num, int rs2Num, int rdNum);
public SPARCInstruction newSwapInstruction(String name, SPARCRegisterIndirectAddress addr, SPARCRegister rd);
public SPARCInstruction newLdstubInstruction(String name, SPARCRegisterIndirectAddress addr, SPARCRegister rd);
}

@ -1,176 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCInstructionFactoryImpl implements SPARCInstructionFactory {
public SPARCInstruction newCallInstruction(PCRelativeAddress addr) {
return new SPARCCallInstruction(addr);
}
public SPARCInstruction newNoopInstruction() {
return new SPARCNoopInstruction();
}
public SPARCInstruction newSethiInstruction(int imm22, SPARCRegister rd) {
return new SPARCSethiInstruction(imm22, rd);
}
public SPARCInstruction newUnimpInstruction(int const22) {
return new SPARCUnimpInstruction(const22);
}
public SPARCInstruction newBranchInstruction(String name, PCRelativeAddress addr, boolean isAnnuled, int conditionCode) {
return new SPARCBranchInstruction(name, addr, isAnnuled, conditionCode);
}
public SPARCInstruction newSpecialLoadInstruction(String name, int specialReg, int cregNum,
SPARCRegisterIndirectAddress addr) {
return new SPARCSpecialLoadInstruction(name, specialReg, cregNum, addr);
}
public SPARCInstruction newSpecialStoreInstruction(String name, int specialReg, int cregNum,
SPARCRegisterIndirectAddress addr) {
return new SPARCSpecialStoreInstruction(name, specialReg, cregNum, addr);
}
public SPARCInstruction newLoadInstruction(String name, int opcode,
SPARCRegisterIndirectAddress addr, SPARCRegister rd,
int dataType) {
return new SPARCLoadInstruction(name, opcode, addr, rd, dataType);
}
public SPARCInstruction newStoreInstruction(String name, int opcode,
SPARCRegisterIndirectAddress addr, SPARCRegister rd,
int dataType) {
return new SPARCStoreInstruction(name, opcode, addr, rd, dataType);
}
public SPARCInstruction newStbarInstruction() {
return new SPARCStbarInstruction();
}
public SPARCInstruction newReadInstruction(int specialReg, int asrRegNum, SPARCRegister rd) {
return new SPARCReadInstruction(specialReg, asrRegNum, rd);
}
public SPARCInstruction newWriteInstruction(int specialReg, int asrRegNum, SPARCRegister rs1,
ImmediateOrRegister operand2) {
return new SPARCWriteInstruction(specialReg, asrRegNum, rs1,operand2);
}
public SPARCInstruction newIllegalInstruction(int instruction) {
return new SPARCIllegalInstruction(instruction);
}
public SPARCInstruction newIndirectCallInstruction(SPARCRegisterIndirectAddress addr,
SPARCRegister rd) {
return new SPARCIndirectCallInstruction(addr, rd);
}
public SPARCInstruction newReturnInstruction(SPARCRegisterIndirectAddress addr,
SPARCRegister rd, boolean isLeaf) {
return new SPARCReturnInstruction(addr, rd, isLeaf);
}
public SPARCInstruction newJmplInstruction(SPARCRegisterIndirectAddress addr,
SPARCRegister rd) {
return new SPARCJmplInstruction(addr, rd);
}
public SPARCInstruction newFPArithmeticInstruction(String name, int opf, int rtlOperation,
SPARCFloatRegister rs1, SPARCFloatRegister rs2,
SPARCFloatRegister rd) {
return new SPARCFPArithmeticInstruction(name, opf, rtlOperation, rs1, rs2, rd);
}
public SPARCInstruction newFPMoveInstruction(String name, int opf, SPARCFloatRegister rs, SPARCFloatRegister rd) {
return new SPARCFPMoveInstruction(name, opf, rs, rd);
}
public SPARCInstruction newFP2RegisterInstruction(String name, int opf, SPARCFloatRegister rs, SPARCFloatRegister rd) {
return new SPARCFP2RegisterInstruction(name, opf, rs, rd);
}
public SPARCInstruction newFlushInstruction(SPARCRegisterIndirectAddress addr) {
return new SPARCFlushInstruction(addr);
}
public SPARCInstruction newSaveInstruction(SPARCRegister rs1, ImmediateOrRegister operand2, SPARCRegister rd) {
return new SPARCSaveInstruction(rs1, operand2, rd);
}
public SPARCInstruction newRestoreInstruction(SPARCRegister rs1, ImmediateOrRegister operand2, SPARCRegister rd) {
return new SPARCRestoreInstruction(rs1, operand2, rd);
}
public SPARCInstruction newTrapInstruction(String name, int conditionCode) {
return new SPARCTrapInstruction(name, conditionCode);
}
public SPARCInstruction newRettInstruction(SPARCRegisterIndirectAddress addr) {
return new SPARCRettInstruction(addr);
}
public SPARCInstruction newArithmeticInstruction(String name, int opcode, int rtlOperation,
SPARCRegister rs1, ImmediateOrRegister operand2,
SPARCRegister rd) {
return new SPARCArithmeticInstruction(name, opcode, rtlOperation, rs1, operand2, rd);
}
public SPARCInstruction newLogicInstruction(String name, int opcode, int rtlOperation,
SPARCRegister rs1, ImmediateOrRegister operand2,
SPARCRegister rd) {
return new SPARCLogicInstruction(name, opcode, rtlOperation, rs1, operand2, rd);
}
public SPARCInstruction newMoveInstruction(String name, int opcode,
ImmediateOrRegister operand2,
SPARCRegister rd) {
return new SPARCMoveInstruction(name, opcode, operand2, rd);
}
public SPARCInstruction newShiftInstruction(String name, int opcode, int rtlOperation,
SPARCRegister rs1, ImmediateOrRegister operand2,
SPARCRegister rd) {
return new SPARCShiftInstruction(name, opcode, rtlOperation, rs1, operand2, rd);
}
public SPARCInstruction newCoprocessorInstruction(int instruction, int cpopcode, int opcode,
int rs1Num, int rs2Num, int rd) {
return new SPARCIllegalInstruction(instruction);
}
public SPARCInstruction newSwapInstruction(String name, SPARCRegisterIndirectAddress addr, SPARCRegister rd) {
return new SPARCSwapInstruction(name, addr, rd);
}
public SPARCInstruction newLdstubInstruction(String name, SPARCRegisterIndirectAddress addr, SPARCRegister rd) {
return new SPARCLdstubInstruction(name, addr, rd);
}
}

@ -1,87 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCJmplInstruction extends SPARCInstruction
implements BranchInstruction {
final protected SPARCRegisterIndirectAddress addr;
final protected SPARCRegister rd;
protected SPARCJmplInstruction(String name, SPARCRegisterIndirectAddress addr, SPARCRegister rd) {
super(name);
this.addr = addr;
this.rd = rd;
}
public SPARCJmplInstruction(SPARCRegisterIndirectAddress addr, SPARCRegister rd) {
this("jmpl", addr, rd);
}
protected String getDescription() {
StringBuffer buf = new StringBuffer();
String addrStr = addr.toString();
// remove '[' & ']' from address
addrStr = addrStr.substring(1, addrStr.length() - 1);
if (rd == SPARCRegisters.G0) {
buf.append("jmp");
buf.append(spaces);
buf.append(addrStr);
} else {
buf.append(getName());
buf.append(spaces);
buf.append(addrStr);
buf.append(comma);
buf.append(rd.toString());
}
return buf.toString();
}
public String asString(long currentPc, SymbolFinder symFinder) {
return getDescription();
}
public Address getBranchDestination() {
return addr;
}
public SPARCRegister getReturnAddressRegister() {
return rd;
}
public boolean isAnnuledBranch() {
return false;
}
public boolean isBranch() {
return true;
}
public boolean isConditional() {
return false;
}
}

@ -1,41 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCLdstubInstruction extends SPARCAtomicLoadStoreInstruction {
public SPARCLdstubInstruction(String name, SPARCRegisterIndirectAddress addr, SPARCRegister rd) {
super(name, addr, rd);
}
public int getDataType() {
return RTLDT_UNSIGNED_BYTE;
}
public boolean isConditional() {
return false;
}
}

@ -1,70 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCLoadInstruction extends SPARCMemoryInstruction
implements LoadInstruction {
final protected SPARCRegister register2; // used for double word load instructions
final protected Register[] loadDestinations;
public SPARCLoadInstruction(String name, int opcode, SPARCRegisterIndirectAddress address, SPARCRegister register, int dataType) {
super(name, opcode,address, register, dataType);
if (opcode == LDD || opcode == LDDA) {
int nextRegNum = (register.getNumber() + 1) % SPARCRegisters.NUM_REGISTERS;
register2 = SPARCRegisters.getRegister(nextRegNum);
loadDestinations = new Register[2];
loadDestinations[0] = register;
loadDestinations[1] = register2;
} else {
register2 = null;
loadDestinations = new Register[1];
loadDestinations[0] = register;
}
}
protected String getDescription() {
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(address.toString());
buf.append(comma);
buf.append(register.toString());
return buf.toString();
}
public Register[] getLoadDestinations() {
return loadDestinations;
}
public Address getLoadSource() {
return address;
}
public boolean isLoad() {
return true;
}
}

@ -1,105 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCLogicInstruction extends SPARCFormat3AInstruction
implements LogicInstruction {
final private int operation;
public SPARCLogicInstruction(String name, int opcode, int operation, SPARCRegister rs1,
ImmediateOrRegister operand2, SPARCRegister rd) {
super(name, opcode, rs1, operand2, rd);
this.operation = operation;
}
protected String getDescription() {
SPARCRegister G0 = SPARCRegisters.G0;
if (opcode == ORcc && rd == G0 && rd == operand2) {
StringBuffer buf = new StringBuffer();
buf.append("tst");
buf.append(spaces);
buf.append(getOperand2String());
return buf.toString();
} else if (opcode == XNOR && G0 == operand2) {
StringBuffer buf = new StringBuffer();
buf.append("not");
buf.append(spaces);
buf.append(rs1.toString());
if (rs1 != rd) {
buf.append(comma);
buf.append(rd.toString());
}
return buf.toString();
} else if (opcode == ANDcc && rd == G0) {
StringBuffer buf = new StringBuffer();
buf.append("btst");
buf.append(spaces);
buf.append(getOperand2String());
buf.append(comma);
buf.append(rd.toString());
return buf.toString();
} else if (rs1 == rd) {
StringBuffer buf = new StringBuffer();
switch (opcode) {
case OR:
buf.append("bset");
break;
case ANDN:
buf.append("bclr");
break;
case XOR:
buf.append("btog");
break;
default:
return super.getDescription();
}
buf.append(spaces);
buf.append(getOperand2String());
buf.append(comma);
buf.append(rd.toString());
return buf.toString();
} else {
return super.getDescription();
}
}
public Operand getLogicDestination() {
return getDestinationRegister();
}
public Operand[] getLogicSources() {
return (new Operand[] { rs1, operand2 });
}
public int getOperation() {
return operation;
}
public boolean isLogic() {
return true;
}
}

@ -1,70 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.MemoryInstruction;
import sun.jvm.hotspot.asm.SymbolFinder;
public abstract class SPARCMemoryInstruction extends SPARCInstruction
implements MemoryInstruction {
final protected SPARCRegisterIndirectAddress address;
final protected SPARCRegister register;
final protected int dataType;
final protected int opcode;
public SPARCMemoryInstruction(String name, int opcode, SPARCRegisterIndirectAddress address, SPARCRegister register, int dataType) {
super(name);
this.address = address;
this.register = register;
this.dataType = dataType;
this.opcode = opcode;
}
protected String getDescription() {
StringBuffer buf = new StringBuffer();
buf.append(getName());
buf.append(spaces);
buf.append(address.toString());
buf.append(comma);
buf.append(register.toString());
return buf.toString();
}
public String asString(long currentPc, SymbolFinder symFinder) {
return getDescription();
}
public int getDataType() {
return dataType;
}
public boolean isConditional() {
return false;
}
public int getOpcode() {
return opcode;
}
}

@ -1,68 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCMoveInstruction extends SPARCFormat3AInstruction
implements MoveInstruction, RTLOperations {
public SPARCMoveInstruction(String name, int opcode, ImmediateOrRegister operand2, SPARCRegister rd) {
super(name, opcode, null, operand2, rd);
}
protected String getDescription() {
StringBuffer buf = new StringBuffer();
if (operand2 == SPARCRegisters.G0) {
buf.append("clr");
buf.append(spaces);
buf.append(rd.toString());
} else {
buf.append("mov");
buf.append(spaces);
buf.append(getOperand2String());
buf.append(comma);
buf.append(rd.toString());
}
return buf.toString();
}
public Register getMoveDestination() {
return getDestinationRegister();
}
public ImmediateOrRegister getMoveSource() {
return operand2;
}
public boolean isConditional() {
return false;
}
public boolean isMove() {
return true;
}
}

@ -1,37 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
public class SPARCNoopInstruction extends SPARCInstruction {
public SPARCNoopInstruction() {
super("nop");
}
public boolean isNoop() {
return true;
}
}

@ -1,354 +0,0 @@
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.sparc;
import sun.jvm.hotspot.asm.*;
// Please refer to "The SPARC Architecture Manual - Version 8"
public interface SPARCOpcodes {
// format type is coded in 2 bits - primary opcode - "op"
public static final int FORMAT_START_BIT = 30;
public static final int FORMAT_MASK = 3 << FORMAT_START_BIT;
// sparc instruction formats
// PC Relative CALL
public static final int FORMAT_1 = 1;
// Bicc, FBfcc, CBccc, SETHI
public static final int FORMAT_2 = 0;
// memory instructions
public static final int FORMAT_3 = 3;
// arithmetic, logical, shift and remaining
public static final int FORMAT_3A = 2;
// disp 30 - used in pc relative call
public static final int DISP_30_MASK = 0x3FFFFFFF;
// secondary opcode "op2" used in FORMAT_2 instructions - 3 bits.
public static final int OP_2_START_BIT = 22;
public static final int OP_2_MASK = 7 << OP_2_START_BIT;
// various "op2" masks
public static final int OP_2_UNIMP = 0;
public static final int OP_2_Bicc = 2;
public static final int OP_2_SETHI = 4;
public static final int OP_2_FBfcc = 6;
public static final int OP_2_CBccc = 7;
// condition codes are encoded in 4 bits.
public static final int CONDITION_CODE_START_BIT = 25;
public static final int CONDITION_CODE_MASK = 0xF << CONDITION_CODE_START_BIT;
// branch condition codes
public static final int CONDITION_BN = 0;
public static final int CONDITION_FBN = CONDITION_BN;
public static final int CONDITION_CBN = CONDITION_BN;
public static final int CONDITION_TN = CONDITION_BN;
public static final int CONDITION_BE = 1;
public static final int CONDITION_FBNE = CONDITION_BE;
public static final int CONDITION_CB123= CONDITION_BE;
public static final int CONDITION_TE = CONDITION_BE;
public static final int CONDITION_BLE = 2;
public static final int CONDITION_FBLG = CONDITION_BLE;
public static final int CONDITION_CB12 = CONDITION_BLE;
public static final int CONDITION_TLE = CONDITION_BLE;
public static final int CONDITION_BL = 3;
public static final int CONDITION_FBUL = CONDITION_BL;
public static final int CONDITION_CB13 = CONDITION_BL;
public static final int CONDITION_TL = CONDITION_BL;
public static final int CONDITION_BLEU = 4;
public static final int CONDITION_FBL = CONDITION_BLEU;
public static final int CONDITION_CB1 = CONDITION_BLEU;
public static final int CONDITION_TLEU = CONDITION_BLEU;
public static final int CONDITION_BCS = 5;
public static final int CONDITION_FBUG = CONDITION_BCS;
public static final int CONDITION_CB23 = CONDITION_BCS;
public static final int CONDITION_TCS = CONDITION_BCS;
public static final int CONDITION_BNEG = 6;
public static final int CONDITION_FBG = CONDITION_BNEG;
public static final int CONDITION_CB2 = CONDITION_BNEG;
public static final int CONDITION_TNEG = CONDITION_BNEG;
public static final int CONDITION_BVS = 7;
public static final int CONDITION_FBU = CONDITION_BVS;
public static final int CONDITION_CB3 = CONDITION_BVS;
public static final int CONDITION_TVS = CONDITION_BVS;
public static final int CONDITION_BA = 8;
public static final int CONDITION_FBA = CONDITION_BA;
public static final int CONDITION_CBA = CONDITION_BA;
public static final int CONDITION_TA = CONDITION_BA;
public static final int CONDITION_BNE = 9;
public static final int CONDITION_FBE = CONDITION_BNE;
public static final int CONDITION_CB0 = CONDITION_BNE;
public static final int CONDITION_TNE = CONDITION_BNE;
public static final int CONDITION_BG = 0xA;
public static final int CONDITION_FBUE = CONDITION_BG;
public static final int CONDITION_CB03 = CONDITION_BG;
public static final int CONDITION_TG = CONDITION_BG;
public static final int CONDITION_BGE = 0xB;
public static final int CONDITION_FBGE = CONDITION_BGE;
public static final int CONDITION_CB02 = CONDITION_BGE;
public static final int CONDITION_TGE = CONDITION_BGE;
public static final int CONDITION_BGU = 0xC;
public static final int CONDITION_FBUGE= CONDITION_BGU;
public static final int CONDITION_CB023= CONDITION_BGU;
public static final int CONDITION_TGU = CONDITION_BGU;
public static final int CONDITION_BCC = 0xD;
public static final int CONDITION_FBLE = CONDITION_BCC;
public static final int CONDITION_CB01 = CONDITION_BCC;
public static final int CONDITION_TCC = CONDITION_BCC;
public static final int CONDITION_BPOS = 0xE;
public static final int CONDITION_FBULE= CONDITION_BPOS;
public static final int CONDITION_CB013= CONDITION_BPOS;
public static final int CONDITION_TPOS = CONDITION_BPOS;
public static final int CONDITION_BVC = 0xF;
public static final int CONDITION_FBO = CONDITION_BVC;
public static final int CONDITION_CB012= CONDITION_BVC;
public static final int CONDITION_TVC = CONDITION_BVC;
// annul bit mask
public static final int ANNUL_MASK = 1 << 29;
// 22 bit displacement or immediate value - used in FORMAT_2 instructions.
public static final int DISP_22_MASK = 0x3FFFFF;
public static final int IMM_22_MASK = DISP_22_MASK;
// second operand mask, called "i" bit
public static final int I_START_BIT = 13;
public static final int I_MASK = 1 << I_START_BIT;
// address space identifier - "asi" - 8 bits
public static final int ASI_START_BIT = 5;
public static final int ASI_MASK = 0xFF << ASI_START_BIT;
// signed immediate value 13 bits - "simm13"
public static final int SIMM_13_MASK = 0x1FFF;
// co-processor or floating point opcode field - "ocf/opf" - 9 bits
public static final int OPF_START_BIT = 5;
public static final int OPF_MASK = 0x1FF << OPF_START_BIT;
public static final int OPC_MASK = OPF_MASK;
// opcode part 3 - used in FORMAT_3 and FORMAT_3A instructions
// "op3" - 6 bits
public static final int OP_3_START_BIT = 19;
public static final int OP_3_MASK = 0x3F << OP_3_START_BIT;
// register masks
public static final int RD_START_BIT = 25;
public static final int RD_MASK = 0x1F << RD_START_BIT; // "rd"
public static final int RS1_START_BIT = 14;
public static final int RS1_MASK = 0x1F << RS1_START_BIT; // "rs1"
public static final int RS2_MASK = 0x1F; // "rs2"
// load/store instructions - op3 values - used with op=3 (FORMAT_3)
public static final int LD = 0;
public static final int LDA = (1 << 4);
public static final int LDF = (2 << 4);
public static final int LDC = (3 << 4);
public static final int LDUB = 1;
public static final int LDUBA = (1 << 4) | 1;
public static final int LDFSR = (2 << 4) | 1;
public static final int LDCSR = (3 << 4) | 1;
public static final int LDUH = 2;
public static final int LDUHA = (1 << 4) | 2;
public static final int LDD = 3;
public static final int LDDA = (1 << 4) | 3;
public static final int LDDF = (2 << 4) | 3;
public static final int LDDC = (3 << 4) | 3;
public static final int ST = 4;
public static final int STA = (1 << 4) | 4;
public static final int STF = (2 << 4) | 4;
public static final int STC = (3 << 4) | 4;
public static final int STB = 5;
public static final int STBA = (1 << 4) | 5;
public static final int STFSR = (2 << 4) | 5;
public static final int STCSR = (3 << 4) | 5;
public static final int STH = 6;
public static final int STHA = (1 << 4) | 6;
public static final int STDFQ = (2 << 4) | 6;
public static final int STDCQ = (3 << 4) | 6;
public static final int STD = 7;
public static final int STDA = (1 << 4) | 7;
public static final int STDF = (2 << 4) | 7;
public static final int STDC = (3 << 4) | 7;
public static final int LDSB = 9;
public static final int LDSBA = (1 << 4) | 9;
public static final int LDSH = 0xA;
public static final int LDSHA = (1 << 4) | 0xA;
public static final int LDSTUB = 0xD;
public static final int LDSTUBA = (1 << 4) | 0xD;
public static final int SWAP = 0xF;
public static final int SWAPA = (1 << 4) | 0xF;
// arithmetic, logic remaining - op3 with op=2 (FORMAT_3A)
public static final int ADD = 0;
public static final int ADDcc = (1 << 4);
public static final int TADDcc = (2 << 4);
public static final int WRASR = (3 << 4);
public static final int WRY = WRASR;
public static final int AND = 1;
public static final int ANDcc = (1 << 4) | 1;
public static final int TSUBcc = (2 << 4) | 1;
public static final int WRPSR = (3 << 4) | 1;
public static final int OR = 2;
public static final int ORcc = (1 << 4) | 2;
public static final int TADDccTV = (2 << 4) | 2;
public static final int WRWIM = (3 << 4) | 2;
public static final int XOR = 3;
public static final int XORcc = (1 << 4) | 3;
public static final int TSUBccTV = (2 << 4) | 3;
public static final int WRTBR = (3 << 4) | 3;
public static final int SUB = 4;
public static final int SUBcc = (1 << 4) | 4;
public static final int MULScc = (2 << 4) | 4;
public static final int FPop1 = (3 << 4) | 4;
public static final int ANDN = 5;
public static final int ANDNcc = (1 << 4) | 5;
public static final int SLL = (2 << 4) | 5;
public static final int FPop2 = (3 << 4) | 5;
public static final int ORN = 6;
public static final int ORNcc = (1 << 4) | 6;
public static final int SRL = (2 << 4) | 6;
public static final int CPop1 = (3 << 4) | 6;
public static final int XNOR = 7;
public static final int XNORcc = (1 << 4) | 7;
public static final int SRA = (2 << 4) | 7;
public static final int CPop2 = (3 << 4) | 7;
public static final int ADDX = 8;
public static final int ADDXcc = (1 << 4) | 8;
public static final int RDASR = (2 << 4) | 8;
public static final int RDY = RDASR;
public static final int STBAR = RDASR;
public static final int JMPL = (3 << 4) | 8;
public static final int RDPSR = (2 << 4) | 9;
public static final int RETT = (3 << 4) | 9;
public static final int UMUL = 0xA;
public static final int UMULcc = (1 << 4) | 0xA;
public static final int RDWIM = (2 << 4) | 0xA;
public static final int Ticc = (3 << 4) | 0xA;
public static final int SMUL = 0xB;
public static final int SMULcc = (1 << 4) | 0xB;
public static final int RDTBR = (2 << 4) | 0xB;
public static final int FLUSH = (3 << 4) | 0xB;
public static final int SUBX = 0xC;
public static final int SUBXcc = (1 << 4) | 0xC;
public static final int SAVE = (3 << 4) | 0xC;
public static final int RESTORE = (3 << 4) | 0xD;
public static final int UDIV = 0xE;
public static final int UDIVcc = (1 << 4) | 0xE;
public static final int SDIV = 0xF;
public static final int SDIVcc = (1 << 4) | 0xF;
// opf - 9 bits (op=2, op3=0x34=FPop1) - floating point arithmetic
public static final int FMOVs = 0x01;
public static final int FNEGs = 0x05;
public static final int FABSs = 0x09;
public static final int FSQRTs = 0x29;
public static final int FSQRTd = 0x2A;
public static final int FSQRTq = 0x2B;
public static final int FADDs = 0x41;
public static final int FADDd = 0x42;
public static final int FADDq = 0x43;
public static final int FSUBs = 0x45;
public static final int FSUBd = 0x46;
public static final int FSUBq = 0x47;
public static final int FMULs = 0x49;
public static final int FMULd = 0x4A;
public static final int FMULq = 0x4B;
public static final int FDIVs = 0x4D;
public static final int FDIVd = 0x4E;
public static final int FDIVq = 0x4F;
public static final int FsMULd = 0x69;
public static final int FdMULq = 0x6E;
public static final int FiTOs = 0xC4;
public static final int FdTOs = 0xC6;
public static final int FqTOs = 0xC7;
public static final int FiTOd = 0xC8;
public static final int FsTOd = 0xC9;
public static final int FqTOd = 0xCB;
public static final int FiTOq = 0xCC;
public static final int FsTOq = 0xCD;
public static final int FdTOq = 0xCE;
public static final int FsTOi = 0xD1;
public static final int FdTOi = 0xD2;
public static final int FqTOi = 0xD3;
// opf - 9 bits (op=2, op3=0x35=FPop2) - floating point comparisons
public static final int FCMPs = 0x51;
public static final int FCMPd = 0x52;
public static final int FCMPq = 0x53;
public static final int FCMPEs = 0x55;
public static final int FCMPEd = 0x56;
public static final int FCMPEq = 0x57;
// 5 bit shift count mask
public static final int SHIFT_COUNT_5_MASK = 0x1F;
}

Some files were not shown because too many files have changed in this diff Show More