Merge
This commit is contained in:
commit
358c39b12e
1
.hgtags
1
.hgtags
@ -96,3 +96,4 @@ a4e6aa1f45ad23a6f083ed98d970b5006ea4d292 jdk7-b116
|
||||
4951967a61b4dbbf514828879f57bd1a0d4b420b jdk7-b119
|
||||
8c840d3ab24f8d0f422b991638acb44b6ab1d98c jdk7-b120
|
||||
0ce0a2c3a6926677dc507839a820ab6625541e5a jdk7-b121
|
||||
6f09ea1c034f087916d2a8cf0d22be768400118f jdk7-b122
|
||||
|
@ -96,3 +96,4 @@ a12a9e78df8a9d534da0b4a244ed68f0de0bd58e jdk7-b118
|
||||
661360bef6ccad6c119f067f5829b207de80c936 jdk7-b119
|
||||
366ff0b6d2151595629806b033e2e1497e3a55d4 jdk7-b120
|
||||
2c2d4f88637b488014c37e1a2eb401f68bca8838 jdk7-b121
|
||||
f1591eed71f64f6eba79fb7426f5616cc4dfea73 jdk7-b122
|
||||
|
2
README
2
README
@ -26,6 +26,6 @@ Simple Build Instructions:
|
||||
gnumake all
|
||||
The resulting JDK image should be found in build/*/j2sdk-image
|
||||
|
||||
where gnumake is GNU make 3.78.1 or newer, /usr/bin/make on Linux and
|
||||
where gnumake is GNU make 3.81 or newer, /usr/bin/make on Linux and
|
||||
/usr/sfw/bin/gmake or /opt/sfw/bin/gmake on Solaris.
|
||||
|
||||
|
@ -524,7 +524,7 @@
|
||||
A few notes about using GNU make:
|
||||
<ul>
|
||||
<li>
|
||||
In general, you need GNU make version 3.78.1 or newer.
|
||||
In general, you need GNU make version 3.81 or newer.
|
||||
</li>
|
||||
<li>
|
||||
Place the location of the GNU make binary in the <tt>PATH</tt>.
|
||||
|
@ -96,3 +96,4 @@ fa502e4834dac2176499cc1f44794d5dc32a11b9 jdk7-b117
|
||||
39829414ae31a0080578a49b751899edd518cd7d jdk7-b119
|
||||
cff5a173ec1e89013359e804a3e31736ef6fb462 jdk7-b120
|
||||
2cc9f32992101732b23730b737740e64ebc5fa89 jdk7-b121
|
||||
1523a060032c8a5b7840198da8911abeff88118f jdk7-b122
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 1997, 2010, 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
|
||||
@ -383,7 +383,7 @@ endif
|
||||
|
||||
REQUIRED_ZIP_VER = 2.2
|
||||
REQUIRED_UNZIP_VER = 5.12
|
||||
REQUIRED_MAKE_VER = 3.78
|
||||
REQUIRED_MAKE_VER = 3.81
|
||||
|
||||
# Unix type settings (same for all unix platforms)
|
||||
ifneq ($(PLATFORM), windows)
|
||||
|
@ -30,12 +30,14 @@ import com.sun.corba.se.impl.orbutil.ORBConstants;
|
||||
import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
|
||||
import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
|
||||
import com.sun.corba.se.impl.protocol.giopmsgheaders.FragmentMessage;
|
||||
import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;
|
||||
import com.sun.corba.se.impl.encoding.BufferManagerWrite;
|
||||
import com.sun.corba.se.impl.encoding.ByteBufferWithInfo;
|
||||
import com.sun.corba.se.impl.encoding.CDROutputObject;
|
||||
import com.sun.corba.se.spi.orb.ORB;
|
||||
import com.sun.corba.se.pept.transport.Connection;
|
||||
import com.sun.corba.se.pept.encoding.OutputObject;
|
||||
import org.omg.CORBA.SystemException;
|
||||
|
||||
/**
|
||||
* Streaming buffer manager.
|
||||
@ -66,7 +68,13 @@ public class BufferManagerWriteStream extends BufferManagerWrite
|
||||
// Set the fragment's moreFragments field to true
|
||||
MessageBase.setFlag(bbwi.byteBuffer, Message.MORE_FRAGMENTS_BIT);
|
||||
|
||||
sendFragment(false);
|
||||
try {
|
||||
sendFragment(false);
|
||||
} catch(SystemException se){
|
||||
orb.getPIHandler().invokeClientPIEndingPoint(
|
||||
ReplyMessage.SYSTEM_EXCEPTION, se);
|
||||
throw se;
|
||||
}
|
||||
|
||||
// Reuse the old buffer
|
||||
|
||||
|
@ -85,6 +85,9 @@ public class ObjectStreamClass implements java.io.Serializable {
|
||||
|
||||
private static Hashtable translatedFields;
|
||||
|
||||
/** true if represents enum type */
|
||||
private boolean isEnum;
|
||||
|
||||
private static final Bridge bridge =
|
||||
(Bridge)AccessController.doPrivileged(
|
||||
new PrivilegedAction() {
|
||||
@ -359,6 +362,7 @@ public class ObjectStreamClass implements java.io.Serializable {
|
||||
}
|
||||
|
||||
name = cl.getName();
|
||||
isEnum = Enum.class.isAssignableFrom(cl);
|
||||
superclass = superdesc;
|
||||
serializable = serial;
|
||||
if (!forProxyClass) {
|
||||
@ -401,7 +405,8 @@ public class ObjectStreamClass implements java.io.Serializable {
|
||||
if (!serializable ||
|
||||
externalizable ||
|
||||
forProxyClass ||
|
||||
name.equals("java.lang.String")) {
|
||||
name.equals("java.lang.String") ||
|
||||
isEnum) {
|
||||
fields = NO_FIELDS;
|
||||
} else if (serializable) {
|
||||
/* Ask for permission to override field access checks.
|
||||
@ -502,7 +507,7 @@ public class ObjectStreamClass implements java.io.Serializable {
|
||||
*
|
||||
* NonSerializable classes have a serialVerisonUID of 0L.
|
||||
*/
|
||||
if (isNonSerializable()) {
|
||||
if (isNonSerializable() || isEnum) {
|
||||
suid = 0L;
|
||||
} else {
|
||||
// Lookup special Serializable members using reflection.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2010, 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
|
||||
@ -45,6 +45,10 @@ import com.sun.corba.se.spi.orbutil.fsm.StateEngineFactory ;
|
||||
import com.sun.corba.se.impl.orbutil.concurrent.Mutex ;
|
||||
import com.sun.corba.se.impl.orbutil.concurrent.CondVar ;
|
||||
|
||||
import org.omg.CORBA.SystemException ;
|
||||
|
||||
import org.omg.PortableServer.POAPackage.ObjectAlreadyActive ;
|
||||
|
||||
/** AOMEntry represents a Servant or potential Servant in the ActiveObjectMap.
|
||||
* It may be in several states to allow for long incarnate or etherealize operations.
|
||||
* The methods on this class mostly represent input symbols to the state machine
|
||||
@ -121,6 +125,12 @@ public class AOMEntry extends FSMImpl {
|
||||
}
|
||||
} ;
|
||||
|
||||
private static Action oaaAction = new ActionBase( "throwObjectAlreadyActive" ) {
|
||||
public void doIt( FSM fsm, Input in ) {
|
||||
throw new RuntimeException( new ObjectAlreadyActive() ) ;
|
||||
}
|
||||
} ;
|
||||
|
||||
private static Guard waitGuard = new GuardBase( "wait" ) {
|
||||
public Guard.Result evaluate( FSM fsm, Input in ) {
|
||||
AOMEntry entry = (AOMEntry)fsm ;
|
||||
@ -173,19 +183,23 @@ public class AOMEntry extends FSMImpl {
|
||||
engine.add( INCARN, START_ETH, waitGuard, null, INCARN ) ;
|
||||
engine.add( INCARN, INC_DONE, null, VALID ) ;
|
||||
engine.add( INCARN, INC_FAIL, decrementAction, INVALID ) ;
|
||||
engine.add( INCARN, ACTIVATE, oaaAction, INCARN ) ;
|
||||
|
||||
engine.add( VALID, ENTER, incrementAction, VALID ) ;
|
||||
engine.add( VALID, EXIT, decrementAction, VALID ) ;
|
||||
engine.add( VALID, START_ETH, greaterZeroGuard, null, ETHP ) ;
|
||||
engine.add( VALID, START_ETH, zeroGuard, null, ETH ) ;
|
||||
engine.add( VALID, ACTIVATE, oaaAction, VALID ) ;
|
||||
|
||||
engine.add( ETHP, ENTER, waitGuard, null, ETHP ) ;
|
||||
engine.add( ETHP, START_ETH, null, ETHP ) ;
|
||||
engine.add( ETHP, EXIT, greaterOneGuard, decrementAction, ETHP ) ;
|
||||
engine.add( ETHP, EXIT, oneGuard, decrementAction, ETH ) ;
|
||||
engine.add( ETHP, ACTIVATE, oaaAction, ETHP ) ;
|
||||
|
||||
engine.add( ETH, START_ETH, null, ETH ) ;
|
||||
engine.add( ETH, ETH_DONE, null, DESTROYED ) ;
|
||||
engine.add( ETH, ACTIVATE, oaaAction, ETH ) ;
|
||||
engine.add( ETH, ENTER, waitGuard, null, ETH ) ;
|
||||
|
||||
engine.setDefault( DESTROYED, throwIllegalStateExceptionAction, DESTROYED ) ;
|
||||
@ -217,7 +231,17 @@ public class AOMEntry extends FSMImpl {
|
||||
public void etherealizeComplete() { doIt( ETH_DONE ) ; }
|
||||
public void incarnateComplete() { doIt( INC_DONE ) ; }
|
||||
public void incarnateFailure() { doIt( INC_FAIL ) ; }
|
||||
public void activateObject() { doIt( ACTIVATE ) ; }
|
||||
public void activateObject() throws ObjectAlreadyActive {
|
||||
try {
|
||||
doIt( ACTIVATE ) ;
|
||||
} catch (RuntimeException exc) {
|
||||
Throwable thr = exc.getCause() ;
|
||||
if (thr instanceof ObjectAlreadyActive)
|
||||
throw (ObjectAlreadyActive)thr ;
|
||||
else
|
||||
throw exc ;
|
||||
}
|
||||
}
|
||||
public void enter() { doIt( ENTER ) ; }
|
||||
public void exit() { doIt( EXIT ) ; }
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2010, 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
|
||||
@ -107,13 +107,9 @@ public abstract class POAPolicyMediatorBase_R extends POAPolicyMediatorBase {
|
||||
throw new ServantAlreadyActive();
|
||||
ActiveObjectMap.Key key = new ActiveObjectMap.Key( id ) ;
|
||||
|
||||
// Note that this can't happen for system assigned IDs since the
|
||||
// POA never hands out the same ID. However, we make this redundant
|
||||
// check here to share the code.
|
||||
if (activeObjectMap.containsKey(key))
|
||||
throw new ObjectAlreadyActive() ;
|
||||
|
||||
AOMEntry entry = activeObjectMap.get( key ) ;
|
||||
|
||||
// Check for an ObjectAlreadyActive error
|
||||
entry.activateObject() ;
|
||||
activateServant( key, entry, servant ) ;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2010, 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
|
||||
@ -245,7 +245,14 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
|
||||
// All access to resolver, localResolver, and urlOperation must be protected using
|
||||
// resolverLock. Do not hold the ORBImpl lock while accessing
|
||||
// resolver, or deadlocks may occur.
|
||||
private Object resolverLock ;
|
||||
// Note that we now have separate locks for each resolver type. This is due
|
||||
// to bug 6980681 and 6238477, which was caused by a deadlock while resolving a
|
||||
// corbaname: URL that contained a reference to the same ORB as the
|
||||
// ORB making the call to string_to_object. This caused a deadlock between the
|
||||
// client thread holding the single lock for access to the urlOperation,
|
||||
// and the server thread handling the client is_a request waiting on the
|
||||
// same lock to access the localResolver.
|
||||
|
||||
|
||||
// Used for resolver_initial_references and list_initial_services
|
||||
private Resolver resolver ;
|
||||
@ -255,8 +262,14 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
|
||||
|
||||
// Converts strings to object references for resolvers and string_to_object
|
||||
private Operation urlOperation ;
|
||||
private final Object urlOperationLock = new java.lang.Object() ;
|
||||
|
||||
private CorbaServerRequestDispatcher insNamingDelegate ;
|
||||
// resolverLock must be used for all access to either resolver or
|
||||
// localResolver, since it is possible for the resolver to indirectly
|
||||
// refer to the localResolver. Also used to protect access to
|
||||
// insNamingDelegate.
|
||||
private final Object resolverLock = new Object() ;
|
||||
|
||||
private TaggedComponentFactoryFinder taggedComponentFactoryFinder ;
|
||||
|
||||
@ -396,7 +409,6 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
|
||||
}
|
||||
};
|
||||
|
||||
resolverLock = new java.lang.Object() ;
|
||||
|
||||
requestDispatcherRegistry = new RequestDispatcherRegistryImpl(
|
||||
this, ORBConstants.DEFAULT_SCID);
|
||||
@ -832,7 +844,7 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
|
||||
if (str == null)
|
||||
throw wrapper.nullParam() ;
|
||||
|
||||
synchronized (resolverLock) {
|
||||
synchronized (urlOperationLock) {
|
||||
org.omg.CORBA.Object obj = (org.omg.CORBA.Object)op.operate( str ) ;
|
||||
return obj ;
|
||||
}
|
||||
@ -1778,7 +1790,7 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
|
||||
*/
|
||||
public void setURLOperation( Operation stringToObject )
|
||||
{
|
||||
synchronized (resolverLock) {
|
||||
synchronized (urlOperationLock) {
|
||||
urlOperation = stringToObject ;
|
||||
}
|
||||
}
|
||||
@ -1788,7 +1800,7 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
|
||||
*/
|
||||
public Operation getURLOperation()
|
||||
{
|
||||
synchronized (resolverLock) {
|
||||
synchronized (urlOperationLock) {
|
||||
return urlOperation ;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,107 @@
|
||||
|
||||
# Copyright (c) 2001, 2005, 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. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
orbd.usage=Uso: {0} <options> \n\nem que <options> inclui:\n -port porta de ativa\u00e7\u00e3o na qual o ORBD deve ser iniciado, padr\u00e3o 1049 (opcional)\n -defaultdb diret\u00f3rio dos arquivos ORBD, padr\u00e3o "./orb.db" (opcional)\n -serverid id do servidor para ORBD, padr\u00e3o 1 (opcional)\n -ORBInitialPort porta inicial (necess\u00e1rio)\n -ORBInitialHost nome de host inicial (necess\u00e1rio)\n
|
||||
|
||||
servertool.usage=Uso: {0} <options> \n\nem que <options> inclui:\n -ORBInitialPort porta inicial (necess\u00e1rio)\n -ORBInitialHost nome de host inicial (necess\u00e1rio)\n
|
||||
servertool.banner=\n\nBem-vindo a ferramenta de servidor IDL Java \ninsira os comandos no prompt \n
|
||||
servertool.shorthelp=\n\n\tComandos dispon\u00edveis: \n\t------------------- \n
|
||||
servertool.baddef=Servidor mal definido: {0}
|
||||
servertool.nosuchserver=\tservidor n\u00e3o encontrado.
|
||||
servertool.helddown=\to servidor est\u00e1 em espera.
|
||||
servertool.nosuchorb=\tORB inv\u00e1lido.
|
||||
servertool.serverup=\to servidor j\u00e1 est\u00e1 ativo.
|
||||
servertool.appname=\tapplicationName - {0}
|
||||
servertool.name=\tname - {0}
|
||||
servertool.classpath=\tclasspath - {0}
|
||||
servertool.args=\targs - {0}
|
||||
servertool.vmargs=\tvmargs - {0}
|
||||
servertool.serverid=\tserver id - {0}
|
||||
servertool.servernotrunning=\to servidor n\u00e3o est\u00e1 em execu\u00e7\u00e3o.
|
||||
servertool.register=\n\n\tregister -server <server class name> \n\t -applicationName <alternate server name> \n\t -classpath <classpath to server> \n\t -args <args to server> \n\t -vmargs <args to server Java VM>\n
|
||||
servertool.register1=registra um servidor ativ\u00e1vel
|
||||
servertool.register2=\tservidor registrado (serverid = {0}).
|
||||
servertool.register3=\tservidor registrado, mas em espera (serverid = {0}).
|
||||
servertool.register4=\tservidor j\u00e1 registrado (serverid = {0}).
|
||||
|
||||
servertool.unregister=\n\tunregister [ -serverid <server id> | -applicationName <name> ] \n
|
||||
servertool.unregister1=cancela o registro de um servidor registrado
|
||||
servertool.unregister2=\tservidor n\u00e3o registrado.
|
||||
|
||||
servertool.locate=\n\tlocate [ -serverid <server id> | -applicationName <name> ] [ <-endpointType <endpointType> ] \n
|
||||
servertool.locate1=localiza portas de tipo espec\u00edfico para um servidor registrado
|
||||
servertool.locate2=\n\n\tNome do host {0} \n\n\t\tPorta\t\tTipo de porta\t\tId do ORB\n\t\t----\t\t---------\t\t------\n
|
||||
servertool.locateorb=\n\tlocateperorb [ -serverid <server id> | -applicationName <name> ] [ -orbid <ORB name> ]\n
|
||||
servertool.locateorb1=localiza portas para um orb espec\u00edfico de servidor registrado
|
||||
servertool.locateorb2=\n\n\tNome do host {0} \n\n\t\tPorta\t\tTipo de porta\t\tId do ORB\n\t\t----\t\t--------\t\t------\n
|
||||
servertool.getserverid=\n\tgetserverid [ -applicationName <name> ] \n
|
||||
servertool.getserverid1=retorna o id do servidor de um applicationName
|
||||
servertool.getserverid2=\tID do servidor de applicationName {0} \u00e9 {1}
|
||||
|
||||
servertool.list=\n\tlist\n
|
||||
servertool.list1=lista todos os servidores registrados
|
||||
servertool.list2=\n\tId do servidor\tNome de classe do servidor\t\tAplicativo do servidor\n\t---------\t-----------------\t\t------------------\n
|
||||
servertool.listactive=\n\tlistactive
|
||||
servertool.listactive1=lista os servidores atualmente ativos
|
||||
servertool.listappnames=\tlistappnames\n
|
||||
servertool.listappnames1=lista os applicationNames atualmente definidos
|
||||
servertool.listappnames2=applicationNames do servidor atualmente definidos:
|
||||
|
||||
servertool.shutdown=\n\tshutdown [ -serverid <server id> | -applicationName <name> ]\n
|
||||
servertool.shutdown1=desliga um servidor registrado
|
||||
servertool.shutdown2=\tservidor desligado com \u00eaxito.
|
||||
servertool.startserver=\n\tstartup [ -serverid <server id> | -applicationName <name> ]\n
|
||||
servertool.startserver1=inicia um servidor registrado
|
||||
servertool.startserver2=\tservidor iniciado com \u00eaxito.
|
||||
|
||||
servertool.quit=\n\tquit\n
|
||||
servertool.quit1=sai desta ferramenta
|
||||
|
||||
servertool.help=\thelp\n\tOR\n\thelp <command name>\n
|
||||
servertool.help1=obt\u00e9m ajuda
|
||||
|
||||
servertool.orbidmap=\tUso: orblist [ -serverid <server id> | -applicationName <name> ]\n
|
||||
servertool.orbidmap1=lista de nomes de orb e seus mapeamentos
|
||||
servertool.orbidmap2=\n\tId de ORB\t\tNome de ORB\n\t------\t\t--------\n
|
||||
pnameserv.success=NameServer persistente iniciado com \u00eaxito
|
||||
|
||||
|
||||
bootstrap.usage=Uso: {0} <options> \n\nem que <options> inclui:\n -ORBInitialPort porta inicial (necess\u00e1rio)\n -InitialServicesFile arquivo que cont\u00e9m a lista de servi\u00e7os iniciais (necess\u00e1rio)\n
|
||||
bootstrap.success=configurando porta para {0} e lendo servi\u00e7os de {1}
|
||||
bootstrap.filenotreadable=o arquivo {0} n\u00e3o \u00e9 leg\u00edvel
|
||||
bootstrap.filenotfound=arquivo {0} n\u00e3o encontrado
|
||||
bootstrap.exception=exce\u00e7\u00e3o capturada ao salvar as propriedades no arquivo {0}: Exce\u00e7\u00e3o {1}
|
||||
|
||||
tnameserv.exception=uma exce\u00e7\u00e3o capturada ao iniciar o servi\u00e7o de inicializa\u00e7\u00e3o na porta {0}
|
||||
tnameserv.usage=tente usar outra porta com os argumentos de linha de comando -ORBInitialPort <portno>
|
||||
tnameserv.invalidhostoption=ORBInitialHost n\u00e3o \u00e9 uma op\u00e7\u00e3o v\u00e1lida para NameService
|
||||
tnameserv.orbinitialport0=ORBInitialPort 0 n\u00e3o \u00e9 uma op\u00e7\u00e3o v\u00e1lida para NameService
|
||||
tnameserv.hs1=Contexto de nomea\u00e7\u00e3o inicial:\n{0}
|
||||
tnameserv.hs2=TransientNameServer: definindo porta para as refer\u00eancias de objeto iniciais: {0}
|
||||
tnameserv.hs3=Pronto.
|
||||
|
||||
orbd.commfailure=\nFalha ao iniciar ORBD porque ORBinitialPort j\u00e1 est\u00e1 em uso
|
||||
orbd.internalexception=\nFalha ao iniciar ORBD devido a uma exce\u00e7\u00e3o interna. \nPoss\u00edveis causas: \n1. ORBInitialPort especificado ou ORBActivationPort j\u00e1 em uso \n2. Sem permiss\u00e3o de grava\u00e7\u00e3o para gravar orb.db
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2010, 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
|
||||
@ -122,9 +122,6 @@ public class CorbaClientRequestDispatcherImpl
|
||||
implements
|
||||
ClientRequestDispatcher
|
||||
{
|
||||
// Used for locking
|
||||
private Object lock = new Object();
|
||||
|
||||
public OutputObject beginRequest(Object self, String opName,
|
||||
boolean isOneWay, ContactInfo contactInfo)
|
||||
{
|
||||
@ -151,7 +148,8 @@ public class CorbaClientRequestDispatcherImpl
|
||||
|
||||
// This locking is done so that multiple connections are not created
|
||||
// for the same endpoint
|
||||
synchronized (lock) {
|
||||
//6929137 - Synchronized on contactInfo to avoid blocking across multiple endpoints
|
||||
synchronized (contactInfo) {
|
||||
if (contactInfo.isConnectionBased()) {
|
||||
if (contactInfo.shouldCacheConnection()) {
|
||||
connection = (CorbaConnection)
|
||||
@ -256,7 +254,7 @@ public class CorbaClientRequestDispatcherImpl
|
||||
registerWaiter(messageMediator);
|
||||
|
||||
// Do connection reclaim now
|
||||
synchronized (lock) {
|
||||
synchronized (contactInfo) {
|
||||
if (contactInfo.isConnectionBased()) {
|
||||
if (contactInfo.shouldCacheConnection()) {
|
||||
OutboundConnectionCache connectionCache =
|
||||
@ -387,11 +385,15 @@ public class CorbaClientRequestDispatcherImpl
|
||||
boolean retry =
|
||||
getContactInfoListIterator(orb)
|
||||
.reportException(messageMediator.getContactInfo(), e);
|
||||
if (retry) {
|
||||
// Must run interceptor end point before retrying.
|
||||
Exception newException =
|
||||
|
||||
//Bug 6382377: must not lose exception in PI
|
||||
|
||||
// Must run interceptor end point before retrying.
|
||||
Exception newException =
|
||||
orb.getPIHandler().invokeClientPIEndingPoint(
|
||||
ReplyMessage.SYSTEM_EXCEPTION, e);
|
||||
ReplyMessage.SYSTEM_EXCEPTION, e);
|
||||
|
||||
if (retry) {
|
||||
if (newException == e) {
|
||||
continueOrThrowSystemOrRemarshal(messageMediator,
|
||||
new RemarshalException());
|
||||
@ -400,6 +402,14 @@ public class CorbaClientRequestDispatcherImpl
|
||||
newException);
|
||||
}
|
||||
} else {
|
||||
if (newException instanceof RuntimeException){
|
||||
throw (RuntimeException)newException;
|
||||
}
|
||||
else if (newException instanceof RemarshalException)
|
||||
{
|
||||
throw (RemarshalException)newException;
|
||||
}
|
||||
|
||||
// NOTE: Interceptor ending point will run in releaseReply.
|
||||
throw e;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2010, 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
|
||||
@ -34,6 +34,7 @@ import com.sun.corba.se.pept.transport.ConnectionCache;
|
||||
|
||||
import com.sun.corba.se.spi.logging.CORBALogDomains;
|
||||
import com.sun.corba.se.spi.orb.ORB;
|
||||
import com.sun.corba.se.spi.transport.CorbaConnection;
|
||||
import com.sun.corba.se.spi.transport.CorbaConnectionCache;
|
||||
|
||||
import com.sun.corba.se.impl.logging.ORBUtilSystemException;
|
||||
@ -87,6 +88,14 @@ public abstract class CorbaConnectionCacheBase
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
synchronized (backingStore()) {
|
||||
for (Object obj : values()) {
|
||||
((CorbaConnection)obj).closeConnectionResources() ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public long numberOfIdleConnections()
|
||||
{
|
||||
long count = 0;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2010 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
|
||||
@ -38,6 +38,7 @@ import org.omg.CORBA.INTERNAL;
|
||||
import org.omg.CORBA.CompletionStatus;
|
||||
|
||||
import com.sun.corba.se.pept.transport.Acceptor;
|
||||
import com.sun.corba.se.pept.transport.ConnectionCache;
|
||||
import com.sun.corba.se.pept.transport.ByteBufferPool;
|
||||
import com.sun.corba.se.pept.transport.ContactInfo;
|
||||
import com.sun.corba.se.pept.transport.InboundConnectionCache;
|
||||
@ -49,6 +50,8 @@ import com.sun.corba.se.spi.ior.ObjectAdapterId;
|
||||
import com.sun.corba.se.spi.orb.ORB;
|
||||
import com.sun.corba.se.spi.transport.CorbaAcceptor;
|
||||
import com.sun.corba.se.spi.transport.CorbaTransportManager;
|
||||
import com.sun.corba.se.pept.transport.Connection;
|
||||
import com.sun.corba.se.pept.transport.ConnectionCache;
|
||||
|
||||
// REVISIT - impl/poa specific:
|
||||
import com.sun.corba.se.impl.oa.poa.Policies;
|
||||
@ -182,6 +185,12 @@ public class CorbaTransportManagerImpl
|
||||
if (orb.transportDebugFlag) {
|
||||
dprint(".close->");
|
||||
}
|
||||
for (Object cc : outboundConnectionCaches.values()) {
|
||||
((ConnectionCache)cc).close() ;
|
||||
}
|
||||
for (Object cc : inboundConnectionCaches.values()) {
|
||||
((ConnectionCache)cc).close() ;
|
||||
}
|
||||
getSelector(0).close();
|
||||
} finally {
|
||||
if (orb.transportDebugFlag) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2010, 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
|
||||
@ -32,6 +32,7 @@ import java.nio.channels.SelectionKey;
|
||||
import java.nio.channels.Selector;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
@ -66,7 +67,7 @@ public class SelectorImpl
|
||||
private List deferredRegistrations;
|
||||
private List interestOpsList;
|
||||
private HashMap listenerThreads;
|
||||
private HashMap readerThreads;
|
||||
private Map readerThreads;
|
||||
private boolean selectorStarted;
|
||||
private boolean closed;
|
||||
private ORBUtilSystemException wrapper ;
|
||||
@ -81,7 +82,7 @@ public class SelectorImpl
|
||||
deferredRegistrations = new ArrayList();
|
||||
interestOpsList = new ArrayList();
|
||||
listenerThreads = new HashMap();
|
||||
readerThreads = new HashMap();
|
||||
readerThreads = java.util.Collections.synchronizedMap(new HashMap());
|
||||
closed = false;
|
||||
wrapper = ORBUtilSystemException.get(orb,CORBALogDomains.RPC_TRANSPORT);
|
||||
}
|
||||
@ -178,8 +179,13 @@ public class SelectorImpl
|
||||
}
|
||||
|
||||
if (eventHandler.shouldUseSelectThreadToWait()) {
|
||||
SelectionKey selectionKey = eventHandler.getSelectionKey();
|
||||
selectionKey.cancel();
|
||||
SelectionKey selectionKey ;
|
||||
synchronized(deferredRegistrations) {
|
||||
selectionKey = eventHandler.getSelectionKey();
|
||||
}
|
||||
if (selectionKey != null) {
|
||||
selectionKey.cancel();
|
||||
}
|
||||
selector.wakeup();
|
||||
return;
|
||||
}
|
||||
|
@ -811,6 +811,7 @@ public class SocketOrChannelConnectionImpl
|
||||
dprint(".close: " + this, e);
|
||||
}
|
||||
}
|
||||
closeConnectionResources();
|
||||
} finally {
|
||||
if (orb.transportDebugFlag) {
|
||||
dprint(".close<-: " + this);
|
||||
@ -818,6 +819,28 @@ public class SocketOrChannelConnectionImpl
|
||||
}
|
||||
}
|
||||
|
||||
public void closeConnectionResources() {
|
||||
if (orb.transportDebugFlag) {
|
||||
dprint(".closeConnectionResources->: " + this);
|
||||
}
|
||||
Selector selector = orb.getTransportManager().getSelector(0);
|
||||
selector.unregisterForEvent(this);
|
||||
try {
|
||||
if (socketChannel != null)
|
||||
socketChannel.close() ;
|
||||
if (socket != null && !socket.isClosed())
|
||||
socket.close() ;
|
||||
} catch (IOException e) {
|
||||
if (orb.transportDebugFlag) {
|
||||
dprint( ".closeConnectionResources: " + this, e ) ;
|
||||
}
|
||||
}
|
||||
if (orb.transportDebugFlag) {
|
||||
dprint(".closeConnectionResources<-: " + this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Acceptor getAcceptor()
|
||||
{
|
||||
return acceptor;
|
||||
|
@ -41,6 +41,12 @@ public interface ConnectionCache
|
||||
public long numberOfBusyConnections();
|
||||
|
||||
public boolean reclaim();
|
||||
|
||||
/** Close all connections in the connection cache.
|
||||
* This is used as a final cleanup, and will result
|
||||
* in abrupt termination of any pending communications.
|
||||
*/
|
||||
public void close();
|
||||
}
|
||||
|
||||
// End of file.
|
||||
|
@ -163,6 +163,10 @@ public interface CorbaConnection
|
||||
// REVISIT - MessageMediator parameter?
|
||||
public void serverRequestProcessingBegins();
|
||||
public void serverRequestProcessingEnds();
|
||||
|
||||
/** Clean up all connection resources. Used when shutting down an ORB.
|
||||
*/
|
||||
public void closeConnectionResources();
|
||||
}
|
||||
|
||||
// End of file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2010, 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
|
||||
@ -344,17 +344,27 @@ public class Stub implements AuxGen
|
||||
stream.println (" String str = s.readUTF ();");
|
||||
stream.println (" String[] args = null;");
|
||||
stream.println (" java.util.Properties props = null;");
|
||||
stream.println (" org.omg.CORBA.Object obj = org.omg.CORBA.ORB.init (args, props).string_to_object (str);");
|
||||
stream.println (" org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);");
|
||||
stream.println (" try {");
|
||||
stream.println (" org.omg.CORBA.Object obj = orb.string_to_object (str);");
|
||||
stream.println (" org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl) obj)._get_delegate ();");
|
||||
stream.println (" _set_delegate (delegate);");
|
||||
stream.println (" } finally {");
|
||||
stream.println (" orb.destroy() ;");
|
||||
stream.println (" }");
|
||||
stream.println (" }");
|
||||
stream.println ();
|
||||
stream.println (" private void writeObject (java.io.ObjectOutputStream s) throws java.io.IOException");
|
||||
stream.println (" {");
|
||||
stream.println (" String[] args = null;");
|
||||
stream.println (" java.util.Properties props = null;");
|
||||
stream.println (" String str = org.omg.CORBA.ORB.init (args, props).object_to_string (this);");
|
||||
stream.println (" org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);");
|
||||
stream.println (" try {");
|
||||
stream.println (" String str = orb.object_to_string (this);");
|
||||
stream.println (" s.writeUTF (str);");
|
||||
stream.println (" } finally {");
|
||||
stream.println (" orb.destroy() ;");
|
||||
stream.println (" }");
|
||||
stream.println (" }");
|
||||
}
|
||||
|
||||
|
@ -134,4 +134,5 @@ bdbc48857210a509b3c50a3291ecb9dd6a72e016 jdk7-b115
|
||||
5484e7c53fa7da5e869902437ee08a9ae10c1c69 jdk7-b119
|
||||
f5603a6e50422046ebc0d2f1671d55cb8f1bf1e9 jdk7-b120
|
||||
3f3653ab7af8dc1ddb9fa75dad56bf94f89e81a8 jdk7-b121
|
||||
3a548dc9cb456110ca8fc1514441a8c3bda0014d jdk7-b122
|
||||
5484e7c53fa7da5e869902437ee08a9ae10c1c69 hs20-b03
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2010, 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
|
||||
@ -99,15 +99,8 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase {
|
||||
long typeEntrySizeOffset;
|
||||
long typeEntryArrayStride;
|
||||
|
||||
typeEntryTypeNameOffset = getLongValueFromProcess("gHotSpotVMTypeEntryTypeNameOffset");
|
||||
typeEntrySuperclassNameOffset = getLongValueFromProcess("gHotSpotVMTypeEntrySuperclassNameOffset");
|
||||
typeEntryIsOopTypeOffset = getLongValueFromProcess("gHotSpotVMTypeEntryIsOopTypeOffset");
|
||||
typeEntryIsIntegerTypeOffset = getLongValueFromProcess("gHotSpotVMTypeEntryIsIntegerTypeOffset");
|
||||
typeEntryIsUnsignedOffset = getLongValueFromProcess("gHotSpotVMTypeEntryIsUnsignedOffset");
|
||||
typeEntrySizeOffset = getLongValueFromProcess("gHotSpotVMTypeEntrySizeOffset");
|
||||
typeEntryArrayStride = getLongValueFromProcess("gHotSpotVMTypeEntryArrayStride");
|
||||
|
||||
// Fetch the address of the VMTypeEntry*
|
||||
// Fetch the address of the VMTypeEntry*. We get this symbol first
|
||||
// and try to use it to make sure that symbol lookup is working.
|
||||
Address entryAddr = lookupInProcess("gHotSpotVMTypes");
|
||||
// System.err.println("gHotSpotVMTypes address = " + entryAddr);
|
||||
// Dereference this once to get the pointer to the first VMTypeEntry
|
||||
@ -118,6 +111,14 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase {
|
||||
throw new RuntimeException("gHotSpotVMTypes was not initialized properly in the remote process; can not continue");
|
||||
}
|
||||
|
||||
typeEntryTypeNameOffset = getLongValueFromProcess("gHotSpotVMTypeEntryTypeNameOffset");
|
||||
typeEntrySuperclassNameOffset = getLongValueFromProcess("gHotSpotVMTypeEntrySuperclassNameOffset");
|
||||
typeEntryIsOopTypeOffset = getLongValueFromProcess("gHotSpotVMTypeEntryIsOopTypeOffset");
|
||||
typeEntryIsIntegerTypeOffset = getLongValueFromProcess("gHotSpotVMTypeEntryIsIntegerTypeOffset");
|
||||
typeEntryIsUnsignedOffset = getLongValueFromProcess("gHotSpotVMTypeEntryIsUnsignedOffset");
|
||||
typeEntrySizeOffset = getLongValueFromProcess("gHotSpotVMTypeEntrySizeOffset");
|
||||
typeEntryArrayStride = getLongValueFromProcess("gHotSpotVMTypeEntryArrayStride");
|
||||
|
||||
// Start iterating down it until we find an entry with no name
|
||||
Address typeNameAddr = null;
|
||||
do {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2010, 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
|
||||
@ -122,10 +122,14 @@ public class COFFFileParser {
|
||||
private MemoizedObject[] sectionHeaders;
|
||||
private MemoizedObject[] symbols;
|
||||
|
||||
// Init stringTable at decl time since other fields init'ed in the
|
||||
// constructor need the String Table.
|
||||
private MemoizedObject stringTable = new MemoizedObject() {
|
||||
public Object computeValue() {
|
||||
// the String Table follows the Symbol Table
|
||||
int ptr = getPointerToSymbolTable();
|
||||
if (ptr == 0) {
|
||||
// no Symbol Table so no String Table
|
||||
return new StringTable(0);
|
||||
} else {
|
||||
return new StringTable(ptr + SYMBOL_SIZE * getNumberOfSymbols());
|
||||
@ -140,6 +144,8 @@ public class COFFFileParser {
|
||||
timeDateStamp = readInt();
|
||||
pointerToSymbolTable = readInt();
|
||||
numberOfSymbols = readInt();
|
||||
// String Table can be accessed at this point because
|
||||
// pointerToSymbolTable and numberOfSymbols fields are set.
|
||||
sizeOfOptionalHeader = readShort();
|
||||
characteristics = readShort();
|
||||
|
||||
@ -222,6 +228,8 @@ public class COFFFileParser {
|
||||
private MemoizedObject windowsSpecificFields;
|
||||
private MemoizedObject dataDirectories;
|
||||
|
||||
// We use an offset of 2 because OptionalHeaderStandardFieldsImpl doesn't
|
||||
// include the 'magic' field.
|
||||
private static final int STANDARD_FIELDS_OFFSET = 2;
|
||||
private static final int PE32_WINDOWS_SPECIFIC_FIELDS_OFFSET = 28;
|
||||
private static final int PE32_DATA_DIRECTORIES_OFFSET = 96;
|
||||
@ -288,7 +296,7 @@ public class COFFFileParser {
|
||||
private int sizeOfUninitializedData;
|
||||
private int addressOfEntryPoint;
|
||||
private int baseOfCode;
|
||||
private int baseOfData;
|
||||
private int baseOfData; // only set in PE32
|
||||
|
||||
OptionalHeaderStandardFieldsImpl(int offset,
|
||||
boolean isPE32Plus) {
|
||||
@ -301,7 +309,8 @@ public class COFFFileParser {
|
||||
sizeOfUninitializedData = readInt();
|
||||
addressOfEntryPoint = readInt();
|
||||
baseOfCode = readInt();
|
||||
if (isPE32Plus) {
|
||||
if (!isPE32Plus) {
|
||||
// only available in PE32
|
||||
baseOfData = readInt();
|
||||
}
|
||||
}
|
||||
@ -433,7 +442,10 @@ public class COFFFileParser {
|
||||
if (dir.getRVA() == 0 || dir.getSize() == 0) {
|
||||
return null;
|
||||
}
|
||||
return new ExportDirectoryTableImpl(rvaToFileOffset(dir.getRVA()), dir.getSize());
|
||||
// ExportDirectoryTableImpl needs both the RVA and the
|
||||
// RVA converted to a file offset.
|
||||
return new
|
||||
ExportDirectoryTableImpl(dir.getRVA(), dir.getSize());
|
||||
}
|
||||
};
|
||||
|
||||
@ -526,6 +538,7 @@ public class COFFFileParser {
|
||||
}
|
||||
|
||||
class ExportDirectoryTableImpl implements ExportDirectoryTable {
|
||||
private int exportDataDirRVA;
|
||||
private int offset;
|
||||
private int size;
|
||||
|
||||
@ -548,8 +561,9 @@ public class COFFFileParser {
|
||||
private MemoizedObject exportOrdinalTable;
|
||||
private MemoizedObject exportAddressTable;
|
||||
|
||||
ExportDirectoryTableImpl(int offset, int size) {
|
||||
this.offset = offset;
|
||||
ExportDirectoryTableImpl(int exportDataDirRVA, int size) {
|
||||
this.exportDataDirRVA = exportDataDirRVA;
|
||||
offset = rvaToFileOffset(exportDataDirRVA);
|
||||
this.size = size;
|
||||
seek(offset);
|
||||
exportFlags = readInt();
|
||||
@ -595,6 +609,7 @@ public class COFFFileParser {
|
||||
|
||||
exportOrdinalTable = new MemoizedObject() {
|
||||
public Object computeValue() {
|
||||
// number of ordinals is same as the number of name pointers
|
||||
short[] ordinals = new short[getNumberOfNamePointers()];
|
||||
seek(rvaToFileOffset(getOrdinalTableRVA()));
|
||||
for (int i = 0; i < ordinals.length; i++) {
|
||||
@ -608,14 +623,18 @@ public class COFFFileParser {
|
||||
public Object computeValue() {
|
||||
int[] addresses = new int[getNumberOfAddressTableEntries()];
|
||||
seek(rvaToFileOffset(getExportAddressTableRVA()));
|
||||
// Must make two passes to avoid rvaToFileOffset
|
||||
// destroying seek() position
|
||||
// The Export Address Table values are a union of two
|
||||
// possible values:
|
||||
// Export RVA - The address of the exported symbol when
|
||||
// loaded into memory, relative to the image base.
|
||||
// This value doesn't get converted into a file offset.
|
||||
// Forwarder RVA - The pointer to a null-terminated ASCII
|
||||
// string in the export section. This value gets
|
||||
// converted into a file offset because we have to
|
||||
// fetch the string.
|
||||
for (int i = 0; i < addresses.length; i++) {
|
||||
addresses[i] = readInt();
|
||||
}
|
||||
for (int i = 0; i < addresses.length; i++) {
|
||||
addresses[i] = rvaToFileOffset(addresses[i]);
|
||||
}
|
||||
return addresses;
|
||||
}
|
||||
};
|
||||
@ -648,11 +667,12 @@ public class COFFFileParser {
|
||||
|
||||
public boolean isExportAddressForwarder(short ordinal) {
|
||||
int addr = getExportAddress(ordinal);
|
||||
return ((offset <= addr) && (addr < (offset + size)));
|
||||
return ((exportDataDirRVA <= addr) &&
|
||||
(addr < (exportDataDirRVA + size)));
|
||||
}
|
||||
|
||||
public String getExportAddressForwarder(short ordinal) {
|
||||
seek(getExportAddress(ordinal));
|
||||
seek(rvaToFileOffset(getExportAddress(ordinal)));
|
||||
return readCString();
|
||||
}
|
||||
|
||||
@ -3371,10 +3391,17 @@ public class COFFFileParser {
|
||||
throw new COFFException(e);
|
||||
}
|
||||
// Look up in string table
|
||||
// FIXME: this index value is assumed to be in the valid range
|
||||
name = getStringTable().get(index);
|
||||
} else {
|
||||
try {
|
||||
name = new String(tmpName, US_ASCII);
|
||||
int length = 0;
|
||||
// find last non-NULL
|
||||
for (; length < tmpName.length && tmpName[length] != '\0';) {
|
||||
length++;
|
||||
}
|
||||
// don't include NULL chars in returned name String
|
||||
name = new String(tmpName, 0, length, US_ASCII);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new COFFException(e);
|
||||
}
|
||||
@ -3487,6 +3514,7 @@ public class COFFFileParser {
|
||||
tmpName[5] << 16 |
|
||||
tmpName[6] << 8 |
|
||||
tmpName[7]);
|
||||
// FIXME: stringOffset is assumed to be in the valid range
|
||||
name = getStringTable().getAtOffset(stringOffset);
|
||||
}
|
||||
|
||||
@ -3698,12 +3726,13 @@ public class COFFFileParser {
|
||||
|
||||
StringTable(int offset) {
|
||||
if (offset == 0) {
|
||||
// no String Table
|
||||
strings = new COFFString[0];
|
||||
return;
|
||||
}
|
||||
|
||||
seek(offset);
|
||||
int length = readInt();
|
||||
int length = readInt(); // length includes itself
|
||||
byte[] data = new byte[length - 4];
|
||||
int numBytesRead = readBytes(data);
|
||||
if (numBytesRead != data.length) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2010, 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
|
||||
@ -37,35 +37,48 @@ public class DumpExports {
|
||||
|
||||
String filename = args[0];
|
||||
COFFFile file = COFFFileParser.getParser().parse(filename);
|
||||
ExportDirectoryTable exports =
|
||||
file.getHeader().
|
||||
getOptionalHeader().
|
||||
getDataDirectories().
|
||||
getExportDirectoryTable();
|
||||
|
||||
// get common point for both things we want to dump
|
||||
OptionalHeaderDataDirectories dataDirs = file.getHeader().getOptionalHeader().
|
||||
getDataDirectories();
|
||||
|
||||
// dump the header data directory for the Export Table:
|
||||
DataDirectory dir = dataDirs.getExportTable();
|
||||
System.out.println("Export table: RVA = " + dir.getRVA() + "/0x" +
|
||||
Integer.toHexString(dir.getRVA()) + ", size = " + dir.getSize() + "/0x" +
|
||||
Integer.toHexString(dir.getSize()));
|
||||
|
||||
System.out.println(file.getHeader().getNumberOfSections() + " sections in file");
|
||||
for (int i = 1; i <= file.getHeader().getNumberOfSections(); i++) {
|
||||
SectionHeader sec = file.getHeader().getSectionHeader(i);
|
||||
System.out.println(" Section " + i + ":");
|
||||
System.out.println(" Name = '" + sec.getName() + "'");
|
||||
System.out.println(" VirtualSize = " + sec.getSize() + "/0x" +
|
||||
Integer.toHexString(sec.getSize()));
|
||||
System.out.println(" VirtualAddress = " + sec.getVirtualAddress() + "/0x" +
|
||||
Integer.toHexString(sec.getVirtualAddress()));
|
||||
System.out.println(" SizeOfRawData = " + sec.getSizeOfRawData() + "/0x" +
|
||||
Integer.toHexString(sec.getSizeOfRawData()));
|
||||
System.out.println(" PointerToRawData = " + sec.getPointerToRawData() + "/0x" +
|
||||
Integer.toHexString(sec.getPointerToRawData()));
|
||||
}
|
||||
|
||||
ExportDirectoryTable exports = dataDirs.getExportDirectoryTable();
|
||||
if (exports == null) {
|
||||
System.out.println("No exports found.");
|
||||
} else {
|
||||
System.out.println(file.getHeader().getNumberOfSections() + " sections in file");
|
||||
for (int i = 0; i < file.getHeader().getNumberOfSections(); i++) {
|
||||
System.out.println(" Section " + i + ": " + file.getHeader().getSectionHeader(1 + i).getName());
|
||||
}
|
||||
|
||||
DataDirectory dir = file.getHeader().getOptionalHeader().getDataDirectories().getExportTable();
|
||||
System.out.println("Export table: RVA = 0x" + Integer.toHexString(dir.getRVA()) +
|
||||
", size = 0x" + Integer.toHexString(dir.getSize()));
|
||||
|
||||
System.out.println("DLL name: " + exports.getDLLName());
|
||||
System.out.println("Time/date stamp 0x" + Integer.toHexString(exports.getTimeDateStamp()));
|
||||
System.out.println("Major version 0x" + Integer.toHexString(exports.getMajorVersion() & 0xFFFF));
|
||||
System.out.println("Minor version 0x" + Integer.toHexString(exports.getMinorVersion() & 0xFFFF));
|
||||
System.out.println(exports.getNumberOfNamePointers() + " functions found");
|
||||
System.out.println(exports.getNumberOfNamePointers() + " exports found");
|
||||
for (int i = 0; i < exports.getNumberOfNamePointers(); i++) {
|
||||
System.out.println(" 0x" +
|
||||
Integer.toHexString(exports.getExportAddress(exports.getExportOrdinal(i))) +
|
||||
" " +
|
||||
(exports.isExportAddressForwarder(exports.getExportOrdinal(i)) ?
|
||||
("Forwarded to " + exports.getExportAddressForwarder(exports.getExportOrdinal(i))) :
|
||||
exports.getExportName(i)));
|
||||
short ordinal = exports.getExportOrdinal(i);
|
||||
System.out.print("[" + i + "] '" + exports.getExportName(i) + "': [" +
|
||||
ordinal + "] = 0x" + Integer.toHexString(exports.getExportAddress(ordinal)));
|
||||
System.out.println(exports.isExportAddressForwarder(ordinal)
|
||||
? " Forwarded to '" + exports.getExportAddressForwarder(ordinal) + "'"
|
||||
: "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2010, 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
|
||||
@ -42,8 +42,8 @@ public class TestParser {
|
||||
COFFHeader header = file.getHeader();
|
||||
int numSections = header.getNumberOfSections();
|
||||
System.out.println(numSections + " sections detected.");
|
||||
for (int i = 0; i < numSections; i++) {
|
||||
SectionHeader secHeader = header.getSectionHeader(1 + i);
|
||||
for (int i = 1; i <= numSections; i++) {
|
||||
SectionHeader secHeader = header.getSectionHeader(i);
|
||||
System.out.println(secHeader.getName());
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2010, 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
|
||||
@ -506,7 +506,6 @@ public class WindbgDebuggerLocal extends DebuggerBase implements WindbgDebugger
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
|
||||
private static String DTFWHome;
|
||||
private static String imagePath;
|
||||
private static String symbolPath;
|
||||
private static boolean useNativeLookup;
|
||||
@ -514,81 +513,143 @@ public class WindbgDebuggerLocal extends DebuggerBase implements WindbgDebugger
|
||||
static {
|
||||
|
||||
/*
|
||||
* sawindbg.dll depends on dbgeng.dll which
|
||||
* itself depends on dbghelp.dll. dbgeng.dll and dbghelp.dll.
|
||||
* On systems newer than Windows 2000, these two .dlls are
|
||||
* in the standard system directory so we will find them there.
|
||||
* On Windows 2000 and earlier, these files do not exist.
|
||||
* The user must download Debugging Tools For Windows (DTFW)
|
||||
* and install it in order to use SA.
|
||||
* sawindbg.dll depends on dbgeng.dll which itself depends on
|
||||
* dbghelp.dll. We have to make sure that the dbgeng.dll and
|
||||
* dbghelp.dll that we load are compatible with each other. We
|
||||
* load both of those libraries from the same directory based
|
||||
* on the theory that co-located libraries are compatible.
|
||||
*
|
||||
* We have to make sure we use the two files from the same directory
|
||||
* in case there are more than one copy on the system because
|
||||
* one version of dbgeng.dll might not be compatible with a
|
||||
* different version of dbghelp.dll.
|
||||
* We first look for them in the directory pointed at by
|
||||
* env. var. DEBUGGINGTOOLSFORWINDOWS, next in the default
|
||||
* installation dir for DTFW, and lastly in the standard
|
||||
* system directory. We expect that that we will find
|
||||
* them in the standard system directory on all systems
|
||||
* newer than Windows 2000.
|
||||
* On Windows 2000 and earlier, dbgeng.dll and dbghelp.dll were
|
||||
* not included as part of the standard system directory. On
|
||||
* systems newer than Windows 2000, dbgeng.dll and dbghelp.dll
|
||||
* are included in the standard system directory. However, the
|
||||
* versions included in the standard system directory may not
|
||||
* be able to handle symbol information for the newer compilers.
|
||||
*
|
||||
* We search for and explicitly load the libraries using the
|
||||
* following directory search order:
|
||||
*
|
||||
* - java.home/bin (same as $JAVA_HOME/jre/bin)
|
||||
* - dir named by DEBUGGINGTOOLSFORWINDOWS environment variable
|
||||
* - various "Debugging Tools For Windows" program directories
|
||||
* - the system directory ($SYSROOT/system32)
|
||||
*
|
||||
* If SA is invoked with -Dsun.jvm.hotspot.loadLibrary.DEBUG=1,
|
||||
* then debug messages about library loading are printed to
|
||||
* System.err.
|
||||
*/
|
||||
String dirName = null;
|
||||
DTFWHome = System.getenv("DEBUGGINGTOOLSFORWINDOWS");
|
||||
|
||||
if (DTFWHome == null) {
|
||||
// See if we have the files in the default location.
|
||||
String sysRoot = System.getenv("SYSTEMROOT");
|
||||
DTFWHome = sysRoot + File.separator +
|
||||
".." + File.separator + "Program Files" +
|
||||
File.separator + "Debugging Tools For Windows";
|
||||
}
|
||||
String dbgengPath = null;
|
||||
String dbghelpPath = null;
|
||||
String sawindbgPath = null;
|
||||
List searchList = new ArrayList();
|
||||
|
||||
boolean loadLibraryDEBUG =
|
||||
System.getProperty("sun.jvm.hotspot.loadLibrary.DEBUG") != null;
|
||||
|
||||
{
|
||||
String dbghelp = DTFWHome + File.separator + "dbghelp.dll";
|
||||
String dbgeng = DTFWHome + File.separator + "dbgeng.dll";
|
||||
File fhelp = new File(dbghelp);
|
||||
File feng = new File(dbgeng);
|
||||
if (fhelp.exists() && feng.exists()) {
|
||||
// found both, we are happy.
|
||||
// NOTE: The order of loads is important! If we load dbgeng.dll
|
||||
// first, then the dependency - dbghelp.dll - will be loaded
|
||||
// from usual DLL search thereby defeating the purpose!
|
||||
System.load(dbghelp);
|
||||
System.load(dbgeng);
|
||||
} else if (! fhelp.exists() && ! feng.exists()) {
|
||||
// neither exist. We will ignore this dir and assume
|
||||
// they are in the system dir.
|
||||
DTFWHome = null;
|
||||
} else {
|
||||
// one exists but not the other
|
||||
//System.err.println("Error: Both files dbghelp.dll and dbgeng.dll "
|
||||
// "must exist in directory " + DTFWHome);
|
||||
throw new UnsatisfiedLinkError("Both files dbghelp.dll and " +
|
||||
"dbgeng.dll must exist in " +
|
||||
"directory " + DTFWHome);
|
||||
}
|
||||
}
|
||||
if (DTFWHome == null) {
|
||||
// The files better be in the system dir.
|
||||
String sysDir = System.getenv("SYSTEMROOT") +
|
||||
File.separator + "system32";
|
||||
// First place to search is co-located with sawindbg.dll in
|
||||
// $JAVA_HOME/jre/bin (java.home property is set to $JAVA_HOME/jre):
|
||||
searchList.add(System.getProperty("java.home") + File.separator + "bin");
|
||||
sawindbgPath = (String) searchList.get(0) + File.separator +
|
||||
"sawindbg.dll";
|
||||
|
||||
File feng = new File(sysDir + File.separator + "dbgeng.dll");
|
||||
if (!feng.exists()) {
|
||||
throw new UnsatisfiedLinkError("File dbgeng.dll does not exist in " +
|
||||
sysDir + ". Please search microsoft.com " +
|
||||
"for Debugging Tools For Windows, and " +
|
||||
"either download it to the default " +
|
||||
"location, or download it to a custom " +
|
||||
"location and set environment variable " +
|
||||
" DEBUGGINGTOOLSFORWINDOWS " +
|
||||
"to the pathname of that location.");
|
||||
// second place to search is specified by an environment variable:
|
||||
String DTFWHome = System.getenv("DEBUGGINGTOOLSFORWINDOWS");
|
||||
if (DTFWHome != null) {
|
||||
searchList.add(DTFWHome);
|
||||
}
|
||||
|
||||
// The third place to search is the install directory for the
|
||||
// "Debugging Tools For Windows" package; so far there are three
|
||||
// name variations that we know of:
|
||||
String sysRoot = System.getenv("SYSTEMROOT");
|
||||
DTFWHome = sysRoot + File.separator + ".." + File.separator +
|
||||
"Program Files" + File.separator + "Debugging Tools For Windows";
|
||||
searchList.add(DTFWHome);
|
||||
searchList.add(DTFWHome + " (x86)");
|
||||
searchList.add(DTFWHome + " (x64)");
|
||||
|
||||
// The last place to search is the system directory:
|
||||
searchList.add(sysRoot + File.separator + "system32");
|
||||
}
|
||||
|
||||
for (int i = 0; i < searchList.size(); i++) {
|
||||
File dir = new File((String) searchList.get(i));
|
||||
if (!dir.exists()) {
|
||||
if (loadLibraryDEBUG) {
|
||||
System.err.println("DEBUG: '" + searchList.get(i) +
|
||||
"': directory does not exist.");
|
||||
}
|
||||
// this search directory doesn't exist so skip it
|
||||
continue;
|
||||
}
|
||||
|
||||
dbgengPath = (String) searchList.get(i) + File.separator + "dbgeng.dll";
|
||||
dbghelpPath = (String) searchList.get(i) + File.separator + "dbghelp.dll";
|
||||
|
||||
File feng = new File(dbgengPath);
|
||||
File fhelp = new File(dbghelpPath);
|
||||
if (feng.exists() && fhelp.exists()) {
|
||||
// both files exist so we have a match
|
||||
break;
|
||||
}
|
||||
|
||||
// At least one of the files does not exist; no warning if both
|
||||
// don't exist. If just one doesn't exist then we don't check
|
||||
// loadLibraryDEBUG because we have a mis-configured system.
|
||||
if (feng.exists()) {
|
||||
System.err.println("WARNING: found '" + dbgengPath +
|
||||
"' but did not find '" + dbghelpPath + "'; ignoring '" +
|
||||
dbgengPath + "'.");
|
||||
} else if (fhelp.exists()) {
|
||||
System.err.println("WARNING: found '" + dbghelpPath +
|
||||
"' but did not find '" + dbgengPath + "'; ignoring '" +
|
||||
dbghelpPath + "'.");
|
||||
} else if (loadLibraryDEBUG) {
|
||||
System.err.println("DEBUG: searched '" + searchList.get(i) +
|
||||
"': dbgeng.dll and dbghelp.dll were not found.");
|
||||
}
|
||||
dbgengPath = null;
|
||||
dbghelpPath = null;
|
||||
}
|
||||
|
||||
if (dbgengPath == null || dbghelpPath == null) {
|
||||
// at least one of the files wasn't found anywhere we searched
|
||||
String mesg = null;
|
||||
|
||||
if (dbgengPath == null && dbghelpPath == null) {
|
||||
mesg = "dbgeng.dll and dbghelp.dll cannot be found. ";
|
||||
} else if (dbgengPath == null) {
|
||||
mesg = "dbgeng.dll cannot be found (dbghelp.dll was found). ";
|
||||
} else {
|
||||
mesg = "dbghelp.dll cannot be found (dbgeng.dll was found). ";
|
||||
}
|
||||
throw new UnsatisfiedLinkError(mesg +
|
||||
"Please search microsoft.com for 'Debugging Tools For Windows', " +
|
||||
"and either download it to the default location, or download it " +
|
||||
"to a custom location and set environment variable " +
|
||||
"'DEBUGGINGTOOLSFORWINDOWS' to the pathname of that location.");
|
||||
}
|
||||
|
||||
// NOTE: The order of loads is important! If we load dbgeng.dll
|
||||
// first, then the dependency - dbghelp.dll - will be loaded
|
||||
// from usual DLL search thereby defeating the purpose!
|
||||
if (loadLibraryDEBUG) {
|
||||
System.err.println("DEBUG: loading '" + dbghelpPath + "'.");
|
||||
}
|
||||
System.load(dbghelpPath);
|
||||
if (loadLibraryDEBUG) {
|
||||
System.err.println("DEBUG: loading '" + dbgengPath + "'.");
|
||||
}
|
||||
System.load(dbgengPath);
|
||||
|
||||
// Now, load sawindbg.dll
|
||||
System.loadLibrary("sawindbg");
|
||||
if (loadLibraryDEBUG) {
|
||||
System.err.println("DEBUG: loading '" + sawindbgPath + "'.");
|
||||
}
|
||||
System.load(sawindbgPath);
|
||||
|
||||
// where do I find '.exe', '.dll' files?
|
||||
imagePath = System.getProperty("sun.jvm.hotspot.debugger.windbg.imagePath");
|
||||
if (imagePath == null) {
|
||||
|
@ -60,10 +60,7 @@ public class ConstantPool extends Oop implements ClassConstants {
|
||||
headerSize = type.getSize();
|
||||
elementSize = 0;
|
||||
// fetch constants:
|
||||
MULTI_OPERAND_COUNT_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_multi_operand_count_offset").intValue();
|
||||
MULTI_OPERAND_BASE_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_multi_operand_base_offset").intValue();
|
||||
INDY_BSM_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_indy_bsm_offset").intValue();
|
||||
INDY_NT_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_indy_nt_offset").intValue();
|
||||
INDY_ARGC_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_indy_argc_offset").intValue();
|
||||
INDY_ARGV_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_indy_argv_offset").intValue();
|
||||
}
|
||||
@ -83,10 +80,7 @@ public class ConstantPool extends Oop implements ClassConstants {
|
||||
private static long headerSize;
|
||||
private static long elementSize;
|
||||
|
||||
private static int MULTI_OPERAND_COUNT_OFFSET;
|
||||
private static int MULTI_OPERAND_BASE_OFFSET;
|
||||
private static int INDY_BSM_OFFSET;
|
||||
private static int INDY_NT_OFFSET;
|
||||
private static int INDY_ARGC_OFFSET;
|
||||
private static int INDY_ARGV_OFFSET;
|
||||
|
||||
@ -296,20 +290,23 @@ public class ConstantPool extends Oop implements ClassConstants {
|
||||
}
|
||||
|
||||
/** Lookup for multi-operand (InvokeDynamic) entries. */
|
||||
public int[] getMultiOperandsAt(int i) {
|
||||
public short[] getBootstrapSpecifierAt(int i) {
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(getTagAt(i).isInvokeDynamic(), "Corrupted constant pool");
|
||||
}
|
||||
int pos = this.getIntAt(i);
|
||||
int countPos = pos + MULTI_OPERAND_COUNT_OFFSET; // == pos-1
|
||||
int basePos = pos + MULTI_OPERAND_BASE_OFFSET; // == pos
|
||||
if (countPos < 0) return null; // safety first
|
||||
if (getTagAt(i).value() == JVM_CONSTANT_InvokeDynamicTrans)
|
||||
return null;
|
||||
int bsmSpec = extractLowShortFromInt(this.getIntAt(i));
|
||||
TypeArray operands = getOperands();
|
||||
if (operands == null) return null; // safety first
|
||||
int length = operands.getIntAt(countPos);
|
||||
int[] values = new int[length];
|
||||
for (int j = 0; j < length; j++) {
|
||||
values[j] = operands.getIntAt(basePos+j);
|
||||
int basePos = VM.getVM().buildIntFromShorts(operands.getShortAt(bsmSpec * 2 + 0),
|
||||
operands.getShortAt(bsmSpec * 2 + 1));
|
||||
int argv = basePos + INDY_ARGV_OFFSET;
|
||||
int argc = operands.getShortAt(basePos + INDY_ARGC_OFFSET);
|
||||
int endPos = argv + argc;
|
||||
short[] values = new short[endPos - basePos];
|
||||
for (int j = 0; j < values.length; j++) {
|
||||
values[j] = operands.getShortAt(basePos+j);
|
||||
}
|
||||
return values;
|
||||
}
|
||||
@ -334,6 +331,7 @@ public class ConstantPool extends Oop implements ClassConstants {
|
||||
case JVM_CONSTANT_MethodHandle: return "JVM_CONSTANT_MethodHandle";
|
||||
case JVM_CONSTANT_MethodType: return "JVM_CONSTANT_MethodType";
|
||||
case JVM_CONSTANT_InvokeDynamic: return "JVM_CONSTANT_InvokeDynamic";
|
||||
case JVM_CONSTANT_InvokeDynamicTrans: return "JVM_CONSTANT_InvokeDynamic/transitional";
|
||||
case JVM_CONSTANT_Invalid: return "JVM_CONSTANT_Invalid";
|
||||
case JVM_CONSTANT_UnresolvedClass: return "JVM_CONSTANT_UnresolvedClass";
|
||||
case JVM_CONSTANT_UnresolvedClassInError: return "JVM_CONSTANT_UnresolvedClassInError";
|
||||
@ -393,6 +391,7 @@ public class ConstantPool extends Oop implements ClassConstants {
|
||||
case JVM_CONSTANT_MethodHandle:
|
||||
case JVM_CONSTANT_MethodType:
|
||||
case JVM_CONSTANT_InvokeDynamic:
|
||||
case JVM_CONSTANT_InvokeDynamicTrans:
|
||||
visitor.doInt(new IntField(new NamedFieldIdentifier(nameForTag(ctag)), indexOffset(index), true), true);
|
||||
break;
|
||||
}
|
||||
@ -556,19 +555,16 @@ public class ConstantPool extends Oop implements ClassConstants {
|
||||
break;
|
||||
}
|
||||
|
||||
case JVM_CONSTANT_InvokeDynamicTrans:
|
||||
case JVM_CONSTANT_InvokeDynamic: {
|
||||
dos.writeByte(cpConstType);
|
||||
int[] values = getMultiOperandsAt(ci);
|
||||
for (int vn = 0; vn < values.length; vn++) {
|
||||
dos.writeShort(values[vn]);
|
||||
}
|
||||
int bootstrapMethodIndex = values[INDY_BSM_OFFSET];
|
||||
int nameAndTypeIndex = values[INDY_NT_OFFSET];
|
||||
int argumentCount = values[INDY_ARGC_OFFSET];
|
||||
assert(INDY_ARGV_OFFSET + argumentCount == values.length);
|
||||
if (DEBUG) debugMessage("CP[" + ci + "] = indy BSM = " + bootstrapMethodIndex
|
||||
+ ", N&T = " + nameAndTypeIndex
|
||||
+ ", argc = " + argumentCount);
|
||||
int value = getIntAt(ci);
|
||||
short bsmIndex = (short) extractLowShortFromInt(value);
|
||||
short nameAndTypeIndex = (short) extractHighShortFromInt(value);
|
||||
dos.writeShort(bsmIndex);
|
||||
dos.writeShort(nameAndTypeIndex);
|
||||
if (DEBUG) debugMessage("CP[" + ci + "] = indy BSM = " + bsmIndex
|
||||
+ ", N&T = " + nameAndTypeIndex);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -321,13 +321,16 @@ public class ClassWriter implements /* imports */ ClassConstants
|
||||
break;
|
||||
}
|
||||
|
||||
case JVM_CONSTANT_InvokeDynamicTrans:
|
||||
case JVM_CONSTANT_InvokeDynamic: {
|
||||
dos.writeByte(cpConstType);
|
||||
int[] values = cpool.getMultiOperandsAt(ci);
|
||||
for (int vn = 0; vn < values.length; vn++) {
|
||||
dos.writeShort(values[vn]);
|
||||
}
|
||||
if (DEBUG) debugMessage("CP[" + ci + "] = INDY indexes = " + Arrays.toString(values));
|
||||
int value = cpool.getIntAt(ci);
|
||||
short bsmIndex = (short) extractLowShortFromInt(value);
|
||||
short nameAndTypeIndex = (short) extractHighShortFromInt(value);
|
||||
dos.writeShort(bsmIndex);
|
||||
dos.writeShort(nameAndTypeIndex);
|
||||
if (DEBUG) debugMessage("CP[" + ci + "] = INDY bsm = " +
|
||||
bsmIndex + ", N&T = " + nameAndTypeIndex);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@ import sun.jvm.hotspot.asm.*;
|
||||
import sun.jvm.hotspot.asm.sparc.*;
|
||||
import sun.jvm.hotspot.asm.x86.*;
|
||||
import sun.jvm.hotspot.asm.ia64.*;
|
||||
import sun.jvm.hotspot.asm.amd64.*;
|
||||
import sun.jvm.hotspot.code.*;
|
||||
import sun.jvm.hotspot.compiler.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
@ -198,6 +199,8 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
cpuHelper = new SPARCHelper();
|
||||
} else if (cpu.equals("x86")) {
|
||||
cpuHelper = new X86Helper();
|
||||
} else if (cpu.equals("amd64")) {
|
||||
cpuHelper = new AMD64Helper();
|
||||
} else if (cpu.equals("ia64")) {
|
||||
cpuHelper = new IA64Helper();
|
||||
} else {
|
||||
@ -460,7 +463,8 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private String genListOfShort(int[] values) {
|
||||
private String genListOfShort(short[] values) {
|
||||
if (values == null || values.length == 0) return "";
|
||||
Formatter buf = new Formatter(genHTML);
|
||||
buf.append('[');
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
@ -594,9 +598,11 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
buf.cell(Integer.toString(cpool.getIntAt(index)));
|
||||
break;
|
||||
|
||||
case JVM_CONSTANT_InvokeDynamicTrans:
|
||||
case JVM_CONSTANT_InvokeDynamic:
|
||||
buf.cell("JVM_CONSTANT_InvokeDynamic");
|
||||
buf.cell(genListOfShort(cpool.getMultiOperandsAt(index)));
|
||||
buf.cell(genLowHighShort(cpool.getIntAt(index)) +
|
||||
genListOfShort(cpool.getBootstrapSpecifierAt(index)));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -40,7 +40,7 @@ public class ConstantTag {
|
||||
private static int JVM_CONSTANT_NameAndType = 12;
|
||||
private static int JVM_CONSTANT_MethodHandle = 15; // JSR 292
|
||||
private static int JVM_CONSTANT_MethodType = 16; // JSR 292
|
||||
// static int JVM_CONSTANT_InvokeDynamicTrans = 17; // JSR 292, only occurs in old class files
|
||||
private static int JVM_CONSTANT_InvokeDynamicTrans = 17; // JSR 292, only occurs in old class files
|
||||
private static int JVM_CONSTANT_InvokeDynamic = 18; // JSR 292
|
||||
private static int JVM_CONSTANT_Invalid = 0; // For bad value initialization
|
||||
private static int JVM_CONSTANT_UnresolvedClass = 100; // Temporary tag until actual use
|
||||
@ -67,6 +67,8 @@ public class ConstantTag {
|
||||
this.tag = tag;
|
||||
}
|
||||
|
||||
public int value() { return tag; }
|
||||
|
||||
public boolean isKlass() { return tag == JVM_CONSTANT_Class; }
|
||||
public boolean isField () { return tag == JVM_CONSTANT_Fieldref; }
|
||||
public boolean isMethod() { return tag == JVM_CONSTANT_Methodref; }
|
||||
@ -81,6 +83,7 @@ public class ConstantTag {
|
||||
public boolean isMethodHandle() { return tag == JVM_CONSTANT_MethodHandle; }
|
||||
public boolean isMethodType() { return tag == JVM_CONSTANT_MethodType; }
|
||||
public boolean isInvokeDynamic() { return tag == JVM_CONSTANT_InvokeDynamic; }
|
||||
public boolean isInvokeDynamicTrans() { return tag == JVM_CONSTANT_InvokeDynamicTrans; }
|
||||
|
||||
public boolean isInvalid() { return tag == JVM_CONSTANT_Invalid; }
|
||||
|
||||
|
@ -124,7 +124,7 @@ SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
||||
BUILDTREE_MAKE = $(GAMMADIR)/make/$(OS_FAMILY)/makefiles/buildtree.make
|
||||
|
||||
BUILDTREE_TARGETS = Makefile flags.make flags_vm.make vm.make adlc.make jvmti.make sa.make \
|
||||
env.sh env.csh .dbxrc test_gamma
|
||||
env.sh env.csh jdkpath.sh .dbxrc test_gamma
|
||||
|
||||
BUILDTREE_VARS = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OS_FAMILY) \
|
||||
ARCH=$(ARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH) VARIANT=$(VARIANT)
|
||||
@ -318,6 +318,13 @@ env.csh: env.sh
|
||||
sed -n 's/^\([A-Za-z_][A-Za-z0-9_]*\)=/setenv \1 /p' $?; \
|
||||
) > $@
|
||||
|
||||
jdkpath.sh: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo "JDK=${JAVA_HOME}"; \
|
||||
) > $@
|
||||
|
||||
.dbxrc: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
|
@ -168,7 +168,9 @@ endif
|
||||
|
||||
# Locate all source files in the given directory, excluding files in Src_Files_EXCLUDE.
|
||||
define findsrc
|
||||
$(notdir $(shell find $(1) \( -name \*.c -o -name \*.cpp -o -name \*.s \) -a \! \( -name DUMMY $(addprefix -o -name ,$(Src_Files_EXCLUDE)) \) ))
|
||||
$(notdir $(shell find $(1)/. ! -name . -prune \
|
||||
-a \( -name \*.c -o -name \*.cpp -o -name \*.s \) \
|
||||
-a ! \( -name DUMMY $(addprefix -o -name ,$(Src_Files_EXCLUDE)) \)))
|
||||
endef
|
||||
|
||||
Src_Files := $(foreach e,$(Src_Dirs),$(call findsrc,$(e)))
|
||||
|
@ -117,7 +117,7 @@ SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
||||
BUILDTREE_MAKE = $(GAMMADIR)/make/$(OS_FAMILY)/makefiles/buildtree.make
|
||||
|
||||
BUILDTREE_TARGETS = Makefile flags.make flags_vm.make vm.make adlc.make jvmti.make sa.make \
|
||||
env.ksh env.csh .dbxrc test_gamma
|
||||
env.ksh env.csh jdkpath.sh .dbxrc test_gamma
|
||||
|
||||
BUILDTREE_VARS = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OS_FAMILY) \
|
||||
ARCH=$(ARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH) VARIANT=$(VARIANT)
|
||||
@ -314,6 +314,13 @@ env.csh: env.ksh
|
||||
sed -n 's/^\([A-Za-z_][A-Za-z0-9_]*\)=/setenv \1 /p' $?; \
|
||||
) > $@
|
||||
|
||||
jdkpath.sh: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo "JDK=${JAVA_HOME}"; \
|
||||
) > $@
|
||||
|
||||
.dbxrc: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
|
@ -184,7 +184,9 @@ endif
|
||||
|
||||
# Locate all source files in the given directory, excluding files in Src_Files_EXCLUDE.
|
||||
define findsrc
|
||||
$(notdir $(shell find $(1) \( -name \*.c -o -name \*.cpp -o -name \*.s \) -a \! \( -name DUMMY $(addprefix -o -name ,$(Src_Files_EXCLUDE)) \) ))
|
||||
$(notdir $(shell find $(1)/. ! -name . -prune \
|
||||
-a \( -name \*.c -o -name \*.cpp -o -name \*.s \) \
|
||||
-a ! \( -name DUMMY $(addprefix -o -name ,$(Src_Files_EXCLUDE)) \)))
|
||||
endef
|
||||
|
||||
Src_Files := $(foreach e,$(Src_Dirs),$(call findsrc,$(e)))
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2000, 2010, 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
|
||||
@ -45,6 +45,9 @@ fi
|
||||
echo "EXPORTS" > vm1.def
|
||||
|
||||
AWK="$MKS_HOME/awk.exe"
|
||||
if [ ! -e $AWK ]; then
|
||||
AWK="$MKS_HOME/gawk.exe"
|
||||
fi
|
||||
GREP="$MKS_HOME/grep.exe"
|
||||
SORT="$MKS_HOME/sort.exe"
|
||||
UNIQ="$MKS_HOME/uniq.exe"
|
||||
@ -57,7 +60,7 @@ if [ "x$1" != "x" ]; then
|
||||
LINK_VER="$1"
|
||||
fi
|
||||
|
||||
if [ "x$LINK_VER" != "x800" -a "x$LINK_VER" != "x900" ]; then
|
||||
if [ "x$LINK_VER" != "x800" -a "x$LINK_VER" != "x900" -a "x$LINK_VER" != "x1000" ]; then
|
||||
$DUMPBIN /symbols *.obj | "$GREP" "??_7.*@@6B@" | "$GREP" -v "type_info" | "$AWK" '{print $7}' | "$SORT" | "$UNIQ" > vm2.def
|
||||
else
|
||||
# Can't use pipes when calling cl.exe or link.exe from IDE. Using transit file vm3.def
|
||||
|
@ -36,6 +36,20 @@ REM
|
||||
REM Note: Running this batch file from the Windows command shell requires
|
||||
REM that "grep" be accessible on the PATH. An MKS install does this.
|
||||
REM
|
||||
|
||||
cl 2>NUL >NUL
|
||||
if %errorlevel% == 0 goto nexttest
|
||||
echo Make sure cl.exe is in your PATH before running this script.
|
||||
goto end
|
||||
|
||||
:nexttest
|
||||
grep -V 2>NUL >NUL
|
||||
if %errorlevel% == 0 goto testit
|
||||
echo Make sure grep.exe is in your PATH before running this script. Either cygwin or MKS should work.
|
||||
goto end
|
||||
|
||||
|
||||
:testit
|
||||
cl 2>&1 | grep "IA-64" >NUL
|
||||
if %errorlevel% == 0 goto isia64
|
||||
cl 2>&1 | grep "AMD64" >NUL
|
||||
@ -44,37 +58,40 @@ set ARCH=x86
|
||||
set BUILDARCH=i486
|
||||
set Platform_arch=x86
|
||||
set Platform_arch_model=x86_32
|
||||
goto end
|
||||
goto done
|
||||
:amd64
|
||||
set ARCH=x86
|
||||
set BUILDARCH=amd64
|
||||
set Platform_arch=x86
|
||||
set Platform_arch_model=x86_64
|
||||
goto end
|
||||
goto done
|
||||
:isia64
|
||||
set ARCH=ia64
|
||||
set BUILDARCH=ia64
|
||||
set Platform_arch=ia64
|
||||
set Platform_arch_model=ia64
|
||||
:end
|
||||
:done
|
||||
|
||||
setlocal
|
||||
|
||||
if "%1" == "" goto usage
|
||||
|
||||
if not "%4" == "" goto usage
|
||||
if not "%2" == "" goto usage
|
||||
|
||||
REM Set HotSpotWorkSpace to the directy two steps above this script
|
||||
for %%i in ("%~dp0..") do ( set HotSpotWorkSpace=%%~dpi)
|
||||
set HotSpotBuildRoot=%HotSpotWorkSpace%build
|
||||
set HotSpotBuildSpace=%HotSpotBuildRoot%\vs
|
||||
set HotSpotJDKDist=%1
|
||||
|
||||
set HotSpotWorkSpace=%1
|
||||
set HotSpotBuildSpace=%2
|
||||
set HotSpotJDKDist=%3
|
||||
|
||||
REM figure out MSC version
|
||||
for /F %%i in ('sh %HotSpotWorkSpace%/make/windows/get_msc_ver.sh') do set %%i
|
||||
|
||||
echo **************************************************************
|
||||
set ProjectFile=vm.vcproj
|
||||
set ProjectFile=jvm.vcproj
|
||||
if "%MSC_VER%" == "1200" (
|
||||
set ProjectFile=vm.dsp
|
||||
set ProjectFile=jvm.dsp
|
||||
echo Will generate VC6 project {unsupported}
|
||||
) else (
|
||||
if "%MSC_VER%" == "1400" (
|
||||
@ -83,10 +100,16 @@ echo Will generate VC8 {Visual Studio 2005}
|
||||
if "%MSC_VER%" == "1500" (
|
||||
echo Will generate VC9 {Visual Studio 2008}
|
||||
) else (
|
||||
if "%MSC_VER%" == "1600" (
|
||||
echo Detected Visual Studio 2010, but
|
||||
echo will generate VC9 {Visual Studio 2008}
|
||||
echo Use conversion wizard in VS 2010.
|
||||
) else (
|
||||
echo Will generate VC7 project {Visual Studio 2003 .NET}
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
echo %ProjectFile%
|
||||
echo **************************************************************
|
||||
|
||||
@ -118,6 +141,8 @@ goto usage
|
||||
|
||||
:test3
|
||||
if not "%HOTSPOTMKSHOME%" == "" goto makedir
|
||||
if exist c:\cygwin\bin set HOTSPOTMKSHOME=c:\cygwin\bin
|
||||
if not "%HOTSPOTMKSHOME%" == "" goto makedir
|
||||
echo Warning: please set variable HOTSPOTMKSHOME to place where
|
||||
echo your MKS/Cygwin installation is
|
||||
echo.
|
||||
@ -133,21 +158,24 @@ echo HotSpotJDKDist=%HotSpotJDKDist%
|
||||
REM This is now safe to do.
|
||||
:copyfiles
|
||||
for /D %%i in (compiler1, compiler2, tiered, core, kernel) do (
|
||||
if NOT EXIST %HotSpotBuildSpace%\%%i mkdir %HotSpotBuildSpace%\%%i
|
||||
copy %HotSpotWorkSpace%\make\windows\projectfiles\%%i\* %HotSpotBuildSpace%\%%i\ > NUL
|
||||
if NOT EXIST %HotSpotBuildSpace%\%%i\generated mkdir %HotSpotBuildSpace%\%%i\generated
|
||||
copy %HotSpotWorkSpace%\make\windows\projectfiles\%%i\* %HotSpotBuildSpace%\%%i\generated > NUL
|
||||
)
|
||||
|
||||
REM force regneration of ProjectFile
|
||||
if exist %HotSpotBuildSpace%\%ProjectFile% del %HotSpotBuildSpace%\%ProjectFile%
|
||||
|
||||
for /D %%i in (compiler1, compiler2, tiered, core, kernel) do (
|
||||
|
||||
echo # Generated file! > %HotSpotBuildSpace%\%%i\local.make
|
||||
echo -- %%i --
|
||||
echo # Generated file! > %HotSpotBuildSpace%\%%i\local.make
|
||||
echo # Changing a variable below and then deleting %ProjectFile% will cause >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo # %ProjectFile% to be regenerated with the new values. Changing the >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo # version requires rerunning create.bat. >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo # version requires rerunning create.bat. >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo. >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo Variant=%%i >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo WorkSpace=%HotSpotWorkSpace% >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo HOTSPOTWORKSPACE=%HotSpotWorkSpace% >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo HOTSPOTBUILDROOT=%HotSpotBuildRoot% >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo HOTSPOTBUILDSPACE=%HotSpotBuildSpace% >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo HOTSPOTJDKDIST=%HotSpotJDKDist% >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo ARCH=%ARCH% >> %HotSpotBuildSpace%\%%i\local.make
|
||||
@ -155,42 +183,35 @@ echo BUILDARCH=%BUILDARCH% >> %HotSpotBuildSpace%\%%i\local.m
|
||||
echo Platform_arch=%Platform_arch% >> %HotSpotBuildSpace%\%%i\local.make
|
||||
echo Platform_arch_model=%Platform_arch_model% >> %HotSpotBuildSpace%\%%i\local.make
|
||||
|
||||
pushd %HotSpotBuildSpace%\%%i
|
||||
for /D %%j in (debug, fastdebug, product) do (
|
||||
if NOT EXIST %HotSpotBuildSpace%\%%i\%%j mkdir %HotSpotBuildSpace%\%%i\%%j
|
||||
)
|
||||
|
||||
pushd %HotSpotBuildSpace%\%%i\generated
|
||||
nmake /nologo
|
||||
popd
|
||||
|
||||
)
|
||||
|
||||
pushd %HotSpotBuildSpace%
|
||||
pushd %HotSpotBuildRoot%
|
||||
|
||||
echo # Generated file! > local.make
|
||||
echo # Changing a variable below and then deleting %ProjectFile% will cause >> local.make
|
||||
echo # %ProjectFile% to be regenerated with the new values. Changing the >> local.make
|
||||
echo # version requires rerunning create.bat. >> local.make
|
||||
echo. >> local.make
|
||||
echo HOTSPOTWORKSPACE=%HotSpotWorkSpace% >> local.make
|
||||
echo HOTSPOTBUILDSPACE=%HotSpotBuildSpace% >> local.make
|
||||
echo HOTSPOTJDKDIST=%HotSpotJDKDist% >> local.make
|
||||
echo ARCH=%ARCH% >> local.make
|
||||
echo BUILDARCH=%BUILDARCH% >> local.make
|
||||
echo Platform_arch=%Platform_arch% >> local.make
|
||||
echo Platform_arch_model=%Platform_arch_model% >> local.make
|
||||
|
||||
nmake /nologo /F %HotSpotWorkSpace%/make/windows/projectfiles/common/Makefile %HotSpotBuildSpace%/%ProjectFile%
|
||||
REM It doesn't matter which variant we use here, "compiler1" is as good as any of the others - we need the common variables
|
||||
nmake /nologo /F %HotSpotWorkSpace%/make/windows/projectfiles/common/Makefile LOCAL_MAKE=%HotSpotBuildSpace%\compiler1\local.make %HotSpotBuildRoot%/%ProjectFile%
|
||||
|
||||
popd
|
||||
|
||||
goto end
|
||||
|
||||
:usage
|
||||
echo Usage: create HotSpotWorkSpace HotSpotBuildSpace HotSpotJDKDist
|
||||
echo Usage: create HotSpotJDKDist
|
||||
echo.
|
||||
echo This is the interactive build setup script (as opposed to the batch
|
||||
echo build execution script). It creates HotSpotBuildSpace if necessary,
|
||||
echo copies the appropriate files out of HotSpotWorkSpace into it, and
|
||||
echo This is the VS build setup script (as opposed to the batch
|
||||
echo build execution script). It creates a build directory if necessary,
|
||||
echo copies the appropriate files out of the workspace into it, and
|
||||
echo builds and runs ProjectCreator in it. This has the side-effect of creating
|
||||
echo the %ProjectFile% file in the build space, which is then used in Visual C++.
|
||||
echo The HotSpotJDKDist defines place where JVM binaries should be placed.
|
||||
echo.
|
||||
echo The HotSpotJDKDist defines the JDK that should be used when running the JVM.
|
||||
echo Environment variable FORCE_MSC_VER allows to override MSVC version autodetection.
|
||||
echo.
|
||||
echo NOTE that it is now NOT safe to modify any of the files in the build
|
||||
|
@ -107,8 +107,12 @@ case "${Platform_arch_model}" in
|
||||
"x86_64") Src_Files_EXCLUDE="${Src_Files_EXCLUDE} *x86_32*" ;;
|
||||
esac
|
||||
|
||||
# Locate all source files in the given directory, excluding files in Src_Files_EXCLUDE.
|
||||
function findsrc {
|
||||
$FIND ${1} \( -name \*.c -o -name \*.cpp -o -name \*.s \) -a \! \( -name ${Src_Files_EXCLUDE// / -o -name } \) | sed 's/.*\/\(.*\)/\1/';
|
||||
$FIND ${1}/. ! -name . -prune \
|
||||
-a \( -name \*.c -o -name \*.cpp -o -name \*.s \) \
|
||||
-a \! \( -name ${Src_Files_EXCLUDE// / -o -name } \) \
|
||||
| sed 's/.*\/\(.*\)/\1/';
|
||||
}
|
||||
|
||||
Src_Files=
|
||||
|
@ -22,7 +22,6 @@
|
||||
#
|
||||
#
|
||||
|
||||
!include $(WorkSpace)/make/windows/makefiles/compile.make
|
||||
|
||||
# Rules for building adlc.exe
|
||||
|
||||
@ -46,15 +45,7 @@ ADLCFLAGS=-q -T -D_LP64
|
||||
ADLCFLAGS=-q -T -U_LP64
|
||||
!endif
|
||||
|
||||
CPP_FLAGS=$(CPP_FLAGS) \
|
||||
/D TARGET_OS_FAMILY_windows \
|
||||
/D TARGET_ARCH_$(Platform_arch) \
|
||||
/D TARGET_ARCH_MODEL_$(Platform_arch_model) \
|
||||
/D TARGET_OS_ARCH_windows_$(Platform_arch) \
|
||||
/D TARGET_OS_ARCH_MODEL_windows_$(Platform_arch_model) \
|
||||
/D TARGET_COMPILER_visCPP
|
||||
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D _CRT_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_DEPRECATE
|
||||
ADLC_CPP_FLAGS=$(CPP_FLAGS) /D _CRT_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
CPP_INCLUDE_DIRS=\
|
||||
/I "..\generated" \
|
||||
@ -92,10 +83,10 @@ GENERATED_NAMES_IN_DIR=\
|
||||
$(AdlcOutDir)\dfa_$(Platform_arch_model).cpp
|
||||
|
||||
{$(WorkSpace)\src\share\vm\adlc}.cpp.obj::
|
||||
$(CPP) $(CPP_FLAGS) $(EXH_FLAGS) $(CPP_INCLUDE_DIRS) /c $<
|
||||
$(CPP) $(ADLC_CPP_FLAGS) $(EXH_FLAGS) $(CPP_INCLUDE_DIRS) /c $<
|
||||
|
||||
{$(WorkSpace)\src\share\vm\opto}.cpp.obj::
|
||||
$(CPP) $(CPP_FLAGS) $(EXH_FLAGS) $(CPP_INCLUDE_DIRS) /c $<
|
||||
$(CPP) $(ADLC_CPP_FLAGS) $(EXH_FLAGS) $(CPP_INCLUDE_DIRS) /c $<
|
||||
|
||||
adlc.exe: main.obj adlparse.obj archDesc.obj arena.obj dfa.obj dict2.obj filebuff.obj \
|
||||
forms.obj formsopt.obj formssel.obj opcodes.obj output_c.obj output_h.obj
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 1997, 2010, 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
|
||||
@ -80,6 +80,20 @@ CPP_FLAGS=$(CPP_FLAGS) /D "IA32"
|
||||
CPP=ARCH_ERROR
|
||||
!endif
|
||||
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D "WIN32" /D "_WINDOWS"
|
||||
|
||||
# Must specify this for sharedRuntimeTrig.cpp
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D "VM_LITTLE_ENDIAN"
|
||||
|
||||
# Used for platform dispatching
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_OS_FAMILY_windows
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_ARCH_$(Platform_arch)
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_ARCH_MODEL_$(Platform_arch_model)
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_OS_ARCH_windows_$(Platform_arch)
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_OS_ARCH_MODEL_windows_$(Platform_arch_model)
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_COMPILER_visCPP
|
||||
|
||||
|
||||
# MSC_VER is a 4 digit number that tells us what compiler is being used
|
||||
# and is generated when the local.make file is created by build.make
|
||||
# via the script get_msc_ver.sh
|
||||
|
@ -26,7 +26,6 @@ HS_INTERNAL_NAME=jvm
|
||||
HS_FNAME=$(HS_INTERNAL_NAME).dll
|
||||
AOUT=$(HS_FNAME)
|
||||
SAWINDBG=sawindbg.dll
|
||||
LAUNCHER_NAME=hotspot.exe
|
||||
GENERATED=../generated
|
||||
|
||||
# Allow the user to turn off precompiled headers from the command line.
|
||||
@ -34,7 +33,7 @@ GENERATED=../generated
|
||||
BUILD_PCH_FILE=_build_pch_file.obj
|
||||
!endif
|
||||
|
||||
default:: $(BUILD_PCH_FILE) $(AOUT) $(LAUNCHER_NAME) checkAndBuildSA
|
||||
default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA
|
||||
|
||||
!include ../local.make
|
||||
!include compile.make
|
||||
@ -49,8 +48,10 @@ HS_BUILD_ID=$(HS_BUILD_VER)-debug
|
||||
# Force resources to be rebuilt every time
|
||||
$(Res_Files): FORCE
|
||||
|
||||
$(AOUT): $(Res_Files) $(Obj_Files)
|
||||
vm.def: $(Obj_Files)
|
||||
sh $(WorkSpace)/make/windows/build_vm_def.sh
|
||||
|
||||
$(AOUT): $(Res_Files) $(Obj_Files) vm.def
|
||||
$(LINK) @<<
|
||||
$(LINK_FLAGS) /out:$@ /implib:$*.lib /def:vm.def $(Obj_Files) $(Res_Files)
|
||||
<<
|
||||
|
@ -26,7 +26,6 @@ HS_INTERNAL_NAME=jvm
|
||||
HS_FNAME=$(HS_INTERNAL_NAME).dll
|
||||
AOUT=$(HS_FNAME)
|
||||
SAWINDBG=sawindbg.dll
|
||||
LAUNCHER_NAME=hotspot.exe
|
||||
GENERATED=../generated
|
||||
|
||||
# Allow the user to turn off precompiled headers from the command line.
|
||||
@ -34,7 +33,7 @@ GENERATED=../generated
|
||||
BUILD_PCH_FILE=_build_pch_file.obj
|
||||
!endif
|
||||
|
||||
default:: $(BUILD_PCH_FILE) $(AOUT) $(LAUNCHER_NAME) checkAndBuildSA
|
||||
default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA
|
||||
|
||||
!include ../local.make
|
||||
!include compile.make
|
||||
@ -49,8 +48,10 @@ HS_BUILD_ID=$(HS_BUILD_VER)-fastdebug
|
||||
# Force resources to be rebuilt every time
|
||||
$(Res_Files): FORCE
|
||||
|
||||
$(AOUT): $(Res_Files) $(Obj_Files)
|
||||
vm.def: $(Obj_Files)
|
||||
sh $(WorkSpace)/make/windows/build_vm_def.sh
|
||||
|
||||
$(AOUT): $(Res_Files) $(Obj_Files) vm.def
|
||||
$(LINK) @<<
|
||||
$(LINK_FLAGS) /out:$@ /implib:$*.lib /def:vm.def $(Obj_Files) $(Res_Files)
|
||||
<<
|
||||
|
@ -51,6 +51,7 @@ classes/ProjectCreator.class: $(ProjectCreatorSources)
|
||||
|
||||
!if ("$(Variant)" == "compiler2") || ("$(Variant)" == "tiered")
|
||||
|
||||
!include $(WorkSpace)/make/windows/makefiles/compile.make
|
||||
!include $(WorkSpace)/make/windows/makefiles/adlc.make
|
||||
|
||||
!endif
|
||||
|
@ -22,7 +22,8 @@
|
||||
#
|
||||
#
|
||||
|
||||
LAUNCHER_FLAGS=$(ARCHFLAG) \
|
||||
|
||||
LAUNCHER_FLAGS=$(CPP_FLAGS) $(ARCHFLAG) \
|
||||
/D FULL_VERSION=\"$(HOTSPOT_RELEASE_VERSION)\" \
|
||||
/D JDK_MAJOR_VERSION=\"$(JDK_MAJOR_VERSION)\" \
|
||||
/D JDK_MINOR_VERSION=\"$(JDK_MINOR_VERSION)\" \
|
||||
@ -32,9 +33,11 @@ LAUNCHER_FLAGS=$(ARCHFLAG) \
|
||||
/D _CRT_SECURE_NO_DEPRECATE \
|
||||
/D LINK_INTO_LIBJVM \
|
||||
/I $(WorkSpace)\src\os\windows\launcher \
|
||||
/I $(WorkSpace)\src\share\tools\launcher
|
||||
|
||||
CPP_FLAGS=$(CPP_FLAGS) $(LAUNCHER_FLAGS)
|
||||
/I $(WorkSpace)\src\share\tools\launcher \
|
||||
/I $(WorkSpace)\src\share\vm\prims \
|
||||
/I $(WorkSpace)\src\share\vm \
|
||||
/I $(WorkSpace)\src\cpu\$(Platform_arch)\vm \
|
||||
/I $(WorkSpace)\src\os\windows\vm
|
||||
|
||||
LINK_FLAGS=/manifest $(HS_INTERNAL_NAME).lib kernel32.lib user32.lib /nologo /machine:$(MACHINE) /map /debug /subsystem:console
|
||||
|
||||
@ -46,22 +49,23 @@ BUFFEROVERFLOWLIB = bufferoverflowU.lib
|
||||
LINK_FLAGS = $(LINK_FLAGS) $(BUFFEROVERFLOWLIB)
|
||||
!endif
|
||||
|
||||
LAUNCHERDIR = $(GAMMADIR)/src/os/windows/launcher
|
||||
LAUNCHERDIR_SHARE = $(GAMMADIR)/src/share/tools/launcher
|
||||
LAUNCHERDIR = $(WorkSpace)/src/os/windows/launcher
|
||||
LAUNCHERDIR_SHARE = $(WorkSpace)/src/share/tools/launcher
|
||||
|
||||
OUTDIR = launcher
|
||||
|
||||
{$(LAUNCHERDIR)}.c{$(OUTDIR)}.obj:
|
||||
-mkdir $(OUTDIR)
|
||||
$(CPP) $(CPP_FLAGS) /c /Fo$@ $<
|
||||
-mkdir $(OUTDIR) 2>NUL >NUL
|
||||
$(CPP) $(LAUNCHER_FLAGS) /c /Fo$@ $<
|
||||
|
||||
{$(LAUNCHERDIR_SHARE)}.c{$(OUTDIR)}.obj:
|
||||
-mkdir $(OUTDIR)
|
||||
$(CPP) $(CPP_FLAGS) /c /Fo$@ $<
|
||||
-mkdir $(OUTDIR) 2>NUL >NUL
|
||||
$(CPP) $(LAUNCHER_FLAGS) /c /Fo$@ $<
|
||||
|
||||
$(OUTDIR)\*.obj: $(LAUNCHERDIR)\*.c $(LAUNCHERDIR)\*.h $(LAUNCHERDIR_SHARE)\*.c $(LAUNCHERDIR_SHARE)\*.h
|
||||
|
||||
$(LAUNCHER_NAME): $(OUTDIR)\java.obj $(OUTDIR)\java_md.obj $(OUTDIR)\jli_util.obj
|
||||
$(LINK) $(LINK_FLAGS) /out:$@ $**
|
||||
launcher: $(OUTDIR)\java.obj $(OUTDIR)\java_md.obj $(OUTDIR)\jli_util.obj
|
||||
echo $(JAVA_HOME) > jdkpath.txt
|
||||
$(LINK) $(LINK_FLAGS) /out:hotspot.exe $**
|
||||
|
||||
|
||||
|
@ -25,7 +25,6 @@
|
||||
HS_INTERNAL_NAME=jvm
|
||||
HS_FNAME=$(HS_INTERNAL_NAME).dll
|
||||
AOUT=$(HS_FNAME)
|
||||
LAUNCHER_NAME=hotspot.exe
|
||||
GENERATED=../generated
|
||||
|
||||
# Allow the user to turn off precompiled headers from the command line.
|
||||
@ -33,7 +32,7 @@ GENERATED=../generated
|
||||
BUILD_PCH_FILE=_build_pch_file.obj
|
||||
!endif
|
||||
|
||||
default:: $(BUILD_PCH_FILE) $(AOUT) $(LAUNCHER_NAME) checkAndBuildSA
|
||||
default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA
|
||||
|
||||
!include ../local.make
|
||||
!include compile.make
|
||||
@ -59,8 +58,10 @@ $(AOUT): $(Res_Files) $(Obj_Files)
|
||||
$(LINK_FLAGS) /out:$@ /implib:$*.lib $(Obj_Files) $(Res_Files)
|
||||
<<
|
||||
!else
|
||||
$(AOUT): $(Res_Files) $(Obj_Files)
|
||||
vm.def: $(Obj_Files)
|
||||
sh $(WorkSpace)/make/windows/build_vm_def.sh
|
||||
|
||||
$(AOUT): $(Res_Files) $(Obj_Files) vm.def
|
||||
$(LINK) @<<
|
||||
$(LINK_FLAGS) /out:$@ /implib:$*.lib /def:vm.def $(Obj_Files) $(Res_Files)
|
||||
<<
|
||||
|
@ -84,11 +84,12 @@ ProjectCreatorIDEOptions=\
|
||||
-buildBase $(HOTSPOTBUILDSPACE)\%f\%b \
|
||||
-startAt src \
|
||||
-compiler $(VcVersion) \
|
||||
-projectFileName $(HOTSPOTBUILDSPACE)\$(ProjectFile) \
|
||||
-projectFileName $(HOTSPOTBUILDROOT)\$(ProjectFile) \
|
||||
-jdkTargetRoot $(HOTSPOTJDKDIST) \
|
||||
-define ALIGN_STACK_FRAMES \
|
||||
-define VM_LITTLE_ENDIAN \
|
||||
-prelink "" "Generating vm.def..." "cd $(HOTSPOTBUILDSPACE)\%f\%b set HOTSPOTMKSHOME=$(HOTSPOTMKSHOME) $(HOTSPOTMKSHOME)\sh $(HOTSPOTWORKSPACE)\make\windows\build_vm_def.sh $(LINK_VER)" \
|
||||
-postbuild "" "Building hotspot.exe..." "cd $(HOTSPOTBUILDSPACE)\%f\%b set HOTSPOTMKSHOME=$(HOTSPOTMKSHOME) nmake -f $(HOTSPOTWORKSPACE)\make\windows\projectfiles\common\Makefile LOCAL_MAKE=$(HOTSPOTBUILDSPACE)\%f\local.make JAVA_HOME=$(HOTSPOTJDKDIST) launcher" \
|
||||
-ignoreFile jsig.c \
|
||||
-ignoreFile jvmtiEnvRecommended.cpp \
|
||||
-ignoreFile jvmtiEnvStub.cpp \
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2003, 2010, 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
|
||||
@ -48,7 +48,7 @@ BOOT_TARGET_CLASS_VERSION=6
|
||||
JAVAC_FLAGS=-g -encoding ascii
|
||||
BOOTSTRAP_JAVAC_FLAGS=$(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION)
|
||||
|
||||
ProjectFile=vm.vcproj
|
||||
ProjectFile=jvm.vcproj
|
||||
|
||||
!if "$(MSC_VER)" == "1200"
|
||||
|
||||
@ -63,6 +63,11 @@ VcVersion=VC8
|
||||
|
||||
VcVersion=VC9
|
||||
|
||||
!elseif "$(MSC_VER)" == "1600"
|
||||
|
||||
# for compatibility - we don't yet have a ProjectCreator for VC10
|
||||
VcVersion=VC9
|
||||
|
||||
!else
|
||||
|
||||
VcVersion=VC7
|
||||
|
@ -71,22 +71,11 @@ CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_BUILD_TARGET=\"$(BUILD_FLAVOR)\""
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_BUILD_USER=\"$(BuildUser)\""
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_VM_DISTRO=\"$(HOTSPOT_VM_DISTRO)\""
|
||||
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D "WIN32" /D "_WINDOWS" $(CPP_INCLUDE_DIRS)
|
||||
|
||||
# Must specify this for sharedRuntimeTrig.cpp
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D "VM_LITTLE_ENDIAN"
|
||||
CPP_FLAGS=$(CPP_FLAGS) $(CPP_INCLUDE_DIRS)
|
||||
|
||||
# Define that so jni.h is on correct side
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D "_JNI_IMPLEMENTATION_"
|
||||
|
||||
# Used for platform dispatching
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_OS_FAMILY_windows
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_ARCH_$(Platform_arch)
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_ARCH_MODEL_$(Platform_arch_model)
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_OS_ARCH_windows_$(Platform_arch)
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_OS_ARCH_MODEL_windows_$(Platform_arch_model)
|
||||
CPP_FLAGS=$(CPP_FLAGS) /D TARGET_COMPILER_visCPP
|
||||
|
||||
!if "$(BUILDARCH)" == "ia64"
|
||||
STACK_SIZE="/STACK:1048576,262144"
|
||||
!else
|
||||
@ -104,6 +93,8 @@ AGCT_EXPORT=/export:AsyncGetCallTrace
|
||||
!endif
|
||||
!endif
|
||||
|
||||
# If you modify exports below please do the corresponding changes in
|
||||
# src/share/tools/ProjectCreator/WinGammaPlatformVC7.java
|
||||
LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \
|
||||
/export:JNI_GetDefaultJavaVMInitArgs \
|
||||
/export:JNI_CreateJavaVM \
|
||||
|
@ -22,7 +22,10 @@
|
||||
#
|
||||
#
|
||||
|
||||
!include local.make
|
||||
!ifdef LOCAL_MAKE
|
||||
!include $(LOCAL_MAKE)
|
||||
!endif
|
||||
|
||||
|
||||
WorkSpace=$(HOTSPOTWORKSPACE)
|
||||
|
||||
@ -34,11 +37,18 @@ BootStrapDir=$(BOOTDIR)
|
||||
!else
|
||||
!ifdef JAVA_HOME
|
||||
BootStrapDir=$(JAVA_HOME)
|
||||
!else
|
||||
!ifdef HOTSPOTJDKDIST
|
||||
BootStrapDir=$(HOTSPOTJDKDIST)
|
||||
!endif
|
||||
!endif
|
||||
!endif
|
||||
!endif
|
||||
|
||||
|
||||
|
||||
!include $(HOTSPOTWORKSPACE)/make/windows/makefiles/projectcreator.make
|
||||
!include $(WorkSpace)/make/windows/makefiles/compile.make
|
||||
|
||||
# Pick up rules for building JVMTI (JSR-163)
|
||||
JvmtiOutDir=$(HOTSPOTBUILDSPACE)\$(Variant)\generated\jvmtifiles
|
||||
@ -56,6 +66,9 @@ Platform=$(HOTSPOTWORKSPACE)/make/windows/platform_$(BUILDARCH)
|
||||
!include $(HOTSPOTWORKSPACE)/make/windows/makefiles/adlc.make
|
||||
!endif
|
||||
|
||||
HS_INTERNAL_NAME=jvm
|
||||
!include $(HOTSPOTWORKSPACE)/make/windows/makefiles/launcher.make
|
||||
|
||||
default:: $(AdditionalTargets) $(JvmtiGeneratedFiles)
|
||||
|
||||
!include $(HOTSPOTWORKSPACE)/make/hotspot_version
|
||||
@ -97,7 +110,7 @@ ProjectCreatorIDEOptions = $(ProjectCreatorIDEOptions) \
|
||||
-define JRE_RELEASE_VERSION=\\\"$(JRE_RELEASE_VERSION)\\\" \
|
||||
-define HOTSPOT_VM_DISTRO=\\\"$(HOTSPOT_VM_DISTRO)\\\"
|
||||
|
||||
$(HOTSPOTBUILDSPACE)/$(ProjectFile): local.make $(HOTSPOTBUILDSPACE)/classes/ProjectCreator.class
|
||||
$(HOTSPOTBUILDROOT)/$(ProjectFile): $(HOTSPOTBUILDSPACE)/classes/ProjectCreator.class
|
||||
@$(RUN_JAVA) -Djava.class.path=$(HOTSPOTBUILDSPACE)/classes ProjectCreator WinGammaPlatform$(VcVersion) $(ProjectCreatorIDEOptions)
|
||||
|
||||
clean:
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 1999, 2010, 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 +22,6 @@
|
||||
#
|
||||
#
|
||||
|
||||
Variant=compiler1
|
||||
!include local.make
|
||||
!include ../local.make
|
||||
|
||||
!include $(HOTSPOTWORKSPACE)/make/windows/projectfiles/common/Makefile
|
||||
|
@ -2,6 +2,6 @@
|
||||
; This .DEF file is a placeholder for one which is automatically
|
||||
; generated during the build process. See
|
||||
; make\windows\build_vm_def.sh and
|
||||
; make\windows\makefiles\makedeps.make (esp. the "-prelink"
|
||||
; make\windows\makefiles\projectcreator.make (esp. the "-prelink"
|
||||
; options).
|
||||
;
|
||||
|
@ -22,8 +22,7 @@
|
||||
#
|
||||
#
|
||||
|
||||
Variant=compiler2
|
||||
!include local.make
|
||||
!include ../local.make
|
||||
AdlcOutDir=$(HOTSPOTBUILDSPACE)\$(Variant)\generated\adfiles
|
||||
AdditionalTargets=$(AdlcOutDir)\ad_$(Platform_arch_model).cpp $(AdlcOutDir)\dfa_$(Platform_arch_model).cpp
|
||||
|
||||
|
@ -2,6 +2,6 @@
|
||||
; This .DEF file is a placeholder for one which is automatically
|
||||
; generated during the build process. See
|
||||
; make\windows\build_vm_def.sh and
|
||||
; make\windows\makefiles\makedeps.make (esp. the "-prelink"
|
||||
; make\windows\makefiles\projectcreator.make (esp. the "-prelink"
|
||||
; options).
|
||||
;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 1998, 2010, 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 +22,6 @@
|
||||
#
|
||||
#
|
||||
|
||||
Variant=core
|
||||
!include local.make
|
||||
!include ../local.make
|
||||
|
||||
!include $(HOTSPOTWORKSPACE)/make/windows/projectfiles/common/Makefile
|
||||
|
@ -2,6 +2,6 @@
|
||||
; This .DEF file is a placeholder for one which is automatically
|
||||
; generated during the build process. See
|
||||
; make\windows\build_vm_def.sh and
|
||||
; make\windows\makefiles\makedeps.make (esp. the "-prelink"
|
||||
; make\windows\makefiles\projectcreator.make (esp. the "-prelink"
|
||||
; options).
|
||||
;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2007, 2010 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 +22,6 @@
|
||||
#
|
||||
#
|
||||
|
||||
Variant=kernel
|
||||
!include local.make
|
||||
!include ../local.make
|
||||
|
||||
!include $(HOTSPOTWORKSPACE)/make/windows/projectfiles/common/Makefile
|
||||
|
@ -2,6 +2,6 @@
|
||||
; This .DEF file is a placeholder for one which is automatically
|
||||
; generated during the build process. See
|
||||
; make\windows\build_vm_def.sh and
|
||||
; make\windows\makefiles\makedeps.make (esp. the "-prelink"
|
||||
; make\windows\makefiles\projectcreator.make (esp. the "-prelink"
|
||||
; options).
|
||||
;
|
||||
|
@ -22,8 +22,7 @@
|
||||
#
|
||||
#
|
||||
|
||||
Variant=tiered
|
||||
!include local.make
|
||||
!include ../local.make
|
||||
AdlcOutDir=$(HOTSPOTBUILDSPACE)\$(Variant)\generated\adfiles
|
||||
AdditionalTargets=$(AdlcOutDir)\ad_$(Platform_arch_model).cpp $(AdlcOutDir)\dfa_$(Platform_arch_model).cpp
|
||||
|
||||
|
@ -2,6 +2,6 @@
|
||||
; This .DEF file is a placeholder for one which is automatically
|
||||
; generated during the build process. See
|
||||
; make\windows\build_vm_def.sh and
|
||||
; make\windows\makefiles\makedeps.make (esp. the "-prelink"
|
||||
; make\windows\makefiles\projectcreator.make (esp. the "-prelink"
|
||||
; options).
|
||||
;
|
||||
|
@ -909,10 +909,10 @@ void MacroAssembler::verify_thread() {
|
||||
#if defined(COMPILER2) && !defined(_LP64)
|
||||
// Save & restore possible 64-bit Long arguments in G-regs
|
||||
sllx(L0,32,G2); // Move old high G1 bits high in G2
|
||||
sllx(G1, 0,G1); // Clear current high G1 bits
|
||||
srl(G1, 0,G1); // Clear current high G1 bits
|
||||
or3 (G1,G2,G1); // Recover 64-bit G1
|
||||
sllx(L6,32,G2); // Move old high G4 bits high in G2
|
||||
sllx(G4, 0,G4); // Clear current high G4 bits
|
||||
srl(G4, 0,G4); // Clear current high G4 bits
|
||||
or3 (G4,G2,G4); // Recover 64-bit G4
|
||||
#endif
|
||||
restore(O0, 0, G2_thread);
|
||||
@ -1443,6 +1443,45 @@ void MacroAssembler::set64(jlong value, Register d, Register tmp) {
|
||||
}
|
||||
}
|
||||
|
||||
int MacroAssembler::size_of_set64(jlong value) {
|
||||
v9_dep();
|
||||
|
||||
int hi = (int)(value >> 32);
|
||||
int lo = (int)(value & ~0);
|
||||
int count = 0;
|
||||
|
||||
// (Matcher::isSimpleConstant64 knows about the following optimizations.)
|
||||
if (Assembler::is_simm13(lo) && value == lo) {
|
||||
count++;
|
||||
} else if (hi == 0) {
|
||||
count++;
|
||||
if (low10(lo) != 0)
|
||||
count++;
|
||||
}
|
||||
else if (hi == -1) {
|
||||
count += 2;
|
||||
}
|
||||
else if (lo == 0) {
|
||||
if (Assembler::is_simm13(hi)) {
|
||||
count++;
|
||||
} else {
|
||||
count++;
|
||||
if (low10(hi) != 0)
|
||||
count++;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
else {
|
||||
count += 2;
|
||||
if (low10(hi) != 0)
|
||||
count++;
|
||||
if (low10(lo) != 0)
|
||||
count++;
|
||||
count += 2;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
// compute size in bytes of sparc frame, given
|
||||
// number of extraWords
|
||||
int MacroAssembler::total_frame_size_in_bytes(int extraWords) {
|
||||
|
@ -1621,6 +1621,10 @@ public:
|
||||
|
||||
void sub( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||
void sub( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||
|
||||
// Note: offset is added to s2.
|
||||
inline void sub(Register s1, RegisterOrConstant s2, Register d, int offset = 0);
|
||||
|
||||
void subcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||
void subcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||
void subc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||
@ -1798,6 +1802,7 @@ class MacroAssembler: public Assembler {
|
||||
// branches that use right instruction for v8 vs. v9
|
||||
inline void br( Condition c, bool a, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
|
||||
inline void br( Condition c, bool a, Predict p, Label& L );
|
||||
|
||||
inline void fb( Condition c, bool a, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
|
||||
inline void fb( Condition c, bool a, Predict p, Label& L );
|
||||
|
||||
@ -1894,6 +1899,9 @@ public:
|
||||
void patchable_set(intptr_t value, Register d);
|
||||
void set64(jlong value, Register d, Register tmp);
|
||||
|
||||
// Compute size of set64.
|
||||
static int size_of_set64(jlong value);
|
||||
|
||||
// sign-extend 32 to 64
|
||||
inline void signx( Register s, Register d ) { sra( s, G0, d); }
|
||||
inline void signx( Register d ) { sra( d, G0, d); }
|
||||
|
@ -328,6 +328,11 @@ inline void Assembler::stcsr( int crd, Register s1, int simm13a) { v8_only();
|
||||
inline void Assembler::stdcq( int crd, Register s1, Register s2) { v8_only(); emit_long( op(ldst_op) | fcn(crd) | op3(stdcq_op3) | rs1(s1) | rs2(s2) ); }
|
||||
inline void Assembler::stdcq( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stdcq_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||
|
||||
inline void Assembler::sub(Register s1, RegisterOrConstant s2, Register d, int offset) {
|
||||
if (s2.is_register()) sub(s1, s2.as_register(), d);
|
||||
else { sub(s1, s2.as_constant() + offset, d); offset = 0; }
|
||||
if (offset != 0) sub(d, offset, d);
|
||||
}
|
||||
|
||||
// pp 231
|
||||
|
||||
|
@ -434,7 +434,7 @@ void G1PreBarrierStub::emit_code(LIR_Assembler* ce) {
|
||||
|
||||
Register pre_val_reg = pre_val()->as_register();
|
||||
|
||||
ce->mem2reg(addr(), pre_val(), T_OBJECT, patch_code(), info(), false);
|
||||
ce->mem2reg(addr(), pre_val(), T_OBJECT, patch_code(), info(), false /*wide*/, false /*unaligned*/);
|
||||
if (__ is_in_wdisp16_range(_continuation)) {
|
||||
__ br_on_reg_cond(Assembler::rc_z, /*annul*/false, Assembler::pt,
|
||||
pre_val_reg, _continuation);
|
||||
|
@ -155,4 +155,7 @@
|
||||
static bool is_caller_save_register (LIR_Opr reg);
|
||||
static bool is_caller_save_register (Register r);
|
||||
|
||||
static int nof_caller_save_cpu_regs() { return pd_nof_caller_save_cpu_regs_frame_map; }
|
||||
static int last_cpu_reg() { return pd_last_cpu_reg; }
|
||||
|
||||
#endif // CPU_SPARC_VM_C1_FRAMEMAP_SPARC_HPP
|
||||
|
@ -100,6 +100,11 @@ bool LIR_Assembler::is_single_instruction(LIR_Op* op) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (UseCompressedOops) {
|
||||
if (dst->is_address() && !dst->is_stack() && (dst->type() == T_OBJECT || dst->type() == T_ARRAY)) return false;
|
||||
if (src->is_address() && !src->is_stack() && (src->type() == T_OBJECT || src->type() == T_ARRAY)) return false;
|
||||
}
|
||||
|
||||
if (dst->is_register()) {
|
||||
if (src->is_address() && Assembler::is_simm13(src->as_address_ptr()->disp())) {
|
||||
return !PatchALot;
|
||||
@ -253,7 +258,7 @@ void LIR_Assembler::emit_string_compare(LIR_Opr left, LIR_Opr right, LIR_Opr dst
|
||||
int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position
|
||||
int count_offset = java_lang_String:: count_offset_in_bytes();
|
||||
|
||||
__ ld_ptr(str0, value_offset, tmp0);
|
||||
__ load_heap_oop(str0, value_offset, tmp0);
|
||||
__ ld(str0, offset_offset, tmp2);
|
||||
__ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0);
|
||||
__ ld(str0, count_offset, str0);
|
||||
@ -262,7 +267,7 @@ void LIR_Assembler::emit_string_compare(LIR_Opr left, LIR_Opr right, LIR_Opr dst
|
||||
// str1 may be null
|
||||
add_debug_info_for_null_check_here(info);
|
||||
|
||||
__ ld_ptr(str1, value_offset, tmp1);
|
||||
__ load_heap_oop(str1, value_offset, tmp1);
|
||||
__ add(tmp0, tmp2, tmp0);
|
||||
|
||||
__ ld(str1, offset_offset, tmp2);
|
||||
@ -766,7 +771,7 @@ void LIR_Assembler::ic_call(LIR_OpJavaCall* op) {
|
||||
|
||||
void LIR_Assembler::vtable_call(LIR_OpJavaCall* op) {
|
||||
add_debug_info_for_null_check_here(op->info());
|
||||
__ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), G3_scratch);
|
||||
__ load_klass(O0, G3_scratch);
|
||||
if (__ is_simm13(op->vtable_offset())) {
|
||||
__ ld_ptr(G3_scratch, op->vtable_offset(), G5_method);
|
||||
} else {
|
||||
@ -780,138 +785,17 @@ void LIR_Assembler::vtable_call(LIR_OpJavaCall* op) {
|
||||
// the peephole pass fills the delay slot
|
||||
}
|
||||
|
||||
|
||||
// load with 32-bit displacement
|
||||
int LIR_Assembler::load(Register s, int disp, Register d, BasicType ld_type, CodeEmitInfo *info) {
|
||||
int load_offset = code_offset();
|
||||
if (Assembler::is_simm13(disp)) {
|
||||
if (info != NULL) add_debug_info_for_null_check_here(info);
|
||||
switch(ld_type) {
|
||||
case T_BOOLEAN: // fall through
|
||||
case T_BYTE : __ ldsb(s, disp, d); break;
|
||||
case T_CHAR : __ lduh(s, disp, d); break;
|
||||
case T_SHORT : __ ldsh(s, disp, d); break;
|
||||
case T_INT : __ ld(s, disp, d); break;
|
||||
case T_ADDRESS:// fall through
|
||||
case T_ARRAY : // fall through
|
||||
case T_OBJECT: __ ld_ptr(s, disp, d); break;
|
||||
default : ShouldNotReachHere();
|
||||
}
|
||||
} else {
|
||||
__ set(disp, O7);
|
||||
if (info != NULL) add_debug_info_for_null_check_here(info);
|
||||
load_offset = code_offset();
|
||||
switch(ld_type) {
|
||||
case T_BOOLEAN: // fall through
|
||||
case T_BYTE : __ ldsb(s, O7, d); break;
|
||||
case T_CHAR : __ lduh(s, O7, d); break;
|
||||
case T_SHORT : __ ldsh(s, O7, d); break;
|
||||
case T_INT : __ ld(s, O7, d); break;
|
||||
case T_ADDRESS:// fall through
|
||||
case T_ARRAY : // fall through
|
||||
case T_OBJECT: __ ld_ptr(s, O7, d); break;
|
||||
default : ShouldNotReachHere();
|
||||
}
|
||||
}
|
||||
if (ld_type == T_ARRAY || ld_type == T_OBJECT) __ verify_oop(d);
|
||||
return load_offset;
|
||||
}
|
||||
|
||||
|
||||
// store with 32-bit displacement
|
||||
void LIR_Assembler::store(Register value, Register base, int offset, BasicType type, CodeEmitInfo *info) {
|
||||
if (Assembler::is_simm13(offset)) {
|
||||
if (info != NULL) add_debug_info_for_null_check_here(info);
|
||||
switch (type) {
|
||||
case T_BOOLEAN: // fall through
|
||||
case T_BYTE : __ stb(value, base, offset); break;
|
||||
case T_CHAR : __ sth(value, base, offset); break;
|
||||
case T_SHORT : __ sth(value, base, offset); break;
|
||||
case T_INT : __ stw(value, base, offset); break;
|
||||
case T_ADDRESS:// fall through
|
||||
case T_ARRAY : // fall through
|
||||
case T_OBJECT: __ st_ptr(value, base, offset); break;
|
||||
default : ShouldNotReachHere();
|
||||
}
|
||||
} else {
|
||||
__ set(offset, O7);
|
||||
if (info != NULL) add_debug_info_for_null_check_here(info);
|
||||
switch (type) {
|
||||
case T_BOOLEAN: // fall through
|
||||
case T_BYTE : __ stb(value, base, O7); break;
|
||||
case T_CHAR : __ sth(value, base, O7); break;
|
||||
case T_SHORT : __ sth(value, base, O7); break;
|
||||
case T_INT : __ stw(value, base, O7); break;
|
||||
case T_ADDRESS:// fall through
|
||||
case T_ARRAY : //fall through
|
||||
case T_OBJECT: __ st_ptr(value, base, O7); break;
|
||||
default : ShouldNotReachHere();
|
||||
}
|
||||
}
|
||||
// Note: Do the store before verification as the code might be patched!
|
||||
if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(value);
|
||||
}
|
||||
|
||||
|
||||
// load float with 32-bit displacement
|
||||
void LIR_Assembler::load(Register s, int disp, FloatRegister d, BasicType ld_type, CodeEmitInfo *info) {
|
||||
FloatRegisterImpl::Width w;
|
||||
switch(ld_type) {
|
||||
case T_FLOAT : w = FloatRegisterImpl::S; break;
|
||||
case T_DOUBLE: w = FloatRegisterImpl::D; break;
|
||||
default : ShouldNotReachHere();
|
||||
}
|
||||
|
||||
if (Assembler::is_simm13(disp)) {
|
||||
if (info != NULL) add_debug_info_for_null_check_here(info);
|
||||
if (disp % BytesPerLong != 0 && w == FloatRegisterImpl::D) {
|
||||
__ ldf(FloatRegisterImpl::S, s, disp + BytesPerWord, d->successor());
|
||||
__ ldf(FloatRegisterImpl::S, s, disp , d);
|
||||
} else {
|
||||
__ ldf(w, s, disp, d);
|
||||
}
|
||||
} else {
|
||||
__ set(disp, O7);
|
||||
if (info != NULL) add_debug_info_for_null_check_here(info);
|
||||
__ ldf(w, s, O7, d);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// store float with 32-bit displacement
|
||||
void LIR_Assembler::store(FloatRegister value, Register base, int offset, BasicType type, CodeEmitInfo *info) {
|
||||
FloatRegisterImpl::Width w;
|
||||
switch(type) {
|
||||
case T_FLOAT : w = FloatRegisterImpl::S; break;
|
||||
case T_DOUBLE: w = FloatRegisterImpl::D; break;
|
||||
default : ShouldNotReachHere();
|
||||
}
|
||||
|
||||
if (Assembler::is_simm13(offset)) {
|
||||
if (info != NULL) add_debug_info_for_null_check_here(info);
|
||||
if (w == FloatRegisterImpl::D && offset % BytesPerLong != 0) {
|
||||
__ stf(FloatRegisterImpl::S, value->successor(), base, offset + BytesPerWord);
|
||||
__ stf(FloatRegisterImpl::S, value , base, offset);
|
||||
} else {
|
||||
__ stf(w, value, base, offset);
|
||||
}
|
||||
} else {
|
||||
__ set(offset, O7);
|
||||
if (info != NULL) add_debug_info_for_null_check_here(info);
|
||||
__ stf(w, value, O7, base);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool unaligned) {
|
||||
int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool wide, bool unaligned) {
|
||||
int store_offset;
|
||||
if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) {
|
||||
assert(!unaligned, "can't handle this");
|
||||
// for offsets larger than a simm13 we setup the offset in O7
|
||||
__ set(offset, O7);
|
||||
store_offset = store(from_reg, base, O7, type);
|
||||
store_offset = store(from_reg, base, O7, type, wide);
|
||||
} else {
|
||||
if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(from_reg->as_register());
|
||||
if (type == T_ARRAY || type == T_OBJECT) {
|
||||
__ verify_oop(from_reg->as_register());
|
||||
}
|
||||
store_offset = code_offset();
|
||||
switch (type) {
|
||||
case T_BOOLEAN: // fall through
|
||||
@ -934,9 +818,22 @@ int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType
|
||||
__ stw(from_reg->as_register_hi(), base, offset + hi_word_offset_in_bytes);
|
||||
#endif
|
||||
break;
|
||||
case T_ADDRESS:// fall through
|
||||
case T_ADDRESS:
|
||||
__ st_ptr(from_reg->as_register(), base, offset);
|
||||
break;
|
||||
case T_ARRAY : // fall through
|
||||
case T_OBJECT: __ st_ptr(from_reg->as_register(), base, offset); break;
|
||||
case T_OBJECT:
|
||||
{
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ encode_heap_oop(from_reg->as_register(), G3_scratch);
|
||||
store_offset = code_offset();
|
||||
__ stw(G3_scratch, base, offset);
|
||||
} else {
|
||||
__ st_ptr(from_reg->as_register(), base, offset);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case T_FLOAT : __ stf(FloatRegisterImpl::S, from_reg->as_float_reg(), base, offset); break;
|
||||
case T_DOUBLE:
|
||||
{
|
||||
@ -958,8 +855,10 @@ int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType
|
||||
}
|
||||
|
||||
|
||||
int LIR_Assembler::store(LIR_Opr from_reg, Register base, Register disp, BasicType type) {
|
||||
if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(from_reg->as_register());
|
||||
int LIR_Assembler::store(LIR_Opr from_reg, Register base, Register disp, BasicType type, bool wide) {
|
||||
if (type == T_ARRAY || type == T_OBJECT) {
|
||||
__ verify_oop(from_reg->as_register());
|
||||
}
|
||||
int store_offset = code_offset();
|
||||
switch (type) {
|
||||
case T_BOOLEAN: // fall through
|
||||
@ -975,9 +874,21 @@ int LIR_Assembler::store(LIR_Opr from_reg, Register base, Register disp, BasicTy
|
||||
__ std(from_reg->as_register_hi(), base, disp);
|
||||
#endif
|
||||
break;
|
||||
case T_ADDRESS:// fall through
|
||||
case T_ADDRESS:
|
||||
__ st_ptr(from_reg->as_register(), base, disp);
|
||||
break;
|
||||
case T_ARRAY : // fall through
|
||||
case T_OBJECT: __ st_ptr(from_reg->as_register(), base, disp); break;
|
||||
case T_OBJECT:
|
||||
{
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ encode_heap_oop(from_reg->as_register(), G3_scratch);
|
||||
store_offset = code_offset();
|
||||
__ stw(G3_scratch, base, disp);
|
||||
} else {
|
||||
__ st_ptr(from_reg->as_register(), base, disp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case T_FLOAT : __ stf(FloatRegisterImpl::S, from_reg->as_float_reg(), base, disp); break;
|
||||
case T_DOUBLE: __ stf(FloatRegisterImpl::D, from_reg->as_double_reg(), base, disp); break;
|
||||
default : ShouldNotReachHere();
|
||||
@ -986,14 +897,14 @@ int LIR_Assembler::store(LIR_Opr from_reg, Register base, Register disp, BasicTy
|
||||
}
|
||||
|
||||
|
||||
int LIR_Assembler::load(Register base, int offset, LIR_Opr to_reg, BasicType type, bool unaligned) {
|
||||
int LIR_Assembler::load(Register base, int offset, LIR_Opr to_reg, BasicType type, bool wide, bool unaligned) {
|
||||
int load_offset;
|
||||
if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) {
|
||||
assert(base != O7, "destroying register");
|
||||
assert(!unaligned, "can't handle this");
|
||||
// for offsets larger than a simm13 we setup the offset in O7
|
||||
__ set(offset, O7);
|
||||
load_offset = load(base, O7, to_reg, type);
|
||||
load_offset = load(base, O7, to_reg, type, wide);
|
||||
} else {
|
||||
load_offset = code_offset();
|
||||
switch(type) {
|
||||
@ -1030,9 +941,18 @@ int LIR_Assembler::load(Register base, int offset, LIR_Opr to_reg, BasicType typ
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case T_ADDRESS:// fall through
|
||||
case T_ADDRESS: __ ld_ptr(base, offset, to_reg->as_register()); break;
|
||||
case T_ARRAY : // fall through
|
||||
case T_OBJECT: __ ld_ptr(base, offset, to_reg->as_register()); break;
|
||||
case T_OBJECT:
|
||||
{
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ lduw(base, offset, to_reg->as_register());
|
||||
__ decode_heap_oop(to_reg->as_register());
|
||||
} else {
|
||||
__ ld_ptr(base, offset, to_reg->as_register());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case T_FLOAT: __ ldf(FloatRegisterImpl::S, base, offset, to_reg->as_float_reg()); break;
|
||||
case T_DOUBLE:
|
||||
{
|
||||
@ -1048,23 +968,34 @@ int LIR_Assembler::load(Register base, int offset, LIR_Opr to_reg, BasicType typ
|
||||
}
|
||||
default : ShouldNotReachHere();
|
||||
}
|
||||
if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(to_reg->as_register());
|
||||
if (type == T_ARRAY || type == T_OBJECT) {
|
||||
__ verify_oop(to_reg->as_register());
|
||||
}
|
||||
}
|
||||
return load_offset;
|
||||
}
|
||||
|
||||
|
||||
int LIR_Assembler::load(Register base, Register disp, LIR_Opr to_reg, BasicType type) {
|
||||
int LIR_Assembler::load(Register base, Register disp, LIR_Opr to_reg, BasicType type, bool wide) {
|
||||
int load_offset = code_offset();
|
||||
switch(type) {
|
||||
case T_BOOLEAN: // fall through
|
||||
case T_BYTE : __ ldsb(base, disp, to_reg->as_register()); break;
|
||||
case T_CHAR : __ lduh(base, disp, to_reg->as_register()); break;
|
||||
case T_SHORT : __ ldsh(base, disp, to_reg->as_register()); break;
|
||||
case T_INT : __ ld(base, disp, to_reg->as_register()); break;
|
||||
case T_ADDRESS:// fall through
|
||||
case T_BYTE : __ ldsb(base, disp, to_reg->as_register()); break;
|
||||
case T_CHAR : __ lduh(base, disp, to_reg->as_register()); break;
|
||||
case T_SHORT : __ ldsh(base, disp, to_reg->as_register()); break;
|
||||
case T_INT : __ ld(base, disp, to_reg->as_register()); break;
|
||||
case T_ADDRESS: __ ld_ptr(base, disp, to_reg->as_register()); break;
|
||||
case T_ARRAY : // fall through
|
||||
case T_OBJECT: __ ld_ptr(base, disp, to_reg->as_register()); break;
|
||||
case T_OBJECT:
|
||||
{
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ lduw(base, disp, to_reg->as_register());
|
||||
__ decode_heap_oop(to_reg->as_register());
|
||||
} else {
|
||||
__ ld_ptr(base, disp, to_reg->as_register());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case T_FLOAT: __ ldf(FloatRegisterImpl::S, base, disp, to_reg->as_float_reg()); break;
|
||||
case T_DOUBLE: __ ldf(FloatRegisterImpl::D, base, disp, to_reg->as_double_reg()); break;
|
||||
case T_LONG :
|
||||
@ -1078,61 +1009,17 @@ int LIR_Assembler::load(Register base, Register disp, LIR_Opr to_reg, BasicType
|
||||
break;
|
||||
default : ShouldNotReachHere();
|
||||
}
|
||||
if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(to_reg->as_register());
|
||||
if (type == T_ARRAY || type == T_OBJECT) {
|
||||
__ verify_oop(to_reg->as_register());
|
||||
}
|
||||
return load_offset;
|
||||
}
|
||||
|
||||
|
||||
// load/store with an Address
|
||||
void LIR_Assembler::load(const Address& a, Register d, BasicType ld_type, CodeEmitInfo *info, int offset) {
|
||||
load(a.base(), a.disp() + offset, d, ld_type, info);
|
||||
}
|
||||
|
||||
|
||||
void LIR_Assembler::store(Register value, const Address& dest, BasicType type, CodeEmitInfo *info, int offset) {
|
||||
store(value, dest.base(), dest.disp() + offset, type, info);
|
||||
}
|
||||
|
||||
|
||||
// loadf/storef with an Address
|
||||
void LIR_Assembler::load(const Address& a, FloatRegister d, BasicType ld_type, CodeEmitInfo *info, int offset) {
|
||||
load(a.base(), a.disp() + offset, d, ld_type, info);
|
||||
}
|
||||
|
||||
|
||||
void LIR_Assembler::store(FloatRegister value, const Address& dest, BasicType type, CodeEmitInfo *info, int offset) {
|
||||
store(value, dest.base(), dest.disp() + offset, type, info);
|
||||
}
|
||||
|
||||
|
||||
// load/store with an Address
|
||||
void LIR_Assembler::load(LIR_Address* a, Register d, BasicType ld_type, CodeEmitInfo *info) {
|
||||
load(as_Address(a), d, ld_type, info);
|
||||
}
|
||||
|
||||
|
||||
void LIR_Assembler::store(Register value, LIR_Address* dest, BasicType type, CodeEmitInfo *info) {
|
||||
store(value, as_Address(dest), type, info);
|
||||
}
|
||||
|
||||
|
||||
// loadf/storef with an Address
|
||||
void LIR_Assembler::load(LIR_Address* a, FloatRegister d, BasicType ld_type, CodeEmitInfo *info) {
|
||||
load(as_Address(a), d, ld_type, info);
|
||||
}
|
||||
|
||||
|
||||
void LIR_Assembler::store(FloatRegister value, LIR_Address* dest, BasicType type, CodeEmitInfo *info) {
|
||||
store(value, as_Address(dest), type, info);
|
||||
}
|
||||
|
||||
|
||||
void LIR_Assembler::const2stack(LIR_Opr src, LIR_Opr dest) {
|
||||
LIR_Const* c = src->as_constant_ptr();
|
||||
switch (c->type()) {
|
||||
case T_INT:
|
||||
case T_FLOAT:
|
||||
case T_ADDRESS: {
|
||||
case T_FLOAT: {
|
||||
Register src_reg = O7;
|
||||
int value = c->as_jint_bits();
|
||||
if (value == 0) {
|
||||
@ -1144,6 +1031,18 @@ void LIR_Assembler::const2stack(LIR_Opr src, LIR_Opr dest) {
|
||||
__ stw(src_reg, addr.base(), addr.disp());
|
||||
break;
|
||||
}
|
||||
case T_ADDRESS: {
|
||||
Register src_reg = O7;
|
||||
int value = c->as_jint_bits();
|
||||
if (value == 0) {
|
||||
src_reg = G0;
|
||||
} else {
|
||||
__ set(value, O7);
|
||||
}
|
||||
Address addr = frame_map()->address_for_slot(dest->single_stack_ix());
|
||||
__ st_ptr(src_reg, addr.base(), addr.disp());
|
||||
break;
|
||||
}
|
||||
case T_OBJECT: {
|
||||
Register src_reg = O7;
|
||||
jobject2reg(c->as_jobject(), src_reg);
|
||||
@ -1178,14 +1077,12 @@ void LIR_Assembler::const2stack(LIR_Opr src, LIR_Opr dest) {
|
||||
}
|
||||
|
||||
|
||||
void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info ) {
|
||||
void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info, bool wide) {
|
||||
LIR_Const* c = src->as_constant_ptr();
|
||||
LIR_Address* addr = dest->as_address_ptr();
|
||||
Register base = addr->base()->as_pointer_register();
|
||||
int offset = -1;
|
||||
|
||||
if (info != NULL) {
|
||||
add_debug_info_for_null_check_here(info);
|
||||
}
|
||||
switch (c->type()) {
|
||||
case T_INT:
|
||||
case T_FLOAT:
|
||||
@ -1199,10 +1096,10 @@ void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmi
|
||||
}
|
||||
if (addr->index()->is_valid()) {
|
||||
assert(addr->disp() == 0, "must be zero");
|
||||
store(tmp, base, addr->index()->as_pointer_register(), type);
|
||||
offset = store(tmp, base, addr->index()->as_pointer_register(), type, wide);
|
||||
} else {
|
||||
assert(Assembler::is_simm13(addr->disp()), "can't handle larger addresses");
|
||||
store(tmp, base, addr->disp(), type);
|
||||
offset = store(tmp, base, addr->disp(), type, wide, false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1212,21 +1109,21 @@ void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmi
|
||||
assert(Assembler::is_simm13(addr->disp()) &&
|
||||
Assembler::is_simm13(addr->disp() + 4), "can't handle larger addresses");
|
||||
|
||||
Register tmp = O7;
|
||||
LIR_Opr tmp = FrameMap::O7_opr;
|
||||
int value_lo = c->as_jint_lo_bits();
|
||||
if (value_lo == 0) {
|
||||
tmp = G0;
|
||||
tmp = FrameMap::G0_opr;
|
||||
} else {
|
||||
__ set(value_lo, O7);
|
||||
}
|
||||
store(tmp, base, addr->disp() + lo_word_offset_in_bytes, T_INT);
|
||||
offset = store(tmp, base, addr->disp() + lo_word_offset_in_bytes, T_INT, wide, false);
|
||||
int value_hi = c->as_jint_hi_bits();
|
||||
if (value_hi == 0) {
|
||||
tmp = G0;
|
||||
tmp = FrameMap::G0_opr;
|
||||
} else {
|
||||
__ set(value_hi, O7);
|
||||
}
|
||||
store(tmp, base, addr->disp() + hi_word_offset_in_bytes, T_INT);
|
||||
offset = store(tmp, base, addr->disp() + hi_word_offset_in_bytes, T_INT, wide, false);
|
||||
break;
|
||||
}
|
||||
case T_OBJECT: {
|
||||
@ -1241,10 +1138,10 @@ void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmi
|
||||
// handle either reg+reg or reg+disp address
|
||||
if (addr->index()->is_valid()) {
|
||||
assert(addr->disp() == 0, "must be zero");
|
||||
store(tmp, base, addr->index()->as_pointer_register(), type);
|
||||
offset = store(tmp, base, addr->index()->as_pointer_register(), type, wide);
|
||||
} else {
|
||||
assert(Assembler::is_simm13(addr->disp()), "can't handle larger addresses");
|
||||
store(tmp, base, addr->disp(), type);
|
||||
offset = store(tmp, base, addr->disp(), type, wide, false);
|
||||
}
|
||||
|
||||
break;
|
||||
@ -1252,6 +1149,10 @@ void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmi
|
||||
default:
|
||||
Unimplemented();
|
||||
}
|
||||
if (info != NULL) {
|
||||
assert(offset != -1, "offset should've been set");
|
||||
add_debug_info_for_null_check(offset, info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1336,7 +1237,7 @@ void LIR_Assembler::const2reg(LIR_Opr src, LIR_Opr dest, LIR_PatchCode patch_cod
|
||||
assert(to_reg->is_single_cpu(), "Must be a cpu register.");
|
||||
|
||||
__ set(const_addrlit, O7);
|
||||
load(O7, 0, to_reg->as_register(), T_INT);
|
||||
__ ld(O7, 0, to_reg->as_register());
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -1429,7 +1330,7 @@ Address LIR_Assembler::as_Address_lo(LIR_Address* addr) {
|
||||
|
||||
|
||||
void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type,
|
||||
LIR_PatchCode patch_code, CodeEmitInfo* info, bool unaligned) {
|
||||
LIR_PatchCode patch_code, CodeEmitInfo* info, bool wide, bool unaligned) {
|
||||
|
||||
LIR_Address* addr = src_opr->as_address_ptr();
|
||||
LIR_Opr to_reg = dest;
|
||||
@ -1475,16 +1376,15 @@ void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type,
|
||||
|
||||
assert(disp_reg != noreg || Assembler::is_simm13(disp_value), "should have set this up");
|
||||
if (disp_reg == noreg) {
|
||||
offset = load(src, disp_value, to_reg, type, unaligned);
|
||||
offset = load(src, disp_value, to_reg, type, wide, unaligned);
|
||||
} else {
|
||||
assert(!unaligned, "can't handle this");
|
||||
offset = load(src, disp_reg, to_reg, type);
|
||||
offset = load(src, disp_reg, to_reg, type, wide);
|
||||
}
|
||||
|
||||
if (patch != NULL) {
|
||||
patching_epilog(patch, patch_code, src, info);
|
||||
}
|
||||
|
||||
if (info != NULL) add_debug_info_for_null_check(offset, info);
|
||||
}
|
||||
|
||||
@ -1518,7 +1418,7 @@ void LIR_Assembler::stack2reg(LIR_Opr src, LIR_Opr dest, BasicType type) {
|
||||
}
|
||||
|
||||
bool unaligned = (addr.disp() - STACK_BIAS) % 8 != 0;
|
||||
load(addr.base(), addr.disp(), dest, dest->type(), unaligned);
|
||||
load(addr.base(), addr.disp(), dest, dest->type(), true /*wide*/, unaligned);
|
||||
}
|
||||
|
||||
|
||||
@ -1530,7 +1430,7 @@ void LIR_Assembler::reg2stack(LIR_Opr from_reg, LIR_Opr dest, BasicType type, bo
|
||||
addr = frame_map()->address_for_slot(dest->double_stack_ix());
|
||||
}
|
||||
bool unaligned = (addr.disp() - STACK_BIAS) % 8 != 0;
|
||||
store(from_reg, addr.base(), addr.disp(), from_reg->type(), unaligned);
|
||||
store(from_reg, addr.base(), addr.disp(), from_reg->type(), true /*wide*/, unaligned);
|
||||
}
|
||||
|
||||
|
||||
@ -1578,7 +1478,7 @@ void LIR_Assembler::reg2reg(LIR_Opr from_reg, LIR_Opr to_reg) {
|
||||
|
||||
void LIR_Assembler::reg2mem(LIR_Opr from_reg, LIR_Opr dest, BasicType type,
|
||||
LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack,
|
||||
bool unaligned) {
|
||||
bool wide, bool unaligned) {
|
||||
LIR_Address* addr = dest->as_address_ptr();
|
||||
|
||||
Register src = addr->base()->as_pointer_register();
|
||||
@ -1622,10 +1522,10 @@ void LIR_Assembler::reg2mem(LIR_Opr from_reg, LIR_Opr dest, BasicType type,
|
||||
|
||||
assert(disp_reg != noreg || Assembler::is_simm13(disp_value), "should have set this up");
|
||||
if (disp_reg == noreg) {
|
||||
offset = store(from_reg, src, disp_value, type, unaligned);
|
||||
offset = store(from_reg, src, disp_value, type, wide, unaligned);
|
||||
} else {
|
||||
assert(!unaligned, "can't handle this");
|
||||
offset = store(from_reg, src, disp_reg, type);
|
||||
offset = store(from_reg, src, disp_reg, type, wide);
|
||||
}
|
||||
|
||||
if (patch != NULL) {
|
||||
@ -2184,13 +2084,13 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
|
||||
// make sure src and dst are non-null and load array length
|
||||
if (flags & LIR_OpArrayCopy::src_null_check) {
|
||||
__ tst(src);
|
||||
__ br(Assembler::equal, false, Assembler::pn, *stub->entry());
|
||||
__ brx(Assembler::equal, false, Assembler::pn, *stub->entry());
|
||||
__ delayed()->nop();
|
||||
}
|
||||
|
||||
if (flags & LIR_OpArrayCopy::dst_null_check) {
|
||||
__ tst(dst);
|
||||
__ br(Assembler::equal, false, Assembler::pn, *stub->entry());
|
||||
__ brx(Assembler::equal, false, Assembler::pn, *stub->entry());
|
||||
__ delayed()->nop();
|
||||
}
|
||||
|
||||
@ -2232,10 +2132,18 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
|
||||
}
|
||||
|
||||
if (flags & LIR_OpArrayCopy::type_check) {
|
||||
__ ld_ptr(src, oopDesc::klass_offset_in_bytes(), tmp);
|
||||
__ ld_ptr(dst, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
__ cmp(tmp, tmp2);
|
||||
__ br(Assembler::notEqual, false, Assembler::pt, *stub->entry());
|
||||
if (UseCompressedOops) {
|
||||
// We don't need decode because we just need to compare
|
||||
__ lduw(src, oopDesc::klass_offset_in_bytes(), tmp);
|
||||
__ lduw(dst, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
__ cmp(tmp, tmp2);
|
||||
__ br(Assembler::notEqual, false, Assembler::pt, *stub->entry());
|
||||
} else {
|
||||
__ ld_ptr(src, oopDesc::klass_offset_in_bytes(), tmp);
|
||||
__ ld_ptr(dst, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
__ cmp(tmp, tmp2);
|
||||
__ brx(Assembler::notEqual, false, Assembler::pt, *stub->entry());
|
||||
}
|
||||
__ delayed()->nop();
|
||||
}
|
||||
|
||||
@ -2250,20 +2158,44 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
|
||||
// but not necessarily exactly of type default_type.
|
||||
Label known_ok, halt;
|
||||
jobject2reg(op->expected_type()->constant_encoding(), tmp);
|
||||
__ ld_ptr(dst, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
if (basic_type != T_OBJECT) {
|
||||
__ cmp(tmp, tmp2);
|
||||
__ br(Assembler::notEqual, false, Assembler::pn, halt);
|
||||
__ delayed()->ld_ptr(src, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
__ cmp(tmp, tmp2);
|
||||
__ br(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->nop();
|
||||
if (UseCompressedOops) {
|
||||
// tmp holds the default type. It currently comes uncompressed after the
|
||||
// load of a constant, so encode it.
|
||||
__ encode_heap_oop(tmp);
|
||||
// load the raw value of the dst klass, since we will be comparing
|
||||
// uncompressed values directly.
|
||||
__ lduw(dst, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
if (basic_type != T_OBJECT) {
|
||||
__ cmp(tmp, tmp2);
|
||||
__ br(Assembler::notEqual, false, Assembler::pn, halt);
|
||||
// load the raw value of the src klass.
|
||||
__ delayed()->lduw(src, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
__ cmp(tmp, tmp2);
|
||||
__ br(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->nop();
|
||||
} else {
|
||||
__ cmp(tmp, tmp2);
|
||||
__ br(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->cmp(src, dst);
|
||||
__ brx(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->nop();
|
||||
}
|
||||
} else {
|
||||
__ cmp(tmp, tmp2);
|
||||
__ br(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->cmp(src, dst);
|
||||
__ br(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->nop();
|
||||
__ ld_ptr(dst, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
if (basic_type != T_OBJECT) {
|
||||
__ cmp(tmp, tmp2);
|
||||
__ brx(Assembler::notEqual, false, Assembler::pn, halt);
|
||||
__ delayed()->ld_ptr(src, oopDesc::klass_offset_in_bytes(), tmp2);
|
||||
__ cmp(tmp, tmp2);
|
||||
__ brx(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->nop();
|
||||
} else {
|
||||
__ cmp(tmp, tmp2);
|
||||
__ brx(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->cmp(src, dst);
|
||||
__ brx(Assembler::equal, false, Assembler::pn, known_ok);
|
||||
__ delayed()->nop();
|
||||
}
|
||||
}
|
||||
__ bind(halt);
|
||||
__ stop("incorrect type information in arraycopy");
|
||||
@ -2471,7 +2403,7 @@ void LIR_Assembler::type_profile_helper(Register mdo, int mdo_offset_bias,
|
||||
Label next_test;
|
||||
Address recv_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i)) -
|
||||
mdo_offset_bias);
|
||||
load(recv_addr, tmp1, T_OBJECT);
|
||||
__ ld_ptr(recv_addr, tmp1);
|
||||
__ br_notnull(tmp1, false, Assembler::pt, next_test);
|
||||
__ delayed()->nop();
|
||||
__ st_ptr(recv, recv_addr);
|
||||
@ -2487,11 +2419,8 @@ void LIR_Assembler::type_profile_helper(Register mdo, int mdo_offset_bias,
|
||||
|
||||
void LIR_Assembler::setup_md_access(ciMethod* method, int bci,
|
||||
ciMethodData*& md, ciProfileData*& data, int& mdo_offset_bias) {
|
||||
md = method->method_data();
|
||||
if (md == NULL) {
|
||||
bailout("out of memory building methodDataOop");
|
||||
return;
|
||||
}
|
||||
md = method->method_data_or_null();
|
||||
assert(md != NULL, "Sanity");
|
||||
data = md->bci_to_data(bci);
|
||||
assert(data != NULL, "need data for checkcast");
|
||||
assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
|
||||
@ -2563,7 +2492,7 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
|
||||
// get object class
|
||||
// not a safepoint as obj null check happens earlier
|
||||
load(obj, oopDesc::klass_offset_in_bytes(), klass_RInfo, T_OBJECT, NULL);
|
||||
__ load_klass(obj, klass_RInfo);
|
||||
if (op->fast_check()) {
|
||||
assert_different_registers(klass_RInfo, k_RInfo);
|
||||
__ cmp(k_RInfo, klass_RInfo);
|
||||
@ -2605,7 +2534,7 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
__ set(mdo_offset_bias, tmp1);
|
||||
__ add(mdo, tmp1, mdo);
|
||||
}
|
||||
load(Address(obj, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT);
|
||||
__ load_klass(obj, recv);
|
||||
type_profile_helper(mdo, mdo_offset_bias, md, data, recv, tmp1, success);
|
||||
// Jump over the failure case
|
||||
__ ba(false, *success);
|
||||
@ -2674,11 +2603,12 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
__ br_null(value, false, Assembler::pn, done);
|
||||
__ delayed()->nop();
|
||||
}
|
||||
load(array, oopDesc::klass_offset_in_bytes(), k_RInfo, T_OBJECT, op->info_for_exception());
|
||||
load(value, oopDesc::klass_offset_in_bytes(), klass_RInfo, T_OBJECT, NULL);
|
||||
add_debug_info_for_null_check_here(op->info_for_exception());
|
||||
__ load_klass(array, k_RInfo);
|
||||
__ load_klass(value, klass_RInfo);
|
||||
|
||||
// get instance klass
|
||||
load(k_RInfo, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc), k_RInfo, T_OBJECT, NULL);
|
||||
__ ld_ptr(Address(k_RInfo, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc)), k_RInfo);
|
||||
// perform the fast part of the checking logic
|
||||
__ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, O7, success_target, failure_target, NULL);
|
||||
|
||||
@ -2700,7 +2630,7 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
__ set(mdo_offset_bias, tmp1);
|
||||
__ add(mdo, tmp1, mdo);
|
||||
}
|
||||
load(Address(value, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT);
|
||||
__ load_klass(value, recv);
|
||||
type_profile_helper(mdo, mdo_offset_bias, md, data, recv, tmp1, &done);
|
||||
__ ba(false, done);
|
||||
__ delayed()->nop();
|
||||
@ -2781,14 +2711,17 @@ void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
|
||||
Register t2 = op->tmp2()->as_register();
|
||||
__ mov(cmp_value, t1);
|
||||
__ mov(new_value, t2);
|
||||
#ifdef _LP64
|
||||
if (op->code() == lir_cas_obj) {
|
||||
__ casx(addr, t1, t2);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
if (UseCompressedOops) {
|
||||
__ encode_heap_oop(t1);
|
||||
__ encode_heap_oop(t2);
|
||||
__ cas(addr, t1, t2);
|
||||
} else {
|
||||
__ cas_ptr(addr, t1, t2);
|
||||
}
|
||||
} else {
|
||||
__ cas(addr, t1, t2);
|
||||
}
|
||||
__ cmp(t1, t2);
|
||||
} else {
|
||||
Unimplemented();
|
||||
@ -2885,11 +2818,8 @@ void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
|
||||
int bci = op->profiled_bci();
|
||||
|
||||
// Update counter for all call types
|
||||
ciMethodData* md = method->method_data();
|
||||
if (md == NULL) {
|
||||
bailout("out of memory building methodDataOop");
|
||||
return;
|
||||
}
|
||||
ciMethodData* md = method->method_data_or_null();
|
||||
assert(md != NULL, "Sanity");
|
||||
ciProfileData* data = md->bci_to_data(bci);
|
||||
assert(data->is_CounterData(), "need CounterData for calls");
|
||||
assert(op->mdo()->is_single_cpu(), "mdo must be allocated");
|
||||
@ -2966,7 +2896,7 @@ void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
load(Address(recv, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT);
|
||||
__ load_klass(recv, recv);
|
||||
Label update_done;
|
||||
type_profile_helper(mdo, mdo_offset_bias, md, data, recv, tmp1, &update_done);
|
||||
// Receiver did not match any saved receiver and there is no empty row for it.
|
||||
@ -3160,7 +3090,7 @@ void LIR_Assembler::volatile_move_op(LIR_Opr src, LIR_Opr dest, BasicType type,
|
||||
} else {
|
||||
// use normal move for all other volatiles since they don't need
|
||||
// special handling to remain atomic.
|
||||
move_op(src, dest, type, lir_patch_none, info, false, false);
|
||||
move_op(src, dest, type, lir_patch_none, info, false, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -40,33 +40,11 @@
|
||||
// and then a load or store is emitted with ([O7] + [d]).
|
||||
//
|
||||
|
||||
// some load/store variants return the code_offset for proper positioning of debug info for null checks
|
||||
int store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool wide, bool unaligned);
|
||||
int store(LIR_Opr from_reg, Register base, Register disp, BasicType type, bool wide);
|
||||
|
||||
// load/store with 32 bit displacement
|
||||
int load(Register s, int disp, Register d, BasicType ld_type, CodeEmitInfo* info = NULL);
|
||||
void store(Register value, Register base, int offset, BasicType type, CodeEmitInfo *info = NULL);
|
||||
|
||||
// loadf/storef with 32 bit displacement
|
||||
void load(Register s, int disp, FloatRegister d, BasicType ld_type, CodeEmitInfo* info = NULL);
|
||||
void store(FloatRegister d, Register s1, int disp, BasicType st_type, CodeEmitInfo* info = NULL);
|
||||
|
||||
// convienence methods for calling load/store with an Address
|
||||
void load(const Address& a, Register d, BasicType ld_type, CodeEmitInfo* info = NULL, int offset = 0);
|
||||
void store(Register d, const Address& a, BasicType st_type, CodeEmitInfo* info = NULL, int offset = 0);
|
||||
void load(const Address& a, FloatRegister d, BasicType ld_type, CodeEmitInfo* info = NULL, int offset = 0);
|
||||
void store(FloatRegister d, const Address& a, BasicType st_type, CodeEmitInfo* info = NULL, int offset = 0);
|
||||
|
||||
// convienence methods for calling load/store with an LIR_Address
|
||||
void load(LIR_Address* a, Register d, BasicType ld_type, CodeEmitInfo* info = NULL);
|
||||
void store(Register d, LIR_Address* a, BasicType st_type, CodeEmitInfo* info = NULL);
|
||||
void load(LIR_Address* a, FloatRegister d, BasicType ld_type, CodeEmitInfo* info = NULL);
|
||||
void store(FloatRegister d, LIR_Address* a, BasicType st_type, CodeEmitInfo* info = NULL);
|
||||
|
||||
int store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool unaligned = false);
|
||||
int store(LIR_Opr from_reg, Register base, Register disp, BasicType type);
|
||||
|
||||
int load(Register base, int offset, LIR_Opr to_reg, BasicType type, bool unaligned = false);
|
||||
int load(Register base, Register disp, LIR_Opr to_reg, BasicType type);
|
||||
int load(Register base, int offset, LIR_Opr to_reg, BasicType type, bool wide, bool unaligned);
|
||||
int load(Register base, Register disp, LIR_Opr to_reg, BasicType type, bool wide);
|
||||
|
||||
void monitorexit(LIR_Opr obj_opr, LIR_Opr lock_opr, Register hdr, int monitor_no);
|
||||
|
||||
|
@ -40,7 +40,7 @@ void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) {
|
||||
const Register temp_reg = G3_scratch;
|
||||
// Note: needs more testing of out-of-line vs. inline slow case
|
||||
verify_oop(receiver);
|
||||
ld_ptr(receiver, oopDesc::klass_offset_in_bytes(), temp_reg);
|
||||
load_klass(receiver, temp_reg);
|
||||
cmp(temp_reg, iCache);
|
||||
brx(Assembler::equal, true, Assembler::pt, L);
|
||||
delayed()->nop();
|
||||
@ -185,9 +185,19 @@ void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register
|
||||
} else {
|
||||
set((intx)markOopDesc::prototype(), t1);
|
||||
}
|
||||
st_ptr(t1 , obj, oopDesc::mark_offset_in_bytes ());
|
||||
st_ptr(klass, obj, oopDesc::klass_offset_in_bytes ());
|
||||
if (len->is_valid()) st(len , obj, arrayOopDesc::length_offset_in_bytes());
|
||||
st_ptr(t1, obj, oopDesc::mark_offset_in_bytes());
|
||||
if (UseCompressedOops) {
|
||||
// Save klass
|
||||
mov(klass, t1);
|
||||
encode_heap_oop_not_null(t1);
|
||||
stw(t1, obj, oopDesc::klass_offset_in_bytes());
|
||||
} else {
|
||||
st_ptr(klass, obj, oopDesc::klass_offset_in_bytes());
|
||||
}
|
||||
if (len->is_valid()) st(len, obj, arrayOopDesc::length_offset_in_bytes());
|
||||
else if (UseCompressedOops) {
|
||||
store_klass_gap(G0, obj);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -235,7 +245,7 @@ void C1_MacroAssembler::initialize_object(
|
||||
Register t1, // temp register
|
||||
Register t2 // temp register
|
||||
) {
|
||||
const int hdr_size_in_bytes = instanceOopDesc::base_offset_in_bytes();
|
||||
const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize;
|
||||
|
||||
initialize_header(obj, klass, noreg, t1, t2);
|
||||
|
||||
|
@ -612,7 +612,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
|
||||
// load the klass and check the has finalizer flag
|
||||
Label register_finalizer;
|
||||
Register t = O1;
|
||||
__ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), t);
|
||||
__ load_klass(O0, t);
|
||||
__ ld(t, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc), t);
|
||||
__ set(JVM_ACC_HAS_FINALIZER, G3);
|
||||
__ andcc(G3, t, G0);
|
||||
|
@ -689,8 +689,8 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
{
|
||||
// Perform an in-place conversion to int or an int subword.
|
||||
__ ldsw(G3_amh_vmargslot, O0_argslot);
|
||||
Address vmarg = __ argument_address(O0_argslot);
|
||||
Address value;
|
||||
Address vmarg = __ argument_address(O0_argslot);
|
||||
bool value_left_justified = false;
|
||||
|
||||
switch (ek) {
|
||||
@ -700,9 +700,21 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
case _adapter_opt_l2i:
|
||||
{
|
||||
// just delete the extra slot
|
||||
#ifdef _LP64
|
||||
// In V9, longs are given 2 64-bit slots in the interpreter, but the
|
||||
// data is passed in only 1 slot.
|
||||
// Keep the second slot.
|
||||
__ add(Gargs, __ argument_offset(O0_argslot, -1), O0_argslot);
|
||||
remove_arg_slots(_masm, -stack_move_unit(), O0_argslot, O1_scratch, O2_scratch, O3_scratch);
|
||||
value = Address(O0_argslot, 4); // Get least-significant 32-bit of 64-bit value.
|
||||
vmarg = Address(O0_argslot, Interpreter::stackElementSize);
|
||||
#else
|
||||
// Keep the first slot.
|
||||
__ add(Gargs, __ argument_offset(O0_argslot), O0_argslot);
|
||||
remove_arg_slots(_masm, -stack_move_unit(), O0_argslot, O1_scratch, O2_scratch, O3_scratch);
|
||||
value = vmarg = Address(O0_argslot, 0);
|
||||
value = Address(O0_argslot, 0);
|
||||
vmarg = value;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case _adapter_opt_unboxi:
|
||||
|
@ -667,6 +667,20 @@ intptr_t get_offset_from_base_2(const MachNode* n, const TypePtr* atype, int dis
|
||||
return offset;
|
||||
}
|
||||
|
||||
static inline jdouble replicate_immI(int con, int count, int width) {
|
||||
// Load a constant replicated "count" times with width "width"
|
||||
int bit_width = width * 8;
|
||||
jlong elt_val = con;
|
||||
elt_val &= (((jlong) 1) << bit_width) - 1; // mask off sign bits
|
||||
jlong val = elt_val;
|
||||
for (int i = 0; i < count - 1; i++) {
|
||||
val <<= bit_width;
|
||||
val |= elt_val;
|
||||
}
|
||||
jdouble dval = *((jdouble*) &val); // coerce to double type
|
||||
return dval;
|
||||
}
|
||||
|
||||
// Standard Sparc opcode form2 field breakdown
|
||||
static inline void emit2_19(CodeBuffer &cbuf, int f30, int f29, int f25, int f22, int f20, int f19, int f0 ) {
|
||||
f0 &= (1<<19)-1; // Mask displacement to 19 bits
|
||||
@ -1007,6 +1021,90 @@ void emit_lo(CodeBuffer &cbuf, int val) { }
|
||||
void emit_hi(CodeBuffer &cbuf, int val) { }
|
||||
|
||||
|
||||
//=============================================================================
|
||||
const bool Matcher::constant_table_absolute_addressing = false;
|
||||
const RegMask& MachConstantBaseNode::_out_RegMask = PTR_REG_mask;
|
||||
|
||||
void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
|
||||
Compile* C = ra_->C;
|
||||
Compile::ConstantTable& constant_table = C->constant_table();
|
||||
MacroAssembler _masm(&cbuf);
|
||||
|
||||
Register r = as_Register(ra_->get_encode(this));
|
||||
CodeSection* cs = __ code()->consts();
|
||||
int consts_size = cs->align_at_start(cs->size());
|
||||
|
||||
if (UseRDPCForConstantTableBase) {
|
||||
// For the following RDPC logic to work correctly the consts
|
||||
// section must be allocated right before the insts section. This
|
||||
// assert checks for that. The layout and the SECT_* constants
|
||||
// are defined in src/share/vm/asm/codeBuffer.hpp.
|
||||
assert(CodeBuffer::SECT_CONSTS + 1 == CodeBuffer::SECT_INSTS, "must be");
|
||||
int offset = __ offset();
|
||||
int disp;
|
||||
|
||||
// If the displacement from the current PC to the constant table
|
||||
// base fits into simm13 we set the constant table base to the
|
||||
// current PC.
|
||||
if (__ is_simm13(-(consts_size + offset))) {
|
||||
constant_table.set_table_base_offset(-(consts_size + offset));
|
||||
disp = 0;
|
||||
} else {
|
||||
// If the offset of the top constant (last entry in the table)
|
||||
// fits into simm13 we set the constant table base to the actual
|
||||
// table base.
|
||||
if (__ is_simm13(constant_table.top_offset())) {
|
||||
constant_table.set_table_base_offset(0);
|
||||
disp = consts_size + offset;
|
||||
} else {
|
||||
// Otherwise we set the constant table base in the middle of the
|
||||
// constant table.
|
||||
int half_consts_size = consts_size / 2;
|
||||
assert(half_consts_size * 2 == consts_size, "sanity");
|
||||
constant_table.set_table_base_offset(-half_consts_size); // table base offset gets added to the load displacement.
|
||||
disp = half_consts_size + offset;
|
||||
}
|
||||
}
|
||||
|
||||
__ rdpc(r);
|
||||
|
||||
if (disp != 0) {
|
||||
assert(r != O7, "need temporary");
|
||||
__ sub(r, __ ensure_simm13_or_reg(disp, O7), r);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Materialize the constant table base.
|
||||
assert(constant_table.size() == consts_size, err_msg("must be: %d == %d", constant_table.size(), consts_size));
|
||||
address baseaddr = cs->start() + -(constant_table.table_base_offset());
|
||||
RelocationHolder rspec = internal_word_Relocation::spec(baseaddr);
|
||||
AddressLiteral base(baseaddr, rspec);
|
||||
__ set(base, r);
|
||||
}
|
||||
}
|
||||
|
||||
uint MachConstantBaseNode::size(PhaseRegAlloc*) const {
|
||||
if (UseRDPCForConstantTableBase) {
|
||||
// This is really the worst case but generally it's only 1 instruction.
|
||||
return 4 /*rdpc*/ + 4 /*sub*/ + MacroAssembler::worst_case_size_of_set();
|
||||
} else {
|
||||
return MacroAssembler::worst_case_size_of_set();
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const {
|
||||
char reg[128];
|
||||
ra_->dump_register(this, reg);
|
||||
if (UseRDPCForConstantTableBase) {
|
||||
st->print("RDPC %s\t! constant table base", reg);
|
||||
} else {
|
||||
st->print("SET &constanttable,%s\t! constant table base", reg);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//=============================================================================
|
||||
|
||||
#ifndef PRODUCT
|
||||
@ -2247,25 +2345,6 @@ encode %{
|
||||
__ delayed()->nop();
|
||||
%}
|
||||
|
||||
enc_class jump_enc( iRegX switch_val, o7RegI table) %{
|
||||
MacroAssembler _masm(&cbuf);
|
||||
|
||||
Register switch_reg = as_Register($switch_val$$reg);
|
||||
Register table_reg = O7;
|
||||
|
||||
address table_base = __ address_table_constant(_index2label);
|
||||
RelocationHolder rspec = internal_word_Relocation::spec(table_base);
|
||||
|
||||
// Move table address into a register.
|
||||
__ set(table_base, table_reg, rspec);
|
||||
|
||||
// Jump to base address + switch value
|
||||
__ ld_ptr(table_reg, switch_reg, table_reg);
|
||||
__ jmp(table_reg, G0);
|
||||
__ delayed()->nop();
|
||||
|
||||
%}
|
||||
|
||||
enc_class enc_ba( Label labl ) %{
|
||||
MacroAssembler _masm(&cbuf);
|
||||
Label &L = *($labl$$label);
|
||||
@ -2384,20 +2463,6 @@ encode %{
|
||||
cbuf.insts()->emit_int32(op);
|
||||
%}
|
||||
|
||||
// Utility encoding for loading a 64 bit Pointer into a register
|
||||
// The 64 bit pointer is stored in the generated code stream
|
||||
enc_class SetPtr( immP src, iRegP rd ) %{
|
||||
Register dest = reg_to_register_object($rd$$reg);
|
||||
MacroAssembler _masm(&cbuf);
|
||||
// [RGV] This next line should be generated from ADLC
|
||||
if ( _opnds[1]->constant_is_oop() ) {
|
||||
intptr_t val = $src$$constant;
|
||||
__ set_oop_constant((jobject)val, dest);
|
||||
} else { // non-oop pointers, e.g. card mark base, heap top
|
||||
__ set($src$$constant, dest);
|
||||
}
|
||||
%}
|
||||
|
||||
enc_class Set13( immI13 src, iRegI rd ) %{
|
||||
emit3_simm13( cbuf, Assembler::arith_op, $rd$$reg, Assembler::or_op3, 0, $src$$constant );
|
||||
%}
|
||||
@ -2411,10 +2476,6 @@ encode %{
|
||||
__ set($src$$constant, reg_to_register_object($rd$$reg));
|
||||
%}
|
||||
|
||||
enc_class SetNull( iRegI rd ) %{
|
||||
emit3_simm13( cbuf, Assembler::arith_op, $rd$$reg, Assembler::or_op3, 0, 0 );
|
||||
%}
|
||||
|
||||
enc_class call_epilog %{
|
||||
if( VerifyStackAtCalls ) {
|
||||
MacroAssembler _masm(&cbuf);
|
||||
@ -2778,35 +2839,6 @@ enc_class Fast_Unlock(iRegP oop, iRegP box, o7RegP scratch, iRegP scratch2) %{
|
||||
__ float_cmp( $primary, -1, Fsrc1, Fsrc2, Rdst);
|
||||
%}
|
||||
|
||||
enc_class LdImmL (immL src, iRegL dst, o7RegL tmp) %{ // Load Immediate
|
||||
MacroAssembler _masm(&cbuf);
|
||||
Register dest = reg_to_register_object($dst$$reg);
|
||||
Register temp = reg_to_register_object($tmp$$reg);
|
||||
__ set64( $src$$constant, dest, temp );
|
||||
%}
|
||||
|
||||
enc_class LdReplImmI(immI src, regD dst, o7RegP tmp, int count, int width) %{
|
||||
// Load a constant replicated "count" times with width "width"
|
||||
int bit_width = $width$$constant * 8;
|
||||
jlong elt_val = $src$$constant;
|
||||
elt_val &= (((jlong)1) << bit_width) - 1; // mask off sign bits
|
||||
jlong val = elt_val;
|
||||
for (int i = 0; i < $count$$constant - 1; i++) {
|
||||
val <<= bit_width;
|
||||
val |= elt_val;
|
||||
}
|
||||
jdouble dval = *(jdouble*)&val; // coerce to double type
|
||||
MacroAssembler _masm(&cbuf);
|
||||
address double_address = __ double_constant(dval);
|
||||
RelocationHolder rspec = internal_word_Relocation::spec(double_address);
|
||||
AddressLiteral addrlit(double_address, rspec);
|
||||
|
||||
__ sethi(addrlit, $tmp$$Register);
|
||||
// XXX This is a quick fix for 6833573.
|
||||
//__ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec);
|
||||
__ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), as_DoubleFloatRegister($dst$$reg), rspec);
|
||||
%}
|
||||
|
||||
// Compiler ensures base is doubleword aligned and cnt is count of doublewords
|
||||
enc_class enc_Clear_Array(iRegX cnt, iRegP base, iRegX temp) %{
|
||||
MacroAssembler _masm(&cbuf);
|
||||
@ -3521,6 +3553,29 @@ operand immP() %{
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Pointer Immediate: 32 or 64-bit
|
||||
operand immP_set() %{
|
||||
predicate(!VM_Version::is_niagara1_plus());
|
||||
match(ConP);
|
||||
|
||||
op_cost(5);
|
||||
// formats are generated automatically for constants and base registers
|
||||
format %{ %}
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Pointer Immediate: 32 or 64-bit
|
||||
// From Niagara2 processors on a load should be better than materializing.
|
||||
operand immP_load() %{
|
||||
predicate(VM_Version::is_niagara1_plus());
|
||||
match(ConP);
|
||||
|
||||
op_cost(5);
|
||||
// formats are generated automatically for constants and base registers
|
||||
format %{ %}
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
operand immP13() %{
|
||||
predicate((-4096 < n->get_ptr()) && (n->get_ptr() <= 4095));
|
||||
match(ConP);
|
||||
@ -3616,6 +3671,26 @@ operand immL_32bits() %{
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Long Immediate: cheap (materialize in <= 3 instructions)
|
||||
operand immL_cheap() %{
|
||||
predicate(!VM_Version::is_niagara1_plus() || MacroAssembler::size_of_set64(n->get_long()) <= 3);
|
||||
match(ConL);
|
||||
op_cost(0);
|
||||
|
||||
format %{ %}
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Long Immediate: expensive (materialize in > 3 instructions)
|
||||
operand immL_expensive() %{
|
||||
predicate(VM_Version::is_niagara1_plus() && MacroAssembler::size_of_set64(n->get_long()) > 3);
|
||||
match(ConL);
|
||||
op_cost(0);
|
||||
|
||||
format %{ %}
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Double Immediate
|
||||
operand immD() %{
|
||||
match(ConD);
|
||||
@ -5981,25 +6056,59 @@ instruct loadConI13( iRegI dst, immI13 src ) %{
|
||||
ins_pipe(ialu_imm);
|
||||
%}
|
||||
|
||||
instruct loadConP(iRegP dst, immP src) %{
|
||||
match(Set dst src);
|
||||
#ifndef _LP64
|
||||
instruct loadConP(iRegP dst, immP con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(DEFAULT_COST * 3/2);
|
||||
format %{ "SET $src,$dst\t!ptr" %}
|
||||
// This rule does not use "expand" unlike loadConI because then
|
||||
// the result type is not known to be an Oop. An ADLC
|
||||
// enhancement will be needed to make that work - not worth it!
|
||||
|
||||
ins_encode( SetPtr( src, dst ) );
|
||||
format %{ "SET $con,$dst\t!ptr" %}
|
||||
ins_encode %{
|
||||
// [RGV] This next line should be generated from ADLC
|
||||
if (_opnds[1]->constant_is_oop()) {
|
||||
intptr_t val = $con$$constant;
|
||||
__ set_oop_constant((jobject) val, $dst$$Register);
|
||||
} else { // non-oop pointers, e.g. card mark base, heap top
|
||||
__ set($con$$constant, $dst$$Register);
|
||||
}
|
||||
%}
|
||||
ins_pipe(loadConP);
|
||||
|
||||
%}
|
||||
#else
|
||||
instruct loadConP_set(iRegP dst, immP_set con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(DEFAULT_COST * 3/2);
|
||||
format %{ "SET $con,$dst\t! ptr" %}
|
||||
ins_encode %{
|
||||
// [RGV] This next line should be generated from ADLC
|
||||
if (_opnds[1]->constant_is_oop()) {
|
||||
intptr_t val = $con$$constant;
|
||||
__ set_oop_constant((jobject) val, $dst$$Register);
|
||||
} else { // non-oop pointers, e.g. card mark base, heap top
|
||||
__ set($con$$constant, $dst$$Register);
|
||||
}
|
||||
%}
|
||||
ins_pipe(loadConP);
|
||||
%}
|
||||
|
||||
instruct loadConP_load(iRegP dst, immP_load con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(MEMORY_REF_COST);
|
||||
format %{ "LD [$constanttablebase + $constantoffset],$dst\t! load from constant table: ptr=$con" %}
|
||||
ins_encode %{
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset($con), $dst$$Register);
|
||||
__ ld_ptr($constanttablebase, con_offset, $dst$$Register);
|
||||
%}
|
||||
ins_pipe(loadConP);
|
||||
%}
|
||||
#endif // _LP64
|
||||
|
||||
instruct loadConP0(iRegP dst, immP0 src) %{
|
||||
match(Set dst src);
|
||||
|
||||
size(4);
|
||||
format %{ "CLR $dst\t!ptr" %}
|
||||
ins_encode( SetNull( dst ) );
|
||||
ins_encode %{
|
||||
__ clr($dst$$Register);
|
||||
%}
|
||||
ins_pipe(ialu_imm);
|
||||
%}
|
||||
|
||||
@ -6019,7 +6128,9 @@ instruct loadConN0(iRegN dst, immN0 src) %{
|
||||
|
||||
size(4);
|
||||
format %{ "CLR $dst\t! compressed NULL ptr" %}
|
||||
ins_encode( SetNull( dst ) );
|
||||
ins_encode %{
|
||||
__ clr($dst$$Register);
|
||||
%}
|
||||
ins_pipe(ialu_imm);
|
||||
%}
|
||||
|
||||
@ -6034,13 +6145,27 @@ instruct loadConN(iRegN dst, immN src) %{
|
||||
ins_pipe(ialu_hi_lo_reg);
|
||||
%}
|
||||
|
||||
instruct loadConL(iRegL dst, immL src, o7RegL tmp) %{
|
||||
// %%% maybe this should work like loadConD
|
||||
match(Set dst src);
|
||||
// Materialize long value (predicated by immL_cheap).
|
||||
instruct loadConL_set64(iRegL dst, immL_cheap con, o7RegL tmp) %{
|
||||
match(Set dst con);
|
||||
effect(KILL tmp);
|
||||
ins_cost(DEFAULT_COST * 4);
|
||||
format %{ "SET64 $src,$dst KILL $tmp\t! long" %}
|
||||
ins_encode( LdImmL(src, dst, tmp) );
|
||||
ins_cost(DEFAULT_COST * 3);
|
||||
format %{ "SET64 $con,$dst KILL $tmp\t! cheap long" %}
|
||||
ins_encode %{
|
||||
__ set64($con$$constant, $dst$$Register, $tmp$$Register);
|
||||
%}
|
||||
ins_pipe(loadConL);
|
||||
%}
|
||||
|
||||
// Load long value from constant table (predicated by immL_expensive).
|
||||
instruct loadConL_ldx(iRegL dst, immL_expensive con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(MEMORY_REF_COST);
|
||||
format %{ "LDX [$constanttablebase + $constantoffset],$dst\t! load from constant table: long=$con" %}
|
||||
ins_encode %{
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset($con), $dst$$Register);
|
||||
__ ldx($constanttablebase, con_offset, $dst$$Register);
|
||||
%}
|
||||
ins_pipe(loadConL);
|
||||
%}
|
||||
|
||||
@ -6063,50 +6188,26 @@ instruct loadConL13( iRegL dst, immL13 src ) %{
|
||||
ins_pipe(ialu_imm);
|
||||
%}
|
||||
|
||||
instruct loadConF(regF dst, immF src, o7RegP tmp) %{
|
||||
match(Set dst src);
|
||||
instruct loadConF(regF dst, immF con, o7RegI tmp) %{
|
||||
match(Set dst con);
|
||||
effect(KILL tmp);
|
||||
|
||||
#ifdef _LP64
|
||||
size(8*4);
|
||||
#else
|
||||
size(2*4);
|
||||
#endif
|
||||
|
||||
format %{ "SETHI hi(&$src),$tmp\t!get float $src from table\n\t"
|
||||
"LDF [$tmp+lo(&$src)],$dst" %}
|
||||
format %{ "LDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: float=$con" %}
|
||||
ins_encode %{
|
||||
address float_address = __ float_constant($src$$constant);
|
||||
RelocationHolder rspec = internal_word_Relocation::spec(float_address);
|
||||
AddressLiteral addrlit(float_address, rspec);
|
||||
|
||||
__ sethi(addrlit, $tmp$$Register);
|
||||
__ ldf(FloatRegisterImpl::S, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec);
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset($con), $tmp$$Register);
|
||||
__ ldf(FloatRegisterImpl::S, $constanttablebase, con_offset, $dst$$FloatRegister);
|
||||
%}
|
||||
ins_pipe(loadConFD);
|
||||
%}
|
||||
|
||||
instruct loadConD(regD dst, immD src, o7RegP tmp) %{
|
||||
match(Set dst src);
|
||||
instruct loadConD(regD dst, immD con, o7RegI tmp) %{
|
||||
match(Set dst con);
|
||||
effect(KILL tmp);
|
||||
|
||||
#ifdef _LP64
|
||||
size(8*4);
|
||||
#else
|
||||
size(2*4);
|
||||
#endif
|
||||
|
||||
format %{ "SETHI hi(&$src),$tmp\t!get double $src from table\n\t"
|
||||
"LDDF [$tmp+lo(&$src)],$dst" %}
|
||||
format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: double=$con" %}
|
||||
ins_encode %{
|
||||
address double_address = __ double_constant($src$$constant);
|
||||
RelocationHolder rspec = internal_word_Relocation::spec(double_address);
|
||||
AddressLiteral addrlit(double_address, rspec);
|
||||
|
||||
__ sethi(addrlit, $tmp$$Register);
|
||||
// XXX This is a quick fix for 6833573.
|
||||
//__ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec);
|
||||
__ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), as_DoubleFloatRegister($dst$$reg), rspec);
|
||||
//__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset($con), $dst$$FloatRegister);
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset($con), $tmp$$Register);
|
||||
__ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
|
||||
%}
|
||||
ins_pipe(loadConFD);
|
||||
%}
|
||||
@ -8558,16 +8659,16 @@ instruct Repl8B_reg(stackSlotD dst, iRegI src) %{
|
||||
%}
|
||||
|
||||
// Replicate scalar constant to packed byte values in Double register
|
||||
instruct Repl8B_immI(regD dst, immI13 src, o7RegP tmp) %{
|
||||
match(Set dst (Replicate8B src));
|
||||
#ifdef _LP64
|
||||
size(36);
|
||||
#else
|
||||
size(8);
|
||||
#endif
|
||||
format %{ "SETHI hi(&Repl8($src)),$tmp\t!get Repl8B($src) from table\n\t"
|
||||
"LDDF [$tmp+lo(&Repl8($src))],$dst" %}
|
||||
ins_encode( LdReplImmI(src, dst, tmp, (8), (1)) );
|
||||
instruct Repl8B_immI(regD dst, immI13 con, o7RegI tmp) %{
|
||||
match(Set dst (Replicate8B con));
|
||||
effect(KILL tmp);
|
||||
format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl8B($con)" %}
|
||||
ins_encode %{
|
||||
// XXX This is a quick fix for 6833573.
|
||||
//__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 8, 1)), $dst$$FloatRegister);
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 8, 1)), $tmp$$Register);
|
||||
__ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
|
||||
%}
|
||||
ins_pipe(loadConFD);
|
||||
%}
|
||||
|
||||
@ -8594,16 +8695,16 @@ instruct Repl4C_reg(stackSlotD dst, iRegI src) %{
|
||||
%}
|
||||
|
||||
// Replicate scalar constant to packed char values in Double register
|
||||
instruct Repl4C_immI(regD dst, immI src, o7RegP tmp) %{
|
||||
match(Set dst (Replicate4C src));
|
||||
#ifdef _LP64
|
||||
size(36);
|
||||
#else
|
||||
size(8);
|
||||
#endif
|
||||
format %{ "SETHI hi(&Repl4($src)),$tmp\t!get Repl4C($src) from table\n\t"
|
||||
"LDDF [$tmp+lo(&Repl4($src))],$dst" %}
|
||||
ins_encode( LdReplImmI(src, dst, tmp, (4), (2)) );
|
||||
instruct Repl4C_immI(regD dst, immI con, o7RegI tmp) %{
|
||||
match(Set dst (Replicate4C con));
|
||||
effect(KILL tmp);
|
||||
format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4C($con)" %}
|
||||
ins_encode %{
|
||||
// XXX This is a quick fix for 6833573.
|
||||
//__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister);
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register);
|
||||
__ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
|
||||
%}
|
||||
ins_pipe(loadConFD);
|
||||
%}
|
||||
|
||||
@ -8630,16 +8731,16 @@ instruct Repl4S_reg(stackSlotD dst, iRegI src) %{
|
||||
%}
|
||||
|
||||
// Replicate scalar constant to packed short values in Double register
|
||||
instruct Repl4S_immI(regD dst, immI src, o7RegP tmp) %{
|
||||
match(Set dst (Replicate4S src));
|
||||
#ifdef _LP64
|
||||
size(36);
|
||||
#else
|
||||
size(8);
|
||||
#endif
|
||||
format %{ "SETHI hi(&Repl4($src)),$tmp\t!get Repl4S($src) from table\n\t"
|
||||
"LDDF [$tmp+lo(&Repl4($src))],$dst" %}
|
||||
ins_encode( LdReplImmI(src, dst, tmp, (4), (2)) );
|
||||
instruct Repl4S_immI(regD dst, immI con, o7RegI tmp) %{
|
||||
match(Set dst (Replicate4S con));
|
||||
effect(KILL tmp);
|
||||
format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4S($con)" %}
|
||||
ins_encode %{
|
||||
// XXX This is a quick fix for 6833573.
|
||||
//__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister);
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register);
|
||||
__ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
|
||||
%}
|
||||
ins_pipe(loadConFD);
|
||||
%}
|
||||
|
||||
@ -8664,16 +8765,16 @@ instruct Repl2I_reg(stackSlotD dst, iRegI src) %{
|
||||
%}
|
||||
|
||||
// Replicate scalar zero constant to packed int values in Double register
|
||||
instruct Repl2I_immI(regD dst, immI src, o7RegP tmp) %{
|
||||
match(Set dst (Replicate2I src));
|
||||
#ifdef _LP64
|
||||
size(36);
|
||||
#else
|
||||
size(8);
|
||||
#endif
|
||||
format %{ "SETHI hi(&Repl2($src)),$tmp\t!get Repl2I($src) from table\n\t"
|
||||
"LDDF [$tmp+lo(&Repl2($src))],$dst" %}
|
||||
ins_encode( LdReplImmI(src, dst, tmp, (2), (4)) );
|
||||
instruct Repl2I_immI(regD dst, immI con, o7RegI tmp) %{
|
||||
match(Set dst (Replicate2I con));
|
||||
effect(KILL tmp);
|
||||
format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2I($con)" %}
|
||||
ins_encode %{
|
||||
// XXX This is a quick fix for 6833573.
|
||||
//__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 2, 4)), $dst$$FloatRegister);
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 2, 4)), $tmp$$Register);
|
||||
__ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
|
||||
%}
|
||||
ins_pipe(loadConFD);
|
||||
%}
|
||||
|
||||
@ -8929,12 +9030,27 @@ instruct jumpXtnd(iRegX switch_val, o7RegI table) %{
|
||||
|
||||
ins_cost(350);
|
||||
|
||||
format %{ "SETHI [hi(table_base)],O7\n\t"
|
||||
"ADD O7, lo(table_base), O7\n\t"
|
||||
"LD [O7+$switch_val], O7\n\t"
|
||||
format %{ "ADD $constanttablebase, $constantoffset, O7\n\t"
|
||||
"LD [O7 + $switch_val], O7\n\t"
|
||||
"JUMP O7"
|
||||
%}
|
||||
ins_encode( jump_enc( switch_val, table) );
|
||||
ins_encode %{
|
||||
// Calculate table address into a register.
|
||||
Register table_reg;
|
||||
Register label_reg = O7;
|
||||
if (constant_offset() == 0) {
|
||||
table_reg = $constanttablebase;
|
||||
} else {
|
||||
table_reg = O7;
|
||||
RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset, O7);
|
||||
__ add($constanttablebase, con_offset, table_reg);
|
||||
}
|
||||
|
||||
// Jump to base address + switch value
|
||||
__ ld_ptr(table_reg, $switch_val$$Register, label_reg);
|
||||
__ jmp(label_reg, G0);
|
||||
__ delayed()->nop();
|
||||
%}
|
||||
ins_pc_relative(1);
|
||||
ins_pipe(ialu_reg_reg);
|
||||
%}
|
||||
|
@ -80,9 +80,6 @@ protected:
|
||||
static bool is_sparc64(int features) { return (features & fmaf_instructions_m) != 0; }
|
||||
|
||||
static int maximum_niagara1_processor_count() { return 32; }
|
||||
// Returns true if the platform is in the niagara line and
|
||||
// newer than the niagara1.
|
||||
static bool is_niagara1_plus();
|
||||
|
||||
public:
|
||||
// Initialization
|
||||
@ -105,6 +102,9 @@ public:
|
||||
static bool is_ultra3() { return (_features & ultra3_m) == ultra3_m; }
|
||||
static bool is_sun4v() { return (_features & sun4v_m) != 0; }
|
||||
static bool is_niagara1() { return is_niagara1(_features); }
|
||||
// Returns true if the platform is in the niagara line and
|
||||
// newer than the niagara1.
|
||||
static bool is_niagara1_plus();
|
||||
static bool is_sparc64() { return is_sparc64(_features); }
|
||||
|
||||
static bool has_fast_fxtof() { return has_v9() && !is_ultra3(); }
|
||||
|
@ -2649,6 +2649,37 @@ void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {
|
||||
emit_byte(0xC0 | encode);
|
||||
}
|
||||
|
||||
void Assembler::sqrtsd(XMMRegister dst, Address src) {
|
||||
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
|
||||
InstructionMark im(this);
|
||||
emit_byte(0xF2);
|
||||
prefix(src, dst);
|
||||
emit_byte(0x0F);
|
||||
emit_byte(0x51);
|
||||
emit_operand(dst, src);
|
||||
}
|
||||
|
||||
void Assembler::sqrtss(XMMRegister dst, XMMRegister src) {
|
||||
// HMM Table D-1 says sse2
|
||||
// NOT_LP64(assert(VM_Version::supports_sse(), ""));
|
||||
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
|
||||
emit_byte(0xF3);
|
||||
int encode = prefix_and_encode(dst->encoding(), src->encoding());
|
||||
emit_byte(0x0F);
|
||||
emit_byte(0x51);
|
||||
emit_byte(0xC0 | encode);
|
||||
}
|
||||
|
||||
void Assembler::sqrtss(XMMRegister dst, Address src) {
|
||||
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
|
||||
InstructionMark im(this);
|
||||
emit_byte(0xF3);
|
||||
prefix(src, dst);
|
||||
emit_byte(0x0F);
|
||||
emit_byte(0x51);
|
||||
emit_operand(dst, src);
|
||||
}
|
||||
|
||||
void Assembler::stmxcsr( Address dst) {
|
||||
NOT_LP64(assert(VM_Version::supports_sse(), ""));
|
||||
InstructionMark im(this);
|
||||
@ -4358,16 +4389,6 @@ void Assembler::shrq(Register dst) {
|
||||
emit_byte(0xE8 | encode);
|
||||
}
|
||||
|
||||
void Assembler::sqrtsd(XMMRegister dst, Address src) {
|
||||
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
|
||||
InstructionMark im(this);
|
||||
emit_byte(0xF2);
|
||||
prefix(src, dst);
|
||||
emit_byte(0x0F);
|
||||
emit_byte(0x51);
|
||||
emit_operand(dst, src);
|
||||
}
|
||||
|
||||
void Assembler::subq(Address dst, int32_t imm32) {
|
||||
InstructionMark im(this);
|
||||
prefixq(dst);
|
||||
@ -4929,10 +4950,6 @@ void MacroAssembler::movptr(Address dst, intptr_t src) {
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::movsd(XMMRegister dst, AddressLiteral src) {
|
||||
movsd(dst, as_Address(src));
|
||||
}
|
||||
|
||||
void MacroAssembler::pop_callee_saved_registers() {
|
||||
pop(rcx);
|
||||
pop(rdx);
|
||||
|
@ -135,6 +135,7 @@ REGISTER_DECLARATION(Register, r15_thread, r15); // callee-saved
|
||||
// Using noreg ensures if the dead code is incorrectly live and executed it
|
||||
// will cause an assertion failure
|
||||
#define rscratch1 noreg
|
||||
#define rscratch2 noreg
|
||||
|
||||
#endif // _LP64
|
||||
|
||||
@ -1352,6 +1353,10 @@ private:
|
||||
void sqrtsd(XMMRegister dst, Address src);
|
||||
void sqrtsd(XMMRegister dst, XMMRegister src);
|
||||
|
||||
// Compute Square Root of Scalar Single-Precision Floating-Point Value
|
||||
void sqrtss(XMMRegister dst, Address src);
|
||||
void sqrtss(XMMRegister dst, XMMRegister src);
|
||||
|
||||
void std() { emit_byte(0xfd); }
|
||||
|
||||
void stmxcsr( Address dst );
|
||||
@ -2124,6 +2129,9 @@ class MacroAssembler: public Assembler {
|
||||
void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); }
|
||||
void comisd(XMMRegister dst, AddressLiteral src);
|
||||
|
||||
void fadd_s(Address src) { Assembler::fadd_s(src); }
|
||||
void fadd_s(AddressLiteral src) { Assembler::fadd_s(as_Address(src)); }
|
||||
|
||||
void fldcw(Address src) { Assembler::fldcw(src); }
|
||||
void fldcw(AddressLiteral src);
|
||||
|
||||
@ -2137,6 +2145,9 @@ class MacroAssembler: public Assembler {
|
||||
void fld_x(Address src) { Assembler::fld_x(src); }
|
||||
void fld_x(AddressLiteral src);
|
||||
|
||||
void fmul_s(Address src) { Assembler::fmul_s(src); }
|
||||
void fmul_s(AddressLiteral src) { Assembler::fmul_s(as_Address(src)); }
|
||||
|
||||
void ldmxcsr(Address src) { Assembler::ldmxcsr(src); }
|
||||
void ldmxcsr(AddressLiteral src);
|
||||
|
||||
@ -2153,10 +2164,50 @@ private:
|
||||
|
||||
public:
|
||||
|
||||
void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); }
|
||||
void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); }
|
||||
void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); }
|
||||
void movsd(XMMRegister dst, AddressLiteral src);
|
||||
void addsd(XMMRegister dst, XMMRegister src) { Assembler::addsd(dst, src); }
|
||||
void addsd(XMMRegister dst, Address src) { Assembler::addsd(dst, src); }
|
||||
void addsd(XMMRegister dst, AddressLiteral src) { Assembler::addsd(dst, as_Address(src)); }
|
||||
|
||||
void addss(XMMRegister dst, XMMRegister src) { Assembler::addss(dst, src); }
|
||||
void addss(XMMRegister dst, Address src) { Assembler::addss(dst, src); }
|
||||
void addss(XMMRegister dst, AddressLiteral src) { Assembler::addss(dst, as_Address(src)); }
|
||||
|
||||
void divsd(XMMRegister dst, XMMRegister src) { Assembler::divsd(dst, src); }
|
||||
void divsd(XMMRegister dst, Address src) { Assembler::divsd(dst, src); }
|
||||
void divsd(XMMRegister dst, AddressLiteral src) { Assembler::divsd(dst, as_Address(src)); }
|
||||
|
||||
void divss(XMMRegister dst, XMMRegister src) { Assembler::divss(dst, src); }
|
||||
void divss(XMMRegister dst, Address src) { Assembler::divss(dst, src); }
|
||||
void divss(XMMRegister dst, AddressLiteral src) { Assembler::divss(dst, as_Address(src)); }
|
||||
|
||||
void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); }
|
||||
void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); }
|
||||
void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); }
|
||||
void movsd(XMMRegister dst, AddressLiteral src) { Assembler::movsd(dst, as_Address(src)); }
|
||||
|
||||
void mulsd(XMMRegister dst, XMMRegister src) { Assembler::mulsd(dst, src); }
|
||||
void mulsd(XMMRegister dst, Address src) { Assembler::mulsd(dst, src); }
|
||||
void mulsd(XMMRegister dst, AddressLiteral src) { Assembler::mulsd(dst, as_Address(src)); }
|
||||
|
||||
void mulss(XMMRegister dst, XMMRegister src) { Assembler::mulss(dst, src); }
|
||||
void mulss(XMMRegister dst, Address src) { Assembler::mulss(dst, src); }
|
||||
void mulss(XMMRegister dst, AddressLiteral src) { Assembler::mulss(dst, as_Address(src)); }
|
||||
|
||||
void sqrtsd(XMMRegister dst, XMMRegister src) { Assembler::sqrtsd(dst, src); }
|
||||
void sqrtsd(XMMRegister dst, Address src) { Assembler::sqrtsd(dst, src); }
|
||||
void sqrtsd(XMMRegister dst, AddressLiteral src) { Assembler::sqrtsd(dst, as_Address(src)); }
|
||||
|
||||
void sqrtss(XMMRegister dst, XMMRegister src) { Assembler::sqrtss(dst, src); }
|
||||
void sqrtss(XMMRegister dst, Address src) { Assembler::sqrtss(dst, src); }
|
||||
void sqrtss(XMMRegister dst, AddressLiteral src) { Assembler::sqrtss(dst, as_Address(src)); }
|
||||
|
||||
void subsd(XMMRegister dst, XMMRegister src) { Assembler::subsd(dst, src); }
|
||||
void subsd(XMMRegister dst, Address src) { Assembler::subsd(dst, src); }
|
||||
void subsd(XMMRegister dst, AddressLiteral src) { Assembler::subsd(dst, as_Address(src)); }
|
||||
|
||||
void subss(XMMRegister dst, XMMRegister src) { Assembler::subss(dst, src); }
|
||||
void subss(XMMRegister dst, Address src) { Assembler::subss(dst, src); }
|
||||
void subss(XMMRegister dst, AddressLiteral src) { Assembler::subss(dst, as_Address(src)); }
|
||||
|
||||
void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); }
|
||||
void ucomiss(XMMRegister dst, Address src) { Assembler::ucomiss(dst, src); }
|
||||
|
@ -483,7 +483,7 @@ void G1PreBarrierStub::emit_code(LIR_Assembler* ce) {
|
||||
|
||||
Register pre_val_reg = pre_val()->as_register();
|
||||
|
||||
ce->mem2reg(addr(), pre_val(), T_OBJECT, patch_code(), info(), false);
|
||||
ce->mem2reg(addr(), pre_val(), T_OBJECT, patch_code(), info(), false /*wide*/, false /*unaligned*/);
|
||||
|
||||
__ cmpptr(pre_val_reg, (int32_t) NULL_WORD);
|
||||
__ jcc(Assembler::equal, _continuation);
|
||||
|
@ -61,8 +61,8 @@ enum {
|
||||
pd_nof_xmm_regs_linearscan = pd_nof_xmm_regs_frame_map, // number of registers visible to linear scan
|
||||
pd_first_cpu_reg = 0,
|
||||
pd_last_cpu_reg = NOT_LP64(5) LP64_ONLY(11),
|
||||
pd_first_byte_reg = 2,
|
||||
pd_last_byte_reg = 5,
|
||||
pd_first_byte_reg = NOT_LP64(2) LP64_ONLY(0),
|
||||
pd_last_byte_reg = NOT_LP64(5) LP64_ONLY(11),
|
||||
pd_first_fpu_reg = pd_nof_cpu_regs_frame_map,
|
||||
pd_last_fpu_reg = pd_first_fpu_reg + 7,
|
||||
pd_first_xmm_reg = pd_nof_cpu_regs_frame_map + pd_nof_fpu_regs_frame_map,
|
||||
|
@ -158,9 +158,11 @@ void FrameMap::initialize() {
|
||||
map_register( 6, r8); r8_opr = LIR_OprFact::single_cpu(6);
|
||||
map_register( 7, r9); r9_opr = LIR_OprFact::single_cpu(7);
|
||||
map_register( 8, r11); r11_opr = LIR_OprFact::single_cpu(8);
|
||||
map_register( 9, r12); r12_opr = LIR_OprFact::single_cpu(9);
|
||||
map_register(10, r13); r13_opr = LIR_OprFact::single_cpu(10);
|
||||
map_register(11, r14); r14_opr = LIR_OprFact::single_cpu(11);
|
||||
map_register( 9, r13); r13_opr = LIR_OprFact::single_cpu(9);
|
||||
map_register(10, r14); r14_opr = LIR_OprFact::single_cpu(10);
|
||||
// r12 is allocated conditionally. With compressed oops it holds
|
||||
// the heapbase value and is not visible to the allocator.
|
||||
map_register(11, r12); r12_opr = LIR_OprFact::single_cpu(11);
|
||||
// The unallocatable registers are at the end
|
||||
map_register(12, r10); r10_opr = LIR_OprFact::single_cpu(12);
|
||||
map_register(13, r15); r15_opr = LIR_OprFact::single_cpu(13);
|
||||
@ -191,9 +193,9 @@ void FrameMap::initialize() {
|
||||
_caller_save_cpu_regs[6] = r8_opr;
|
||||
_caller_save_cpu_regs[7] = r9_opr;
|
||||
_caller_save_cpu_regs[8] = r11_opr;
|
||||
_caller_save_cpu_regs[9] = r12_opr;
|
||||
_caller_save_cpu_regs[10] = r13_opr;
|
||||
_caller_save_cpu_regs[11] = r14_opr;
|
||||
_caller_save_cpu_regs[9] = r13_opr;
|
||||
_caller_save_cpu_regs[10] = r14_opr;
|
||||
_caller_save_cpu_regs[11] = r12_opr;
|
||||
#endif // _LP64
|
||||
|
||||
|
||||
|
@ -130,4 +130,15 @@
|
||||
return _caller_save_xmm_regs[i];
|
||||
}
|
||||
|
||||
static int adjust_reg_range(int range) {
|
||||
// Reduce the number of available regs (to free r12) in case of compressed oops
|
||||
if (UseCompressedOops) return range - 1;
|
||||
return range;
|
||||
}
|
||||
|
||||
static int nof_caller_save_cpu_regs() { return adjust_reg_range(pd_nof_caller_save_cpu_regs_frame_map); }
|
||||
static int last_cpu_reg() { return adjust_reg_range(pd_last_cpu_reg); }
|
||||
static int last_byte_reg() { return adjust_reg_range(pd_last_byte_reg); }
|
||||
|
||||
#endif // CPU_X86_VM_C1_FRAMEMAP_X86_HPP
|
||||
|
||||
|
@ -343,8 +343,8 @@ int LIR_Assembler::check_icache() {
|
||||
Register receiver = FrameMap::receiver_opr->as_register();
|
||||
Register ic_klass = IC_Klass;
|
||||
const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
|
||||
|
||||
if (!VerifyOops) {
|
||||
const bool do_post_padding = VerifyOops || UseCompressedOops;
|
||||
if (!do_post_padding) {
|
||||
// insert some nops so that the verified entry point is aligned on CodeEntryAlignment
|
||||
while ((__ offset() + ic_cmp_size) % CodeEntryAlignment != 0) {
|
||||
__ nop();
|
||||
@ -352,8 +352,8 @@ int LIR_Assembler::check_icache() {
|
||||
}
|
||||
int offset = __ offset();
|
||||
__ inline_cache_check(receiver, IC_Klass);
|
||||
assert(__ offset() % CodeEntryAlignment == 0 || VerifyOops, "alignment must be correct");
|
||||
if (VerifyOops) {
|
||||
assert(__ offset() % CodeEntryAlignment == 0 || do_post_padding, "alignment must be correct");
|
||||
if (do_post_padding) {
|
||||
// force alignment after the cache check.
|
||||
// It's been verified to be aligned if !VerifyOops
|
||||
__ align(CodeEntryAlignment);
|
||||
@ -559,16 +559,16 @@ void LIR_Assembler::emit_string_compare(LIR_Opr arg0, LIR_Opr arg1, LIR_Opr dst,
|
||||
__ movptr (rax, arg1->as_register());
|
||||
|
||||
// Get addresses of first characters from both Strings
|
||||
__ movptr (rsi, Address(rax, java_lang_String::value_offset_in_bytes()));
|
||||
__ movptr (rcx, Address(rax, java_lang_String::offset_offset_in_bytes()));
|
||||
__ lea (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
|
||||
__ load_heap_oop(rsi, Address(rax, java_lang_String::value_offset_in_bytes()));
|
||||
__ movptr (rcx, Address(rax, java_lang_String::offset_offset_in_bytes()));
|
||||
__ lea (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
|
||||
|
||||
|
||||
// rbx, may be NULL
|
||||
add_debug_info_for_null_check_here(info);
|
||||
__ movptr (rdi, Address(rbx, java_lang_String::value_offset_in_bytes()));
|
||||
__ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes()));
|
||||
__ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
|
||||
__ load_heap_oop(rdi, Address(rbx, java_lang_String::value_offset_in_bytes()));
|
||||
__ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes()));
|
||||
__ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
|
||||
|
||||
// compute minimum length (in rax) and difference of lengths (on top of stack)
|
||||
if (VM_Version::supports_cmov()) {
|
||||
@ -696,13 +696,18 @@ void LIR_Assembler::const2reg(LIR_Opr src, LIR_Opr dest, LIR_PatchCode patch_cod
|
||||
LIR_Const* c = src->as_constant_ptr();
|
||||
|
||||
switch (c->type()) {
|
||||
case T_INT:
|
||||
case T_ADDRESS: {
|
||||
case T_INT: {
|
||||
assert(patch_code == lir_patch_none, "no patching handled here");
|
||||
__ movl(dest->as_register(), c->as_jint());
|
||||
break;
|
||||
}
|
||||
|
||||
case T_ADDRESS: {
|
||||
assert(patch_code == lir_patch_none, "no patching handled here");
|
||||
__ movptr(dest->as_register(), c->as_jint());
|
||||
break;
|
||||
}
|
||||
|
||||
case T_LONG: {
|
||||
assert(patch_code == lir_patch_none, "no patching handled here");
|
||||
#ifdef _LP64
|
||||
@ -780,10 +785,13 @@ void LIR_Assembler::const2stack(LIR_Opr src, LIR_Opr dest) {
|
||||
switch (c->type()) {
|
||||
case T_INT: // fall through
|
||||
case T_FLOAT:
|
||||
case T_ADDRESS:
|
||||
__ movl(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jint_bits());
|
||||
break;
|
||||
|
||||
case T_ADDRESS:
|
||||
__ movptr(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jint_bits());
|
||||
break;
|
||||
|
||||
case T_OBJECT:
|
||||
__ movoop(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jobject());
|
||||
break;
|
||||
@ -806,7 +814,7 @@ void LIR_Assembler::const2stack(LIR_Opr src, LIR_Opr dest) {
|
||||
}
|
||||
}
|
||||
|
||||
void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info ) {
|
||||
void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info, bool wide) {
|
||||
assert(src->is_constant(), "should not call otherwise");
|
||||
assert(dest->is_address(), "should not call otherwise");
|
||||
LIR_Const* c = src->as_constant_ptr();
|
||||
@ -816,14 +824,21 @@ void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmi
|
||||
switch (type) {
|
||||
case T_INT: // fall through
|
||||
case T_FLOAT:
|
||||
case T_ADDRESS:
|
||||
__ movl(as_Address(addr), c->as_jint_bits());
|
||||
break;
|
||||
|
||||
case T_ADDRESS:
|
||||
__ movptr(as_Address(addr), c->as_jint_bits());
|
||||
break;
|
||||
|
||||
case T_OBJECT: // fall through
|
||||
case T_ARRAY:
|
||||
if (c->as_jobject() == NULL) {
|
||||
__ movptr(as_Address(addr), NULL_WORD);
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ movl(as_Address(addr), (int32_t)NULL_WORD);
|
||||
} else {
|
||||
__ movptr(as_Address(addr), NULL_WORD);
|
||||
}
|
||||
} else {
|
||||
if (is_literal_address(addr)) {
|
||||
ShouldNotReachHere();
|
||||
@ -831,8 +846,14 @@ void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmi
|
||||
} else {
|
||||
#ifdef _LP64
|
||||
__ movoop(rscratch1, c->as_jobject());
|
||||
null_check_here = code_offset();
|
||||
__ movptr(as_Address_lo(addr), rscratch1);
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ encode_heap_oop(rscratch1);
|
||||
null_check_here = code_offset();
|
||||
__ movl(as_Address_lo(addr), rscratch1);
|
||||
} else {
|
||||
null_check_here = code_offset();
|
||||
__ movptr(as_Address_lo(addr), rscratch1);
|
||||
}
|
||||
#else
|
||||
__ movoop(as_Address(addr), c->as_jobject());
|
||||
#endif
|
||||
@ -1009,22 +1030,28 @@ void LIR_Assembler::reg2stack(LIR_Opr src, LIR_Opr dest, BasicType type, bool po
|
||||
}
|
||||
|
||||
|
||||
void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool /* unaligned */) {
|
||||
void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool wide, bool /* unaligned */) {
|
||||
LIR_Address* to_addr = dest->as_address_ptr();
|
||||
PatchingStub* patch = NULL;
|
||||
Register compressed_src = rscratch1;
|
||||
|
||||
if (type == T_ARRAY || type == T_OBJECT) {
|
||||
__ verify_oop(src->as_register());
|
||||
#ifdef _LP64
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ movptr(compressed_src, src->as_register());
|
||||
__ encode_heap_oop(compressed_src);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (patch_code != lir_patch_none) {
|
||||
patch = new PatchingStub(_masm, PatchingStub::access_field_id);
|
||||
Address toa = as_Address(to_addr);
|
||||
assert(toa.disp() != 0, "must have");
|
||||
}
|
||||
if (info != NULL) {
|
||||
add_debug_info_for_null_check_here(info);
|
||||
}
|
||||
|
||||
int null_check_here = code_offset();
|
||||
switch (type) {
|
||||
case T_FLOAT: {
|
||||
if (src->is_single_xmm()) {
|
||||
@ -1050,13 +1077,17 @@ void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_Patch
|
||||
break;
|
||||
}
|
||||
|
||||
case T_ADDRESS: // fall through
|
||||
case T_ARRAY: // fall through
|
||||
case T_OBJECT: // fall through
|
||||
#ifdef _LP64
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ movl(as_Address(to_addr), compressed_src);
|
||||
} else {
|
||||
__ movptr(as_Address(to_addr), src->as_register());
|
||||
}
|
||||
break;
|
||||
case T_ADDRESS:
|
||||
__ movptr(as_Address(to_addr), src->as_register());
|
||||
break;
|
||||
#endif // _LP64
|
||||
case T_INT:
|
||||
__ movl(as_Address(to_addr), src->as_register());
|
||||
break;
|
||||
@ -1113,6 +1144,9 @@ void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_Patch
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
if (info != NULL) {
|
||||
add_debug_info_for_null_check(null_check_here, info);
|
||||
}
|
||||
|
||||
if (patch_code != lir_patch_none) {
|
||||
patching_epilog(patch, patch_code, to_addr->base()->as_register(), info);
|
||||
@ -1196,7 +1230,7 @@ void LIR_Assembler::stack2stack(LIR_Opr src, LIR_Opr dest, BasicType type) {
|
||||
}
|
||||
|
||||
|
||||
void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool /* unaligned */) {
|
||||
void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool wide, bool /* unaligned */) {
|
||||
assert(src->is_address(), "should not call otherwise");
|
||||
assert(dest->is_register(), "should not call otherwise");
|
||||
|
||||
@ -1250,13 +1284,18 @@ void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_Patch
|
||||
break;
|
||||
}
|
||||
|
||||
case T_ADDRESS: // fall through
|
||||
case T_OBJECT: // fall through
|
||||
case T_ARRAY: // fall through
|
||||
#ifdef _LP64
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ movl(dest->as_register(), from_addr);
|
||||
} else {
|
||||
__ movptr(dest->as_register(), from_addr);
|
||||
}
|
||||
break;
|
||||
|
||||
case T_ADDRESS:
|
||||
__ movptr(dest->as_register(), from_addr);
|
||||
break;
|
||||
#endif // _L64
|
||||
case T_INT:
|
||||
__ movl(dest->as_register(), from_addr);
|
||||
break;
|
||||
@ -1351,6 +1390,11 @@ void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_Patch
|
||||
}
|
||||
|
||||
if (type == T_ARRAY || type == T_OBJECT) {
|
||||
#ifdef _LP64
|
||||
if (UseCompressedOops && !wide) {
|
||||
__ decode_heap_oop(dest->as_register());
|
||||
}
|
||||
#endif
|
||||
__ verify_oop(dest->as_register());
|
||||
}
|
||||
}
|
||||
@ -1672,11 +1716,8 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
ciMethod* method = op->profiled_method();
|
||||
assert(method != NULL, "Should have method");
|
||||
int bci = op->profiled_bci();
|
||||
md = method->method_data();
|
||||
if (md == NULL) {
|
||||
bailout("out of memory building methodDataOop");
|
||||
return;
|
||||
}
|
||||
md = method->method_data_or_null();
|
||||
assert(md != NULL, "Sanity");
|
||||
data = md->bci_to_data(bci);
|
||||
assert(data != NULL, "need data for type check");
|
||||
assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
|
||||
@ -1690,7 +1731,7 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
} else if (obj == klass_RInfo) {
|
||||
klass_RInfo = dst;
|
||||
}
|
||||
if (k->is_loaded()) {
|
||||
if (k->is_loaded() && !UseCompressedOops) {
|
||||
select_different_registers(obj, dst, k_RInfo, klass_RInfo);
|
||||
} else {
|
||||
Rtmp1 = op->tmp3()->as_register();
|
||||
@ -1727,21 +1768,26 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
if (op->fast_check()) {
|
||||
// get object class
|
||||
// not a safepoint as obj null check happens earlier
|
||||
if (k->is_loaded()) {
|
||||
#ifdef _LP64
|
||||
__ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
|
||||
#else
|
||||
__ cmpoop(Address(obj, oopDesc::klass_offset_in_bytes()), k->constant_encoding());
|
||||
#endif // _LP64
|
||||
if (UseCompressedOops) {
|
||||
__ load_klass(Rtmp1, obj);
|
||||
__ cmpptr(k_RInfo, Rtmp1);
|
||||
} else {
|
||||
__ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
|
||||
}
|
||||
#else
|
||||
if (k->is_loaded()) {
|
||||
__ cmpoop(Address(obj, oopDesc::klass_offset_in_bytes()), k->constant_encoding());
|
||||
} else {
|
||||
__ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
|
||||
}
|
||||
#endif
|
||||
__ jcc(Assembler::notEqual, *failure_target);
|
||||
// successful cast, fall through to profile or jump
|
||||
} else {
|
||||
// get object class
|
||||
// not a safepoint as obj null check happens earlier
|
||||
__ movptr(klass_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
|
||||
__ load_klass(klass_RInfo, obj);
|
||||
if (k->is_loaded()) {
|
||||
// See if we get an immediate positive hit
|
||||
#ifdef _LP64
|
||||
@ -1796,7 +1842,7 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
Register mdo = klass_RInfo, recv = k_RInfo;
|
||||
__ bind(profile_cast_success);
|
||||
__ movoop(mdo, md->constant_encoding());
|
||||
__ movptr(recv, Address(obj, oopDesc::klass_offset_in_bytes()));
|
||||
__ load_klass(recv, obj);
|
||||
Label update_done;
|
||||
type_profile_helper(mdo, md, data, recv, success);
|
||||
__ jmp(*success);
|
||||
@ -1830,11 +1876,8 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
ciMethod* method = op->profiled_method();
|
||||
assert(method != NULL, "Should have method");
|
||||
int bci = op->profiled_bci();
|
||||
md = method->method_data();
|
||||
if (md == NULL) {
|
||||
bailout("out of memory building methodDataOop");
|
||||
return;
|
||||
}
|
||||
md = method->method_data_or_null();
|
||||
assert(md != NULL, "Sanity");
|
||||
data = md->bci_to_data(bci);
|
||||
assert(data != NULL, "need data for type check");
|
||||
assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
|
||||
@ -1860,10 +1903,10 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
}
|
||||
|
||||
add_debug_info_for_null_check_here(op->info_for_exception());
|
||||
__ movptr(k_RInfo, Address(array, oopDesc::klass_offset_in_bytes()));
|
||||
__ movptr(klass_RInfo, Address(value, oopDesc::klass_offset_in_bytes()));
|
||||
__ load_klass(k_RInfo, array);
|
||||
__ load_klass(klass_RInfo, value);
|
||||
|
||||
// get instance klass
|
||||
// get instance klass (it's already uncompressed)
|
||||
__ movptr(k_RInfo, Address(k_RInfo, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc)));
|
||||
// perform the fast part of the checking logic
|
||||
__ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, NULL);
|
||||
@ -1882,7 +1925,7 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
Register mdo = klass_RInfo, recv = k_RInfo;
|
||||
__ bind(profile_cast_success);
|
||||
__ movoop(mdo, md->constant_encoding());
|
||||
__ movptr(recv, Address(value, oopDesc::klass_offset_in_bytes()));
|
||||
__ load_klass(recv, value);
|
||||
Label update_done;
|
||||
type_profile_helper(mdo, md, data, recv, &done);
|
||||
__ jmpb(done);
|
||||
@ -1946,12 +1989,31 @@ void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
|
||||
assert(cmpval != newval, "cmp and new values must be in different registers");
|
||||
assert(cmpval != addr, "cmp and addr must be in different registers");
|
||||
assert(newval != addr, "new value and addr must be in different registers");
|
||||
if (os::is_MP()) {
|
||||
__ lock();
|
||||
}
|
||||
|
||||
if ( op->code() == lir_cas_obj) {
|
||||
__ cmpxchgptr(newval, Address(addr, 0));
|
||||
} else if (op->code() == lir_cas_int) {
|
||||
#ifdef _LP64
|
||||
if (UseCompressedOops) {
|
||||
__ encode_heap_oop(cmpval);
|
||||
__ mov(rscratch1, newval);
|
||||
__ encode_heap_oop(rscratch1);
|
||||
if (os::is_MP()) {
|
||||
__ lock();
|
||||
}
|
||||
// cmpval (rax) is implicitly used by this instruction
|
||||
__ cmpxchgl(rscratch1, Address(addr, 0));
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
if (os::is_MP()) {
|
||||
__ lock();
|
||||
}
|
||||
__ cmpxchgptr(newval, Address(addr, 0));
|
||||
}
|
||||
} else {
|
||||
assert(op->code() == lir_cas_int, "lir_cas_int expected");
|
||||
if (os::is_MP()) {
|
||||
__ lock();
|
||||
}
|
||||
__ cmpxchgl(newval, Address(addr, 0));
|
||||
}
|
||||
#ifdef _LP64
|
||||
@ -3193,8 +3255,13 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
|
||||
}
|
||||
|
||||
if (flags & LIR_OpArrayCopy::type_check) {
|
||||
__ movptr(tmp, src_klass_addr);
|
||||
__ cmpptr(tmp, dst_klass_addr);
|
||||
if (UseCompressedOops) {
|
||||
__ movl(tmp, src_klass_addr);
|
||||
__ cmpl(tmp, dst_klass_addr);
|
||||
} else {
|
||||
__ movptr(tmp, src_klass_addr);
|
||||
__ cmpptr(tmp, dst_klass_addr);
|
||||
}
|
||||
__ jcc(Assembler::notEqual, *stub->entry());
|
||||
}
|
||||
|
||||
@ -3209,13 +3276,23 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
|
||||
// but not necessarily exactly of type default_type.
|
||||
Label known_ok, halt;
|
||||
__ movoop(tmp, default_type->constant_encoding());
|
||||
#ifdef _LP64
|
||||
if (UseCompressedOops) {
|
||||
__ encode_heap_oop(tmp);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (basic_type != T_OBJECT) {
|
||||
__ cmpptr(tmp, dst_klass_addr);
|
||||
|
||||
if (UseCompressedOops) __ cmpl(tmp, dst_klass_addr);
|
||||
else __ cmpptr(tmp, dst_klass_addr);
|
||||
__ jcc(Assembler::notEqual, halt);
|
||||
__ cmpptr(tmp, src_klass_addr);
|
||||
if (UseCompressedOops) __ cmpl(tmp, src_klass_addr);
|
||||
else __ cmpptr(tmp, src_klass_addr);
|
||||
__ jcc(Assembler::equal, known_ok);
|
||||
} else {
|
||||
__ cmpptr(tmp, dst_klass_addr);
|
||||
if (UseCompressedOops) __ cmpl(tmp, dst_klass_addr);
|
||||
else __ cmpptr(tmp, dst_klass_addr);
|
||||
__ jcc(Assembler::equal, known_ok);
|
||||
__ cmpptr(src, dst);
|
||||
__ jcc(Assembler::equal, known_ok);
|
||||
@ -3289,11 +3366,8 @@ void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
|
||||
int bci = op->profiled_bci();
|
||||
|
||||
// Update counter for all call types
|
||||
ciMethodData* md = method->method_data();
|
||||
if (md == NULL) {
|
||||
bailout("out of memory building methodDataOop");
|
||||
return;
|
||||
}
|
||||
ciMethodData* md = method->method_data_or_null();
|
||||
assert(md != NULL, "Sanity");
|
||||
ciProfileData* data = md->bci_to_data(bci);
|
||||
assert(data->is_CounterData(), "need CounterData for calls");
|
||||
assert(op->mdo()->is_single_cpu(), "mdo must be allocated");
|
||||
@ -3344,7 +3418,7 @@ void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
__ movptr(recv, Address(recv, oopDesc::klass_offset_in_bytes()));
|
||||
__ load_klass(recv, recv);
|
||||
Label update_done;
|
||||
type_profile_helper(mdo, md, data, recv, &update_done);
|
||||
// Receiver did not match any saved receiver and there is no empty row for it.
|
||||
|
@ -874,6 +874,10 @@ void LIRGenerator::do_MathIntrinsic(Intrinsic* x) {
|
||||
|
||||
void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
|
||||
assert(x->number_of_arguments() == 5, "wrong type");
|
||||
|
||||
// Make all state_for calls early since they can emit code
|
||||
CodeEmitInfo* info = state_for(x, x->state());
|
||||
|
||||
LIRItem src(x->argument_at(0), this);
|
||||
LIRItem src_pos(x->argument_at(1), this);
|
||||
LIRItem dst(x->argument_at(2), this);
|
||||
@ -916,7 +920,6 @@ void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
|
||||
ciArrayKlass* expected_type;
|
||||
arraycopy_helper(x, &flags, &expected_type);
|
||||
|
||||
CodeEmitInfo* info = state_for(x, x->state()); // we may want to have stack (deoptimization?)
|
||||
__ arraycopy(src.result(), src_pos.result(), dst.result(), dst_pos.result(), length.result(), tmp, expected_type, flags, info); // does add_safepoint
|
||||
}
|
||||
|
||||
@ -1151,9 +1154,12 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
|
||||
}
|
||||
LIR_Opr reg = rlock_result(x);
|
||||
LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
|
||||
if (!x->klass()->is_loaded() || UseCompressedOops) {
|
||||
tmp3 = new_register(objectType);
|
||||
}
|
||||
__ checkcast(reg, obj.result(), x->klass(),
|
||||
new_register(objectType), new_register(objectType),
|
||||
!x->klass()->is_loaded() ? new_register(objectType) : LIR_OprFact::illegalOpr,
|
||||
new_register(objectType), new_register(objectType), tmp3,
|
||||
x->direct_compare(), info_for_exception, patching_info, stub,
|
||||
x->profiled_method(), x->profiled_bci());
|
||||
}
|
||||
@ -1170,9 +1176,12 @@ void LIRGenerator::do_InstanceOf(InstanceOf* x) {
|
||||
patching_info = state_for(x, x->state_before());
|
||||
}
|
||||
obj.load_item();
|
||||
LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
|
||||
if (!x->klass()->is_loaded() || UseCompressedOops) {
|
||||
tmp3 = new_register(objectType);
|
||||
}
|
||||
__ instanceof(reg, obj.result(), x->klass(),
|
||||
new_register(objectType), new_register(objectType),
|
||||
!x->klass()->is_loaded() ? new_register(objectType) : LIR_OprFact::illegalOpr,
|
||||
new_register(objectType), new_register(objectType), tmp3,
|
||||
x->direct_compare(), patching_info, x->profiled_method(), x->profiled_bci());
|
||||
}
|
||||
|
||||
|
@ -31,18 +31,17 @@ inline bool LinearScan::is_processed_reg_num(int reg_num) {
|
||||
assert(FrameMap::rsp_opr->cpu_regnr() == 6, "wrong assumption below");
|
||||
assert(FrameMap::rbp_opr->cpu_regnr() == 7, "wrong assumption below");
|
||||
assert(reg_num >= 0, "invalid reg_num");
|
||||
|
||||
return reg_num < 6 || reg_num > 7;
|
||||
#else
|
||||
// rsp and rbp, r10, r15 (numbers 6 ancd 7) are ignored
|
||||
// rsp and rbp, r10, r15 (numbers [12,15]) are ignored
|
||||
// r12 (number 11) is conditional on compressed oops.
|
||||
assert(FrameMap::r12_opr->cpu_regnr() == 11, "wrong assumption below");
|
||||
assert(FrameMap::r10_opr->cpu_regnr() == 12, "wrong assumption below");
|
||||
assert(FrameMap::r15_opr->cpu_regnr() == 13, "wrong assumption below");
|
||||
assert(FrameMap::rsp_opr->cpu_regnrLo() == 14, "wrong assumption below");
|
||||
assert(FrameMap::rbp_opr->cpu_regnrLo() == 15, "wrong assumption below");
|
||||
assert(reg_num >= 0, "invalid reg_num");
|
||||
|
||||
return reg_num < 12 || reg_num > 15;
|
||||
#endif // _LP64
|
||||
return reg_num <= FrameMap::last_cpu_reg() || reg_num >= pd_nof_cpu_regs_frame_map;
|
||||
}
|
||||
|
||||
inline int LinearScan::num_physical_regs(BasicType type) {
|
||||
@ -104,7 +103,7 @@ inline bool LinearScanWalker::pd_init_regs_for_alloc(Interval* cur) {
|
||||
if (allocator()->gen()->is_vreg_flag_set(cur->reg_num(), LIRGenerator::byte_reg)) {
|
||||
assert(cur->type() != T_FLOAT && cur->type() != T_DOUBLE, "cpu regs only");
|
||||
_first_reg = pd_first_byte_reg;
|
||||
_last_reg = pd_last_byte_reg;
|
||||
_last_reg = FrameMap::last_byte_reg();
|
||||
return true;
|
||||
} else if ((UseSSE >= 1 && cur->type() == T_FLOAT) || (UseSSE >= 2 && cur->type() == T_DOUBLE)) {
|
||||
_first_reg = pd_first_xmm_reg;
|
||||
|
@ -155,11 +155,26 @@ void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register
|
||||
// This assumes that all prototype bits fit in an int32_t
|
||||
movptr(Address(obj, oopDesc::mark_offset_in_bytes ()), (int32_t)(intptr_t)markOopDesc::prototype());
|
||||
}
|
||||
#ifdef _LP64
|
||||
if (UseCompressedOops) { // Take care not to kill klass
|
||||
movptr(t1, klass);
|
||||
encode_heap_oop_not_null(t1);
|
||||
movl(Address(obj, oopDesc::klass_offset_in_bytes()), t1);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
movptr(Address(obj, oopDesc::klass_offset_in_bytes()), klass);
|
||||
}
|
||||
|
||||
movptr(Address(obj, oopDesc::klass_offset_in_bytes()), klass);
|
||||
if (len->is_valid()) {
|
||||
movl(Address(obj, arrayOopDesc::length_offset_in_bytes()), len);
|
||||
}
|
||||
#ifdef _LP64
|
||||
else if (UseCompressedOops) {
|
||||
xorptr(t1, t1);
|
||||
store_klass_gap(obj, t1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -230,7 +245,7 @@ void C1_MacroAssembler::allocate_object(Register obj, Register t1, Register t2,
|
||||
void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2) {
|
||||
assert((con_size_in_bytes & MinObjAlignmentInBytesMask) == 0,
|
||||
"con_size_in_bytes is not multiple of alignment");
|
||||
const int hdr_size_in_bytes = instanceOopDesc::base_offset_in_bytes();
|
||||
const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize;
|
||||
|
||||
initialize_header(obj, klass, noreg, t1, t2);
|
||||
|
||||
@ -317,13 +332,19 @@ void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) {
|
||||
// check against inline cache
|
||||
assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()), "must add explicit null check");
|
||||
int start_offset = offset();
|
||||
cmpptr(iCache, Address(receiver, oopDesc::klass_offset_in_bytes()));
|
||||
|
||||
if (UseCompressedOops) {
|
||||
load_klass(rscratch1, receiver);
|
||||
cmpptr(rscratch1, iCache);
|
||||
} else {
|
||||
cmpptr(iCache, Address(receiver, oopDesc::klass_offset_in_bytes()));
|
||||
}
|
||||
// if icache check fails, then jump to runtime routine
|
||||
// Note: RECEIVER must still contain the receiver!
|
||||
jump_cc(Assembler::notEqual,
|
||||
RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
|
||||
const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
|
||||
assert(offset() - start_offset == ic_cmp_size, "check alignment in emit_method_entry");
|
||||
assert(UseCompressedOops || offset() - start_offset == ic_cmp_size, "check alignment in emit_method_entry");
|
||||
}
|
||||
|
||||
|
||||
|
@ -1261,7 +1261,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
|
||||
// load the klass and check the has finalizer flag
|
||||
Label register_finalizer;
|
||||
Register t = rsi;
|
||||
__ movptr(t, Address(rax, oopDesc::klass_offset_in_bytes()));
|
||||
__ load_klass(t, rax);
|
||||
__ movl(t, Address(t, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
|
||||
__ testl(t, JVM_ACC_HAS_FINALIZER);
|
||||
__ jcc(Assembler::notZero, register_finalizer);
|
||||
|
@ -2197,9 +2197,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
__ enter(); // required for proper stackwalking of RuntimeStub frame
|
||||
|
||||
checkcast_copy_entry = __ pc();
|
||||
BLOCK_COMMENT("Entry:");
|
||||
|
||||
#ifdef ASSERT
|
||||
// caller guarantees that the arrays really are different
|
||||
// otherwise, we would have to make conjoint checks
|
||||
@ -2210,26 +2207,28 @@ class StubGenerator: public StubCodeGenerator {
|
||||
}
|
||||
#endif //ASSERT
|
||||
|
||||
// allocate spill slots for r13, r14
|
||||
enum {
|
||||
saved_r13_offset,
|
||||
saved_r14_offset,
|
||||
saved_rbp_offset,
|
||||
saved_rip_offset,
|
||||
saved_rarg0_offset
|
||||
};
|
||||
__ subptr(rsp, saved_rbp_offset * wordSize);
|
||||
__ movptr(Address(rsp, saved_r13_offset * wordSize), r13);
|
||||
__ movptr(Address(rsp, saved_r14_offset * wordSize), r14);
|
||||
setup_arg_regs(4); // from => rdi, to => rsi, length => rdx
|
||||
// ckoff => rcx, ckval => r8
|
||||
// r9 and r10 may be used to save non-volatile registers
|
||||
#ifdef _WIN64
|
||||
// last argument (#4) is on stack on Win64
|
||||
const int ckval_offset = saved_rarg0_offset + 4;
|
||||
__ movptr(ckval, Address(rsp, ckval_offset * wordSize));
|
||||
__ movptr(ckval, Address(rsp, 6 * wordSize));
|
||||
#endif
|
||||
|
||||
// Caller of this entry point must set up the argument registers.
|
||||
checkcast_copy_entry = __ pc();
|
||||
BLOCK_COMMENT("Entry:");
|
||||
|
||||
// allocate spill slots for r13, r14
|
||||
enum {
|
||||
saved_r13_offset,
|
||||
saved_r14_offset,
|
||||
saved_rbp_offset
|
||||
};
|
||||
__ subptr(rsp, saved_rbp_offset * wordSize);
|
||||
__ movptr(Address(rsp, saved_r13_offset * wordSize), r13);
|
||||
__ movptr(Address(rsp, saved_r14_offset * wordSize), r14);
|
||||
|
||||
// check that int operands are properly extended to size_t
|
||||
assert_clean_int(length, rax);
|
||||
assert_clean_int(ckoff, rax);
|
||||
@ -2443,11 +2442,10 @@ class StubGenerator: public StubCodeGenerator {
|
||||
const Register src_pos = c_rarg1; // source position
|
||||
const Register dst = c_rarg2; // destination array oop
|
||||
const Register dst_pos = c_rarg3; // destination position
|
||||
// elements count is on stack on Win64
|
||||
#ifdef _WIN64
|
||||
#define C_RARG4 Address(rsp, 6 * wordSize)
|
||||
#ifndef _WIN64
|
||||
const Register length = c_rarg4;
|
||||
#else
|
||||
#define C_RARG4 c_rarg4
|
||||
const Address length(rsp, 6 * wordSize); // elements count is on stack on Win64
|
||||
#endif
|
||||
|
||||
{ int modulus = CodeEntryAlignment;
|
||||
@ -2514,27 +2512,27 @@ class StubGenerator: public StubCodeGenerator {
|
||||
// registers used as temp
|
||||
const Register r11_length = r11; // elements count to copy
|
||||
const Register r10_src_klass = r10; // array klass
|
||||
const Register r9_dst_klass = r9; // dest array klass
|
||||
|
||||
// if (length < 0) return -1;
|
||||
__ movl(r11_length, C_RARG4); // length (elements count, 32-bits value)
|
||||
__ movl(r11_length, length); // length (elements count, 32-bits value)
|
||||
__ testl(r11_length, r11_length);
|
||||
__ jccb(Assembler::negative, L_failed_0);
|
||||
|
||||
__ load_klass(r10_src_klass, src);
|
||||
#ifdef ASSERT
|
||||
// assert(src->klass() != NULL);
|
||||
BLOCK_COMMENT("assert klasses not null");
|
||||
{ Label L1, L2;
|
||||
{
|
||||
BLOCK_COMMENT("assert klasses not null {");
|
||||
Label L1, L2;
|
||||
__ testptr(r10_src_klass, r10_src_klass);
|
||||
__ jcc(Assembler::notZero, L2); // it is broken if klass is NULL
|
||||
__ bind(L1);
|
||||
__ stop("broken null klass");
|
||||
__ bind(L2);
|
||||
__ load_klass(r9_dst_klass, dst);
|
||||
__ cmpq(r9_dst_klass, 0);
|
||||
__ load_klass(rax, dst);
|
||||
__ cmpq(rax, 0);
|
||||
__ jcc(Assembler::equal, L1); // this would be broken also
|
||||
BLOCK_COMMENT("assert done");
|
||||
BLOCK_COMMENT("} assert klasses not null done");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -2546,34 +2544,36 @@ class StubGenerator: public StubCodeGenerator {
|
||||
// array_tag: typeArray = 0x3, objArray = 0x2, non-array = 0x0
|
||||
//
|
||||
|
||||
int lh_offset = klassOopDesc::header_size() * HeapWordSize +
|
||||
Klass::layout_helper_offset_in_bytes();
|
||||
|
||||
const Register rax_lh = rax; // layout helper
|
||||
|
||||
__ movl(rax_lh, Address(r10_src_klass, lh_offset));
|
||||
const int lh_offset = klassOopDesc::header_size() * HeapWordSize +
|
||||
Klass::layout_helper_offset_in_bytes();
|
||||
|
||||
// Handle objArrays completely differently...
|
||||
jint objArray_lh = Klass::array_layout_helper(T_OBJECT);
|
||||
__ cmpl(rax_lh, objArray_lh);
|
||||
const jint objArray_lh = Klass::array_layout_helper(T_OBJECT);
|
||||
__ cmpl(Address(r10_src_klass, lh_offset), objArray_lh);
|
||||
__ jcc(Assembler::equal, L_objArray);
|
||||
|
||||
// if (src->klass() != dst->klass()) return -1;
|
||||
__ load_klass(r9_dst_klass, dst);
|
||||
__ cmpq(r10_src_klass, r9_dst_klass);
|
||||
__ load_klass(rax, dst);
|
||||
__ cmpq(r10_src_klass, rax);
|
||||
__ jcc(Assembler::notEqual, L_failed);
|
||||
|
||||
const Register rax_lh = rax; // layout helper
|
||||
__ movl(rax_lh, Address(r10_src_klass, lh_offset));
|
||||
|
||||
// if (!src->is_Array()) return -1;
|
||||
__ cmpl(rax_lh, Klass::_lh_neutral_value);
|
||||
__ jcc(Assembler::greaterEqual, L_failed);
|
||||
|
||||
// At this point, it is known to be a typeArray (array_tag 0x3).
|
||||
#ifdef ASSERT
|
||||
{ Label L;
|
||||
{
|
||||
BLOCK_COMMENT("assert primitive array {");
|
||||
Label L;
|
||||
__ cmpl(rax_lh, (Klass::_lh_array_tag_type_value << Klass::_lh_array_tag_shift));
|
||||
__ jcc(Assembler::greaterEqual, L);
|
||||
__ stop("must be a primitive array");
|
||||
__ bind(L);
|
||||
BLOCK_COMMENT("} assert primitive array done");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -2631,11 +2631,14 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
__ BIND(L_copy_longs);
|
||||
#ifdef ASSERT
|
||||
{ Label L;
|
||||
{
|
||||
BLOCK_COMMENT("assert long copy {");
|
||||
Label L;
|
||||
__ cmpl(rax_elsize, LogBytesPerLong);
|
||||
__ jcc(Assembler::equal, L);
|
||||
__ stop("must be long copy, but elsize is wrong");
|
||||
__ bind(L);
|
||||
BLOCK_COMMENT("} assert long copy done");
|
||||
}
|
||||
#endif
|
||||
__ lea(from, Address(src, src_pos, Address::times_8, 0));// src_addr
|
||||
@ -2645,12 +2648,12 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
// objArrayKlass
|
||||
__ BIND(L_objArray);
|
||||
// live at this point: r10_src_klass, src[_pos], dst[_pos]
|
||||
// live at this point: r10_src_klass, r11_length, src[_pos], dst[_pos]
|
||||
|
||||
Label L_plain_copy, L_checkcast_copy;
|
||||
// test array classes for subtyping
|
||||
__ load_klass(r9_dst_klass, dst);
|
||||
__ cmpq(r10_src_klass, r9_dst_klass); // usual case is exact equality
|
||||
__ load_klass(rax, dst);
|
||||
__ cmpq(r10_src_klass, rax); // usual case is exact equality
|
||||
__ jcc(Assembler::notEqual, L_checkcast_copy);
|
||||
|
||||
// Identically typed arrays can be copied without element-wise checks.
|
||||
@ -2666,41 +2669,33 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ jump(RuntimeAddress(oop_copy_entry));
|
||||
|
||||
__ BIND(L_checkcast_copy);
|
||||
// live at this point: r10_src_klass, !r11_length
|
||||
// live at this point: r10_src_klass, r11_length, rax (dst_klass)
|
||||
{
|
||||
// assert(r11_length == C_RARG4); // will reload from here
|
||||
Register r11_dst_klass = r11;
|
||||
__ load_klass(r11_dst_klass, dst);
|
||||
|
||||
// Before looking at dst.length, make sure dst is also an objArray.
|
||||
__ cmpl(Address(r11_dst_klass, lh_offset), objArray_lh);
|
||||
__ cmpl(Address(rax, lh_offset), objArray_lh);
|
||||
__ jcc(Assembler::notEqual, L_failed);
|
||||
|
||||
// It is safe to examine both src.length and dst.length.
|
||||
#ifndef _WIN64
|
||||
arraycopy_range_checks(src, src_pos, dst, dst_pos, C_RARG4,
|
||||
rax, L_failed);
|
||||
#else
|
||||
__ movl(r11_length, C_RARG4); // reload
|
||||
arraycopy_range_checks(src, src_pos, dst, dst_pos, r11_length,
|
||||
rax, L_failed);
|
||||
|
||||
const Register r11_dst_klass = r11;
|
||||
__ load_klass(r11_dst_klass, dst); // reload
|
||||
#endif
|
||||
|
||||
// Marshal the base address arguments now, freeing registers.
|
||||
__ lea(from, Address(src, src_pos, TIMES_OOP,
|
||||
arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
|
||||
__ lea(to, Address(dst, dst_pos, TIMES_OOP,
|
||||
arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
|
||||
__ movl(count, C_RARG4); // length (reloaded)
|
||||
__ movl(count, length); // length (reloaded)
|
||||
Register sco_temp = c_rarg3; // this register is free now
|
||||
assert_different_registers(from, to, count, sco_temp,
|
||||
r11_dst_klass, r10_src_klass);
|
||||
assert_clean_int(count, sco_temp);
|
||||
|
||||
// Generate the type check.
|
||||
int sco_offset = (klassOopDesc::header_size() * HeapWordSize +
|
||||
Klass::super_check_offset_offset_in_bytes());
|
||||
const int sco_offset = (klassOopDesc::header_size() * HeapWordSize +
|
||||
Klass::super_check_offset_offset_in_bytes());
|
||||
__ movl(sco_temp, Address(r11_dst_klass, sco_offset));
|
||||
assert_clean_int(sco_temp, rax);
|
||||
generate_type_check(r10_src_klass, sco_temp, r11_dst_klass, L_plain_copy);
|
||||
@ -2709,12 +2704,14 @@ class StubGenerator: public StubCodeGenerator {
|
||||
int ek_offset = (klassOopDesc::header_size() * HeapWordSize +
|
||||
objArrayKlass::element_klass_offset_in_bytes());
|
||||
__ movptr(r11_dst_klass, Address(r11_dst_klass, ek_offset));
|
||||
__ movl(sco_temp, Address(r11_dst_klass, sco_offset));
|
||||
__ movl( sco_temp, Address(r11_dst_klass, sco_offset));
|
||||
assert_clean_int(sco_temp, rax);
|
||||
|
||||
// the checkcast_copy loop needs two extra arguments:
|
||||
assert(c_rarg3 == sco_temp, "#3 already in place");
|
||||
__ movptr(C_RARG4, r11_dst_klass); // dst.klass.element_klass
|
||||
// Set up arguments for checkcast_copy_entry.
|
||||
setup_arg_regs(4);
|
||||
__ movptr(r8, r11_dst_klass); // dst.klass.element_klass, r8 is c_rarg4 on Linux/Solaris
|
||||
__ jump(RuntimeAddress(checkcast_copy_entry));
|
||||
}
|
||||
|
||||
@ -2727,8 +2724,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
return start;
|
||||
}
|
||||
|
||||
#undef length_arg
|
||||
|
||||
void generate_arraycopy_stubs() {
|
||||
// Call the conjoint generation methods immediately after
|
||||
// the disjoint ones so that short branches from the former
|
||||
|
@ -506,6 +506,25 @@ void encode_CopyXD( CodeBuffer &cbuf, int dst_encoding, int src_encoding ) {
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
const bool Matcher::constant_table_absolute_addressing = true;
|
||||
const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::Empty;
|
||||
|
||||
void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
|
||||
// Empty encoding
|
||||
}
|
||||
|
||||
uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const {
|
||||
st->print("# MachConstantBaseNode (empty encoding)");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//=============================================================================
|
||||
#ifndef PRODUCT
|
||||
void MachPrologNode::format( PhaseRegAlloc *ra_, outputStream* st ) const {
|
||||
@ -1320,29 +1339,6 @@ int emit_deopt_handler(CodeBuffer& cbuf) {
|
||||
}
|
||||
|
||||
|
||||
static void emit_double_constant(CodeBuffer& cbuf, double x) {
|
||||
int mark = cbuf.insts()->mark_off();
|
||||
MacroAssembler _masm(&cbuf);
|
||||
address double_address = __ double_constant(x);
|
||||
cbuf.insts()->set_mark_off(mark); // preserve mark across masm shift
|
||||
emit_d32_reloc(cbuf,
|
||||
(int)double_address,
|
||||
internal_word_Relocation::spec(double_address),
|
||||
RELOC_DISP32);
|
||||
}
|
||||
|
||||
static void emit_float_constant(CodeBuffer& cbuf, float x) {
|
||||
int mark = cbuf.insts()->mark_off();
|
||||
MacroAssembler _masm(&cbuf);
|
||||
address float_address = __ float_constant(x);
|
||||
cbuf.insts()->set_mark_off(mark); // preserve mark across masm shift
|
||||
emit_d32_reloc(cbuf,
|
||||
(int)float_address,
|
||||
internal_word_Relocation::spec(float_address),
|
||||
RELOC_DISP32);
|
||||
}
|
||||
|
||||
|
||||
const bool Matcher::match_rule_supported(int opcode) {
|
||||
if (!has_match_rule(opcode))
|
||||
return false;
|
||||
@ -1354,22 +1350,6 @@ int Matcher::regnum_to_fpu_offset(int regnum) {
|
||||
return regnum - 32; // The FP registers are in the second chunk
|
||||
}
|
||||
|
||||
bool is_positive_zero_float(jfloat f) {
|
||||
return jint_cast(f) == jint_cast(0.0F);
|
||||
}
|
||||
|
||||
bool is_positive_one_float(jfloat f) {
|
||||
return jint_cast(f) == jint_cast(1.0F);
|
||||
}
|
||||
|
||||
bool is_positive_zero_double(jdouble d) {
|
||||
return jlong_cast(d) == jlong_cast(0.0);
|
||||
}
|
||||
|
||||
bool is_positive_one_double(jdouble d) {
|
||||
return jlong_cast(d) == jlong_cast(1.0);
|
||||
}
|
||||
|
||||
// This is UltraSparc specific, true just means we have fast l2f conversion
|
||||
const bool Matcher::convL2FSupported(void) {
|
||||
return true;
|
||||
@ -2036,67 +2016,6 @@ encode %{
|
||||
%}
|
||||
|
||||
|
||||
enc_class LdImmD (immD src) %{ // Load Immediate
|
||||
if( is_positive_zero_double($src$$constant)) {
|
||||
// FLDZ
|
||||
emit_opcode(cbuf,0xD9);
|
||||
emit_opcode(cbuf,0xEE);
|
||||
} else if( is_positive_one_double($src$$constant)) {
|
||||
// FLD1
|
||||
emit_opcode(cbuf,0xD9);
|
||||
emit_opcode(cbuf,0xE8);
|
||||
} else {
|
||||
emit_opcode(cbuf,0xDD);
|
||||
emit_rm(cbuf, 0x0, 0x0, 0x5);
|
||||
emit_double_constant(cbuf, $src$$constant);
|
||||
}
|
||||
%}
|
||||
|
||||
|
||||
enc_class LdImmF (immF src) %{ // Load Immediate
|
||||
if( is_positive_zero_float($src$$constant)) {
|
||||
emit_opcode(cbuf,0xD9);
|
||||
emit_opcode(cbuf,0xEE);
|
||||
} else if( is_positive_one_float($src$$constant)) {
|
||||
emit_opcode(cbuf,0xD9);
|
||||
emit_opcode(cbuf,0xE8);
|
||||
} else {
|
||||
$$$emit8$primary;
|
||||
// Load immediate does not have a zero or sign extended version
|
||||
// for 8-bit immediates
|
||||
// First load to TOS, then move to dst
|
||||
emit_rm(cbuf, 0x0, 0x0, 0x5);
|
||||
emit_float_constant(cbuf, $src$$constant);
|
||||
}
|
||||
%}
|
||||
|
||||
enc_class LdImmX (regX dst, immXF con) %{ // Load Immediate
|
||||
emit_rm(cbuf, 0x0, $dst$$reg, 0x5);
|
||||
emit_float_constant(cbuf, $con$$constant);
|
||||
%}
|
||||
|
||||
enc_class LdImmXD (regXD dst, immXD con) %{ // Load Immediate
|
||||
emit_rm(cbuf, 0x0, $dst$$reg, 0x5);
|
||||
emit_double_constant(cbuf, $con$$constant);
|
||||
%}
|
||||
|
||||
enc_class load_conXD (regXD dst, immXD con) %{ // Load double constant
|
||||
// UseXmmLoadAndClearUpper ? movsd(dst, con) : movlpd(dst, con)
|
||||
emit_opcode(cbuf, UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
|
||||
emit_opcode(cbuf, 0x0F);
|
||||
emit_opcode(cbuf, UseXmmLoadAndClearUpper ? 0x10 : 0x12);
|
||||
emit_rm(cbuf, 0x0, $dst$$reg, 0x5);
|
||||
emit_double_constant(cbuf, $con$$constant);
|
||||
%}
|
||||
|
||||
enc_class Opc_MemImm_F(immF src) %{
|
||||
cbuf.set_insts_mark();
|
||||
$$$emit8$primary;
|
||||
emit_rm(cbuf, 0x0, $secondary, 0x5);
|
||||
emit_float_constant(cbuf, $src$$constant);
|
||||
%}
|
||||
|
||||
|
||||
enc_class MovI2X_reg(regX dst, eRegI src) %{
|
||||
emit_opcode(cbuf, 0x66 ); // MOVD dst,src
|
||||
emit_opcode(cbuf, 0x0F );
|
||||
@ -4801,7 +4720,7 @@ operand immD0() %{
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Double Immediate
|
||||
// Double Immediate one
|
||||
operand immD1() %{
|
||||
predicate( UseSSE<=1 && n->getd() == 1.0 );
|
||||
match(ConD);
|
||||
@ -4844,7 +4763,17 @@ operand immXD0() %{
|
||||
|
||||
// Float Immediate zero
|
||||
operand immF0() %{
|
||||
predicate( UseSSE == 0 && n->getf() == 0.0 );
|
||||
predicate(UseSSE == 0 && n->getf() == 0.0F);
|
||||
match(ConF);
|
||||
|
||||
op_cost(5);
|
||||
format %{ %}
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Float Immediate one
|
||||
operand immF1() %{
|
||||
predicate(UseSSE == 0 && n->getf() == 1.0F);
|
||||
match(ConF);
|
||||
|
||||
op_cost(5);
|
||||
@ -7215,24 +7144,53 @@ instruct loadConL0(eRegL dst, immL0 src, eFlagsReg cr) %{
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immF().
|
||||
instruct loadConF(regF dst, immF src) %{
|
||||
match(Set dst src);
|
||||
instruct loadConF(regF dst, immF con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
|
||||
format %{ "FLD_S ST,$src\n\t"
|
||||
format %{ "FLD_S ST,[$constantaddress]\t# load from constant table: float=$con\n\t"
|
||||
"FSTP $dst" %}
|
||||
opcode(0xD9, 0x00); /* D9 /0 */
|
||||
ins_encode(LdImmF(src), Pop_Reg_F(dst) );
|
||||
ins_pipe( fpu_reg_con );
|
||||
ins_encode %{
|
||||
__ fld_s($constantaddress($con));
|
||||
__ fstp_d($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_con);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immF0().
|
||||
instruct loadConF0(regF dst, immF0 con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
format %{ "FLDZ ST\n\t"
|
||||
"FSTP $dst" %}
|
||||
ins_encode %{
|
||||
__ fldz();
|
||||
__ fstp_d($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_con);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immF1().
|
||||
instruct loadConF1(regF dst, immF1 con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
format %{ "FLD1 ST\n\t"
|
||||
"FSTP $dst" %}
|
||||
ins_encode %{
|
||||
__ fld1();
|
||||
__ fstp_d($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_con);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immXF().
|
||||
instruct loadConX(regX dst, immXF con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
format %{ "MOVSS $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF3), Opcode(0x0F), Opcode(0x10), LdImmX(dst, con));
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "MOVSS $dst,[$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_encode %{
|
||||
__ movflt($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immXF0().
|
||||
@ -7240,28 +7198,63 @@ instruct loadConX0(regX dst, immXF0 src) %{
|
||||
match(Set dst src);
|
||||
ins_cost(100);
|
||||
format %{ "XORPS $dst,$dst\t# float 0.0" %}
|
||||
ins_encode( Opcode(0x0F), Opcode(0x57), RegReg(dst,dst));
|
||||
ins_pipe( pipe_slow );
|
||||
ins_encode %{
|
||||
__ xorps($dst$$XMMRegister, $dst$$XMMRegister);
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immD().
|
||||
instruct loadConD(regD dst, immD src) %{
|
||||
match(Set dst src);
|
||||
instruct loadConD(regD dst, immD con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
|
||||
format %{ "FLD_D ST,$src\n\t"
|
||||
format %{ "FLD_D ST,[$constantaddress]\t# load from constant table: double=$con\n\t"
|
||||
"FSTP $dst" %}
|
||||
ins_encode(LdImmD(src), Pop_Reg_D(dst) );
|
||||
ins_pipe( fpu_reg_con );
|
||||
ins_encode %{
|
||||
__ fld_d($constantaddress($con));
|
||||
__ fstp_d($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_con);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immD0().
|
||||
instruct loadConD0(regD dst, immD0 con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
|
||||
format %{ "FLDZ ST\n\t"
|
||||
"FSTP $dst" %}
|
||||
ins_encode %{
|
||||
__ fldz();
|
||||
__ fstp_d($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_con);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immD1().
|
||||
instruct loadConD1(regD dst, immD1 con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
|
||||
format %{ "FLD1 ST\n\t"
|
||||
"FSTP $dst" %}
|
||||
ins_encode %{
|
||||
__ fld1();
|
||||
__ fstp_d($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_con);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immXD().
|
||||
instruct loadConXD(regXD dst, immXD con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
format %{ "MOVSD $dst,[$con]" %}
|
||||
ins_encode(load_conXD(dst, con));
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "MOVSD $dst,[$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_encode %{
|
||||
__ movdbl($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
// The instruction usage is guarded by predicate in operand immXD0().
|
||||
@ -10303,41 +10296,45 @@ instruct addD_mem_reg(memory dst, regD src) %{
|
||||
ins_pipe( fpu_reg_mem );
|
||||
%}
|
||||
|
||||
instruct addD_reg_imm1(regD dst, immD1 src) %{
|
||||
instruct addD_reg_imm1(regD dst, immD1 con) %{
|
||||
predicate(UseSSE<=1);
|
||||
match(Set dst (AddD dst src));
|
||||
match(Set dst (AddD dst con));
|
||||
ins_cost(125);
|
||||
format %{ "FLD1\n\t"
|
||||
"DADDp $dst,ST" %}
|
||||
opcode(0xDE, 0x00);
|
||||
ins_encode( LdImmD(src),
|
||||
OpcP, RegOpc(dst) );
|
||||
ins_pipe( fpu_reg );
|
||||
ins_encode %{
|
||||
__ fld1();
|
||||
__ faddp($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg);
|
||||
%}
|
||||
|
||||
instruct addD_reg_imm(regD dst, immD src) %{
|
||||
instruct addD_reg_imm(regD dst, immD con) %{
|
||||
predicate(UseSSE<=1 && _kids[1]->_leaf->getd() != 0.0 && _kids[1]->_leaf->getd() != 1.0 );
|
||||
match(Set dst (AddD dst src));
|
||||
match(Set dst (AddD dst con));
|
||||
ins_cost(200);
|
||||
format %{ "FLD_D [$src]\n\t"
|
||||
format %{ "FLD_D [$constantaddress]\t# load from constant table: double=$con\n\t"
|
||||
"DADDp $dst,ST" %}
|
||||
opcode(0xDE, 0x00); /* DE /0 */
|
||||
ins_encode( LdImmD(src),
|
||||
OpcP, RegOpc(dst));
|
||||
ins_pipe( fpu_reg_mem );
|
||||
ins_encode %{
|
||||
__ fld_d($constantaddress($con));
|
||||
__ faddp($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_mem);
|
||||
%}
|
||||
|
||||
instruct addD_reg_imm_round(stackSlotD dst, regD src, immD con) %{
|
||||
predicate(UseSSE<=1 && _kids[0]->_kids[1]->_leaf->getd() != 0.0 && _kids[0]->_kids[1]->_leaf->getd() != 1.0 );
|
||||
match(Set dst (RoundDouble (AddD src con)));
|
||||
ins_cost(200);
|
||||
format %{ "FLD_D [$con]\n\t"
|
||||
format %{ "FLD_D [$constantaddress]\t# load from constant table: double=$con\n\t"
|
||||
"DADD ST,$src\n\t"
|
||||
"FSTP_D $dst\t# D-round" %}
|
||||
opcode(0xD8, 0x00); /* D8 /0 */
|
||||
ins_encode( LdImmD(con),
|
||||
OpcP, RegOpc(src), Pop_Mem_D(dst));
|
||||
ins_pipe( fpu_mem_reg_con );
|
||||
ins_encode %{
|
||||
__ fld_d($constantaddress($con));
|
||||
__ fadd($src$$reg);
|
||||
__ fstp_d(Address(rsp, $dst$$disp));
|
||||
%}
|
||||
ins_pipe(fpu_mem_reg_con);
|
||||
%}
|
||||
|
||||
// Add two double precision floating point values in xmm
|
||||
@ -10352,9 +10349,11 @@ instruct addXD_reg(regXD dst, regXD src) %{
|
||||
instruct addXD_imm(regXD dst, immXD con) %{
|
||||
predicate(UseSSE>=2);
|
||||
match(Set dst (AddD dst con));
|
||||
format %{ "ADDSD $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF2), Opcode(0x0F), Opcode(0x58), LdImmXD(dst, con) );
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "ADDSD $dst,[$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_encode %{
|
||||
__ addsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct addXD_mem(regXD dst, memory mem) %{
|
||||
@ -10377,9 +10376,11 @@ instruct subXD_reg(regXD dst, regXD src) %{
|
||||
instruct subXD_imm(regXD dst, immXD con) %{
|
||||
predicate(UseSSE>=2);
|
||||
match(Set dst (SubD dst con));
|
||||
format %{ "SUBSD $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF2), Opcode(0x0F), Opcode(0x5C), LdImmXD(dst, con) );
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "SUBSD $dst,[$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_encode %{
|
||||
__ subsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct subXD_mem(regXD dst, memory mem) %{
|
||||
@ -10402,9 +10403,11 @@ instruct mulXD_reg(regXD dst, regXD src) %{
|
||||
instruct mulXD_imm(regXD dst, immXD con) %{
|
||||
predicate(UseSSE>=2);
|
||||
match(Set dst (MulD dst con));
|
||||
format %{ "MULSD $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF2), Opcode(0x0F), Opcode(0x59), LdImmXD(dst, con) );
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "MULSD $dst,[$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_encode %{
|
||||
__ mulsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct mulXD_mem(regXD dst, memory mem) %{
|
||||
@ -10428,9 +10431,11 @@ instruct divXD_reg(regXD dst, regXD src) %{
|
||||
instruct divXD_imm(regXD dst, immXD con) %{
|
||||
predicate(UseSSE>=2);
|
||||
match(Set dst (DivD dst con));
|
||||
format %{ "DIVSD $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF2), Opcode(0x0F), Opcode(0x5E), LdImmXD(dst, con));
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "DIVSD $dst,[$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_encode %{
|
||||
__ divsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct divXD_mem(regXD dst, memory mem) %{
|
||||
@ -10481,16 +10486,17 @@ instruct strictfp_mulD_reg(regDPR1 dst, regnotDPR1 src) %{
|
||||
ins_pipe( fpu_reg_reg );
|
||||
%}
|
||||
|
||||
instruct mulD_reg_imm(regD dst, immD src) %{
|
||||
instruct mulD_reg_imm(regD dst, immD con) %{
|
||||
predicate( UseSSE<=1 && _kids[1]->_leaf->getd() != 0.0 && _kids[1]->_leaf->getd() != 1.0 );
|
||||
match(Set dst (MulD dst src));
|
||||
match(Set dst (MulD dst con));
|
||||
ins_cost(200);
|
||||
format %{ "FLD_D [$src]\n\t"
|
||||
format %{ "FLD_D [$constantaddress]\t# load from constant table: double=$con\n\t"
|
||||
"DMULp $dst,ST" %}
|
||||
opcode(0xDE, 0x1); /* DE /1 */
|
||||
ins_encode( LdImmD(src),
|
||||
OpcP, RegOpc(dst) );
|
||||
ins_pipe( fpu_reg_mem );
|
||||
ins_encode %{
|
||||
__ fld_d($constantaddress($con));
|
||||
__ fmulp($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_mem);
|
||||
%}
|
||||
|
||||
|
||||
@ -11224,9 +11230,11 @@ instruct addX_reg(regX dst, regX src) %{
|
||||
instruct addX_imm(regX dst, immXF con) %{
|
||||
predicate(UseSSE>=1);
|
||||
match(Set dst (AddF dst con));
|
||||
format %{ "ADDSS $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF3), Opcode(0x0F), Opcode(0x58), LdImmX(dst, con) );
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "ADDSS $dst,[$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_encode %{
|
||||
__ addss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct addX_mem(regX dst, memory mem) %{
|
||||
@ -11249,9 +11257,11 @@ instruct subX_reg(regX dst, regX src) %{
|
||||
instruct subX_imm(regX dst, immXF con) %{
|
||||
predicate(UseSSE>=1);
|
||||
match(Set dst (SubF dst con));
|
||||
format %{ "SUBSS $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF3), Opcode(0x0F), Opcode(0x5C), LdImmX(dst, con) );
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "SUBSS $dst,[$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_encode %{
|
||||
__ subss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct subX_mem(regX dst, memory mem) %{
|
||||
@ -11274,9 +11284,11 @@ instruct mulX_reg(regX dst, regX src) %{
|
||||
instruct mulX_imm(regX dst, immXF con) %{
|
||||
predicate(UseSSE>=1);
|
||||
match(Set dst (MulF dst con));
|
||||
format %{ "MULSS $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF3), Opcode(0x0F), Opcode(0x59), LdImmX(dst, con) );
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "MULSS $dst,[$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_encode %{
|
||||
__ mulss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct mulX_mem(regX dst, memory mem) %{
|
||||
@ -11299,9 +11311,11 @@ instruct divX_reg(regX dst, regX src) %{
|
||||
instruct divX_imm(regX dst, immXF con) %{
|
||||
predicate(UseSSE>=1);
|
||||
match(Set dst (DivF dst con));
|
||||
format %{ "DIVSS $dst,[$con]" %}
|
||||
ins_encode( Opcode(0xF3), Opcode(0x0F), Opcode(0x5E), LdImmX(dst, con) );
|
||||
ins_pipe( pipe_slow );
|
||||
format %{ "DIVSS $dst,[$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_encode %{
|
||||
__ divss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct divX_mem(regX dst, memory mem) %{
|
||||
@ -11456,31 +11470,33 @@ instruct addF24_mem_mem(stackSlotF dst, memory src1, memory src2) %{
|
||||
|
||||
|
||||
// Spill to obtain 24-bit precision
|
||||
instruct addF24_reg_imm(stackSlotF dst, regF src1, immF src2) %{
|
||||
instruct addF24_reg_imm(stackSlotF dst, regF src, immF con) %{
|
||||
predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
|
||||
match(Set dst (AddF src1 src2));
|
||||
format %{ "FLD $src1\n\t"
|
||||
"FADD $src2\n\t"
|
||||
match(Set dst (AddF src con));
|
||||
format %{ "FLD $src\n\t"
|
||||
"FADD_S [$constantaddress]\t# load from constant table: float=$con\n\t"
|
||||
"FSTP_S $dst" %}
|
||||
opcode(0xD8, 0x00); /* D8 /0 */
|
||||
ins_encode( Push_Reg_F(src1),
|
||||
Opc_MemImm_F(src2),
|
||||
Pop_Mem_F(dst));
|
||||
ins_pipe( fpu_mem_reg_con );
|
||||
ins_encode %{
|
||||
__ fld_s($src$$reg - 1); // FLD ST(i-1)
|
||||
__ fadd_s($constantaddress($con));
|
||||
__ fstp_s(Address(rsp, $dst$$disp));
|
||||
%}
|
||||
ins_pipe(fpu_mem_reg_con);
|
||||
%}
|
||||
//
|
||||
// This instruction does not round to 24-bits
|
||||
instruct addF_reg_imm(regF dst, regF src1, immF src2) %{
|
||||
instruct addF_reg_imm(regF dst, regF src, immF con) %{
|
||||
predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
|
||||
match(Set dst (AddF src1 src2));
|
||||
format %{ "FLD $src1\n\t"
|
||||
"FADD $src2\n\t"
|
||||
"FSTP_S $dst" %}
|
||||
opcode(0xD8, 0x00); /* D8 /0 */
|
||||
ins_encode( Push_Reg_F(src1),
|
||||
Opc_MemImm_F(src2),
|
||||
Pop_Reg_F(dst));
|
||||
ins_pipe( fpu_reg_reg_con );
|
||||
match(Set dst (AddF src con));
|
||||
format %{ "FLD $src\n\t"
|
||||
"FADD_S [$constantaddress]\t# load from constant table: float=$con\n\t"
|
||||
"FSTP $dst" %}
|
||||
ins_encode %{
|
||||
__ fld_s($src$$reg - 1); // FLD ST(i-1)
|
||||
__ fadd_s($constantaddress($con));
|
||||
__ fstp_d($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_reg_con);
|
||||
%}
|
||||
|
||||
// Spill to obtain 24-bit precision
|
||||
@ -11559,29 +11575,35 @@ instruct mulF24_mem_mem(stackSlotF dst, memory src1, memory src2) %{
|
||||
%}
|
||||
|
||||
// Spill to obtain 24-bit precision
|
||||
instruct mulF24_reg_imm(stackSlotF dst, regF src1, immF src2) %{
|
||||
instruct mulF24_reg_imm(stackSlotF dst, regF src, immF con) %{
|
||||
predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
|
||||
match(Set dst (MulF src1 src2));
|
||||
match(Set dst (MulF src con));
|
||||
|
||||
format %{ "FMULc $dst,$src1,$src2" %}
|
||||
opcode(0xD8, 0x1); /* D8 /1*/
|
||||
ins_encode( Push_Reg_F(src1),
|
||||
Opc_MemImm_F(src2),
|
||||
Pop_Mem_F(dst));
|
||||
ins_pipe( fpu_mem_reg_con );
|
||||
format %{ "FLD $src\n\t"
|
||||
"FMUL_S [$constantaddress]\t# load from constant table: float=$con\n\t"
|
||||
"FSTP_S $dst" %}
|
||||
ins_encode %{
|
||||
__ fld_s($src$$reg - 1); // FLD ST(i-1)
|
||||
__ fmul_s($constantaddress($con));
|
||||
__ fstp_s(Address(rsp, $dst$$disp));
|
||||
%}
|
||||
ins_pipe(fpu_mem_reg_con);
|
||||
%}
|
||||
//
|
||||
// This instruction does not round to 24-bits
|
||||
instruct mulF_reg_imm(regF dst, regF src1, immF src2) %{
|
||||
instruct mulF_reg_imm(regF dst, regF src, immF con) %{
|
||||
predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
|
||||
match(Set dst (MulF src1 src2));
|
||||
match(Set dst (MulF src con));
|
||||
|
||||
format %{ "FMULc $dst. $src1, $src2" %}
|
||||
opcode(0xD8, 0x1); /* D8 /1*/
|
||||
ins_encode( Push_Reg_F(src1),
|
||||
Opc_MemImm_F(src2),
|
||||
Pop_Reg_F(dst));
|
||||
ins_pipe( fpu_reg_reg_con );
|
||||
format %{ "FLD $src\n\t"
|
||||
"FMUL_S [$constantaddress]\t# load from constant table: float=$con\n\t"
|
||||
"FSTP $dst" %}
|
||||
ins_encode %{
|
||||
__ fld_s($src$$reg - 1); // FLD ST(i-1)
|
||||
__ fmul_s($constantaddress($con));
|
||||
__ fstp_d($dst$$reg);
|
||||
%}
|
||||
ins_pipe(fpu_reg_reg_con);
|
||||
%}
|
||||
|
||||
|
||||
@ -12939,16 +12961,11 @@ instruct maxI_eReg(eRegI dst, eRegI src, eFlagsReg flags) %{
|
||||
instruct jumpXtnd(eRegI switch_val) %{
|
||||
match(Jump switch_val);
|
||||
ins_cost(350);
|
||||
|
||||
format %{ "JMP [table_base](,$switch_val,1)\n\t" %}
|
||||
|
||||
format %{ "JMP [$constantaddress](,$switch_val,1)\n\t" %}
|
||||
ins_encode %{
|
||||
address table_base = __ address_table_constant(_index2label);
|
||||
|
||||
// Jump to Address(table_base + switch_reg)
|
||||
InternalAddress table(table_base);
|
||||
Address index(noreg, $switch_val$$Register, Address::times_1);
|
||||
__ jump(ArrayAddress(table, index));
|
||||
__ jump(ArrayAddress($constantaddress, index));
|
||||
%}
|
||||
ins_pc_relative(1);
|
||||
ins_pipe(pipe_jmp);
|
||||
|
@ -832,6 +832,25 @@ void encode_CopyXD( CodeBuffer &cbuf, int dst_encoding, int src_encoding ) {
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
const bool Matcher::constant_table_absolute_addressing = true;
|
||||
const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::Empty;
|
||||
|
||||
void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
|
||||
// Empty encoding
|
||||
}
|
||||
|
||||
uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const {
|
||||
st->print("# MachConstantBaseNode (empty encoding)");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//=============================================================================
|
||||
#ifndef PRODUCT
|
||||
void MachPrologNode::format(PhaseRegAlloc* ra_, outputStream* st) const
|
||||
@ -1922,28 +1941,6 @@ int emit_deopt_handler(CodeBuffer& cbuf)
|
||||
return offset;
|
||||
}
|
||||
|
||||
static void emit_double_constant(CodeBuffer& cbuf, double x) {
|
||||
int mark = cbuf.insts()->mark_off();
|
||||
MacroAssembler _masm(&cbuf);
|
||||
address double_address = __ double_constant(x);
|
||||
cbuf.insts()->set_mark_off(mark); // preserve mark across masm shift
|
||||
emit_d32_reloc(cbuf,
|
||||
(int) (double_address - cbuf.insts_end() - 4),
|
||||
internal_word_Relocation::spec(double_address),
|
||||
RELOC_DISP32);
|
||||
}
|
||||
|
||||
static void emit_float_constant(CodeBuffer& cbuf, float x) {
|
||||
int mark = cbuf.insts()->mark_off();
|
||||
MacroAssembler _masm(&cbuf);
|
||||
address float_address = __ float_constant(x);
|
||||
cbuf.insts()->set_mark_off(mark); // preserve mark across masm shift
|
||||
emit_d32_reloc(cbuf,
|
||||
(int) (float_address - cbuf.insts_end() - 4),
|
||||
internal_word_Relocation::spec(float_address),
|
||||
RELOC_DISP32);
|
||||
}
|
||||
|
||||
|
||||
const bool Matcher::match_rule_supported(int opcode) {
|
||||
if (!has_match_rule(opcode))
|
||||
@ -2789,43 +2786,6 @@ encode %{
|
||||
}
|
||||
%}
|
||||
|
||||
enc_class load_immF(regF dst, immF con)
|
||||
%{
|
||||
// XXX reg_mem doesn't support RIP-relative addressing yet
|
||||
emit_rm(cbuf, 0x0, $dst$$reg & 7, 0x5); // 00 reg 101
|
||||
emit_float_constant(cbuf, $con$$constant);
|
||||
%}
|
||||
|
||||
enc_class load_immD(regD dst, immD con)
|
||||
%{
|
||||
// XXX reg_mem doesn't support RIP-relative addressing yet
|
||||
emit_rm(cbuf, 0x0, $dst$$reg & 7, 0x5); // 00 reg 101
|
||||
emit_double_constant(cbuf, $con$$constant);
|
||||
%}
|
||||
|
||||
enc_class load_conF (regF dst, immF con) %{ // Load float constant
|
||||
emit_opcode(cbuf, 0xF3);
|
||||
if ($dst$$reg >= 8) {
|
||||
emit_opcode(cbuf, Assembler::REX_R);
|
||||
}
|
||||
emit_opcode(cbuf, 0x0F);
|
||||
emit_opcode(cbuf, 0x10);
|
||||
emit_rm(cbuf, 0x0, $dst$$reg & 7, 0x5); // 00 reg 101
|
||||
emit_float_constant(cbuf, $con$$constant);
|
||||
%}
|
||||
|
||||
enc_class load_conD (regD dst, immD con) %{ // Load double constant
|
||||
// UseXmmLoadAndClearUpper ? movsd(dst, con) : movlpd(dst, con)
|
||||
emit_opcode(cbuf, UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
|
||||
if ($dst$$reg >= 8) {
|
||||
emit_opcode(cbuf, Assembler::REX_R);
|
||||
}
|
||||
emit_opcode(cbuf, 0x0F);
|
||||
emit_opcode(cbuf, UseXmmLoadAndClearUpper ? 0x10 : 0x12);
|
||||
emit_rm(cbuf, 0x0, $dst$$reg & 7, 0x5); // 00 reg 101
|
||||
emit_double_constant(cbuf, $con$$constant);
|
||||
%}
|
||||
|
||||
// Encode a reg-reg copy. If it is useless, then empty encoding.
|
||||
enc_class enc_copy(rRegI dst, rRegI src)
|
||||
%{
|
||||
@ -2926,63 +2886,6 @@ encode %{
|
||||
emit_d32(cbuf, 0x00);
|
||||
%}
|
||||
|
||||
enc_class jump_enc(rRegL switch_val, rRegI dest) %{
|
||||
MacroAssembler masm(&cbuf);
|
||||
|
||||
Register switch_reg = as_Register($switch_val$$reg);
|
||||
Register dest_reg = as_Register($dest$$reg);
|
||||
address table_base = masm.address_table_constant(_index2label);
|
||||
|
||||
// We could use jump(ArrayAddress) except that the macro assembler needs to use r10
|
||||
// to do that and the compiler is using that register as one it can allocate.
|
||||
// So we build it all by hand.
|
||||
// Address index(noreg, switch_reg, Address::times_1);
|
||||
// ArrayAddress dispatch(table, index);
|
||||
|
||||
Address dispatch(dest_reg, switch_reg, Address::times_1);
|
||||
|
||||
masm.lea(dest_reg, InternalAddress(table_base));
|
||||
masm.jmp(dispatch);
|
||||
%}
|
||||
|
||||
enc_class jump_enc_addr(rRegL switch_val, immI2 shift, immL32 offset, rRegI dest) %{
|
||||
MacroAssembler masm(&cbuf);
|
||||
|
||||
Register switch_reg = as_Register($switch_val$$reg);
|
||||
Register dest_reg = as_Register($dest$$reg);
|
||||
address table_base = masm.address_table_constant(_index2label);
|
||||
|
||||
// We could use jump(ArrayAddress) except that the macro assembler needs to use r10
|
||||
// to do that and the compiler is using that register as one it can allocate.
|
||||
// So we build it all by hand.
|
||||
// Address index(noreg, switch_reg, (Address::ScaleFactor)$shift$$constant, (int)$offset$$constant);
|
||||
// ArrayAddress dispatch(table, index);
|
||||
|
||||
Address dispatch(dest_reg, switch_reg, (Address::ScaleFactor)$shift$$constant, (int)$offset$$constant);
|
||||
|
||||
masm.lea(dest_reg, InternalAddress(table_base));
|
||||
masm.jmp(dispatch);
|
||||
%}
|
||||
|
||||
enc_class jump_enc_offset(rRegL switch_val, immI2 shift, rRegI dest) %{
|
||||
MacroAssembler masm(&cbuf);
|
||||
|
||||
Register switch_reg = as_Register($switch_val$$reg);
|
||||
Register dest_reg = as_Register($dest$$reg);
|
||||
address table_base = masm.address_table_constant(_index2label);
|
||||
|
||||
// We could use jump(ArrayAddress) except that the macro assembler needs to use r10
|
||||
// to do that and the compiler is using that register as one it can allocate.
|
||||
// So we build it all by hand.
|
||||
// Address index(noreg, switch_reg, (Address::ScaleFactor)$shift$$constant);
|
||||
// ArrayAddress dispatch(table, index);
|
||||
|
||||
Address dispatch(dest_reg, switch_reg, (Address::ScaleFactor)$shift$$constant);
|
||||
masm.lea(dest_reg, InternalAddress(table_base));
|
||||
masm.jmp(dispatch);
|
||||
|
||||
%}
|
||||
|
||||
enc_class lock_prefix()
|
||||
%{
|
||||
if (os::is_MP()) {
|
||||
@ -6641,12 +6544,11 @@ instruct loadConL32(rRegL dst, immL32 src)
|
||||
ins_pipe(ialu_reg);
|
||||
%}
|
||||
|
||||
instruct loadConP(rRegP dst, immP src)
|
||||
%{
|
||||
match(Set dst src);
|
||||
instruct loadConP(rRegP dst, immP con) %{
|
||||
match(Set dst con);
|
||||
|
||||
format %{ "movq $dst, $src\t# ptr" %}
|
||||
ins_encode(load_immP(dst, src));
|
||||
format %{ "movq $dst, $con\t# ptr" %}
|
||||
ins_encode(load_immP(dst, con));
|
||||
ins_pipe(ialu_reg_fat); // XXX
|
||||
%}
|
||||
|
||||
@ -6673,13 +6575,13 @@ instruct loadConP31(rRegP dst, immP31 src, rFlagsReg cr)
|
||||
ins_pipe(ialu_reg);
|
||||
%}
|
||||
|
||||
instruct loadConF(regF dst, immF src)
|
||||
%{
|
||||
match(Set dst src);
|
||||
instruct loadConF(regF dst, immF con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
|
||||
format %{ "movss $dst, [$src]" %}
|
||||
ins_encode(load_conF(dst, src));
|
||||
format %{ "movss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_encode %{
|
||||
__ movflt($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -6721,13 +6623,13 @@ instruct loadConF0(regF dst, immF0 src)
|
||||
%}
|
||||
|
||||
// Use the same format since predicate() can not be used here.
|
||||
instruct loadConD(regD dst, immD src)
|
||||
%{
|
||||
match(Set dst src);
|
||||
instruct loadConD(regD dst, immD con) %{
|
||||
match(Set dst con);
|
||||
ins_cost(125);
|
||||
|
||||
format %{ "movsd $dst, [$src]" %}
|
||||
ins_encode(load_conD(dst, src));
|
||||
format %{ "movsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_encode %{
|
||||
__ movdbl($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -7694,9 +7596,18 @@ instruct jumpXtnd_offset(rRegL switch_val, immI2 shift, rRegI dest) %{
|
||||
predicate(false);
|
||||
effect(TEMP dest);
|
||||
|
||||
format %{ "leaq $dest, table_base\n\t"
|
||||
format %{ "leaq $dest, [$constantaddress]\n\t"
|
||||
"jmp [$dest + $switch_val << $shift]\n\t" %}
|
||||
ins_encode(jump_enc_offset(switch_val, shift, dest));
|
||||
ins_encode %{
|
||||
// We could use jump(ArrayAddress) except that the macro assembler needs to use r10
|
||||
// to do that and the compiler is using that register as one it can allocate.
|
||||
// So we build it all by hand.
|
||||
// Address index(noreg, switch_reg, (Address::ScaleFactor)$shift$$constant);
|
||||
// ArrayAddress dispatch(table, index);
|
||||
Address dispatch($dest$$Register, $switch_val$$Register, (Address::ScaleFactor) $shift$$constant);
|
||||
__ lea($dest$$Register, $constantaddress);
|
||||
__ jmp(dispatch);
|
||||
%}
|
||||
ins_pipe(pipe_jmp);
|
||||
ins_pc_relative(1);
|
||||
%}
|
||||
@ -7706,9 +7617,18 @@ instruct jumpXtnd_addr(rRegL switch_val, immI2 shift, immL32 offset, rRegI dest)
|
||||
ins_cost(350);
|
||||
effect(TEMP dest);
|
||||
|
||||
format %{ "leaq $dest, table_base\n\t"
|
||||
format %{ "leaq $dest, [$constantaddress]\n\t"
|
||||
"jmp [$dest + $switch_val << $shift + $offset]\n\t" %}
|
||||
ins_encode(jump_enc_addr(switch_val, shift, offset, dest));
|
||||
ins_encode %{
|
||||
// We could use jump(ArrayAddress) except that the macro assembler needs to use r10
|
||||
// to do that and the compiler is using that register as one it can allocate.
|
||||
// So we build it all by hand.
|
||||
// Address index(noreg, switch_reg, (Address::ScaleFactor) $shift$$constant, (int) $offset$$constant);
|
||||
// ArrayAddress dispatch(table, index);
|
||||
Address dispatch($dest$$Register, $switch_val$$Register, (Address::ScaleFactor) $shift$$constant, (int) $offset$$constant);
|
||||
__ lea($dest$$Register, $constantaddress);
|
||||
__ jmp(dispatch);
|
||||
%}
|
||||
ins_pipe(pipe_jmp);
|
||||
ins_pc_relative(1);
|
||||
%}
|
||||
@ -7718,9 +7638,18 @@ instruct jumpXtnd(rRegL switch_val, rRegI dest) %{
|
||||
ins_cost(350);
|
||||
effect(TEMP dest);
|
||||
|
||||
format %{ "leaq $dest, table_base\n\t"
|
||||
format %{ "leaq $dest, [$constantaddress]\n\t"
|
||||
"jmp [$dest + $switch_val]\n\t" %}
|
||||
ins_encode(jump_enc(switch_val, dest));
|
||||
ins_encode %{
|
||||
// We could use jump(ArrayAddress) except that the macro assembler needs to use r10
|
||||
// to do that and the compiler is using that register as one it can allocate.
|
||||
// So we build it all by hand.
|
||||
// Address index(noreg, switch_reg, Address::times_1);
|
||||
// ArrayAddress dispatch(table, index);
|
||||
Address dispatch($dest$$Register, $switch_val$$Register, Address::times_1);
|
||||
__ lea($dest$$Register, $constantaddress);
|
||||
__ jmp(dispatch);
|
||||
%}
|
||||
ins_pipe(pipe_jmp);
|
||||
ins_pc_relative(1);
|
||||
%}
|
||||
@ -10376,30 +10305,36 @@ instruct cmpF_cc_memCF(rFlagsRegUCF cr, regF src1, memory src2) %{
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct cmpF_cc_imm(rFlagsRegU cr, regF src1, immF src2)
|
||||
%{
|
||||
match(Set cr (CmpF src1 src2));
|
||||
instruct cmpF_cc_imm(rFlagsRegU cr, regF src, immF con) %{
|
||||
match(Set cr (CmpF src con));
|
||||
|
||||
ins_cost(145);
|
||||
format %{ "ucomiss $src1, $src2\n\t"
|
||||
format %{ "ucomiss $src, [$constantaddress]\t# load from constant table: float=$con\n\t"
|
||||
"jnp,s exit\n\t"
|
||||
"pushfq\t# saw NaN, set CF\n\t"
|
||||
"andq [rsp], #0xffffff2b\n\t"
|
||||
"popfq\n"
|
||||
"exit: nop\t# avoid branch to branch" %}
|
||||
opcode(0x0F, 0x2E);
|
||||
ins_encode(REX_reg_mem(src1, src2), OpcP, OpcS, load_immF(src1, src2),
|
||||
cmpfp_fixup);
|
||||
ins_encode %{
|
||||
Label L_exit;
|
||||
__ ucomiss($src$$XMMRegister, $constantaddress($con));
|
||||
__ jcc(Assembler::noParity, L_exit);
|
||||
__ pushf();
|
||||
__ andq(rsp, 0xffffff2b);
|
||||
__ popf();
|
||||
__ bind(L_exit);
|
||||
__ nop();
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct cmpF_cc_immCF(rFlagsRegUCF cr, regF src1, immF src2) %{
|
||||
match(Set cr (CmpF src1 src2));
|
||||
|
||||
instruct cmpF_cc_immCF(rFlagsRegUCF cr, regF src, immF con) %{
|
||||
match(Set cr (CmpF src con));
|
||||
ins_cost(100);
|
||||
format %{ "ucomiss $src1, $src2" %}
|
||||
opcode(0x0F, 0x2E);
|
||||
ins_encode(REX_reg_mem(src1, src2), OpcP, OpcS, load_immF(src1, src2));
|
||||
format %{ "ucomiss $src, [$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_encode %{
|
||||
__ ucomiss($src$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10458,30 +10393,36 @@ instruct cmpD_cc_memCF(rFlagsRegUCF cr, regD src1, memory src2) %{
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct cmpD_cc_imm(rFlagsRegU cr, regD src1, immD src2)
|
||||
%{
|
||||
match(Set cr (CmpD src1 src2));
|
||||
instruct cmpD_cc_imm(rFlagsRegU cr, regD src, immD con) %{
|
||||
match(Set cr (CmpD src con));
|
||||
|
||||
ins_cost(145);
|
||||
format %{ "ucomisd $src1, [$src2]\n\t"
|
||||
format %{ "ucomisd $src, [$constantaddress]\t# load from constant table: double=$con\n\t"
|
||||
"jnp,s exit\n\t"
|
||||
"pushfq\t# saw NaN, set CF\n\t"
|
||||
"andq [rsp], #0xffffff2b\n\t"
|
||||
"popfq\n"
|
||||
"exit: nop\t# avoid branch to branch" %}
|
||||
opcode(0x66, 0x0F, 0x2E);
|
||||
ins_encode(OpcP, REX_reg_mem(src1, src2), OpcS, OpcT, load_immD(src1, src2),
|
||||
cmpfp_fixup);
|
||||
ins_encode %{
|
||||
Label L_exit;
|
||||
__ ucomisd($src$$XMMRegister, $constantaddress($con));
|
||||
__ jcc(Assembler::noParity, L_exit);
|
||||
__ pushf();
|
||||
__ andq(rsp, 0xffffff2b);
|
||||
__ popf();
|
||||
__ bind(L_exit);
|
||||
__ nop();
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct cmpD_cc_immCF(rFlagsRegUCF cr, regD src1, immD src2) %{
|
||||
match(Set cr (CmpD src1 src2));
|
||||
|
||||
instruct cmpD_cc_immCF(rFlagsRegUCF cr, regD src, immD con) %{
|
||||
match(Set cr (CmpD src con));
|
||||
ins_cost(100);
|
||||
format %{ "ucomisd $src1, [$src2]" %}
|
||||
opcode(0x66, 0x0F, 0x2E);
|
||||
ins_encode(OpcP, REX_reg_mem(src1, src2), OpcS, OpcT, load_immD(src1, src2));
|
||||
format %{ "ucomisd $src, [$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_encode %{
|
||||
__ ucomisd($src$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10528,23 +10469,29 @@ instruct cmpF_mem(rRegI dst, regF src1, memory src2, rFlagsReg cr)
|
||||
%}
|
||||
|
||||
// Compare into -1,0,1
|
||||
instruct cmpF_imm(rRegI dst, regF src1, immF src2, rFlagsReg cr)
|
||||
%{
|
||||
match(Set dst (CmpF3 src1 src2));
|
||||
instruct cmpF_imm(rRegI dst, regF src, immF con, rFlagsReg cr) %{
|
||||
match(Set dst (CmpF3 src con));
|
||||
effect(KILL cr);
|
||||
|
||||
ins_cost(275);
|
||||
format %{ "ucomiss $src1, [$src2]\n\t"
|
||||
format %{ "ucomiss $src, [$constantaddress]\t# load from constant table: float=$con\n\t"
|
||||
"movl $dst, #-1\n\t"
|
||||
"jp,s done\n\t"
|
||||
"jb,s done\n\t"
|
||||
"setne $dst\n\t"
|
||||
"movzbl $dst, $dst\n"
|
||||
"done:" %}
|
||||
|
||||
opcode(0x0F, 0x2E);
|
||||
ins_encode(REX_reg_mem(src1, src2), OpcP, OpcS, load_immF(src1, src2),
|
||||
cmpfp3(dst));
|
||||
ins_encode %{
|
||||
Label L_done;
|
||||
Register Rdst = $dst$$Register;
|
||||
__ ucomiss($src$$XMMRegister, $constantaddress($con));
|
||||
__ movl(Rdst, -1);
|
||||
__ jcc(Assembler::parity, L_done);
|
||||
__ jcc(Assembler::below, L_done);
|
||||
__ setb(Assembler::notEqual, Rdst);
|
||||
__ movzbl(Rdst, Rdst);
|
||||
__ bind(L_done);
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10591,23 +10538,29 @@ instruct cmpD_mem(rRegI dst, regD src1, memory src2, rFlagsReg cr)
|
||||
%}
|
||||
|
||||
// Compare into -1,0,1
|
||||
instruct cmpD_imm(rRegI dst, regD src1, immD src2, rFlagsReg cr)
|
||||
%{
|
||||
match(Set dst (CmpD3 src1 src2));
|
||||
instruct cmpD_imm(rRegI dst, regD src, immD con, rFlagsReg cr) %{
|
||||
match(Set dst (CmpD3 src con));
|
||||
effect(KILL cr);
|
||||
|
||||
ins_cost(275);
|
||||
format %{ "ucomisd $src1, [$src2]\n\t"
|
||||
format %{ "ucomisd $src, [$constantaddress]\t# load from constant table: double=$con\n\t"
|
||||
"movl $dst, #-1\n\t"
|
||||
"jp,s done\n\t"
|
||||
"jb,s done\n\t"
|
||||
"setne $dst\n\t"
|
||||
"movzbl $dst, $dst\n"
|
||||
"done:" %}
|
||||
|
||||
opcode(0x66, 0x0F, 0x2E);
|
||||
ins_encode(OpcP, REX_reg_mem(src1, src2), OpcS, OpcT, load_immD(src1, src2),
|
||||
cmpfp3(dst));
|
||||
ins_encode %{
|
||||
Register Rdst = $dst$$Register;
|
||||
Label L_done;
|
||||
__ ucomisd($src$$XMMRegister, $constantaddress($con));
|
||||
__ movl(Rdst, -1);
|
||||
__ jcc(Assembler::parity, L_done);
|
||||
__ jcc(Assembler::below, L_done);
|
||||
__ setb(Assembler::notEqual, Rdst);
|
||||
__ movzbl(Rdst, Rdst);
|
||||
__ bind(L_done);
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10633,14 +10586,13 @@ instruct addF_mem(regF dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct addF_imm(regF dst, immF src)
|
||||
%{
|
||||
match(Set dst (AddF dst src));
|
||||
|
||||
format %{ "addss $dst, [$src]" %}
|
||||
instruct addF_imm(regF dst, immF con) %{
|
||||
match(Set dst (AddF dst con));
|
||||
format %{ "addss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF3, 0x0F, 0x58);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immF(dst, src));
|
||||
ins_encode %{
|
||||
__ addss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10666,14 +10618,13 @@ instruct addD_mem(regD dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct addD_imm(regD dst, immD src)
|
||||
%{
|
||||
match(Set dst (AddD dst src));
|
||||
|
||||
format %{ "addsd $dst, [$src]" %}
|
||||
instruct addD_imm(regD dst, immD con) %{
|
||||
match(Set dst (AddD dst con));
|
||||
format %{ "addsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF2, 0x0F, 0x58);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immD(dst, src));
|
||||
ins_encode %{
|
||||
__ addsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10699,14 +10650,13 @@ instruct subF_mem(regF dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct subF_imm(regF dst, immF src)
|
||||
%{
|
||||
match(Set dst (SubF dst src));
|
||||
|
||||
format %{ "subss $dst, [$src]" %}
|
||||
instruct subF_imm(regF dst, immF con) %{
|
||||
match(Set dst (SubF dst con));
|
||||
format %{ "subss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF3, 0x0F, 0x5C);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immF(dst, src));
|
||||
ins_encode %{
|
||||
__ subss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10732,14 +10682,13 @@ instruct subD_mem(regD dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct subD_imm(regD dst, immD src)
|
||||
%{
|
||||
match(Set dst (SubD dst src));
|
||||
|
||||
format %{ "subsd $dst, [$src]" %}
|
||||
instruct subD_imm(regD dst, immD con) %{
|
||||
match(Set dst (SubD dst con));
|
||||
format %{ "subsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF2, 0x0F, 0x5C);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immD(dst, src));
|
||||
ins_encode %{
|
||||
__ subsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10765,14 +10714,13 @@ instruct mulF_mem(regF dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct mulF_imm(regF dst, immF src)
|
||||
%{
|
||||
match(Set dst (MulF dst src));
|
||||
|
||||
format %{ "mulss $dst, [$src]" %}
|
||||
instruct mulF_imm(regF dst, immF con) %{
|
||||
match(Set dst (MulF dst con));
|
||||
format %{ "mulss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF3, 0x0F, 0x59);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immF(dst, src));
|
||||
ins_encode %{
|
||||
__ mulss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10798,14 +10746,13 @@ instruct mulD_mem(regD dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct mulD_imm(regD dst, immD src)
|
||||
%{
|
||||
match(Set dst (MulD dst src));
|
||||
|
||||
format %{ "mulsd $dst, [$src]" %}
|
||||
instruct mulD_imm(regD dst, immD con) %{
|
||||
match(Set dst (MulD dst con));
|
||||
format %{ "mulsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF2, 0x0F, 0x59);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immD(dst, src));
|
||||
ins_encode %{
|
||||
__ mulsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10831,14 +10778,13 @@ instruct divF_mem(regF dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct divF_imm(regF dst, immF src)
|
||||
%{
|
||||
match(Set dst (DivF dst src));
|
||||
|
||||
format %{ "divss $dst, [$src]" %}
|
||||
instruct divF_imm(regF dst, immF con) %{
|
||||
match(Set dst (DivF dst con));
|
||||
format %{ "divss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF3, 0x0F, 0x5E);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immF(dst, src));
|
||||
ins_encode %{
|
||||
__ divss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10864,14 +10810,13 @@ instruct divD_mem(regD dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct divD_imm(regD dst, immD src)
|
||||
%{
|
||||
match(Set dst (DivD dst src));
|
||||
|
||||
format %{ "divsd $dst, [$src]" %}
|
||||
instruct divD_imm(regD dst, immD con) %{
|
||||
match(Set dst (DivD dst con));
|
||||
format %{ "divsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF2, 0x0F, 0x5E);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immD(dst, src));
|
||||
ins_encode %{
|
||||
__ divsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10897,14 +10842,13 @@ instruct sqrtF_mem(regF dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct sqrtF_imm(regF dst, immF src)
|
||||
%{
|
||||
match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
|
||||
|
||||
format %{ "sqrtss $dst, [$src]" %}
|
||||
instruct sqrtF_imm(regF dst, immF con) %{
|
||||
match(Set dst (ConvD2F (SqrtD (ConvF2D con))));
|
||||
format %{ "sqrtss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF3, 0x0F, 0x51);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immF(dst, src));
|
||||
ins_encode %{
|
||||
__ sqrtss($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
@ -10930,14 +10874,13 @@ instruct sqrtD_mem(regD dst, memory src)
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct sqrtD_imm(regD dst, immD src)
|
||||
%{
|
||||
match(Set dst (SqrtD src));
|
||||
|
||||
format %{ "sqrtsd $dst, [$src]" %}
|
||||
instruct sqrtD_imm(regD dst, immD con) %{
|
||||
match(Set dst (SqrtD con));
|
||||
format %{ "sqrtsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
||||
ins_cost(150); // XXX
|
||||
opcode(0xF2, 0x0F, 0x51);
|
||||
ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immD(dst, src));
|
||||
ins_encode %{
|
||||
__ sqrtsd($dst$$XMMRegister, $constantaddress($con));
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
|
@ -115,6 +115,7 @@
|
||||
# include <link.h>
|
||||
# include <stdint.h>
|
||||
# include <inttypes.h>
|
||||
# include <sys/ioctl.h>
|
||||
|
||||
#define MAX_PATH (2 * K)
|
||||
|
||||
@ -4433,6 +4434,15 @@ int os::available(int fd, jlong *bytes) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int os::socket_available(int fd, jint *pbytes) {
|
||||
// Linux doc says EINTR not returned, unlike Solaris
|
||||
int ret = ::ioctl(fd, FIONREAD, pbytes);
|
||||
|
||||
//%% note ioctl can return 0 when successful, JVM_SocketAvailable
|
||||
// is expected to return 0 on failure and 1 on success to the jdk.
|
||||
return (ret < 0) ? 0 : 1;
|
||||
}
|
||||
|
||||
// Map a block of memory.
|
||||
char* os::map_memory(int fd, const char* file_name, size_t file_offset,
|
||||
char *addr, size_t bytes, bool read_only,
|
||||
|
@ -45,7 +45,6 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <netdb.h>
|
||||
|
||||
inline void* os::thread_local_storage_at(int index) {
|
||||
@ -268,16 +267,6 @@ inline int os::sendto(int fd, char *buf, int len, int flags,
|
||||
RESTARTABLE_RETURN_INT(::sendto(fd, buf, len, (unsigned int) flags, to, tolen));
|
||||
}
|
||||
|
||||
inline int os::socket_available(int fd, jint *pbytes) {
|
||||
// Linux doc says EINTR not returned, unlike Solaris
|
||||
int ret = ::ioctl(fd, FIONREAD, pbytes);
|
||||
|
||||
//%% note ioctl can return 0 when successful, JVM_SocketAvailable
|
||||
// is expected to return 0 on failure and 1 on success to the jdk.
|
||||
return (ret < 0) ? 0 : 1;
|
||||
}
|
||||
|
||||
|
||||
inline int os::socket_shutdown(int fd, int howto){
|
||||
return ::shutdown(fd, howto);
|
||||
}
|
||||
|
@ -635,7 +635,29 @@ static int create_sharedmem_resources(const char* dirname, const char* filename,
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fd;
|
||||
// Verify that we have enough disk space for this file.
|
||||
// We'll get random SIGBUS crashes on memory accesses if
|
||||
// we don't.
|
||||
|
||||
for (size_t seekpos = 0; seekpos < size; seekpos += os::vm_page_size()) {
|
||||
int zero_int = 0;
|
||||
result = (int)os::seek_to_file_offset(fd, (jlong)(seekpos));
|
||||
if (result == -1 ) break;
|
||||
RESTARTABLE(::write(fd, &zero_int, 1), result);
|
||||
if (result != 1) {
|
||||
if (errno == ENOSPC) {
|
||||
warning("Insufficient space for shared memory file:\n %s\nTry using the -Djava.io.tmpdir= option to select an alternate temp location.\n", filename);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (result != -1) {
|
||||
return fd;
|
||||
} else {
|
||||
RESTARTABLE(::close(fd), result);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// open the shared memory file for the given user and vmid. returns
|
||||
|
@ -44,11 +44,11 @@ void VMError::show_message_box(char *buf, int buflen) {
|
||||
jio_snprintf(p, buflen - len,
|
||||
"\n\n"
|
||||
"Do you want to debug the problem?\n\n"
|
||||
"To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " INTX_FORMAT "\n"
|
||||
"To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " INTX_FORMAT " (" INTPTR_FORMAT ")\n"
|
||||
"Enter 'yes' to launch gdb automatically (PATH must include gdb)\n"
|
||||
"Otherwise, press RETURN to abort...",
|
||||
os::current_process_id(), os::current_process_id(),
|
||||
os::current_thread_id());
|
||||
os::current_thread_id(), os::current_thread_id());
|
||||
|
||||
yes = os::message_box("Unexpected Error", buf);
|
||||
|
||||
|
@ -812,13 +812,10 @@ GetApplicationHome(char *buf, jint bufsize)
|
||||
|
||||
#ifdef GAMMA
|
||||
{
|
||||
/* gamma launcher uses JAVA_HOME or ALT_JAVA_HOME environment variable to find JDK/JRE */
|
||||
char* java_home_var = getenv("ALT_JAVA_HOME");
|
||||
/* gamma launcher uses JAVA_HOME environment variable to find JDK/JRE */
|
||||
char* java_home_var = getenv("JAVA_HOME");
|
||||
if (java_home_var == NULL) {
|
||||
java_home_var = getenv("JAVA_HOME");
|
||||
}
|
||||
if (java_home_var == NULL) {
|
||||
printf("JAVA_HOME or ALT_JAVA_HOME must point to a valid JDK/JRE to run gamma\n");
|
||||
printf("JAVA_HOME must point to a valid JDK/JRE to run gamma\n");
|
||||
return JNI_FALSE;
|
||||
}
|
||||
snprintf(buf, bufsize, "%s", java_home_var);
|
||||
@ -1837,7 +1834,7 @@ ContinueInNewThread(int (JNICALL *continuation)(void *), jlong stack_size, void
|
||||
if (pthread_create(&tid, &attr, (void *(*)(void*))continuation, (void*)args) == 0) {
|
||||
void * tmp;
|
||||
pthread_join(tid, &tmp);
|
||||
rslt = (int)tmp;
|
||||
rslt = (int)(intptr_t)tmp;
|
||||
} else {
|
||||
/*
|
||||
* Continue execution in current thread if for some reason (e.g. out of
|
||||
@ -1855,7 +1852,7 @@ ContinueInNewThread(int (JNICALL *continuation)(void *), jlong stack_size, void
|
||||
if (thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) == 0) {
|
||||
void * tmp;
|
||||
thr_join(tid, NULL, &tmp);
|
||||
rslt = (int)tmp;
|
||||
rslt = (int)(intptr_t)tmp;
|
||||
} else {
|
||||
/* See above. Continue in current thread if thr_create() failed */
|
||||
rslt = continuation(args);
|
||||
|
@ -95,17 +95,21 @@ case "$1" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Find out the absolute path to this script
|
||||
MYDIR=$(cd $(dirname $SCRIPT) && pwd)
|
||||
|
||||
JDK=
|
||||
if [ "${ALT_JAVA_HOME}" = "" ]; then
|
||||
if [ "${JAVA_HOME}" = "" ]; then
|
||||
echo "Neither ALT_JAVA_HOME nor JAVA_HOME is set. Aborting.";
|
||||
exit 1;
|
||||
else
|
||||
JDK=${JAVA_HOME%%/jre};
|
||||
fi
|
||||
source ${MYDIR}/jdkpath.sh
|
||||
else
|
||||
JDK=${ALT_JAVA_HOME%%/jre};
|
||||
fi
|
||||
|
||||
if [ "${JDK}" = "" ]; then
|
||||
echo Failed to find JDK. ALT_JAVA_HOME is not set or ./jdkpath.sh is empty or not found.
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# We will set the LD_LIBRARY_PATH as follows:
|
||||
# o $JVMPATH (directory portion only)
|
||||
# o $JRE/lib/$ARCH
|
||||
|
@ -80,6 +80,7 @@
|
||||
// put OS-includes here
|
||||
# include <dlfcn.h>
|
||||
# include <errno.h>
|
||||
# include <exception>
|
||||
# include <link.h>
|
||||
# include <poll.h>
|
||||
# include <pthread.h>
|
||||
@ -1475,6 +1476,13 @@ sigset_t* os::Solaris::allowdebug_blocked_signals() {
|
||||
return &allowdebug_blocked_sigs;
|
||||
}
|
||||
|
||||
|
||||
void _handle_uncaught_cxx_exception() {
|
||||
VMError err("An uncaught C++ exception");
|
||||
err.report_and_die();
|
||||
}
|
||||
|
||||
|
||||
// First crack at OS-specific initialization, from inside the new thread.
|
||||
void os::initialize_thread() {
|
||||
int r = thr_main() ;
|
||||
@ -1564,6 +1572,7 @@ void os::initialize_thread() {
|
||||
// use the dynamic check for T2 libthread.
|
||||
|
||||
os::Solaris::init_thread_fpu_state();
|
||||
std::set_terminate(_handle_uncaught_cxx_exception);
|
||||
}
|
||||
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <windows.h>
|
||||
#include <io.h>
|
||||
#include <process.h>
|
||||
@ -486,16 +487,62 @@ GetApplicationHome(char *buf, jint bufsize)
|
||||
|
||||
#else /* ifndef GAMMA */
|
||||
|
||||
/* gamma launcher uses JAVA_HOME or ALT_JAVA_HOME environment variable to find JDK/JRE */
|
||||
char* java_home_var = getenv("ALT_JAVA_HOME");
|
||||
if (java_home_var == NULL) {
|
||||
java_home_var = getenv("JAVA_HOME");
|
||||
char env[MAXPATHLEN + 1];
|
||||
|
||||
/* gamma launcher uses ALT_JAVA_HOME environment variable or jdkpath.txt file to find JDK/JRE */
|
||||
|
||||
if (getenv("ALT_JAVA_HOME") != NULL) {
|
||||
snprintf(buf, bufsize, "%s", getenv("ALT_JAVA_HOME"));
|
||||
}
|
||||
if (java_home_var == NULL) {
|
||||
printf("JAVA_HOME or ALT_JAVA_HOME must point to a valid JDK/JRE to run gamma\n");
|
||||
return JNI_FALSE;
|
||||
else {
|
||||
char path[MAXPATHLEN + 1];
|
||||
char* p;
|
||||
int len;
|
||||
FILE* fp;
|
||||
|
||||
// find the path to the currect executable
|
||||
len = GetModuleFileName(NULL, path, MAXPATHLEN + 1);
|
||||
if (len == 0 || len > MAXPATHLEN) {
|
||||
printf("Could not get directory of current executable.");
|
||||
return JNI_FALSE;
|
||||
}
|
||||
// remove last path component ("hotspot.exe")
|
||||
p = strrchr(path, '\\');
|
||||
if (p == NULL) {
|
||||
printf("Could not parse directory of current executable.\n");
|
||||
return JNI_FALSE;
|
||||
}
|
||||
*p = '\0';
|
||||
|
||||
// open jdkpath.txt and read JAVA_HOME from it
|
||||
if (strlen(path) + strlen("\\jdkpath.txt") + 1 >= MAXPATHLEN) {
|
||||
printf("Path too long: %s\n", path);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
strcat(path, "\\jdkpath.txt");
|
||||
fp = fopen(path, "r");
|
||||
if (fp == NULL) {
|
||||
printf("Could not open file %s to get path to JDK.\n", path);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
if (fgets(buf, bufsize, fp) == NULL) {
|
||||
printf("Could not read from file %s to get path to JDK.\n", path);
|
||||
fclose(fp);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
// trim the buffer
|
||||
p = buf + strlen(buf) - 1;
|
||||
while(isspace(*p)) {
|
||||
*p = '\0';
|
||||
p--;
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
snprintf(buf, bufsize, "%s", java_home_var);
|
||||
|
||||
_snprintf(env, MAXPATHLEN, "JAVA_HOME=%s", buf);
|
||||
_putenv(env);
|
||||
|
||||
return JNI_TRUE;
|
||||
#endif /* ifndef GAMMA */
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* CopyrighT (c) 1997, 2010, 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
|
||||
@ -1711,14 +1711,11 @@ void os::jvm_path(char *buf, jint buflen) {
|
||||
buf[0] = '\0';
|
||||
if (strcmp(Arguments::sun_java_launcher(), "gamma") == 0) {
|
||||
// Support for the gamma launcher. Check for an
|
||||
// ALT_JAVA_HOME or JAVA_HOME environment variable
|
||||
// JAVA_HOME environment variable
|
||||
// and fix up the path so it looks like
|
||||
// libjvm.so is installed there (append a fake suffix
|
||||
// hotspot/libjvm.so).
|
||||
char* java_home_var = ::getenv("ALT_JAVA_HOME");
|
||||
if (java_home_var == NULL) {
|
||||
java_home_var = ::getenv("JAVA_HOME");
|
||||
}
|
||||
char* java_home_var = ::getenv("JAVA_HOME");
|
||||
if (java_home_var != NULL && java_home_var[0] != 0) {
|
||||
|
||||
strncpy(buf, java_home_var, buflen);
|
||||
@ -2007,6 +2004,16 @@ struct siglabel {
|
||||
int number;
|
||||
};
|
||||
|
||||
// All Visual C++ exceptions thrown from code generated by the Microsoft Visual
|
||||
// C++ compiler contain this error code. Because this is a compiler-generated
|
||||
// error, the code is not listed in the Win32 API header files.
|
||||
// The code is actually a cryptic mnemonic device, with the initial "E"
|
||||
// standing for "exception" and the final 3 bytes (0x6D7363) representing the
|
||||
// ASCII values of "msc".
|
||||
|
||||
#define EXCEPTION_UNCAUGHT_CXX_EXCEPTION 0xE06D7363
|
||||
|
||||
|
||||
struct siglabel exceptlabels[] = {
|
||||
def_excpt(EXCEPTION_ACCESS_VIOLATION),
|
||||
def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
|
||||
@ -2031,6 +2038,7 @@ struct siglabel exceptlabels[] = {
|
||||
def_excpt(EXCEPTION_INVALID_DISPOSITION),
|
||||
def_excpt(EXCEPTION_GUARD_PAGE),
|
||||
def_excpt(EXCEPTION_INVALID_HANDLE),
|
||||
def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION),
|
||||
NULL, 0
|
||||
};
|
||||
|
||||
@ -2264,7 +2272,6 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (t != NULL && t->is_Java_thread()) {
|
||||
JavaThread* thread = (JavaThread*) t;
|
||||
bool in_java = thread->thread_state() == _thread_in_Java;
|
||||
@ -2468,8 +2475,9 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
|
||||
} // switch
|
||||
}
|
||||
#ifndef _WIN64
|
||||
if ((thread->thread_state() == _thread_in_Java) ||
|
||||
(thread->thread_state() == _thread_in_native) )
|
||||
if (((thread->thread_state() == _thread_in_Java) ||
|
||||
(thread->thread_state() == _thread_in_native)) &&
|
||||
exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION)
|
||||
{
|
||||
LONG result=Handle_FLT_Exception(exceptionInfo);
|
||||
if (result==EXCEPTION_CONTINUE_EXECUTION) return result;
|
||||
@ -2493,6 +2501,7 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
|
||||
case EXCEPTION_ILLEGAL_INSTRUCTION_2:
|
||||
case EXCEPTION_INT_OVERFLOW:
|
||||
case EXCEPTION_INT_DIVIDE_BY_ZERO:
|
||||
case EXCEPTION_UNCAUGHT_CXX_EXCEPTION:
|
||||
{ report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
|
||||
exceptionInfo->ContextRecord);
|
||||
}
|
||||
|
@ -22,8 +22,11 @@
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
import java.io.File;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.Vector;
|
||||
|
||||
class BuildConfig {
|
||||
Hashtable vars;
|
||||
@ -57,7 +60,6 @@ class BuildConfig {
|
||||
|
||||
// ones mentioned above were needed to expand format
|
||||
String buildBase = expandFormat(getFieldString(null, "BuildBase"));
|
||||
String jdkDir = getFieldString(null, "JdkTargetRoot");
|
||||
String sourceBase = getFieldString(null, "SourceBase");
|
||||
String outDir = buildBase;
|
||||
|
||||
@ -65,7 +67,7 @@ class BuildConfig {
|
||||
put("OutputDir", outDir);
|
||||
put("SourceBase", sourceBase);
|
||||
put("BuildBase", buildBase);
|
||||
put("OutputDll", jdkDir + Util.sep + outDll);
|
||||
put("OutputDll", outDir + Util.sep + outDll);
|
||||
|
||||
context = new String [] {flavourBuild, flavour, build, null};
|
||||
}
|
||||
@ -537,68 +539,75 @@ abstract class GenericDebugConfig extends BuildConfig {
|
||||
}
|
||||
}
|
||||
|
||||
class C1DebugConfig extends GenericDebugConfig {
|
||||
abstract class GenericDebugNonKernelConfig extends GenericDebugConfig {
|
||||
protected void init(Vector includes, Vector defines) {
|
||||
super.init(includes, defines);
|
||||
getCI().getAdditionalNonKernelLinkerFlags(getV("LinkerFlags"));
|
||||
}
|
||||
}
|
||||
|
||||
class C1DebugConfig extends GenericDebugNonKernelConfig {
|
||||
String getOptFlag() {
|
||||
return getCI().getNoOptFlag();
|
||||
}
|
||||
|
||||
C1DebugConfig() {
|
||||
initNames("compiler1", "debug", "fastdebug\\jre\\bin\\client\\jvm.dll");
|
||||
initNames("compiler1", "debug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
class C1FastDebugConfig extends GenericDebugConfig {
|
||||
class C1FastDebugConfig extends GenericDebugNonKernelConfig {
|
||||
String getOptFlag() {
|
||||
return getCI().getOptFlag();
|
||||
}
|
||||
|
||||
C1FastDebugConfig() {
|
||||
initNames("compiler1", "fastdebug", "fastdebug\\jre\\bin\\client\\jvm.dll");
|
||||
initNames("compiler1", "fastdebug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
class C2DebugConfig extends GenericDebugConfig {
|
||||
class C2DebugConfig extends GenericDebugNonKernelConfig {
|
||||
String getOptFlag() {
|
||||
return getCI().getNoOptFlag();
|
||||
}
|
||||
|
||||
C2DebugConfig() {
|
||||
initNames("compiler2", "debug", "fastdebug\\jre\\bin\\server\\jvm.dll");
|
||||
initNames("compiler2", "debug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
class C2FastDebugConfig extends GenericDebugConfig {
|
||||
class C2FastDebugConfig extends GenericDebugNonKernelConfig {
|
||||
String getOptFlag() {
|
||||
return getCI().getOptFlag();
|
||||
}
|
||||
|
||||
C2FastDebugConfig() {
|
||||
initNames("compiler2", "fastdebug", "fastdebug\\jre\\bin\\server\\jvm.dll");
|
||||
initNames("compiler2", "fastdebug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
class TieredDebugConfig extends GenericDebugConfig {
|
||||
class TieredDebugConfig extends GenericDebugNonKernelConfig {
|
||||
String getOptFlag() {
|
||||
return getCI().getNoOptFlag();
|
||||
}
|
||||
|
||||
TieredDebugConfig() {
|
||||
initNames("tiered", "debug", "fastdebug\\jre\\bin\\server\\jvm.dll");
|
||||
initNames("tiered", "debug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
class TieredFastDebugConfig extends GenericDebugConfig {
|
||||
class TieredFastDebugConfig extends GenericDebugNonKernelConfig {
|
||||
String getOptFlag() {
|
||||
return getCI().getOptFlag();
|
||||
}
|
||||
|
||||
TieredFastDebugConfig() {
|
||||
initNames("tiered", "fastdebug", "fastdebug\\jre\\bin\\server\\jvm.dll");
|
||||
initNames("tiered", "fastdebug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
@ -618,45 +627,45 @@ abstract class ProductConfig extends BuildConfig {
|
||||
|
||||
class C1ProductConfig extends ProductConfig {
|
||||
C1ProductConfig() {
|
||||
initNames("compiler1", "product", "jre\\bin\\client\\jvm.dll");
|
||||
initNames("compiler1", "product", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
class C2ProductConfig extends ProductConfig {
|
||||
C2ProductConfig() {
|
||||
initNames("compiler2", "product", "jre\\bin\\server\\jvm.dll");
|
||||
initNames("compiler2", "product", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
class TieredProductConfig extends ProductConfig {
|
||||
TieredProductConfig() {
|
||||
initNames("tiered", "product", "jre\\bin\\server\\jvm.dll");
|
||||
initNames("tiered", "product", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class CoreDebugConfig extends GenericDebugConfig {
|
||||
class CoreDebugConfig extends GenericDebugNonKernelConfig {
|
||||
String getOptFlag() {
|
||||
return getCI().getNoOptFlag();
|
||||
}
|
||||
|
||||
CoreDebugConfig() {
|
||||
initNames("core", "debug", "fastdebug\\jre\\bin\\core\\jvm.dll");
|
||||
initNames("core", "debug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class CoreFastDebugConfig extends GenericDebugConfig {
|
||||
class CoreFastDebugConfig extends GenericDebugNonKernelConfig {
|
||||
String getOptFlag() {
|
||||
return getCI().getOptFlag();
|
||||
}
|
||||
|
||||
CoreFastDebugConfig() {
|
||||
initNames("core", "fastdebug", "fastdebug\\jre\\bin\\core\\jvm.dll");
|
||||
initNames("core", "fastdebug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
@ -664,7 +673,7 @@ class CoreFastDebugConfig extends GenericDebugConfig {
|
||||
|
||||
class CoreProductConfig extends ProductConfig {
|
||||
CoreProductConfig() {
|
||||
initNames("core", "product", "jre\\bin\\core\\jvm.dll");
|
||||
initNames("core", "product", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
@ -675,7 +684,7 @@ class KernelDebugConfig extends GenericDebugConfig {
|
||||
}
|
||||
|
||||
KernelDebugConfig() {
|
||||
initNames("kernel", "debug", "fastdebug\\jre\\bin\\kernel\\jvm.dll");
|
||||
initNames("kernel", "debug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
@ -687,7 +696,7 @@ class KernelFastDebugConfig extends GenericDebugConfig {
|
||||
}
|
||||
|
||||
KernelFastDebugConfig() {
|
||||
initNames("kernel", "fastdebug", "fastdebug\\jre\\bin\\kernel\\jvm.dll");
|
||||
initNames("kernel", "fastdebug", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
@ -695,7 +704,7 @@ class KernelFastDebugConfig extends GenericDebugConfig {
|
||||
|
||||
class KernelProductConfig extends ProductConfig {
|
||||
KernelProductConfig() {
|
||||
initNames("kernel", "product", "jre\\bin\\kernel\\jvm.dll");
|
||||
initNames("kernel", "product", "jvm.dll");
|
||||
init(getIncludes(), getDefines());
|
||||
}
|
||||
}
|
||||
@ -704,6 +713,7 @@ abstract class CompilerInterface {
|
||||
abstract Vector getBaseLinkerFlags(String outDir, String outDll);
|
||||
abstract Vector getDebugCompilerFlags(String opt);
|
||||
abstract Vector getDebugLinkerFlags();
|
||||
abstract void getAdditionalNonKernelLinkerFlags(Vector rv);
|
||||
abstract Vector getProductCompilerFlags();
|
||||
abstract Vector getProductLinkerFlags();
|
||||
abstract String getOptFlag();
|
||||
@ -713,4 +723,14 @@ abstract class CompilerInterface {
|
||||
void addAttr(Vector receiver, String attr, String value) {
|
||||
receiver.add(attr); receiver.add(value);
|
||||
}
|
||||
void extAttr(Vector receiver, String attr, String value) {
|
||||
int attr_pos=receiver.indexOf(attr) ;
|
||||
if ( attr_pos == -1) {
|
||||
// If attr IS NOT present in the Vector - add it
|
||||
receiver.add(attr); receiver.add(value);
|
||||
} else {
|
||||
// If attr IS present in the Vector - append value to it
|
||||
receiver.set(attr_pos+1,receiver.get(attr_pos+1)+value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,8 +22,15 @@
|
||||
*
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.TreeSet;
|
||||
import java.util.Vector;
|
||||
|
||||
abstract class HsArgHandler extends ArgHandler {
|
||||
static final int STRING = 1;
|
||||
@ -345,11 +352,23 @@ public abstract class WinGammaPlatform {
|
||||
new ArgsParser(args,
|
||||
new ArgRule[]
|
||||
{
|
||||
new HsArgRule("-sourceBase",
|
||||
"SourceBase",
|
||||
" (Did you set the HotSpotWorkSpace environment variable?)",
|
||||
HsArgHandler.STRING
|
||||
),
|
||||
new ArgRule("-sourceBase",
|
||||
new HsArgHandler() {
|
||||
public void handle(ArgIterator it) {
|
||||
String cfg = getCfg(it.get());
|
||||
if (nextNotKey(it)) {
|
||||
String sb = (String) it.get();
|
||||
if (sb.endsWith(Util.sep)) {
|
||||
sb = sb.substring(0, sb.length() - 1);
|
||||
}
|
||||
BuildConfig.putField(cfg, "SourceBase", sb);
|
||||
it.next();
|
||||
} else {
|
||||
empty("-sourceBase", null);
|
||||
}
|
||||
}
|
||||
}
|
||||
),
|
||||
|
||||
new HsArgRule("-buildBase",
|
||||
"BuildBase",
|
||||
@ -512,7 +531,6 @@ public abstract class WinGammaPlatform {
|
||||
new HsArgHandler() {
|
||||
public void handle(ArgIterator it) {
|
||||
if (nextNotKey(it)) {
|
||||
String build = it.get();
|
||||
if (nextNotKey(it)) {
|
||||
String description = it.get();
|
||||
if (nextNotKey(it)) {
|
||||
@ -528,7 +546,28 @@ public abstract class WinGammaPlatform {
|
||||
empty(null, "** Error: wrong number of args to -prelink");
|
||||
}
|
||||
}
|
||||
)
|
||||
),
|
||||
|
||||
new ArgRule("-postbuild",
|
||||
new HsArgHandler() {
|
||||
public void handle(ArgIterator it) {
|
||||
if (nextNotKey(it)) {
|
||||
if (nextNotKey(it)) {
|
||||
String description = it.get();
|
||||
if (nextNotKey(it)) {
|
||||
String command = it.get();
|
||||
BuildConfig.putField(null, "PostbuildDescription", description);
|
||||
BuildConfig.putField(null, "PostbuildCommand", command);
|
||||
it.next();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
empty(null, "** Error: wrong number of args to -postbuild");
|
||||
}
|
||||
}
|
||||
),
|
||||
},
|
||||
new ArgHandler() {
|
||||
public void handle(ArgIterator it) {
|
||||
@ -618,10 +657,6 @@ public abstract class WinGammaPlatform {
|
||||
|
||||
public int compareTo(Object o) {
|
||||
FileInfo oo = (FileInfo)o;
|
||||
// Don't squelch identical short file names where the full
|
||||
// paths are different
|
||||
if (!attr.shortName.equals(oo.attr.shortName))
|
||||
return attr.shortName.compareTo(oo.attr.shortName);
|
||||
return full.compareTo(oo.full);
|
||||
}
|
||||
|
||||
|
@ -260,6 +260,8 @@ class CompilerInterfaceVC6 extends CompilerInterface {
|
||||
return rv;
|
||||
}
|
||||
|
||||
void getAdditionalNonKernelLinkerFlags(Vector rv) {}
|
||||
|
||||
Vector getProductCompilerFlags() {
|
||||
Vector rv = new Vector();
|
||||
|
||||
|
@ -22,8 +22,13 @@
|
||||
*
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.TreeSet;
|
||||
import java.util.Vector;
|
||||
|
||||
public class WinGammaPlatformVC7 extends WinGammaPlatform {
|
||||
|
||||
@ -104,7 +109,9 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
|
||||
|
||||
|
||||
boolean match(FileInfo fi) {
|
||||
return fi.full.regionMatches(true, baseLen, dir, 0, dirLen);
|
||||
int lastSlashIndex = fi.full.lastIndexOf('/');
|
||||
String fullDir = fi.full.substring(0, lastSlashIndex);
|
||||
return fullDir.endsWith(dir);
|
||||
}
|
||||
}
|
||||
|
||||
@ -217,65 +224,41 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
|
||||
// - container filter just provides a container to group together real filters
|
||||
// - real filter can select elements from the set according to some rule, put it into XML
|
||||
// and remove from the list
|
||||
Vector makeFilters(TreeSet files) {
|
||||
Vector makeFilters(TreeSet<FileInfo> files) {
|
||||
Vector rv = new Vector();
|
||||
String sbase = Util.normalize(BuildConfig.getFieldString(null, "SourceBase")+"/src/");
|
||||
|
||||
ContainerFilter rt = new ContainerFilter("Runtime");
|
||||
rt.add(new DirectoryFilter("share/vm/prims", sbase));
|
||||
rt.add(new DirectoryFilter("share/vm/runtime", sbase));
|
||||
rt.add(new DirectoryFilter("share/vm/oops", sbase));
|
||||
rv.add(rt);
|
||||
String currentDir = "";
|
||||
DirectoryFilter container = null;
|
||||
for(FileInfo fileInfo : files) {
|
||||
|
||||
ContainerFilter gc = new ContainerFilter("GC");
|
||||
gc.add(new DirectoryFilter("share/vm/memory", sbase));
|
||||
gc.add(new DirectoryFilter("share/vm/gc_interface", sbase));
|
||||
if (!fileInfo.full.startsWith(sbase)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ContainerFilter gc_impl = new ContainerFilter("Implementations");
|
||||
gc_impl.add(new DirectoryFilter("CMS",
|
||||
"share/vm/gc_implementation/concurrentMarkSweep",
|
||||
sbase));
|
||||
gc_impl.add(new DirectoryFilter("Parallel Scavenge",
|
||||
"share/vm/gc_implementation/parallelScavenge",
|
||||
sbase));
|
||||
gc_impl.add(new DirectoryFilter("Shared",
|
||||
"share/vm/gc_implementation/shared",
|
||||
sbase));
|
||||
// for all leftovers
|
||||
gc_impl.add(new DirectoryFilter("Misc",
|
||||
"share/vm/gc_implementation",
|
||||
sbase));
|
||||
int lastSlash = fileInfo.full.lastIndexOf('/');
|
||||
String dir = fileInfo.full.substring(sbase.length(), lastSlash);
|
||||
if(dir.equals("share/vm")) {
|
||||
// skip files directly in share/vm - should only be precompiled.hpp which is handled below
|
||||
continue;
|
||||
}
|
||||
if (!dir.equals(currentDir)) {
|
||||
currentDir = dir;
|
||||
if (container != null) {
|
||||
rv.add(container);
|
||||
}
|
||||
|
||||
gc.add(gc_impl);
|
||||
rv.add(gc);
|
||||
|
||||
rv.add(new DirectoryFilter("C1", "share/vm/c1", sbase));
|
||||
|
||||
rv.add(new DirectoryFilter("C2", "share/vm/opto", sbase));
|
||||
|
||||
ContainerFilter comp = new ContainerFilter("Compiler Common");
|
||||
comp.add(new DirectoryFilter("share/vm/asm", sbase));
|
||||
comp.add(new DirectoryFilter("share/vm/ci", sbase));
|
||||
comp.add(new DirectoryFilter("share/vm/code", sbase));
|
||||
comp.add(new DirectoryFilter("share/vm/compiler", sbase));
|
||||
rv.add(comp);
|
||||
|
||||
rv.add(new DirectoryFilter("Interpreter",
|
||||
"share/vm/interpreter",
|
||||
sbase));
|
||||
|
||||
ContainerFilter misc = new ContainerFilter("Misc");
|
||||
misc.add(new DirectoryFilter("share/vm/libadt", sbase));
|
||||
misc.add(new DirectoryFilter("share/vm/services", sbase));
|
||||
misc.add(new DirectoryFilter("share/vm/utilities", sbase));
|
||||
misc.add(new DirectoryFilter("share/vm/classfile", sbase));
|
||||
rv.add(misc);
|
||||
|
||||
rv.add(new DirectoryFilter("os_cpu", sbase));
|
||||
|
||||
rv.add(new DirectoryFilter("cpu", sbase));
|
||||
|
||||
rv.add(new DirectoryFilter("os", sbase));
|
||||
// remove "share/vm/" from names
|
||||
String name = dir;
|
||||
if (dir.startsWith("share/vm/")) {
|
||||
name = dir.substring("share/vm/".length(), dir.length());
|
||||
}
|
||||
container = new DirectoryFilter(name, dir, sbase);
|
||||
}
|
||||
}
|
||||
if (container != null) {
|
||||
rv.add(container);
|
||||
}
|
||||
|
||||
ContainerFilter generated = new ContainerFilter("Generated");
|
||||
ContainerFilter c1Generated = new ContainerFilter("C1");
|
||||
@ -397,7 +380,6 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
|
||||
"Name", cfg,
|
||||
"ExcludedFromBuild", "TRUE"
|
||||
});
|
||||
tag("Tool", new String[] {"Name", "VCCLCompilerTool"});
|
||||
endTag("FileConfiguration");
|
||||
|
||||
}
|
||||
@ -441,7 +423,11 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
|
||||
|
||||
tag("Tool",
|
||||
new String[] {
|
||||
"Name", "VCPostBuildEventTool"
|
||||
"Name", "VCPostBuildEventTool",
|
||||
"Description", BuildConfig.getFieldString(null, "PostbuildDescription"),
|
||||
//Caution: String.replace(String,String) is available from JDK5 onwards only
|
||||
"CommandLine", cfg.expandFormat(BuildConfig.getFieldString(null, "PostbuildCommand").replace
|
||||
("\t", "
"))
|
||||
}
|
||||
);
|
||||
|
||||
@ -469,33 +455,6 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
|
||||
"Culture", "1033"
|
||||
}
|
||||
);
|
||||
tag("Tool",
|
||||
new String[] {
|
||||
"Name", "VCWebServiceProxyGeneratorTool"
|
||||
}
|
||||
);
|
||||
|
||||
tag ("Tool",
|
||||
new String[] {
|
||||
"Name", "VCXMLDataGeneratorTool"
|
||||
}
|
||||
);
|
||||
|
||||
tag("Tool",
|
||||
new String[] {
|
||||
"Name", "VCWebDeploymentTool"
|
||||
}
|
||||
);
|
||||
tag("Tool",
|
||||
new String[] {
|
||||
"Name", "VCManagedWrapperGeneratorTool"
|
||||
}
|
||||
);
|
||||
tag("Tool",
|
||||
new String[] {
|
||||
"Name", "VCAuxiliaryManagedWrapperGeneratorTool"
|
||||
}
|
||||
);
|
||||
|
||||
tag("Tool",
|
||||
new String[] {
|
||||
@ -597,7 +556,7 @@ class CompilerInterfaceVC7 extends CompilerInterface {
|
||||
addAttr(rv, "PrecompiledHeaderFile", outDir+Util.sep+"vm.pch");
|
||||
addAttr(rv, "AssemblerListingLocation", outDir);
|
||||
addAttr(rv, "ObjectFile", outDir+Util.sep);
|
||||
addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"vm.pdb");
|
||||
addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"jvm.pdb");
|
||||
// Set /nologo optin
|
||||
addAttr(rv, "SuppressStartupBanner", "TRUE");
|
||||
// Surpass the default /Tc or /Tp. 0 is compileAsDefault
|
||||
@ -631,17 +590,22 @@ class CompilerInterfaceVC7 extends CompilerInterface {
|
||||
addAttr(rv, "AdditionalOptions",
|
||||
"/export:JNI_GetDefaultJavaVMInitArgs " +
|
||||
"/export:JNI_CreateJavaVM " +
|
||||
"/export:JVM_FindClassFromBootLoader "+
|
||||
"/export:JNI_GetCreatedJavaVMs "+
|
||||
"/export:jio_snprintf /export:jio_printf "+
|
||||
"/export:jio_fprintf /export:jio_vfprintf "+
|
||||
"/export:jio_vsnprintf ");
|
||||
"/export:jio_vsnprintf "+
|
||||
"/export:JVM_GetVersionInfo "+
|
||||
"/export:JVM_GetThreadStateNames "+
|
||||
"/export:JVM_GetThreadStateValues "+
|
||||
"/export:JVM_InitAgentProperties ");
|
||||
addAttr(rv, "AdditionalDependencies", "Wsock32.lib winmm.lib");
|
||||
addAttr(rv, "OutputFile", outDll);
|
||||
// Set /INCREMENTAL option. 1 is linkIncrementalNo
|
||||
addAttr(rv, "LinkIncremental", "1");
|
||||
addAttr(rv, "SuppressStartupBanner", "TRUE");
|
||||
addAttr(rv, "ModuleDefinitionFile", outDir+Util.sep+"vm.def");
|
||||
addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"vm.pdb");
|
||||
addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"jvm.pdb");
|
||||
// Set /SUBSYSTEM option. 2 is subSystemWindows
|
||||
addAttr(rv, "SubSystem", "2");
|
||||
addAttr(rv, "BaseAddress", "0x8000000");
|
||||
@ -682,6 +646,11 @@ class CompilerInterfaceVC7 extends CompilerInterface {
|
||||
return rv;
|
||||
}
|
||||
|
||||
void getAdditionalNonKernelLinkerFlags(Vector rv) {
|
||||
extAttr(rv, "AdditionalOptions",
|
||||
"/export:AsyncGetCallTrace ");
|
||||
}
|
||||
|
||||
void getProductCompilerFlags_common(Vector rv) {
|
||||
// Set /O2 option. 2 is optimizeMaxSpeed
|
||||
addAttr(rv, "Optimization", "2");
|
||||
|
@ -22,7 +22,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Vector;
|
||||
|
||||
public class WinGammaPlatformVC8 extends WinGammaPlatformVC7 {
|
||||
|
||||
@ -41,6 +41,9 @@ class CompilerInterfaceVC8 extends CompilerInterfaceVC7 {
|
||||
// Set /EHsc- option. 0 is cppExceptionHandlingNo
|
||||
addAttr(rv, "ExceptionHandling", "0");
|
||||
|
||||
// enable multi process builds
|
||||
extAttr(rv, "AdditionalOptions", "/MP");
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -275,6 +275,8 @@ main(int argc, char ** argv)
|
||||
jvmpath, sizeof(jvmpath),
|
||||
original_argv);
|
||||
|
||||
printf("Using java runtime at: %s\n", jrepath);
|
||||
|
||||
ifn.CreateJavaVM = 0;
|
||||
ifn.GetDefaultJavaVMInitArgs = 0;
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
@ -27,7 +28,7 @@
|
||||
#include "jli_util.h"
|
||||
|
||||
#ifdef GAMMA
|
||||
#ifdef _WINDOWS
|
||||
#ifdef TARGET_OS_FAMILY_windows
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user