# HG changeset patch # User asaha # Date 1343942952 25200 # Node ID 6b5a3d18fe0e230cea88814e1072b56b7b6dac89 # Parent fe4a4ea5bed99cb2ec39614b69e603f5a5a79343# Parent 58f237a9e83af6ded0d2e2c81d252cd47c0f4c45 Merge diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e .hgtags --- a/.hgtags Fri Jun 08 12:49:12 2012 -0400 +++ b/.hgtags Thu Aug 02 14:29:12 2012 -0700 @@ -247,3 +247,21 @@ 637c3f5f068f88fb9ec9c5867341cf59fd5ebedc jdk8-b38 73147e6c48813b5fee904aa33f79a77103250ff4 hs24-b10 96a403721094ecdaf6a1f4f52ebd0a82e07df199 jdk8-b39 +14b0e07ab9a6fa1662414496b7e07ac8450cf517 hs24-b11 +ff9decc8235d5af80ea45fda4ecbe643ea252564 jdk8-b40 +785573170238f0eae6dc8e22ecf1050fbc9ea055 hs24-b12 +37add4fa0296705f67481e1fd50e2900cd25e39b jdk8-b41 +bd568544be7fcd12a9327e6c448592198d57b043 hs24-b13 +55954061c6e8750ea39a63523fd65d580db6eeb1 jdk8-b42 +e77b8e0ed1f84e3e268239e276c7ab64fa573baa jdk8-b43 +5ba29a1db46ecb80a321ca873adb56a3fe6ad320 hs24-b14 +831e5c76a20af18f3c08c5a95ed31be0e128a010 jdk8-b44 +9d5f20961bc5846fa8d098d534effafbbdae0a58 jdk8-b45 +40e5a3f2907ed02b335c7caa8ecf068cc801380d hs24-b15 +cf37a594c38db2ea926954154636f9f81da2e032 jdk8-b46 +0c7bb1f4f9c8062b5c5bfa56b3bdca44839b4109 jdk8-b47 +66b0450071c1534e014b131892cc86b63f1d009c hs24-b16 +1e26f61bbb521642639f56fae11326f1932f5a7d jdk8-b48 +bd54fe36b5e50f9ef1e30a5047b27fee5297e268 hs24-b17 +e3619706a7253540a2d94e9e841acaab8ace7038 jdk8-b49 +72e0362c3f0cfacbbac8af8a5b9d2e182f21c17b hs24-b18 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java --- a/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java Thu Aug 02 14:29:12 2012 -0700 @@ -572,10 +572,10 @@ if (cpu.equals("x86")) { machDesc = new MachineDescriptionIntelX86(); - } else if (cpu.equals("amd64")) { + } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { machDesc = new MachineDescriptionAMD64(); } else { - throw new DebuggerException("BSD only supported on x86/amd64"); + throw new DebuggerException("BSD only supported on x86/x86_64. Current arch: " + cpu); } BsdDebuggerLocal dbg = new BsdDebuggerLocal(machDesc, !isServer); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java --- a/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -657,7 +657,7 @@ while (fr != null) { trace.add(new StackTraceEntry(fr, getCDebugger())); try { - fr = fr.sender(); + fr = fr.sender(t); } catch (AddressException e) { e.printStackTrace(); showMessageDialog("Error while walking stack; stack trace will be truncated\n(see console for details)", diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java --- a/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java Thu Aug 02 14:29:12 2012 -0700 @@ -762,10 +762,10 @@ if (cpu.equals("x86")) { machDesc = new MachineDescriptionIntelX86(); - } else if (cpu.equals("amd64")) { + } else if (cpu.equals("amd64") || (cpu.equals("x86_64"))) { machDesc = new MachineDescriptionAMD64(); } else { - throw new DebuggerException("Bsd only supported on x86/amd64"); + throw new DebuggerException("Bsd only supported on x86/x86_64. Current arch: " + cpu); } // Note we do not use a cache for the local debugger in server diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java Thu Aug 02 14:29:12 2012 -0700 @@ -90,7 +90,7 @@ Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP); if (pc == null) return null; return new BsdX86CFrame(dbg, ebp, pc); - } else if (cpu.equals("amd64")) { + } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext(); Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP); if (rbp == null) return null; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java Thu Aug 02 14:29:12 2012 -0700 @@ -33,7 +33,7 @@ String cpu = dbg.getCPU(); if (cpu.equals("x86")) { return new BsdX86ThreadContext(dbg); - } else if (cpu.equals("amd64")) { + } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { return new BsdAMD64ThreadContext(dbg); } else { throw new RuntimeException("cpu " + cpu + " is not yet supported"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package sun.jvm.hotspot.debugger.bsd.amd64; import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.debugger.bsd.*; import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.basic.*; @@ -51,8 +52,11 @@ return rbp; } - public CFrame sender() { - if (rbp == null) { + public CFrame sender(ThreadProxy thread) { + AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext(); + Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP); + + if ( (rbp == null) || rbp.lessThan(rsp) ) { return null; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ import sun.jvm.hotspot.debugger.bsd.*; import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.basic.*; +import sun.jvm.hotspot.debugger.x86.*; final public class BsdX86CFrame extends BasicCFrame { // package/class internals only @@ -52,8 +53,11 @@ return ebp; } - public CFrame sender() { - if (ebp == null) { + public CFrame sender(ThreadProxy thread) { + X86ThreadContext context = (X86ThreadContext) thread.getContext(); + Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP); + + if ( (ebp == null) || ebp.lessThan(esp) ) { return null; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ public interface CFrame { /** Returns null when no more frames on stack */ - public CFrame sender(); + public CFrame sender(ThreadProxy th); /** Get the program counter of this frame */ public Address pc(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package sun.jvm.hotspot.debugger.cdbg.basic.amd64; import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.basic.*; @@ -43,8 +44,11 @@ this.pc = pc; } - public CFrame sender() { - if (rbp == null) { + public CFrame sender(ThreadProxy thread) { + AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext(); + Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP); + + if ( (rbp == null) || rbp.lessThan(rsp) ) { return null; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package sun.jvm.hotspot.debugger.cdbg.basic.x86; import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.debugger.x86.*; import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.basic.*; @@ -43,8 +44,11 @@ this.pc = pc; } - public CFrame sender() { - if (ebp == null) { + public CFrame sender(ThreadProxy thread) { + X86ThreadContext context = (X86ThreadContext) thread.getContext(); + Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP); + + if ( (ebp == null) || ebp.lessThan(esp) ) { return null; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package sun.jvm.hotspot.debugger.linux.amd64; import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.debugger.linux.*; import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.basic.*; @@ -51,8 +52,11 @@ return rbp; } - public CFrame sender() { - if (rbp == null) { + public CFrame sender(ThreadProxy thread) { + AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext(); + Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP); + + if ( (rbp == null) || rbp.lessThan(rsp) ) { return null; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ return sp; } - public CFrame sender() { + public CFrame sender(ThreadProxy thread) { if (sp == null) { return null; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ import sun.jvm.hotspot.debugger.linux.*; import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.basic.*; +import sun.jvm.hotspot.debugger.x86.*; final public class LinuxX86CFrame extends BasicCFrame { // package/class internals only @@ -52,8 +53,11 @@ return ebp; } - public CFrame sender() { - if (ebp == null) { + public CFrame sender(ThreadProxy thread) { + X86ThreadContext context = (X86ThreadContext) thread.getContext(); + Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP); + + if ( (ebp == null) || ebp.lessThan(esp) ) { return null; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ return fp; } - public CFrame sender() { + public CFrame sender(ThreadProxy t) { return sender; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java Thu Aug 02 14:29:12 2012 -0700 @@ -81,7 +81,7 @@ pcRegIndex = X86ThreadContext.EIP; fpRegIndex = X86ThreadContext.EBP; unalignedAccessesOkay = true; - } else if (cpu.equals("amd64")) { + } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { threadFactory = new ProcAMD64ThreadFactory(this); pcRegIndex = AMD64ThreadContext.RIP; fpRegIndex = AMD64ThreadContext.RBP; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java Thu Aug 02 14:29:12 2012 -0700 @@ -64,7 +64,7 @@ cachePageSize = 4096; cacheNumPages = parseCacheNumPagesProperty(cacheSize / cachePageSize); unalignedAccessesOkay = true; - } else if (cpu.equals("amd64")) { + } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { threadFactory = new RemoteAMD64ThreadFactory(this); cachePageSize = 4096; cacheNumPages = parseCacheNumPagesProperty(cacheSize / cachePageSize); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/jdi/ReferenceTypeImpl.java --- a/agent/src/share/classes/sun/jvm/hotspot/jdi/ReferenceTypeImpl.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/jdi/ReferenceTypeImpl.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -688,8 +688,7 @@ if (sde == null) { String extension = null; if (saKlass instanceof InstanceKlass) { - Symbol sdeSym = ((InstanceKlass)saKlass).getSourceDebugExtension(); - extension = (sdeSym != null)? sdeSym.asString() : null; + extension = ((InstanceKlass)saKlass).getSourceDebugExtension(); } if (extension == null) { sde = NO_SDE_INFO_MARK; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/oops/AccessFlags.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/AccessFlags.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/AccessFlags.java Thu Aug 02 14:29:12 2012 -0700 @@ -81,6 +81,7 @@ // field flags public boolean fieldAccessWatched () { return (flags & JVM_ACC_FIELD_ACCESS_WATCHED) != 0; } public boolean fieldModificationWatched() { return (flags & JVM_ACC_FIELD_MODIFICATION_WATCHED) != 0; } + public boolean fieldHasGenericSignature() { return (flags & JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE)!= 0; } public void printOn(PrintStream tty) { // prints only .class flags and not the hotspot internal flags diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,15 +47,11 @@ private static int HAS_LINENUMBER_TABLE; private static int HAS_CHECKED_EXCEPTIONS; private static int HAS_LOCALVARIABLE_TABLE; + private static int HAS_EXCEPTION_TABLE; private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { Type type = db.lookupType("constMethodOopDesc"); - // Backpointer to non-const methodOop - method = new OopField(type.getOopField("_method"), 0); - // The exception handler table. 4-tuples of ints [start_pc, end_pc, - // handler_pc, catch_type index] For methods with no exceptions the - // table is pointing to Universe::the_empty_int_array - exceptionTable = new OopField(type.getOopField("_exception_table"), 0); + constants = new OopField(type.getOopField("_constants"), 0); constMethodSize = new CIntField(type.getCIntegerField("_constMethod_size"), 0); flags = new ByteField(type.getJByteField("_flags"), 0); @@ -63,12 +59,14 @@ HAS_LINENUMBER_TABLE = db.lookupIntConstant("constMethodOopDesc::_has_linenumber_table").intValue(); HAS_CHECKED_EXCEPTIONS = db.lookupIntConstant("constMethodOopDesc::_has_checked_exceptions").intValue(); HAS_LOCALVARIABLE_TABLE = db.lookupIntConstant("constMethodOopDesc::_has_localvariable_table").intValue(); + HAS_EXCEPTION_TABLE = db.lookupIntConstant("constMethodOopDesc::_has_exception_table").intValue(); // Size of Java bytecodes allocated immediately after constMethodOop. codeSize = new CIntField(type.getCIntegerField("_code_size"), 0); nameIndex = new CIntField(type.getCIntegerField("_name_index"), 0); signatureIndex = new CIntField(type.getCIntegerField("_signature_index"), 0); genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"),0); + idnum = new CIntField(type.getCIntegerField("_method_idnum"), 0); // start of byte code bytecodeOffset = type.getSize(); @@ -78,6 +76,9 @@ type = db.lookupType("LocalVariableTableElement"); localVariableTableElementSize = type.getSize(); + + type = db.lookupType("ExceptionTableElement"); + exceptionTableElementSize = type.getSize(); } ConstMethod(OopHandle handle, ObjectHeap heap) { @@ -85,28 +86,31 @@ } // Fields - private static OopField method; - private static OopField exceptionTable; + private static OopField constants; private static CIntField constMethodSize; private static ByteField flags; private static CIntField codeSize; private static CIntField nameIndex; private static CIntField signatureIndex; private static CIntField genericSignatureIndex; + private static CIntField idnum; // start of bytecode private static long bytecodeOffset; private static long checkedExceptionElementSize; private static long localVariableTableElementSize; + private static long exceptionTableElementSize; + + public Method getMethod() { + InstanceKlass ik = (InstanceKlass)getConstants().getPoolHolder(); + ObjArray methods = ik.getMethods(); + return (Method)methods.getObjAt(getIdNum()); + } // Accessors for declared fields - public Method getMethod() { - return (Method) method.getValue(this); - } - - public TypeArray getExceptionTable() { - return (TypeArray) exceptionTable.getValue(this); + public ConstantPool getConstants() { + return (ConstantPool) constants.getValue(this); } public long getConstMethodSize() { @@ -133,6 +137,10 @@ return genericSignatureIndex.getValue(this); } + public long getIdNum() { + return idnum.getValue(this); + } + public Symbol getName() { return getMethod().getName(); } @@ -223,8 +231,7 @@ public void iterateFields(OopVisitor visitor, boolean doVMFields) { super.iterateFields(visitor, doVMFields); if (doVMFields) { - visitor.doOop(method, true); - visitor.doOop(exceptionTable, true); + visitor.doOop(constants, true); visitor.doCInt(constMethodSize, true); visitor.doByte(flags, true); visitor.doCInt(codeSize, true); @@ -315,6 +322,23 @@ return ret; } + public boolean hasExceptionTable() { + return (getFlags() & HAS_EXCEPTION_TABLE) != 0; + } + + public ExceptionTableElement[] getExceptionTable() { + if (Assert.ASSERTS_ENABLED) { + Assert.that(hasExceptionTable(), "should only be called if table is present"); + } + ExceptionTableElement[] ret = new ExceptionTableElement[getExceptionTableLength()]; + long offset = offsetOfExceptionTable(); + for (int i = 0; i < ret.length; i++) { + ret[i] = new ExceptionTableElement(getHandle(), offset); + offset += exceptionTableElementSize; + } + return ret; + } + public boolean hasCheckedExceptions() { return (getFlags() & HAS_CHECKED_EXCEPTIONS) != 0; } @@ -404,7 +428,10 @@ if (Assert.ASSERTS_ENABLED) { Assert.that(hasLocalVariableTable(), "should only be called if table is present"); } - if (hasCheckedExceptions()) { + + if (hasExceptionTable()) { + return offsetOfExceptionTable() - 2; + } else if (hasCheckedExceptions()) { return offsetOfCheckedExceptions() - 2; } else { return offsetOfLastU2Element(); @@ -421,4 +448,33 @@ return offset; } + private int getExceptionTableLength() { + if (hasExceptionTable()) { + return (int) getHandle().getCIntegerAt(offsetOfExceptionTableLength(), 2, true); + } else { + return 0; + } + } + + private long offsetOfExceptionTableLength() { + if (Assert.ASSERTS_ENABLED) { + Assert.that(hasExceptionTable(), "should only be called if table is present"); + } + if (hasCheckedExceptions()) { + return offsetOfCheckedExceptions() - 2; + } else { + return offsetOfLastU2Element(); + } + } + + private long offsetOfExceptionTable() { + long offset = offsetOfExceptionTableLength(); + long length = getExceptionTableLength(); + if (Assert.ASSERTS_ENABLED) { + Assert.that(length > 0, "should only be called if table is present"); + } + offset -= length * exceptionTableElementSize; + return offset; + } + } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/oops/ExceptionTableElement.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ExceptionTableElement.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +package sun.jvm.hotspot.oops; + +import java.io.*; +import java.util.*; +import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.interpreter.*; +import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.types.*; +import sun.jvm.hotspot.utilities.*; + +public class ExceptionTableElement { + static { + VM.registerVMInitializedObserver(new Observer() { + public void update(Observable o, Object data) { + initialize(VM.getVM().getTypeDataBase()); + } + }); + } + + private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { + Type type = db.lookupType("ExceptionTableElement"); + offsetOfStartPC = type.getCIntegerField("start_pc").getOffset(); + offsetOfEndPC = type.getCIntegerField("end_pc").getOffset(); + offsetOfHandlerPC = type.getCIntegerField("handler_pc").getOffset(); + offsetOfCatchTypeIndex = type.getCIntegerField("catch_type_index").getOffset(); + } + + private static long offsetOfStartPC; + private static long offsetOfEndPC; + private static long offsetOfHandlerPC; + private static long offsetOfCatchTypeIndex; + + private OopHandle handle; + private long offset; + + public ExceptionTableElement(OopHandle handle, long offset) { + this.handle = handle; + this.offset = offset; + } + + public int getStartPC() { + return (int) handle.getCIntegerAt(offset + offsetOfStartPC, 2, true); + } + + public int getEndPC() { + return (int) handle.getCIntegerAt(offset + offsetOfEndPC, 2, true); + } + + public int getHandlerPC() { + return (int) handle.getCIntegerAt(offset + offsetOfHandlerPC, 2, true); + } + + public int getCatchTypeIndex() { + return (int) handle.getCIntegerAt(offset + offsetOfCatchTypeIndex, 2, true); + } +} + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -651,10 +651,11 @@ boolean fellThrough = false; // False to get first BB marked. // First mark all exception handlers as start of a basic-block - TypeArray excps = method().getExceptionTable(); - for(int i = 0; i < excps.getLength(); i += 4) { - int handler_pc_idx = i+2; - markBB(excps.getIntAt(handler_pc_idx), null); + if (method().hasExceptionTable()) { + ExceptionTableElement[] excps = method().getExceptionTable(); + for(int i = 0; i < excps.length; i++) { + markBB(excps[i].getHandlerPC(), null); + } } // Then iterate through the code @@ -891,14 +892,15 @@ // Mark entry basic block as alive and all exception handlers _basic_blocks[0].markAsAlive(); - TypeArray excps = method().getExceptionTable(); - for(int i = 0; i < excps.getLength(); i += 4) { - int handler_pc_idx = i+2; - BasicBlock bb = getBasicBlockAt(excps.getIntAt(handler_pc_idx)); - // If block is not already alive (due to multiple exception handlers to same bb), then - // make it alive - if (bb.isDead()) - bb.markAsAlive(); + if (method().hasExceptionTable()) { + ExceptionTableElement[] excps = method().getExceptionTable(); + for(int i = 0; i < excps.length; i ++) { + BasicBlock bb = getBasicBlockAt(excps[i].getHandlerPC()); + // If block is not already alive (due to multiple exception handlers to same bb), then + // make it alive + if (bb.isDead()) + bb.markAsAlive(); + } } BytecodeStream bcs = new BytecodeStream(_method); @@ -1468,12 +1470,12 @@ if (_has_exceptions) { int bci = itr.bci(); - TypeArray exct = method().getExceptionTable(); - for(int i = 0; i< exct.getLength(); i+=4) { - int start_pc = exct.getIntAt(i); - int end_pc = exct.getIntAt(i+1); - int handler_pc = exct.getIntAt(i+2); - int catch_type = exct.getIntAt(i+3); + ExceptionTableElement[] exct = method().getExceptionTable(); + for(int i = 0; i< exct.length; i++) { + int start_pc = exct[i].getStartPC(); + int end_pc = exct[i].getEndPC(); + int handler_pc = exct[i].getHandlerPC(); + int catch_type = exct[i].getCatchTypeIndex(); if (start_pc <= bci && bci < end_pc) { BasicBlock excBB = getBasicBlockAt(handler_pc); @@ -2151,7 +2153,7 @@ _conflict = false; _max_locals = (int) method().getMaxLocals(); _max_stack = (int) method().getMaxStack(); - _has_exceptions = (method().getExceptionTable().getLength() > 0); + _has_exceptions = (method().hasExceptionTable()); _nof_refval_conflicts = 0; _init_vars = new ArrayList(5); // There are seldom more than 5 init_vars _report_result = false; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java Thu Aug 02 14:29:12 2012 -0700 @@ -50,7 +50,6 @@ private static int INITVAL_INDEX_OFFSET; private static int LOW_OFFSET; private static int HIGH_OFFSET; - private static int GENERIC_SIGNATURE_INDEX_OFFSET; private static int FIELD_SLOTS; // ClassState constants @@ -99,7 +98,6 @@ INITVAL_INDEX_OFFSET = db.lookupIntConstant("FieldInfo::initval_index_offset").intValue(); LOW_OFFSET = db.lookupIntConstant("FieldInfo::low_offset").intValue(); HIGH_OFFSET = db.lookupIntConstant("FieldInfo::high_offset").intValue(); - GENERIC_SIGNATURE_INDEX_OFFSET = db.lookupIntConstant("FieldInfo::generic_signature_offset").intValue(); FIELD_SLOTS = db.lookupIntConstant("FieldInfo::field_slots").intValue(); // read ClassState constants CLASS_STATE_UNPARSABLE_BY_GC = db.lookupIntConstant("instanceKlass::unparsable_by_gc").intValue(); @@ -279,7 +277,25 @@ } public short getFieldGenericSignatureIndex(int index) { - return getFields().getShortAt(index * FIELD_SLOTS + GENERIC_SIGNATURE_INDEX_OFFSET); + int len = (int)getFields().getLength(); + int allFieldsCount = getAllFieldsCount(); + int generic_signature_slot = allFieldsCount * FIELD_SLOTS; + for (int i = 0; i < allFieldsCount; i++) { + short flags = getFieldAccessFlags(i); + AccessFlags access = new AccessFlags(flags); + if (i == index) { + if (access.fieldHasGenericSignature()) { + return getFields().getShortAt(generic_signature_slot); + } else { + return 0; + } + } else { + if (access.fieldHasGenericSignature()) { + generic_signature_slot ++; + } + } + } + return 0; } public Symbol getFieldGenericSignature(int index) { @@ -309,13 +325,24 @@ public ObjArray getTransitiveInterfaces() { return (ObjArray) transitiveInterfaces.getValue(this); } public TypeArray getFields() { return (TypeArray) fields.getValue(this); } public int getJavaFieldsCount() { return (int) javaFieldsCount.getValue(this); } - public int getAllFieldsCount() { return (int)getFields().getLength() / FIELD_SLOTS; } + public int getAllFieldsCount() { + int len = (int)getFields().getLength(); + int allFieldsCount = 0; + for (; allFieldsCount*FIELD_SLOTS < len; allFieldsCount++) { + short flags = getFieldAccessFlags(allFieldsCount); + AccessFlags access = new AccessFlags(flags); + if (access.fieldHasGenericSignature()) { + len --; + } + } + return allFieldsCount; + } public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); } public Oop getClassLoader() { return classLoader.getValue(this); } public Oop getProtectionDomain() { return protectionDomain.getValue(this); } public ObjArray getSigners() { return (ObjArray) signers.getValue(this); } public Symbol getSourceFileName() { return getSymbol(sourceFileName); } - public Symbol getSourceDebugExtension(){ return getSymbol(sourceDebugExtension); } + public String getSourceDebugExtension(){ return CStringUtilities.getString(sourceDebugExtension.getValue(getHandle())); } public TypeArray getInnerClasses() { return (TypeArray) innerClasses.getValue(this); } public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); } public long getStaticOopFieldCount() { return staticOopFieldCount.getValue(this); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/oops/Method.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,7 +48,6 @@ private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { Type type = db.lookupType("methodOopDesc"); constMethod = new OopField(type.getOopField("_constMethod"), 0); - constants = new OopField(type.getOopField("_constants"), 0); methodData = new OopField(type.getOopField("_method_data"), 0); methodSize = new CIntField(type.getCIntegerField("_method_size"), 0); maxStack = new CIntField(type.getCIntegerField("_max_stack"), 0); @@ -83,7 +82,6 @@ // Fields private static OopField constMethod; - private static OopField constants; private static OopField methodData; private static CIntField methodSize; private static CIntField maxStack; @@ -125,9 +123,10 @@ // Accessors for declared fields public ConstMethod getConstMethod() { return (ConstMethod) constMethod.getValue(this); } - public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); } + public ConstantPool getConstants() { + return getConstMethod().getConstants(); + } public MethodData getMethodData() { return (MethodData) methodData.getValue(this); } - public TypeArray getExceptionTable() { return getConstMethod().getExceptionTable(); } /** WARNING: this is in words, not useful in this system; use getObjectSize() instead */ public long getMethodSize() { return methodSize.getValue(this); } public long getMaxStack() { return maxStack.getValue(this); } @@ -281,7 +280,6 @@ super.iterateFields(visitor, doVMFields); if (doVMFields) { visitor.doOop(constMethod, true); - visitor.doOop(constants, true); visitor.doCInt(methodSize, true); visitor.doCInt(maxStack, true); visitor.doCInt(maxLocals, true); @@ -329,6 +327,14 @@ return null; } + public boolean hasExceptionTable() { + return getConstMethod().hasExceptionTable(); + } + + public ExceptionTableElement[] getExceptionTable() { + return getConstMethod().getExceptionTable(); + } + public boolean hasCheckedExceptions() { return getConstMethod().hasCheckedExceptions(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -141,18 +141,19 @@ public static String stringOopToString(Oop stringOop) { if (offsetField == null) { InstanceKlass k = (InstanceKlass) stringOop.getKlass(); - offsetField = (IntField) k.findField("offset", "I"); - countField = (IntField) k.findField("count", "I"); + offsetField = (IntField) k.findField("offset", "I"); // optional + countField = (IntField) k.findField("count", "I"); // optional valueField = (OopField) k.findField("value", "[C"); if (Assert.ASSERTS_ENABLED) { - Assert.that(offsetField != null && - countField != null && - valueField != null, "must find all java.lang.String fields"); + Assert.that(valueField != null, "Field \'value\' of java.lang.String not found"); } } - return charArrayToString((TypeArray) valueField.getValue(stringOop), - offsetField.getValue(stringOop), - countField.getValue(stringOop)); + if (offsetField != null && countField != null) { + return charArrayToString((TypeArray) valueField.getValue(stringOop), + offsetField.getValue(stringOop), + countField.getValue(stringOop)); + } + return charArrayToString((TypeArray) valueField.getValue(stringOop)); } public static String stringOopToEscapedString(Oop stringOop) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java --- a/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java Thu Aug 02 14:29:12 2012 -0700 @@ -153,6 +153,8 @@ public static final long JVM_ACC_FIELD_ACCESS_WATCHED = 0x00002000; // field modification is watched by JVMTI public static final long JVM_ACC_FIELD_MODIFICATION_WATCHED = 0x00008000; + // field has generic signature + public static final long JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE = 0x00000800; // flags accepted by set_field_flags public static final long JVM_ACC_FIELD_FLAGS = 0x00008000 | JVM_ACC_WRITTEN_FLAGS; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java --- a/agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java Thu Aug 02 14:29:12 2012 -0700 @@ -95,7 +95,7 @@ } else if (os.equals("bsd")) { if (cpu.equals("x86")) { access = new BsdX86JavaThreadPDAccess(); - } else if (cpu.equals("amd64")) { + } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { access = new BsdAMD64JavaThreadPDAccess(); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java --- a/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -158,7 +158,7 @@ printUnknown(out); } } - f = f.sender(); + f = f.sender(th); } } catch (Exception exp) { exp.printStackTrace(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java --- a/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -504,11 +504,14 @@ 2 /* exp. table len. */ + 2 /* code attr. count */; - TypeArray exceptionTable = m.getExceptionTable(); - final int exceptionTableLen = (int) exceptionTable.getLength(); - if (exceptionTableLen != 0) { + boolean hasExceptionTable = m.hasExceptionTable(); + ExceptionTableElement[] exceptionTable = null; + int exceptionTableLen = 0; + if (hasExceptionTable) { + exceptionTable = m.getExceptionTable(); + exceptionTableLen = exceptionTable.length; if (DEBUG) debugMessage("\tmethod has exception table"); - codeSize += (exceptionTableLen / 4) /* exception table is 4-tuple array */ + codeSize += exceptionTableLen /* exception table is 4-tuple array */ * (2 /* start_pc */ + 2 /* end_pc */ + 2 /* handler_pc */ + @@ -586,15 +589,15 @@ dos.write(code); // write exception table size - dos.writeShort((short) (exceptionTableLen / 4)); - if (DEBUG) debugMessage("\texception table length = " + (exceptionTableLen / 4)); + dos.writeShort((short) exceptionTableLen); + if (DEBUG) debugMessage("\texception table length = " + exceptionTableLen); if (exceptionTableLen != 0) { - for (int e = 0; e < exceptionTableLen; e += 4) { - dos.writeShort((short) exceptionTable.getIntAt(e)); - dos.writeShort((short) exceptionTable.getIntAt(e + 1)); - dos.writeShort((short) exceptionTable.getIntAt(e + 2)); - dos.writeShort((short) exceptionTable.getIntAt(e + 3)); + for (int e = 0; e < exceptionTableLen; e++) { + dos.writeShort((short) exceptionTable[e].getStartPC()); + dos.writeShort((short) exceptionTable[e].getEndPC()); + dos.writeShort((short) exceptionTable[e].getHandlerPC()); + dos.writeShort((short) exceptionTable[e].getCatchTypeIndex()); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java --- a/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -199,7 +199,7 @@ cpuHelper = new SPARCHelper(); } else if (cpu.equals("x86")) { cpuHelper = new X86Helper(); - } else if (cpu.equals("amd64")) { + } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { cpuHelper = new AMD64Helper(); } else if (cpu.equals("ia64")) { cpuHelper = new IA64Helper(); @@ -783,37 +783,39 @@ }); // display exception table for this method - TypeArray exceptionTable = method.getExceptionTable(); - // exception table is 4 tuple array of shorts - int numEntries = (int)exceptionTable.getLength() / 4; - if (numEntries != 0) { - buf.h4("Exception Table"); - buf.beginTable(1); - buf.beginTag("tr"); - buf.headerCell("start bci"); - buf.headerCell("end bci"); - buf.headerCell("handler bci"); - buf.headerCell("catch type"); - buf.endTag("tr"); - - for (int e = 0; e < numEntries; e += 4) { + boolean hasException = method.hasExceptionTable(); + if (hasException) { + ExceptionTableElement[] exceptionTable = method.getExceptionTable(); + int numEntries = exceptionTable.length; + if (numEntries != 0) { + buf.h4("Exception Table"); + buf.beginTable(1); buf.beginTag("tr"); - buf.cell(Integer.toString(exceptionTable.getIntAt(e))); - buf.cell(Integer.toString(exceptionTable.getIntAt(e + 1))); - buf.cell(Integer.toString(exceptionTable.getIntAt(e + 2))); - short cpIndex = (short) exceptionTable.getIntAt(e + 3); - ConstantPool.CPSlot obj = cpIndex == 0? null : cpool.getSlotAt(cpIndex); - if (obj == null) { - buf.cell("Any"); - } else if (obj.isMetaData()) { - buf.cell(obj.getSymbol().asString().replace('/', '.')); - } else { - buf.cell(genKlassLink((InstanceKlass)obj.getOop())); + buf.headerCell("start bci"); + buf.headerCell("end bci"); + buf.headerCell("handler bci"); + buf.headerCell("catch type"); + buf.endTag("tr"); + + for (int e = 0; e < numEntries; e ++) { + buf.beginTag("tr"); + buf.cell(Integer.toString(exceptionTable[e].getStartPC())); + buf.cell(Integer.toString(exceptionTable[e].getEndPC())); + buf.cell(Integer.toString(exceptionTable[e].getHandlerPC())); + short cpIndex = (short) exceptionTable[e].getCatchTypeIndex(); + ConstantPool.CPSlot obj = cpIndex == 0? null : cpool.getSlotAt(cpIndex); + if (obj == null) { + buf.cell("Any"); + } else if (obj.isMetaData()) { + buf.cell(obj.getSymbol().asString().replace('/', '.')); + } else { + buf.cell(genKlassLink((InstanceKlass)obj.getOop())); + } + buf.endTag("tr"); } - buf.endTag("tr"); + + buf.endTable(); } - - buf.endTable(); } // display constant pool hyperlink diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtable.java --- a/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtable.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtable.java Thu Aug 02 14:29:12 2012 -0700 @@ -41,10 +41,10 @@ } private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("BasicHashtable"); + Type type = db.lookupType("BasicHashtable"); tableSizeField = type.getCIntegerField("_table_size"); bucketsField = type.getAddressField("_buckets"); - bucketSize = db.lookupType("HashtableBucket").getSize(); + bucketSize = db.lookupType("HashtableBucket").getSize(); } // Fields diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtableEntry.java --- a/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtableEntry.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtableEntry.java Thu Aug 02 14:29:12 2012 -0700 @@ -41,7 +41,7 @@ } private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("BasicHashtableEntry"); + Type type = db.lookupType("BasicHashtableEntry"); hashField = type.getCIntegerField("_hash"); nextField = type.getAddressField("_next"); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java --- a/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java Thu Aug 02 14:29:12 2012 -0700 @@ -40,7 +40,7 @@ private static synchronized void initialize(TypeDataBase db) { // just to confirm that type exists - Type type = db.lookupType("Hashtable"); + Type type = db.lookupType("IntptrHashtable"); } // derived class may return Class diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableBucket.java --- a/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableBucket.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableBucket.java Thu Aug 02 14:29:12 2012 -0700 @@ -39,7 +39,7 @@ } private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("HashtableBucket"); + Type type = db.lookupType("HashtableBucket"); entryField = type.getAddressField("_entry"); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java --- a/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java Thu Aug 02 14:29:12 2012 -0700 @@ -41,7 +41,7 @@ } private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("HashtableEntry"); + Type type = db.lookupType("IntptrHashtableEntry"); literalField = type.getAddressField("_literal"); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e agent/src/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java --- a/agent/src/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java Fri Jun 08 12:49:12 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,6 +85,21 @@ this(new ProcImageClassLoader()); } + static void debugPrintln(String msg) { + if (DEBUG) { + System.err.println("DEBUG>" + msg); + } + } + + static void debugPrintStackTrace(Exception exp) { + if (DEBUG) { + StackTraceElement[] els = exp.getStackTrace(); + for (int i = 0; i < els.length; i++) { + System.err.println("DEBUG>" + els[i].toString()); + } + } + } + public Object readObject(Oop oop) throws ClassNotFoundException { if (oop instanceof Instance) { return readInstance((Instance) oop); @@ -120,13 +135,96 @@ } protected Symbol javaLangString; + protected Symbol javaUtilHashtableEntry; + protected Symbol javaUtilHashtable; + protected Symbol javaUtilProperties; + + protected Symbol getVMSymbol(String name) { + return VM.getVM().getSymbolTable().probe(name); + } + protected Symbol javaLangString() { if (javaLangString == null) { - javaLangString = VM.getVM().getSymbolTable().probe("java/lang/String"); + javaLangString = getVMSymbol("java/lang/String"); } return javaLangString; } + protected Symbol javaUtilHashtableEntry() { + if (javaUtilHashtableEntry == null) { + javaUtilHashtableEntry = getVMSymbol("java/util/Hashtable$Entry"); + } + return javaUtilHashtableEntry; + } + + protected Symbol javaUtilHashtable() { + if (javaUtilHashtable == null) { + javaUtilHashtable = getVMSymbol("java/util/Hashtable"); + } + return javaUtilHashtable; + } + + protected Symbol javaUtilProperties() { + if (javaUtilProperties == null) { + javaUtilProperties = getVMSymbol("java/util/Properties"); + } + return javaUtilProperties; + } + + private void setHashtableEntry(java.util.Hashtable p, Oop oop) { + InstanceKlass ik = (InstanceKlass)oop.getKlass(); + OopField keyField = (OopField)ik.findField("key", "Ljava/lang/Object;"); + OopField valueField = (OopField)ik.findField("value", "Ljava/lang/Object;"); + OopField nextField = (OopField)ik.findField("next", "Ljava/util/Hashtable$Entry;"); + if (DEBUG) { + if (Assert.ASSERTS_ENABLED) { + Assert.that(ik.getName().equals(javaUtilHashtableEntry()), "Not a Hashtable$Entry?"); + Assert.that(keyField != null && valueField != null && nextField != null, "Invalid fields!"); + } + } + + Object key = null; + Object value = null; + Oop next = null; + try { + key = readObject(keyField.getValue(oop)); + value = readObject(valueField.getValue(oop)); + next = (Oop)nextField.getValue(oop); + // For Properties, should use setProperty(k, v). Since it only runs in SA + // using put(k, v) should be OK. + p.put(key, value); + if (next != null) { + setHashtableEntry(p, next); + } + } catch (ClassNotFoundException ce) { + if( DEBUG) { + debugPrintln("Class not found " + ce); + debugPrintStackTrace(ce); + } + } + } + + protected Object getHashtable(Instance oop, boolean isProperties) { + InstanceKlass k = (InstanceKlass)oop.getKlass(); + OopField tableField = (OopField)k.findField("table", "[Ljava/util/Hashtable$Entry;"); + if (tableField == null) { + debugPrintln("Could not find field of [Ljava/util/Hashtable$Entry;"); + return null; + } + java.util.Hashtable table = (isProperties) ? new java.util.Properties() + : new java.util.Hashtable(); + ObjArray kvs = (ObjArray)tableField.getValue(oop); + long size = kvs.getLength(); + debugPrintln("Hashtable$Entry Size = " + size); + for (long i=0; i= bci && cur.getLength() > 0) { + int startBCI = cur.getStartBCI(); + if (startBCI <= bci && bci < startBCI + cur.getLength()) { visibleVars.add(cur); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/bsd/makefiles/gcc.make --- a/make/bsd/makefiles/gcc.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/bsd/makefiles/gcc.make Thu Aug 02 14:29:12 2012 -0700 @@ -214,7 +214,7 @@ # Flags for generating make dependency flags. ifneq ("${CC_VER_MAJOR}", "2") -DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) +DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) endif # -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/bsd/makefiles/jvmg.make --- a/make/bsd/makefiles/jvmg.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/bsd/makefiles/jvmg.make Thu Aug 02 14:29:12 2012 -0700 @@ -27,7 +27,9 @@ # Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS) DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@)) -CFLAGS += $(DEBUG_CFLAGS/BYFILE) + +# _NMT_NOINLINE_ informs NMT that no inlining by Compiler +CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_ # Set the environment variable HOTSPARC_GENERIC to "true" # to inhibit the effect of the previous line on CFLAGS. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/bsd/makefiles/universal.gmk --- a/make/bsd/makefiles/universal.gmk Fri Jun 08 12:49:12 2012 -0400 +++ b/make/bsd/makefiles/universal.gmk Thu Aug 02 14:29:12 2012 -0700 @@ -110,4 +110,5 @@ .PHONY: universal_product universal_fastdebug universal_debug \ all_product_universal all_fastdebug_universal all_debug_universal \ - universalize export_universal copy_universal + universalize export_universal copy_universal \ + $(UNIVERSAL_LIPO_LIST) $(UNIVERSAL_COPY_LIST) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/hotspot_version --- a/make/hotspot_version Fri Jun 08 12:49:12 2012 -0400 +++ b/make/hotspot_version Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -31,11 +31,11 @@ # # Don't put quotes (fail windows build). -HOTSPOT_VM_COPYRIGHT=Copyright 2011 +HOTSPOT_VM_COPYRIGHT=Copyright 2012 HS_MAJOR_VER=24 HS_MINOR_VER=0 -HS_BUILD_NUMBER=10 +HS_BUILD_NUMBER=18 JDK_MAJOR_VER=1 JDK_MINOR_VER=8 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/jprt.properties --- a/make/jprt.properties Fri Jun 08 12:49:12 2012 -0400 +++ b/make/jprt.properties Thu Aug 02 14:29:12 2012 -0700 @@ -54,72 +54,77 @@ # Define the Solaris platforms we want for the various releases jprt.my.solaris.sparc.jdk8=solaris_sparc_5.10 jprt.my.solaris.sparc.jdk7=solaris_sparc_5.10 -jprt.my.solaris.sparc.jdk7u4=${jprt.my.solaris.sparc.jdk7} +jprt.my.solaris.sparc.jdk7u6=${jprt.my.solaris.sparc.jdk7} jprt.my.solaris.sparc=${jprt.my.solaris.sparc.${jprt.tools.default.release}} jprt.my.solaris.sparcv9.jdk8=solaris_sparcv9_5.10 jprt.my.solaris.sparcv9.jdk7=solaris_sparcv9_5.10 -jprt.my.solaris.sparcv9.jdk7u4=${jprt.my.solaris.sparcv9.jdk7} +jprt.my.solaris.sparcv9.jdk7u6=${jprt.my.solaris.sparcv9.jdk7} jprt.my.solaris.sparcv9=${jprt.my.solaris.sparcv9.${jprt.tools.default.release}} jprt.my.solaris.i586.jdk8=solaris_i586_5.10 jprt.my.solaris.i586.jdk7=solaris_i586_5.10 -jprt.my.solaris.i586.jdk7u4=${jprt.my.solaris.i586.jdk7} +jprt.my.solaris.i586.jdk7u6=${jprt.my.solaris.i586.jdk7} jprt.my.solaris.i586=${jprt.my.solaris.i586.${jprt.tools.default.release}} jprt.my.solaris.x64.jdk8=solaris_x64_5.10 jprt.my.solaris.x64.jdk7=solaris_x64_5.10 -jprt.my.solaris.x64.jdk7u4=${jprt.my.solaris.x64.jdk7} +jprt.my.solaris.x64.jdk7u6=${jprt.my.solaris.x64.jdk7} jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}} jprt.my.linux.i586.jdk8=linux_i586_2.6 jprt.my.linux.i586.jdk7=linux_i586_2.6 -jprt.my.linux.i586.jdk7u4=${jprt.my.linux.i586.jdk7} +jprt.my.linux.i586.jdk7u6=${jprt.my.linux.i586.jdk7} jprt.my.linux.i586=${jprt.my.linux.i586.${jprt.tools.default.release}} jprt.my.linux.x64.jdk8=linux_x64_2.6 jprt.my.linux.x64.jdk7=linux_x64_2.6 -jprt.my.linux.x64.jdk7u4=${jprt.my.linux.x64.jdk7} +jprt.my.linux.x64.jdk7u6=${jprt.my.linux.x64.jdk7} jprt.my.linux.x64=${jprt.my.linux.x64.${jprt.tools.default.release}} jprt.my.linux.ppc.jdk8=linux_ppc_2.6 jprt.my.linux.ppc.jdk7=linux_ppc_2.6 -jprt.my.linux.ppc.jdk7u4=${jprt.my.linux.ppc.jdk7} +jprt.my.linux.ppc.jdk7u6=${jprt.my.linux.ppc.jdk7} jprt.my.linux.ppc=${jprt.my.linux.ppc.${jprt.tools.default.release}} jprt.my.linux.ppcv2.jdk8=linux_ppcv2_2.6 jprt.my.linux.ppcv2.jdk7=linux_ppcv2_2.6 -jprt.my.linux.ppcv2.jdk7u4=${jprt.my.linux.ppcv2.jdk7} +jprt.my.linux.ppcv2.jdk7u6=${jprt.my.linux.ppcv2.jdk7} jprt.my.linux.ppcv2=${jprt.my.linux.ppcv2.${jprt.tools.default.release}} jprt.my.linux.ppcsflt.jdk8=linux_ppcsflt_2.6 jprt.my.linux.ppcsflt.jdk7=linux_ppcsflt_2.6 -jprt.my.linux.ppcsflt.jdk7u4=${jprt.my.linux.ppcsflt.jdk7} +jprt.my.linux.ppcsflt.jdk7u6=${jprt.my.linux.ppcsflt.jdk7} jprt.my.linux.ppcsflt=${jprt.my.linux.ppcsflt.${jprt.tools.default.release}} jprt.my.linux.armvfp.jdk8=linux_armvfp_2.6 jprt.my.linux.armvfp.jdk7=linux_armvfp_2.6 -jprt.my.linux.armvfp.jdk7u4=${jprt.my.linux.armvfp.jdk7} +jprt.my.linux.armvfp.jdk7u6=${jprt.my.linux.armvfp.jdk7} jprt.my.linux.armvfp=${jprt.my.linux.armvfp.${jprt.tools.default.release}} +jprt.my.linux.armv6.jdk8=linux_armv6_2.6 +jprt.my.linux.armv6.jdk7=linux_armv6_2.6 +jprt.my.linux.armv6.jdk7u6=${jprt.my.linux.armv6.jdk7} +jprt.my.linux.armv6=${jprt.my.linux.armv6.${jprt.tools.default.release}} + jprt.my.linux.armsflt.jdk8=linux_armsflt_2.6 jprt.my.linux.armsflt.jdk7=linux_armsflt_2.6 -jprt.my.linux.armsflt.jdk7u4=${jprt.my.linux.armsflt.jdk7} +jprt.my.linux.armsflt.jdk7u6=${jprt.my.linux.armsflt.jdk7} jprt.my.linux.armsflt=${jprt.my.linux.armsflt.${jprt.tools.default.release}} jprt.my.macosx.x64.jdk8=macosx_x64_10.7 jprt.my.macosx.x64.jdk7=macosx_x64_10.7 -jprt.my.macosx.x64.jdk7u4=${jprt.my.macosx.x64.jdk7} +jprt.my.macosx.x64.jdk7u6=${jprt.my.macosx.x64.jdk7} jprt.my.macosx.x64=${jprt.my.macosx.x64.${jprt.tools.default.release}} jprt.my.windows.i586.jdk8=windows_i586_5.1 jprt.my.windows.i586.jdk7=windows_i586_5.1 -jprt.my.windows.i586.jdk7u4=${jprt.my.windows.i586.jdk7} +jprt.my.windows.i586.jdk7u6=${jprt.my.windows.i586.jdk7} jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}} jprt.my.windows.x64.jdk8=windows_x64_5.2 jprt.my.windows.x64.jdk7=windows_x64_5.2 -jprt.my.windows.x64.jdk7u4=${jprt.my.windows.x64.jdk7} +jprt.my.windows.x64.jdk7u6=${jprt.my.windows.x64.jdk7} jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}} # Standard list of jprt build targets for this source tree @@ -133,7 +138,8 @@ ${jprt.my.linux.x64}-{product|fastdebug}, \ ${jprt.my.macosx.x64}-{product|fastdebug|debug}, \ ${jprt.my.windows.i586}-{product|fastdebug|debug}, \ - ${jprt.my.windows.x64}-{product|fastdebug|debug} + ${jprt.my.windows.x64}-{product|fastdebug|debug}, \ + ${jprt.my.linux.armv6}-{product|fastdebug} jprt.build.targets.open= \ ${jprt.my.solaris.i586}-{productOpen}, \ @@ -153,7 +159,7 @@ jprt.build.targets.jdk8=${jprt.build.targets.all} jprt.build.targets.jdk7=${jprt.build.targets.all} -jprt.build.targets.jdk7u4=${jprt.build.targets.all} +jprt.build.targets.jdk7u6=${jprt.build.targets.all} jprt.build.targets=${jprt.build.targets.${jprt.tools.default.release}} # Subset lists of test targets for this source tree @@ -345,12 +351,12 @@ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_CMS, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_G1, \ - ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParOldGC -# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default, \ -# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default_tiered, \ -# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \ -# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_G1, \ -# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParOldGC + ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParOldGC, \ + ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default, \ + ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default_nontiered, \ + ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \ + ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_G1, \ + ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParOldGC jprt.my.windows.i586.test.targets = \ ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-jvm98, \ @@ -446,7 +452,7 @@ jprt.test.targets.jdk8=${jprt.test.targets.standard} jprt.test.targets.jdk7=${jprt.test.targets.standard} -jprt.test.targets.jdk7u4=${jprt.test.targets.jdk7} +jprt.test.targets.jdk7u6=${jprt.test.targets.jdk7} jprt.test.targets=${jprt.test.targets.${jprt.tools.default.release}} # The default test/Makefile targets that should be run @@ -506,6 +512,9 @@ jprt.make.rule.test.targets.jdk8=${jprt.make.rule.test.targets.standard} jprt.make.rule.test.targets.jdk7=${jprt.make.rule.test.targets.standard} -jprt.make.rule.test.targets.jdk7u4=${jprt.make.rule.test.targets.jdk7} +jprt.make.rule.test.targets.jdk7u6=${jprt.make.rule.test.targets.jdk7} jprt.make.rule.test.targets=${jprt.make.rule.test.targets.${jprt.tools.default.release}} +# 7155453: Work-around to prevent popups on OSX from blocking test completion +# but the work-around is added to all platforms to be consistent +jprt.jbb.options=-Djava.awt.headless=true diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/linux/makefiles/gcc.make --- a/make/linux/makefiles/gcc.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/linux/makefiles/gcc.make Thu Aug 02 14:29:12 2012 -0700 @@ -166,7 +166,7 @@ # Flags for generating make dependency flags. ifneq ("${CC_VER_MAJOR}", "2") -DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) +DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) endif # -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/linux/makefiles/jvmg.make --- a/make/linux/makefiles/jvmg.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/linux/makefiles/jvmg.make Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,9 @@ # Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS) DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@)) -CFLAGS += $(DEBUG_CFLAGS/BYFILE) + +# _NMT_NOINLINE_ informs NMT that no inlining by Compiler +CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_ # Set the environment variable HOTSPARC_GENERIC to "true" # to inhibit the effect of the previous line on CFLAGS. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/linux/makefiles/vm.make --- a/make/linux/makefiles/vm.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/linux/makefiles/vm.make Thu Aug 02 14:29:12 2012 -0700 @@ -102,9 +102,11 @@ # a time and date. vm_version.o: CXXFLAGS += ${JRE_VERSION} -ifndef JAVASE_EMBEDDED +ifndef JAVASE_EMBEDDED +ifneq (${ARCH},arm) CFLAGS += -DINCLUDE_TRACE endif +endif # CFLAGS_WARN holds compiler options to suppress/enable warnings. CFLAGS += $(CFLAGS_WARN/BYFILE) @@ -153,11 +155,13 @@ SOURCE_PATHS+=$(HS_COMMON_SRC)/cpu/$(Platform_arch)/vm SOURCE_PATHS+=$(HS_COMMON_SRC)/os_cpu/$(Platform_os_arch)/vm -ifndef JAVASE_EMBEDDED +ifndef JAVASE_EMBEDDED +ifneq (${ARCH},arm) SOURCE_PATHS+=$(shell if [ -d $(HS_ALT_SRC)/share/vm/jfr ]; then \ find $(HS_ALT_SRC)/share/vm/jfr -type d; \ fi) endif +endif CORE_PATHS=$(foreach path,$(SOURCE_PATHS),$(call altsrc,$(path)) $(path)) CORE_PATHS+=$(GENERATED)/jvmtifiles diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/pic.make --- a/make/pic.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/pic.make Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,13 @@ ifneq ($(OSNAME), windows) ifndef LP64 + PARTIAL_NONPIC=1 + endif + PIC_ARCH = ppc + ifneq ("$(filter $(PIC_ARCH),$(BUILDARCH))","") + PARTIAL_NONPIC=0 + endif + ifeq ($(PARTIAL_NONPIC),1) NONPIC_DIRS = memory oops gc_implementation gc_interface NONPIC_DIRS := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir)) # Look for source files under NONPIC_DIRS diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/add_gnu_debuglink.make --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/solaris/makefiles/add_gnu_debuglink.make Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,54 @@ +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# +# + +# Rules to build add_gnu_debuglink, used by vm.make on Solaris + +# Allow $(ADD_GNU_DEBUGLINK) to be called from any directory. +# We don't set or use the GENERATED macro to avoid affecting +# other HotSpot Makefiles. +TOPDIR = $(shell echo `pwd`) +ADD_GNU_DEBUGLINK = $(TOPDIR)/../generated/add_gnu_debuglink + +ADD_GNU_DEBUGLINK_DIR = $(GAMMADIR)/src/os/solaris/add_gnu_debuglink +ADD_GNU_DEBUGLINK_SRC = $(ADD_GNU_DEBUGLINK_DIR)/add_gnu_debuglink.c +ADD_GNU_DEBUGLINK_FLAGS = +LIBS_ADD_GNU_DEBUGLINK += -lelf + +ifeq ("${Platform_compiler}", "sparcWorks") +# Enable the following ADD_GNU_DEBUGLINK_FLAGS addition if you need to +# compare the built ELF objects. +# +# The -g option makes static data global and the "-W0,-noglobal" +# option tells the compiler to not globalize static data using a unique +# globalization prefix. Instead force the use of a static globalization +# prefix based on the source filepath so the objects from two identical +# compilations are the same. +# +# Note: The blog says to use "-W0,-xglobalstatic", but that doesn't +# seem to work. I got "-W0,-noglobal" from Kelly and that works. +#ADD_GNU_DEBUGLINK_FLAGS += -W0,-noglobal +endif # Platform_compiler == sparcWorks + +$(ADD_GNU_DEBUGLINK): $(ADD_GNU_DEBUGLINK_SRC) + $(CC) -g -o $@ $< $(ADD_GNU_DEBUGLINK_FLAGS) $(LIBS_ADD_GNU_DEBUGLINK) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/defs.make --- a/make/solaris/makefiles/defs.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/defs.make Thu Aug 02 14:29:12 2012 -0700 @@ -109,18 +109,12 @@ # overridden in some situations, e.g., a BUILD_FLAVOR != product # build. - # Disable FULL_DEBUG_SYMBOLS by default because dtrace tests are - # failing in nightly when the debug info files are ZIP'ed. On - # Solaris debug info files need to be ZIP'ed to reduce the impact - # on disk space footprint. - FULL_DEBUG_SYMBOLS ?= 0 ifeq ($(BUILD_FLAVOR), product) - # FULL_DEBUG_SYMBOLS ?= 1 + FULL_DEBUG_SYMBOLS ?= 1 ENABLE_FULL_DEBUG_SYMBOLS = $(FULL_DEBUG_SYMBOLS) else # debug variants always get Full Debug Symbols (if available) - # ENABLE_FULL_DEBUG_SYMBOLS = 1 - ENABLE_FULL_DEBUG_SYMBOLS = $(FULL_DEBUG_SYMBOLS) + ENABLE_FULL_DEBUG_SYMBOLS = 1 endif _JUNK_ := $(shell \ echo >&2 "INFO: ENABLE_FULL_DEBUG_SYMBOLS=$(ENABLE_FULL_DEBUG_SYMBOLS)") @@ -129,25 +123,10 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) # Default OBJCOPY comes from the SUNWbinutils package: DEF_OBJCOPY=/usr/sfw/bin/gobjcopy - ifeq ($(VM_PLATFORM),solaris_amd64) - # On Solaris AMD64/X64, gobjcopy is not happy and fails: - # - # usr/sfw/bin/gobjcopy --add-gnu-debuglink=.debuginfo .so - # BFD: stKPaiop: Not enough room for program headers, try linking with -N - # /usr/sfw/bin/gobjcopy: stKPaiop: Bad value - # BFD: stKPaiop: Not enough room for program headers, try linking with -N - # /usr/sfw/bin/gobjcopy: libsaproc.debuginfo: Bad value - # BFD: stKPaiop: Not enough room for program headers, try linking with -N - # /usr/sfw/bin/gobjcopy: stKPaiop: Bad value - _JUNK_ := $(shell \ - echo >&2 "INFO: $(DEF_OBJCOPY) is not working on Solaris AMD64/X64") - OBJCOPY= - else - OBJCOPY=$(shell test -x $(DEF_OBJCOPY) && echo $(DEF_OBJCOPY)) - ifneq ($(ALT_OBJCOPY),) - _JUNK_ := $(shell echo >&2 "INFO: ALT_OBJCOPY=$(ALT_OBJCOPY)") - OBJCOPY=$(shell test -x $(ALT_OBJCOPY) && echo $(ALT_OBJCOPY)) - endif + OBJCOPY=$(shell test -x $(DEF_OBJCOPY) && echo $(DEF_OBJCOPY)) + ifneq ($(ALT_OBJCOPY),) + _JUNK_ := $(shell echo >&2 "INFO: ALT_OBJCOPY=$(ALT_OBJCOPY)") + OBJCOPY=$(shell test -x $(ALT_OBJCOPY) && echo $(ALT_OBJCOPY)) endif else OBJCOPY= @@ -178,9 +157,7 @@ _JUNK_ := $(shell \ echo >&2 "INFO: STRIP_POLICY=$(STRIP_POLICY)") - # Disable ZIP_DEBUGINFO_FILES by default because dtrace tests are - # failing in nightly when the debug info files are ZIP'ed. - ZIP_DEBUGINFO_FILES ?= 0 + ZIP_DEBUGINFO_FILES ?= 1 _JUNK_ := $(shell \ echo >&2 "INFO: ZIP_DEBUGINFO_FILES=$(ZIP_DEBUGINFO_FILES)") @@ -226,10 +203,18 @@ EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.diz EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_db.diz EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_dtrace.diz + ifeq ($(ARCH_DATA_MODEL),32) + EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_db.diz + EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_dtrace.diz + endif else EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.debuginfo EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_db.debuginfo EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_dtrace.debuginfo + ifeq ($(ARCH_DATA_MODEL),32) + EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_db.debuginfo + EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_dtrace.debuginfo + endif endif endif endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/dtrace.make --- a/make/solaris/makefiles/dtrace.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/dtrace.make Thu Aug 02 14:29:12 2012 -0700 @@ -94,29 +94,41 @@ # Making 64/libjvm_db.so: 64-bit version of libjvm_db.so which handles 32-bit libjvm.so ifneq ("${ISA}","${BUILDARCH}") -XLIBJVM_DB = 64/$(LIBJVM_DB) -XLIBJVM_DB_G = 64/$(LIBJVM_DB_G) -XLIBJVM_DTRACE = 64/$(LIBJVM_DTRACE) -XLIBJVM_DTRACE_G = 64/$(LIBJVM_DTRACE_G) +XLIBJVM_DIR = 64 +XLIBJVM_DB = $(XLIBJVM_DIR)/$(LIBJVM_DB) +XLIBJVM_DB_G = $(XLIBJVM_DIR)/$(LIBJVM_DB_G) +XLIBJVM_DTRACE = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE) +XLIBJVM_DTRACE_G = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G) -XLIBJVM_DB_DEBUGINFO = 64/$(LIBJVM_DB_DEBUGINFO) -XLIBJVM_DB_DIZ = 64/$(LIBJVM_DB_DIZ) -XLIBJVM_DB_G_DEBUGINFO = 64/$(LIBJVM_DB_G_DEBUGINFO) -XLIBJVM_DB_G_DIZ = 64/$(LIBJVM_DB_G_DIZ) -XLIBJVM_DTRACE_DEBUGINFO = 64/$(LIBJVM_DTRACE_DEBUGINFO) -XLIBJVM_DTRACE_DIZ = 64/$(LIBJVM_DTRACE_DIZ) -XLIBJVM_DTRACE_G_DEBUGINFO = 64/$(LIBJVM_DTRACE_G_DEBUGINFO) -XLIBJVM_DTRACE_G_DIZ = 64/$(LIBJVM_DTRACE_G_DIZ) +XLIBJVM_DB_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DB_DEBUGINFO) +XLIBJVM_DB_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DB_DIZ) +XLIBJVM_DB_G_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DB_G_DEBUGINFO) +XLIBJVM_DB_G_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DB_G_DIZ) +XLIBJVM_DTRACE_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DEBUGINFO) +XLIBJVM_DTRACE_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DIZ) +XLIBJVM_DTRACE_G_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G_DEBUGINFO) +XLIBJVM_DTRACE_G_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G_DIZ) -$(XLIBJVM_DB): $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS).h $(LIBJVM_DB_MAPFILE) +$(XLIBJVM_DB): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS).h $(LIBJVM_DB_MAPFILE) @echo Making $@ - $(QUIETLY) mkdir -p 64/ ; \ + $(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \ $(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. -I$(GENERATED) \ $(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc [ -f $(XLIBJVM_DB_G) ] || { ln -s $(LIBJVM_DB) $(XLIBJVM_DB_G); } ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. +# Clear the SHF_ALLOC flag (if set) from empty section headers. +# An empty section header has sh_addr == 0 and sh_size == 0. +# This problem has only been seen on Solaris X64, but we call this tool +# on all Solaris builds just in case. + $(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@ $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DB_DEBUGINFO) - $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(XLIBJVM_DB_DEBUGINFO) $@ +# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. +# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available. +# $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) ; +# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not +# in the link name: + ( cd $(XLIBJVM_DIR) && $(ADD_GNU_DEBUGLINK) $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) ) ifeq ($(STRIP_POLICY),all_strip) $(QUIETLY) $(STRIP) $@ else @@ -125,23 +137,31 @@ # implied else here is no stripping at all endif endif - [ -f $(XLIBJVM_DB_G_DEBUGINFO) ] || { ln -s $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO); } + [ -f $(XLIBJVM_DB_G_DEBUGINFO) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB_G_DEBUGINFO); } ifeq ($(ZIP_DEBUGINFO_FILES),1) - $(ZIPEXE) -q -y $(XLIBJVM_DB_DIZ) $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO) +# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not +# in the archived name: + ( cd $(XLIBJVM_DIR) && $(ZIPEXE) -q -y $(LIBJVM_DB_DIZ) $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB_G_DEBUGINFO) ) $(RM) $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO) - [ -f $(XLIBJVM_DB_G_DIZ) ] || { ln -s $(XLIBJVM_DB_DIZ) $(XLIBJVM_DB_G_DIZ); } + [ -f $(XLIBJVM_DB_G_DIZ) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DB_DIZ) $(LIBJVM_DB_G_DIZ); } endif endif -$(XLIBJVM_DTRACE): $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE) +$(XLIBJVM_DTRACE): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE) @echo Making $@ - $(QUIETLY) mkdir -p 64/ ; \ + $(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \ $(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. \ $(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor [ -f $(XLIBJVM_DTRACE_G) ] || { ln -s $(LIBJVM_DTRACE) $(XLIBJVM_DTRACE_G); } ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +# Clear the SHF_ALLOC flag (if set) from empty section headers. + $(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@ $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DTRACE_DEBUGINFO) - $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(XLIBJVM_DTRACE_DEBUGINFO) $@ +# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. +# $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) ; +# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not +# in the link name: + ( cd $(XLIBJVM_DIR) && $(ADD_GNU_DEBUGLINK) $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) ) ifeq ($(STRIP_POLICY),all_strip) $(QUIETLY) $(STRIP) $@ else @@ -150,11 +170,13 @@ # implied else here is no stripping at all endif endif - [ -f $(XLIBJVM_DTRACE_G_DEBUGINFO) ] || { ln -s $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO); } + [ -f $(XLIBJVM_DTRACE_G_DEBUGINFO) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE_G_DEBUGINFO); } ifeq ($(ZIP_DEBUGINFO_FILES),1) - $(ZIPEXE) -q -y $(XLIBJVM_DTRACE_DIZ) $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO) +# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not +# in the archived name: + ( cd $(XLIBJVM_DIR) && $(ZIPEXE) -q -y $(LIBJVM_DTRACE_DIZ) $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE_G_DEBUGINFO) ) $(RM) $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO) - [ -f $(XLIBJVM_DTRACE_G_DIZ) ] || { ln -s $(XLIBJVM_DTRACE_DIZ) $(XLIBJVM_DTRACE_G_DIZ); } + [ -f $(XLIBJVM_DTRACE_G_DIZ) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DTRACE_DIZ) $(LIBJVM_DTRACE_G_DIZ); } endif endif @@ -198,14 +220,18 @@ $(JVMOFFS.o): $(JVMOFFS).h $(JVMOFFS).cpp $(QUIETLY) $(CXX) -c -I. -o $@ $(ARCHFLAG) -D$(TYPE) $(JVMOFFS).cpp -$(LIBJVM_DB): $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS.o) $(XLIBJVM_DB) $(LIBJVM_DB_MAPFILE) +$(LIBJVM_DB): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS.o) $(XLIBJVM_DB) $(LIBJVM_DB_MAPFILE) @echo Making $@ $(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) -D$(TYPE) -I. -I$(GENERATED) \ $(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc [ -f $(LIBJVM_DB_G) ] || { ln -s $@ $(LIBJVM_DB_G); } ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +# Clear the SHF_ALLOC flag (if set) from empty section headers. + $(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@ $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DB_DEBUGINFO) - $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $@ +# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. +# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $@ + $(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBJVM_DB_DEBUGINFO) $@ ifeq ($(STRIP_POLICY),all_strip) $(QUIETLY) $(STRIP) $@ else @@ -222,14 +248,18 @@ endif endif -$(LIBJVM_DTRACE): $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(XLIBJVM_DTRACE) $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE) +$(LIBJVM_DTRACE): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(XLIBJVM_DTRACE) $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE) @echo Making $@ $(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) -D$(TYPE) -I. \ $(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor [ -f $(LIBJVM_DTRACE_G) ] || { ln -s $@ $(LIBJVM_DTRACE_G); } ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +# Clear the SHF_ALLOC flag (if set) from empty section headers. + $(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@ $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DTRACE_DEBUGINFO) - $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $@ +# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. +# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $@ + $(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBJVM_DTRACE_DEBUGINFO) $@ ifeq ($(STRIP_POLICY),all_strip) $(QUIETLY) $(STRIP) $@ else diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/fastdebug.make --- a/make/solaris/makefiles/fastdebug.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/fastdebug.make Thu Aug 02 14:29:12 2012 -0700 @@ -36,6 +36,11 @@ ifeq ("${Platform_compiler}", "sparcWorks") OPT_CFLAGS/SLOWER = -xO2 +ifeq ($(COMPILER_REV_NUMERIC), 510) +# CC 5.10 has bug XXXXX with -xO4 +OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/SLOWER) +endif # COMPILER_REV_NUMERIC == 510 + ifeq ($(COMPILER_REV_NUMERIC), 509) # To avoid jvm98 crash OPT_CFLAGS/instanceKlass.o = $(OPT_CFLAGS/SLOWER) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/fix_empty_sec_hdr_flags.make --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/solaris/makefiles/fix_empty_sec_hdr_flags.make Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,54 @@ +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# +# + +# Rules to build fix_empty_sec_hdr_flags, used by vm.make on Solaris + +# Allow $(FIX_EMPTY_SEC_HDR_FLAGS) to be called from any directory. +# We don't set or use the GENERATED macro to avoid affecting +# other HotSpot Makefiles. +TOPDIR = $(shell echo `pwd`) +FIX_EMPTY_SEC_HDR_FLAGS = $(TOPDIR)/../generated/fix_empty_sec_hdr_flags + +FIX_EMPTY_SEC_HDR_FLAGS_DIR = $(GAMMADIR)/src/os/solaris/fix_empty_sec_hdr_flags +FIX_EMPTY_SEC_HDR_FLAGS_SRC = $(FIX_EMPTY_SEC_HDR_FLAGS_DIR)/fix_empty_sec_hdr_flags.c +FIX_EMPTY_SEC_HDR_FLAGS_FLAGS = +LIBS_FIX_EMPTY_SEC_HDR_FLAGS += -lelf + +ifeq ("${Platform_compiler}", "sparcWorks") +# Enable the following FIX_EMPTY_SEC_HDR_FLAGS_FLAGS addition if you need to +# compare the built ELF objects. +# +# The -g option makes static data global and the "-W0,-noglobal" +# option tells the compiler to not globalize static data using a unique +# globalization prefix. Instead force the use of a static globalization +# prefix based on the source filepath so the objects from two identical +# compilations are the same. +# +# Note: The blog says to use "-W0,-xglobalstatic", but that doesn't +# seem to work. I got "-W0,-noglobal" from Kelly and that works. +#FIX_EMPTY_SEC_HDR_FLAGS_FLAGS += -W0,-noglobal +endif # Platform_compiler == sparcWorks + +$(FIX_EMPTY_SEC_HDR_FLAGS): $(FIX_EMPTY_SEC_HDR_FLAGS_SRC) + $(CC) -g -o $@ $< $(FIX_EMPTY_SEC_HDR_FLAGS_FLAGS) $(LIBS_FIX_EMPTY_SEC_HDR_FLAGS) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/gcc.make --- a/make/solaris/makefiles/gcc.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/gcc.make Thu Aug 02 14:29:12 2012 -0700 @@ -141,7 +141,7 @@ # Flags for generating make dependency flags. ifneq ("${CC_VER_MAJOR}", "2") -DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) +DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) endif # -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/jsig.make --- a/make/solaris/makefiles/jsig.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/jsig.make Thu Aug 02 14:29:12 2012 -0700 @@ -52,14 +52,23 @@ LFLAGS_JSIG += -mt -xnolib endif -$(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE) +$(LIBJSIG): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE) @echo Making signal interposition lib... $(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \ - $(LFLAGS_JSIG) -o $@ $< -ldl + $(LFLAGS_JSIG) -o $@ $(JSIGSRCDIR)/jsig.c -ldl [ -f $(LIBJSIG_G) ] || { ln -s $@ $(LIBJSIG_G); } ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. +# Clear the SHF_ALLOC flag (if set) from empty section headers. +# An empty section header has sh_addr == 0 and sh_size == 0. +# This problem has only been seen on Solaris X64, but we call this tool +# on all Solaris builds just in case. + $(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@ $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJSIG_DEBUGINFO) - $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJSIG_DEBUGINFO) $@ +# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. +# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available. +# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJSIG_DEBUGINFO) $@ + $(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBJSIG_DEBUGINFO) $@ ifeq ($(STRIP_POLICY),all_strip) $(QUIETLY) $(STRIP) $@ else diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/jvmg.make --- a/make/solaris/makefiles/jvmg.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/jvmg.make Thu Aug 02 14:29:12 2012 -0700 @@ -37,7 +37,8 @@ endif endif -CFLAGS += $(DEBUG_CFLAGS/BYFILE) +# _NMT_NOINLINE_ informs NMT that no inlining by Compiler +CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_ # Set the environment variable HOTSPARC_GENERIC to "true" # to inhibit the effect of the previous line on CFLAGS. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/optimized.make --- a/make/solaris/makefiles/optimized.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/optimized.make Thu Aug 02 14:29:12 2012 -0700 @@ -32,6 +32,11 @@ # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files) ifeq ("${Platform_compiler}", "sparcWorks") +ifeq ($(COMPILER_REV_NUMERIC), 510) +# CC 5.10 has bug XXXXX with -xO4 +OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/O2) +endif # COMPILER_REV_NUMERIC == 510 + ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1) # dtrace cannot handle tail call optimization (6672627, 6693876) OPT_CFLAGS/jni.o = $(OPT_CFLAGS/DEFAULT) $(OPT_CCFLAGS/NO_TAIL_CALL_OPT) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/product.make --- a/make/solaris/makefiles/product.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/product.make Thu Aug 02 14:29:12 2012 -0700 @@ -40,6 +40,11 @@ # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files) ifeq ("${Platform_compiler}", "sparcWorks") +ifeq ($(COMPILER_REV_NUMERIC), 510) +# CC 5.10 has bug XXXXX with -xO4 +OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/O2) +endif # COMPILER_REV_NUMERIC == 510 + ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1) # dtrace cannot handle tail call optimization (6672627, 6693876) OPT_CFLAGS/jni.o = $(OPT_CFLAGS/DEFAULT) $(OPT_CCFLAGS/NO_TAIL_CALL_OPT) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/saproc.make --- a/make/solaris/makefiles/saproc.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/saproc.make Thu Aug 02 14:29:12 2012 -0700 @@ -90,7 +90,7 @@ # when actually building on Nevada-B158 or earlier: #SOLARIS_11_B159_OR_LATER=-DSOLARIS_11_B159_OR_LATER -$(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE) +$(LIBSAPROC): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(SASRCFILES) $(SAMAPFILE) $(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \ echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \ exit 1; \ @@ -109,8 +109,17 @@ -ldl -ldemangle -lthread -lc [ -f $(LIBSAPROC_G) ] || { ln -s $@ $(LIBSAPROC_G); } ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. +# Clear the SHF_ALLOC flag (if set) from empty section headers. +# An empty section header has sh_addr == 0 and sh_size == 0. +# This problem has only been seen on Solaris X64, but we call this tool +# on all Solaris builds just in case. + $(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@ $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBSAPROC_DEBUGINFO) - $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBSAPROC_DEBUGINFO) $@ +# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. +# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available. +# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBSAPROC_DEBUGINFO) $@ + $(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBSAPROC_DEBUGINFO) $@ ifeq ($(STRIP_POLICY),all_strip) $(QUIETLY) $(STRIP) $@ else diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/solaris/makefiles/vm.make --- a/make/solaris/makefiles/vm.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/solaris/makefiles/vm.make Thu Aug 02 14:29:12 2012 -0700 @@ -145,6 +145,14 @@ include $(MAKEFILES_DIR)/dtrace.make #---------------------------------------------------------------------- +# add_gnu_debuglink tool +include $(MAKEFILES_DIR)/add_gnu_debuglink.make + +#---------------------------------------------------------------------- +# fix_empty_sec_hdr_flags tool +include $(MAKEFILES_DIR)/fix_empty_sec_hdr_flags.make + +#---------------------------------------------------------------------- # JVM JVM = jvm @@ -276,7 +284,7 @@ LINK_VM = $(LINK_LIB.CXX) endif # making the library: -$(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) +$(LIBJVM): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(LIBJVM.o) $(LIBJVM_MAPFILE) ifeq ($(filter -sbfast -xsbfast, $(CFLAGS_BROWSE)),) @echo Linking vm... $(QUIETLY) $(LINK_LIB.CXX/PRE_HOOK) @@ -286,8 +294,17 @@ $(QUIETLY) [ -f $(LIBJVM_G) ] || ln -s $@ $(LIBJVM_G) $(QUIETLY) [ -f $(LIBJVM_G).1 ] || ln -s $@.1 $(LIBJVM_G).1 ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. +# Clear the SHF_ALLOC flag (if set) from empty section headers. +# An empty section header has sh_addr == 0 and sh_size == 0. +# This problem has only been seen on Solaris X64, but we call this tool +# on all Solaris builds just in case. + $(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@ $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DEBUGINFO) - $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DEBUGINFO) $@ +# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. +# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available. +# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DEBUGINFO) $@ + $(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBJVM_DEBUGINFO) $@ ifeq ($(STRIP_POLICY),all_strip) $(QUIETLY) $(STRIP) $@ else diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/windows/makefiles/debug.make --- a/make/windows/makefiles/debug.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/windows/makefiles/debug.make Thu Aug 02 14:29:12 2012 -0700 @@ -38,7 +38,8 @@ !include ../local.make !include compile.make -CXX_FLAGS=$(CXX_FLAGS) $(DEBUG_OPT_OPTION) +# _NMT_NOINLINE_ informs NMT that no inlining by Compiler +CXX_FLAGS=$(CXX_FLAGS) $(DEBUG_OPT_OPTION) /D "_NMT_NOINLINE_" !include $(WorkSpace)/make/windows/makefiles/vm.make !include local.make diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e make/windows/makefiles/defs.make --- a/make/windows/makefiles/defs.make Fri Jun 08 12:49:12 2012 -0400 +++ b/make/windows/makefiles/defs.make Thu Aug 02 14:29:12 2012 -0700 @@ -143,9 +143,7 @@ MAKE_ARGS += ENABLE_FULL_DEBUG_SYMBOLS=$(ENABLE_FULL_DEBUG_SYMBOLS) ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) - # Disable ZIP_DEBUGINFO_FILES by default because various tests are - # failing in nightly when the debug info files are ZIP'ed. - ZIP_DEBUGINFO_FILES ?= 0 + ZIP_DEBUGINFO_FILES ?= 1 else ZIP_DEBUGINFO_FILES=0 endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp --- a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -238,9 +238,12 @@ Register result = dst->as_register(); { - // Get a pointer to the first character of string0 in tmp0 and get string0.count in str0 - // Get a pointer to the first character of string1 in tmp1 and get string1.count in str1 - // Also, get string0.count-string1.count in o7 and get the condition code set + // Get a pointer to the first character of string0 in tmp0 + // and get string0.length() in str0 + // Get a pointer to the first character of string1 in tmp1 + // and get string1.length() in str1 + // Also, get string0.length()-string1.length() in + // o7 and get the condition code set // Note: some instructions have been hoisted for better instruction scheduling Register tmp0 = L0; @@ -248,27 +251,40 @@ Register tmp2 = L2; int value_offset = java_lang_String:: value_offset_in_bytes(); // char array - int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position - int count_offset = java_lang_String:: count_offset_in_bytes(); - - __ 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); - __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); + if (java_lang_String::has_offset_field()) { + int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position + int count_offset = java_lang_String:: count_offset_in_bytes(); + __ 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); + __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); + } else { + __ load_heap_oop(str0, value_offset, tmp1); + __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0); + __ ld(tmp1, arrayOopDesc::length_offset_in_bytes(), str0); + } // str1 may be null add_debug_info_for_null_check_here(info); - __ load_heap_oop(str1, value_offset, tmp1); - __ add(tmp0, tmp2, tmp0); - - __ ld(str1, offset_offset, tmp2); - __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); - __ ld(str1, count_offset, str1); - __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); + if (java_lang_String::has_offset_field()) { + int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position + int count_offset = java_lang_String:: count_offset_in_bytes(); + __ load_heap_oop(str1, value_offset, tmp1); + __ add(tmp0, tmp2, tmp0); + + __ ld(str1, offset_offset, tmp2); + __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); + __ ld(str1, count_offset, str1); + __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); + __ add(tmp1, tmp2, tmp1); + } else { + __ load_heap_oop(str1, value_offset, tmp2); + __ add(tmp2, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); + __ ld(tmp2, arrayOopDesc::length_offset_in_bytes(), str1); + } __ subcc(str0, str1, O7); - __ add(tmp1, tmp2, tmp1); } { @@ -302,7 +318,7 @@ // Shift base0 and base1 to the end of the arrays, negate limit __ add(base0, limit, base0); __ add(base1, limit, base1); - __ neg(limit); // limit = -min{string0.count, strin1.count} + __ neg(limit); // limit = -min{string0.length(), string1.length()} __ lduh(base0, limit, chr0); __ bind(Lloop); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp --- a/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -644,30 +644,6 @@ } -void LIRGenerator::do_AttemptUpdate(Intrinsic* x) { - assert(x->number_of_arguments() == 3, "wrong type"); - LIRItem obj (x->argument_at(0), this); // AtomicLong object - LIRItem cmp_value (x->argument_at(1), this); // value to compare with field - LIRItem new_value (x->argument_at(2), this); // replace field with new_value if it matches cmp_value - - obj.load_item(); - cmp_value.load_item(); - new_value.load_item(); - - // generate compare-and-swap and produce zero condition if swap occurs - int value_offset = sun_misc_AtomicLongCSImpl::value_offset(); - LIR_Opr addr = FrameMap::O7_opr; - __ add(obj.result(), LIR_OprFact::intConst(value_offset), addr); - LIR_Opr t1 = FrameMap::G1_opr; // temp for 64-bit value - LIR_Opr t2 = FrameMap::G3_opr; // temp for 64-bit value - __ cas_long(addr, cmp_value.result(), new_value.result(), t1, t2); - - // generate conditional move of boolean result - LIR_Opr result = rlock_result(x); - __ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0), result, T_LONG); -} - - void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) { assert(x->number_of_arguments() == 4, "wrong type"); LIRItem obj (x->argument_at(0), this); // object @@ -738,7 +714,8 @@ case vmIntrinsics::_dlog: // fall through case vmIntrinsics::_dsin: // fall through case vmIntrinsics::_dtan: // fall through - case vmIntrinsics::_dcos: { + case vmIntrinsics::_dcos: // fall through + case vmIntrinsics::_dexp: { assert(x->number_of_arguments() == 1, "wrong type"); address runtime_entry = NULL; @@ -758,12 +735,23 @@ case vmIntrinsics::_dlog10: runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10); break; + case vmIntrinsics::_dexp: + runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp); + break; default: ShouldNotReachHere(); } LIR_Opr result = call_runtime(x->argument_at(0), runtime_entry, x->type(), NULL); set_result(x, result); + break; + } + case vmIntrinsics::_dpow: { + assert(x->number_of_arguments() == 2, "wrong type"); + address runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow); + LIR_Opr result = call_runtime(x->argument_at(0), x->argument_at(1), runtime_entry, x->type(), NULL); + set_result(x, result); + break; } } } @@ -977,10 +965,10 @@ if (!x->klass()->is_loaded() || PatchALot) { patching_info = state_for(x, x->state_before()); - // cannot re-use same xhandlers for multiple CodeEmitInfos, so - // clone all handlers. This is handled transparently in other - // places by the CodeEmitInfo cloning logic but is handled - // specially here because a stub isn't being used. + // Cannot re-use same xhandlers for multiple CodeEmitInfos, so + // clone all handlers (NOTE: Usually this is handled transparently + // by the CodeEmitInfo cloning logic in CodeStub constructors but + // is done explicitly here because a stub isn't being used). x->set_exception_handlers(new XHandlers(x->exception_handlers())); } CodeEmitInfo* info = state_for(x, x->state()); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/cppInterpreter_sparc.cpp --- a/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -490,7 +490,8 @@ ConstantPoolCacheEntry::size()) * BytesPerWord), G1_scratch); // get constant pool cache - __ ld_ptr(G5_method, in_bytes(methodOopDesc::constants_offset()), G3_scratch); + __ ld_ptr(G5_method, in_bytes(methodOopDesc::const_offset()), G3_scratch); + __ ld_ptr(G3_scratch, in_bytes(constMethodOopDesc::constants_offset()), G3_scratch); __ ld_ptr(G3_scratch, constantPoolOopDesc::cache_offset_in_bytes(), G3_scratch); // get specific constant pool cache entry @@ -768,7 +769,8 @@ // for static methods insert the mirror argument const int mirror_offset = in_bytes(Klass::java_mirror_offset()); - __ ld_ptr(Address(G5_method, 0, in_bytes(methodOopDesc:: constants_offset())), O1); + __ ld_ptr(Address(G5_method, 0, in_bytes(methodOopDesc:: const_offset())), O1); + __ ld_ptr(Address(O1, 0, in_bytes(constMethodOopDesc::constants_offset())), O1); __ ld_ptr(Address(O1, 0, constantPoolOopDesc::pool_holder_offset_in_bytes()), O1); __ ld_ptr(O1, mirror_offset, O1); // where the mirror handle body is allocated: @@ -1047,7 +1049,7 @@ assert_different_registers(state, prev_state); assert_different_registers(prev_state, G3_scratch); const Register Gtmp = G3_scratch; - const Address constants (G5_method, 0, in_bytes(methodOopDesc::constants_offset())); + const Address constMethod (G5_method, 0, in_bytes(methodOopDesc::const_offset())); const Address access_flags (G5_method, 0, in_bytes(methodOopDesc::access_flags_offset())); const Address size_of_parameters(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset())); const Address max_stack (G5_method, 0, in_bytes(methodOopDesc::max_stack_offset())); @@ -1155,7 +1157,8 @@ __ set((int) BytecodeInterpreter::method_entry, O1); __ st(O1, XXX_STATE(_msg)); - __ ld_ptr(constants, O3); + __ ld_ptr(constMethod, O3); + __ ld_ptr(O3, in_bytes(constMethodOopDesc::constants_offset()), O3); __ ld_ptr(O3, constantPoolOopDesc::cache_offset_in_bytes(), O2); __ st_ptr(O2, XXX_STATE(_constants)); @@ -1178,7 +1181,8 @@ __ ld_ptr(XXX_STATE(_locals), O1); __ br( Assembler::zero, true, Assembler::pt, got_obj); __ delayed()->ld_ptr(O1, 0, O1); // get receiver for not-static case - __ ld_ptr(constants, O1); + __ ld_ptr(constMethod, O1); + __ ld_ptr( O1, in_bytes(constMethodOopDesc::constants_offset()), O1); __ ld_ptr( O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1); // lock the mirror, not the klassOop __ ld_ptr( O1, mirror_offset, O1); @@ -1536,7 +1540,7 @@ const Register Gtmp1 = G3_scratch; // const Register Lmirror = L1; // native mirror (native calls only) - const Address constants (G5_method, 0, in_bytes(methodOopDesc::constants_offset())); + const Address constMethod (G5_method, 0, in_bytes(methodOopDesc::const_offset())); const Address access_flags (G5_method, 0, in_bytes(methodOopDesc::access_flags_offset())); const Address size_of_parameters(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset())); const Address max_stack (G5_method, 0, in_bytes(methodOopDesc::max_stack_offset())); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/interp_masm_sparc.cpp --- a/src/cpu/sparc/vm/interp_masm_sparc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/interp_masm_sparc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -934,8 +934,14 @@ } +void InterpreterMacroAssembler::get_const(Register Rdst) { + ld_ptr(Lmethod, in_bytes(methodOopDesc::const_offset()), Rdst); +} + + void InterpreterMacroAssembler::get_constant_pool(Register Rdst) { - ld_ptr(Lmethod, in_bytes(methodOopDesc::constants_offset()), Rdst); + get_const(Rdst); + ld_ptr(Rdst, in_bytes(constMethodOopDesc::constants_offset()), Rdst); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/interp_masm_sparc.hpp --- a/src/cpu/sparc/vm/interp_masm_sparc.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/interp_masm_sparc.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -205,6 +205,7 @@ void index_check(Register array, Register index, int index_shift, Register tmp, Register res); void index_check_without_pop(Register array, Register index, int index_shift, Register tmp, Register res); + void get_const(Register Rdst); void get_constant_pool(Register Rdst); void get_constant_pool_cache(Register Rdst); void get_cpool_and_tags(Register Rcpool, Register Rtags); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/interpreter_sparc.cpp --- a/src/cpu/sparc/vm/interpreter_sparc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/interpreter_sparc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -403,6 +403,8 @@ case Interpreter::java_lang_math_abs : break; case Interpreter::java_lang_math_log : break; case Interpreter::java_lang_math_log10 : break; + case Interpreter::java_lang_math_pow : break; + case Interpreter::java_lang_math_exp : break; case Interpreter::java_lang_ref_reference_get : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; default : ShouldNotReachHere(); break; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/sparc.ad --- a/src/cpu/sparc/vm/sparc.ad Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/sparc.ad Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ // -// Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -678,18 +678,26 @@ static inline jdouble replicate_immI(int con, int count, int width) { // Load a constant replicated "count" times with width "width" + assert(count*width == 8 && width <= 4, "sanity"); int bit_width = width * 8; - jlong elt_val = con; - elt_val &= (((jlong) 1) << bit_width) - 1; // mask off sign bits - jlong val = elt_val; + jlong val = con; + val &= (((jlong) 1) << bit_width) - 1; // mask off sign bits for (int i = 0; i < count - 1; i++) { - val <<= bit_width; - val |= elt_val; + val |= (val << bit_width); } jdouble dval = *((jdouble*) &val); // coerce to double type return dval; } +static inline jdouble replicate_immF(float con) { + // Replicate float con 2 times and pack into vector. + int val = *((int*)&con); + jlong lval = val; + lval = (lval << 32) | (lval & 0xFFFFFFFFl); + jdouble dval = *((jdouble*) &lval); // 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 @@ -791,6 +799,7 @@ case Assembler::stdf_op3: st_op = Op_StoreD; break; case Assembler::ldsb_op3: ld_op = Op_LoadB; break; + case Assembler::ldub_op3: ld_op = Op_LoadUB; break; case Assembler::lduh_op3: ld_op = Op_LoadUS; break; case Assembler::ldsh_op3: ld_op = Op_LoadS; break; case Assembler::ldx_op3: // may become LoadP or stay LoadI @@ -799,7 +808,6 @@ case Assembler::ldd_op3: ld_op = Op_LoadL; break; case Assembler::ldf_op3: ld_op = Op_LoadF; break; case Assembler::lddf_op3: ld_op = Op_LoadD; break; - case Assembler::ldub_op3: ld_op = Op_LoadB; break; case Assembler::prefetch_op3: ld_op = Op_LoadI; break; default: ShouldNotReachHere(); @@ -827,7 +835,6 @@ // a Load // inputs are (0:control, 1:memory, 2:address) if (!(n->ideal_Opcode()==ld_op) && // Following are special cases - !(n->ideal_Opcode()==Op_LoadLLocked && ld_op==Op_LoadI) && !(n->ideal_Opcode()==Op_LoadPLocked && ld_op==Op_LoadP) && !(n->ideal_Opcode()==Op_LoadI && ld_op==Op_LoadF) && !(n->ideal_Opcode()==Op_LoadF && ld_op==Op_LoadI) && @@ -841,10 +848,7 @@ !(n->ideal_Opcode()==Op_PrefetchRead && ld_op==Op_LoadI) && !(n->ideal_Opcode()==Op_PrefetchWrite && ld_op==Op_LoadI) && !(n->ideal_Opcode()==Op_PrefetchAllocation && ld_op==Op_LoadI) && - !(n->ideal_Opcode()==Op_Load2I && ld_op==Op_LoadD) && - !(n->ideal_Opcode()==Op_Load4C && ld_op==Op_LoadD) && - !(n->ideal_Opcode()==Op_Load4S && ld_op==Op_LoadD) && - !(n->ideal_Opcode()==Op_Load8B && ld_op==Op_LoadD) && + !(n->ideal_Opcode()==Op_LoadVector && ld_op==Op_LoadD) && !(n->rule() == loadUB_rule)) { verify_oops_warning(n, n->ideal_Opcode(), ld_op); } @@ -856,9 +860,7 @@ !(n->ideal_Opcode()==Op_StoreI && st_op==Op_StoreF) && !(n->ideal_Opcode()==Op_StoreF && st_op==Op_StoreI) && !(n->ideal_Opcode()==Op_StoreL && st_op==Op_StoreI) && - !(n->ideal_Opcode()==Op_Store2I && st_op==Op_StoreD) && - !(n->ideal_Opcode()==Op_Store4C && st_op==Op_StoreD) && - !(n->ideal_Opcode()==Op_Store8B && st_op==Op_StoreD) && + !(n->ideal_Opcode()==Op_StoreVector && st_op==Op_StoreD) && !(n->ideal_Opcode()==Op_StoreD && st_op==Op_StoreI && n->rule() == storeD0_rule)) { verify_oops_warning(n, n->ideal_Opcode(), st_op); } @@ -1850,16 +1852,45 @@ address last_rethrow = NULL; // debugging aid for Rethrow encoding #endif +// Map Types to machine register types +const int Matcher::base2reg[Type::lastype] = { + Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN, + Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */ + 0, Op_RegD, 0, 0, /* Vectors */ + Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */ + 0, 0/*abio*/, + Op_RegP /* Return address */, 0, /* the memories */ + Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD, + 0 /*bottom*/ +}; + // Vector width in bytes -const uint Matcher::vector_width_in_bytes(void) { +const int Matcher::vector_width_in_bytes(BasicType bt) { + assert(MaxVectorSize == 8, ""); return 8; } // Vector ideal reg -const uint Matcher::vector_ideal_reg(void) { +const int Matcher::vector_ideal_reg(int size) { + assert(MaxVectorSize == 8, ""); return Op_RegD; } +// Limits on vector size (number of elements) loaded into vector. +const int Matcher::max_vector_size(const BasicType bt) { + assert(is_java_primitive(bt), "only primitive type vectors"); + return vector_width_in_bytes(bt)/type2aelembytes(bt); +} + +const int Matcher::min_vector_size(const BasicType bt) { + return max_vector_size(bt); // Same as max. +} + +// SPARC doesn't support misaligned vectors store/load. +const bool Matcher::misaligned_vectors_ok() { + return false; +} + // USII supports fxtof through the whole range of number, USIII doesn't const bool Matcher::convL2FSupported(void) { return VM_Version::has_fast_fxtof(); @@ -3126,50 +3157,6 @@ __ membar( Assembler::Membar_mask_bits(Assembler::StoreLoad) ); %} - enc_class enc_repl8b( iRegI src, iRegL dst ) %{ - MacroAssembler _masm(&cbuf); - Register src_reg = reg_to_register_object($src$$reg); - Register dst_reg = reg_to_register_object($dst$$reg); - __ sllx(src_reg, 56, dst_reg); - __ srlx(dst_reg, 8, O7); - __ or3 (dst_reg, O7, dst_reg); - __ srlx(dst_reg, 16, O7); - __ or3 (dst_reg, O7, dst_reg); - __ srlx(dst_reg, 32, O7); - __ or3 (dst_reg, O7, dst_reg); - %} - - enc_class enc_repl4b( iRegI src, iRegL dst ) %{ - MacroAssembler _masm(&cbuf); - Register src_reg = reg_to_register_object($src$$reg); - Register dst_reg = reg_to_register_object($dst$$reg); - __ sll(src_reg, 24, dst_reg); - __ srl(dst_reg, 8, O7); - __ or3(dst_reg, O7, dst_reg); - __ srl(dst_reg, 16, O7); - __ or3(dst_reg, O7, dst_reg); - %} - - enc_class enc_repl4s( iRegI src, iRegL dst ) %{ - MacroAssembler _masm(&cbuf); - Register src_reg = reg_to_register_object($src$$reg); - Register dst_reg = reg_to_register_object($dst$$reg); - __ sllx(src_reg, 48, dst_reg); - __ srlx(dst_reg, 16, O7); - __ or3 (dst_reg, O7, dst_reg); - __ srlx(dst_reg, 32, O7); - __ or3 (dst_reg, O7, dst_reg); - %} - - enc_class enc_repl2i( iRegI src, iRegL dst ) %{ - MacroAssembler _masm(&cbuf); - Register src_reg = reg_to_register_object($src$$reg); - Register dst_reg = reg_to_register_object($dst$$reg); - __ sllx(src_reg, 32, dst_reg); - __ srlx(dst_reg, 32, O7); - __ or3 (dst_reg, O7, dst_reg); - %} - %} //----------FRAME-------------------------------------------------------------- @@ -5933,50 +5920,6 @@ ins_pipe(iload_mem); %} -// Load Aligned Packed Byte into a Double Register -instruct loadA8B(regD dst, memory mem) %{ - match(Set dst (Load8B mem)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "LDDF $mem,$dst\t! packed8B" %} - opcode(Assembler::lddf_op3); - ins_encode(simple_form3_mem_reg( mem, dst ) ); - ins_pipe(floadD_mem); -%} - -// Load Aligned Packed Char into a Double Register -instruct loadA4C(regD dst, memory mem) %{ - match(Set dst (Load4C mem)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "LDDF $mem,$dst\t! packed4C" %} - opcode(Assembler::lddf_op3); - ins_encode(simple_form3_mem_reg( mem, dst ) ); - ins_pipe(floadD_mem); -%} - -// Load Aligned Packed Short into a Double Register -instruct loadA4S(regD dst, memory mem) %{ - match(Set dst (Load4S mem)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "LDDF $mem,$dst\t! packed4S" %} - opcode(Assembler::lddf_op3); - ins_encode(simple_form3_mem_reg( mem, dst ) ); - ins_pipe(floadD_mem); -%} - -// Load Aligned Packed Int into a Double Register -instruct loadA2I(regD dst, memory mem) %{ - match(Set dst (Load2I mem)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "LDDF $mem,$dst\t! packed2I" %} - opcode(Assembler::lddf_op3); - ins_encode(simple_form3_mem_reg( mem, dst ) ); - ins_pipe(floadD_mem); -%} - // Load Range instruct loadRange(iRegI dst, memory mem) %{ match(Set dst (LoadRange mem)); @@ -6600,17 +6543,6 @@ ins_pipe(fstoreF_mem_zero); %} -// Store Aligned Packed Bytes in Double register to memory -instruct storeA8B(memory mem, regD src) %{ - match(Set mem (Store8B mem src)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "STDF $src,$mem\t! packed8B" %} - opcode(Assembler::stdf_op3); - ins_encode(simple_form3_mem_reg( mem, src ) ); - ins_pipe(fstoreD_mem_reg); -%} - // Convert oop pointer into compressed form instruct encodeHeapOop(iRegN dst, iRegP src) %{ predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); @@ -6655,62 +6587,6 @@ %} -// Store Zero into Aligned Packed Bytes -instruct storeA8B0(memory mem, immI0 zero) %{ - match(Set mem (Store8B mem zero)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "STX $zero,$mem\t! packed8B" %} - opcode(Assembler::stx_op3); - ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); - ins_pipe(fstoreD_mem_zero); -%} - -// Store Aligned Packed Chars/Shorts in Double register to memory -instruct storeA4C(memory mem, regD src) %{ - match(Set mem (Store4C mem src)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "STDF $src,$mem\t! packed4C" %} - opcode(Assembler::stdf_op3); - ins_encode(simple_form3_mem_reg( mem, src ) ); - ins_pipe(fstoreD_mem_reg); -%} - -// Store Zero into Aligned Packed Chars/Shorts -instruct storeA4C0(memory mem, immI0 zero) %{ - match(Set mem (Store4C mem (Replicate4C zero))); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "STX $zero,$mem\t! packed4C" %} - opcode(Assembler::stx_op3); - ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); - ins_pipe(fstoreD_mem_zero); -%} - -// Store Aligned Packed Ints in Double register to memory -instruct storeA2I(memory mem, regD src) %{ - match(Set mem (Store2I mem src)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "STDF $src,$mem\t! packed2I" %} - opcode(Assembler::stdf_op3); - ins_encode(simple_form3_mem_reg( mem, src ) ); - ins_pipe(fstoreD_mem_reg); -%} - -// Store Zero into Aligned Packed Ints -instruct storeA2I0(memory mem, immI0 zero) %{ - match(Set mem (Store2I mem zero)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "STX $zero,$mem\t! packed2I" %} - opcode(Assembler::stx_op3); - ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); - ins_pipe(fstoreD_mem_zero); -%} - - //----------MemBar Instructions----------------------------------------------- // Memory barrier flavors @@ -7306,17 +7182,6 @@ ins_pipe(iload_mem); %} -// LoadL-locked. Same as a regular long load when used with a compare-swap -instruct loadLLocked(iRegL dst, memory mem) %{ - match(Set dst (LoadLLocked mem)); - ins_cost(MEMORY_REF_COST); - size(4); - format %{ "LDX $mem,$dst\t! long" %} - opcode(Assembler::ldx_op3); - ins_encode(simple_form3_mem_reg( mem, dst ) ); - ins_pipe(iload_mem); -%} - instruct storePConditional( iRegP heap_top_ptr, iRegP oldval, g3RegP newval, flagsRegP pcc ) %{ match(Set pcc (StorePConditional heap_top_ptr (Binary oldval newval))); effect( KILL newval ); @@ -8892,150 +8757,6 @@ ins_pipe(ialu_reg_imm); %} -// Replicate scalar to packed byte values in Double register -instruct Repl8B_reg_helper(iRegL dst, iRegI src) %{ - effect(DEF dst, USE src); - format %{ "SLLX $src,56,$dst\n\t" - "SRLX $dst, 8,O7\n\t" - "OR $dst,O7,$dst\n\t" - "SRLX $dst,16,O7\n\t" - "OR $dst,O7,$dst\n\t" - "SRLX $dst,32,O7\n\t" - "OR $dst,O7,$dst\t! replicate8B" %} - ins_encode( enc_repl8b(src, dst)); - ins_pipe(ialu_reg); -%} - -// Replicate scalar to packed byte values in Double register -instruct Repl8B_reg(stackSlotD dst, iRegI src) %{ - match(Set dst (Replicate8B src)); - expand %{ - iRegL tmp; - Repl8B_reg_helper(tmp, src); - regL_to_stkD(dst, tmp); - %} -%} - -// Replicate scalar constant to packed byte values in Double register -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); -%} - -// Replicate scalar to packed char values into stack slot -instruct Repl4C_reg_helper(iRegL dst, iRegI src) %{ - effect(DEF dst, USE src); - format %{ "SLLX $src,48,$dst\n\t" - "SRLX $dst,16,O7\n\t" - "OR $dst,O7,$dst\n\t" - "SRLX $dst,32,O7\n\t" - "OR $dst,O7,$dst\t! replicate4C" %} - ins_encode( enc_repl4s(src, dst) ); - ins_pipe(ialu_reg); -%} - -// Replicate scalar to packed char values into stack slot -instruct Repl4C_reg(stackSlotD dst, iRegI src) %{ - match(Set dst (Replicate4C src)); - expand %{ - iRegL tmp; - Repl4C_reg_helper(tmp, src); - regL_to_stkD(dst, tmp); - %} -%} - -// Replicate scalar constant to packed char values in Double register -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); -%} - -// Replicate scalar to packed short values into stack slot -instruct Repl4S_reg_helper(iRegL dst, iRegI src) %{ - effect(DEF dst, USE src); - format %{ "SLLX $src,48,$dst\n\t" - "SRLX $dst,16,O7\n\t" - "OR $dst,O7,$dst\n\t" - "SRLX $dst,32,O7\n\t" - "OR $dst,O7,$dst\t! replicate4S" %} - ins_encode( enc_repl4s(src, dst) ); - ins_pipe(ialu_reg); -%} - -// Replicate scalar to packed short values into stack slot -instruct Repl4S_reg(stackSlotD dst, iRegI src) %{ - match(Set dst (Replicate4S src)); - expand %{ - iRegL tmp; - Repl4S_reg_helper(tmp, src); - regL_to_stkD(dst, tmp); - %} -%} - -// Replicate scalar constant to packed short values in Double register -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); -%} - -// Replicate scalar to packed int values in Double register -instruct Repl2I_reg_helper(iRegL dst, iRegI src) %{ - effect(DEF dst, USE src); - format %{ "SLLX $src,32,$dst\n\t" - "SRLX $dst,32,O7\n\t" - "OR $dst,O7,$dst\t! replicate2I" %} - ins_encode( enc_repl2i(src, dst)); - ins_pipe(ialu_reg); -%} - -// Replicate scalar to packed int values in Double register -instruct Repl2I_reg(stackSlotD dst, iRegI src) %{ - match(Set dst (Replicate2I src)); - expand %{ - iRegL tmp; - Repl2I_reg_helper(tmp, src); - regL_to_stkD(dst, tmp); - %} -%} - -// Replicate scalar zero constant to packed int values in Double register -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); -%} - //----------Control Flow Instructions------------------------------------------ // Compare Instructions // Compare Integers @@ -10754,6 +10475,308 @@ ins_pipe(istore_mem_reg); %} +// ====================VECTOR INSTRUCTIONS===================================== + +// Load Aligned Packed values into a Double Register +instruct loadV8(regD dst, memory mem) %{ + predicate(n->as_LoadVector()->memory_size() == 8); + match(Set dst (LoadVector mem)); + ins_cost(MEMORY_REF_COST); + size(4); + format %{ "LDDF $mem,$dst\t! load vector (8 bytes)" %} + ins_encode %{ + __ ldf(FloatRegisterImpl::D, $mem$$Address, as_DoubleFloatRegister($dst$$reg)); + %} + ins_pipe(floadD_mem); +%} + +// Store Vector in Double register to memory +instruct storeV8(memory mem, regD src) %{ + predicate(n->as_StoreVector()->memory_size() == 8); + match(Set mem (StoreVector mem src)); + ins_cost(MEMORY_REF_COST); + size(4); + format %{ "STDF $src,$mem\t! store vector (8 bytes)" %} + ins_encode %{ + __ stf(FloatRegisterImpl::D, as_DoubleFloatRegister($src$$reg), $mem$$Address); + %} + ins_pipe(fstoreD_mem_reg); +%} + +// Store Zero into vector in memory +instruct storeV8B_zero(memory mem, immI0 zero) %{ + predicate(n->as_StoreVector()->memory_size() == 8); + match(Set mem (StoreVector mem (ReplicateB zero))); + ins_cost(MEMORY_REF_COST); + size(4); + format %{ "STX $zero,$mem\t! store zero vector (8 bytes)" %} + ins_encode %{ + __ stx(G0, $mem$$Address); + %} + ins_pipe(fstoreD_mem_zero); +%} + +instruct storeV4S_zero(memory mem, immI0 zero) %{ + predicate(n->as_StoreVector()->memory_size() == 8); + match(Set mem (StoreVector mem (ReplicateS zero))); + ins_cost(MEMORY_REF_COST); + size(4); + format %{ "STX $zero,$mem\t! store zero vector (4 shorts)" %} + ins_encode %{ + __ stx(G0, $mem$$Address); + %} + ins_pipe(fstoreD_mem_zero); +%} + +instruct storeV2I_zero(memory mem, immI0 zero) %{ + predicate(n->as_StoreVector()->memory_size() == 8); + match(Set mem (StoreVector mem (ReplicateI zero))); + ins_cost(MEMORY_REF_COST); + size(4); + format %{ "STX $zero,$mem\t! store zero vector (2 ints)" %} + ins_encode %{ + __ stx(G0, $mem$$Address); + %} + ins_pipe(fstoreD_mem_zero); +%} + +instruct storeV2F_zero(memory mem, immF0 zero) %{ + predicate(n->as_StoreVector()->memory_size() == 8); + match(Set mem (StoreVector mem (ReplicateF zero))); + ins_cost(MEMORY_REF_COST); + size(4); + format %{ "STX $zero,$mem\t! store zero vector (2 floats)" %} + ins_encode %{ + __ stx(G0, $mem$$Address); + %} + ins_pipe(fstoreD_mem_zero); +%} + +// Replicate scalar to packed byte values into Double register +instruct Repl8B_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{ + predicate(n->as_Vector()->length() == 8 && UseVIS >= 3); + match(Set dst (ReplicateB src)); + effect(DEF dst, USE src, TEMP tmp, KILL tmp2); + format %{ "SLLX $src,56,$tmp\n\t" + "SRLX $tmp, 8,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\n\t" + "SRLX $tmp,16,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\n\t" + "SRLX $tmp,32,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\t! replicate8B\n\t" + "MOVXTOD $tmp,$dst\t! MoveL2D" %} + ins_encode %{ + Register Rsrc = $src$$Register; + Register Rtmp = $tmp$$Register; + Register Rtmp2 = $tmp2$$Register; + __ sllx(Rsrc, 56, Rtmp); + __ srlx(Rtmp, 8, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ srlx(Rtmp, 16, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ srlx(Rtmp, 32, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg)); + %} + ins_pipe(ialu_reg); +%} + +// Replicate scalar to packed byte values into Double stack +instruct Repl8B_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{ + predicate(n->as_Vector()->length() == 8 && UseVIS < 3); + match(Set dst (ReplicateB src)); + effect(DEF dst, USE src, TEMP tmp, KILL tmp2); + format %{ "SLLX $src,56,$tmp\n\t" + "SRLX $tmp, 8,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\n\t" + "SRLX $tmp,16,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\n\t" + "SRLX $tmp,32,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\t! replicate8B\n\t" + "STX $tmp,$dst\t! regL to stkD" %} + ins_encode %{ + Register Rsrc = $src$$Register; + Register Rtmp = $tmp$$Register; + Register Rtmp2 = $tmp2$$Register; + __ sllx(Rsrc, 56, Rtmp); + __ srlx(Rtmp, 8, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ srlx(Rtmp, 16, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ srlx(Rtmp, 32, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ set ($dst$$disp + STACK_BIAS, Rtmp2); + __ stx (Rtmp, Rtmp2, $dst$$base$$Register); + %} + ins_pipe(ialu_reg); +%} + +// Replicate scalar constant to packed byte values in Double register +instruct Repl8B_immI(regD dst, immI13 con, o7RegI tmp) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateB 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); +%} + +// Replicate scalar to packed char/short values into Double register +instruct Repl4S_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{ + predicate(n->as_Vector()->length() == 4 && UseVIS >= 3); + match(Set dst (ReplicateS src)); + effect(DEF dst, USE src, TEMP tmp, KILL tmp2); + format %{ "SLLX $src,48,$tmp\n\t" + "SRLX $tmp,16,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\n\t" + "SRLX $tmp,32,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\t! replicate4S\n\t" + "MOVXTOD $tmp,$dst\t! MoveL2D" %} + ins_encode %{ + Register Rsrc = $src$$Register; + Register Rtmp = $tmp$$Register; + Register Rtmp2 = $tmp2$$Register; + __ sllx(Rsrc, 48, Rtmp); + __ srlx(Rtmp, 16, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ srlx(Rtmp, 32, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg)); + %} + ins_pipe(ialu_reg); +%} + +// Replicate scalar to packed char/short values into Double stack +instruct Repl4S_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{ + predicate(n->as_Vector()->length() == 4 && UseVIS < 3); + match(Set dst (ReplicateS src)); + effect(DEF dst, USE src, TEMP tmp, KILL tmp2); + format %{ "SLLX $src,48,$tmp\n\t" + "SRLX $tmp,16,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\n\t" + "SRLX $tmp,32,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\t! replicate4S\n\t" + "STX $tmp,$dst\t! regL to stkD" %} + ins_encode %{ + Register Rsrc = $src$$Register; + Register Rtmp = $tmp$$Register; + Register Rtmp2 = $tmp2$$Register; + __ sllx(Rsrc, 48, Rtmp); + __ srlx(Rtmp, 16, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ srlx(Rtmp, 32, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ set ($dst$$disp + STACK_BIAS, Rtmp2); + __ stx (Rtmp, Rtmp2, $dst$$base$$Register); + %} + ins_pipe(ialu_reg); +%} + +// Replicate scalar constant to packed char/short values in Double register +instruct Repl4S_immI(regD dst, immI con, o7RegI tmp) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateS 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); +%} + +// Replicate scalar to packed int values into Double register +instruct Repl2I_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{ + predicate(n->as_Vector()->length() == 2 && UseVIS >= 3); + match(Set dst (ReplicateI src)); + effect(DEF dst, USE src, TEMP tmp, KILL tmp2); + format %{ "SLLX $src,32,$tmp\n\t" + "SRLX $tmp,32,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\t! replicate2I\n\t" + "MOVXTOD $tmp,$dst\t! MoveL2D" %} + ins_encode %{ + Register Rsrc = $src$$Register; + Register Rtmp = $tmp$$Register; + Register Rtmp2 = $tmp2$$Register; + __ sllx(Rsrc, 32, Rtmp); + __ srlx(Rtmp, 32, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg)); + %} + ins_pipe(ialu_reg); +%} + +// Replicate scalar to packed int values into Double stack +instruct Repl2I_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{ + predicate(n->as_Vector()->length() == 2 && UseVIS < 3); + match(Set dst (ReplicateI src)); + effect(DEF dst, USE src, TEMP tmp, KILL tmp2); + format %{ "SLLX $src,32,$tmp\n\t" + "SRLX $tmp,32,$tmp2\n\t" + "OR $tmp,$tmp2,$tmp\t! replicate2I\n\t" + "STX $tmp,$dst\t! regL to stkD" %} + ins_encode %{ + Register Rsrc = $src$$Register; + Register Rtmp = $tmp$$Register; + Register Rtmp2 = $tmp2$$Register; + __ sllx(Rsrc, 32, Rtmp); + __ srlx(Rtmp, 32, Rtmp2); + __ or3 (Rtmp, Rtmp2, Rtmp); + __ set ($dst$$disp + STACK_BIAS, Rtmp2); + __ stx (Rtmp, Rtmp2, $dst$$base$$Register); + %} + ins_pipe(ialu_reg); +%} + +// Replicate scalar zero constant to packed int values in Double register +instruct Repl2I_immI(regD dst, immI con, o7RegI tmp) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateI 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); +%} + +// Replicate scalar to packed float values into Double stack +instruct Repl2F_stk(stackSlotD dst, regF src) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateF src)); + ins_cost(MEMORY_REF_COST*2); + format %{ "STF $src,$dst.hi\t! packed2F\n\t" + "STF $src,$dst.lo" %} + opcode(Assembler::stf_op3); + ins_encode(simple_form3_mem_reg(dst, src), form3_mem_plus_4_reg(dst, src)); + ins_pipe(fstoreF_stk_reg); +%} + +// Replicate scalar zero constant to packed float values in Double register +instruct Repl2F_immF(regD dst, immF con, o7RegI tmp) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateF con)); + effect(KILL tmp); + format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2F($con)" %} + ins_encode %{ + // XXX This is a quick fix for 6833573. + //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immF($con$$constant)), $dst$$FloatRegister); + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immF($con$$constant)), $tmp$$Register); + __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg)); + %} + ins_pipe(loadConFD); +%} + //----------PEEPHOLE RULES----------------------------------------------------- // These must follow all instruction definitions as they use the names // defined in the instructions definitions. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/templateInterpreter_sparc.cpp --- a/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -371,7 +371,8 @@ __ br( Assembler::zero, true, Assembler::pt, done); __ delayed()->ld_ptr(Llocals, Interpreter::local_offset_in_bytes(0), O0); // get receiver for not-static case - __ ld_ptr( Lmethod, in_bytes(methodOopDesc::constants_offset()), O0); + __ ld_ptr( Lmethod, in_bytes(methodOopDesc::const_offset()), O0); + __ ld_ptr( O0, in_bytes(constMethodOopDesc::constants_offset()), O0); __ ld_ptr( O0, constantPoolOopDesc::pool_holder_offset_in_bytes(), O0); // lock the mirror, not the klassOop @@ -670,7 +671,8 @@ ConstantPoolCacheEntry::size()) * BytesPerWord), G1_scratch); // get constant pool cache - __ ld_ptr(G5_method, methodOopDesc::constants_offset(), G3_scratch); + __ ld_ptr(G5_method, methodOopDesc::const_offset(), G3_scratch); + __ ld_ptr(G3_scratch, constMethodOopDesc::constants_offset(), G3_scratch); __ ld_ptr(G3_scratch, constantPoolOopDesc::cache_offset_in_bytes(), G3_scratch); // get specific constant pool cache entry @@ -993,7 +995,8 @@ // for static methods insert the mirror argument const int mirror_offset = in_bytes(Klass::java_mirror_offset()); - __ ld_ptr(Lmethod, methodOopDesc:: constants_offset(), O1); + __ ld_ptr(Lmethod, methodOopDesc:: const_offset(), O1); + __ ld_ptr(O1, constMethodOopDesc::constants_offset(), O1); __ ld_ptr(O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1); __ ld_ptr(O1, mirror_offset, O1); #ifdef ASSERT diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/sparc/vm/vm_version_sparc.cpp --- a/src/cpu/sparc/vm/vm_version_sparc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/sparc/vm/vm_version_sparc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -217,6 +217,8 @@ // Currently not supported anywhere. FLAG_SET_DEFAULT(UseFPUForSpilling, false); + MaxVectorSize = 8; + assert((InteriorEntryAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size"); #endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/assembler_x86.cpp --- a/src/cpu/x86/vm/assembler_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/assembler_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1637,6 +1637,13 @@ emit_byte(0xC0 | encode); } +void Assembler::movlhps(XMMRegister dst, XMMRegister src) { + NOT_LP64(assert(VM_Version::supports_sse(), "")); + int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_NONE); + emit_byte(0x16); + emit_byte(0xC0 | encode); +} + void Assembler::movb(Register dst, Address src) { NOT_LP64(assert(dst->has_byte_register(), "must have byte register")); InstructionMark im(this); @@ -1686,6 +1693,14 @@ emit_operand(dst, src); } +void Assembler::movdl(Address dst, XMMRegister src) { + NOT_LP64(assert(VM_Version::supports_sse2(), "")); + InstructionMark im(this); + simd_prefix(dst, src, VEX_SIMD_66); + emit_byte(0x7E); + emit_operand(src, dst); +} + void Assembler::movdqa(XMMRegister dst, XMMRegister src) { NOT_LP64(assert(VM_Version::supports_sse2(), "")); int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_66); @@ -1716,6 +1731,35 @@ emit_operand(src, dst); } +// Move Unaligned 256bit Vector +void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) { + assert(UseAVX, ""); + bool vector256 = true; + int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, vector256); + emit_byte(0x6F); + emit_byte(0xC0 | encode); +} + +void Assembler::vmovdqu(XMMRegister dst, Address src) { + assert(UseAVX, ""); + InstructionMark im(this); + bool vector256 = true; + vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector256); + emit_byte(0x6F); + emit_operand(dst, src); +} + +void Assembler::vmovdqu(Address dst, XMMRegister src) { + assert(UseAVX, ""); + InstructionMark im(this); + bool vector256 = true; + // swap src<->dst for encoding + assert(src != xnoreg, "sanity"); + vex_prefix(src, xnoreg, dst, VEX_SIMD_F3, vector256); + emit_byte(0x7F); + emit_operand(src, dst); +} + // Uses zero extension on 64bit void Assembler::movl(Register dst, int32_t imm32) { @@ -2529,6 +2573,13 @@ emit_byte(0xC0 | encode); } +void Assembler::punpcklqdq(XMMRegister dst, XMMRegister src) { + NOT_LP64(assert(VM_Version::supports_sse2(), "")); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66); + emit_byte(0x6C); + emit_byte(0xC0 | encode); +} + void Assembler::push(int32_t imm32) { // in 64bits we push 64bits onto the stack but only // take a 32bit immediate @@ -3112,6 +3163,13 @@ emit_operand(dst, src); } +void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { + assert(VM_Version::supports_avx(), ""); + int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256); + emit_byte(0x57); + emit_byte(0xC0 | encode); +} + void Assembler::vxorps(XMMRegister dst, XMMRegister nds, Address src) { assert(VM_Version::supports_avx(), ""); InstructionMark im(this); @@ -3120,6 +3178,48 @@ emit_operand(dst, src); } +void Assembler::vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { + assert(VM_Version::supports_avx(), ""); + int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_NONE, vector256); + emit_byte(0x57); + emit_byte(0xC0 | encode); +} + +void Assembler::vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { + assert(VM_Version::supports_avx2() || (!vector256) && VM_Version::supports_avx(), ""); + int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256); + emit_byte(0xEF); + emit_byte(0xC0 | encode); +} + +void Assembler::vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src) { + assert(VM_Version::supports_avx(), ""); + bool vector256 = true; + int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A); + emit_byte(0x18); + emit_byte(0xC0 | encode); + // 0x00 - insert into lower 128 bits + // 0x01 - insert into upper 128 bits + emit_byte(0x01); +} + +void Assembler::vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) { + assert(VM_Version::supports_avx2(), ""); + bool vector256 = true; + int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A); + emit_byte(0x38); + emit_byte(0xC0 | encode); + // 0x00 - insert into lower 128 bits + // 0x01 - insert into upper 128 bits + emit_byte(0x01); +} + +void Assembler::vzeroupper() { + assert(VM_Version::supports_avx(), ""); + (void)vex_prefix_and_encode(xmm0, xmm0, xmm0, VEX_SIMD_NONE); + emit_byte(0x77); +} + #ifndef _LP64 // 32bit only pieces of the assembler @@ -3578,6 +3678,21 @@ emit_byte(0xF1); } +void Assembler::frndint() { + emit_byte(0xD9); + emit_byte(0xFC); +} + +void Assembler::f2xm1() { + emit_byte(0xD9); + emit_byte(0xF0); +} + +void Assembler::fldl2e() { + emit_byte(0xD9); + emit_byte(0xEA); +} + // SSE SIMD prefix byte values corresponding to VexSimdPrefix encoding. static int simd_pre[4] = { 0, 0x66, 0xF3, 0xF2 }; // SSE opcode second byte values (first is 0x0F) corresponding to VexOpcode encoding. @@ -6868,6 +6983,264 @@ Assembler::fldcw(as_Address(src)); } +void MacroAssembler::pow_exp_core_encoding() { + // kills rax, rcx, rdx + subptr(rsp,sizeof(jdouble)); + // computes 2^X. Stack: X ... + // f2xm1 computes 2^X-1 but only operates on -1<=X<=1. Get int(X) and + // keep it on the thread's stack to compute 2^int(X) later + // then compute 2^(X-int(X)) as (2^(X-int(X)-1+1) + // final result is obtained with: 2^X = 2^int(X) * 2^(X-int(X)) + fld_s(0); // Stack: X X ... + frndint(); // Stack: int(X) X ... + fsuba(1); // Stack: int(X) X-int(X) ... + fistp_s(Address(rsp,0)); // move int(X) as integer to thread's stack. Stack: X-int(X) ... + f2xm1(); // Stack: 2^(X-int(X))-1 ... + fld1(); // Stack: 1 2^(X-int(X))-1 ... + faddp(1); // Stack: 2^(X-int(X)) + // computes 2^(int(X)): add exponent bias (1023) to int(X), then + // shift int(X)+1023 to exponent position. + // Exponent is limited to 11 bits if int(X)+1023 does not fit in 11 + // bits, set result to NaN. 0x000 and 0x7FF are reserved exponent + // values so detect them and set result to NaN. + movl(rax,Address(rsp,0)); + movl(rcx, -2048); // 11 bit mask and valid NaN binary encoding + addl(rax, 1023); + movl(rdx,rax); + shll(rax,20); + // Check that 0 < int(X)+1023 < 2047. Otherwise set rax to NaN. + addl(rdx,1); + // Check that 1 < int(X)+1023+1 < 2048 + // in 3 steps: + // 1- (int(X)+1023+1)&-2048 == 0 => 0 <= int(X)+1023+1 < 2048 + // 2- (int(X)+1023+1)&-2048 != 0 + // 3- (int(X)+1023+1)&-2048 != 1 + // Do 2- first because addl just updated the flags. + cmov32(Assembler::equal,rax,rcx); + cmpl(rdx,1); + cmov32(Assembler::equal,rax,rcx); + testl(rdx,rcx); + cmov32(Assembler::notEqual,rax,rcx); + movl(Address(rsp,4),rax); + movl(Address(rsp,0),0); + fmul_d(Address(rsp,0)); // Stack: 2^X ... + addptr(rsp,sizeof(jdouble)); +} + +void MacroAssembler::increase_precision() { + subptr(rsp, BytesPerWord); + fnstcw(Address(rsp, 0)); + movl(rax, Address(rsp, 0)); + orl(rax, 0x300); + push(rax); + fldcw(Address(rsp, 0)); + pop(rax); +} + +void MacroAssembler::restore_precision() { + fldcw(Address(rsp, 0)); + addptr(rsp, BytesPerWord); +} + +void MacroAssembler::fast_pow() { + // computes X^Y = 2^(Y * log2(X)) + // if fast computation is not possible, result is NaN. Requires + // fallback from user of this macro. + // increase precision for intermediate steps of the computation + increase_precision(); + fyl2x(); // Stack: (Y*log2(X)) ... + pow_exp_core_encoding(); // Stack: exp(X) ... + restore_precision(); +} + +void MacroAssembler::fast_exp() { + // computes exp(X) = 2^(X * log2(e)) + // if fast computation is not possible, result is NaN. Requires + // fallback from user of this macro. + // increase precision for intermediate steps of the computation + increase_precision(); + fldl2e(); // Stack: log2(e) X ... + fmulp(1); // Stack: (X*log2(e)) ... + pow_exp_core_encoding(); // Stack: exp(X) ... + restore_precision(); +} + +void MacroAssembler::pow_or_exp(bool is_exp, int num_fpu_regs_in_use) { + // kills rax, rcx, rdx + // pow and exp needs 2 extra registers on the fpu stack. + Label slow_case, done; + Register tmp = noreg; + if (!VM_Version::supports_cmov()) { + // fcmp needs a temporary so preserve rdx, + tmp = rdx; + } + Register tmp2 = rax; + Register tmp3 = rcx; + + if (is_exp) { + // Stack: X + fld_s(0); // duplicate argument for runtime call. Stack: X X + fast_exp(); // Stack: exp(X) X + fcmp(tmp, 0, false, false); // Stack: exp(X) X + // exp(X) not equal to itself: exp(X) is NaN go to slow case. + jcc(Assembler::parity, slow_case); + // get rid of duplicate argument. Stack: exp(X) + if (num_fpu_regs_in_use > 0) { + fxch(); + fpop(); + } else { + ffree(1); + } + jmp(done); + } else { + // Stack: X Y + Label x_negative, y_odd; + + fldz(); // Stack: 0 X Y + fcmp(tmp, 1, true, false); // Stack: X Y + jcc(Assembler::above, x_negative); + + // X >= 0 + + fld_s(1); // duplicate arguments for runtime call. Stack: Y X Y + fld_s(1); // Stack: X Y X Y + fast_pow(); // Stack: X^Y X Y + fcmp(tmp, 0, false, false); // Stack: X^Y X Y + // X^Y not equal to itself: X^Y is NaN go to slow case. + jcc(Assembler::parity, slow_case); + // get rid of duplicate arguments. Stack: X^Y + if (num_fpu_regs_in_use > 0) { + fxch(); fpop(); + fxch(); fpop(); + } else { + ffree(2); + ffree(1); + } + jmp(done); + + // X <= 0 + bind(x_negative); + + fld_s(1); // Stack: Y X Y + frndint(); // Stack: int(Y) X Y + fcmp(tmp, 2, false, false); // Stack: int(Y) X Y + jcc(Assembler::notEqual, slow_case); + + subptr(rsp, 8); + + // For X^Y, when X < 0, Y has to be an integer and the final + // result depends on whether it's odd or even. We just checked + // that int(Y) == Y. We move int(Y) to gp registers as a 64 bit + // integer to test its parity. If int(Y) is huge and doesn't fit + // in the 64 bit integer range, the integer indefinite value will + // end up in the gp registers. Huge numbers are all even, the + // integer indefinite number is even so it's fine. + +#ifdef ASSERT + // Let's check we don't end up with an integer indefinite number + // when not expected. First test for huge numbers: check whether + // int(Y)+1 == int(Y) which is true for very large numbers and + // those are all even. A 64 bit integer is guaranteed to not + // overflow for numbers where y+1 != y (when precision is set to + // double precision). + Label y_not_huge; + + fld1(); // Stack: 1 int(Y) X Y + fadd(1); // Stack: 1+int(Y) int(Y) X Y + +#ifdef _LP64 + // trip to memory to force the precision down from double extended + // precision + fstp_d(Address(rsp, 0)); + fld_d(Address(rsp, 0)); +#endif + + fcmp(tmp, 1, true, false); // Stack: int(Y) X Y +#endif + + // move int(Y) as 64 bit integer to thread's stack + fistp_d(Address(rsp,0)); // Stack: X Y + +#ifdef ASSERT + jcc(Assembler::notEqual, y_not_huge); + + // Y is huge so we know it's even. It may not fit in a 64 bit + // integer and we don't want the debug code below to see the + // integer indefinite value so overwrite int(Y) on the thread's + // stack with 0. + movl(Address(rsp, 0), 0); + movl(Address(rsp, 4), 0); + + bind(y_not_huge); +#endif + + fld_s(1); // duplicate arguments for runtime call. Stack: Y X Y + fld_s(1); // Stack: X Y X Y + fabs(); // Stack: abs(X) Y X Y + fast_pow(); // Stack: abs(X)^Y X Y + fcmp(tmp, 0, false, false); // Stack: abs(X)^Y X Y + // abs(X)^Y not equal to itself: abs(X)^Y is NaN go to slow case. + + pop(tmp2); + NOT_LP64(pop(tmp3)); + jcc(Assembler::parity, slow_case); + +#ifdef ASSERT + // Check that int(Y) is not integer indefinite value (int + // overflow). Shouldn't happen because for values that would + // overflow, 1+int(Y)==Y which was tested earlier. +#ifndef _LP64 + { + Label integer; + testl(tmp2, tmp2); + jcc(Assembler::notZero, integer); + cmpl(tmp3, 0x80000000); + jcc(Assembler::notZero, integer); + stop("integer indefinite value shouldn't be seen here"); + bind(integer); + } +#else + { + Label integer; + mov(tmp3, tmp2); // preserve tmp2 for parity check below + shlq(tmp3, 1); + jcc(Assembler::carryClear, integer); + jcc(Assembler::notZero, integer); + stop("integer indefinite value shouldn't be seen here"); + bind(integer); + } +#endif +#endif + + // get rid of duplicate arguments. Stack: X^Y + if (num_fpu_regs_in_use > 0) { + fxch(); fpop(); + fxch(); fpop(); + } else { + ffree(2); + ffree(1); + } + + testl(tmp2, 1); + jcc(Assembler::zero, done); // X <= 0, Y even: X^Y = abs(X)^Y + // X <= 0, Y even: X^Y = -abs(X)^Y + + fchs(); // Stack: -abs(X)^Y Y + jmp(done); + } + + // slow case: runtime call + bind(slow_case); + + fpop(); // pop incorrect result or int(Y) + + fp_runtime_fallback(is_exp ? CAST_FROM_FN_PTR(address, SharedRuntime::dexp) : CAST_FROM_FN_PTR(address, SharedRuntime::dpow), + is_exp ? 1 : 2, num_fpu_regs_in_use); + + // Come here with result in F-TOS + bind(done); +} + void MacroAssembler::fpop() { ffree(); fincstp(); @@ -7132,6 +7505,24 @@ movb(as_Address(dst), src); } +void MacroAssembler::movdl(XMMRegister dst, AddressLiteral src) { + if (reachable(src)) { + movdl(dst, as_Address(src)); + } else { + lea(rscratch1, src); + movdl(dst, Address(rscratch1, 0)); + } +} + +void MacroAssembler::movq(XMMRegister dst, AddressLiteral src) { + if (reachable(src)) { + movq(dst, as_Address(src)); + } else { + lea(rscratch1, src); + movq(dst, Address(rscratch1, 0)); + } +} + void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) { if (reachable(src)) { if (UseXmmLoadAndClearUpper) { @@ -8045,6 +8436,144 @@ #endif } +void MacroAssembler::fp_runtime_fallback(address runtime_entry, int nb_args, int num_fpu_regs_in_use) { + pusha(); + + // if we are coming from c1, xmm registers may be live + if (UseSSE >= 1) { + subptr(rsp, sizeof(jdouble)* LP64_ONLY(16) NOT_LP64(8)); + } + int off = 0; + if (UseSSE == 1) { + movflt(Address(rsp,off++*sizeof(jdouble)),xmm0); + movflt(Address(rsp,off++*sizeof(jdouble)),xmm1); + movflt(Address(rsp,off++*sizeof(jdouble)),xmm2); + movflt(Address(rsp,off++*sizeof(jdouble)),xmm3); + movflt(Address(rsp,off++*sizeof(jdouble)),xmm4); + movflt(Address(rsp,off++*sizeof(jdouble)),xmm5); + movflt(Address(rsp,off++*sizeof(jdouble)),xmm6); + movflt(Address(rsp,off++*sizeof(jdouble)),xmm7); + } else if (UseSSE >= 2) { + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm0); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm1); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm2); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm3); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm4); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm5); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm6); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm7); +#ifdef _LP64 + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm8); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm9); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm10); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm11); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm12); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm13); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm14); + movdbl(Address(rsp,off++*sizeof(jdouble)),xmm15); +#endif + } + + // Preserve registers across runtime call + int incoming_argument_and_return_value_offset = -1; + if (num_fpu_regs_in_use > 1) { + // Must preserve all other FPU regs (could alternatively convert + // SharedRuntime::dsin, dcos etc. into assembly routines known not to trash + // FPU state, but can not trust C compiler) + NEEDS_CLEANUP; + // NOTE that in this case we also push the incoming argument(s) to + // the stack and restore it later; we also use this stack slot to + // hold the return value from dsin, dcos etc. + for (int i = 0; i < num_fpu_regs_in_use; i++) { + subptr(rsp, sizeof(jdouble)); + fstp_d(Address(rsp, 0)); + } + incoming_argument_and_return_value_offset = sizeof(jdouble)*(num_fpu_regs_in_use-1); + for (int i = nb_args-1; i >= 0; i--) { + fld_d(Address(rsp, incoming_argument_and_return_value_offset-i*sizeof(jdouble))); + } + } + + subptr(rsp, nb_args*sizeof(jdouble)); + for (int i = 0; i < nb_args; i++) { + fstp_d(Address(rsp, i*sizeof(jdouble))); + } + +#ifdef _LP64 + if (nb_args > 0) { + movdbl(xmm0, Address(rsp, 0)); + } + if (nb_args > 1) { + movdbl(xmm1, Address(rsp, sizeof(jdouble))); + } + assert(nb_args <= 2, "unsupported number of args"); +#endif // _LP64 + + // NOTE: we must not use call_VM_leaf here because that requires a + // complete interpreter frame in debug mode -- same bug as 4387334 + // MacroAssembler::call_VM_leaf_base is perfectly safe and will + // do proper 64bit abi + + NEEDS_CLEANUP; + // Need to add stack banging before this runtime call if it needs to + // be taken; however, there is no generic stack banging routine at + // the MacroAssembler level + + MacroAssembler::call_VM_leaf_base(runtime_entry, 0); + +#ifdef _LP64 + movsd(Address(rsp, 0), xmm0); + fld_d(Address(rsp, 0)); +#endif // _LP64 + addptr(rsp, sizeof(jdouble) * nb_args); + if (num_fpu_regs_in_use > 1) { + // Must save return value to stack and then restore entire FPU + // stack except incoming arguments + fstp_d(Address(rsp, incoming_argument_and_return_value_offset)); + for (int i = 0; i < num_fpu_regs_in_use - nb_args; i++) { + fld_d(Address(rsp, 0)); + addptr(rsp, sizeof(jdouble)); + } + fld_d(Address(rsp, (nb_args-1)*sizeof(jdouble))); + addptr(rsp, sizeof(jdouble) * nb_args); + } + + off = 0; + if (UseSSE == 1) { + movflt(xmm0, Address(rsp,off++*sizeof(jdouble))); + movflt(xmm1, Address(rsp,off++*sizeof(jdouble))); + movflt(xmm2, Address(rsp,off++*sizeof(jdouble))); + movflt(xmm3, Address(rsp,off++*sizeof(jdouble))); + movflt(xmm4, Address(rsp,off++*sizeof(jdouble))); + movflt(xmm5, Address(rsp,off++*sizeof(jdouble))); + movflt(xmm6, Address(rsp,off++*sizeof(jdouble))); + movflt(xmm7, Address(rsp,off++*sizeof(jdouble))); + } else if (UseSSE >= 2) { + movdbl(xmm0, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm1, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm2, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm3, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm4, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm5, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm6, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm7, Address(rsp,off++*sizeof(jdouble))); +#ifdef _LP64 + movdbl(xmm8, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm9, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm10, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm11, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm12, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm13, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm14, Address(rsp,off++*sizeof(jdouble))); + movdbl(xmm15, Address(rsp,off++*sizeof(jdouble))); +#endif + } + if (UseSSE >= 1) { + addptr(rsp, sizeof(jdouble)* LP64_ONLY(16) NOT_LP64(8)); + } + popa(); +} + static const double pi_4 = 0.7853981633974483; void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) { @@ -8092,73 +8621,27 @@ // slow case: runtime call bind(slow_case); - // Preserve registers across runtime call - pusha(); - int incoming_argument_and_return_value_offset = -1; - if (num_fpu_regs_in_use > 1) { - // Must preserve all other FPU regs (could alternatively convert - // SharedRuntime::dsin and dcos into assembly routines known not to trash - // FPU state, but can not trust C compiler) - NEEDS_CLEANUP; - // NOTE that in this case we also push the incoming argument to - // the stack and restore it later; we also use this stack slot to - // hold the return value from dsin or dcos. - for (int i = 0; i < num_fpu_regs_in_use; i++) { - subptr(rsp, sizeof(jdouble)); - fstp_d(Address(rsp, 0)); - } - incoming_argument_and_return_value_offset = sizeof(jdouble)*(num_fpu_regs_in_use-1); - fld_d(Address(rsp, incoming_argument_and_return_value_offset)); - } - subptr(rsp, sizeof(jdouble)); - fstp_d(Address(rsp, 0)); -#ifdef _LP64 - movdbl(xmm0, Address(rsp, 0)); -#endif // _LP64 - - // NOTE: we must not use call_VM_leaf here because that requires a - // complete interpreter frame in debug mode -- same bug as 4387334 - // MacroAssembler::call_VM_leaf_base is perfectly safe and will - // do proper 64bit abi - - NEEDS_CLEANUP; - // Need to add stack banging before this runtime call if it needs to - // be taken; however, there is no generic stack banging routine at - // the MacroAssembler level + switch(trig) { case 's': { - MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, SharedRuntime::dsin), 0); + fp_runtime_fallback(CAST_FROM_FN_PTR(address, SharedRuntime::dsin), 1, num_fpu_regs_in_use); } break; case 'c': { - MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, SharedRuntime::dcos), 0); + fp_runtime_fallback(CAST_FROM_FN_PTR(address, SharedRuntime::dcos), 1, num_fpu_regs_in_use); } break; case 't': { - MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), 0); + fp_runtime_fallback(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), 1, num_fpu_regs_in_use); } break; default: assert(false, "bad intrinsic"); break; } -#ifdef _LP64 - movsd(Address(rsp, 0), xmm0); - fld_d(Address(rsp, 0)); -#endif // _LP64 - addptr(rsp, sizeof(jdouble)); - if (num_fpu_regs_in_use > 1) { - // Must save return value to stack and then restore entire FPU stack - fstp_d(Address(rsp, incoming_argument_and_return_value_offset)); - for (int i = 0; i < num_fpu_regs_in_use; i++) { - fld_d(Address(rsp, 0)); - addptr(rsp, sizeof(jdouble)); - } - } - popa(); // Come here with result in F-TOS bind(done); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/assembler_x86.hpp --- a/src/cpu/x86/vm/assembler_x86.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/assembler_x86.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -591,8 +591,9 @@ void vex_prefix(XMMRegister dst, XMMRegister nds, Address src, VexSimdPrefix pre, bool vector256 = false) { - vex_prefix(src, nds->encoding(), dst->encoding(), - pre, VEX_OPCODE_0F, false, vector256); + int dst_enc = dst->encoding(); + int nds_enc = nds->is_valid() ? nds->encoding() : 0; + vex_prefix(src, nds_enc, dst_enc, pre, VEX_OPCODE_0F, false, vector256); } int vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc, @@ -600,9 +601,12 @@ bool vex_w, bool vector256); int vex_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src, - VexSimdPrefix pre, bool vector256 = false) { - return vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), - pre, VEX_OPCODE_0F, false, vector256); + VexSimdPrefix pre, bool vector256 = false, + VexOpcode opc = VEX_OPCODE_0F) { + int src_enc = src->encoding(); + int dst_enc = dst->encoding(); + int nds_enc = nds->is_valid() ? nds->encoding() : 0; + return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, false, vector256); } void simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr, @@ -1148,6 +1152,9 @@ void fxsave(Address dst); void fyl2x(); + void frndint(); + void f2xm1(); + void fldl2e(); void hlt(); @@ -1258,6 +1265,7 @@ void movdl(XMMRegister dst, Register src); void movdl(Register dst, XMMRegister src); void movdl(XMMRegister dst, Address src); + void movdl(Address dst, XMMRegister src); // Move Double Quadword void movdq(XMMRegister dst, Register src); @@ -1271,6 +1279,14 @@ void movdqu(XMMRegister dst, Address src); void movdqu(XMMRegister dst, XMMRegister src); + // Move Unaligned 256bit Vector + void vmovdqu(Address dst, XMMRegister src); + void vmovdqu(XMMRegister dst, Address src); + void vmovdqu(XMMRegister dst, XMMRegister src); + + // Move lower 64bit to high 64bit in 128bit register + void movlhps(XMMRegister dst, XMMRegister src); + void movl(Register dst, int32_t imm32); void movl(Address dst, int32_t imm32); void movl(Register dst, Register src); @@ -1450,6 +1466,9 @@ void punpckldq(XMMRegister dst, XMMRegister src); void punpckldq(XMMRegister dst, Address src); + // Interleave Low Quadwords + void punpcklqdq(XMMRegister dst, XMMRegister src); + #ifndef _LP64 // no 32bit push/pop on amd64 void pushl(Address src); #endif @@ -1590,13 +1609,11 @@ void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0 - // AVX 3-operands instructions (encoded with VEX prefix) + // AVX 3-operands scalar instructions (encoded with VEX prefix) void vaddsd(XMMRegister dst, XMMRegister nds, Address src); void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src); void vaddss(XMMRegister dst, XMMRegister nds, Address src); void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src); - void vandpd(XMMRegister dst, XMMRegister nds, Address src); - void vandps(XMMRegister dst, XMMRegister nds, Address src); void vdivsd(XMMRegister dst, XMMRegister nds, Address src); void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src); void vdivss(XMMRegister dst, XMMRegister nds, Address src); @@ -1609,9 +1626,24 @@ void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src); void vsubss(XMMRegister dst, XMMRegister nds, Address src); void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src); + + // AVX Vector instrucitons. + void vandpd(XMMRegister dst, XMMRegister nds, Address src); + void vandps(XMMRegister dst, XMMRegister nds, Address src); void vxorpd(XMMRegister dst, XMMRegister nds, Address src); void vxorps(XMMRegister dst, XMMRegister nds, Address src); - + void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256); + void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256); + void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256); + void vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src); + void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src); + + // AVX instruction which is used to clear upper 128 bits of YMM registers and + // to avoid transaction penalty between AVX and SSE states. There is no + // penalty if legacy SSE instructions are encoded using VEX prefix because + // they always clear upper 128 bits. It should be used before calling + // runtime code and native libraries. + void vzeroupper(); protected: // Next instructions require address alignment 16 bytes SSE mode. @@ -2387,7 +2419,30 @@ void ldmxcsr(Address src) { Assembler::ldmxcsr(src); } void ldmxcsr(AddressLiteral src); + // compute pow(x,y) and exp(x) with x86 instructions. Don't cover + // all corner cases and may result in NaN and require fallback to a + // runtime call. + void fast_pow(); + void fast_exp(); + void increase_precision(); + void restore_precision(); + + // computes exp(x). Fallback to runtime call included. + void exp_with_fallback(int num_fpu_regs_in_use) { pow_or_exp(true, num_fpu_regs_in_use); } + // computes pow(x,y). Fallback to runtime call included. + void pow_with_fallback(int num_fpu_regs_in_use) { pow_or_exp(false, num_fpu_regs_in_use); } + private: + + // call runtime as a fallback for trig functions and pow/exp. + void fp_runtime_fallback(address runtime_entry, int nb_args, int num_fpu_regs_in_use); + + // computes 2^(Ylog2X); Ylog2X in ST(0) + void pow_exp_core_encoding(); + + // computes pow(x,y) or exp(x). Fallback to runtime call included. + void pow_or_exp(bool is_exp, int num_fpu_regs_in_use); + // these are private because users should be doing movflt/movdbl void movss(Address dst, XMMRegister src) { Assembler::movss(dst, src); } @@ -2503,12 +2558,30 @@ void vsubss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubss(dst, nds, src); } void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src); + // AVX Vector instructions + + void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vxorpd(dst, nds, src, vector256); } void vxorpd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorpd(dst, nds, src); } void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src); + void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vxorps(dst, nds, src, vector256); } void vxorps(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorps(dst, nds, src); } void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src); + void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { + if (UseAVX > 1 || !vector256) // vpxor 256 bit is available only in AVX2 + Assembler::vpxor(dst, nds, src, vector256); + else + Assembler::vxorpd(dst, nds, src, vector256); + } + + // Move packed integer values from low 128 bit to hign 128 bit in 256 bit vector. + void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) { + if (UseAVX > 1) // vinserti128h is available only in AVX2 + Assembler::vinserti128h(dst, nds, src); + else + Assembler::vinsertf128h(dst, nds, src); + } // Data @@ -2561,6 +2634,13 @@ // to avoid hiding movb void movbyte(ArrayAddress dst, int src); + // Import other mov() methods from the parent class or else + // they will be hidden by the following overriding declaration. + using Assembler::movdl; + using Assembler::movq; + void movdl(XMMRegister dst, AddressLiteral src); + void movq(XMMRegister dst, AddressLiteral src); + // Can push value or effective address void pushptr(AddressLiteral src); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/c1_LIRAssembler_x86.cpp --- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -505,19 +505,28 @@ // Get addresses of first characters from both Strings __ 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))); - + if (java_lang_String::has_offset_field()) { + __ movptr (rcx, Address(rax, java_lang_String::offset_offset_in_bytes())); + __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes())); + __ lea (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); + } else { + __ movl (rax, Address(rsi, arrayOopDesc::length_offset_in_bytes())); + __ lea (rsi, Address(rsi, arrayOopDesc::base_offset_in_bytes(T_CHAR))); + } // rbx, may be NULL add_debug_info_for_null_check_here(info); __ 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))); + if (java_lang_String::has_offset_field()) { + __ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes())); + __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes())); + __ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); + } else { + __ movl (rbx, Address(rdi, arrayOopDesc::length_offset_in_bytes())); + __ lea (rdi, Address(rdi, arrayOopDesc::base_offset_in_bytes(T_CHAR))); + } // compute minimum length (in rax) and difference of lengths (on top of stack) - __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes())); - __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes())); __ mov (rcx, rbx); __ subptr(rbx, rax); // subtract lengths __ push (rbx); // result @@ -2437,6 +2446,12 @@ // Should consider not saving rbx, if not necessary __ trigfunc('t', op->as_Op2()->fpu_stack_size()); break; + case lir_exp : + __ exp_with_fallback(op->as_Op2()->fpu_stack_size()); + break; + case lir_pow : + __ pow_with_fallback(op->as_Op2()->fpu_stack_size()); + break; default : ShouldNotReachHere(); } } else { @@ -2658,7 +2673,7 @@ #endif // _LP64 } } else { - ShouldNotReachHere(); + fatal(err_msg("unexpected type: %s", basictype_to_str(c->type()))); } // cpu register - address } else if (opr2->is_address()) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/c1_LIRGenerator_x86.cpp --- a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -718,35 +718,6 @@ } -void LIRGenerator::do_AttemptUpdate(Intrinsic* x) { - assert(x->number_of_arguments() == 3, "wrong type"); - LIRItem obj (x->argument_at(0), this); // AtomicLong object - LIRItem cmp_value (x->argument_at(1), this); // value to compare with field - LIRItem new_value (x->argument_at(2), this); // replace field with new_value if it matches cmp_value - - // compare value must be in rdx,eax (hi,lo); may be destroyed by cmpxchg8 instruction - cmp_value.load_item_force(FrameMap::long0_opr); - - // new value must be in rcx,ebx (hi,lo) - new_value.load_item_force(FrameMap::long1_opr); - - // object pointer register is overwritten with field address - obj.load_item(); - - // generate compare-and-swap; produces zero condition if swap occurs - int value_offset = sun_misc_AtomicLongCSImpl::value_offset(); - LIR_Opr addr = new_pointer_register(); - __ leal(LIR_OprFact::address(new LIR_Address(obj.result(), value_offset, T_LONG)), addr); - LIR_Opr t1 = LIR_OprFact::illegalOpr; // no temp needed - LIR_Opr t2 = LIR_OprFact::illegalOpr; // no temp needed - __ cas_long(addr, cmp_value.result(), new_value.result(), t1, t2); - - // generate conditional move of boolean result - LIR_Opr result = rlock_result(x); - __ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0), result, T_LONG); -} - - void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) { assert(x->number_of_arguments() == 4, "wrong type"); LIRItem obj (x->argument_at(0), this); // object @@ -823,7 +794,7 @@ void LIRGenerator::do_MathIntrinsic(Intrinsic* x) { - assert(x->number_of_arguments() == 1, "wrong type"); + assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type"); LIRItem value(x->argument_at(0), this); bool use_fpu = false; @@ -834,6 +805,8 @@ case vmIntrinsics::_dtan: case vmIntrinsics::_dlog: case vmIntrinsics::_dlog10: + case vmIntrinsics::_dexp: + case vmIntrinsics::_dpow: use_fpu = true; } } else { @@ -843,20 +816,37 @@ value.load_item(); LIR_Opr calc_input = value.result(); + LIR_Opr calc_input2 = NULL; + if (x->id() == vmIntrinsics::_dpow) { + LIRItem extra_arg(x->argument_at(1), this); + if (UseSSE < 2) { + extra_arg.set_destroys_register(); + } + extra_arg.load_item(); + calc_input2 = extra_arg.result(); + } LIR_Opr calc_result = rlock_result(x); - // sin and cos need two free fpu stack slots, so register two temporary operands + // sin, cos, pow and exp need two free fpu stack slots, so register + // two temporary operands LIR_Opr tmp1 = FrameMap::caller_save_fpu_reg_at(0); LIR_Opr tmp2 = FrameMap::caller_save_fpu_reg_at(1); if (use_fpu) { LIR_Opr tmp = FrameMap::fpu0_double_opr; + int tmp_start = 1; + if (calc_input2 != NULL) { + __ move(calc_input2, tmp); + tmp_start = 2; + calc_input2 = tmp; + } __ move(calc_input, tmp); calc_input = tmp; calc_result = tmp; - tmp1 = FrameMap::caller_save_fpu_reg_at(1); - tmp2 = FrameMap::caller_save_fpu_reg_at(2); + + tmp1 = FrameMap::caller_save_fpu_reg_at(tmp_start); + tmp2 = FrameMap::caller_save_fpu_reg_at(tmp_start + 1); } switch(x->id()) { @@ -867,6 +857,8 @@ case vmIntrinsics::_dtan: __ tan (calc_input, calc_result, tmp1, tmp2); break; case vmIntrinsics::_dlog: __ log (calc_input, calc_result, tmp1); break; case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1); break; + case vmIntrinsics::_dexp: __ exp (calc_input, calc_result, tmp1, tmp2, FrameMap::rax_opr, FrameMap::rcx_opr, FrameMap::rdx_opr); break; + case vmIntrinsics::_dpow: __ pow (calc_input, calc_input2, calc_result, tmp1, tmp2, FrameMap::rax_opr, FrameMap::rcx_opr, FrameMap::rdx_opr); break; default: ShouldNotReachHere(); } @@ -1095,10 +1087,10 @@ if (!x->klass()->is_loaded() || PatchALot) { patching_info = state_for(x, x->state_before()); - // cannot re-use same xhandlers for multiple CodeEmitInfos, so - // clone all handlers. This is handled transparently in other - // places by the CodeEmitInfo cloning logic but is handled - // specially here because a stub isn't being used. + // Cannot re-use same xhandlers for multiple CodeEmitInfos, so + // clone all handlers (NOTE: Usually this is handled transparently + // by the CodeEmitInfo cloning logic in CodeStub constructors but + // is done explicitly here because a stub isn't being used). x->set_exception_handlers(new XHandlers(x->exception_handlers())); } CodeEmitInfo* info = state_for(x, x->state()); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/c1_LinearScan_x86.cpp --- a/src/cpu/x86/vm/c1_LinearScan_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/c1_LinearScan_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -690,8 +690,8 @@ case lir_mul_strictfp: case lir_div_strictfp: { - assert(op2->tmp_opr()->is_fpu_register(), "strict operations need temporary fpu stack slot"); - insert_free_if_dead(op2->tmp_opr()); + assert(op2->tmp1_opr()->is_fpu_register(), "strict operations need temporary fpu stack slot"); + insert_free_if_dead(op2->tmp1_opr()); assert(sim()->stack_size() <= 7, "at least one stack slot must be free"); // fall-through: continue with the normal handling of lir_mul and lir_div } @@ -787,16 +787,17 @@ case lir_log: case lir_log10: { - // log and log10 needs one temporary fpu stack slot, so there is ontemporary - // registers stored in temp of the operation. - // the stack allocator must guarantee that the stack slots are really free, - // otherwise there might be a stack overflow. + // log and log10 need one temporary fpu stack slot, so + // there is one temporary registers stored in temp of the + // operation. the stack allocator must guarantee that the stack + // slots are really free, otherwise there might be a stack + // overflow. assert(right->is_illegal(), "must be"); assert(left->is_fpu_register(), "must be"); assert(res->is_fpu_register(), "must be"); - assert(op2->tmp_opr()->is_fpu_register(), "must be"); + assert(op2->tmp1_opr()->is_fpu_register(), "must be"); - insert_free_if_dead(op2->tmp_opr()); + insert_free_if_dead(op2->tmp1_opr()); insert_free_if_dead(res, left); insert_exchange(left); do_rename(left, res); @@ -812,8 +813,9 @@ case lir_tan: case lir_sin: - case lir_cos: { - // sin and cos need two temporary fpu stack slots, so there are two temporary + case lir_cos: + case lir_exp: { + // sin, cos and exp need two temporary fpu stack slots, so there are two temporary // registers (stored in right and temp of the operation). // the stack allocator must guarantee that the stack slots are really free, // otherwise there might be a stack overflow. @@ -821,11 +823,11 @@ assert(res->is_fpu_register(), "must be"); // assert(left->is_last_use(), "old value gets destroyed"); assert(right->is_fpu_register(), "right is used as the first temporary register"); - assert(op2->tmp_opr()->is_fpu_register(), "temp is used as the second temporary register"); - assert(fpu_num(left) != fpu_num(right) && fpu_num(right) != fpu_num(op2->tmp_opr()) && fpu_num(op2->tmp_opr()) != fpu_num(res), "need distinct temp registers"); + assert(op2->tmp1_opr()->is_fpu_register(), "temp is used as the second temporary register"); + assert(fpu_num(left) != fpu_num(right) && fpu_num(right) != fpu_num(op2->tmp1_opr()) && fpu_num(op2->tmp1_opr()) != fpu_num(res), "need distinct temp registers"); insert_free_if_dead(right); - insert_free_if_dead(op2->tmp_opr()); + insert_free_if_dead(op2->tmp1_opr()); insert_free_if_dead(res, left); insert_exchange(left); @@ -839,6 +841,53 @@ break; } + case lir_pow: { + // pow needs two temporary fpu stack slots, so there are two temporary + // registers (stored in tmp1 and tmp2 of the operation). + // the stack allocator must guarantee that the stack slots are really free, + // otherwise there might be a stack overflow. + assert(left->is_fpu_register(), "must be"); + assert(right->is_fpu_register(), "must be"); + assert(res->is_fpu_register(), "must be"); + + assert(op2->tmp1_opr()->is_fpu_register(), "tmp1 is the first temporary register"); + assert(op2->tmp2_opr()->is_fpu_register(), "tmp2 is the second temporary register"); + assert(fpu_num(left) != fpu_num(right) && fpu_num(left) != fpu_num(op2->tmp1_opr()) && fpu_num(left) != fpu_num(op2->tmp2_opr()) && fpu_num(left) != fpu_num(res), "need distinct temp registers"); + assert(fpu_num(right) != fpu_num(op2->tmp1_opr()) && fpu_num(right) != fpu_num(op2->tmp2_opr()) && fpu_num(right) != fpu_num(res), "need distinct temp registers"); + assert(fpu_num(op2->tmp1_opr()) != fpu_num(op2->tmp2_opr()) && fpu_num(op2->tmp1_opr()) != fpu_num(res), "need distinct temp registers"); + assert(fpu_num(op2->tmp2_opr()) != fpu_num(res), "need distinct temp registers"); + + insert_free_if_dead(op2->tmp1_opr()); + insert_free_if_dead(op2->tmp2_opr()); + + // Must bring both operands to top of stack with following operand ordering: + // * fpu stack before pow: ... right left + // * fpu stack after pow: ... left + + insert_free_if_dead(res, right); + + if (tos_offset(right) != 1) { + insert_exchange(right); + insert_exchange(1); + } + insert_exchange(left); + assert(tos_offset(right) == 1, "check"); + assert(tos_offset(left) == 0, "check"); + + new_left = to_fpu_stack_top(left); + new_right = to_fpu_stack(right); + + op2->set_fpu_stack_size(sim()->stack_size()); + assert(sim()->stack_size() <= 6, "at least two stack slots must be free"); + + sim()->pop(); + + do_rename(right, res); + + new_res = to_fpu_stack_top(res); + break; + } + default: { assert(false, "missed a fpu-operation"); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/cppInterpreter_x86.cpp --- a/src/cpu/x86/vm/cppInterpreter_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/cppInterpreter_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -481,7 +481,8 @@ __ xorptr(rdx, rdx); __ movptr(STATE(_oop_temp), rdx); // state->_oop_temp = NULL (only really needed for native) __ movptr(STATE(_mdx), rdx); // state->_mdx = NULL - __ movptr(rdx, Address(rbx, methodOopDesc::constants_offset())); + __ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rdx, Address(rdx, constMethodOopDesc::constants_offset())); __ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes())); __ movptr(STATE(_constants), rdx); // state->_constants = constants() @@ -516,7 +517,8 @@ __ testl(rax, JVM_ACC_STATIC); __ movptr(rax, Address(locals, 0)); // get receiver (assume this is frequent case) __ jcc(Assembler::zero, done); - __ movptr(rax, Address(rbx, methodOopDesc::constants_offset())); + __ movptr(rax, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rax, Address(rax, constMethodOopDesc::constants_offset())); __ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(rax, Address(rax, mirror_offset)); __ bind(done); @@ -769,7 +771,8 @@ __ testl(rax, JVM_ACC_STATIC); __ movptr(rax, Address(rdi, 0)); // get receiver (assume this is frequent case) __ jcc(Assembler::zero, done); - __ movptr(rax, Address(rbx, methodOopDesc::constants_offset())); + __ movptr(rax, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rax, Address(rax, constMethodOopDesc::constants_offset())); __ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(rax, Address(rax, mirror_offset)); __ bind(done); @@ -821,9 +824,9 @@ __ testptr(rax, rax); __ jcc(Assembler::zero, slow_path); - __ movptr(rdi, Address(rbx, methodOopDesc::constants_offset())); // read first instruction word and extract bytecode @ 1 and index @ 2 __ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rdi, Address(rdx, constMethodOopDesc::constants_offset())); __ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset())); // Shift codes right to get the index on the right. // The bytecode fetched looks like <0xb4><0x2a> @@ -1185,7 +1188,8 @@ __ testl(t, JVM_ACC_STATIC); __ jcc(Assembler::zero, L); // get mirror - __ movptr(t, Address(method, methodOopDesc:: constants_offset())); + __ movptr(t, Address(method, methodOopDesc:: const_offset())); + __ movptr(t, Address(t, constMethodOopDesc::constants_offset())); __ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(t, Address(t, mirror_offset)); // copy mirror into activation object diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/interp_masm_x86_32.hpp --- a/src/cpu/x86/vm/interp_masm_x86_32.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/interp_masm_x86_32.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -77,7 +77,8 @@ // Helpers for runtime call arguments/results void get_method(Register reg) { movptr(reg, Address(rbp, frame::interpreter_frame_method_offset * wordSize)); } - void get_constant_pool(Register reg) { get_method(reg); movptr(reg, Address(reg, methodOopDesc::constants_offset())); } + void get_const(Register reg) { get_method(reg); movptr(reg, Address(reg, methodOopDesc::const_offset())); } + void get_constant_pool(Register reg) { get_const(reg); movptr(reg, Address(reg, constMethodOopDesc::constants_offset())); } void get_constant_pool_cache(Register reg) { get_constant_pool(reg); movptr(reg, Address(reg, constantPoolOopDesc::cache_offset_in_bytes())); } void get_cpool_and_tags(Register cpool, Register tags) { get_constant_pool(cpool); movptr(tags, Address(cpool, constantPoolOopDesc::tags_offset_in_bytes())); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/interp_masm_x86_64.hpp --- a/src/cpu/x86/vm/interp_masm_x86_64.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/interp_masm_x86_64.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -84,9 +84,14 @@ movptr(reg, Address(rbp, frame::interpreter_frame_method_offset * wordSize)); } - void get_constant_pool(Register reg) { + void get_const(Register reg) { get_method(reg); - movptr(reg, Address(reg, methodOopDesc::constants_offset())); + movptr(reg, Address(reg, methodOopDesc::const_offset())); + } + + void get_constant_pool(Register reg) { + get_const(reg); + movptr(reg, Address(reg, constMethodOopDesc::constants_offset())); } void get_constant_pool_cache(Register reg) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/interpreter_x86_32.cpp --- a/src/cpu/x86/vm/interpreter_x86_32.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/interpreter_x86_32.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -181,6 +181,19 @@ __ push_fTOS(); __ pop_fTOS(); break; + case Interpreter::java_lang_math_pow: + __ fld_d(Address(rsp, 3*wordSize)); // second argument + __ pow_with_fallback(0); + // Store to stack to convert 80bit precision back to 64bits + __ push_fTOS(); + __ pop_fTOS(); + break; + case Interpreter::java_lang_math_exp: + __ exp_with_fallback(0); + // Store to stack to convert 80bit precision back to 64bits + __ push_fTOS(); + __ pop_fTOS(); + break; default : ShouldNotReachHere(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/interpreter_x86_64.cpp --- a/src/cpu/x86/vm/interpreter_x86_64.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/interpreter_x86_64.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -271,6 +271,14 @@ case Interpreter::java_lang_math_log10: __ flog10(); break; + case Interpreter::java_lang_math_pow: + __ fld_d(Address(rsp, 3*wordSize)); // second argument (one + // empty stack slot) + __ pow_with_fallback(0); + break; + case Interpreter::java_lang_math_exp: + __ exp_with_fallback(0); + break; default : ShouldNotReachHere(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/register_x86.cpp --- a/src/cpu/x86/vm/register_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/register_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ const int ConcreteRegisterImpl::max_fpr = ConcreteRegisterImpl::max_gpr + 2 * FloatRegisterImpl::number_of_registers; const int ConcreteRegisterImpl::max_xmm = ConcreteRegisterImpl::max_fpr + - 2 * XMMRegisterImpl::number_of_registers; + 8 * XMMRegisterImpl::number_of_registers; const char* RegisterImpl::name() const { const char* names[number_of_registers] = { #ifndef AMD64 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/register_x86.hpp --- a/src/cpu/x86/vm/register_x86.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/register_x86.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -158,7 +158,7 @@ XMMRegister successor() const { return as_XMMRegister(encoding() + 1); } // accessors - int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; } + int encoding() const { assert(is_valid(), err_msg("invalid register (%d)", (int)(intptr_t)this )); return (intptr_t)this; } bool is_valid() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_registers; } const char* name() const; }; @@ -216,7 +216,7 @@ RegisterImpl::number_of_registers + // "H" half of a 64bit register #endif // AMD64 2 * FloatRegisterImpl::number_of_registers + - 2 * XMMRegisterImpl::number_of_registers + + 8 * XMMRegisterImpl::number_of_registers + 1 // eflags }; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/stubGenerator_x86_32.cpp --- a/src/cpu/x86/vm/stubGenerator_x86_32.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/stubGenerator_x86_32.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -2136,11 +2136,23 @@ __ trigfunc('t'); __ ret(0); } + { + StubCodeMark mark(this, "StubRoutines", "exp"); + StubRoutines::_intrinsic_exp = (double (*)(double)) __ pc(); - // The intrinsic version of these seem to return the same value as - // the strict version. - StubRoutines::_intrinsic_exp = SharedRuntime::dexp; - StubRoutines::_intrinsic_pow = SharedRuntime::dpow; + __ fld_d(Address(rsp, 4)); + __ exp_with_fallback(0); + __ ret(0); + } + { + StubCodeMark mark(this, "StubRoutines", "pow"); + StubRoutines::_intrinsic_pow = (double (*)(double,double)) __ pc(); + + __ fld_d(Address(rsp, 12)); + __ fld_d(Address(rsp, 4)); + __ pow_with_fallback(0); + __ ret(0); + } } public: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/stubGenerator_x86_64.cpp --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -2928,11 +2928,34 @@ __ addq(rsp, 8); __ ret(0); } - - // The intrinsic version of these seem to return the same value as - // the strict version. - StubRoutines::_intrinsic_exp = SharedRuntime::dexp; - StubRoutines::_intrinsic_pow = SharedRuntime::dpow; + { + StubCodeMark mark(this, "StubRoutines", "exp"); + StubRoutines::_intrinsic_exp = (double (*)(double)) __ pc(); + + __ subq(rsp, 8); + __ movdbl(Address(rsp, 0), xmm0); + __ fld_d(Address(rsp, 0)); + __ exp_with_fallback(0); + __ fstp_d(Address(rsp, 0)); + __ movdbl(xmm0, Address(rsp, 0)); + __ addq(rsp, 8); + __ ret(0); + } + { + StubCodeMark mark(this, "StubRoutines", "pow"); + StubRoutines::_intrinsic_pow = (double (*)(double,double)) __ pc(); + + __ subq(rsp, 8); + __ movdbl(Address(rsp, 0), xmm1); + __ fld_d(Address(rsp, 0)); + __ movdbl(Address(rsp, 0), xmm0); + __ fld_d(Address(rsp, 0)); + __ pow_with_fallback(0); + __ fstp_d(Address(rsp, 0)); + __ movdbl(xmm0, Address(rsp, 0)); + __ addq(rsp, 8); + __ ret(0); + } } #undef __ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/templateInterpreter_x86_32.cpp --- a/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -566,7 +566,8 @@ __ testl(rax, JVM_ACC_STATIC); __ movptr(rax, Address(rdi, Interpreter::local_offset_in_bytes(0))); // get receiver (assume this is frequent case) __ jcc(Assembler::zero, done); - __ movptr(rax, Address(rbx, methodOopDesc::constants_offset())); + __ movptr(rax, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rax, Address(rax, constMethodOopDesc::constants_offset())); __ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(rax, Address(rax, mirror_offset)); __ bind(done); @@ -606,7 +607,8 @@ __ push(0); } - __ movptr(rdx, Address(rbx, methodOopDesc::constants_offset())); + __ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rdx, Address(rdx, constMethodOopDesc::constants_offset())); __ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes())); __ push(rdx); // set constant pool cache __ push(rdi); // set locals pointer @@ -661,9 +663,9 @@ __ testptr(rax, rax); __ jcc(Assembler::zero, slow_path); - __ movptr(rdi, Address(rbx, methodOopDesc::constants_offset())); // read first instruction word and extract bytecode @ 1 and index @ 2 __ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rdi, Address(rdx, constMethodOopDesc::constants_offset())); __ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset())); // Shift codes right to get the index on the right. // The bytecode fetched looks like <0xb4><0x2a> @@ -1026,7 +1028,8 @@ __ testl(t, JVM_ACC_STATIC); __ jcc(Assembler::zero, L); // get mirror - __ movptr(t, Address(method, methodOopDesc:: constants_offset())); + __ movptr(t, Address(method, methodOopDesc:: const_offset())); + __ movptr(t, Address(t, constMethodOopDesc::constants_offset())); __ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(t, Address(t, mirror_offset)); // copy mirror into activation frame @@ -1518,7 +1521,9 @@ case Interpreter::java_lang_math_abs : // fall thru case Interpreter::java_lang_math_log : // fall thru case Interpreter::java_lang_math_log10 : // fall thru - case Interpreter::java_lang_math_sqrt : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind); break; + case Interpreter::java_lang_math_sqrt : // fall thru + case Interpreter::java_lang_math_pow : // fall thru + case Interpreter::java_lang_math_exp : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind); break; case Interpreter::java_lang_ref_reference_get : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; default : ShouldNotReachHere(); break; @@ -1540,7 +1545,9 @@ case Interpreter::java_lang_math_abs : // fall thru case Interpreter::java_lang_math_log : // fall thru case Interpreter::java_lang_math_log10 : // fall thru - case Interpreter::java_lang_math_sqrt : + case Interpreter::java_lang_math_sqrt : // fall thru + case Interpreter::java_lang_math_pow : // fall thru + case Interpreter::java_lang_math_exp : return false; default: return true; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/templateInterpreter_x86_64.cpp --- a/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -522,7 +522,8 @@ // get receiver (assume this is frequent case) __ movptr(rax, Address(r14, Interpreter::local_offset_in_bytes(0))); __ jcc(Assembler::zero, done); - __ movptr(rax, Address(rbx, methodOopDesc::constants_offset())); + __ movptr(rax, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rax, Address(rax, constMethodOopDesc::constants_offset())); __ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(rax, Address(rax, mirror_offset)); @@ -579,7 +580,8 @@ __ push(0); } - __ movptr(rdx, Address(rbx, methodOopDesc::constants_offset())); + __ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rdx, Address(rdx, constMethodOopDesc::constants_offset())); __ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes())); __ push(rdx); // set constant pool cache __ push(r14); // set locals pointer @@ -629,9 +631,9 @@ __ testptr(rax, rax); __ jcc(Assembler::zero, slow_path); - __ movptr(rdi, Address(rbx, methodOopDesc::constants_offset())); // read first instruction word and extract bytecode @ 1 and index @ 2 __ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); + __ movptr(rdi, Address(rdx, constMethodOopDesc::constants_offset())); __ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset())); // Shift codes right to get the index on the right. // The bytecode fetched looks like <0xb4><0x2a> @@ -1020,7 +1022,8 @@ __ testl(t, JVM_ACC_STATIC); __ jcc(Assembler::zero, L); // get mirror - __ movptr(t, Address(method, methodOopDesc::constants_offset())); + __ movptr(t, Address(method, methodOopDesc::const_offset())); + __ movptr(t, Address(t, constMethodOopDesc::constants_offset())); __ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(t, Address(t, mirror_offset)); // copy mirror into activation frame @@ -1534,7 +1537,9 @@ case Interpreter::java_lang_math_abs : // fall thru case Interpreter::java_lang_math_log : // fall thru case Interpreter::java_lang_math_log10 : // fall thru - case Interpreter::java_lang_math_sqrt : entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind); break; + case Interpreter::java_lang_math_sqrt : // fall thru + case Interpreter::java_lang_math_pow : // fall thru + case Interpreter::java_lang_math_exp : entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind); break; case Interpreter::java_lang_ref_reference_get : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; default : ShouldNotReachHere(); break; @@ -1558,7 +1563,9 @@ case Interpreter::java_lang_math_abs : // fall thru case Interpreter::java_lang_math_log : // fall thru case Interpreter::java_lang_math_log10 : // fall thru - case Interpreter::java_lang_math_sqrt : + case Interpreter::java_lang_math_sqrt : // fall thru + case Interpreter::java_lang_math_pow : // fall thru + case Interpreter::java_lang_math_exp : return false; default: return true; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/vm_version_x86.cpp --- a/src/cpu/x86/vm/vm_version_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/vm_version_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -467,6 +467,32 @@ if (!supports_avx ()) // Drop to 0 if no AVX support UseAVX = 0; +#ifdef COMPILER2 + if (UseFPUForSpilling) { + if (UseSSE < 2) { + // Only supported with SSE2+ + FLAG_SET_DEFAULT(UseFPUForSpilling, false); + } + } + if (MaxVectorSize > 0) { + if (!is_power_of_2(MaxVectorSize)) { + warning("MaxVectorSize must be a power of 2"); + FLAG_SET_DEFAULT(MaxVectorSize, 32); + } + if (MaxVectorSize > 32) { + FLAG_SET_DEFAULT(MaxVectorSize, 32); + } + if (MaxVectorSize > 16 && UseAVX == 0) { + // Only supported with AVX+ + FLAG_SET_DEFAULT(MaxVectorSize, 16); + } + if (UseSSE < 2) { + // Only supported with SSE2+ + FLAG_SET_DEFAULT(MaxVectorSize, 0); + } + } +#endif + // On new cpus instructions which update whole XMM register should be used // to prevent partial register stall due to dependencies on high half. // @@ -536,7 +562,7 @@ AllocatePrefetchInstr = 3; } // On family 15h processors use XMM and UnalignedLoadStores for Array Copy - if( FLAG_IS_DEFAULT(UseXMMForArrayCopy) ) { + if( supports_sse2() && FLAG_IS_DEFAULT(UseXMMForArrayCopy) ) { UseXMMForArrayCopy = true; } if( FLAG_IS_DEFAULT(UseUnalignedLoadStores) && UseXMMForArrayCopy ) { @@ -544,6 +570,12 @@ } } +#ifdef COMPILER2 + if (MaxVectorSize > 16) { + // Limit vectors size to 16 bytes on current AMD cpus. + FLAG_SET_DEFAULT(MaxVectorSize, 16); + } +#endif // COMPILER2 } if( is_intel() ) { // Intel cpus specific settings @@ -606,15 +638,6 @@ FLAG_SET_DEFAULT(UsePopCountInstruction, false); } -#ifdef COMPILER2 - if (UseFPUForSpilling) { - if (UseSSE < 2) { - // Only supported with SSE2+ - FLAG_SET_DEFAULT(UseFPUForSpilling, false); - } - } -#endif - assert(0 <= ReadPrefetchInstr && ReadPrefetchInstr <= 3, "invalid value"); assert(0 <= AllocatePrefetchInstr && AllocatePrefetchInstr <= 3, "invalid value"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/vmreg_x86.cpp --- a/src/cpu/x86/vm/vmreg_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/vmreg_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,8 +48,9 @@ XMMRegister xreg = ::as_XMMRegister(0); for ( ; i < ConcreteRegisterImpl::max_xmm ; ) { - regName[i++] = xreg->name(); - regName[i++] = xreg->name(); + for (int j = 0 ; j < 8 ; j++) { + regName[i++] = xreg->name(); + } xreg = xreg->successor(); } for ( ; i < ConcreteRegisterImpl::number_of_registers ; i ++ ) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/vmreg_x86.inline.hpp --- a/src/cpu/x86/vm/vmreg_x86.inline.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/vmreg_x86.inline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ } inline VMReg XMMRegisterImpl::as_VMReg() { - return VMRegImpl::as_VMReg((encoding() << 1) + ConcreteRegisterImpl::max_fpr); + return VMRegImpl::as_VMReg((encoding() << 3) + ConcreteRegisterImpl::max_fpr); } @@ -75,7 +75,7 @@ inline XMMRegister VMRegImpl::as_XMMRegister() { assert( is_XMMRegister() && is_even(value()), "must be" ); // Yuk - return ::as_XMMRegister((value() - ConcreteRegisterImpl::max_fpr) >> 1); + return ::as_XMMRegister((value() - ConcreteRegisterImpl::max_fpr) >> 3); } inline bool VMRegImpl::is_concrete() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/x86.ad --- a/src/cpu/x86/vm/x86.ad Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/x86.ad Thu Aug 02 14:29:12 2012 -0700 @@ -24,6 +24,456 @@ // X86 Common Architecture Description File +//----------REGISTER DEFINITION BLOCK------------------------------------------ +// This information is used by the matcher and the register allocator to +// describe individual registers and classes of registers within the target +// archtecture. + +register %{ +//----------Architecture Description Register Definitions---------------------- +// General Registers +// "reg_def" name ( register save type, C convention save type, +// ideal register type, encoding ); +// Register Save Types: +// +// NS = No-Save: The register allocator assumes that these registers +// can be used without saving upon entry to the method, & +// that they do not need to be saved at call sites. +// +// SOC = Save-On-Call: The register allocator assumes that these registers +// can be used without saving upon entry to the method, +// but that they must be saved at call sites. +// +// SOE = Save-On-Entry: The register allocator assumes that these registers +// must be saved before using them upon entry to the +// method, but they do not need to be saved at call +// sites. +// +// AS = Always-Save: The register allocator assumes that these registers +// must be saved before using them upon entry to the +// method, & that they must be saved at call sites. +// +// Ideal Register Type is used to determine how to save & restore a +// register. Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get +// spilled with LoadP/StoreP. If the register supports both, use Op_RegI. +// +// The encoding number is the actual bit-pattern placed into the opcodes. + +// XMM registers. 256-bit registers or 8 words each, labeled (a)-h. +// Word a in each register holds a Float, words ab hold a Double. +// The whole registers are used in SSE4.2 version intrinsics, +// array copy stubs and superword operations (see UseSSE42Intrinsics, +// UseXMMForArrayCopy and UseSuperword flags). +// XMM8-XMM15 must be encoded with REX (VEX for UseAVX). +// Linux ABI: No register preserved across function calls +// XMM0-XMM7 might hold parameters +// Windows ABI: XMM6-XMM15 preserved across function calls +// XMM0-XMM3 might hold parameters + +reg_def XMM0 ( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()); +reg_def XMM0b( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(1)); +reg_def XMM0c( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(2)); +reg_def XMM0d( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(3)); +reg_def XMM0e( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(4)); +reg_def XMM0f( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(5)); +reg_def XMM0g( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(6)); +reg_def XMM0h( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(7)); + +reg_def XMM1 ( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()); +reg_def XMM1b( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(1)); +reg_def XMM1c( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(2)); +reg_def XMM1d( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(3)); +reg_def XMM1e( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(4)); +reg_def XMM1f( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(5)); +reg_def XMM1g( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(6)); +reg_def XMM1h( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(7)); + +reg_def XMM2 ( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()); +reg_def XMM2b( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(1)); +reg_def XMM2c( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(2)); +reg_def XMM2d( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(3)); +reg_def XMM2e( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(4)); +reg_def XMM2f( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(5)); +reg_def XMM2g( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(6)); +reg_def XMM2h( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(7)); + +reg_def XMM3 ( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()); +reg_def XMM3b( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(1)); +reg_def XMM3c( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(2)); +reg_def XMM3d( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(3)); +reg_def XMM3e( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(4)); +reg_def XMM3f( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(5)); +reg_def XMM3g( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(6)); +reg_def XMM3h( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(7)); + +reg_def XMM4 ( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()); +reg_def XMM4b( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(1)); +reg_def XMM4c( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(2)); +reg_def XMM4d( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(3)); +reg_def XMM4e( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(4)); +reg_def XMM4f( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(5)); +reg_def XMM4g( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(6)); +reg_def XMM4h( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(7)); + +reg_def XMM5 ( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()); +reg_def XMM5b( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(1)); +reg_def XMM5c( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(2)); +reg_def XMM5d( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(3)); +reg_def XMM5e( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(4)); +reg_def XMM5f( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(5)); +reg_def XMM5g( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(6)); +reg_def XMM5h( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(7)); + +#ifdef _WIN64 + +reg_def XMM6 ( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()); +reg_def XMM6b( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(1)); +reg_def XMM6c( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(2)); +reg_def XMM6d( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(3)); +reg_def XMM6e( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(4)); +reg_def XMM6f( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(5)); +reg_def XMM6g( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(6)); +reg_def XMM6h( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(7)); + +reg_def XMM7 ( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()); +reg_def XMM7b( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(1)); +reg_def XMM7c( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(2)); +reg_def XMM7d( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(3)); +reg_def XMM7e( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(4)); +reg_def XMM7f( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(5)); +reg_def XMM7g( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(6)); +reg_def XMM7h( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(7)); + +reg_def XMM8 ( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()); +reg_def XMM8b( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(1)); +reg_def XMM8c( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(2)); +reg_def XMM8d( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(3)); +reg_def XMM8e( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(4)); +reg_def XMM8f( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(5)); +reg_def XMM8g( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(6)); +reg_def XMM8h( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(7)); + +reg_def XMM9 ( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()); +reg_def XMM9b( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(1)); +reg_def XMM9c( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(2)); +reg_def XMM9d( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(3)); +reg_def XMM9e( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(4)); +reg_def XMM9f( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(5)); +reg_def XMM9g( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(6)); +reg_def XMM9h( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(7)); + +reg_def XMM10 ( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()); +reg_def XMM10b( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(1)); +reg_def XMM10c( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(2)); +reg_def XMM10d( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(3)); +reg_def XMM10e( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(4)); +reg_def XMM10f( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(5)); +reg_def XMM10g( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(6)); +reg_def XMM10h( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(7)); + +reg_def XMM11 ( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()); +reg_def XMM11b( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(1)); +reg_def XMM11c( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(2)); +reg_def XMM11d( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(3)); +reg_def XMM11e( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(4)); +reg_def XMM11f( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(5)); +reg_def XMM11g( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(6)); +reg_def XMM11h( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(7)); + +reg_def XMM12 ( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()); +reg_def XMM12b( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(1)); +reg_def XMM12c( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(2)); +reg_def XMM12d( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(3)); +reg_def XMM12e( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(4)); +reg_def XMM12f( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(5)); +reg_def XMM12g( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(6)); +reg_def XMM12h( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(7)); + +reg_def XMM13 ( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()); +reg_def XMM13b( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(1)); +reg_def XMM13c( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(2)); +reg_def XMM13d( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(3)); +reg_def XMM13e( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(4)); +reg_def XMM13f( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(5)); +reg_def XMM13g( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(6)); +reg_def XMM13h( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(7)); + +reg_def XMM14 ( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()); +reg_def XMM14b( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(1)); +reg_def XMM14c( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(2)); +reg_def XMM14d( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(3)); +reg_def XMM14e( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(4)); +reg_def XMM14f( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(5)); +reg_def XMM14g( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(6)); +reg_def XMM14h( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(7)); + +reg_def XMM15 ( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()); +reg_def XMM15b( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(1)); +reg_def XMM15c( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(2)); +reg_def XMM15d( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(3)); +reg_def XMM15e( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(4)); +reg_def XMM15f( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(5)); +reg_def XMM15g( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(6)); +reg_def XMM15h( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(7)); + +#else // _WIN64 + +reg_def XMM6 ( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()); +reg_def XMM6b( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(1)); +reg_def XMM6c( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(2)); +reg_def XMM6d( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(3)); +reg_def XMM6e( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(4)); +reg_def XMM6f( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(5)); +reg_def XMM6g( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(6)); +reg_def XMM6h( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(7)); + +reg_def XMM7 ( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()); +reg_def XMM7b( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(1)); +reg_def XMM7c( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(2)); +reg_def XMM7d( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(3)); +reg_def XMM7e( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(4)); +reg_def XMM7f( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(5)); +reg_def XMM7g( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(6)); +reg_def XMM7h( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(7)); + +#ifdef _LP64 + +reg_def XMM8 ( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()); +reg_def XMM8b( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(1)); +reg_def XMM8c( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(2)); +reg_def XMM8d( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(3)); +reg_def XMM8e( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(4)); +reg_def XMM8f( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(5)); +reg_def XMM8g( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(6)); +reg_def XMM8h( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(7)); + +reg_def XMM9 ( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()); +reg_def XMM9b( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(1)); +reg_def XMM9c( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(2)); +reg_def XMM9d( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(3)); +reg_def XMM9e( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(4)); +reg_def XMM9f( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(5)); +reg_def XMM9g( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(6)); +reg_def XMM9h( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(7)); + +reg_def XMM10 ( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()); +reg_def XMM10b( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(1)); +reg_def XMM10c( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(2)); +reg_def XMM10d( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(3)); +reg_def XMM10e( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(4)); +reg_def XMM10f( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(5)); +reg_def XMM10g( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(6)); +reg_def XMM10h( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(7)); + +reg_def XMM11 ( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()); +reg_def XMM11b( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(1)); +reg_def XMM11c( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(2)); +reg_def XMM11d( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(3)); +reg_def XMM11e( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(4)); +reg_def XMM11f( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(5)); +reg_def XMM11g( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(6)); +reg_def XMM11h( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(7)); + +reg_def XMM12 ( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()); +reg_def XMM12b( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(1)); +reg_def XMM12c( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(2)); +reg_def XMM12d( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(3)); +reg_def XMM12e( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(4)); +reg_def XMM12f( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(5)); +reg_def XMM12g( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(6)); +reg_def XMM12h( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(7)); + +reg_def XMM13 ( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()); +reg_def XMM13b( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(1)); +reg_def XMM13c( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(2)); +reg_def XMM13d( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(3)); +reg_def XMM13e( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(4)); +reg_def XMM13f( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(5)); +reg_def XMM13g( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(6)); +reg_def XMM13h( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(7)); + +reg_def XMM14 ( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()); +reg_def XMM14b( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(1)); +reg_def XMM14c( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(2)); +reg_def XMM14d( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(3)); +reg_def XMM14e( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(4)); +reg_def XMM14f( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(5)); +reg_def XMM14g( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(6)); +reg_def XMM14h( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(7)); + +reg_def XMM15 ( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()); +reg_def XMM15b( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(1)); +reg_def XMM15c( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(2)); +reg_def XMM15d( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(3)); +reg_def XMM15e( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(4)); +reg_def XMM15f( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(5)); +reg_def XMM15g( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(6)); +reg_def XMM15h( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(7)); + +#endif // _LP64 + +#endif // _WIN64 + +#ifdef _LP64 +reg_def RFLAGS(SOC, SOC, 0, 16, VMRegImpl::Bad()); +#else +reg_def RFLAGS(SOC, SOC, 0, 8, VMRegImpl::Bad()); +#endif // _LP64 + +alloc_class chunk1(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h, + XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h, + XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h, + XMM3, XMM3b, XMM3c, XMM3d, XMM3e, XMM3f, XMM3g, XMM3h, + XMM4, XMM4b, XMM4c, XMM4d, XMM4e, XMM4f, XMM4g, XMM4h, + XMM5, XMM5b, XMM5c, XMM5d, XMM5e, XMM5f, XMM5g, XMM5h, + XMM6, XMM6b, XMM6c, XMM6d, XMM6e, XMM6f, XMM6g, XMM6h, + XMM7, XMM7b, XMM7c, XMM7d, XMM7e, XMM7f, XMM7g, XMM7h +#ifdef _LP64 + ,XMM8, XMM8b, XMM8c, XMM8d, XMM8e, XMM8f, XMM8g, XMM8h, + XMM9, XMM9b, XMM9c, XMM9d, XMM9e, XMM9f, XMM9g, XMM9h, + XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h, + XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h, + XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h, + XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h, + XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h, + XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h +#endif + ); + +// flags allocation class should be last. +alloc_class chunk2(RFLAGS); + +// Singleton class for condition codes +reg_class int_flags(RFLAGS); + +// Class for all float registers +reg_class float_reg(XMM0, + XMM1, + XMM2, + XMM3, + XMM4, + XMM5, + XMM6, + XMM7 +#ifdef _LP64 + ,XMM8, + XMM9, + XMM10, + XMM11, + XMM12, + XMM13, + XMM14, + XMM15 +#endif + ); + +// Class for all double registers +reg_class double_reg(XMM0, XMM0b, + XMM1, XMM1b, + XMM2, XMM2b, + XMM3, XMM3b, + XMM4, XMM4b, + XMM5, XMM5b, + XMM6, XMM6b, + XMM7, XMM7b +#ifdef _LP64 + ,XMM8, XMM8b, + XMM9, XMM9b, + XMM10, XMM10b, + XMM11, XMM11b, + XMM12, XMM12b, + XMM13, XMM13b, + XMM14, XMM14b, + XMM15, XMM15b +#endif + ); + +// Class for all 32bit vector registers +reg_class vectors_reg(XMM0, + XMM1, + XMM2, + XMM3, + XMM4, + XMM5, + XMM6, + XMM7 +#ifdef _LP64 + ,XMM8, + XMM9, + XMM10, + XMM11, + XMM12, + XMM13, + XMM14, + XMM15 +#endif + ); + +// Class for all 64bit vector registers +reg_class vectord_reg(XMM0, XMM0b, + XMM1, XMM1b, + XMM2, XMM2b, + XMM3, XMM3b, + XMM4, XMM4b, + XMM5, XMM5b, + XMM6, XMM6b, + XMM7, XMM7b +#ifdef _LP64 + ,XMM8, XMM8b, + XMM9, XMM9b, + XMM10, XMM10b, + XMM11, XMM11b, + XMM12, XMM12b, + XMM13, XMM13b, + XMM14, XMM14b, + XMM15, XMM15b +#endif + ); + +// Class for all 128bit vector registers +reg_class vectorx_reg(XMM0, XMM0b, XMM0c, XMM0d, + XMM1, XMM1b, XMM1c, XMM1d, + XMM2, XMM2b, XMM2c, XMM2d, + XMM3, XMM3b, XMM3c, XMM3d, + XMM4, XMM4b, XMM4c, XMM4d, + XMM5, XMM5b, XMM5c, XMM5d, + XMM6, XMM6b, XMM6c, XMM6d, + XMM7, XMM7b, XMM7c, XMM7d +#ifdef _LP64 + ,XMM8, XMM8b, XMM8c, XMM8d, + XMM9, XMM9b, XMM9c, XMM9d, + XMM10, XMM10b, XMM10c, XMM10d, + XMM11, XMM11b, XMM11c, XMM11d, + XMM12, XMM12b, XMM12c, XMM12d, + XMM13, XMM13b, XMM13c, XMM13d, + XMM14, XMM14b, XMM14c, XMM14d, + XMM15, XMM15b, XMM15c, XMM15d +#endif + ); + +// Class for all 256bit vector registers +reg_class vectory_reg(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h, + XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h, + XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h, + XMM3, XMM3b, XMM3c, XMM3d, XMM3e, XMM3f, XMM3g, XMM3h, + XMM4, XMM4b, XMM4c, XMM4d, XMM4e, XMM4f, XMM4g, XMM4h, + XMM5, XMM5b, XMM5c, XMM5d, XMM5e, XMM5f, XMM5g, XMM5h, + XMM6, XMM6b, XMM6c, XMM6d, XMM6e, XMM6f, XMM6g, XMM6h, + XMM7, XMM7b, XMM7c, XMM7d, XMM7e, XMM7f, XMM7g, XMM7h +#ifdef _LP64 + ,XMM8, XMM8b, XMM8c, XMM8d, XMM8e, XMM8f, XMM8g, XMM8h, + XMM9, XMM9b, XMM9c, XMM9d, XMM9e, XMM9f, XMM9g, XMM9h, + XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h, + XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h, + XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h, + XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h, + XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h, + XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h +#endif + ); + +%} + source %{ // Float masks come from different places depending on platform. #ifdef _LP64 @@ -38,6 +488,252 @@ static address double_signflip() { return (address)double_signflip_pool; } #endif +// Map Types to machine register types +const int Matcher::base2reg[Type::lastype] = { + Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN, + Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */ + Op_VecS, Op_VecD, Op_VecX, Op_VecY, /* Vectors */ + Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */ + 0, 0/*abio*/, + Op_RegP /* Return address */, 0, /* the memories */ + Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD, + 0 /*bottom*/ +}; + +// Max vector size in bytes. 0 if not supported. +const int Matcher::vector_width_in_bytes(BasicType bt) { + assert(is_java_primitive(bt), "only primitive type vectors"); + if (UseSSE < 2) return 0; + // SSE2 supports 128bit vectors for all types. + // AVX2 supports 256bit vectors for all types. + int size = (UseAVX > 1) ? 32 : 16; + // AVX1 supports 256bit vectors only for FLOAT and DOUBLE. + if (UseAVX > 0 && (bt == T_FLOAT || bt == T_DOUBLE)) + size = 32; + // Use flag to limit vector size. + size = MIN2(size,(int)MaxVectorSize); + // Minimum 2 values in vector (or 4 for bytes). + switch (bt) { + case T_DOUBLE: + case T_LONG: + if (size < 16) return 0; + case T_FLOAT: + case T_INT: + if (size < 8) return 0; + case T_BOOLEAN: + case T_BYTE: + case T_CHAR: + case T_SHORT: + if (size < 4) return 0; + break; + default: + ShouldNotReachHere(); + } + return size; +} + +// Limits on vector size (number of elements) loaded into vector. +const int Matcher::max_vector_size(const BasicType bt) { + return vector_width_in_bytes(bt)/type2aelembytes(bt); +} +const int Matcher::min_vector_size(const BasicType bt) { + int max_size = max_vector_size(bt); + // Min size which can be loaded into vector is 4 bytes. + int size = (type2aelembytes(bt) == 1) ? 4 : 2; + return MIN2(size,max_size); +} + +// Vector ideal reg corresponding to specidied size in bytes +const int Matcher::vector_ideal_reg(int size) { + assert(MaxVectorSize >= size, ""); + switch(size) { + case 4: return Op_VecS; + case 8: return Op_VecD; + case 16: return Op_VecX; + case 32: return Op_VecY; + } + ShouldNotReachHere(); + return 0; +} + +// x86 supports misaligned vectors store/load. +const bool Matcher::misaligned_vectors_ok() { + return !AlignVector; // can be changed by flag +} + +// Helper methods for MachSpillCopyNode::implementation(). +static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo, + int src_hi, int dst_hi, uint ireg, outputStream* st) { + // In 64-bit VM size calculation is very complex. Emitting instructions + // into scratch buffer is used to get size in 64-bit VM. + LP64_ONLY( assert(!do_size, "this method calculates size only for 32-bit VM"); ) + assert(ireg == Op_VecS || // 32bit vector + (src_lo & 1) == 0 && (src_lo + 1) == src_hi && + (dst_lo & 1) == 0 && (dst_lo + 1) == dst_hi, + "no non-adjacent vector moves" ); + if (cbuf) { + MacroAssembler _masm(cbuf); + int offset = __ offset(); + switch (ireg) { + case Op_VecS: // copy whole register + case Op_VecD: + case Op_VecX: + __ movdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo])); + break; + case Op_VecY: + __ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo])); + break; + default: + ShouldNotReachHere(); + } + int size = __ offset() - offset; +#ifdef ASSERT + // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix. + assert(!do_size || size == 4, "incorrect size calculattion"); +#endif + return size; +#ifndef PRODUCT + } else if (!do_size) { + switch (ireg) { + case Op_VecS: + case Op_VecD: + case Op_VecX: + st->print("movdqu %s,%s\t# spill",Matcher::regName[dst_lo],Matcher::regName[src_lo]); + break; + case Op_VecY: + st->print("vmovdqu %s,%s\t# spill",Matcher::regName[dst_lo],Matcher::regName[src_lo]); + break; + default: + ShouldNotReachHere(); + } +#endif + } + // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix. + return 4; +} + +static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load, + int stack_offset, int reg, uint ireg, outputStream* st) { + // In 64-bit VM size calculation is very complex. Emitting instructions + // into scratch buffer is used to get size in 64-bit VM. + LP64_ONLY( assert(!do_size, "this method calculates size only for 32-bit VM"); ) + if (cbuf) { + MacroAssembler _masm(cbuf); + int offset = __ offset(); + if (is_load) { + switch (ireg) { + case Op_VecS: + __ movdl(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset)); + break; + case Op_VecD: + __ movq(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset)); + break; + case Op_VecX: + __ movdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset)); + break; + case Op_VecY: + __ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset)); + break; + default: + ShouldNotReachHere(); + } + } else { // store + switch (ireg) { + case Op_VecS: + __ movdl(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg])); + break; + case Op_VecD: + __ movq(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg])); + break; + case Op_VecX: + __ movdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg])); + break; + case Op_VecY: + __ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg])); + break; + default: + ShouldNotReachHere(); + } + } + int size = __ offset() - offset; +#ifdef ASSERT + int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : 4); + // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix. + assert(!do_size || size == (5+offset_size), "incorrect size calculattion"); +#endif + return size; +#ifndef PRODUCT + } else if (!do_size) { + if (is_load) { + switch (ireg) { + case Op_VecS: + st->print("movd %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset); + break; + case Op_VecD: + st->print("movq %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset); + break; + case Op_VecX: + st->print("movdqu %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset); + break; + case Op_VecY: + st->print("vmovdqu %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset); + break; + default: + ShouldNotReachHere(); + } + } else { // store + switch (ireg) { + case Op_VecS: + st->print("movd [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]); + break; + case Op_VecD: + st->print("movq [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]); + break; + case Op_VecX: + st->print("movdqu [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]); + break; + case Op_VecY: + st->print("vmovdqu [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]); + break; + default: + ShouldNotReachHere(); + } + } +#endif + } + int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : 4); + // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix. + return 5+offset_size; +} + +static inline jfloat replicate4_imm(int con, int width) { + // Load a constant of "width" (in bytes) and replicate it to fill 32bit. + assert(width == 1 || width == 2, "only byte or short types here"); + int bit_width = width * 8; + jint val = con; + val &= (1 << bit_width) - 1; // mask off sign bits + while(bit_width < 32) { + val |= (val << bit_width); + bit_width <<= 1; + } + jfloat fval = *((jfloat*) &val); // coerce to float type + return fval; +} + +static inline jdouble replicate8_imm(int con, int width) { + // Load a constant of "width" (in bytes) and replicate it to fill 64bit. + assert(width == 1 || width == 2 || width == 4, "only byte, short or int types here"); + int bit_width = width * 8; + jlong val = con; + val &= (((jlong) 1) << bit_width) - 1; // mask off sign bits + while(bit_width < 64) { + val |= (val << bit_width); + bit_width <<= 1; + } + jdouble dval = *((jdouble*) &val); // coerce to double type + return dval; +} + #ifndef PRODUCT void MachNopNode::format(PhaseRegAlloc*, outputStream* st) const { st->print("nop \t# %d bytes pad for loops and calls", _count); @@ -103,6 +799,46 @@ %} + +//----------OPERANDS----------------------------------------------------------- +// Operand definitions must precede instruction definitions for correct parsing +// in the ADLC because operands constitute user defined types which are used in +// instruction definitions. + +// Vectors +operand vecS() %{ + constraint(ALLOC_IN_RC(vectors_reg)); + match(VecS); + + format %{ %} + interface(REG_INTER); +%} + +operand vecD() %{ + constraint(ALLOC_IN_RC(vectord_reg)); + match(VecD); + + format %{ %} + interface(REG_INTER); +%} + +operand vecX() %{ + constraint(ALLOC_IN_RC(vectorx_reg)); + match(VecX); + + format %{ %} + interface(REG_INTER); +%} + +operand vecY() %{ + constraint(ALLOC_IN_RC(vectory_reg)); + match(VecY); + + format %{ %} + interface(REG_INTER); +%} + + // INSTRUCTIONS -- Platform independent definitions (same for 32- and 64-bit) // ============================================================================ @@ -153,7 +889,7 @@ ins_pipe(pipe_slow); %} -instruct vaddF_reg(regF dst, regF src1, regF src2) %{ +instruct addF_reg_reg(regF dst, regF src1, regF src2) %{ predicate(UseAVX > 0); match(Set dst (AddF src1 src2)); @@ -165,7 +901,7 @@ ins_pipe(pipe_slow); %} -instruct vaddF_mem(regF dst, regF src1, memory src2) %{ +instruct addF_reg_mem(regF dst, regF src1, memory src2) %{ predicate(UseAVX > 0); match(Set dst (AddF src1 (LoadF src2))); @@ -177,7 +913,7 @@ ins_pipe(pipe_slow); %} -instruct vaddF_imm(regF dst, regF src, immF con) %{ +instruct addF_reg_imm(regF dst, regF src, immF con) %{ predicate(UseAVX > 0); match(Set dst (AddF src con)); @@ -224,7 +960,7 @@ ins_pipe(pipe_slow); %} -instruct vaddD_reg(regD dst, regD src1, regD src2) %{ +instruct addD_reg_reg(regD dst, regD src1, regD src2) %{ predicate(UseAVX > 0); match(Set dst (AddD src1 src2)); @@ -236,7 +972,7 @@ ins_pipe(pipe_slow); %} -instruct vaddD_mem(regD dst, regD src1, memory src2) %{ +instruct addD_reg_mem(regD dst, regD src1, memory src2) %{ predicate(UseAVX > 0); match(Set dst (AddD src1 (LoadD src2))); @@ -248,7 +984,7 @@ ins_pipe(pipe_slow); %} -instruct vaddD_imm(regD dst, regD src, immD con) %{ +instruct addD_reg_imm(regD dst, regD src, immD con) %{ predicate(UseAVX > 0); match(Set dst (AddD src con)); @@ -295,7 +1031,7 @@ ins_pipe(pipe_slow); %} -instruct vsubF_reg(regF dst, regF src1, regF src2) %{ +instruct subF_reg_reg(regF dst, regF src1, regF src2) %{ predicate(UseAVX > 0); match(Set dst (SubF src1 src2)); @@ -307,7 +1043,7 @@ ins_pipe(pipe_slow); %} -instruct vsubF_mem(regF dst, regF src1, memory src2) %{ +instruct subF_reg_mem(regF dst, regF src1, memory src2) %{ predicate(UseAVX > 0); match(Set dst (SubF src1 (LoadF src2))); @@ -319,7 +1055,7 @@ ins_pipe(pipe_slow); %} -instruct vsubF_imm(regF dst, regF src, immF con) %{ +instruct subF_reg_imm(regF dst, regF src, immF con) %{ predicate(UseAVX > 0); match(Set dst (SubF src con)); @@ -366,7 +1102,7 @@ ins_pipe(pipe_slow); %} -instruct vsubD_reg(regD dst, regD src1, regD src2) %{ +instruct subD_reg_reg(regD dst, regD src1, regD src2) %{ predicate(UseAVX > 0); match(Set dst (SubD src1 src2)); @@ -378,7 +1114,7 @@ ins_pipe(pipe_slow); %} -instruct vsubD_mem(regD dst, regD src1, memory src2) %{ +instruct subD_reg_mem(regD dst, regD src1, memory src2) %{ predicate(UseAVX > 0); match(Set dst (SubD src1 (LoadD src2))); @@ -390,7 +1126,7 @@ ins_pipe(pipe_slow); %} -instruct vsubD_imm(regD dst, regD src, immD con) %{ +instruct subD_reg_imm(regD dst, regD src, immD con) %{ predicate(UseAVX > 0); match(Set dst (SubD src con)); @@ -437,7 +1173,7 @@ ins_pipe(pipe_slow); %} -instruct vmulF_reg(regF dst, regF src1, regF src2) %{ +instruct mulF_reg_reg(regF dst, regF src1, regF src2) %{ predicate(UseAVX > 0); match(Set dst (MulF src1 src2)); @@ -449,7 +1185,7 @@ ins_pipe(pipe_slow); %} -instruct vmulF_mem(regF dst, regF src1, memory src2) %{ +instruct mulF_reg_mem(regF dst, regF src1, memory src2) %{ predicate(UseAVX > 0); match(Set dst (MulF src1 (LoadF src2))); @@ -461,7 +1197,7 @@ ins_pipe(pipe_slow); %} -instruct vmulF_imm(regF dst, regF src, immF con) %{ +instruct mulF_reg_imm(regF dst, regF src, immF con) %{ predicate(UseAVX > 0); match(Set dst (MulF src con)); @@ -508,7 +1244,7 @@ ins_pipe(pipe_slow); %} -instruct vmulD_reg(regD dst, regD src1, regD src2) %{ +instruct mulD_reg_reg(regD dst, regD src1, regD src2) %{ predicate(UseAVX > 0); match(Set dst (MulD src1 src2)); @@ -520,7 +1256,7 @@ ins_pipe(pipe_slow); %} -instruct vmulD_mem(regD dst, regD src1, memory src2) %{ +instruct mulD_reg_mem(regD dst, regD src1, memory src2) %{ predicate(UseAVX > 0); match(Set dst (MulD src1 (LoadD src2))); @@ -532,7 +1268,7 @@ ins_pipe(pipe_slow); %} -instruct vmulD_imm(regD dst, regD src, immD con) %{ +instruct mulD_reg_imm(regD dst, regD src, immD con) %{ predicate(UseAVX > 0); match(Set dst (MulD src con)); @@ -579,7 +1315,7 @@ ins_pipe(pipe_slow); %} -instruct vdivF_reg(regF dst, regF src1, regF src2) %{ +instruct divF_reg_reg(regF dst, regF src1, regF src2) %{ predicate(UseAVX > 0); match(Set dst (DivF src1 src2)); @@ -591,7 +1327,7 @@ ins_pipe(pipe_slow); %} -instruct vdivF_mem(regF dst, regF src1, memory src2) %{ +instruct divF_reg_mem(regF dst, regF src1, memory src2) %{ predicate(UseAVX > 0); match(Set dst (DivF src1 (LoadF src2))); @@ -603,7 +1339,7 @@ ins_pipe(pipe_slow); %} -instruct vdivF_imm(regF dst, regF src, immF con) %{ +instruct divF_reg_imm(regF dst, regF src, immF con) %{ predicate(UseAVX > 0); match(Set dst (DivF src con)); @@ -650,7 +1386,7 @@ ins_pipe(pipe_slow); %} -instruct vdivD_reg(regD dst, regD src1, regD src2) %{ +instruct divD_reg_reg(regD dst, regD src1, regD src2) %{ predicate(UseAVX > 0); match(Set dst (DivD src1 src2)); @@ -662,7 +1398,7 @@ ins_pipe(pipe_slow); %} -instruct vdivD_mem(regD dst, regD src1, memory src2) %{ +instruct divD_reg_mem(regD dst, regD src1, memory src2) %{ predicate(UseAVX > 0); match(Set dst (DivD src1 (LoadD src2))); @@ -674,7 +1410,7 @@ ins_pipe(pipe_slow); %} -instruct vdivD_imm(regD dst, regD src, immD con) %{ +instruct divD_reg_imm(regD dst, regD src, immD con) %{ predicate(UseAVX > 0); match(Set dst (DivD src con)); @@ -697,7 +1433,7 @@ ins_pipe(pipe_slow); %} -instruct vabsF_reg(regF dst, regF src) %{ +instruct absF_reg_reg(regF dst, regF src) %{ predicate(UseAVX > 0); match(Set dst (AbsF src)); ins_cost(150); @@ -721,7 +1457,7 @@ ins_pipe(pipe_slow); %} -instruct vabsD_reg(regD dst, regD src) %{ +instruct absD_reg_reg(regD dst, regD src) %{ predicate(UseAVX > 0); match(Set dst (AbsD src)); ins_cost(150); @@ -745,7 +1481,7 @@ ins_pipe(pipe_slow); %} -instruct vnegF_reg(regF dst, regF src) %{ +instruct negF_reg_reg(regF dst, regF src) %{ predicate(UseAVX > 0); match(Set dst (NegF src)); ins_cost(150); @@ -769,7 +1505,7 @@ ins_pipe(pipe_slow); %} -instruct vnegD_reg(regD dst, regD src) %{ +instruct negD_reg_reg(regD dst, regD src) %{ predicate(UseAVX > 0); match(Set dst (NegD src)); ins_cost(150); @@ -852,3 +1588,797 @@ ins_pipe(pipe_slow); %} + +// ====================VECTOR INSTRUCTIONS===================================== + +// Load vectors (4 bytes long) +instruct loadV4(vecS dst, memory mem) %{ + predicate(n->as_LoadVector()->memory_size() == 4); + match(Set dst (LoadVector mem)); + ins_cost(125); + format %{ "movd $dst,$mem\t! load vector (4 bytes)" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $mem$$Address); + %} + ins_pipe( pipe_slow ); +%} + +// Load vectors (8 bytes long) +instruct loadV8(vecD dst, memory mem) %{ + predicate(n->as_LoadVector()->memory_size() == 8); + match(Set dst (LoadVector mem)); + ins_cost(125); + format %{ "movq $dst,$mem\t! load vector (8 bytes)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $mem$$Address); + %} + ins_pipe( pipe_slow ); +%} + +// Load vectors (16 bytes long) +instruct loadV16(vecX dst, memory mem) %{ + predicate(n->as_LoadVector()->memory_size() == 16); + match(Set dst (LoadVector mem)); + ins_cost(125); + format %{ "movdqu $dst,$mem\t! load vector (16 bytes)" %} + ins_encode %{ + __ movdqu($dst$$XMMRegister, $mem$$Address); + %} + ins_pipe( pipe_slow ); +%} + +// Load vectors (32 bytes long) +instruct loadV32(vecY dst, memory mem) %{ + predicate(n->as_LoadVector()->memory_size() == 32); + match(Set dst (LoadVector mem)); + ins_cost(125); + format %{ "vmovdqu $dst,$mem\t! load vector (32 bytes)" %} + ins_encode %{ + __ vmovdqu($dst$$XMMRegister, $mem$$Address); + %} + ins_pipe( pipe_slow ); +%} + +// Store vectors +instruct storeV4(memory mem, vecS src) %{ + predicate(n->as_StoreVector()->memory_size() == 4); + match(Set mem (StoreVector mem src)); + ins_cost(145); + format %{ "movd $mem,$src\t! store vector (4 bytes)" %} + ins_encode %{ + __ movdl($mem$$Address, $src$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct storeV8(memory mem, vecD src) %{ + predicate(n->as_StoreVector()->memory_size() == 8); + match(Set mem (StoreVector mem src)); + ins_cost(145); + format %{ "movq $mem,$src\t! store vector (8 bytes)" %} + ins_encode %{ + __ movq($mem$$Address, $src$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct storeV16(memory mem, vecX src) %{ + predicate(n->as_StoreVector()->memory_size() == 16); + match(Set mem (StoreVector mem src)); + ins_cost(145); + format %{ "movdqu $mem,$src\t! store vector (16 bytes)" %} + ins_encode %{ + __ movdqu($mem$$Address, $src$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct storeV32(memory mem, vecY src) %{ + predicate(n->as_StoreVector()->memory_size() == 32); + match(Set mem (StoreVector mem src)); + ins_cost(145); + format %{ "vmovdqu $mem,$src\t! store vector (32 bytes)" %} + ins_encode %{ + __ vmovdqu($mem$$Address, $src$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate byte scalar to be vector +instruct Repl4B(vecS dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateB src)); + format %{ "movd $dst,$src\n\t" + "punpcklbw $dst,$dst\n\t" + "pshuflw $dst,$dst,0x00\t! replicate4B" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); + __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl8B(vecD dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateB src)); + format %{ "movd $dst,$src\n\t" + "punpcklbw $dst,$dst\n\t" + "pshuflw $dst,$dst,0x00\t! replicate8B" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); + __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl16B(vecX dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 16); + match(Set dst (ReplicateB src)); + format %{ "movd $dst,$src\n\t" + "punpcklbw $dst,$dst\n\t" + "pshuflw $dst,$dst,0x00\n\t" + "punpcklqdq $dst,$dst\t! replicate16B" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); + __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl32B(vecY dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 32); + match(Set dst (ReplicateB src)); + format %{ "movd $dst,$src\n\t" + "punpcklbw $dst,$dst\n\t" + "pshuflw $dst,$dst,0x00\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate32B" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); + __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate byte scalar immediate to be vector by loading from const table. +instruct Repl4B_imm(vecS dst, immI con) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateB con)); + format %{ "movdl $dst,[$constantaddress]\t! replicate4B($con)" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $constantaddress(replicate4_imm($con$$constant, 1))); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl8B_imm(vecD dst, immI con) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateB con)); + format %{ "movq $dst,[$constantaddress]\t! replicate8B($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1))); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl16B_imm(vecX dst, immI con) %{ + predicate(n->as_Vector()->length() == 16); + match(Set dst (ReplicateB con)); + format %{ "movq $dst,[$constantaddress]\n\t" + "punpcklqdq $dst,$dst\t! replicate16B($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1))); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl32B_imm(vecY dst, immI con) %{ + predicate(n->as_Vector()->length() == 32); + match(Set dst (ReplicateB con)); + format %{ "movq $dst,[$constantaddress]\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst\t! lreplicate32B($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1))); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate byte scalar zero to be vector +instruct Repl4B_zero(vecS dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateB zero)); + format %{ "pxor $dst,$dst\t! replicate4B zero" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl8B_zero(vecD dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateB zero)); + format %{ "pxor $dst,$dst\t! replicate8B zero" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl16B_zero(vecX dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 16); + match(Set dst (ReplicateB zero)); + format %{ "pxor $dst,$dst\t! replicate16B zero" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl32B_zero(vecY dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 32); + match(Set dst (ReplicateB zero)); + format %{ "vpxor $dst,$dst,$dst\t! replicate32B zero" %} + ins_encode %{ + // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it). + bool vector256 = true; + __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Replicate char/short (2 byte) scalar to be vector +instruct Repl2S(vecS dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateS src)); + format %{ "movd $dst,$src\n\t" + "pshuflw $dst,$dst,0x00\t! replicate2S" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4S(vecD dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateS src)); + format %{ "movd $dst,$src\n\t" + "pshuflw $dst,$dst,0x00\t! replicate4S" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl8S(vecX dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateS src)); + format %{ "movd $dst,$src\n\t" + "pshuflw $dst,$dst,0x00\n\t" + "punpcklqdq $dst,$dst\t! replicate8S" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl16S(vecY dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 16); + match(Set dst (ReplicateS src)); + format %{ "movd $dst,$src\n\t" + "pshuflw $dst,$dst,0x00\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate16S" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate char/short (2 byte) scalar immediate to be vector by loading from const table. +instruct Repl2S_imm(vecS dst, immI con) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateS con)); + format %{ "movdl $dst,[$constantaddress]\t! replicate2S($con)" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $constantaddress(replicate4_imm($con$$constant, 2))); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4S_imm(vecD dst, immI con) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateS con)); + format %{ "movq $dst,[$constantaddress]\t! replicate4S($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2))); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl8S_imm(vecX dst, immI con) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateS con)); + format %{ "movq $dst,[$constantaddress]\n\t" + "punpcklqdq $dst,$dst\t! replicate8S($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2))); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl16S_imm(vecY dst, immI con) %{ + predicate(n->as_Vector()->length() == 16); + match(Set dst (ReplicateS con)); + format %{ "movq $dst,[$constantaddress]\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate16S($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2))); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate char/short (2 byte) scalar zero to be vector +instruct Repl2S_zero(vecS dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateS zero)); + format %{ "pxor $dst,$dst\t! replicate2S zero" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4S_zero(vecD dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateS zero)); + format %{ "pxor $dst,$dst\t! replicate4S zero" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl8S_zero(vecX dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateS zero)); + format %{ "pxor $dst,$dst\t! replicate8S zero" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl16S_zero(vecY dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 16); + match(Set dst (ReplicateS zero)); + format %{ "vpxor $dst,$dst,$dst\t! replicate16S zero" %} + ins_encode %{ + // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it). + bool vector256 = true; + __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Replicate integer (4 byte) scalar to be vector +instruct Repl2I(vecD dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateI src)); + format %{ "movd $dst,$src\n\t" + "pshufd $dst,$dst,0x00\t! replicate2I" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4I(vecX dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateI src)); + format %{ "movd $dst,$src\n\t" + "pshufd $dst,$dst,0x00\t! replicate4I" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl8I(vecY dst, rRegI src) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateI src)); + format %{ "movd $dst,$src\n\t" + "pshufd $dst,$dst,0x00\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate8I" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate integer (4 byte) scalar immediate to be vector by loading from const table. +instruct Repl2I_imm(vecD dst, immI con) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateI con)); + format %{ "movq $dst,[$constantaddress]\t! replicate2I($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4))); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4I_imm(vecX dst, immI con) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateI con)); + format %{ "movq $dst,[$constantaddress]\t! replicate4I($con)\n\t" + "punpcklqdq $dst,$dst" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4))); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl8I_imm(vecY dst, immI con) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateI con)); + format %{ "movq $dst,[$constantaddress]\t! replicate8I($con)\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4))); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Integer could be loaded into xmm register directly from memory. +instruct Repl2I_mem(vecD dst, memory mem) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateI (LoadI mem))); + format %{ "movd $dst,$mem\n\t" + "pshufd $dst,$dst,0x00\t! replicate2I" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $mem$$Address); + __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4I_mem(vecX dst, memory mem) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateI (LoadI mem))); + format %{ "movd $dst,$mem\n\t" + "pshufd $dst,$dst,0x00\t! replicate4I" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $mem$$Address); + __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl8I_mem(vecY dst, memory mem) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateI (LoadI mem))); + format %{ "movd $dst,$mem\n\t" + "pshufd $dst,$dst,0x00\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate8I" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $mem$$Address); + __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate integer (4 byte) scalar zero to be vector +instruct Repl2I_zero(vecD dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateI zero)); + format %{ "pxor $dst,$dst\t! replicate2I" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4I_zero(vecX dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateI zero)); + format %{ "pxor $dst,$dst\t! replicate4I zero)" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl8I_zero(vecY dst, immI0 zero) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateI zero)); + format %{ "vpxor $dst,$dst,$dst\t! replicate8I zero" %} + ins_encode %{ + // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it). + bool vector256 = true; + __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Replicate long (8 byte) scalar to be vector +#ifdef _LP64 +instruct Repl2L(vecX dst, rRegL src) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateL src)); + format %{ "movdq $dst,$src\n\t" + "punpcklqdq $dst,$dst\t! replicate2L" %} + ins_encode %{ + __ movdq($dst$$XMMRegister, $src$$Register); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl4L(vecY dst, rRegL src) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateL src)); + format %{ "movdq $dst,$src\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate4L" %} + ins_encode %{ + __ movdq($dst$$XMMRegister, $src$$Register); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} +#else // _LP64 +instruct Repl2L(vecX dst, eRegL src, regD tmp) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateL src)); + effect(TEMP dst, USE src, TEMP tmp); + format %{ "movdl $dst,$src.lo\n\t" + "movdl $tmp,$src.hi\n\t" + "punpckldq $dst,$tmp\n\t" + "punpcklqdq $dst,$dst\t! replicate2L"%} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register)); + __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl4L(vecY dst, eRegL src, regD tmp) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateL src)); + effect(TEMP dst, USE src, TEMP tmp); + format %{ "movdl $dst,$src.lo\n\t" + "movdl $tmp,$src.hi\n\t" + "punpckldq $dst,$tmp\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate4L" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register)); + __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} +#endif // _LP64 + +// Replicate long (8 byte) scalar immediate to be vector by loading from const table. +instruct Repl2L_imm(vecX dst, immL con) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateL con)); + format %{ "movq $dst,[$constantaddress]\n\t" + "punpcklqdq $dst,$dst\t! replicate2L($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress($con)); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl4L_imm(vecY dst, immL con) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateL con)); + format %{ "movq $dst,[$constantaddress]\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate4L($con)" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $constantaddress($con)); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Long could be loaded into xmm register directly from memory. +instruct Repl2L_mem(vecX dst, memory mem) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateL (LoadL mem))); + format %{ "movq $dst,$mem\n\t" + "punpcklqdq $dst,$dst\t! replicate2L" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $mem$$Address); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl4L_mem(vecY dst, memory mem) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateL (LoadL mem))); + format %{ "movq $dst,$mem\n\t" + "punpcklqdq $dst,$dst\n\t" + "vinserti128h $dst,$dst,$dst\t! replicate4L" %} + ins_encode %{ + __ movq($dst$$XMMRegister, $mem$$Address); + __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); + __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate long (8 byte) scalar zero to be vector +instruct Repl2L_zero(vecX dst, immL0 zero) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateL zero)); + format %{ "pxor $dst,$dst\t! replicate2L zero" %} + ins_encode %{ + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4L_zero(vecY dst, immL0 zero) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateL zero)); + format %{ "vpxor $dst,$dst,$dst\t! replicate4L zero" %} + ins_encode %{ + // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it). + bool vector256 = true; + __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Replicate float (4 byte) scalar to be vector +instruct Repl2F(vecD dst, regF src) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateF src)); + format %{ "pshufd $dst,$dst,0x00\t! replicate2F" %} + ins_encode %{ + __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4F(vecX dst, regF src) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateF src)); + format %{ "pshufd $dst,$dst,0x00\t! replicate4F" %} + ins_encode %{ + __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl8F(vecY dst, regF src) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateF src)); + format %{ "pshufd $dst,$src,0x00\n\t" + "vinsertf128h $dst,$dst,$dst\t! replicate8F" %} + ins_encode %{ + __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00); + __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate float (4 byte) scalar zero to be vector +instruct Repl2F_zero(vecD dst, immF0 zero) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateF zero)); + format %{ "xorps $dst,$dst\t! replicate2F zero" %} + ins_encode %{ + __ xorps($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4F_zero(vecX dst, immF0 zero) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateF zero)); + format %{ "xorps $dst,$dst\t! replicate4F zero" %} + ins_encode %{ + __ xorps($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl8F_zero(vecY dst, immF0 zero) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (ReplicateF zero)); + format %{ "vxorps $dst,$dst,$dst\t! replicate8F zero" %} + ins_encode %{ + bool vector256 = true; + __ vxorps($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Replicate double (8 bytes) scalar to be vector +instruct Repl2D(vecX dst, regD src) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateD src)); + format %{ "pshufd $dst,$src,0x44\t! replicate2D" %} + ins_encode %{ + __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44); + %} + ins_pipe( pipe_slow ); +%} + +instruct Repl4D(vecY dst, regD src) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateD src)); + format %{ "pshufd $dst,$src,0x44\n\t" + "vinsertf128h $dst,$dst,$dst\t! replicate4D" %} + ins_encode %{ + __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44); + __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +// Replicate double (8 byte) scalar zero to be vector +instruct Repl2D_zero(vecX dst, immD0 zero) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (ReplicateD zero)); + format %{ "xorpd $dst,$dst\t! replicate2D zero" %} + ins_encode %{ + __ xorpd($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe( fpu_reg_reg ); +%} + +instruct Repl4D_zero(vecY dst, immD0 zero) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (ReplicateD zero)); + format %{ "vxorpd $dst,$dst,$dst,vect256\t! replicate4D zero" %} + ins_encode %{ + bool vector256 = true; + __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256); + %} + ins_pipe( fpu_reg_reg ); +%} + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/x86_32.ad --- a/src/cpu/x86/vm/x86_32.ad Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/x86_32.ad Thu Aug 02 14:29:12 2012 -0700 @@ -74,9 +74,6 @@ reg_def EAX(SOC, SOC, Op_RegI, 0, rax->as_VMReg()); reg_def ESP( NS, NS, Op_RegI, 4, rsp->as_VMReg()); -// Special Registers -reg_def EFLAGS(SOC, SOC, 0, 8, VMRegImpl::Bad()); - // Float registers. We treat TOS/FPR0 special. It is invisible to the // allocator, and only shows up in the encodings. reg_def FPR0L( SOC, SOC, Op_RegF, 0, VMRegImpl::Bad()); @@ -105,27 +102,6 @@ reg_def FPR7L( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()); reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next()); -// XMM registers. 128-bit registers or 4 words each, labeled a-d. -// Word a in each register holds a Float, words ab hold a Double. -// We currently do not use the SIMD capabilities, so registers cd -// are unused at the moment. -reg_def XMM0a( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()); -reg_def XMM0b( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next()); -reg_def XMM1a( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()); -reg_def XMM1b( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next()); -reg_def XMM2a( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()); -reg_def XMM2b( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next()); -reg_def XMM3a( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()); -reg_def XMM3b( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next()); -reg_def XMM4a( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()); -reg_def XMM4b( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next()); -reg_def XMM5a( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()); -reg_def XMM5b( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next()); -reg_def XMM6a( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()); -reg_def XMM6b( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next()); -reg_def XMM7a( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()); -reg_def XMM7b( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()); - // Specify priority of register selection within phases of register // allocation. Highest priority is first. A useful heuristic is to // give registers a low priority when they are required by machine @@ -138,15 +114,6 @@ FPR3L, FPR3H, FPR4L, FPR4H, FPR5L, FPR5H, FPR6L, FPR6H, FPR7L, FPR7H ); -alloc_class chunk1( XMM0a, XMM0b, - XMM1a, XMM1b, - XMM2a, XMM2b, - XMM3a, XMM3b, - XMM4a, XMM4b, - XMM5a, XMM5b, - XMM6a, XMM6b, - XMM7a, XMM7b, EFLAGS); - //----------Architecture Description Register Classes-------------------------- // Several register classes are automatically defined based upon information in @@ -159,12 +126,12 @@ // Class for all registers reg_class any_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX, ESP); // Class for general registers -reg_class e_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX); +reg_class int_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX); // Class for general registers which may be used for implicit null checks on win95 // Also safe for use by tailjump. We don't want to allocate in rbp, -reg_class e_reg_no_rbp(EAX, EDX, EDI, ESI, ECX, EBX); +reg_class int_reg_no_rbp(EAX, EDX, EDI, ESI, ECX, EBX); // Class of "X" registers -reg_class x_reg(EBX, ECX, EDX, EAX); +reg_class int_x_reg(EBX, ECX, EDX, EAX); // Class of registers that can appear in an address with no offset. // EBP and ESP require an extra instruction byte for zero offset. // Used in fast-unlock @@ -193,8 +160,6 @@ reg_class sp_reg(ESP); // Singleton class for instruction pointer // reg_class ip_reg(EIP); -// Singleton class for condition codes -reg_class int_flags(EFLAGS); // Class of integer register pairs reg_class long_reg( EAX,EDX, ECX,EBX, EBP,EDI ); // Class of integer register pairs that aligns with calling convention @@ -206,29 +171,18 @@ // Floating point registers. Notice FPR0 is not a choice. // FPR0 is not ever allocated; we use clever encodings to fake // a 2-address instructions out of Intels FP stack. -reg_class flt_reg( FPR1L,FPR2L,FPR3L,FPR4L,FPR5L,FPR6L,FPR7L ); - -// make a register class for SSE registers -reg_class xmm_reg(XMM0a, XMM1a, XMM2a, XMM3a, XMM4a, XMM5a, XMM6a, XMM7a); - -// make a double register class for SSE2 registers -reg_class xdb_reg(XMM0a,XMM0b, XMM1a,XMM1b, XMM2a,XMM2b, XMM3a,XMM3b, - XMM4a,XMM4b, XMM5a,XMM5b, XMM6a,XMM6b, XMM7a,XMM7b ); - -reg_class dbl_reg( FPR1L,FPR1H, FPR2L,FPR2H, FPR3L,FPR3H, - FPR4L,FPR4H, FPR5L,FPR5H, FPR6L,FPR6H, - FPR7L,FPR7H ); - -reg_class flt_reg0( FPR1L ); -reg_class dbl_reg0( FPR1L,FPR1H ); -reg_class dbl_reg1( FPR2L,FPR2H ); -reg_class dbl_notreg0( FPR2L,FPR2H, FPR3L,FPR3H, FPR4L,FPR4H, - FPR5L,FPR5H, FPR6L,FPR6H, FPR7L,FPR7H ); - -// XMM6 and XMM7 could be used as temporary registers for long, float and -// double values for SSE2. -reg_class xdb_reg6( XMM6a,XMM6b ); -reg_class xdb_reg7( XMM7a,XMM7b ); +reg_class fp_flt_reg( FPR1L,FPR2L,FPR3L,FPR4L,FPR5L,FPR6L,FPR7L ); + +reg_class fp_dbl_reg( FPR1L,FPR1H, FPR2L,FPR2H, FPR3L,FPR3H, + FPR4L,FPR4H, FPR5L,FPR5H, FPR6L,FPR6H, + FPR7L,FPR7H ); + +reg_class fp_flt_reg0( FPR1L ); +reg_class fp_dbl_reg0( FPR1L,FPR1H ); +reg_class fp_dbl_reg1( FPR2L,FPR2H ); +reg_class fp_dbl_notreg0( FPR2L,FPR2H, FPR3L,FPR3H, FPR4L,FPR4H, + FPR5L,FPR5H, FPR6L,FPR6H, FPR7L,FPR7H ); + %} @@ -412,7 +366,7 @@ } } - // eRegI ereg, memory mem) %{ // emit_reg_mem + // rRegI ereg, memory mem) %{ // emit_reg_mem void encode_RegMem( CodeBuffer &cbuf, int reg_encoding, int base, int index, int scale, int displace, bool displace_is_oop ) { // There is no index & no scale, use form without SIB byte if ((index == 0x4) && @@ -787,7 +741,7 @@ #endif } int offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4); - // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes. + // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix. return size+5+offset_size; } @@ -821,7 +775,7 @@ } #endif } - // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes. + // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix. // Only MOVAPS SSE prefix uses 1 byte. int sz = 4; if (!(src_lo+1 == src_hi && dst_lo+1 == dst_hi) && @@ -903,6 +857,108 @@ return impl_helper(cbuf,do_size,false,offset,st_op,op,op_str,size, st); } +// Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad. +static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo, + int src_hi, int dst_hi, uint ireg, outputStream* st); + +static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load, + int stack_offset, int reg, uint ireg, outputStream* st); + +static int vec_stack_to_stack_helper(CodeBuffer *cbuf, bool do_size, int src_offset, + int dst_offset, uint ireg, outputStream* st) { + int calc_size = 0; + int src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4); + int dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4); + switch (ireg) { + case Op_VecS: + calc_size = 3+src_offset_size + 3+dst_offset_size; + break; + case Op_VecD: + calc_size = 3+src_offset_size + 3+dst_offset_size; + src_offset += 4; + dst_offset += 4; + src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4); + dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4); + calc_size += 3+src_offset_size + 3+dst_offset_size; + break; + case Op_VecX: + calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size; + break; + case Op_VecY: + calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size; + break; + default: + ShouldNotReachHere(); + } + if (cbuf) { + MacroAssembler _masm(cbuf); + int offset = __ offset(); + switch (ireg) { + case Op_VecS: + __ pushl(Address(rsp, src_offset)); + __ popl (Address(rsp, dst_offset)); + break; + case Op_VecD: + __ pushl(Address(rsp, src_offset)); + __ popl (Address(rsp, dst_offset)); + __ pushl(Address(rsp, src_offset+4)); + __ popl (Address(rsp, dst_offset+4)); + break; + case Op_VecX: + __ movdqu(Address(rsp, -16), xmm0); + __ movdqu(xmm0, Address(rsp, src_offset)); + __ movdqu(Address(rsp, dst_offset), xmm0); + __ movdqu(xmm0, Address(rsp, -16)); + break; + case Op_VecY: + __ vmovdqu(Address(rsp, -32), xmm0); + __ vmovdqu(xmm0, Address(rsp, src_offset)); + __ vmovdqu(Address(rsp, dst_offset), xmm0); + __ vmovdqu(xmm0, Address(rsp, -32)); + break; + default: + ShouldNotReachHere(); + } + int size = __ offset() - offset; + assert(size == calc_size, "incorrect size calculattion"); + return size; +#ifndef PRODUCT + } else if (!do_size) { + switch (ireg) { + case Op_VecS: + st->print("pushl [rsp + #%d]\t# 32-bit mem-mem spill\n\t" + "popl [rsp + #%d]", + src_offset, dst_offset); + break; + case Op_VecD: + st->print("pushl [rsp + #%d]\t# 64-bit mem-mem spill\n\t" + "popq [rsp + #%d]\n\t" + "pushl [rsp + #%d]\n\t" + "popq [rsp + #%d]", + src_offset, dst_offset, src_offset+4, dst_offset+4); + break; + case Op_VecX: + st->print("movdqu [rsp - #16], xmm0\t# 128-bit mem-mem spill\n\t" + "movdqu xmm0, [rsp + #%d]\n\t" + "movdqu [rsp + #%d], xmm0\n\t" + "movdqu xmm0, [rsp - #16]", + src_offset, dst_offset); + break; + case Op_VecY: + st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t" + "vmovdqu xmm0, [rsp + #%d]\n\t" + "vmovdqu [rsp + #%d], xmm0\n\t" + "vmovdqu xmm0, [rsp - #32]", + src_offset, dst_offset); + break; + default: + ShouldNotReachHere(); + } +#endif + } + return calc_size; +} + uint MachSpillCopyNode::implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream* st ) const { // Get registers to move OptoReg::Name src_second = ra_->get_reg_second(in(1)); @@ -923,6 +979,29 @@ if( src_first == dst_first && src_second == dst_second ) return size; // Self copy, no move + if (bottom_type()->isa_vect() != NULL) { + uint ireg = ideal_reg(); + assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity"); + assert((src_first_rc != rc_float && dst_first_rc != rc_float), "sanity"); + assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity"); + if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) { + // mem -> mem + int src_offset = ra_->reg2offset(src_first); + int dst_offset = ra_->reg2offset(dst_first); + return vec_stack_to_stack_helper(cbuf, do_size, src_offset, dst_offset, ireg, st); + } else if (src_first_rc == rc_xmm && dst_first_rc == rc_xmm ) { + return vec_mov_helper(cbuf, do_size, src_first, dst_first, src_second, dst_second, ireg, st); + } else if (src_first_rc == rc_xmm && dst_first_rc == rc_stack ) { + int stack_offset = ra_->reg2offset(dst_first); + return vec_spill_helper(cbuf, do_size, false, stack_offset, src_first, ireg, st); + } else if (src_first_rc == rc_stack && dst_first_rc == rc_xmm ) { + int stack_offset = ra_->reg2offset(src_first); + return vec_spill_helper(cbuf, do_size, true, stack_offset, dst_first, ireg, st); + } else { + ShouldNotReachHere(); + } + } + // -------------------------------------- // Check for mem-mem move. push/pop to move. if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) { @@ -1313,16 +1392,6 @@ return true; } -// Vector width in bytes -const uint Matcher::vector_width_in_bytes(void) { - return UseSSE >= 2 ? 8 : 0; -} - -// Vector ideal reg -const uint Matcher::vector_ideal_reg(void) { - return Op_RegD; -} - // Is this branch offset short enough that a short branch can be used? // // NOTE: If the platform does not provide any short branch variants, then @@ -1452,7 +1521,7 @@ // arguments in those registers not be available to the callee. bool Matcher::can_be_java_arg( int reg ) { if( reg == ECX_num || reg == EDX_num ) return true; - if( (reg == XMM0a_num || reg == XMM1a_num) && UseSSE>=1 ) return true; + if( (reg == XMM0_num || reg == XMM1_num ) && UseSSE>=1 ) return true; if( (reg == XMM0b_num || reg == XMM1b_num) && UseSSE>=2 ) return true; return false; } @@ -1565,16 +1634,16 @@ emit_opcode(cbuf,0x66); %} - enc_class RegReg (eRegI dst, eRegI src) %{ // RegReg(Many) + enc_class RegReg (rRegI dst, rRegI src) %{ // RegReg(Many) emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg); %} - enc_class OpcRegReg (immI opcode, eRegI dst, eRegI src) %{ // OpcRegReg(Many) + enc_class OpcRegReg (immI opcode, rRegI dst, rRegI src) %{ // OpcRegReg(Many) emit_opcode(cbuf,$opcode$$constant); emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg); %} - enc_class mov_r32_imm0( eRegI dst ) %{ + enc_class mov_r32_imm0( rRegI dst ) %{ emit_opcode( cbuf, 0xB8 + $dst$$reg ); // 0xB8+ rd -- MOV r32 ,imm32 emit_d32 ( cbuf, 0x0 ); // imm32==0x0 %} @@ -1621,7 +1690,7 @@ %} // Dense encoding for older common ops - enc_class Opc_plus(immI opcode, eRegI reg) %{ + enc_class Opc_plus(immI opcode, rRegI reg) %{ emit_opcode(cbuf, $opcode$$constant + $reg$$reg); %} @@ -1637,7 +1706,7 @@ } %} - enc_class OpcSErm (eRegI dst, immI imm) %{ // OpcSEr/m + enc_class OpcSErm (rRegI dst, immI imm) %{ // OpcSEr/m // Emit primary opcode and set sign-extend bit // Check for 8-bit immediate, and set sign extend bit in opcode if (($imm$$constant >= -128) && ($imm$$constant <= 127)) { @@ -1682,7 +1751,7 @@ else emit_d32(cbuf,con); %} - enc_class OpcSReg (eRegI dst) %{ // BSWAP + enc_class OpcSReg (rRegI dst) %{ // BSWAP emit_cc(cbuf, $secondary, $dst$$reg ); %} @@ -1700,7 +1769,7 @@ emit_rm(cbuf, 0x3, destlo, desthi); %} - enc_class RegOpc (eRegI div) %{ // IDIV, IMOD, JMP indirect, ... + enc_class RegOpc (rRegI div) %{ // IDIV, IMOD, JMP indirect, ... emit_rm(cbuf, 0x3, $secondary, $div$$reg ); %} @@ -1891,20 +1960,20 @@ // runtime_call_Relocation::spec(), RELOC_IMM32 ); // %} - enc_class RegOpcImm (eRegI dst, immI8 shift) %{ // SHL, SAR, SHR + enc_class RegOpcImm (rRegI dst, immI8 shift) %{ // SHL, SAR, SHR $$$emit8$primary; emit_rm(cbuf, 0x3, $secondary, $dst$$reg); $$$emit8$shift$$constant; %} - enc_class LdImmI (eRegI dst, immI src) %{ // Load Immediate + enc_class LdImmI (rRegI dst, immI src) %{ // Load Immediate // Load immediate does not have a zero or sign extended version // for 8-bit immediates emit_opcode(cbuf, 0xB8 + $dst$$reg); $$$emit32$src$$constant; %} - enc_class LdImmP (eRegI dst, immI src) %{ // Load Immediate + enc_class LdImmP (rRegI dst, immI src) %{ // Load Immediate // Load immediate does not have a zero or sign extended version // for 8-bit immediates emit_opcode(cbuf, $primary + $dst$$reg); @@ -1943,15 +2012,15 @@ // Encode a reg-reg copy. If it is useless, then empty encoding. - enc_class enc_Copy( eRegI dst, eRegI src ) %{ + enc_class enc_Copy( rRegI dst, rRegI src ) %{ encode_Copy( cbuf, $dst$$reg, $src$$reg ); %} - enc_class enc_CopyL_Lo( eRegI dst, eRegL src ) %{ + enc_class enc_CopyL_Lo( rRegI dst, eRegL src ) %{ encode_Copy( cbuf, $dst$$reg, $src$$reg ); %} - enc_class RegReg (eRegI dst, eRegI src) %{ // RegReg(Many) + enc_class RegReg (rRegI dst, rRegI src) %{ // RegReg(Many) emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg); %} @@ -1973,7 +2042,7 @@ emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), HIGH_FROM_LOW($src$$reg)); %} - enc_class RegReg_HiLo( eRegL src, eRegI dst ) %{ + enc_class RegReg_HiLo( eRegL src, rRegI dst ) %{ emit_rm(cbuf, 0x3, $dst$$reg, HIGH_FROM_LOW($src$$reg)); %} @@ -2068,7 +2137,7 @@ cbuf.set_insts_mark(); // Mark start of opcode for reloc info in mem operand %} - enc_class RegMem (eRegI ereg, memory mem) %{ // emit_reg_mem + enc_class RegMem (rRegI ereg, memory mem) %{ // emit_reg_mem int reg_encoding = $ereg$$reg; int base = $mem$$base; int index = $mem$$index; @@ -2132,7 +2201,7 @@ // Clone of RegMem but accepts an extra parameter to access each // half of a double in memory; it never needs relocation info. - enc_class Mov_MemD_half_to_Reg (immI opcode, memory mem, immI disp_for_half, eRegI rm_reg) %{ + enc_class Mov_MemD_half_to_Reg (immI opcode, memory mem, immI disp_for_half, rRegI rm_reg) %{ emit_opcode(cbuf,$opcode$$constant); int reg_encoding = $rm_reg$$reg; int base = $mem$$base; @@ -2168,7 +2237,7 @@ encode_RegMem(cbuf, rm_byte_opcode, base, index, scale, displace, disp_is_oop); %} - enc_class RegLea (eRegI dst, eRegI src0, immI src1 ) %{ // emit_reg_lea + enc_class RegLea (rRegI dst, rRegI src0, immI src1 ) %{ // emit_reg_lea int reg_encoding = $dst$$reg; int base = $src0$$reg; // 0xFFFFFFFF indicates no base int index = 0x04; // 0x04 indicates no index @@ -2178,7 +2247,7 @@ encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_is_oop); %} - enc_class min_enc (eRegI dst, eRegI src) %{ // MIN + enc_class min_enc (rRegI dst, rRegI src) %{ // MIN // Compare dst,src emit_opcode(cbuf,0x3B); emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg); @@ -2190,7 +2259,7 @@ emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg); %} - enc_class max_enc (eRegI dst, eRegI src) %{ // MAX + enc_class max_enc (rRegI dst, rRegI src) %{ // MAX // Compare dst,src emit_opcode(cbuf,0x3B); emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg); @@ -2221,7 +2290,7 @@ encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_is_oop); %} - enc_class neg_reg(eRegI dst) %{ + enc_class neg_reg(rRegI dst) %{ // NEG $dst emit_opcode(cbuf,0xF7); emit_rm(cbuf, 0x3, 0x03, $dst$$reg ); @@ -2251,7 +2320,7 @@ emit_rm(cbuf, 0x3, $p$$reg, tmpReg); %} - enc_class enc_cmpLTP_mem(eRegI p, eRegI q, memory mem, eCXRegI tmp) %{ // cadd_cmpLT + enc_class enc_cmpLTP_mem(rRegI p, rRegI q, memory mem, eCXRegI tmp) %{ // cadd_cmpLT int tmpReg = $tmp$$reg; // SUB $p,$q @@ -2390,12 +2459,12 @@ %} // Special case for moving an integer register to a stack slot. - enc_class OpcPRegSS( stackSlotI dst, eRegI src ) %{ // RegSS + enc_class OpcPRegSS( stackSlotI dst, rRegI src ) %{ // RegSS store_to_stackslot( cbuf, $primary, $src$$reg, $dst$$disp ); %} // Special case for moving a register to a stack slot. - enc_class RegSS( stackSlotI dst, eRegI src ) %{ // RegSS + enc_class RegSS( stackSlotI dst, rRegI src ) %{ // RegSS // Opcode already emitted emit_rm( cbuf, 0x02, $src$$reg, ESP_enc ); // R/M byte emit_rm( cbuf, 0x00, ESP_enc, ESP_enc); // SIB byte @@ -2536,45 +2605,6 @@ __ fld_d(Address(rsp, 0)); %} - // Compute X^Y using Intel's fast hardware instructions, if possible. - // Otherwise return a NaN. - enc_class pow_exp_core_encoding %{ - // FPR1 holds Y*ln2(X). Compute FPR1 = 2^(Y*ln2(X)) - emit_opcode(cbuf,0xD9); emit_opcode(cbuf,0xC0); // fdup = fld st(0) Q Q - emit_opcode(cbuf,0xD9); emit_opcode(cbuf,0xFC); // frndint int(Q) Q - emit_opcode(cbuf,0xDC); emit_opcode(cbuf,0xE9); // fsub st(1) -= st(0); int(Q) frac(Q) - emit_opcode(cbuf,0xDB); // FISTP [ESP] frac(Q) - emit_opcode(cbuf,0x1C); - emit_d8(cbuf,0x24); - emit_opcode(cbuf,0xD9); emit_opcode(cbuf,0xF0); // f2xm1 2^frac(Q)-1 - emit_opcode(cbuf,0xD9); emit_opcode(cbuf,0xE8); // fld1 1 2^frac(Q)-1 - emit_opcode(cbuf,0xDE); emit_opcode(cbuf,0xC1); // faddp 2^frac(Q) - emit_opcode(cbuf,0x8B); // mov rax,[esp+0]=int(Q) - encode_RegMem(cbuf, EAX_enc, ESP_enc, 0x4, 0, 0, false); - emit_opcode(cbuf,0xC7); // mov rcx,0xFFFFF800 - overflow mask - emit_rm(cbuf, 0x3, 0x0, ECX_enc); - emit_d32(cbuf,0xFFFFF800); - emit_opcode(cbuf,0x81); // add rax,1023 - the double exponent bias - emit_rm(cbuf, 0x3, 0x0, EAX_enc); - emit_d32(cbuf,1023); - emit_opcode(cbuf,0x8B); // mov rbx,eax - emit_rm(cbuf, 0x3, EBX_enc, EAX_enc); - emit_opcode(cbuf,0xC1); // shl rax,20 - Slide to exponent position - emit_rm(cbuf,0x3,0x4,EAX_enc); - emit_d8(cbuf,20); - emit_opcode(cbuf,0x85); // test rbx,ecx - check for overflow - emit_rm(cbuf, 0x3, EBX_enc, ECX_enc); - emit_opcode(cbuf,0x0F); emit_opcode(cbuf,0x45); // CMOVne rax,ecx - overflow; stuff NAN into EAX - emit_rm(cbuf, 0x3, EAX_enc, ECX_enc); - emit_opcode(cbuf,0x89); // mov [esp+4],eax - Store as part of double word - encode_RegMem(cbuf, EAX_enc, ESP_enc, 0x4, 0, 4, false); - emit_opcode(cbuf,0xC7); // mov [esp+0],0 - [ESP] = (double)(1<=2 ) - return OptoRegPair(XMM0b_num,XMM0a_num); + return OptoRegPair(XMM0b_num,XMM0_num); if( ideal_reg == Op_RegF && UseSSE>=2 ) - return OptoRegPair(OptoReg::Bad,XMM0a_num); + return OptoRegPair(OptoReg::Bad,XMM0_num); return OptoRegPair(hi[ideal_reg],lo[ideal_reg]); %} @@ -3814,9 +3844,9 @@ static int lo[Op_RegL+1] = { 0, 0, OptoReg::Bad, EAX_num, EAX_num, FPR1L_num, FPR1L_num, EAX_num }; static int hi[Op_RegL+1] = { 0, 0, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, FPR1H_num, EDX_num }; if( ideal_reg == Op_RegD && UseSSE>=2 ) - return OptoRegPair(XMM0b_num,XMM0a_num); + return OptoRegPair(XMM0b_num,XMM0_num); if( ideal_reg == Op_RegF && UseSSE>=1 ) - return OptoRegPair(OptoReg::Bad,XMM0a_num); + return OptoRegPair(OptoReg::Bad,XMM0_num); return OptoRegPair(hi[ideal_reg],lo[ideal_reg]); %} @@ -4186,8 +4216,8 @@ // Register Operands // Integer Register -operand eRegI() %{ - constraint(ALLOC_IN_RC(e_reg)); +operand rRegI() %{ + constraint(ALLOC_IN_RC(int_reg)); match(RegI); match(xRegI); match(eAXRegI); @@ -4202,8 +4232,8 @@ %} // Subset of Integer Register -operand xRegI(eRegI reg) %{ - constraint(ALLOC_IN_RC(x_reg)); +operand xRegI(rRegI reg) %{ + constraint(ALLOC_IN_RC(int_x_reg)); match(reg); match(eAXRegI); match(eBXRegI); @@ -4218,7 +4248,7 @@ operand eAXRegI(xRegI reg) %{ constraint(ALLOC_IN_RC(eax_reg)); match(reg); - match(eRegI); + match(rRegI); format %{ "EAX" %} interface(REG_INTER); @@ -4228,7 +4258,7 @@ operand eBXRegI(xRegI reg) %{ constraint(ALLOC_IN_RC(ebx_reg)); match(reg); - match(eRegI); + match(rRegI); format %{ "EBX" %} interface(REG_INTER); @@ -4237,7 +4267,7 @@ operand eCXRegI(xRegI reg) %{ constraint(ALLOC_IN_RC(ecx_reg)); match(reg); - match(eRegI); + match(rRegI); format %{ "ECX" %} interface(REG_INTER); @@ -4246,7 +4276,7 @@ operand eDXRegI(xRegI reg) %{ constraint(ALLOC_IN_RC(edx_reg)); match(reg); - match(eRegI); + match(rRegI); format %{ "EDX" %} interface(REG_INTER); @@ -4255,7 +4285,7 @@ operand eDIRegI(xRegI reg) %{ constraint(ALLOC_IN_RC(edi_reg)); match(reg); - match(eRegI); + match(rRegI); format %{ "EDI" %} interface(REG_INTER); @@ -4302,7 +4332,7 @@ operand eSIRegI(xRegI reg) %{ constraint(ALLOC_IN_RC(esi_reg)); match(reg); - match(eRegI); + match(rRegI); format %{ "ESI" %} interface(REG_INTER); @@ -4323,7 +4353,7 @@ %} operand eRegP() %{ - constraint(ALLOC_IN_RC(e_reg)); + constraint(ALLOC_IN_RC(int_reg)); match(RegP); match(eAXRegP); match(eBXRegP); @@ -4336,7 +4366,7 @@ // On windows95, EBP is not safe to use for implicit null tests. operand eRegP_no_EBP() %{ - constraint(ALLOC_IN_RC(e_reg_no_rbp)); + constraint(ALLOC_IN_RC(int_reg_no_rbp)); match(RegP); match(eAXRegP); match(eBXRegP); @@ -4516,7 +4546,7 @@ // Float register operands operand regDPR() %{ predicate( UseSSE < 2 ); - constraint(ALLOC_IN_RC(dbl_reg)); + constraint(ALLOC_IN_RC(fp_dbl_reg)); match(RegD); match(regDPR1); match(regDPR2); @@ -4526,7 +4556,7 @@ operand regDPR1(regDPR reg) %{ predicate( UseSSE < 2 ); - constraint(ALLOC_IN_RC(dbl_reg0)); + constraint(ALLOC_IN_RC(fp_dbl_reg0)); match(reg); format %{ "FPR1" %} interface(REG_INTER); @@ -4534,7 +4564,7 @@ operand regDPR2(regDPR reg) %{ predicate( UseSSE < 2 ); - constraint(ALLOC_IN_RC(dbl_reg1)); + constraint(ALLOC_IN_RC(fp_dbl_reg1)); match(reg); format %{ "FPR2" %} interface(REG_INTER); @@ -4542,45 +4572,16 @@ operand regnotDPR1(regDPR reg) %{ predicate( UseSSE < 2 ); - constraint(ALLOC_IN_RC(dbl_notreg0)); + constraint(ALLOC_IN_RC(fp_dbl_notreg0)); match(reg); format %{ %} interface(REG_INTER); %} -// XMM Double register operands -operand regD() %{ - predicate( UseSSE>=2 ); - constraint(ALLOC_IN_RC(xdb_reg)); - match(RegD); - match(regD6); - match(regD7); - format %{ %} - interface(REG_INTER); -%} - -// XMM6 double register operands -operand regD6(regD reg) %{ - predicate( UseSSE>=2 ); - constraint(ALLOC_IN_RC(xdb_reg6)); - match(reg); - format %{ "XMM6" %} - interface(REG_INTER); -%} - -// XMM7 double register operands -operand regD7(regD reg) %{ - predicate( UseSSE>=2 ); - constraint(ALLOC_IN_RC(xdb_reg7)); - match(reg); - format %{ "XMM7" %} - interface(REG_INTER); -%} - // Float register operands operand regFPR() %{ predicate( UseSSE < 2 ); - constraint(ALLOC_IN_RC(flt_reg)); + constraint(ALLOC_IN_RC(fp_flt_reg)); match(RegF); match(regFPR1); format %{ %} @@ -4590,21 +4591,30 @@ // Float register operands operand regFPR1(regFPR reg) %{ predicate( UseSSE < 2 ); - constraint(ALLOC_IN_RC(flt_reg0)); + constraint(ALLOC_IN_RC(fp_flt_reg0)); match(reg); format %{ "FPR1" %} interface(REG_INTER); %} -// XMM register operands +// XMM Float register operands operand regF() %{ predicate( UseSSE>=1 ); - constraint(ALLOC_IN_RC(xmm_reg)); + constraint(ALLOC_IN_RC(float_reg)); match(RegF); format %{ %} interface(REG_INTER); %} +// XMM Double register operands +operand regD() %{ + predicate( UseSSE>=2 ); + constraint(ALLOC_IN_RC(double_reg)); + match(RegD); + format %{ %} + interface(REG_INTER); +%} + //----------Memory Operands---------------------------------------------------- // Direct Memory Operand @@ -4622,7 +4632,7 @@ // Indirect Memory Operand operand indirect(eRegP reg) %{ - constraint(ALLOC_IN_RC(e_reg)); + constraint(ALLOC_IN_RC(int_reg)); match(reg); format %{ "[$reg]" %} @@ -4661,7 +4671,7 @@ %} // Indirect Memory Plus Long Offset Operand -operand indOffset32X(eRegI reg, immP off) %{ +operand indOffset32X(rRegI reg, immP off) %{ match(AddP off reg); format %{ "[$reg + $off]" %} @@ -4674,7 +4684,7 @@ %} // Indirect Memory Plus Index Register Plus Offset Operand -operand indIndexOffset(eRegP reg, eRegI ireg, immI off) %{ +operand indIndexOffset(eRegP reg, rRegI ireg, immI off) %{ match(AddP (AddP reg ireg) off); op_cost(10); @@ -4688,7 +4698,7 @@ %} // Indirect Memory Plus Index Register Plus Offset Operand -operand indIndex(eRegP reg, eRegI ireg) %{ +operand indIndex(eRegP reg, rRegI ireg) %{ match(AddP reg ireg); op_cost(10); @@ -4706,7 +4716,7 @@ // // ------------------------------------------------------------------------- // // Scaled Memory Operands // // Indirect Memory Times Scale Plus Offset Operand -// operand indScaleOffset(immP off, eRegI ireg, immI2 scale) %{ +// operand indScaleOffset(immP off, rRegI ireg, immI2 scale) %{ // match(AddP off (LShiftI ireg scale)); // // op_cost(10); @@ -4720,7 +4730,7 @@ // %} // Indirect Memory Times Scale Plus Index Register -operand indIndexScale(eRegP reg, eRegI ireg, immI2 scale) %{ +operand indIndexScale(eRegP reg, rRegI ireg, immI2 scale) %{ match(AddP reg (LShiftI ireg scale)); op_cost(10); @@ -4734,7 +4744,7 @@ %} // Indirect Memory Times Scale Plus Index Register Plus Offset Operand -operand indIndexScaleOffset(eRegP reg, immI off, eRegI ireg, immI2 scale) %{ +operand indIndexScaleOffset(eRegP reg, immI off, rRegI ireg, immI2 scale) %{ match(AddP (AddP reg (LShiftI ireg scale)) off); op_cost(10); @@ -4862,7 +4872,7 @@ // Indirect Memory Operand operand indirect_win95_safe(eRegP_no_EBP reg) %{ - constraint(ALLOC_IN_RC(e_reg)); + constraint(ALLOC_IN_RC(int_reg)); match(reg); op_cost(100); @@ -4906,7 +4916,7 @@ %} // Indirect Memory Plus Index Register Plus Offset Operand -operand indIndexOffset_win95_safe(eRegP_no_EBP reg, eRegI ireg, immI off) +operand indIndexOffset_win95_safe(eRegP_no_EBP reg, rRegI ireg, immI off) %{ match(AddP (AddP reg ireg) off); @@ -4921,7 +4931,7 @@ %} // Indirect Memory Times Scale Plus Index Register -operand indIndexScale_win95_safe(eRegP_no_EBP reg, eRegI ireg, immI2 scale) +operand indIndexScale_win95_safe(eRegP_no_EBP reg, rRegI ireg, immI2 scale) %{ match(AddP reg (LShiftI ireg scale)); @@ -4936,7 +4946,7 @@ %} // Indirect Memory Times Scale Plus Index Register Plus Offset Operand -operand indIndexScaleOffset_win95_safe(eRegP_no_EBP reg, immI off, eRegI ireg, immI2 scale) +operand indIndexScaleOffset_win95_safe(eRegP_no_EBP reg, immI off, rRegI ireg, immI2 scale) %{ match(AddP (AddP reg (LShiftI ireg scale)) off); @@ -5125,7 +5135,7 @@ // Or: _mem if it requires the big decoder and a memory unit. // Integer ALU reg operation -pipe_class ialu_reg(eRegI dst) %{ +pipe_class ialu_reg(rRegI dst) %{ single_instruction; dst : S4(write); dst : S3(read); @@ -5143,7 +5153,7 @@ %} // Integer ALU reg operation using big decoder -pipe_class ialu_reg_fat(eRegI dst) %{ +pipe_class ialu_reg_fat(rRegI dst) %{ single_instruction; dst : S4(write); dst : S3(read); @@ -5161,7 +5171,7 @@ %} // Integer ALU reg-reg operation -pipe_class ialu_reg_reg(eRegI dst, eRegI src) %{ +pipe_class ialu_reg_reg(rRegI dst, rRegI src) %{ single_instruction; dst : S4(write); src : S3(read); @@ -5179,7 +5189,7 @@ %} // Integer ALU reg-reg operation -pipe_class ialu_reg_reg_fat(eRegI dst, memory src) %{ +pipe_class ialu_reg_reg_fat(rRegI dst, memory src) %{ single_instruction; dst : S4(write); src : S3(read); @@ -5197,7 +5207,7 @@ %} // Integer ALU reg-mem operation -pipe_class ialu_reg_mem(eRegI dst, memory mem) %{ +pipe_class ialu_reg_mem(rRegI dst, memory mem) %{ single_instruction; dst : S5(write); mem : S3(read); @@ -5226,7 +5236,7 @@ %} // Integer Store to Memory -pipe_class ialu_mem_reg(memory mem, eRegI src) %{ +pipe_class ialu_mem_reg(memory mem, rRegI src) %{ single_instruction; mem : S3(read); src : S5(read); @@ -5255,7 +5265,7 @@ %} // Integer ALU0 reg-reg operation -pipe_class ialu_reg_reg_alu0(eRegI dst, eRegI src) %{ +pipe_class ialu_reg_reg_alu0(rRegI dst, rRegI src) %{ single_instruction; dst : S4(write); src : S3(read); @@ -5264,7 +5274,7 @@ %} // Integer ALU0 reg-mem operation -pipe_class ialu_reg_mem_alu0(eRegI dst, memory mem) %{ +pipe_class ialu_reg_mem_alu0(rRegI dst, memory mem) %{ single_instruction; dst : S5(write); mem : S3(read); @@ -5274,7 +5284,7 @@ %} // Integer ALU reg-reg operation -pipe_class ialu_cr_reg_reg(eFlagsReg cr, eRegI src1, eRegI src2) %{ +pipe_class ialu_cr_reg_reg(eFlagsReg cr, rRegI src1, rRegI src2) %{ single_instruction; cr : S4(write); src1 : S3(read); @@ -5284,7 +5294,7 @@ %} // Integer ALU reg-imm operation -pipe_class ialu_cr_reg_imm(eFlagsReg cr, eRegI src1) %{ +pipe_class ialu_cr_reg_imm(eFlagsReg cr, rRegI src1) %{ single_instruction; cr : S4(write); src1 : S3(read); @@ -5293,7 +5303,7 @@ %} // Integer ALU reg-mem operation -pipe_class ialu_cr_reg_mem(eFlagsReg cr, eRegI src1, memory src2) %{ +pipe_class ialu_cr_reg_mem(eFlagsReg cr, rRegI src1, memory src2) %{ single_instruction; cr : S4(write); src1 : S3(read); @@ -5304,7 +5314,7 @@ %} // Conditional move reg-reg -pipe_class pipe_cmplt( eRegI p, eRegI q, eRegI y ) %{ +pipe_class pipe_cmplt( rRegI p, rRegI q, rRegI y ) %{ instruction_count(4); y : S4(read); q : S3(read); @@ -5313,7 +5323,7 @@ %} // Conditional move reg-reg -pipe_class pipe_cmov_reg( eRegI dst, eRegI src, eFlagsReg cr ) %{ +pipe_class pipe_cmov_reg( rRegI dst, rRegI src, eFlagsReg cr ) %{ single_instruction; dst : S4(write); src : S3(read); @@ -5322,7 +5332,7 @@ %} // Conditional move reg-mem -pipe_class pipe_cmov_mem( eFlagsReg cr, eRegI dst, memory src) %{ +pipe_class pipe_cmov_mem( eFlagsReg cr, rRegI dst, memory src) %{ single_instruction; dst : S4(write); src : S3(read); @@ -5573,7 +5583,7 @@ // in the encode section of the architecture description. //----------BSWAP-Instruction-------------------------------------------------- -instruct bytes_reverse_int(eRegI dst) %{ +instruct bytes_reverse_int(rRegI dst) %{ match(Set dst (ReverseBytesI dst)); format %{ "BSWAP $dst" %} @@ -5594,8 +5604,9 @@ ins_pipe( ialu_reg_reg); %} -instruct bytes_reverse_unsigned_short(eRegI dst) %{ +instruct bytes_reverse_unsigned_short(rRegI dst, eFlagsReg cr) %{ match(Set dst (ReverseBytesUS dst)); + effect(KILL cr); format %{ "BSWAP $dst\n\t" "SHR $dst,16\n\t" %} @@ -5606,8 +5617,9 @@ ins_pipe( ialu_reg ); %} -instruct bytes_reverse_short(eRegI dst) %{ +instruct bytes_reverse_short(rRegI dst, eFlagsReg cr) %{ match(Set dst (ReverseBytesS dst)); + effect(KILL cr); format %{ "BSWAP $dst\n\t" "SAR $dst,16\n\t" %} @@ -5621,7 +5633,7 @@ //---------- Zeros Count Instructions ------------------------------------------ -instruct countLeadingZerosI(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct countLeadingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{ predicate(UseCountLeadingZerosInstruction); match(Set dst (CountLeadingZerosI src)); effect(KILL cr); @@ -5633,7 +5645,7 @@ ins_pipe(ialu_reg); %} -instruct countLeadingZerosI_bsr(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct countLeadingZerosI_bsr(rRegI dst, rRegI src, eFlagsReg cr) %{ predicate(!UseCountLeadingZerosInstruction); match(Set dst (CountLeadingZerosI src)); effect(KILL cr); @@ -5658,7 +5670,7 @@ ins_pipe(ialu_reg); %} -instruct countLeadingZerosL(eRegI dst, eRegL src, eFlagsReg cr) %{ +instruct countLeadingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{ predicate(UseCountLeadingZerosInstruction); match(Set dst (CountLeadingZerosL src)); effect(TEMP dst, KILL cr); @@ -5681,7 +5693,7 @@ ins_pipe(ialu_reg); %} -instruct countLeadingZerosL_bsr(eRegI dst, eRegL src, eFlagsReg cr) %{ +instruct countLeadingZerosL_bsr(rRegI dst, eRegL src, eFlagsReg cr) %{ predicate(!UseCountLeadingZerosInstruction); match(Set dst (CountLeadingZerosL src)); effect(TEMP dst, KILL cr); @@ -5717,7 +5729,7 @@ ins_pipe(ialu_reg); %} -instruct countTrailingZerosI(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct countTrailingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{ match(Set dst (CountTrailingZerosI src)); effect(KILL cr); @@ -5736,7 +5748,7 @@ ins_pipe(ialu_reg); %} -instruct countTrailingZerosL(eRegI dst, eRegL src, eFlagsReg cr) %{ +instruct countTrailingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{ match(Set dst (CountTrailingZerosL src)); effect(TEMP dst, KILL cr); @@ -5768,9 +5780,10 @@ //---------- Population Count Instructions ------------------------------------- -instruct popCountI(eRegI dst, eRegI src) %{ +instruct popCountI(rRegI dst, rRegI src, eFlagsReg cr) %{ predicate(UsePopCountInstruction); match(Set dst (PopCountI src)); + effect(KILL cr); format %{ "POPCNT $dst, $src" %} ins_encode %{ @@ -5779,9 +5792,10 @@ ins_pipe(ialu_reg); %} -instruct popCountI_mem(eRegI dst, memory mem) %{ +instruct popCountI_mem(rRegI dst, memory mem, eFlagsReg cr) %{ predicate(UsePopCountInstruction); match(Set dst (PopCountI (LoadI mem))); + effect(KILL cr); format %{ "POPCNT $dst, $mem" %} ins_encode %{ @@ -5791,7 +5805,7 @@ %} // Note: Long.bitCount(long) returns an int. -instruct popCountL(eRegI dst, eRegL src, eRegI tmp, eFlagsReg cr) %{ +instruct popCountL(rRegI dst, eRegL src, rRegI tmp, eFlagsReg cr) %{ predicate(UsePopCountInstruction); match(Set dst (PopCountL src)); effect(KILL cr, TEMP tmp, TEMP dst); @@ -5808,7 +5822,7 @@ %} // Note: Long.bitCount(long) returns an int. -instruct popCountL_mem(eRegI dst, memory mem, eRegI tmp, eFlagsReg cr) %{ +instruct popCountL_mem(rRegI dst, memory mem, rRegI tmp, eFlagsReg cr) %{ predicate(UsePopCountInstruction); match(Set dst (PopCountL (LoadL mem))); effect(KILL cr, TEMP tmp, TEMP dst); @@ -5912,7 +5926,7 @@ %} // Load Short (16bit signed) -instruct loadS(eRegI dst, memory mem) %{ +instruct loadS(rRegI dst, memory mem) %{ match(Set dst (LoadS mem)); ins_cost(125); @@ -5926,7 +5940,7 @@ %} // Load Short (16 bit signed) to Byte (8 bit signed) -instruct loadS2B(eRegI dst, memory mem, immI_24 twentyfour) %{ +instruct loadS2B(rRegI dst, memory mem, immI_24 twentyfour) %{ match(Set dst (RShiftI (LShiftI (LoadS mem) twentyfour) twentyfour)); ins_cost(125); @@ -5957,7 +5971,7 @@ %} // Load Unsigned Short/Char (16bit unsigned) -instruct loadUS(eRegI dst, memory mem) %{ +instruct loadUS(rRegI dst, memory mem) %{ match(Set dst (LoadUS mem)); ins_cost(125); @@ -5971,7 +5985,7 @@ %} // Load Unsigned Short/Char (16 bit UNsigned) to Byte (8 bit signed) -instruct loadUS2B(eRegI dst, memory mem, immI_24 twentyfour) %{ +instruct loadUS2B(rRegI dst, memory mem, immI_24 twentyfour) %{ match(Set dst (RShiftI (LShiftI (LoadUS mem) twentyfour) twentyfour)); ins_cost(125); @@ -6032,7 +6046,7 @@ %} // Load Integer -instruct loadI(eRegI dst, memory mem) %{ +instruct loadI(rRegI dst, memory mem) %{ match(Set dst (LoadI mem)); ins_cost(125); @@ -6046,7 +6060,7 @@ %} // Load Integer (32 bit signed) to Byte (8 bit signed) -instruct loadI2B(eRegI dst, memory mem, immI_24 twentyfour) %{ +instruct loadI2B(rRegI dst, memory mem, immI_24 twentyfour) %{ match(Set dst (RShiftI (LShiftI (LoadI mem) twentyfour) twentyfour)); ins_cost(125); @@ -6058,7 +6072,7 @@ %} // Load Integer (32 bit signed) to Unsigned Byte (8 bit UNsigned) -instruct loadI2UB(eRegI dst, memory mem, immI_255 mask) %{ +instruct loadI2UB(rRegI dst, memory mem, immI_255 mask) %{ match(Set dst (AndI (LoadI mem) mask)); ins_cost(125); @@ -6070,7 +6084,7 @@ %} // Load Integer (32 bit signed) to Short (16 bit signed) -instruct loadI2S(eRegI dst, memory mem, immI_16 sixteen) %{ +instruct loadI2S(rRegI dst, memory mem, immI_16 sixteen) %{ match(Set dst (RShiftI (LShiftI (LoadI mem) sixteen) sixteen)); ins_cost(125); @@ -6082,7 +6096,7 @@ %} // Load Integer (32 bit signed) to Unsigned Short/Char (16 bit UNsigned) -instruct loadI2US(eRegI dst, memory mem, immI_65535 mask) %{ +instruct loadI2US(rRegI dst, memory mem, immI_65535 mask) %{ match(Set dst (AndI (LoadI mem) mask)); ins_cost(125); @@ -6243,7 +6257,7 @@ %} // Load Range -instruct loadRange(eRegI dst, memory mem) %{ +instruct loadRange(rRegI dst, memory mem) %{ match(Set dst (LoadRange mem)); ins_cost(125); @@ -6340,66 +6354,6 @@ ins_pipe( fpu_reg_mem ); %} -// Load Aligned Packed Byte to XMM register -instruct loadA8B(regD dst, memory mem) %{ - predicate(UseSSE>=1); - match(Set dst (Load8B mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed8B" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - -// Load Aligned Packed Short to XMM register -instruct loadA4S(regD dst, memory mem) %{ - predicate(UseSSE>=1); - match(Set dst (Load4S mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed4S" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - -// Load Aligned Packed Char to XMM register -instruct loadA4C(regD dst, memory mem) %{ - predicate(UseSSE>=1); - match(Set dst (Load4C mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed4C" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - -// Load Aligned Packed Integer to XMM register -instruct load2IU(regD dst, memory mem) %{ - predicate(UseSSE>=1); - match(Set dst (Load2I mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed2I" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - -// Load Aligned Packed Single to XMM -instruct loadA2F(regD dst, memory mem) %{ - predicate(UseSSE>=1); - match(Set dst (Load2F mem)); - ins_cost(145); - format %{ "MOVQ $dst,$mem\t! packed2F" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - // Load Effective Address instruct leaP8(eRegP dst, indOffset8 mem) %{ match(Set dst mem); @@ -6452,7 +6406,7 @@ %} // Load Constant -instruct loadConI(eRegI dst, immI src) %{ +instruct loadConI(rRegI dst, immI src) %{ match(Set dst src); format %{ "MOV $dst,$src" %} @@ -6461,7 +6415,7 @@ %} // Load Constant zero -instruct loadConI0(eRegI dst, immI0 src, eFlagsReg cr) %{ +instruct loadConI0(rRegI dst, immI0 src, eFlagsReg cr) %{ match(Set dst src); effect(KILL cr); @@ -6629,7 +6583,7 @@ %} // Load Stack Slot -instruct loadSSI(eRegI dst, stackSlotI src) %{ +instruct loadSSI(rRegI dst, stackSlotI src) %{ match(Set dst src); ins_cost(125); @@ -6856,7 +6810,7 @@ %} // Store Char/Short -instruct storeC(memory mem, eRegI src) %{ +instruct storeC(memory mem, rRegI src) %{ match(Set mem (StoreC mem src)); ins_cost(125); @@ -6867,7 +6821,7 @@ %} // Store Integer -instruct storeI(memory mem, eRegI src) %{ +instruct storeI(memory mem, rRegI src) %{ match(Set mem (StoreI mem src)); ins_cost(125); @@ -7011,42 +6965,6 @@ ins_pipe( ialu_mem_imm ); %} -// Store Aligned Packed Byte XMM register to memory -instruct storeA8B(memory mem, regD src) %{ - predicate(UseSSE>=1); - match(Set mem (Store8B mem src)); - ins_cost(145); - format %{ "MOVQ $mem,$src\t! packed8B" %} - ins_encode %{ - __ movq($mem$$Address, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - -// Store Aligned Packed Char/Short XMM register to memory -instruct storeA4C(memory mem, regD src) %{ - predicate(UseSSE>=1); - match(Set mem (Store4C mem src)); - ins_cost(145); - format %{ "MOVQ $mem,$src\t! packed4C" %} - ins_encode %{ - __ movq($mem$$Address, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - -// Store Aligned Packed Integer XMM register to memory -instruct storeA2I(memory mem, regD src) %{ - predicate(UseSSE>=1); - match(Set mem (Store2I mem src)); - ins_cost(145); - format %{ "MOVQ $mem,$src\t! packed2I" %} - ins_encode %{ - __ movq($mem$$Address, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - // Store CMS card-mark Immediate instruct storeImmCM(memory mem, immI8 src) %{ match(Set mem (StoreCM mem src)); @@ -7108,18 +7026,6 @@ ins_pipe( pipe_slow ); %} -// Store Aligned Packed Single Float XMM register to memory -instruct storeA2F(memory mem, regD src) %{ - predicate(UseSSE>=1); - match(Set mem (Store2F mem src)); - ins_cost(145); - format %{ "MOVQ $mem,$src\t! packed2F" %} - ins_encode %{ - __ movq($mem$$Address, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - // Store Float instruct storeFPR( memory mem, regFPR1 src) %{ predicate(UseSSE==0); @@ -7181,7 +7087,7 @@ %} // Store Integer to stack slot -instruct storeSSI(stackSlotI dst, eRegI src) %{ +instruct storeSSI(stackSlotI dst, rRegI src) %{ match(Set dst src); ins_cost(100); @@ -7306,7 +7212,7 @@ ins_pipe(empty); %} -instruct castP2X(eRegI dst, eRegP src ) %{ +instruct castP2X(rRegI dst, eRegP src ) %{ match(Set dst (CastP2X src)); ins_cost(50); format %{ "MOV $dst, $src\t# CastP2X" %} @@ -7316,7 +7222,7 @@ //----------Conditional Move--------------------------------------------------- // Conditional move -instruct jmovI_reg(cmpOp cop, eFlagsReg cr, eRegI dst, eRegI src) %{ +instruct jmovI_reg(cmpOp cop, eFlagsReg cr, rRegI dst, rRegI src) %{ predicate(!VM_Version::supports_cmov() ); match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); ins_cost(200); @@ -7333,7 +7239,7 @@ ins_pipe( pipe_cmov_reg ); %} -instruct jmovI_regU(cmpOpU cop, eFlagsRegU cr, eRegI dst, eRegI src) %{ +instruct jmovI_regU(cmpOpU cop, eFlagsRegU cr, rRegI dst, rRegI src) %{ predicate(!VM_Version::supports_cmov() ); match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); ins_cost(200); @@ -7350,7 +7256,7 @@ ins_pipe( pipe_cmov_reg ); %} -instruct cmovI_reg(eRegI dst, eRegI src, eFlagsReg cr, cmpOp cop ) %{ +instruct cmovI_reg(rRegI dst, rRegI src, eFlagsReg cr, cmpOp cop ) %{ predicate(VM_Version::supports_cmov() ); match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); ins_cost(200); @@ -7360,7 +7266,7 @@ ins_pipe( pipe_cmov_reg ); %} -instruct cmovI_regU( cmpOpU cop, eFlagsRegU cr, eRegI dst, eRegI src ) %{ +instruct cmovI_regU( cmpOpU cop, eFlagsRegU cr, rRegI dst, rRegI src ) %{ predicate(VM_Version::supports_cmov() ); match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); ins_cost(200); @@ -7370,7 +7276,7 @@ ins_pipe( pipe_cmov_reg ); %} -instruct cmovI_regUCF( cmpOpUCF cop, eFlagsRegUCF cr, eRegI dst, eRegI src ) %{ +instruct cmovI_regUCF( cmpOpUCF cop, eFlagsRegUCF cr, rRegI dst, rRegI src ) %{ predicate(VM_Version::supports_cmov() ); match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); ins_cost(200); @@ -7380,7 +7286,7 @@ %} // Conditional move -instruct cmovI_mem(cmpOp cop, eFlagsReg cr, eRegI dst, memory src) %{ +instruct cmovI_mem(cmpOp cop, eFlagsReg cr, rRegI dst, memory src) %{ predicate(VM_Version::supports_cmov() ); match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); ins_cost(250); @@ -7391,7 +7297,7 @@ %} // Conditional move -instruct cmovI_memU(cmpOpU cop, eFlagsRegU cr, eRegI dst, memory src) %{ +instruct cmovI_memU(cmpOpU cop, eFlagsRegU cr, rRegI dst, memory src) %{ predicate(VM_Version::supports_cmov() ); match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); ins_cost(250); @@ -7401,7 +7307,7 @@ ins_pipe( pipe_cmov_mem ); %} -instruct cmovI_memUCF(cmpOpUCF cop, eFlagsRegUCF cr, eRegI dst, memory src) %{ +instruct cmovI_memUCF(cmpOpUCF cop, eFlagsRegUCF cr, rRegI dst, memory src) %{ predicate(VM_Version::supports_cmov() ); match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); ins_cost(250); @@ -7655,7 +7561,7 @@ //----------Arithmetic Instructions-------------------------------------------- //----------Addition Instructions---------------------------------------------- // Integer Addition Instructions -instruct addI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct addI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ match(Set dst (AddI dst src)); effect(KILL cr); @@ -7666,7 +7572,7 @@ ins_pipe( ialu_reg_reg ); %} -instruct addI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{ +instruct addI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{ match(Set dst (AddI dst src)); effect(KILL cr); @@ -7676,7 +7582,7 @@ ins_pipe( ialu_reg ); %} -instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{ +instruct incI_eReg(rRegI dst, immI1 src, eFlagsReg cr) %{ predicate(UseIncDec); match(Set dst (AddI dst src)); effect(KILL cr); @@ -7688,7 +7594,7 @@ ins_pipe( ialu_reg ); %} -instruct leaI_eReg_immI(eRegI dst, eRegI src0, immI src1) %{ +instruct leaI_eReg_immI(rRegI dst, rRegI src0, immI src1) %{ match(Set dst (AddI src0 src1)); ins_cost(110); @@ -7708,7 +7614,7 @@ ins_pipe( ialu_reg_reg ); %} -instruct decI_eReg(eRegI dst, immI_M1 src, eFlagsReg cr) %{ +instruct decI_eReg(rRegI dst, immI_M1 src, eFlagsReg cr) %{ predicate(UseIncDec); match(Set dst (AddI dst src)); effect(KILL cr); @@ -7720,7 +7626,7 @@ ins_pipe( ialu_reg ); %} -instruct addP_eReg(eRegP dst, eRegI src, eFlagsReg cr) %{ +instruct addP_eReg(eRegP dst, rRegI src, eFlagsReg cr) %{ match(Set dst (AddP dst src)); effect(KILL cr); @@ -7742,7 +7648,7 @@ ins_pipe( ialu_reg ); %} -instruct addI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{ +instruct addI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{ match(Set dst (AddI dst (LoadI src))); effect(KILL cr); @@ -7753,7 +7659,7 @@ ins_pipe( ialu_reg_mem ); %} -instruct addI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{ +instruct addI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{ match(Set dst (StoreI dst (AddI (LoadI dst) src))); effect(KILL cr); @@ -7815,7 +7721,7 @@ ins_pipe( empty ); %} -instruct castII( eRegI dst ) %{ +instruct castII( rRegI dst ) %{ match(Set dst (CastII dst)); format %{ "#castII of $dst" %} ins_encode( /*empty encoding*/ ); @@ -7835,50 +7741,6 @@ ins_pipe( ialu_reg_mem ); %} -// LoadLong-locked - same as a volatile long load when used with compare-swap -instruct loadLLocked(stackSlotL dst, memory mem) %{ - predicate(UseSSE<=1); - match(Set dst (LoadLLocked mem)); - - ins_cost(200); - format %{ "FILD $mem\t# Atomic volatile long load\n\t" - "FISTp $dst" %} - ins_encode(enc_loadL_volatile(mem,dst)); - ins_pipe( fpu_reg_mem ); -%} - -instruct loadLX_Locked(stackSlotL dst, memory mem, regD tmp) %{ - predicate(UseSSE>=2); - match(Set dst (LoadLLocked mem)); - effect(TEMP tmp); - ins_cost(180); - format %{ "MOVSD $tmp,$mem\t# Atomic volatile long load\n\t" - "MOVSD $dst,$tmp" %} - ins_encode %{ - __ movdbl($tmp$$XMMRegister, $mem$$Address); - __ movdbl(Address(rsp, $dst$$disp), $tmp$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - -instruct loadLX_reg_Locked(eRegL dst, memory mem, regD tmp) %{ - predicate(UseSSE>=2); - match(Set dst (LoadLLocked mem)); - effect(TEMP tmp); - ins_cost(160); - format %{ "MOVSD $tmp,$mem\t# Atomic volatile long load\n\t" - "MOVD $dst.lo,$tmp\n\t" - "PSRLQ $tmp,32\n\t" - "MOVD $dst.hi,$tmp" %} - ins_encode %{ - __ movdbl($tmp$$XMMRegister, $mem$$Address); - __ movdl($dst$$Register, $tmp$$XMMRegister); - __ psrlq($tmp$$XMMRegister, 32); - __ movdl(HIGH_FROM_LOW($dst$$Register), $tmp$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - // Conditional-store of the updated heap-top. // Used during allocation of the shared heap. // Sets flags (EQ) on success. Implemented with a CMPXCHG on Intel. @@ -7893,7 +7755,7 @@ // Conditional-store of an int value. // ZF flag is set on success, reset otherwise. Implemented with a CMPXCHG on Intel. -instruct storeIConditional( memory mem, eAXRegI oldval, eRegI newval, eFlagsReg cr ) %{ +instruct storeIConditional( memory mem, eAXRegI oldval, rRegI newval, eFlagsReg cr ) %{ match(Set cr (StoreIConditional mem (Binary oldval newval))); effect(KILL oldval); format %{ "CMPXCHG $mem,$newval\t# If EAX==$mem Then store $newval into $mem" %} @@ -7926,7 +7788,7 @@ // No flag versions for CompareAndSwap{P,I,L} because matcher can't match them -instruct compareAndSwapL( eRegI res, eSIRegP mem_ptr, eADXRegL oldval, eBCXRegL newval, eFlagsReg cr ) %{ +instruct compareAndSwapL( rRegI res, eSIRegP mem_ptr, eADXRegL oldval, eBCXRegL newval, eFlagsReg cr ) %{ match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval))); effect(KILL cr, KILL oldval); format %{ "CMPXCHG8 [$mem_ptr],$newval\t# If EDX:EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t" @@ -7939,7 +7801,7 @@ ins_pipe( pipe_cmpxchg ); %} -instruct compareAndSwapP( eRegI res, pRegP mem_ptr, eAXRegP oldval, eCXRegP newval, eFlagsReg cr) %{ +instruct compareAndSwapP( rRegI res, pRegP mem_ptr, eAXRegP oldval, eCXRegP newval, eFlagsReg cr) %{ match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval))); effect(KILL cr, KILL oldval); format %{ "CMPXCHG [$mem_ptr],$newval\t# If EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t" @@ -7951,7 +7813,7 @@ ins_pipe( pipe_cmpxchg ); %} -instruct compareAndSwapI( eRegI res, pRegP mem_ptr, eAXRegI oldval, eCXRegI newval, eFlagsReg cr) %{ +instruct compareAndSwapI( rRegI res, pRegP mem_ptr, eAXRegI oldval, eCXRegI newval, eFlagsReg cr) %{ match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval))); effect(KILL cr, KILL oldval); format %{ "CMPXCHG [$mem_ptr],$newval\t# If EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t" @@ -7965,7 +7827,7 @@ //----------Subtraction Instructions------------------------------------------- // Integer Subtraction Instructions -instruct subI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct subI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ match(Set dst (SubI dst src)); effect(KILL cr); @@ -7976,7 +7838,7 @@ ins_pipe( ialu_reg_reg ); %} -instruct subI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{ +instruct subI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{ match(Set dst (SubI dst src)); effect(KILL cr); @@ -7987,7 +7849,7 @@ ins_pipe( ialu_reg ); %} -instruct subI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{ +instruct subI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{ match(Set dst (SubI dst (LoadI src))); effect(KILL cr); @@ -7998,7 +7860,7 @@ ins_pipe( ialu_reg_mem ); %} -instruct subI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{ +instruct subI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{ match(Set dst (StoreI dst (SubI (LoadI dst) src))); effect(KILL cr); @@ -8010,7 +7872,7 @@ %} // Subtract from a pointer -instruct subP_eReg(eRegP dst, eRegI src, immI0 zero, eFlagsReg cr) %{ +instruct subP_eReg(eRegP dst, rRegI src, immI0 zero, eFlagsReg cr) %{ match(Set dst (AddP dst (SubI zero src))); effect(KILL cr); @@ -8021,7 +7883,7 @@ ins_pipe( ialu_reg_reg ); %} -instruct negI_eReg(eRegI dst, immI0 zero, eFlagsReg cr) %{ +instruct negI_eReg(rRegI dst, immI0 zero, eFlagsReg cr) %{ match(Set dst (SubI zero dst)); effect(KILL cr); @@ -8036,7 +7898,7 @@ //----------Multiplication/Division Instructions------------------------------- // Integer Multiplication Instructions // Multiply Register -instruct mulI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct mulI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ match(Set dst (MulI dst src)); effect(KILL cr); @@ -8049,7 +7911,7 @@ %} // Multiply 32-bit Immediate -instruct mulI_eReg_imm(eRegI dst, eRegI src, immI imm, eFlagsReg cr) %{ +instruct mulI_eReg_imm(rRegI dst, rRegI src, immI imm, eFlagsReg cr) %{ match(Set dst (MulI src imm)); effect(KILL cr); @@ -8105,7 +7967,7 @@ %} // Multiply Memory 32-bit Immediate -instruct mulI_mem_imm(eRegI dst, memory src, immI imm, eFlagsReg cr) %{ +instruct mulI_mem_imm(rRegI dst, memory src, immI imm, eFlagsReg cr) %{ match(Set dst (MulI (LoadI src) imm)); effect(KILL cr); @@ -8117,7 +7979,7 @@ %} // Multiply Memory -instruct mulI(eRegI dst, memory src, eFlagsReg cr) %{ +instruct mulI(rRegI dst, memory src, eFlagsReg cr) %{ match(Set dst (MulI dst (LoadI src))); effect(KILL cr); @@ -8154,7 +8016,7 @@ %} // Multiply Register Long -instruct mulL_eReg(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{ +instruct mulL_eReg(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{ match(Set dst (MulL dst src)); effect(KILL cr, TEMP tmp); ins_cost(4*100+3*400); @@ -8172,7 +8034,7 @@ %} // Multiply Register Long where the left operand's high 32 bits are zero -instruct mulL_eReg_lhi0(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{ +instruct mulL_eReg_lhi0(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{ predicate(is_operand_hi32_zero(n->in(1))); match(Set dst (MulL dst src)); effect(KILL cr, TEMP tmp); @@ -8193,7 +8055,7 @@ %} // Multiply Register Long where the right operand's high 32 bits are zero -instruct mulL_eReg_rhi0(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{ +instruct mulL_eReg_rhi0(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{ predicate(is_operand_hi32_zero(n->in(2))); match(Set dst (MulL dst src)); effect(KILL cr, TEMP tmp); @@ -8229,7 +8091,7 @@ %} // Multiply Register Long by small constant -instruct mulL_eReg_con(eADXRegL dst, immL_127 src, eRegI tmp, eFlagsReg cr) %{ +instruct mulL_eReg_con(eADXRegL dst, immL_127 src, rRegI tmp, eFlagsReg cr) %{ match(Set dst (MulL dst src)); effect(KILL cr, TEMP tmp); ins_cost(2*100+2*400); @@ -8327,7 +8189,7 @@ %} // Divide Register Long (no special case since divisor != -1) -instruct divL_eReg_imm32( eADXRegL dst, immL32 imm, eRegI tmp, eRegI tmp2, eFlagsReg cr ) %{ +instruct divL_eReg_imm32( eADXRegL dst, immL32 imm, rRegI tmp, rRegI tmp2, eFlagsReg cr ) %{ match(Set dst (DivL dst imm)); effect( TEMP tmp, TEMP tmp2, KILL cr ); ins_cost(1000); @@ -8398,7 +8260,7 @@ %} // Remainder Register Long (remainder fit into 32 bits) -instruct modL_eReg_imm32( eADXRegL dst, immL32 imm, eRegI tmp, eRegI tmp2, eFlagsReg cr ) %{ +instruct modL_eReg_imm32( eADXRegL dst, immL32 imm, rRegI tmp, rRegI tmp2, eFlagsReg cr ) %{ match(Set dst (ModL dst imm)); effect( TEMP tmp, TEMP tmp2, KILL cr ); ins_cost(1000); @@ -8466,7 +8328,7 @@ // Integer Shift Instructions // Shift Left by one -instruct shlI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{ +instruct shlI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{ match(Set dst (LShiftI dst shift)); effect(KILL cr); @@ -8478,7 +8340,7 @@ %} // Shift Left by 8-bit immediate -instruct salI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{ +instruct salI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{ match(Set dst (LShiftI dst shift)); effect(KILL cr); @@ -8490,7 +8352,7 @@ %} // Shift Left by variable -instruct salI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{ +instruct salI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{ match(Set dst (LShiftI dst shift)); effect(KILL cr); @@ -8502,7 +8364,7 @@ %} // Arithmetic shift right by one -instruct sarI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{ +instruct sarI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{ match(Set dst (RShiftI dst shift)); effect(KILL cr); @@ -8524,7 +8386,7 @@ %} // Arithmetic Shift Right by 8-bit immediate -instruct sarI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{ +instruct sarI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{ match(Set dst (RShiftI dst shift)); effect(KILL cr); @@ -8547,7 +8409,7 @@ %} // Arithmetic Shift Right by variable -instruct sarI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{ +instruct sarI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{ match(Set dst (RShiftI dst shift)); effect(KILL cr); @@ -8559,7 +8421,7 @@ %} // Logical shift right by one -instruct shrI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{ +instruct shrI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{ match(Set dst (URShiftI dst shift)); effect(KILL cr); @@ -8571,7 +8433,7 @@ %} // Logical Shift Right by 8-bit immediate -instruct shrI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{ +instruct shrI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{ match(Set dst (URShiftI dst shift)); effect(KILL cr); @@ -8585,7 +8447,7 @@ // Logical Shift Right by 24, followed by Arithmetic Shift Left by 24. // This idiom is used by the compiler for the i2b bytecode. -instruct i2b(eRegI dst, xRegI src, immI_24 twentyfour) %{ +instruct i2b(rRegI dst, xRegI src, immI_24 twentyfour) %{ match(Set dst (RShiftI (LShiftI src twentyfour) twentyfour)); size(3); @@ -8598,7 +8460,7 @@ // Logical Shift Right by 16, followed by Arithmetic Shift Left by 16. // This idiom is used by the compiler the i2s bytecode. -instruct i2s(eRegI dst, xRegI src, immI_16 sixteen) %{ +instruct i2s(rRegI dst, xRegI src, immI_16 sixteen) %{ match(Set dst (RShiftI (LShiftI src sixteen) sixteen)); size(3); @@ -8611,7 +8473,7 @@ // Logical Shift Right by variable -instruct shrI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{ +instruct shrI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{ match(Set dst (URShiftI dst shift)); effect(KILL cr); @@ -8627,7 +8489,7 @@ //----------Integer Logical Instructions--------------------------------------- // And Instructions // And Register with Register -instruct andI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct andI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ match(Set dst (AndI dst src)); effect(KILL cr); @@ -8639,7 +8501,7 @@ %} // And Register with Immediate -instruct andI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{ +instruct andI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{ match(Set dst (AndI dst src)); effect(KILL cr); @@ -8651,7 +8513,7 @@ %} // And Register with Memory -instruct andI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{ +instruct andI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{ match(Set dst (AndI dst (LoadI src))); effect(KILL cr); @@ -8663,7 +8525,7 @@ %} // And Memory with Register -instruct andI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{ +instruct andI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{ match(Set dst (StoreI dst (AndI (LoadI dst) src))); effect(KILL cr); @@ -8689,7 +8551,7 @@ // Or Instructions // Or Register with Register -instruct orI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct orI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ match(Set dst (OrI dst src)); effect(KILL cr); @@ -8700,7 +8562,7 @@ ins_pipe( ialu_reg_reg ); %} -instruct orI_eReg_castP2X(eRegI dst, eRegP src, eFlagsReg cr) %{ +instruct orI_eReg_castP2X(rRegI dst, eRegP src, eFlagsReg cr) %{ match(Set dst (OrI dst (CastP2X src))); effect(KILL cr); @@ -8713,7 +8575,7 @@ // Or Register with Immediate -instruct orI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{ +instruct orI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{ match(Set dst (OrI dst src)); effect(KILL cr); @@ -8725,7 +8587,7 @@ %} // Or Register with Memory -instruct orI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{ +instruct orI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{ match(Set dst (OrI dst (LoadI src))); effect(KILL cr); @@ -8737,7 +8599,7 @@ %} // Or Memory with Register -instruct orI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{ +instruct orI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{ match(Set dst (StoreI dst (OrI (LoadI dst) src))); effect(KILL cr); @@ -8763,7 +8625,7 @@ // ROL/ROR // ROL expand -instruct rolI_eReg_imm1(eRegI dst, immI1 shift, eFlagsReg cr) %{ +instruct rolI_eReg_imm1(rRegI dst, immI1 shift, eFlagsReg cr) %{ effect(USE_DEF dst, USE shift, KILL cr); format %{ "ROL $dst, $shift" %} @@ -8772,7 +8634,7 @@ ins_pipe( ialu_reg ); %} -instruct rolI_eReg_imm8(eRegI dst, immI8 shift, eFlagsReg cr) %{ +instruct rolI_eReg_imm8(rRegI dst, immI8 shift, eFlagsReg cr) %{ effect(USE_DEF dst, USE shift, KILL cr); format %{ "ROL $dst, $shift" %} @@ -8792,7 +8654,7 @@ // end of ROL expand // ROL 32bit by one once -instruct rolI_eReg_i1(eRegI dst, immI1 lshift, immI_M1 rshift, eFlagsReg cr) %{ +instruct rolI_eReg_i1(rRegI dst, immI1 lshift, immI_M1 rshift, eFlagsReg cr) %{ match(Set dst ( OrI (LShiftI dst lshift) (URShiftI dst rshift))); expand %{ @@ -8801,7 +8663,7 @@ %} // ROL 32bit var by imm8 once -instruct rolI_eReg_i8(eRegI dst, immI8 lshift, immI8 rshift, eFlagsReg cr) %{ +instruct rolI_eReg_i8(rRegI dst, immI8 lshift, immI8 rshift, eFlagsReg cr) %{ predicate( 0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f)); match(Set dst ( OrI (LShiftI dst lshift) (URShiftI dst rshift))); @@ -8829,7 +8691,7 @@ %} // ROR expand -instruct rorI_eReg_imm1(eRegI dst, immI1 shift, eFlagsReg cr) %{ +instruct rorI_eReg_imm1(rRegI dst, immI1 shift, eFlagsReg cr) %{ effect(USE_DEF dst, USE shift, KILL cr); format %{ "ROR $dst, $shift" %} @@ -8838,7 +8700,7 @@ ins_pipe( ialu_reg ); %} -instruct rorI_eReg_imm8(eRegI dst, immI8 shift, eFlagsReg cr) %{ +instruct rorI_eReg_imm8(rRegI dst, immI8 shift, eFlagsReg cr) %{ effect (USE_DEF dst, USE shift, KILL cr); format %{ "ROR $dst, $shift" %} @@ -8858,7 +8720,7 @@ // end of ROR expand // ROR right once -instruct rorI_eReg_i1(eRegI dst, immI1 rshift, immI_M1 lshift, eFlagsReg cr) %{ +instruct rorI_eReg_i1(rRegI dst, immI1 rshift, immI_M1 lshift, eFlagsReg cr) %{ match(Set dst ( OrI (URShiftI dst rshift) (LShiftI dst lshift))); expand %{ @@ -8867,7 +8729,7 @@ %} // ROR 32bit by immI8 once -instruct rorI_eReg_i8(eRegI dst, immI8 rshift, immI8 lshift, eFlagsReg cr) %{ +instruct rorI_eReg_i8(rRegI dst, immI8 rshift, immI8 lshift, eFlagsReg cr) %{ predicate( 0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f)); match(Set dst ( OrI (URShiftI dst rshift) (LShiftI dst lshift))); @@ -8896,7 +8758,7 @@ // Xor Instructions // Xor Register with Register -instruct xorI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{ +instruct xorI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ match(Set dst (XorI dst src)); effect(KILL cr); @@ -8908,7 +8770,7 @@ %} // Xor Register with Immediate -1 -instruct xorI_eReg_im1(eRegI dst, immI_M1 imm) %{ +instruct xorI_eReg_im1(rRegI dst, immI_M1 imm) %{ match(Set dst (XorI dst imm)); size(2); @@ -8920,7 +8782,7 @@ %} // Xor Register with Immediate -instruct xorI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{ +instruct xorI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{ match(Set dst (XorI dst src)); effect(KILL cr); @@ -8932,7 +8794,7 @@ %} // Xor Register with Memory -instruct xorI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{ +instruct xorI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{ match(Set dst (XorI dst (LoadI src))); effect(KILL cr); @@ -8944,7 +8806,7 @@ %} // Xor Memory with Register -instruct xorI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{ +instruct xorI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{ match(Set dst (StoreI dst (XorI (LoadI dst) src))); effect(KILL cr); @@ -8969,14 +8831,14 @@ //----------Convert Int to Boolean--------------------------------------------- -instruct movI_nocopy(eRegI dst, eRegI src) %{ +instruct movI_nocopy(rRegI dst, rRegI src) %{ effect( DEF dst, USE src ); format %{ "MOV $dst,$src" %} ins_encode( enc_Copy( dst, src) ); ins_pipe( ialu_reg_reg ); %} -instruct ci2b( eRegI dst, eRegI src, eFlagsReg cr ) %{ +instruct ci2b( rRegI dst, rRegI src, eFlagsReg cr ) %{ effect( USE_DEF dst, USE src, KILL cr ); size(4); @@ -8987,7 +8849,7 @@ ins_pipe( ialu_reg_reg_long ); %} -instruct convI2B( eRegI dst, eRegI src, eFlagsReg cr ) %{ +instruct convI2B( rRegI dst, rRegI src, eFlagsReg cr ) %{ match(Set dst (Conv2B src)); expand %{ @@ -8996,14 +8858,14 @@ %} %} -instruct movP_nocopy(eRegI dst, eRegP src) %{ +instruct movP_nocopy(rRegI dst, eRegP src) %{ effect( DEF dst, USE src ); format %{ "MOV $dst,$src" %} ins_encode( enc_Copy( dst, src) ); ins_pipe( ialu_reg_reg ); %} -instruct cp2b( eRegI dst, eRegP src, eFlagsReg cr ) %{ +instruct cp2b( rRegI dst, eRegP src, eFlagsReg cr ) %{ effect( USE_DEF dst, USE src, KILL cr ); format %{ "NEG $dst\n\t" "ADC $dst,$src" %} @@ -9012,7 +8874,7 @@ ins_pipe( ialu_reg_reg_long ); %} -instruct convP2B( eRegI dst, eRegP src, eFlagsReg cr ) %{ +instruct convP2B( rRegI dst, eRegP src, eFlagsReg cr ) %{ match(Set dst (Conv2B src)); expand %{ @@ -9037,7 +8899,7 @@ ins_pipe( pipe_slow ); %} -instruct cmpLTMask0( eRegI dst, immI0 zero, eFlagsReg cr ) %{ +instruct cmpLTMask0( rRegI dst, immI0 zero, eFlagsReg cr ) %{ match(Set dst (CmpLTMask dst zero)); effect( DEF dst, KILL cr ); ins_cost(100); @@ -9509,7 +9371,7 @@ %} // Compare vs zero into -1,0,1 -instruct cmpDPR_0(eRegI dst, regDPR src1, immDPR0 zero, eAXRegI rax, eFlagsReg cr) %{ +instruct cmpDPR_0(rRegI dst, regDPR src1, immDPR0 zero, eAXRegI rax, eFlagsReg cr) %{ predicate(UseSSE<=1); match(Set dst (CmpD3 src1 zero)); effect(KILL cr, KILL rax); @@ -9523,7 +9385,7 @@ %} // Compare into -1,0,1 -instruct cmpDPR_reg(eRegI dst, regDPR src1, regDPR src2, eAXRegI rax, eFlagsReg cr) %{ +instruct cmpDPR_reg(rRegI dst, regDPR src1, regDPR src2, eAXRegI rax, eFlagsReg cr) %{ predicate(UseSSE<=1); match(Set dst (CmpD3 src1 src2)); effect(KILL cr, KILL rax); @@ -10100,161 +9962,67 @@ ins_pipe( pipe_slow ); %} -instruct powDPR_reg(regDPR X, regDPR1 Y, eAXRegI rax, eBXRegI rbx, eCXRegI rcx) %{ +instruct powDPR_reg(regDPR X, regDPR1 Y, eAXRegI rax, eDXRegI rdx, eCXRegI rcx, eFlagsReg cr) %{ predicate (UseSSE<=1); match(Set Y (PowD X Y)); // Raise X to the Yth power - effect(KILL rax, KILL rbx, KILL rcx); - format %{ "SUB ESP,8\t\t# Fast-path POW encoding\n\t" - "FLD_D $X\n\t" - "FYL2X \t\t\t# Q=Y*ln2(X)\n\t" - - "FDUP \t\t\t# Q Q\n\t" - "FRNDINT\t\t\t# int(Q) Q\n\t" - "FSUB ST(1),ST(0)\t# int(Q) frac(Q)\n\t" - "FISTP dword [ESP]\n\t" - "F2XM1 \t\t\t# 2^frac(Q)-1 int(Q)\n\t" - "FLD1 \t\t\t# 1 2^frac(Q)-1 int(Q)\n\t" - "FADDP \t\t\t# 2^frac(Q) int(Q)\n\t" // could use FADD [1.000] instead - "MOV EAX,[ESP]\t# Pick up int(Q)\n\t" - "MOV ECX,0xFFFFF800\t# Overflow mask\n\t" - "ADD EAX,1023\t\t# Double exponent bias\n\t" - "MOV EBX,EAX\t\t# Preshifted biased expo\n\t" - "SHL EAX,20\t\t# Shift exponent into place\n\t" - "TEST EBX,ECX\t\t# Check for overflow\n\t" - "CMOVne EAX,ECX\t\t# If overflow, stuff NaN into EAX\n\t" - "MOV [ESP+4],EAX\t# Marshal 64-bit scaling double\n\t" - "MOV [ESP+0],0\n\t" - "FMUL ST(0),[ESP+0]\t# Scale\n\t" - - "ADD ESP,8" - %} - ins_encode( push_stack_temp_qword, - Push_Reg_DPR(X), - Opcode(0xD9), Opcode(0xF1), // fyl2x - pow_exp_core_encoding, - pop_stack_temp_qword); - ins_pipe( pipe_slow ); -%} - -instruct powD_reg(regD dst, regD src0, regD src1, regDPR1 tmp1, eAXRegI rax, eBXRegI rbx, eCXRegI rcx ) %{ + effect(KILL rax, KILL rdx, KILL rcx, KILL cr); + format %{ "fast_pow $X $Y -> $Y // KILL $rax, $rcx, $rdx" %} + ins_encode %{ + __ subptr(rsp, 8); + __ fld_s($X$$reg - 1); + __ fast_pow(); + __ addptr(rsp, 8); + %} + ins_pipe( pipe_slow ); +%} + +instruct powD_reg(regD dst, regD src0, regD src1, eAXRegI rax, eDXRegI rdx, eCXRegI rcx, eFlagsReg cr) %{ predicate (UseSSE>=2); match(Set dst (PowD src0 src1)); // Raise src0 to the src1'th power - effect(KILL tmp1, KILL rax, KILL rbx, KILL rcx ); - format %{ "SUB ESP,8\t\t# Fast-path POW encoding\n\t" - "MOVSD [ESP],$src1\n\t" - "FLD FPR1,$src1\n\t" - "MOVSD [ESP],$src0\n\t" - "FLD FPR1,$src0\n\t" - "FYL2X \t\t\t# Q=Y*ln2(X)\n\t" - - "FDUP \t\t\t# Q Q\n\t" - "FRNDINT\t\t\t# int(Q) Q\n\t" - "FSUB ST(1),ST(0)\t# int(Q) frac(Q)\n\t" - "FISTP dword [ESP]\n\t" - "F2XM1 \t\t\t# 2^frac(Q)-1 int(Q)\n\t" - "FLD1 \t\t\t# 1 2^frac(Q)-1 int(Q)\n\t" - "FADDP \t\t\t# 2^frac(Q) int(Q)\n\t" // could use FADD [1.000] instead - "MOV EAX,[ESP]\t# Pick up int(Q)\n\t" - "MOV ECX,0xFFFFF800\t# Overflow mask\n\t" - "ADD EAX,1023\t\t# Double exponent bias\n\t" - "MOV EBX,EAX\t\t# Preshifted biased expo\n\t" - "SHL EAX,20\t\t# Shift exponent into place\n\t" - "TEST EBX,ECX\t\t# Check for overflow\n\t" - "CMOVne EAX,ECX\t\t# If overflow, stuff NaN into EAX\n\t" - "MOV [ESP+4],EAX\t# Marshal 64-bit scaling double\n\t" - "MOV [ESP+0],0\n\t" - "FMUL ST(0),[ESP+0]\t# Scale\n\t" - - "FST_D [ESP]\n\t" - "MOVSD $dst,[ESP]\n\t" - "ADD ESP,8" - %} - ins_encode( push_stack_temp_qword, - push_xmm_to_fpr1(src1), - push_xmm_to_fpr1(src0), - Opcode(0xD9), Opcode(0xF1), // fyl2x - pow_exp_core_encoding, - Push_ResultD(dst) ); - ins_pipe( pipe_slow ); -%} - - -instruct expDPR_reg(regDPR1 dpr1, eAXRegI rax, eBXRegI rbx, eCXRegI rcx) %{ + effect(KILL rax, KILL rdx, KILL rcx, KILL cr); + format %{ "fast_pow $src0 $src1 -> $dst // KILL $rax, $rcx, $rdx" %} + ins_encode %{ + __ subptr(rsp, 8); + __ movdbl(Address(rsp, 0), $src1$$XMMRegister); + __ fld_d(Address(rsp, 0)); + __ movdbl(Address(rsp, 0), $src0$$XMMRegister); + __ fld_d(Address(rsp, 0)); + __ fast_pow(); + __ fstp_d(Address(rsp, 0)); + __ movdbl($dst$$XMMRegister, Address(rsp, 0)); + __ addptr(rsp, 8); + %} + ins_pipe( pipe_slow ); +%} + + +instruct expDPR_reg(regDPR1 dpr1, eAXRegI rax, eDXRegI rdx, eCXRegI rcx, eFlagsReg cr) %{ predicate (UseSSE<=1); match(Set dpr1 (ExpD dpr1)); - effect(KILL rax, KILL rbx, KILL rcx); - format %{ "SUB ESP,8\t\t# Fast-path EXP encoding" - "FLDL2E \t\t\t# Ld log2(e) X\n\t" - "FMULP \t\t\t# Q=X*log2(e)\n\t" - - "FDUP \t\t\t# Q Q\n\t" - "FRNDINT\t\t\t# int(Q) Q\n\t" - "FSUB ST(1),ST(0)\t# int(Q) frac(Q)\n\t" - "FISTP dword [ESP]\n\t" - "F2XM1 \t\t\t# 2^frac(Q)-1 int(Q)\n\t" - "FLD1 \t\t\t# 1 2^frac(Q)-1 int(Q)\n\t" - "FADDP \t\t\t# 2^frac(Q) int(Q)\n\t" // could use FADD [1.000] instead - "MOV EAX,[ESP]\t# Pick up int(Q)\n\t" - "MOV ECX,0xFFFFF800\t# Overflow mask\n\t" - "ADD EAX,1023\t\t# Double exponent bias\n\t" - "MOV EBX,EAX\t\t# Preshifted biased expo\n\t" - "SHL EAX,20\t\t# Shift exponent into place\n\t" - "TEST EBX,ECX\t\t# Check for overflow\n\t" - "CMOVne EAX,ECX\t\t# If overflow, stuff NaN into EAX\n\t" - "MOV [ESP+4],EAX\t# Marshal 64-bit scaling double\n\t" - "MOV [ESP+0],0\n\t" - "FMUL ST(0),[ESP+0]\t# Scale\n\t" - - "ADD ESP,8" - %} - ins_encode( push_stack_temp_qword, - Opcode(0xD9), Opcode(0xEA), // fldl2e - Opcode(0xDE), Opcode(0xC9), // fmulp - pow_exp_core_encoding, - pop_stack_temp_qword); - ins_pipe( pipe_slow ); -%} - -instruct expD_reg(regD dst, regD src, regDPR1 tmp1, eAXRegI rax, eBXRegI rbx, eCXRegI rcx) %{ + effect(KILL rax, KILL rcx, KILL rdx, KILL cr); + format %{ "fast_exp $dpr1 -> $dpr1 // KILL $rax, $rcx, $rdx" %} + ins_encode %{ + __ fast_exp(); + %} + ins_pipe( pipe_slow ); +%} + +instruct expD_reg(regD dst, regD src, eAXRegI rax, eDXRegI rdx, eCXRegI rcx, eFlagsReg cr) %{ predicate (UseSSE>=2); match(Set dst (ExpD src)); - effect(KILL tmp1, KILL rax, KILL rbx, KILL rcx); - format %{ "SUB ESP,8\t\t# Fast-path EXP encoding\n\t" - "MOVSD [ESP],$src\n\t" - "FLDL2E \t\t\t# Ld log2(e) X\n\t" - "FMULP \t\t\t# Q=X*log2(e) X\n\t" - - "FDUP \t\t\t# Q Q\n\t" - "FRNDINT\t\t\t# int(Q) Q\n\t" - "FSUB ST(1),ST(0)\t# int(Q) frac(Q)\n\t" - "FISTP dword [ESP]\n\t" - "F2XM1 \t\t\t# 2^frac(Q)-1 int(Q)\n\t" - "FLD1 \t\t\t# 1 2^frac(Q)-1 int(Q)\n\t" - "FADDP \t\t\t# 2^frac(Q) int(Q)\n\t" // could use FADD [1.000] instead - "MOV EAX,[ESP]\t# Pick up int(Q)\n\t" - "MOV ECX,0xFFFFF800\t# Overflow mask\n\t" - "ADD EAX,1023\t\t# Double exponent bias\n\t" - "MOV EBX,EAX\t\t# Preshifted biased expo\n\t" - "SHL EAX,20\t\t# Shift exponent into place\n\t" - "TEST EBX,ECX\t\t# Check for overflow\n\t" - "CMOVne EAX,ECX\t\t# If overflow, stuff NaN into EAX\n\t" - "MOV [ESP+4],EAX\t# Marshal 64-bit scaling double\n\t" - "MOV [ESP+0],0\n\t" - "FMUL ST(0),[ESP+0]\t# Scale\n\t" - - "FST_D [ESP]\n\t" - "MOVSD $dst,[ESP]\n\t" - "ADD ESP,8" - %} - ins_encode( Push_SrcD(src), - Opcode(0xD9), Opcode(0xEA), // fldl2e - Opcode(0xDE), Opcode(0xC9), // fmulp - pow_exp_core_encoding, - Push_ResultD(dst) ); - ins_pipe( pipe_slow ); -%} - - + effect(KILL rax, KILL rcx, KILL rdx, KILL cr); + format %{ "fast_exp $dst -> $src // KILL $rax, $rcx, $rdx" %} + ins_encode %{ + __ subptr(rsp, 8); + __ movdbl(Address(rsp, 0), $src$$XMMRegister); + __ fld_d(Address(rsp, 0)); + __ fast_exp(); + __ fstp_d(Address(rsp, 0)); + __ movdbl($dst$$XMMRegister, Address(rsp, 0)); + __ addptr(rsp, 8); + %} + ins_pipe( pipe_slow ); +%} instruct log10DPR_reg(regDPR1 dst, regDPR1 src) %{ predicate (UseSSE<=1); @@ -10395,7 +10163,7 @@ %} // Compare vs zero into -1,0,1 -instruct cmpFPR_0(eRegI dst, regFPR src1, immFPR0 zero, eAXRegI rax, eFlagsReg cr) %{ +instruct cmpFPR_0(rRegI dst, regFPR src1, immFPR0 zero, eAXRegI rax, eFlagsReg cr) %{ predicate(UseSSE == 0); match(Set dst (CmpF3 src1 zero)); effect(KILL cr, KILL rax); @@ -10409,7 +10177,7 @@ %} // Compare into -1,0,1 -instruct cmpFPR_reg(eRegI dst, regFPR src1, regFPR src2, eAXRegI rax, eFlagsReg cr) %{ +instruct cmpFPR_reg(rRegI dst, regFPR src1, regFPR src2, eAXRegI rax, eFlagsReg cr) %{ predicate(UseSSE == 0); match(Set dst (CmpF3 src1 src2)); effect(KILL cr, KILL rax); @@ -11329,7 +11097,7 @@ ins_pipe( fpu_reg_mem ); %} -instruct convI2D_reg(regD dst, eRegI src) %{ +instruct convI2D_reg(regD dst, rRegI src) %{ predicate( UseSSE>=2 && !UseXmmI2D ); match(Set dst (ConvI2D src)); format %{ "CVTSI2SD $dst,$src" %} @@ -11349,7 +11117,7 @@ ins_pipe( pipe_slow ); %} -instruct convXI2D_reg(regD dst, eRegI src) +instruct convXI2D_reg(regD dst, rRegI src) %{ predicate( UseSSE>=2 && UseXmmI2D ); match(Set dst (ConvI2D src)); @@ -11437,7 +11205,7 @@ %} // Convert an int to a float in xmm; no rounding step needed. -instruct convI2F_reg(regF dst, eRegI src) %{ +instruct convI2F_reg(regF dst, rRegI src) %{ predicate( UseSSE==1 || UseSSE>=2 && !UseXmmI2F ); match(Set dst (ConvI2F src)); format %{ "CVTSI2SS $dst, $src" %} @@ -11447,7 +11215,7 @@ ins_pipe( pipe_slow ); %} - instruct convXI2F_reg(regF dst, eRegI src) + instruct convXI2F_reg(regF dst, rRegI src) %{ predicate( UseSSE>=2 && UseXmmI2F ); match(Set dst (ConvI2F src)); @@ -11461,7 +11229,7 @@ ins_pipe(pipe_slow); // XXX %} -instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{ +instruct convI2L_reg( eRegL dst, rRegI src, eFlagsReg cr) %{ match(Set dst (ConvI2L src)); effect(KILL cr); ins_cost(375); @@ -11473,7 +11241,7 @@ %} // Zero-extend convert int to long -instruct convI2L_reg_zex(eRegL dst, eRegI src, immL_32bits mask, eFlagsReg flags ) %{ +instruct convI2L_reg_zex(eRegL dst, rRegI src, immL_32bits mask, eFlagsReg flags ) %{ match(Set dst (AndL (ConvI2L src) mask) ); effect( KILL flags ); ins_cost(250); @@ -11553,7 +11321,7 @@ ins_pipe( pipe_slow ); %} -instruct convL2I_reg( eRegI dst, eRegL src ) %{ +instruct convL2I_reg( rRegI dst, eRegL src ) %{ match(Set dst (ConvL2I src)); effect( DEF dst, USE src ); format %{ "MOV $dst,$src.lo" %} @@ -11562,7 +11330,7 @@ %} -instruct MoveF2I_stack_reg(eRegI dst, stackSlotF src) %{ +instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{ match(Set dst (MoveF2I src)); effect( DEF dst, USE src ); ins_cost(100); @@ -11597,7 +11365,7 @@ ins_pipe( pipe_slow ); %} -instruct MoveF2I_reg_reg_sse(eRegI dst, regF src) %{ +instruct MoveF2I_reg_reg_sse(rRegI dst, regF src) %{ predicate(UseSSE>=2); match(Set dst (MoveF2I src)); effect( DEF dst, USE src ); @@ -11609,7 +11377,7 @@ ins_pipe( pipe_slow ); %} -instruct MoveI2F_reg_stack(stackSlotF dst, eRegI src) %{ +instruct MoveI2F_reg_stack(stackSlotF dst, rRegI src) %{ match(Set dst (MoveI2F src)); effect( DEF dst, USE src ); @@ -11649,7 +11417,7 @@ ins_pipe( pipe_slow ); %} -instruct MoveI2F_reg_reg_sse(regF dst, eRegI src) %{ +instruct MoveI2F_reg_reg_sse(regF dst, rRegI src) %{ predicate(UseSSE>=2); match(Set dst (MoveI2F src)); effect( DEF dst, USE src ); @@ -11783,186 +11551,6 @@ ins_pipe( pipe_slow ); %} -// Replicate scalar to packed byte (1 byte) values in xmm -instruct Repl8B_reg(regD dst, regD src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate8B src)); - format %{ "MOVDQA $dst,$src\n\t" - "PUNPCKLBW $dst,$dst\n\t" - "PSHUFLW $dst,$dst,0x00\t! replicate8B" %} - ins_encode %{ - if ($dst$$reg != $src$$reg) { - __ movdqa($dst$$XMMRegister, $src$$XMMRegister); - } - __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); - __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( pipe_slow ); -%} - -// Replicate scalar to packed byte (1 byte) values in xmm -instruct Repl8B_eRegI(regD dst, eRegI src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate8B src)); - format %{ "MOVD $dst,$src\n\t" - "PUNPCKLBW $dst,$dst\n\t" - "PSHUFLW $dst,$dst,0x00\t! replicate8B" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); - __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( pipe_slow ); -%} - -// Replicate scalar zero to packed byte (1 byte) values in xmm -instruct Repl8B_immI0(regD dst, immI0 zero) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate8B zero)); - format %{ "PXOR $dst,$dst\t! replicate8B" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed shore (2 byte) values in xmm -instruct Repl4S_reg(regD dst, regD src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate4S src)); - format %{ "PSHUFLW $dst,$src,0x00\t! replicate4S" %} - ins_encode %{ - __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed shore (2 byte) values in xmm -instruct Repl4S_eRegI(regD dst, eRegI src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate4S src)); - format %{ "MOVD $dst,$src\n\t" - "PSHUFLW $dst,$dst,0x00\t! replicate4S" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar zero to packed short (2 byte) values in xmm -instruct Repl4S_immI0(regD dst, immI0 zero) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate4S zero)); - format %{ "PXOR $dst,$dst\t! replicate4S" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed char (2 byte) values in xmm -instruct Repl4C_reg(regD dst, regD src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate4C src)); - format %{ "PSHUFLW $dst,$src,0x00\t! replicate4C" %} - ins_encode %{ - __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed char (2 byte) values in xmm -instruct Repl4C_eRegI(regD dst, eRegI src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate4C src)); - format %{ "MOVD $dst,$src\n\t" - "PSHUFLW $dst,$dst,0x00\t! replicate4C" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar zero to packed char (2 byte) values in xmm -instruct Repl4C_immI0(regD dst, immI0 zero) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate4C zero)); - format %{ "PXOR $dst,$dst\t! replicate4C" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed integer (4 byte) values in xmm -instruct Repl2I_reg(regD dst, regD src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate2I src)); - format %{ "PSHUFD $dst,$src,0x00\t! replicate2I" %} - ins_encode %{ - __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed integer (4 byte) values in xmm -instruct Repl2I_eRegI(regD dst, eRegI src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate2I src)); - format %{ "MOVD $dst,$src\n\t" - "PSHUFD $dst,$dst,0x00\t! replicate2I" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar zero to packed integer (2 byte) values in xmm -instruct Repl2I_immI0(regD dst, immI0 zero) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate2I zero)); - format %{ "PXOR $dst,$dst\t! replicate2I" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed single precision floating point values in xmm -instruct Repl2F_reg(regD dst, regD src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate2F src)); - format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %} - ins_encode %{ - __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed single precision floating point values in xmm -instruct Repl2F_regF(regD dst, regF src) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate2F src)); - format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %} - ins_encode %{ - __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed single precision floating point values in xmm -instruct Repl2F_immF0(regD dst, immF0 zero) %{ - predicate(UseSSE>=2); - match(Set dst (Replicate2F zero)); - format %{ "PXOR $dst,$dst\t! replicate2F" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} // ======================================================================= // fast clearing of an array @@ -12071,7 +11659,7 @@ //----------Control Flow Instructions------------------------------------------ // Signed compare Instructions -instruct compI_eReg(eFlagsReg cr, eRegI op1, eRegI op2) %{ +instruct compI_eReg(eFlagsReg cr, rRegI op1, rRegI op2) %{ match(Set cr (CmpI op1 op2)); effect( DEF cr, USE op1, USE op2 ); format %{ "CMP $op1,$op2" %} @@ -12080,7 +11668,7 @@ ins_pipe( ialu_cr_reg_reg ); %} -instruct compI_eReg_imm(eFlagsReg cr, eRegI op1, immI op2) %{ +instruct compI_eReg_imm(eFlagsReg cr, rRegI op1, immI op2) %{ match(Set cr (CmpI op1 op2)); effect( DEF cr, USE op1 ); format %{ "CMP $op1,$op2" %} @@ -12091,7 +11679,7 @@ %} // Cisc-spilled version of cmpI_eReg -instruct compI_eReg_mem(eFlagsReg cr, eRegI op1, memory op2) %{ +instruct compI_eReg_mem(eFlagsReg cr, rRegI op1, memory op2) %{ match(Set cr (CmpI op1 (LoadI op2))); format %{ "CMP $op1,$op2" %} @@ -12101,7 +11689,7 @@ ins_pipe( ialu_cr_reg_mem ); %} -instruct testI_reg( eFlagsReg cr, eRegI src, immI0 zero ) %{ +instruct testI_reg( eFlagsReg cr, rRegI src, immI0 zero ) %{ match(Set cr (CmpI src zero)); effect( DEF cr, USE src ); @@ -12111,7 +11699,7 @@ ins_pipe( ialu_cr_reg_imm ); %} -instruct testI_reg_imm( eFlagsReg cr, eRegI src, immI con, immI0 zero ) %{ +instruct testI_reg_imm( eFlagsReg cr, rRegI src, immI con, immI0 zero ) %{ match(Set cr (CmpI (AndI src con) zero)); format %{ "TEST $src,$con" %} @@ -12120,7 +11708,7 @@ ins_pipe( ialu_cr_reg_imm ); %} -instruct testI_reg_mem( eFlagsReg cr, eRegI src, memory mem, immI0 zero ) %{ +instruct testI_reg_mem( eFlagsReg cr, rRegI src, memory mem, immI0 zero ) %{ match(Set cr (CmpI (AndI src mem) zero)); format %{ "TEST $src,$mem" %} @@ -12131,7 +11719,7 @@ // Unsigned compare Instructions; really, same as signed except they // produce an eFlagsRegU instead of eFlagsReg. -instruct compU_eReg(eFlagsRegU cr, eRegI op1, eRegI op2) %{ +instruct compU_eReg(eFlagsRegU cr, rRegI op1, rRegI op2) %{ match(Set cr (CmpU op1 op2)); format %{ "CMPu $op1,$op2" %} @@ -12140,7 +11728,7 @@ ins_pipe( ialu_cr_reg_reg ); %} -instruct compU_eReg_imm(eFlagsRegU cr, eRegI op1, immI op2) %{ +instruct compU_eReg_imm(eFlagsRegU cr, rRegI op1, immI op2) %{ match(Set cr (CmpU op1 op2)); format %{ "CMPu $op1,$op2" %} @@ -12150,7 +11738,7 @@ %} // // Cisc-spilled version of cmpU_eReg -instruct compU_eReg_mem(eFlagsRegU cr, eRegI op1, memory op2) %{ +instruct compU_eReg_mem(eFlagsRegU cr, rRegI op1, memory op2) %{ match(Set cr (CmpU op1 (LoadI op2))); format %{ "CMPu $op1,$op2" %} @@ -12161,7 +11749,7 @@ %} // // Cisc-spilled version of cmpU_eReg -//instruct compU_mem_eReg(eFlagsRegU cr, memory op1, eRegI op2) %{ +//instruct compU_mem_eReg(eFlagsRegU cr, memory op1, rRegI op2) %{ // match(Set cr (CmpU (LoadI op1) op2)); // // format %{ "CMPu $op1,$op2" %} @@ -12170,7 +11758,7 @@ // ins_encode( OpcP, RegMem( op1, op2) ); //%} -instruct testU_reg( eFlagsRegU cr, eRegI src, immI0 zero ) %{ +instruct testU_reg( eFlagsRegU cr, rRegI src, immI0 zero ) %{ match(Set cr (CmpU src zero)); format %{ "TESTu $src,$src" %} @@ -12266,7 +11854,7 @@ // *** Min and Max using the conditional move are slower than the // *** branch version on a Pentium III. // // Conditional move for min -//instruct cmovI_reg_lt( eRegI op2, eRegI op1, eFlagsReg cr ) %{ +//instruct cmovI_reg_lt( rRegI op2, rRegI op1, eFlagsReg cr ) %{ // effect( USE_DEF op2, USE op1, USE cr ); // format %{ "CMOVlt $op2,$op1\t! min" %} // opcode(0x4C,0x0F); @@ -12275,7 +11863,7 @@ //%} // //// Min Register with Register (P6 version) -//instruct minI_eReg_p6( eRegI op1, eRegI op2 ) %{ +//instruct minI_eReg_p6( rRegI op1, rRegI op2 ) %{ // predicate(VM_Version::supports_cmov() ); // match(Set op2 (MinI op1 op2)); // ins_cost(200); @@ -12287,7 +11875,7 @@ //%} // Min Register with Register (generic version) -instruct minI_eReg(eRegI dst, eRegI src, eFlagsReg flags) %{ +instruct minI_eReg(rRegI dst, rRegI src, eFlagsReg flags) %{ match(Set dst (MinI dst src)); effect(KILL flags); ins_cost(300); @@ -12302,7 +11890,7 @@ // *** Min and Max using the conditional move are slower than the // *** branch version on a Pentium III. // // Conditional move for max -//instruct cmovI_reg_gt( eRegI op2, eRegI op1, eFlagsReg cr ) %{ +//instruct cmovI_reg_gt( rRegI op2, rRegI op1, eFlagsReg cr ) %{ // effect( USE_DEF op2, USE op1, USE cr ); // format %{ "CMOVgt $op2,$op1\t! max" %} // opcode(0x4F,0x0F); @@ -12311,7 +11899,7 @@ //%} // // // Max Register with Register (P6 version) -//instruct maxI_eReg_p6( eRegI op1, eRegI op2 ) %{ +//instruct maxI_eReg_p6( rRegI op1, rRegI op2 ) %{ // predicate(VM_Version::supports_cmov() ); // match(Set op2 (MaxI op1 op2)); // ins_cost(200); @@ -12323,7 +11911,7 @@ //%} // Max Register with Register (generic version) -instruct maxI_eReg(eRegI dst, eRegI src, eFlagsReg flags) %{ +instruct maxI_eReg(rRegI dst, rRegI src, eFlagsReg flags) %{ match(Set dst (MaxI dst src)); effect(KILL flags); ins_cost(300); @@ -12384,7 +11972,7 @@ // ============================================================================ // Branch Instructions // Jump Table -instruct jumpXtnd(eRegI switch_val) %{ +instruct jumpXtnd(rRegI switch_val) %{ match(Jump switch_val); ins_cost(350); format %{ "JMP [$constantaddress](,$switch_val,1)\n\t" %} @@ -12802,7 +12390,7 @@ // Manifest a CmpL result in the normal flags. Only good for LT or GE // compares. Can be used for LE or GT compares by reversing arguments. // NOT GOOD FOR EQ/NE tests. -instruct cmpL_reg_flags_LTGE( flagsReg_long_LTGE flags, eRegL src1, eRegL src2, eRegI tmp ) %{ +instruct cmpL_reg_flags_LTGE( flagsReg_long_LTGE flags, eRegL src1, eRegL src2, rRegI tmp ) %{ match( Set flags (CmpL src1 src2 )); effect( TEMP tmp ); ins_cost(300); @@ -12848,7 +12436,7 @@ %} // Compare 2 longs and CMOVE ints. -instruct cmovII_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegI dst, eRegI src) %{ +instruct cmovII_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, rRegI dst, rRegI src) %{ predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge )); match(Set dst (CMoveI (Binary cmp flags) (Binary dst src))); ins_cost(200); @@ -12858,7 +12446,7 @@ ins_pipe( pipe_cmov_reg ); %} -instruct cmovII_mem_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegI dst, memory src) %{ +instruct cmovII_mem_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, rRegI dst, memory src) %{ predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge )); match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src)))); ins_cost(250); @@ -12919,7 +12507,7 @@ //====== // Manifest a CmpL result in the normal flags. Only good for EQ/NE compares. -instruct cmpL_zero_flags_EQNE( flagsReg_long_EQNE flags, eRegL src, immL0 zero, eRegI tmp ) %{ +instruct cmpL_zero_flags_EQNE( flagsReg_long_EQNE flags, eRegL src, immL0 zero, rRegI tmp ) %{ match( Set flags (CmpL src zero )); effect(TEMP tmp); ins_cost(200); @@ -12976,7 +12564,7 @@ %} // Compare 2 longs and CMOVE ints. -instruct cmovII_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegI dst, eRegI src) %{ +instruct cmovII_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, rRegI dst, rRegI src) %{ predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne )); match(Set dst (CMoveI (Binary cmp flags) (Binary dst src))); ins_cost(200); @@ -12986,7 +12574,7 @@ ins_pipe( pipe_cmov_reg ); %} -instruct cmovII_mem_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegI dst, memory src) %{ +instruct cmovII_mem_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, rRegI dst, memory src) %{ predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne )); match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src)))); ins_cost(250); @@ -13048,7 +12636,7 @@ //====== // Manifest a CmpL result in the normal flags. Only good for LE or GT compares. // Same as cmpL_reg_flags_LEGT except must negate src -instruct cmpL_zero_flags_LEGT( flagsReg_long_LEGT flags, eRegL src, immL0 zero, eRegI tmp ) %{ +instruct cmpL_zero_flags_LEGT( flagsReg_long_LEGT flags, eRegL src, immL0 zero, rRegI tmp ) %{ match( Set flags (CmpL src zero )); effect( TEMP tmp ); ins_cost(300); @@ -13062,7 +12650,7 @@ // Manifest a CmpL result in the normal flags. Only good for LE or GT compares. // Same as cmpL_reg_flags_LTGE except operands swapped. Swapping operands // requires a commuted test to get the same result. -instruct cmpL_reg_flags_LEGT( flagsReg_long_LEGT flags, eRegL src1, eRegL src2, eRegI tmp ) %{ +instruct cmpL_reg_flags_LEGT( flagsReg_long_LEGT flags, eRegL src1, eRegL src2, rRegI tmp ) %{ match( Set flags (CmpL src1 src2 )); effect( TEMP tmp ); ins_cost(300); @@ -13109,7 +12697,7 @@ %} // Compare 2 longs and CMOVE ints. -instruct cmovII_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegI dst, eRegI src) %{ +instruct cmovII_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, rRegI src) %{ predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt )); match(Set dst (CMoveI (Binary cmp flags) (Binary dst src))); ins_cost(200); @@ -13119,7 +12707,7 @@ ins_pipe( pipe_cmov_reg ); %} -instruct cmovII_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegI dst, memory src) %{ +instruct cmovII_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, memory src) %{ predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt )); match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src)))); ins_cost(250); @@ -13448,11 +13036,11 @@ // ---------EXAMPLE---------------------------------------------------------- // // // pertinent parts of existing instructions in architecture description -// instruct movI(eRegI dst, eRegI src) %{ +// instruct movI(rRegI dst, rRegI src) %{ // match(Set dst (CopyI src)); // %} // -// instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{ +// instruct incI_eReg(rRegI dst, immI1 src, eFlagsReg cr) %{ // match(Set dst (AddI dst src)); // effect(KILL cr); // %} @@ -13497,11 +13085,11 @@ // %} // // Change load of spilled value to only a spill -// instruct storeI(memory mem, eRegI src) %{ +// instruct storeI(memory mem, rRegI src) %{ // match(Set mem (StoreI mem src)); // %} // -// instruct loadI(eRegI dst, memory mem) %{ +// instruct loadI(rRegI dst, memory mem) %{ // match(Set dst (LoadI mem)); // %} // diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/x86/vm/x86_64.ad --- a/src/cpu/x86/vm/x86_64.ad Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/x86/vm/x86_64.ad Thu Aug 02 14:29:12 2012 -0700 @@ -131,102 +131,6 @@ // Floating Point Registers -// XMM registers. 128-bit registers or 4 words each, labeled (a)-d. -// Word a in each register holds a Float, words ab hold a Double. We -// currently do not use the SIMD capabilities, so registers cd are -// unused at the moment. -// XMM8-XMM15 must be encoded with REX. -// Linux ABI: No register preserved across function calls -// XMM0-XMM7 might hold parameters -// Windows ABI: XMM6-XMM15 preserved across function calls -// XMM0-XMM3 might hold parameters - -reg_def XMM0 (SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()); -reg_def XMM0_H (SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next()); - -reg_def XMM1 (SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()); -reg_def XMM1_H (SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next()); - -reg_def XMM2 (SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()); -reg_def XMM2_H (SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next()); - -reg_def XMM3 (SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()); -reg_def XMM3_H (SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next()); - -reg_def XMM4 (SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()); -reg_def XMM4_H (SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next()); - -reg_def XMM5 (SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()); -reg_def XMM5_H (SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next()); - -#ifdef _WIN64 - -reg_def XMM6 (SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()); -reg_def XMM6_H (SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next()); - -reg_def XMM7 (SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()); -reg_def XMM7_H (SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next()); - -reg_def XMM8 (SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()); -reg_def XMM8_H (SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next()); - -reg_def XMM9 (SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()); -reg_def XMM9_H (SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next()); - -reg_def XMM10 (SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()); -reg_def XMM10_H(SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next()); - -reg_def XMM11 (SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()); -reg_def XMM11_H(SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next()); - -reg_def XMM12 (SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()); -reg_def XMM12_H(SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next()); - -reg_def XMM13 (SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()); -reg_def XMM13_H(SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next()); - -reg_def XMM14 (SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()); -reg_def XMM14_H(SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next()); - -reg_def XMM15 (SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()); -reg_def XMM15_H(SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next()); - -#else - -reg_def XMM6 (SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()); -reg_def XMM6_H (SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next()); - -reg_def XMM7 (SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()); -reg_def XMM7_H (SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()); - -reg_def XMM8 (SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()); -reg_def XMM8_H (SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next()); - -reg_def XMM9 (SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()); -reg_def XMM9_H (SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next()); - -reg_def XMM10 (SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()); -reg_def XMM10_H(SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next()); - -reg_def XMM11 (SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()); -reg_def XMM11_H(SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next()); - -reg_def XMM12 (SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()); -reg_def XMM12_H(SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next()); - -reg_def XMM13 (SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()); -reg_def XMM13_H(SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next()); - -reg_def XMM14 (SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()); -reg_def XMM14_H(SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next()); - -reg_def XMM15 (SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()); -reg_def XMM15_H(SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next()); - -#endif // _WIN64 - -reg_def RFLAGS(SOC, SOC, 0, 16, VMRegImpl::Bad()); - // Specify priority of register selection within phases of register // allocation. Highest priority is first. A useful heuristic is to // give registers a low priority when they are required by machine @@ -252,26 +156,6 @@ R15, R15_H, RSP, RSP_H); -// XXX probably use 8-15 first on Linux -alloc_class chunk1(XMM0, XMM0_H, - XMM1, XMM1_H, - XMM2, XMM2_H, - XMM3, XMM3_H, - XMM4, XMM4_H, - XMM5, XMM5_H, - XMM6, XMM6_H, - XMM7, XMM7_H, - XMM8, XMM8_H, - XMM9, XMM9_H, - XMM10, XMM10_H, - XMM11, XMM11_H, - XMM12, XMM12_H, - XMM13, XMM13_H, - XMM14, XMM14_H, - XMM15, XMM15_H); - -alloc_class chunk2(RFLAGS); - //----------Architecture Description Register Classes-------------------------- // Several register classes are automatically defined based upon information in @@ -501,46 +385,7 @@ // Singleton class for instruction pointer // reg_class ip_reg(RIP); -// Singleton class for condition codes -reg_class int_flags(RFLAGS); - -// Class for all float registers -reg_class float_reg(XMM0, - XMM1, - XMM2, - XMM3, - XMM4, - XMM5, - XMM6, - XMM7, - XMM8, - XMM9, - XMM10, - XMM11, - XMM12, - XMM13, - XMM14, - XMM15); - -// Class for all double registers -reg_class double_reg(XMM0, XMM0_H, - XMM1, XMM1_H, - XMM2, XMM2_H, - XMM3, XMM3_H, - XMM4, XMM4_H, - XMM5, XMM5_H, - XMM6, XMM6_H, - XMM7, XMM7_H, - XMM8, XMM8_H, - XMM9, XMM9_H, - XMM10, XMM10_H, - XMM11, XMM11_H, - XMM12, XMM12_H, - XMM13, XMM13_H, - XMM14, XMM14_H, - XMM15, XMM15_H); -%} - +%} //----------SOURCE BLOCK------------------------------------------------------- // This is a block of C++ code which provides values, functions, and @@ -1027,12 +872,84 @@ return rc_float; } +// Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad. +static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo, + int src_hi, int dst_hi, uint ireg, outputStream* st); + +static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load, + int stack_offset, int reg, uint ireg, outputStream* st); + +static void vec_stack_to_stack_helper(CodeBuffer *cbuf, int src_offset, + int dst_offset, uint ireg, outputStream* st) { + if (cbuf) { + MacroAssembler _masm(cbuf); + switch (ireg) { + case Op_VecS: + __ movq(Address(rsp, -8), rax); + __ movl(rax, Address(rsp, src_offset)); + __ movl(Address(rsp, dst_offset), rax); + __ movq(rax, Address(rsp, -8)); + break; + case Op_VecD: + __ pushq(Address(rsp, src_offset)); + __ popq (Address(rsp, dst_offset)); + break; + case Op_VecX: + __ pushq(Address(rsp, src_offset)); + __ popq (Address(rsp, dst_offset)); + __ pushq(Address(rsp, src_offset+8)); + __ popq (Address(rsp, dst_offset+8)); + break; + case Op_VecY: + __ vmovdqu(Address(rsp, -32), xmm0); + __ vmovdqu(xmm0, Address(rsp, src_offset)); + __ vmovdqu(Address(rsp, dst_offset), xmm0); + __ vmovdqu(xmm0, Address(rsp, -32)); + break; + default: + ShouldNotReachHere(); + } +#ifndef PRODUCT + } else { + switch (ireg) { + case Op_VecS: + st->print("movq [rsp - #8], rax\t# 32-bit mem-mem spill\n\t" + "movl rax, [rsp + #%d]\n\t" + "movl [rsp + #%d], rax\n\t" + "movq rax, [rsp - #8]", + src_offset, dst_offset); + break; + case Op_VecD: + st->print("pushq [rsp + #%d]\t# 64-bit mem-mem spill\n\t" + "popq [rsp + #%d]", + src_offset, dst_offset); + break; + case Op_VecX: + st->print("pushq [rsp + #%d]\t# 128-bit mem-mem spill\n\t" + "popq [rsp + #%d]\n\t" + "pushq [rsp + #%d]\n\t" + "popq [rsp + #%d]", + src_offset, dst_offset, src_offset+8, dst_offset+8); + break; + case Op_VecY: + st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t" + "vmovdqu xmm0, [rsp + #%d]\n\t" + "vmovdqu [rsp + #%d], xmm0\n\t" + "vmovdqu xmm0, [rsp - #32]", + src_offset, dst_offset); + break; + default: + ShouldNotReachHere(); + } +#endif + } +} + uint MachSpillCopyNode::implementation(CodeBuffer* cbuf, PhaseRegAlloc* ra_, bool do_size, - outputStream* st) const -{ - + outputStream* st) const { + assert(cbuf != NULL || st != NULL, "sanity"); // Get registers to move OptoReg::Name src_second = ra_->get_reg_second(in(1)); OptoReg::Name src_first = ra_->get_reg_first(in(1)); @@ -1050,7 +967,30 @@ if (src_first == dst_first && src_second == dst_second) { // Self copy, no move return 0; - } else if (src_first_rc == rc_stack) { + } + if (bottom_type()->isa_vect() != NULL) { + uint ireg = ideal_reg(); + assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity"); + assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity"); + if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) { + // mem -> mem + int src_offset = ra_->reg2offset(src_first); + int dst_offset = ra_->reg2offset(dst_first); + vec_stack_to_stack_helper(cbuf, src_offset, dst_offset, ireg, st); + } else if (src_first_rc == rc_float && dst_first_rc == rc_float ) { + vec_mov_helper(cbuf, false, src_first, dst_first, src_second, dst_second, ireg, st); + } else if (src_first_rc == rc_float && dst_first_rc == rc_stack ) { + int stack_offset = ra_->reg2offset(dst_first); + vec_spill_helper(cbuf, false, false, stack_offset, src_first, ireg, st); + } else if (src_first_rc == rc_stack && dst_first_rc == rc_float ) { + int stack_offset = ra_->reg2offset(src_first); + vec_spill_helper(cbuf, false, true, stack_offset, dst_first, ireg, st); + } else { + ShouldNotReachHere(); + } + return 0; + } + if (src_first_rc == rc_stack) { // mem -> if (dst_first_rc == rc_stack) { // mem -> mem @@ -1061,23 +1001,16 @@ int src_offset = ra_->reg2offset(src_first); int dst_offset = ra_->reg2offset(dst_first); if (cbuf) { - emit_opcode(*cbuf, 0xFF); - encode_RegMem(*cbuf, RSI_enc, RSP_enc, 0x4, 0, src_offset, false); - - emit_opcode(*cbuf, 0x8F); - encode_RegMem(*cbuf, RAX_enc, RSP_enc, 0x4, 0, dst_offset, false); - + MacroAssembler _masm(cbuf); + __ pushq(Address(rsp, src_offset)); + __ popq (Address(rsp, dst_offset)); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("pushq [rsp + #%d]\t# 64-bit mem-mem spill\n\t" - "popq [rsp + #%d]", - src_offset, - dst_offset); + "popq [rsp + #%d]", + src_offset, dst_offset); #endif } - return - 3 + ((src_offset == 0) ? 0 : (src_offset < 0x80 ? 1 : 4)) + - 3 + ((dst_offset == 0) ? 0 : (dst_offset < 0x80 ? 1 : 4)); } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); @@ -1086,46 +1019,22 @@ int src_offset = ra_->reg2offset(src_first); int dst_offset = ra_->reg2offset(dst_first); if (cbuf) { - emit_opcode(*cbuf, Assembler::REX_W); - emit_opcode(*cbuf, 0x89); - emit_opcode(*cbuf, 0x44); - emit_opcode(*cbuf, 0x24); - emit_opcode(*cbuf, 0xF8); - - emit_opcode(*cbuf, 0x8B); - encode_RegMem(*cbuf, - RAX_enc, - RSP_enc, 0x4, 0, src_offset, - false); - - emit_opcode(*cbuf, 0x89); - encode_RegMem(*cbuf, - RAX_enc, - RSP_enc, 0x4, 0, dst_offset, - false); - - emit_opcode(*cbuf, Assembler::REX_W); - emit_opcode(*cbuf, 0x8B); - emit_opcode(*cbuf, 0x44); - emit_opcode(*cbuf, 0x24); - emit_opcode(*cbuf, 0xF8); - + MacroAssembler _masm(cbuf); + __ movq(Address(rsp, -8), rax); + __ movl(rax, Address(rsp, src_offset)); + __ movl(Address(rsp, dst_offset), rax); + __ movq(rax, Address(rsp, -8)); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movq [rsp - #8], rax\t# 32-bit mem-mem spill\n\t" - "movl rax, [rsp + #%d]\n\t" - "movl [rsp + #%d], rax\n\t" - "movq rax, [rsp - #8]", - src_offset, - dst_offset); + "movl rax, [rsp + #%d]\n\t" + "movl [rsp + #%d], rax\n\t" + "movq rax, [rsp - #8]", + src_offset, dst_offset); #endif } - return - 5 + // movq - 3 + ((src_offset == 0) ? 0 : (src_offset < 0x80 ? 1 : 4)) + // movl - 3 + ((dst_offset == 0) ? 0 : (dst_offset < 0x80 ? 1 : 4)) + // movl - 5; // movq } + return 0; } else if (dst_first_rc == rc_int) { // mem -> gpr if ((src_first & 1) == 0 && src_first + 1 == src_second && @@ -1133,52 +1042,32 @@ // 64-bit int offset = ra_->reg2offset(src_first); if (cbuf) { - if (Matcher::_regEncode[dst_first] < 8) { - emit_opcode(*cbuf, Assembler::REX_W); - } else { - emit_opcode(*cbuf, Assembler::REX_WR); - } - emit_opcode(*cbuf, 0x8B); - encode_RegMem(*cbuf, - Matcher::_regEncode[dst_first], - RSP_enc, 0x4, 0, offset, - false); + MacroAssembler _masm(cbuf); + __ movq(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset)); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movq %s, [rsp + #%d]\t# spill", Matcher::regName[dst_first], offset); #endif } - return - ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + 4; // REX } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); int offset = ra_->reg2offset(src_first); if (cbuf) { - if (Matcher::_regEncode[dst_first] >= 8) { - emit_opcode(*cbuf, Assembler::REX_R); - } - emit_opcode(*cbuf, 0x8B); - encode_RegMem(*cbuf, - Matcher::_regEncode[dst_first], - RSP_enc, 0x4, 0, offset, - false); + MacroAssembler _masm(cbuf); + __ movl(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset)); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movl %s, [rsp + #%d]\t# spill", Matcher::regName[dst_first], offset); #endif } - return - ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + - ((Matcher::_regEncode[dst_first] < 8) - ? 3 - : 4); // REX } + return 0; } else if (dst_first_rc == rc_float) { // mem-> xmm if ((src_first & 1) == 0 && src_first + 1 == src_second && @@ -1189,18 +1078,13 @@ MacroAssembler _masm(cbuf); __ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset)); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("%s %s, [rsp + #%d]\t# spill", UseXmmLoadAndClearUpper ? "movsd " : "movlpd", Matcher::regName[dst_first], offset); #endif } - return - ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + - ((Matcher::_regEncode[dst_first] >= 8) - ? 6 - : (5 + ((UseAVX>0)?1:0))); // REX } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); @@ -1210,18 +1094,14 @@ MacroAssembler _masm(cbuf); __ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset)); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movss %s, [rsp + #%d]\t# spill", Matcher::regName[dst_first], offset); #endif } - return - ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + - ((Matcher::_regEncode[dst_first] >= 8) - ? 6 - : (5 + ((UseAVX>0)?1:0))); // REX } + return 0; } } else if (src_first_rc == rc_int) { // gpr -> @@ -1232,113 +1112,65 @@ // 64-bit int offset = ra_->reg2offset(dst_first); if (cbuf) { - if (Matcher::_regEncode[src_first] < 8) { - emit_opcode(*cbuf, Assembler::REX_W); - } else { - emit_opcode(*cbuf, Assembler::REX_WR); - } - emit_opcode(*cbuf, 0x89); - encode_RegMem(*cbuf, - Matcher::_regEncode[src_first], - RSP_enc, 0x4, 0, offset, - false); + MacroAssembler _masm(cbuf); + __ movq(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movq [rsp + #%d], %s\t# spill", offset, Matcher::regName[src_first]); #endif } - return ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + 4; // REX } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); int offset = ra_->reg2offset(dst_first); if (cbuf) { - if (Matcher::_regEncode[src_first] >= 8) { - emit_opcode(*cbuf, Assembler::REX_R); - } - emit_opcode(*cbuf, 0x89); - encode_RegMem(*cbuf, - Matcher::_regEncode[src_first], - RSP_enc, 0x4, 0, offset, - false); + MacroAssembler _masm(cbuf); + __ movl(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movl [rsp + #%d], %s\t# spill", offset, Matcher::regName[src_first]); #endif } - return - ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + - ((Matcher::_regEncode[src_first] < 8) - ? 3 - : 4); // REX } + return 0; } else if (dst_first_rc == rc_int) { // gpr -> gpr if ((src_first & 1) == 0 && src_first + 1 == src_second && (dst_first & 1) == 0 && dst_first + 1 == dst_second) { // 64-bit if (cbuf) { - if (Matcher::_regEncode[dst_first] < 8) { - if (Matcher::_regEncode[src_first] < 8) { - emit_opcode(*cbuf, Assembler::REX_W); - } else { - emit_opcode(*cbuf, Assembler::REX_WB); - } - } else { - if (Matcher::_regEncode[src_first] < 8) { - emit_opcode(*cbuf, Assembler::REX_WR); - } else { - emit_opcode(*cbuf, Assembler::REX_WRB); - } - } - emit_opcode(*cbuf, 0x8B); - emit_rm(*cbuf, 0x3, - Matcher::_regEncode[dst_first] & 7, - Matcher::_regEncode[src_first] & 7); + MacroAssembler _masm(cbuf); + __ movq(as_Register(Matcher::_regEncode[dst_first]), + as_Register(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movq %s, %s\t# spill", Matcher::regName[dst_first], Matcher::regName[src_first]); #endif } - return 3; // REX + return 0; } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); if (cbuf) { - if (Matcher::_regEncode[dst_first] < 8) { - if (Matcher::_regEncode[src_first] >= 8) { - emit_opcode(*cbuf, Assembler::REX_B); - } - } else { - if (Matcher::_regEncode[src_first] < 8) { - emit_opcode(*cbuf, Assembler::REX_R); - } else { - emit_opcode(*cbuf, Assembler::REX_RB); - } - } - emit_opcode(*cbuf, 0x8B); - emit_rm(*cbuf, 0x3, - Matcher::_regEncode[dst_first] & 7, - Matcher::_regEncode[src_first] & 7); + MacroAssembler _masm(cbuf); + __ movl(as_Register(Matcher::_regEncode[dst_first]), + as_Register(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movl %s, %s\t# spill", Matcher::regName[dst_first], Matcher::regName[src_first]); #endif } - return - (Matcher::_regEncode[src_first] < 8 && Matcher::_regEncode[dst_first] < 8) - ? 2 - : 3; // REX + return 0; } } else if (dst_first_rc == rc_float) { // gpr -> xmm @@ -1349,13 +1181,12 @@ MacroAssembler _masm(cbuf); __ movdq( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movdq %s, %s\t# spill", Matcher::regName[dst_first], Matcher::regName[src_first]); #endif } - return 5; // REX } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); @@ -1364,17 +1195,14 @@ MacroAssembler _masm(cbuf); __ movdl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movdl %s, %s\t# spill", Matcher::regName[dst_first], Matcher::regName[src_first]); #endif } - return - (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8) - ? 5 - : (4 + ((UseAVX>0)?1:0)); // REX } + return 0; } } else if (src_first_rc == rc_float) { // xmm -> @@ -1388,17 +1216,12 @@ MacroAssembler _masm(cbuf); __ movdbl( Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movsd [rsp + #%d], %s\t# spill", offset, Matcher::regName[src_first]); #endif } - return - ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + - ((Matcher::_regEncode[src_first] >= 8) - ? 6 - : (5 + ((UseAVX>0)?1:0))); // REX } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); @@ -1408,18 +1231,14 @@ MacroAssembler _masm(cbuf); __ movflt(Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movss [rsp + #%d], %s\t# spill", offset, Matcher::regName[src_first]); #endif } - return - ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + - ((Matcher::_regEncode[src_first] >=8) - ? 6 - : (5 + ((UseAVX>0)?1:0))); // REX } + return 0; } else if (dst_first_rc == rc_int) { // xmm -> gpr if ((src_first & 1) == 0 && src_first + 1 == src_second && @@ -1429,13 +1248,12 @@ MacroAssembler _masm(cbuf); __ movdq( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movdq %s, %s\t# spill", Matcher::regName[dst_first], Matcher::regName[src_first]); #endif } - return 5; // REX } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); @@ -1444,17 +1262,14 @@ MacroAssembler _masm(cbuf); __ movdl( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("movdl %s, %s\t# spill", Matcher::regName[dst_first], Matcher::regName[src_first]); #endif } - return - (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8) - ? 5 - : (4 + ((UseAVX>0)?1:0)); // REX } + return 0; } else if (dst_first_rc == rc_float) { // xmm -> xmm if ((src_first & 1) == 0 && src_first + 1 == src_second && @@ -1464,17 +1279,13 @@ MacroAssembler _masm(cbuf); __ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("%s %s, %s\t# spill", UseXmmRegToRegMoveAll ? "movapd" : "movsd ", Matcher::regName[dst_first], Matcher::regName[src_first]); #endif } - return - (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8) - ? 5 - : (4 + ((UseAVX>0)?1:0)); // REX } else { // 32-bit assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); @@ -1483,42 +1294,35 @@ MacroAssembler _masm(cbuf); __ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); #ifndef PRODUCT - } else if (!do_size) { + } else { st->print("%s %s, %s\t# spill", UseXmmRegToRegMoveAll ? "movaps" : "movss ", Matcher::regName[dst_first], Matcher::regName[src_first]); #endif } - return ((UseAVX>0) ? 5: - ((Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8) - ? (UseXmmRegToRegMoveAll ? 4 : 5) - : (UseXmmRegToRegMoveAll ? 3 : 4))); // REX } + return 0; } } assert(0," foo "); Unimplemented(); - return 0; } #ifndef PRODUCT -void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const -{ +void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const { implementation(NULL, ra_, false, st); } #endif -void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const -{ +void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { implementation(&cbuf, ra_, false, NULL); } -uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const -{ - return implementation(NULL, ra_, true, NULL); +uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const { + return MachNode::size(ra_); } //============================================================================= @@ -1735,16 +1539,6 @@ return true; } -// Vector width in bytes -const uint Matcher::vector_width_in_bytes(void) { - return 8; -} - -// Vector ideal reg -const uint Matcher::vector_ideal_reg(void) { - return Op_RegD; -} - // Is this branch offset short enough that a short branch can be used? // // NOTE: If the platform does not provide any short branch variants, then @@ -1831,21 +1625,21 @@ bool Matcher::can_be_java_arg(int reg) { return - reg == RDI_num || reg == RDI_H_num || - reg == RSI_num || reg == RSI_H_num || - reg == RDX_num || reg == RDX_H_num || - reg == RCX_num || reg == RCX_H_num || - reg == R8_num || reg == R8_H_num || - reg == R9_num || reg == R9_H_num || - reg == R12_num || reg == R12_H_num || - reg == XMM0_num || reg == XMM0_H_num || - reg == XMM1_num || reg == XMM1_H_num || - reg == XMM2_num || reg == XMM2_H_num || - reg == XMM3_num || reg == XMM3_H_num || - reg == XMM4_num || reg == XMM4_H_num || - reg == XMM5_num || reg == XMM5_H_num || - reg == XMM6_num || reg == XMM6_H_num || - reg == XMM7_num || reg == XMM7_H_num; + reg == RDI_num || reg == RDI_H_num || + reg == RSI_num || reg == RSI_H_num || + reg == RDX_num || reg == RDX_H_num || + reg == RCX_num || reg == RCX_H_num || + reg == R8_num || reg == R8_H_num || + reg == R9_num || reg == R9_H_num || + reg == R12_num || reg == R12_H_num || + reg == XMM0_num || reg == XMM0b_num || + reg == XMM1_num || reg == XMM1b_num || + reg == XMM2_num || reg == XMM2b_num || + reg == XMM3_num || reg == XMM3b_num || + reg == XMM4_num || reg == XMM4b_num || + reg == XMM5_num || reg == XMM5b_num || + reg == XMM6_num || reg == XMM6b_num || + reg == XMM7_num || reg == XMM7b_num; } bool Matcher::is_spillable_arg(int reg) @@ -3220,10 +3014,11 @@ OptoReg::Bad, // Op_RegI RAX_H_num, // Op_RegP OptoReg::Bad, // Op_RegF - XMM0_H_num, // Op_RegD + XMM0b_num, // Op_RegD RAX_H_num // Op_RegL }; - assert(ARRAY_SIZE(hi) == _last_machine_leaf - 1, "missing type"); + // Excluded flags and vector registers. + assert(ARRAY_SIZE(hi) == _last_machine_leaf - 5, "missing type"); return OptoRegPair(hi[ideal_reg], lo[ideal_reg]); %} %} @@ -3985,7 +3780,6 @@ interface(REG_INTER); %} - //----------Memory Operands---------------------------------------------------- // Direct Memory Operand // operand direct(immP addr) @@ -5416,61 +5210,6 @@ ins_pipe(pipe_slow); // XXX %} -// Load Aligned Packed Byte to XMM register -instruct loadA8B(regD dst, memory mem) %{ - match(Set dst (Load8B mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed8B" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - -// Load Aligned Packed Short to XMM register -instruct loadA4S(regD dst, memory mem) %{ - match(Set dst (Load4S mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed4S" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - -// Load Aligned Packed Char to XMM register -instruct loadA4C(regD dst, memory mem) %{ - match(Set dst (Load4C mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed4C" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - -// Load Aligned Packed Integer to XMM register -instruct load2IU(regD dst, memory mem) %{ - match(Set dst (Load2I mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed2I" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - -// Load Aligned Packed Single to XMM -instruct loadA2F(regD dst, memory mem) %{ - match(Set dst (Load2F mem)); - ins_cost(125); - format %{ "MOVQ $dst,$mem\t! packed2F" %} - ins_encode %{ - __ movq($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe( pipe_slow ); -%} - // Load Effective Address instruct leaP8(rRegP dst, indOffset8 mem) %{ @@ -6200,39 +5939,6 @@ ins_pipe(ialu_mem_imm); %} -// Store Aligned Packed Byte XMM register to memory -instruct storeA8B(memory mem, regD src) %{ - match(Set mem (Store8B mem src)); - ins_cost(145); - format %{ "MOVQ $mem,$src\t! packed8B" %} - ins_encode %{ - __ movq($mem$$Address, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - -// Store Aligned Packed Char/Short XMM register to memory -instruct storeA4C(memory mem, regD src) %{ - match(Set mem (Store4C mem src)); - ins_cost(145); - format %{ "MOVQ $mem,$src\t! packed4C" %} - ins_encode %{ - __ movq($mem$$Address, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - -// Store Aligned Packed Integer XMM register to memory -instruct storeA2I(memory mem, regD src) %{ - match(Set mem (Store2I mem src)); - ins_cost(145); - format %{ "MOVQ $mem,$src\t! packed2I" %} - ins_encode %{ - __ movq($mem$$Address, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - // Store CMS card-mark Immediate instruct storeImmCM0_reg(memory mem, immI0 zero) %{ @@ -6258,17 +5964,6 @@ ins_pipe(ialu_mem_imm); %} -// Store Aligned Packed Single Float XMM register to memory -instruct storeA2F(memory mem, regD src) %{ - match(Set mem (Store2F mem src)); - ins_cost(145); - format %{ "MOVQ $mem,$src\t! packed2F" %} - ins_encode %{ - __ movq($mem$$Address, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - // Store Float instruct storeF(memory mem, regF src) %{ @@ -6417,14 +6112,14 @@ match(Set dst (ReverseBytesL dst)); format %{ "bswapq $dst" %} - opcode(0x0F, 0xC8); /* Opcode 0F /C8 */ ins_encode( REX_reg_wide(dst), OpcP, opc2_reg(dst) ); ins_pipe( ialu_reg); %} -instruct bytes_reverse_unsigned_short(rRegI dst) %{ +instruct bytes_reverse_unsigned_short(rRegI dst, rFlagsReg cr) %{ match(Set dst (ReverseBytesUS dst)); + effect(KILL cr); format %{ "bswapl $dst\n\t" "shrl $dst,16\n\t" %} @@ -6435,8 +6130,9 @@ ins_pipe( ialu_reg ); %} -instruct bytes_reverse_short(rRegI dst) %{ +instruct bytes_reverse_short(rRegI dst, rFlagsReg cr) %{ match(Set dst (ReverseBytesS dst)); + effect(KILL cr); format %{ "bswapl $dst\n\t" "sar $dst,16\n\t" %} @@ -6564,9 +6260,10 @@ //---------- Population Count Instructions ------------------------------------- -instruct popCountI(rRegI dst, rRegI src) %{ +instruct popCountI(rRegI dst, rRegI src, rFlagsReg cr) %{ predicate(UsePopCountInstruction); match(Set dst (PopCountI src)); + effect(KILL cr); format %{ "popcnt $dst, $src" %} ins_encode %{ @@ -6575,9 +6272,10 @@ ins_pipe(ialu_reg); %} -instruct popCountI_mem(rRegI dst, memory mem) %{ +instruct popCountI_mem(rRegI dst, memory mem, rFlagsReg cr) %{ predicate(UsePopCountInstruction); match(Set dst (PopCountI (LoadI mem))); + effect(KILL cr); format %{ "popcnt $dst, $mem" %} ins_encode %{ @@ -6587,9 +6285,10 @@ %} // Note: Long.bitCount(long) returns an int. -instruct popCountL(rRegI dst, rRegL src) %{ +instruct popCountL(rRegI dst, rRegL src, rFlagsReg cr) %{ predicate(UsePopCountInstruction); match(Set dst (PopCountL src)); + effect(KILL cr); format %{ "popcnt $dst, $src" %} ins_encode %{ @@ -6599,9 +6298,10 @@ %} // Note: Long.bitCount(long) returns an int. -instruct popCountL_mem(rRegI dst, memory mem) %{ +instruct popCountL_mem(rRegI dst, memory mem, rFlagsReg cr) %{ predicate(UsePopCountInstruction); match(Set dst (PopCountL (LoadL mem))); + effect(KILL cr); format %{ "popcnt $dst, $mem" %} ins_encode %{ @@ -7492,18 +7192,6 @@ ins_pipe(ialu_reg_mem); // XXX %} -// LoadL-locked - same as a regular LoadL when used with compare-swap -instruct loadLLocked(rRegL dst, memory mem) -%{ - match(Set dst (LoadLLocked mem)); - - ins_cost(125); // XXX - format %{ "movq $dst, $mem\t# long locked" %} - opcode(0x8B); - ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); - ins_pipe(ialu_reg_mem); // XXX -%} - // Conditional-store of the updated heap-top. // Used during allocation of the shared heap. // Sets flags (EQ) on success. Implemented with a CMPXCHG on Intel. @@ -9823,7 +9511,39 @@ ins_pipe( pipe_slow ); %} - +instruct powD_reg(regD dst, regD src0, regD src1, rax_RegI rax, rdx_RegI rdx, rcx_RegI rcx, rFlagsReg cr) %{ + match(Set dst (PowD src0 src1)); // Raise src0 to the src1'th power + effect(KILL rax, KILL rdx, KILL rcx, KILL cr); + format %{ "fast_pow $src0 $src1 -> $dst // KILL $rax, $rcx, $rdx" %} + ins_encode %{ + __ subptr(rsp, 8); + __ movdbl(Address(rsp, 0), $src1$$XMMRegister); + __ fld_d(Address(rsp, 0)); + __ movdbl(Address(rsp, 0), $src0$$XMMRegister); + __ fld_d(Address(rsp, 0)); + __ fast_pow(); + __ fstp_d(Address(rsp, 0)); + __ movdbl($dst$$XMMRegister, Address(rsp, 0)); + __ addptr(rsp, 8); + %} + ins_pipe( pipe_slow ); +%} + +instruct expD_reg(regD dst, regD src, rax_RegI rax, rdx_RegI rdx, rcx_RegI rcx, rFlagsReg cr) %{ + match(Set dst (ExpD src)); + effect(KILL rax, KILL rcx, KILL rdx, KILL cr); + format %{ "fast_exp $dst -> $src // KILL $rax, $rcx, $rdx" %} + ins_encode %{ + __ subptr(rsp, 8); + __ movdbl(Address(rsp, 0), $src$$XMMRegister); + __ fld_d(Address(rsp, 0)); + __ fast_exp(); + __ fstp_d(Address(rsp, 0)); + __ movdbl($dst$$XMMRegister, Address(rsp, 0)); + __ addptr(rsp, 8); + %} + ins_pipe( pipe_slow ); +%} //----------Arithmetic Conversion Instructions--------------------------------- @@ -10352,172 +10072,6 @@ ins_pipe( pipe_slow ); %} -// Replicate scalar to packed byte (1 byte) values in xmm -instruct Repl8B_reg(regD dst, regD src) %{ - match(Set dst (Replicate8B src)); - format %{ "MOVDQA $dst,$src\n\t" - "PUNPCKLBW $dst,$dst\n\t" - "PSHUFLW $dst,$dst,0x00\t! replicate8B" %} - ins_encode %{ - if ($dst$$reg != $src$$reg) { - __ movdqa($dst$$XMMRegister, $src$$XMMRegister); - } - __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); - __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( pipe_slow ); -%} - -// Replicate scalar to packed byte (1 byte) values in xmm -instruct Repl8B_rRegI(regD dst, rRegI src) %{ - match(Set dst (Replicate8B src)); - format %{ "MOVD $dst,$src\n\t" - "PUNPCKLBW $dst,$dst\n\t" - "PSHUFLW $dst,$dst,0x00\t! replicate8B" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); - __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( pipe_slow ); -%} - -// Replicate scalar zero to packed byte (1 byte) values in xmm -instruct Repl8B_immI0(regD dst, immI0 zero) %{ - match(Set dst (Replicate8B zero)); - format %{ "PXOR $dst,$dst\t! replicate8B" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed shore (2 byte) values in xmm -instruct Repl4S_reg(regD dst, regD src) %{ - match(Set dst (Replicate4S src)); - format %{ "PSHUFLW $dst,$src,0x00\t! replicate4S" %} - ins_encode %{ - __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed shore (2 byte) values in xmm -instruct Repl4S_rRegI(regD dst, rRegI src) %{ - match(Set dst (Replicate4S src)); - format %{ "MOVD $dst,$src\n\t" - "PSHUFLW $dst,$dst,0x00\t! replicate4S" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar zero to packed short (2 byte) values in xmm -instruct Repl4S_immI0(regD dst, immI0 zero) %{ - match(Set dst (Replicate4S zero)); - format %{ "PXOR $dst,$dst\t! replicate4S" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed char (2 byte) values in xmm -instruct Repl4C_reg(regD dst, regD src) %{ - match(Set dst (Replicate4C src)); - format %{ "PSHUFLW $dst,$src,0x00\t! replicate4C" %} - ins_encode %{ - __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed char (2 byte) values in xmm -instruct Repl4C_rRegI(regD dst, rRegI src) %{ - match(Set dst (Replicate4C src)); - format %{ "MOVD $dst,$src\n\t" - "PSHUFLW $dst,$dst,0x00\t! replicate4C" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar zero to packed char (2 byte) values in xmm -instruct Repl4C_immI0(regD dst, immI0 zero) %{ - match(Set dst (Replicate4C zero)); - format %{ "PXOR $dst,$dst\t! replicate4C" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed integer (4 byte) values in xmm -instruct Repl2I_reg(regD dst, regD src) %{ - match(Set dst (Replicate2I src)); - format %{ "PSHUFD $dst,$src,0x00\t! replicate2I" %} - ins_encode %{ - __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed integer (4 byte) values in xmm -instruct Repl2I_rRegI(regD dst, rRegI src) %{ - match(Set dst (Replicate2I src)); - format %{ "MOVD $dst,$src\n\t" - "PSHUFD $dst,$dst,0x00\t! replicate2I" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar zero to packed integer (2 byte) values in xmm -instruct Repl2I_immI0(regD dst, immI0 zero) %{ - match(Set dst (Replicate2I zero)); - format %{ "PXOR $dst,$dst\t! replicate2I" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed single precision floating point values in xmm -instruct Repl2F_reg(regD dst, regD src) %{ - match(Set dst (Replicate2F src)); - format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %} - ins_encode %{ - __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed single precision floating point values in xmm -instruct Repl2F_regF(regD dst, regF src) %{ - match(Set dst (Replicate2F src)); - format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %} - ins_encode %{ - __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Replicate scalar to packed single precision floating point values in xmm -instruct Repl2F_immF0(regD dst, immF0 zero) %{ - match(Set dst (Replicate2F zero)); - format %{ "PXOR $dst,$dst\t! replicate2F" %} - ins_encode %{ - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe( fpu_reg_reg ); -%} - // ======================================================================= // fast clearing of an array diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/cpu/zero/vm/cppInterpreter_zero.cpp --- a/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1026,6 +1026,16 @@ java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); oop arg = VMSLOTS_OBJECT(arg_slot); jvalue arg_value; + if (arg == NULL) { + // queue a nullpointer exception for the caller + stack->set_sp(calculate_unwind_sp(stack, method_handle)); + CALL_VM_NOCHECK_NOFIX( + throw_exception( + thread, vmSymbols::java_lang_NullPointerException())); + // NB all oops trashed! + assert(HAS_PENDING_EXCEPTION, "should do"); + return; + } BasicType arg_type = java_lang_boxing_object::get_value(arg, &arg_value); if (arg_type == T_LONG || arg_type == T_DOUBLE) { intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); @@ -1112,6 +1122,15 @@ case T_SHORT: return; } + // INT results sometimes need narrowing + case T_BOOLEAN: + case T_CHAR: + case T_BYTE: + case T_SHORT: + switch (src_rtype) { + case T_INT: + return; + } } tty->print_cr("unhandled conversion:"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/bsd/vm/osThread_bsd.hpp --- a/src/os/bsd/vm/osThread_bsd.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/bsd/vm/osThread_bsd.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -42,26 +42,19 @@ #ifdef _ALLBSD_SOURCE #ifdef __APPLE__ - thread_t _thread_id; + typedef thread_t thread_id_t; #else - pthread_t _thread_id; + typedef pthread_t thread_id_t; +#endif + +#else + typedef pid_t thread_id_t; #endif // _pthread_id is the pthread id, which is used by library calls // (e.g. pthread_kill). pthread_t _pthread_id; -#else - // _thread_id is kernel thread id (similar to LWP id on Solaris). Each - // thread has a unique thread_id (BsdThreads or NPTL). It can be used - // to access /proc. - pid_t _thread_id; - - // _pthread_id is the pthread id, which is used by library calls - // (e.g. pthread_kill). - pthread_t _pthread_id; -#endif - sigset_t _caller_sigmask; // Caller's signal mask public: @@ -70,28 +63,11 @@ sigset_t caller_sigmask() const { return _caller_sigmask; } void set_caller_sigmask(sigset_t sigmask) { _caller_sigmask = sigmask; } -#ifdef _ALLBSD_SOURCE -#ifdef __APPLE__ - static size_t thread_id_size() { return sizeof(thread_t); } - thread_t thread_id() const { - return _thread_id; - } -#else - static size_t thread_id_size() { return sizeof(pthread_t); } - pthread_t thread_id() const { - return _thread_id; - } -#endif -#else - static size_t thread_id_size() { return sizeof(pid_t); } - pid_t thread_id() const { - return _thread_id; - } -#endif #ifndef PRODUCT // Used for debugging, return a unique integer for each thread. intptr_t thread_identifier() const { return (intptr_t)_pthread_id; } #endif + #ifdef ASSERT // We expect no reposition failures so kill vm if we get one. // @@ -99,21 +75,7 @@ return false; } #endif // ASSERT -#ifdef _ALLBSD_SOURCE -#ifdef __APPLE__ - void set_thread_id(thread_t id) { - _thread_id = id; - } -#else - void set_thread_id(pthread_t id) { - _thread_id = id; - } -#endif -#else - void set_thread_id(pid_t id) { - _thread_id = id; - } -#endif + pthread_t pthread_id() const { return _pthread_id; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/bsd/vm/os_bsd.cpp --- a/src/os/bsd/vm/os_bsd.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/bsd/vm/os_bsd.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -440,7 +440,7 @@ // code needs to be changed accordingly. // The next few definitions allow the code to be verbatim: -#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n)) +#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal) #define getenv(n) ::getenv(n) /* @@ -1913,11 +1913,11 @@ // release the storage for (int i = 0 ; i < n ; i++) { if (pelements[i] != NULL) { - FREE_C_HEAP_ARRAY(char, pelements[i]); + FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal); } } if (pelements != NULL) { - FREE_C_HEAP_ARRAY(char*, pelements); + FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); } } else { snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname); @@ -2340,93 +2340,21 @@ #endif } +void os::print_os_info_brief(outputStream* st) { + st->print("Bsd"); + + os::Posix::print_uname_info(st); +} void os::print_os_info(outputStream* st) { st->print("OS:"); - - // Try to identify popular distros. - // Most Bsd distributions have /etc/XXX-release file, which contains - // the OS version string. Some have more than one /etc/XXX-release file - // (e.g. Mandrake has both /etc/mandrake-release and /etc/redhat-release.), - // so the order is important. - if (!_print_ascii_file("/etc/mandrake-release", st) && - !_print_ascii_file("/etc/sun-release", st) && - !_print_ascii_file("/etc/redhat-release", st) && - !_print_ascii_file("/etc/SuSE-release", st) && - !_print_ascii_file("/etc/turbobsd-release", st) && - !_print_ascii_file("/etc/gentoo-release", st) && - !_print_ascii_file("/etc/debian_version", st) && - !_print_ascii_file("/etc/ltib-release", st) && - !_print_ascii_file("/etc/angstrom-version", st)) { - st->print("Bsd"); - } - st->cr(); - - // kernel - st->print("uname:"); - struct utsname name; - uname(&name); - st->print(name.sysname); st->print(" "); - st->print(name.release); st->print(" "); - st->print(name.version); st->print(" "); - st->print(name.machine); - st->cr(); - -#ifndef _ALLBSD_SOURCE - // Print warning if unsafe chroot environment detected - if (unsafe_chroot_detected) { - st->print("WARNING!! "); - st->print_cr(unstable_chroot_error); - } - - // libc, pthread - st->print("libc:"); - st->print(os::Bsd::glibc_version()); st->print(" "); - st->print(os::Bsd::libpthread_version()); st->print(" "); - if (os::Bsd::is_BsdThreads()) { - st->print("(%s stack)", os::Bsd::is_floating_stack() ? "floating" : "fixed"); - } - st->cr(); -#endif - - // rlimit - st->print("rlimit:"); - struct rlimit rlim; - - st->print(" STACK "); - getrlimit(RLIMIT_STACK, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - - st->print(", CORE "); - getrlimit(RLIMIT_CORE, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - - st->print(", NPROC "); - getrlimit(RLIMIT_NPROC, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%d", rlim.rlim_cur); - - st->print(", NOFILE "); - getrlimit(RLIMIT_NOFILE, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%d", rlim.rlim_cur); - -#ifndef _ALLBSD_SOURCE - st->print(", AS "); - getrlimit(RLIMIT_AS, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - st->cr(); - - // load average - st->print("load average:"); - double loadavg[3]; - os::loadavg(loadavg, 3); - st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); - st->cr(); -#endif + st->print("Bsd"); + + os::Posix::print_uname_info(st); + + os::Posix::print_rlimit_info(st); + + os::Posix::print_load_average(st); } void os::pd_print_cpu_info(outputStream* st) { @@ -2838,7 +2766,7 @@ // All it does is to check if there are enough free pages // left at the time of mmap(). This could be a potential // problem. -bool os::commit_memory(char* addr, size_t size, bool exec) { +bool os::pd_commit_memory(char* addr, size_t size, bool exec) { int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; #ifdef __OpenBSD__ // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD @@ -2862,7 +2790,7 @@ #endif #endif -bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, +bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) { #ifndef _ALLBSD_SOURCE if (UseHugeTLBFS && alignment_hint > (size_t)vm_page_size()) { @@ -2878,7 +2806,7 @@ return commit_memory(addr, size, exec); } -void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { +void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { #ifndef _ALLBSD_SOURCE if (UseHugeTLBFS && alignment_hint > (size_t)vm_page_size()) { // We don't check the return value: madvise(MADV_HUGEPAGE) may not @@ -2888,7 +2816,7 @@ #endif } -void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) { +void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { ::madvise(addr, bytes, MADV_DONTNEED); } @@ -3030,7 +2958,7 @@ unsigned long* os::Bsd::_numa_all_nodes; #endif -bool os::uncommit_memory(char* addr, size_t size) { +bool os::pd_uncommit_memory(char* addr, size_t size) { #ifdef __OpenBSD__ // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD return ::mprotect(addr, size, PROT_NONE) == 0; @@ -3041,7 +2969,7 @@ #endif } -bool os::create_stack_guard_pages(char* addr, size_t size) { +bool os::pd_create_stack_guard_pages(char* addr, size_t size) { return os::commit_memory(addr, size); } @@ -3095,12 +3023,12 @@ return ::munmap(addr, size) == 0; } -char* os::reserve_memory(size_t bytes, char* requested_addr, +char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { return anon_mmap(requested_addr, bytes, (requested_addr != NULL)); } -bool os::release_memory(char* addr, size_t size) { +bool os::pd_release_memory(char* addr, size_t size) { return anon_munmap(addr, size); } @@ -3403,7 +3331,7 @@ // Reserve memory at an arbitrary address, only if that area is // available (and not reserved for something else). -char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) { +char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { const int max_tries = 10; char* base[max_tries]; size_t size[max_tries]; @@ -5059,7 +4987,7 @@ } // Map a block of memory. -char* os::map_memory(int fd, const char* file_name, size_t file_offset, +char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { int prot; @@ -5091,7 +5019,7 @@ // Remap a block of memory. -char* os::remap_memory(int fd, const char* file_name, size_t file_offset, +char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { // same as map_memory() on this OS @@ -5101,7 +5029,7 @@ // Unmap a block of memory. -bool os::unmap_memory(char* addr, size_t bytes) { +bool os::pd_unmap_memory(char* addr, size_t bytes) { return munmap(addr, bytes) == 0; } @@ -5873,3 +5801,14 @@ return true; } + +// Get the default path to the core file +// Returns the length of the string +int os::get_core_path(char* buffer, size_t bufferSize) { + int n = jio_snprintf(buffer, bufferSize, "/cores"); + + // Truncate if theoretical string was longer than bufferSize + n = MIN2(n, (int)bufferSize); + + return n; +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/bsd/vm/os_bsd.hpp --- a/src/os/bsd/vm/os_bsd.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/bsd/vm/os_bsd.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -312,7 +312,7 @@ }; -class PlatformEvent : public CHeapObj { +class PlatformEvent : public CHeapObj { private: double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line volatile int _Event ; @@ -347,7 +347,7 @@ void SetAssociation (Thread * a) { _Assoc = a ; } } ; -class PlatformParker : public CHeapObj { +class PlatformParker : public CHeapObj { protected: pthread_mutex_t _mutex [1] ; pthread_cond_t _cond [1] ; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/bsd/vm/os_bsd.inline.hpp --- a/src/os/bsd/vm/os_bsd.inline.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/bsd/vm/os_bsd.inline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -95,7 +95,7 @@ // On Bsd, reservations are made on a page by page basis, nothing to do. -inline void os::split_reserved_memory(char *base, size_t size, +inline void os::pd_split_reserved_memory(char *base, size_t size, size_t split, bool realloc) { } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/bsd/vm/perfMemory_bsd.cpp --- a/src/os/bsd/vm/perfMemory_bsd.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/bsd/vm/perfMemory_bsd.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -126,7 +126,7 @@ } } } - FREE_C_HEAP_ARRAY(char, destfile); + FREE_C_HEAP_ARRAY(char, destfile, mtInternal); } @@ -153,7 +153,7 @@ const char* tmpdir = os::get_temp_directory(); const char* perfdir = PERFDATA_NAME; size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3; - char* dirname = NEW_C_HEAP_ARRAY(char, nbytes); + char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); // construct the path name to user specific tmp directory snprintf(dirname, nbytes, "%s/%s_%s", tmpdir, perfdir, user); @@ -246,7 +246,7 @@ if (bufsize == -1) bufsize = 1024; - char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize); + char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); // POSIX interface to getpwuid_r is used on LINUX struct passwd* p; @@ -278,14 +278,14 @@ "pw_name zero length"); } } - FREE_C_HEAP_ARRAY(char, pwbuf); + FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal); return NULL; } - char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1); + char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal); strcpy(user_name, p->pw_name); - FREE_C_HEAP_ARRAY(char, pwbuf); + FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal); return user_name; } @@ -328,7 +328,7 @@ // to determine the user name for the process id. // struct dirent* dentry; - char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname)); + char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal); errno = 0; while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) { @@ -338,7 +338,7 @@ } char* usrdir_name = NEW_C_HEAP_ARRAY(char, - strlen(tmpdirname) + strlen(dentry->d_name) + 2); + strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal); strcpy(usrdir_name, tmpdirname); strcat(usrdir_name, "/"); strcat(usrdir_name, dentry->d_name); @@ -346,7 +346,7 @@ DIR* subdirp = os::opendir(usrdir_name); if (subdirp == NULL) { - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); continue; } @@ -357,13 +357,13 @@ // symlink can be exploited. // if (!is_directory_secure(usrdir_name)) { - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); os::closedir(subdirp); continue; } struct dirent* udentry; - char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name)); + char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal); errno = 0; while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) { @@ -372,7 +372,7 @@ int result; char* filename = NEW_C_HEAP_ARRAY(char, - strlen(usrdir_name) + strlen(udentry->d_name) + 2); + strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal); strcpy(filename, usrdir_name); strcat(filename, "/"); @@ -381,13 +381,13 @@ // don't follow symbolic links for the file RESTARTABLE(::lstat(filename, &statbuf), result); if (result == OS_ERR) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); continue; } // skip over files that are not regular files. if (!S_ISREG(statbuf.st_mode)) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); continue; } @@ -397,23 +397,23 @@ if (statbuf.st_ctime > oldest_ctime) { char* user = strchr(dentry->d_name, '_') + 1; - if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user); - oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1); + if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal); + oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal); strcpy(oldest_user, user); oldest_ctime = statbuf.st_ctime; } } - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); } } os::closedir(subdirp); - FREE_C_HEAP_ARRAY(char, udbuf); - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, udbuf, mtInternal); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); } os::closedir(tmpdirp); - FREE_C_HEAP_ARRAY(char, tdbuf); + FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal); return(oldest_user); } @@ -434,7 +434,7 @@ // add 2 for the file separator and a null terminator. size_t nbytes = strlen(dirname) + UINT_CHARS + 2; - char* name = NEW_C_HEAP_ARRAY(char, nbytes); + char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); snprintf(name, nbytes, "%s/%d", dirname, vmid); return name; @@ -472,7 +472,7 @@ static void remove_file(const char* dirname, const char* filename) { size_t nbytes = strlen(dirname) + strlen(filename) + 2; - char* path = NEW_C_HEAP_ARRAY(char, nbytes); + char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); strcpy(path, dirname); strcat(path, "/"); @@ -480,7 +480,7 @@ remove_file(path); - FREE_C_HEAP_ARRAY(char, path); + FREE_C_HEAP_ARRAY(char, path, mtInternal); } @@ -517,7 +517,7 @@ // opendir/readdir. // struct dirent* entry; - char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname)); + char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal); errno = 0; while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) { @@ -556,7 +556,7 @@ errno = 0; } os::closedir(dirp); - FREE_C_HEAP_ARRAY(char, dbuf); + FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); } // make the user specific temporary directory. Returns true if @@ -723,11 +723,11 @@ fd = create_sharedmem_resources(dirname, filename, size); - FREE_C_HEAP_ARRAY(char, user_name); - FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, user_name, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); if (fd == -1) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); return NULL; } @@ -743,7 +743,7 @@ warning("mmap failed - %s\n", strerror(errno)); } remove_file(filename); - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); return NULL; } @@ -869,7 +869,7 @@ // store file, we don't follow them when attaching either. // if (!is_directory_secure(dirname)) { - FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Process not found"); } @@ -884,9 +884,9 @@ strcpy(rfilename, filename); // free the c heap resources that are no longer needed - if (luser != user) FREE_C_HEAP_ARRAY(char, luser); - FREE_C_HEAP_ARRAY(char, dirname); - FREE_C_HEAP_ARRAY(char, filename); + if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); // open the shared memory file for the give vmid fd = open_sharedmem_file(rfilename, file_flags, CHECK); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/linux/vm/osThread_linux.hpp --- a/src/os/linux/vm/osThread_linux.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/linux/vm/osThread_linux.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -24,6 +24,8 @@ #ifndef OS_LINUX_VM_OSTHREAD_LINUX_HPP #define OS_LINUX_VM_OSTHREAD_LINUX_HPP + public: + typedef pid_t thread_id_t; private: int _thread_type; @@ -37,13 +39,6 @@ _thread_type = type; } - private: - - // _thread_id is kernel thread id (similar to LWP id on Solaris). Each - // thread has a unique thread_id (LinuxThreads or NPTL). It can be used - // to access /proc. - pid_t _thread_id; - // _pthread_id is the pthread id, which is used by library calls // (e.g. pthread_kill). pthread_t _pthread_id; @@ -56,11 +51,6 @@ sigset_t caller_sigmask() const { return _caller_sigmask; } void set_caller_sigmask(sigset_t sigmask) { _caller_sigmask = sigmask; } - static size_t thread_id_size() { return sizeof(pid_t); } - - pid_t thread_id() const { - return _thread_id; - } #ifndef PRODUCT // Used for debugging, return a unique integer for each thread. int thread_identifier() const { return _thread_id; } @@ -72,9 +62,6 @@ return false; } #endif // ASSERT - void set_thread_id(pid_t id) { - _thread_id = id; - } pthread_t pthread_id() const { return _pthread_id; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/linux/vm/os_linux.cpp --- a/src/os/linux/vm/os_linux.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/linux/vm/os_linux.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -371,7 +371,7 @@ // code needs to be changed accordingly. // The next few definitions allow the code to be verbatim: -#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n)) +#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal) #define getenv(n) ::getenv(n) /* @@ -639,7 +639,7 @@ size_t n = confstr(_CS_GNU_LIBC_VERSION, NULL, 0); if (n > 0) { - char *str = (char *)malloc(n); + char *str = (char *)malloc(n, mtInternal); confstr(_CS_GNU_LIBC_VERSION, str, n); os::Linux::set_glibc_version(str); } else { @@ -652,7 +652,7 @@ n = confstr(_CS_GNU_LIBPTHREAD_VERSION, NULL, 0); if (n > 0) { - char *str = (char *)malloc(n); + char *str = (char *)malloc(n, mtInternal); confstr(_CS_GNU_LIBPTHREAD_VERSION, str, n); // Vanilla RH-9 (glibc 2.3.2) has a bug that confstr() always tells // us "NPTL-0.29" even we are running with LinuxThreads. Check if this @@ -1685,11 +1685,11 @@ // release the storage for (int i = 0 ; i < n ; i++) { if (pelements[i] != NULL) { - FREE_C_HEAP_ARRAY(char, pelements[i]); + FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal); } } if (pelements != NULL) { - FREE_C_HEAP_ARRAY(char*, pelements); + FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); } } else { snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); @@ -2020,15 +2020,43 @@ } } +void os::print_os_info_brief(outputStream* st) { + os::Linux::print_distro_info(st); + + os::Posix::print_uname_info(st); + + os::Linux::print_libversion_info(st); + +} void os::print_os_info(outputStream* st) { st->print("OS:"); - // Try to identify popular distros. - // Most Linux distributions have /etc/XXX-release file, which contains - // the OS version string. Some have more than one /etc/XXX-release file - // (e.g. Mandrake has both /etc/mandrake-release and /etc/redhat-release.), - // so the order is important. + os::Linux::print_distro_info(st); + + os::Posix::print_uname_info(st); + + // Print warning if unsafe chroot environment detected + if (unsafe_chroot_detected) { + st->print("WARNING!! "); + st->print_cr(unstable_chroot_error); + } + + os::Linux::print_libversion_info(st); + + os::Posix::print_rlimit_info(st); + + os::Posix::print_load_average(st); + + os::Linux::print_full_memory_info(st); +} + +// Try to identify popular distros. +// Most Linux distributions have /etc/XXX-release file, which contains +// the OS version string. Some have more than one /etc/XXX-release file +// (e.g. Mandrake has both /etc/mandrake-release and /etc/redhat-release.), +// so the order is important. +void os::Linux::print_distro_info(outputStream* st) { if (!_print_ascii_file("/etc/mandrake-release", st) && !_print_ascii_file("/etc/sun-release", st) && !_print_ascii_file("/etc/redhat-release", st) && @@ -2041,23 +2069,9 @@ st->print("Linux"); } st->cr(); - - // kernel - st->print("uname:"); - struct utsname name; - uname(&name); - st->print(name.sysname); st->print(" "); - st->print(name.release); st->print(" "); - st->print(name.version); st->print(" "); - st->print(name.machine); - st->cr(); - - // Print warning if unsafe chroot environment detected - if (unsafe_chroot_detected) { - st->print("WARNING!! "); - st->print_cr(unstable_chroot_error); - } - +} + +void os::Linux::print_libversion_info(outputStream* st) { // libc, pthread st->print("libc:"); st->print(os::Linux::glibc_version()); st->print(" "); @@ -2066,56 +2080,12 @@ st->print("(%s stack)", os::Linux::is_floating_stack() ? "floating" : "fixed"); } st->cr(); - - // rlimit - st->print("rlimit:"); - struct rlimit rlim; - - st->print(" STACK "); - getrlimit(RLIMIT_STACK, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - - st->print(", CORE "); - getrlimit(RLIMIT_CORE, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - - st->print(", NPROC "); - getrlimit(RLIMIT_NPROC, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%d", rlim.rlim_cur); - - st->print(", NOFILE "); - getrlimit(RLIMIT_NOFILE, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%d", rlim.rlim_cur); - - st->print(", AS "); - getrlimit(RLIMIT_AS, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - st->cr(); - - // load average - st->print("load average:"); - double loadavg[3]; - os::loadavg(loadavg, 3); - st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); - st->cr(); - - // meminfo - st->print("\n/proc/meminfo:\n"); - _print_ascii_file("/proc/meminfo", st); - st->cr(); -} - -void os::pd_print_cpu_info(outputStream* st) { - st->print("\n/proc/cpuinfo:\n"); - if (!_print_ascii_file("/proc/cpuinfo", st)) { - st->print(" "); - } - st->cr(); +} + +void os::Linux::print_full_memory_info(outputStream* st) { + st->print("\n/proc/meminfo:\n"); + _print_ascii_file("/proc/meminfo", st); + st->cr(); } void os::print_memory_info(outputStream* st) { @@ -2138,6 +2108,14 @@ st->cr(); } +void os::pd_print_cpu_info(outputStream* st) { + st->print("\n/proc/cpuinfo:\n"); + if (!_print_ascii_file("/proc/cpuinfo", st)) { + st->print(" "); + } + st->cr(); +} + // Taken from /usr/include/bits/siginfo.h Supposed to be architecture specific // but they're the same for all the linux arch that we support // and they're the same for solaris but there's no common place to put this. @@ -2491,7 +2469,7 @@ // All it does is to check if there are enough free pages // left at the time of mmap(). This could be a potential // problem. -bool os::commit_memory(char* addr, size_t size, bool exec) { +bool os::pd_commit_memory(char* addr, size_t size, bool exec) { int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); @@ -2514,7 +2492,7 @@ #define MADV_HUGEPAGE 14 #endif -bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, +bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) { if (UseHugeTLBFS && alignment_hint > (size_t)vm_page_size()) { int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; @@ -2538,7 +2516,7 @@ return false; } -void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { +void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { if (UseHugeTLBFS && alignment_hint > (size_t)vm_page_size()) { // We don't check the return value: madvise(MADV_HUGEPAGE) may not // be supported or the memory may already be backed by huge pages. @@ -2546,7 +2524,7 @@ } } -void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) { +void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { // This method works by doing an mmap over an existing mmaping and effectively discarding // the existing pages. However it won't work for SHM-based large pages that cannot be // uncommitted at all. We don't do anything in this case to avoid creating a segment with @@ -2668,7 +2646,7 @@ if (numa_available() != -1) { set_numa_all_nodes((unsigned long*)libnuma_dlsym(handle, "numa_all_nodes")); // Create a cpu -> node mapping - _cpu_to_node = new (ResourceObj::C_HEAP) GrowableArray(0, true); + _cpu_to_node = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(0, true); rebuild_cpu_to_node_map(); return true; } @@ -2698,7 +2676,7 @@ cpu_to_node()->at_grow(cpu_num - 1); size_t node_num = numa_get_groups_num(); - unsigned long *cpu_map = NEW_C_HEAP_ARRAY(unsigned long, cpu_map_size); + unsigned long *cpu_map = NEW_C_HEAP_ARRAY(unsigned long, cpu_map_size, mtInternal); for (size_t i = 0; i < node_num; i++) { if (numa_node_to_cpus(i, cpu_map, cpu_map_size * sizeof(unsigned long)) != -1) { for (size_t j = 0; j < cpu_map_valid_size; j++) { @@ -2712,7 +2690,7 @@ } } } - FREE_C_HEAP_ARRAY(unsigned long, cpu_map); + FREE_C_HEAP_ARRAY(unsigned long, cpu_map, mtInternal); } int os::Linux::get_node_by_cpu(int cpu_id) { @@ -2731,7 +2709,7 @@ os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory; unsigned long* os::Linux::_numa_all_nodes; -bool os::uncommit_memory(char* addr, size_t size) { +bool os::pd_uncommit_memory(char* addr, size_t size) { uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0); return res != (uintptr_t) MAP_FAILED; @@ -2796,7 +2774,7 @@ // munmap() the guard pages we don't leave a hole in the stack // mapping. This only affects the main/initial thread, but guard // against future OS changes -bool os::create_stack_guard_pages(char* addr, size_t size) { +bool os::pd_create_stack_guard_pages(char* addr, size_t size) { uintptr_t stack_extent, stack_base; bool chk_bounds = NOT_DEBUG(os::Linux::is_initial_thread()) DEBUG_ONLY(true); if (chk_bounds && get_stack_bounds(&stack_extent, &stack_base)) { @@ -2869,12 +2847,12 @@ return ::munmap(addr, size) == 0; } -char* os::reserve_memory(size_t bytes, char* requested_addr, +char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { return anon_mmap(requested_addr, bytes, (requested_addr != NULL)); } -bool os::release_memory(char* addr, size_t size) { +bool os::pd_release_memory(char* addr, size_t size) { return anon_munmap(addr, size); } @@ -3171,7 +3149,7 @@ // Reserve memory at an arbitrary address, only if that area is // available (and not reserved for something else). -char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) { +char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { const int max_tries = 10; char* base[max_tries]; size_t size[max_tries]; @@ -4693,7 +4671,7 @@ } // Map a block of memory. -char* os::map_memory(int fd, const char* file_name, size_t file_offset, +char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { int prot; @@ -4723,7 +4701,7 @@ // Remap a block of memory. -char* os::remap_memory(int fd, const char* file_name, size_t file_offset, +char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { // same as map_memory() on this OS @@ -4733,7 +4711,7 @@ // Unmap a block of memory. -bool os::unmap_memory(char* addr, size_t bytes) { +bool os::pd_unmap_memory(char* addr, size_t bytes) { return munmap(addr, bytes) == 0; } @@ -5469,6 +5447,18 @@ return true; } +// Get the default path to the core file +// Returns the length of the string +int os::get_core_path(char* buffer, size_t bufferSize) { + const char* p = get_current_directory(buffer, bufferSize); + + if (p == NULL) { + assert(p != NULL, "failed to get current directory"); + return 0; + } + + return strlen(buffer); +} #ifdef JAVASE_EMBEDDED // diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/linux/vm/os_linux.hpp --- a/src/os/linux/vm/os_linux.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/linux/vm/os_linux.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -89,6 +89,10 @@ static bool hugetlbfs_sanity_check(bool warn, size_t page_size); + static void print_full_memory_info(outputStream* st); + static void print_distro_info(outputStream* st); + static void print_libversion_info(outputStream* st); + public: static void init_thread_fpu_state(); static int get_fpu_control_word(); @@ -283,7 +287,7 @@ }; -class PlatformEvent : public CHeapObj { +class PlatformEvent : public CHeapObj { private: double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line volatile int _Event ; @@ -318,7 +322,7 @@ void SetAssociation (Thread * a) { _Assoc = a ; } } ; -class PlatformParker : public CHeapObj { +class PlatformParker : public CHeapObj { protected: pthread_mutex_t _mutex [1] ; pthread_cond_t _cond [1] ; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/linux/vm/os_linux.inline.hpp --- a/src/os/linux/vm/os_linux.inline.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/linux/vm/os_linux.inline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -99,7 +99,7 @@ // On Linux, reservations are made on a page by page basis, nothing to do. -inline void os::split_reserved_memory(char *base, size_t size, +inline void os::pd_split_reserved_memory(char *base, size_t size, size_t split, bool realloc) { } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/linux/vm/perfMemory_linux.cpp --- a/src/os/linux/vm/perfMemory_linux.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/linux/vm/perfMemory_linux.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -126,7 +126,7 @@ } } } - FREE_C_HEAP_ARRAY(char, destfile); + FREE_C_HEAP_ARRAY(char, destfile, mtInternal); } @@ -153,7 +153,7 @@ const char* tmpdir = os::get_temp_directory(); const char* perfdir = PERFDATA_NAME; size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3; - char* dirname = NEW_C_HEAP_ARRAY(char, nbytes); + char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); // construct the path name to user specific tmp directory snprintf(dirname, nbytes, "%s/%s_%s", tmpdir, perfdir, user); @@ -246,7 +246,7 @@ if (bufsize == -1) bufsize = 1024; - char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize); + char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); // POSIX interface to getpwuid_r is used on LINUX struct passwd* p; @@ -278,14 +278,14 @@ "pw_name zero length"); } } - FREE_C_HEAP_ARRAY(char, pwbuf); + FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal); return NULL; } - char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1); + char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal); strcpy(user_name, p->pw_name); - FREE_C_HEAP_ARRAY(char, pwbuf); + FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal); return user_name; } @@ -328,7 +328,7 @@ // to determine the user name for the process id. // struct dirent* dentry; - char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname)); + char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal); errno = 0; while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) { @@ -338,7 +338,7 @@ } char* usrdir_name = NEW_C_HEAP_ARRAY(char, - strlen(tmpdirname) + strlen(dentry->d_name) + 2); + strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal); strcpy(usrdir_name, tmpdirname); strcat(usrdir_name, "/"); strcat(usrdir_name, dentry->d_name); @@ -346,7 +346,7 @@ DIR* subdirp = os::opendir(usrdir_name); if (subdirp == NULL) { - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); continue; } @@ -357,13 +357,13 @@ // symlink can be exploited. // if (!is_directory_secure(usrdir_name)) { - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); os::closedir(subdirp); continue; } struct dirent* udentry; - char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name)); + char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal); errno = 0; while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) { @@ -372,7 +372,7 @@ int result; char* filename = NEW_C_HEAP_ARRAY(char, - strlen(usrdir_name) + strlen(udentry->d_name) + 2); + strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal); strcpy(filename, usrdir_name); strcat(filename, "/"); @@ -381,13 +381,13 @@ // don't follow symbolic links for the file RESTARTABLE(::lstat(filename, &statbuf), result); if (result == OS_ERR) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); continue; } // skip over files that are not regular files. if (!S_ISREG(statbuf.st_mode)) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); continue; } @@ -397,23 +397,23 @@ if (statbuf.st_ctime > oldest_ctime) { char* user = strchr(dentry->d_name, '_') + 1; - if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user); - oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1); + if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal); + oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal); strcpy(oldest_user, user); oldest_ctime = statbuf.st_ctime; } } - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); } } os::closedir(subdirp); - FREE_C_HEAP_ARRAY(char, udbuf); - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, udbuf, mtInternal); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); } os::closedir(tmpdirp); - FREE_C_HEAP_ARRAY(char, tdbuf); + FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal); return(oldest_user); } @@ -434,7 +434,7 @@ // add 2 for the file separator and a null terminator. size_t nbytes = strlen(dirname) + UINT_CHARS + 2; - char* name = NEW_C_HEAP_ARRAY(char, nbytes); + char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); snprintf(name, nbytes, "%s/%d", dirname, vmid); return name; @@ -472,7 +472,7 @@ static void remove_file(const char* dirname, const char* filename) { size_t nbytes = strlen(dirname) + strlen(filename) + 2; - char* path = NEW_C_HEAP_ARRAY(char, nbytes); + char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); strcpy(path, dirname); strcat(path, "/"); @@ -480,7 +480,7 @@ remove_file(path); - FREE_C_HEAP_ARRAY(char, path); + FREE_C_HEAP_ARRAY(char, path, mtInternal); } @@ -517,7 +517,7 @@ // opendir/readdir. // struct dirent* entry; - char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname)); + char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal); errno = 0; while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) { @@ -556,7 +556,7 @@ errno = 0; } os::closedir(dirp); - FREE_C_HEAP_ARRAY(char, dbuf); + FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); } // make the user specific temporary directory. Returns true if @@ -723,11 +723,11 @@ fd = create_sharedmem_resources(dirname, filename, size); - FREE_C_HEAP_ARRAY(char, user_name); - FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, user_name, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); if (fd == -1) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); return NULL; } @@ -743,7 +743,7 @@ warning("mmap failed - %s\n", strerror(errno)); } remove_file(filename); - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); return NULL; } @@ -869,7 +869,7 @@ // store file, we don't follow them when attaching either. // if (!is_directory_secure(dirname)) { - FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Process not found"); } @@ -884,9 +884,9 @@ strcpy(rfilename, filename); // free the c heap resources that are no longer needed - if (luser != user) FREE_C_HEAP_ARRAY(char, luser); - FREE_C_HEAP_ARRAY(char, dirname); - FREE_C_HEAP_ARRAY(char, filename); + if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); // open the shared memory file for the give vmid fd = open_sharedmem_file(rfilename, file_flags, CHECK); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/posix/vm/os_posix.cpp --- a/src/os/posix/vm/os_posix.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/posix/vm/os_posix.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -23,27 +23,30 @@ */ #include "prims/jvm.h" +#include "runtime/frame.inline.hpp" #include "runtime/os.hpp" #include "utilities/vmError.hpp" #include #include +#include + // Check core dump limit and report possible place where core can be found void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) { + int n; struct rlimit rlim; - static char cwd[O_BUFLEN]; bool success; - get_current_directory(cwd, sizeof(cwd)); + n = get_core_path(buffer, bufferSize); if (getrlimit(RLIMIT_CORE, &rlim) != 0) { - jio_snprintf(buffer, bufferSize, "%s/core or core.%d (may not exist)", cwd, current_process_id()); + jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (may not exist)", current_process_id()); success = true; } else { switch(rlim.rlim_cur) { case RLIM_INFINITY: - jio_snprintf(buffer, bufferSize, "%s/core or core.%d", cwd, current_process_id()); + jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d", current_process_id()); success = true; break; case 0: @@ -51,7 +54,7 @@ success = false; break; default: - jio_snprintf(buffer, bufferSize, "%s/core or core.%d (max size %lu kB). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", cwd, current_process_id(), (unsigned long)(rlim.rlim_cur >> 10)); + jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (max size %lu kB). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", current_process_id(), (unsigned long)(rlim.rlim_cur >> 10)); success = true; break; } @@ -59,6 +62,23 @@ VMError::report_coredump_status(buffer, success); } +address os::get_caller_pc(int n) { +#ifdef _NMT_NOINLINE_ + n ++; +#endif + frame fr = os::current_frame(); + while (n > 0 && fr.pc() && + !os::is_first_C_frame(&fr) && fr.sender_pc()) { + fr = os::get_sender_for_C_frame(&fr); + n --; + } + if (n == 0) { + return fr.pc(); + } else { + return NULL; + } +} + int os::get_last_error() { return errno; } @@ -72,3 +92,59 @@ // don't do anything on posix platforms return; } + +void os::Posix::print_load_average(outputStream* st) { + st->print("load average:"); + double loadavg[3]; + os::loadavg(loadavg, 3); + st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); + st->cr(); +} + +void os::Posix::print_rlimit_info(outputStream* st) { + st->print("rlimit:"); + struct rlimit rlim; + + st->print(" STACK "); + getrlimit(RLIMIT_STACK, &rlim); + if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); + else st->print("%uk", rlim.rlim_cur >> 10); + + st->print(", CORE "); + getrlimit(RLIMIT_CORE, &rlim); + if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); + else st->print("%uk", rlim.rlim_cur >> 10); + + //Isn't there on solaris +#ifndef TARGET_OS_FAMILY_solaris + st->print(", NPROC "); + getrlimit(RLIMIT_NPROC, &rlim); + if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); + else st->print("%d", rlim.rlim_cur); +#endif + + st->print(", NOFILE "); + getrlimit(RLIMIT_NOFILE, &rlim); + if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); + else st->print("%d", rlim.rlim_cur); + + st->print(", AS "); + getrlimit(RLIMIT_AS, &rlim); + if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); + else st->print("%uk", rlim.rlim_cur >> 10); + st->cr(); +} + +void os::Posix::print_uname_info(outputStream* st) { + // kernel + st->print("uname:"); + struct utsname name; + uname(&name); + st->print(name.sysname); st->print(" "); + st->print(name.release); st->print(" "); + st->print(name.version); st->print(" "); + st->print(name.machine); + st->cr(); +} + + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/posix/vm/os_posix.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/os/posix/vm/os_posix.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,41 @@ +/* + * 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef OS_POSIX_VM_OS_POSIX_HPP +#define OS_POSIX_VM_OS_POSIX_HPP +class Posix { + friend class os; + +protected: + static void print_distro_info(outputStream* st); + static void print_rlimit_info(outputStream* st); + static void print_uname_info(outputStream* st); + static void print_libversion_info(outputStream* st); + static void print_load_average(outputStream* st); + + +}; + + +#endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/add_gnu_debuglink/add_gnu_debuglink.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/os/solaris/add_gnu_debuglink/add_gnu_debuglink.c Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * Name: add_gnu_debuglink.c + * + * Description: Add a ".gnu_debuglink" section that refers to the specified + * debug_info_path to the specified ELF object. + * + * This program is adapted from the example program shown on the + * elf(3elf) man page and from code from the Solaris compiler + * driver. + */ + +/* + * needed to define SHF_EXCLUDE + */ +#define ELF_TARGET_ALL + +#include +#include +#include +#include +#include +#include + +static void failure(void); +static unsigned int gnu_debuglink_crc32(unsigned int crc, unsigned char *buf, + size_t len); + +void +main(int argc, char ** argv) { + /* new ELF section name */ + static char SEC_NAME[] = ".gnu_debuglink"; + + unsigned char buffer[8 * 1024]; /* I/O buffer */ + int buffer_len; /* buffer length */ + char * debug_info_path; /* debug info path */ + void * ehdr; /* ELF header */ + Elf * elf; /* ELF descriptor */ + char * elf_ident; /* ELF identity string */ + char * elf_obj; /* elf_obj file */ + int fd; /* descriptor for files */ + unsigned int file_crc = 0; /* CRC for debug info file */ + int is_elfclass64; /* is an ELFCLASS64 file? */ + Elf_Data * link_dat; /* ELF data for new debug info link */ + Elf_Data * name_dat; /* ELF data for new section name */ + Elf_Scn * new_scn; /* new ELF section descriptor */ + void * new_shdr; /* new ELF section header */ + Elf_Scn * scn; /* ELF section descriptor */ + void * shdr; /* ELF section header */ + + if (argc != 3) { + (void) fprintf(stderr, "Usage: %s debug_info_path elf_obj\n", argv[0]); + exit(2); + } + + debug_info_path = argv[1]; /* save for later */ + if ((fd = open(debug_info_path, O_RDONLY)) == -1) { + (void) fprintf(stderr, "%s: cannot open file.\n", debug_info_path); + exit(3); + } + + (void) printf("Computing CRC for '%s'\n", debug_info_path); + (void) fflush(stdout); + /* compute CRC for the debug info file */ + for (;;) { + int len = read(fd, buffer, sizeof buffer); + if (len <= 0) { + break; + } + file_crc = gnu_debuglink_crc32(file_crc, buffer, len); + } + (void) close(fd); + + /* open the elf_obj */ + elf_obj = argv[2]; + if ((fd = open(elf_obj, O_RDWR)) == -1) { + (void) fprintf(stderr, "%s: cannot open file.\n", elf_obj); + exit(4); + } + + (void) printf("Opening '%s' for update\n", elf_obj); + (void) fflush(stdout); + (void) elf_version(EV_CURRENT); /* coordinate ELF versions */ + + /* obtain the ELF descriptors from the input file */ + if ((elf = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL) { + failure(); + } + + /* determine if ELFCLASS64 or not? */ + elf_ident = elf_getident(elf, NULL); + is_elfclass64 = (elf_ident[EI_CLASS] == ELFCLASS64); + + /* get the ELF header */ + if (is_elfclass64) { + ehdr = elf64_getehdr(elf); + } else { + ehdr = elf32_getehdr(elf); + } + if (ehdr == NULL) { + failure(); + } + + /* get the ELF section descriptor */ + if (is_elfclass64) { + scn = elf_getscn(elf, ((Elf64_Ehdr *) ehdr)->e_shstrndx); + } else { + scn = elf_getscn(elf, ((Elf32_Ehdr *) ehdr)->e_shstrndx); + } + if (scn == NULL) { + failure(); + } + + /* get the section header */ + if (is_elfclass64) { + shdr = elf64_getshdr(scn); + } else { + shdr = elf32_getshdr(scn); + } + if (shdr == NULL) { + failure(); + } + + (void) printf("Adding ELF data for new section name\n"); + (void) fflush(stdout); + name_dat = elf_newdata(scn); + name_dat->d_buf = (void *) SEC_NAME; + if (is_elfclass64) { + name_dat->d_off = ((Elf64_Shdr *) shdr)->sh_size + 1; + } else { + name_dat->d_off = ((Elf32_Shdr *) shdr)->sh_size + 1; + } + name_dat->d_align = 1; + name_dat->d_size = strlen(SEC_NAME) + 1; + + new_scn = elf_newscn(elf); + + if (is_elfclass64) { + new_shdr = elf64_getshdr(new_scn); + ((Elf64_Shdr *) new_shdr)->sh_flags = SHF_EXCLUDE; + ((Elf64_Shdr *) new_shdr)->sh_type = SHT_PROGBITS; + ((Elf64_Shdr *) new_shdr)->sh_name = ((Elf64_Shdr *) shdr)->sh_size; + ((Elf64_Shdr *) new_shdr)->sh_addralign = 1; + ((Elf64_Shdr *) shdr)->sh_size += (strlen(SEC_NAME) + 1); + } else { + new_shdr = elf32_getshdr(new_scn); + ((Elf32_Shdr *) new_shdr)->sh_flags = SHF_EXCLUDE; + ((Elf32_Shdr *) new_shdr)->sh_type = SHT_PROGBITS; + ((Elf32_Shdr *) new_shdr)->sh_name = ((Elf32_Shdr *) shdr)->sh_size; + ((Elf32_Shdr *) new_shdr)->sh_addralign = 1; + ((Elf32_Shdr *) shdr)->sh_size += (strlen(SEC_NAME) + 1); + } + + (void) printf("Adding ELF data for debug_info_path value\n"); + (void) fflush(stdout); + (void) memset(buffer, 0, sizeof buffer); + buffer_len = strlen(debug_info_path) + 1; /* +1 for NUL */ + (void) strncpy((char *) buffer, debug_info_path, buffer_len); + if (buffer_len % 4 != 0) { + /* not on a 4 byte boundary so pad to the next one */ + buffer_len += (4 - buffer_len % 4); + } + /* save the CRC */ + (void) memcpy(&buffer[buffer_len], &file_crc, sizeof file_crc); + buffer_len += sizeof file_crc; + + link_dat = elf_newdata(new_scn); + link_dat->d_type = ELF_T_BYTE; + link_dat->d_size = buffer_len; + link_dat->d_buf = buffer; + link_dat->d_align = 1; + + (void) printf("Saving updates to '%s'\n", elf_obj); + (void) fflush(stdout); + (void) elf_update(elf, ELF_C_NULL); /* recalc ELF memory structures */ + (void) elf_update(elf, ELF_C_WRITE); /* write out changes to ELF obj */ + (void) elf_end(elf); /* done with ELF obj */ + (void) close(fd); + + (void) printf("Done updating '%s'\n", elf_obj); + (void) fflush(stdout); + exit(0); +} /* end main */ + + +static void +failure() { + (void) fprintf(stderr, "%s\n", elf_errmsg(elf_errno())); + exit(5); +} + + +/* + * The CRC used in gnu_debuglink, retrieved from + * http://sourceware.org/gdb/current/onlinedocs/gdb/Separate-Debug-Files.html#Separate-Debug-Files. + */ + +static unsigned int +gnu_debuglink_crc32(unsigned int crc, unsigned char *buf, size_t len) { + static const unsigned int crc32_table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d + }; + + unsigned char *end; + + crc = ~crc & 0xffffffff; + for (end = buf + len; buf < end; ++buf) { + crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8); + } + return ~crc & 0xffffffff; +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/dtrace/generateJvmOffsets.cpp --- a/src/os/solaris/dtrace/generateJvmOffsets.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/dtrace/generateJvmOffsets.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -220,10 +220,10 @@ printf("\n"); GEN_OFFS(methodOopDesc, _constMethod); - GEN_OFFS(methodOopDesc, _constants); GEN_OFFS(methodOopDesc, _access_flags); printf("\n"); + GEN_OFFS(constMethodOopDesc, _constants); GEN_OFFS(constMethodOopDesc, _flags); GEN_OFFS(constMethodOopDesc, _code_size); GEN_OFFS(constMethodOopDesc, _name_index); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/dtrace/hs_private.d --- a/src/os/solaris/dtrace/hs_private.d Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/dtrace/hs_private.d Thu Aug 02 14:29:12 2012 -0700 @@ -23,7 +23,6 @@ */ provider hs_private { - probe hashtable__new_entry(void*, uintptr_t, void*); probe safepoint__begin(); probe safepoint__end(); probe cms__initmark__begin(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/dtrace/jhelper.d --- a/src/os/solaris/dtrace/jhelper.d Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/dtrace/jhelper.d Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -118,7 +118,7 @@ copyin_offset(OFFSET_Symbol_body); copyin_offset(OFFSET_methodOopDesc_constMethod); - copyin_offset(OFFSET_methodOopDesc_constants); + copyin_offset(OFFSET_constMethodOopDesc_constants); copyin_offset(OFFSET_constMethodOopDesc_name_index); copyin_offset(OFFSET_constMethodOopDesc_signature_index); @@ -359,8 +359,8 @@ this->signatureIndex = copyin_uint16(this->constMethod + OFFSET_constMethodOopDesc_signature_index); - this->constantPool = copyin_ptr(this->methodOopPtr + - OFFSET_methodOopDesc_constants); + this->constantPool = copyin_ptr(this->constMethod + + OFFSET_constMethodOopDesc_constants); this->nameSymbol = copyin_ptr(this->constantPool + this->nameIndex * sizeof (pointer) + SIZE_constantPoolOopDesc); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/dtrace/libjvm_db.c --- a/src/os/solaris/dtrace/libjvm_db.c Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/dtrace/libjvm_db.c Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -514,9 +514,9 @@ char * signatureString = NULL; int err; - err = read_pointer(J, methodOopPtr + OFFSET_methodOopDesc_constants, &constantPool); + err = read_pointer(J, methodOopPtr + OFFSET_methodOopDesc_constMethod, &constMethod); CHECK_FAIL(err); - err = read_pointer(J, methodOopPtr + OFFSET_methodOopDesc_constMethod, &constMethod); + err = read_pointer(J, constMethod + OFFSET_constMethodOopDesc_constants, &constantPool); CHECK_FAIL(err); /* To get name string */ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/fix_empty_sec_hdr_flags/fix_empty_sec_hdr_flags.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/os/solaris/fix_empty_sec_hdr_flags/fix_empty_sec_hdr_flags.c Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * Name: fix_empty_sec_hdr_flags.c + * + * Description: Remove the SHF_ALLOC flag from "empty" section headers. + * An "empty" section header has sh_addr == 0 and sh_size == 0. + * + * This program is adapted from the example program shown on the + * elf(3elf) man page and from code from the Solaris compiler + * driver. + */ + +#include +#include +#include +#include +#include +#include + +static void failure(void); + +void +main(int argc, char ** argv) { + void * ehdr; /* ELF header */ + unsigned int i; /* section counter */ + int fd; /* descriptor for file */ + Elf * elf; /* ELF descriptor */ + char * elf_ident; /* ELF identity string */ + char * elf_obj; /* elf_obj file */ + int fix_count; /* number of flags fixed */ + int is_elfclass64; /* is an ELFCLASS64 file? */ + Elf_Scn * scn; /* ELF section descriptor */ + void * shdr; /* ELF section header */ + Elf_Data * shstrtab; /* ELF section header string table */ + + if (argc != 2) { + (void) fprintf(stderr, "Usage: %s elf_obj\n", argv[0]); + exit(2); + } + + /* open the elf_obj */ + elf_obj = argv[1]; + if ((fd = open(elf_obj, O_RDWR)) == -1) { + (void) fprintf(stderr, "%s: cannot open file.\n", elf_obj); + exit(3); + } + + (void) printf("Opening '%s' for update\n", elf_obj); + (void) fflush(stdout); + (void) elf_version(EV_CURRENT); /* coordinate ELF versions */ + + /* obtain the ELF descriptors from the input file */ + if ((elf = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL) { + failure(); + } + + /* determine if ELFCLASS64 or not? */ + elf_ident = elf_getident(elf, NULL); + is_elfclass64 = (elf_ident[EI_CLASS] == ELFCLASS64); + + /* get the ELF header */ + if (is_elfclass64) { + ehdr = elf64_getehdr(elf); + } else { + ehdr = elf32_getehdr(elf); + } + if (ehdr == NULL) { + failure(); + } + + /* get the ELF section descriptor */ + if (is_elfclass64) { + scn = elf_getscn(elf, ((Elf64_Ehdr *) ehdr)->e_shstrndx); + } else { + scn = elf_getscn(elf, ((Elf32_Ehdr *) ehdr)->e_shstrndx); + } + if (scn == NULL) { + failure(); + } + + /* get the section header string table */ + shstrtab = elf_getdata(scn, NULL); + if (shstrtab == NULL) { + failure(); + } + + fix_count = 0; + + /* traverse the sections of the input file */ + for (i = 1, scn = NULL; scn = elf_nextscn(elf, scn); i++) { + int has_flag_set; /* is SHF_ALLOC flag set? */ + int is_empty; /* is section empty? */ + char * name; /* short hand pointer */ + + /* get the section header */ + if (is_elfclass64) { + shdr = elf64_getshdr(scn); + } else { + shdr = elf32_getshdr(scn); + } + if (shdr == NULL) { + failure(); + } + + if (is_elfclass64) { + name = (char *)shstrtab->d_buf + ((Elf64_Shdr *) shdr)->sh_name; + } else { + name = (char *)shstrtab->d_buf + ((Elf32_Shdr *) shdr)->sh_name; + } + + if (is_elfclass64) { + has_flag_set = ((Elf64_Shdr *) shdr)->sh_flags & SHF_ALLOC; + is_empty = ((Elf64_Shdr *) shdr)->sh_addr == 0 && + ((Elf64_Shdr *) shdr)->sh_size == 0; + } else { + has_flag_set = ((Elf32_Shdr *) shdr)->sh_flags & SHF_ALLOC; + is_empty = ((Elf32_Shdr *) shdr)->sh_addr == 0 && + ((Elf32_Shdr *) shdr)->sh_size == 0; + } + + if (is_empty && has_flag_set) { + (void) printf("section[%u] '%s' is empty, " + "but SHF_ALLOC flag is set.\n", i, name); + (void) printf("Clearing the SHF_ALLOC flag.\n"); + + if (is_elfclass64) { + ((Elf64_Shdr *) shdr)->sh_flags &= ~SHF_ALLOC; + } else { + ((Elf32_Shdr *) shdr)->sh_flags &= ~SHF_ALLOC; + } + fix_count++; + } + } /* end for each ELF section */ + + if (fix_count > 0) { + (void) printf("Saving %d updates to '%s'\n", fix_count, elf_obj); + (void) fflush(stdout); + (void) elf_update(elf, ELF_C_NULL); /* recalc ELF memory structures */ + (void) elf_update(elf, ELF_C_WRITE); /* write out changes to ELF obj */ + } else { + (void) printf("No SHF_ALLOC flags needed to be cleared.\n"); + } + + (void) elf_end(elf); /* done with ELF obj */ + (void) close(fd); + + (void) printf("Done %s '%s'\n", + (fix_count > 0) ? "updating" : "with", elf_obj); + (void) fflush(stdout); + exit(0); +} /* end main */ + + +static void +failure() { + (void) fprintf(stderr, "%s\n", elf_errmsg(elf_errno())); + exit(6); +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/vm/osThread_solaris.hpp --- a/src/os/solaris/vm/osThread_solaris.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/vm/osThread_solaris.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -26,9 +26,10 @@ #define OS_SOLARIS_VM_OSTHREAD_SOLARIS_HPP // This is embedded via include into the class OSThread + public: + typedef thread_t thread_id_t; private: - thread_t _thread_id; // Solaris thread id uint _lwp_id; // lwp ID, only used with bound threads int _native_priority; // Saved native priority when starting // a bound thread @@ -36,8 +37,6 @@ bool _vm_created_thread; // true if the VM created this thread, // false if primary thread or attached thread public: - static size_t thread_id_size() { return sizeof(thread_t); } - thread_t thread_id() const { return _thread_id; } uint lwp_id() const { return _lwp_id; } int native_priority() const { return _native_priority; } @@ -63,7 +62,6 @@ return true; } #endif - void set_thread_id(thread_t id) { _thread_id = id; } void set_lwp_id(uint id) { _lwp_id = id; } void set_native_priority(int prio) { _native_priority = prio; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/vm/os_solaris.cpp --- a/src/os/solaris/vm/os_solaris.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/vm/os_solaris.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -546,7 +546,7 @@ // Find the number of processors in the processor set. if (pset_info(pset, NULL, id_length, NULL) == 0) { // Make up an array to hold their ids. - *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length); + *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length, mtInternal); // Fill in the array with their processor ids. if (pset_info(pset, NULL, id_length, *id_array) == 0) { result = true; @@ -577,7 +577,7 @@ // Find the number of processors online. *id_length = sysconf(_SC_NPROCESSORS_ONLN); // Make up an array to hold their ids. - *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length); + *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length, mtInternal); // Processors need not be numbered consecutively. long found = 0; processorid_t next = 0; @@ -629,7 +629,7 @@ // The next id, to limit loops. const processorid_t limit_id = max_id + 1; // Make up markers for available processors. - bool* available_id = NEW_C_HEAP_ARRAY(bool, limit_id); + bool* available_id = NEW_C_HEAP_ARRAY(bool, limit_id, mtInternal); for (uint c = 0; c < limit_id; c += 1) { available_id[c] = false; } @@ -666,7 +666,7 @@ } } if (available_id != NULL) { - FREE_C_HEAP_ARRAY(bool, available_id); + FREE_C_HEAP_ARRAY(bool, available_id, mtInternal); } return true; } @@ -698,7 +698,7 @@ } } if (id_array != NULL) { - FREE_C_HEAP_ARRAY(processorid_t, id_array); + FREE_C_HEAP_ARRAY(processorid_t, id_array, mtInternal); } return result; } @@ -771,8 +771,8 @@ // code needs to be changed accordingly. // The next few definitions allow the code to be verbatim: -#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n)) -#define free(p) FREE_C_HEAP_ARRAY(char, p) +#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal) +#define free(p) FREE_C_HEAP_ARRAY(char, p, mtInternal) #define getenv(n) ::getenv(n) #define EXTENSIONS_DIR "/lib/ext" @@ -1927,11 +1927,11 @@ // release the storage for (int i = 0 ; i < n ; i++) { if (pelements[i] != NULL) { - FREE_C_HEAP_ARRAY(char, pelements[i]); + FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal); } } if (pelements != NULL) { - FREE_C_HEAP_ARRAY(char*, pelements); + FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); } } else { snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); @@ -2242,61 +2242,44 @@ return true; } +void os::print_os_info_brief(outputStream* st) { + os::Solaris::print_distro_info(st); + + os::Posix::print_uname_info(st); + + os::Solaris::print_libversion_info(st); +} + void os::print_os_info(outputStream* st) { st->print("OS:"); + os::Solaris::print_distro_info(st); + + os::Posix::print_uname_info(st); + + os::Solaris::print_libversion_info(st); + + os::Posix::print_rlimit_info(st); + + os::Posix::print_load_average(st); +} + +void os::Solaris::print_distro_info(outputStream* st) { if (!_print_ascii_file("/etc/release", st)) { - st->print("Solaris"); + st->print("Solaris"); + } + st->cr(); +} + +void os::Solaris::print_libversion_info(outputStream* st) { + if (os::Solaris::T2_libthread()) { + st->print(" (T2 libthread)"); + } + else { + st->print(" (T1 libthread)"); } st->cr(); - - // kernel - st->print("uname:"); - struct utsname name; - uname(&name); - st->print(name.sysname); st->print(" "); - st->print(name.release); st->print(" "); - st->print(name.version); st->print(" "); - st->print(name.machine); - - // libthread - if (os::Solaris::T2_libthread()) st->print(" (T2 libthread)"); - else st->print(" (T1 libthread)"); - st->cr(); - - // rlimit - st->print("rlimit:"); - struct rlimit rlim; - - st->print(" STACK "); - getrlimit(RLIMIT_STACK, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - - st->print(", CORE "); - getrlimit(RLIMIT_CORE, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - - st->print(", NOFILE "); - getrlimit(RLIMIT_NOFILE, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%d", rlim.rlim_cur); - - st->print(", AS "); - getrlimit(RLIMIT_AS, &rlim); - if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); - else st->print("%uk", rlim.rlim_cur >> 10); - st->cr(); - - // load average - st->print("load average:"); - double loadavg[3]; - os::loadavg(loadavg, 3); - st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); - st->cr(); -} - +} static bool check_addr0(outputStream* st) { jboolean status = false; @@ -2679,17 +2662,17 @@ // pending_signals has one int per signal // The additional signal is for SIGEXIT - exit signal to signal_thread - pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1)); + pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1), mtInternal); memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1))); if (UseSignalChaining) { chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction) - * (Maxsignum + 1)); + * (Maxsignum + 1), mtInternal); memset(chainedsigactions, 0, (sizeof(struct sigaction) * (Maxsignum + 1))); - preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1)); + preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1), mtInternal); memset(preinstalled_sigs, 0, (sizeof(int) * (Maxsignum + 1))); } - ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 )); + ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 ), mtInternal); memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1)); } @@ -2777,7 +2760,7 @@ return page_size; } -bool os::commit_memory(char* addr, size_t bytes, bool exec) { +bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) { int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; size_t size = bytes; char *res = Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, prot); @@ -2790,7 +2773,7 @@ return false; } -bool os::commit_memory(char* addr, size_t bytes, size_t alignment_hint, +bool os::pd_commit_memory(char* addr, size_t bytes, size_t alignment_hint, bool exec) { if (commit_memory(addr, bytes, exec)) { if (UseMPSS && alignment_hint > (size_t)vm_page_size()) { @@ -2820,14 +2803,14 @@ } // Uncommit the pages in a specified region. -void os::free_memory(char* addr, size_t bytes, size_t alignment_hint) { +void os::pd_free_memory(char* addr, size_t bytes, size_t alignment_hint) { if (madvise(addr, bytes, MADV_FREE) < 0) { debug_only(warning("MADV_FREE failed.")); return; } } -bool os::create_stack_guard_pages(char* addr, size_t size) { +bool os::pd_create_stack_guard_pages(char* addr, size_t size) { return os::commit_memory(addr, size); } @@ -2836,7 +2819,7 @@ } // Change the page size in a given range. -void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { +void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { assert((intptr_t)addr % alignment_hint == 0, "Address should be aligned."); assert((intptr_t)(addr + bytes) % alignment_hint == 0, "End should be aligned."); if (UseLargePages && UseMPSS) { @@ -3023,7 +3006,7 @@ return end; } -bool os::uncommit_memory(char* addr, size_t bytes) { +bool os::pd_uncommit_memory(char* addr, size_t bytes) { size_t size = bytes; // Map uncommitted pages PROT_NONE so we fail early if we touch an // uncommitted page. Otherwise, the read/write might succeed if we @@ -3062,7 +3045,7 @@ return mmap_chunk(addr, bytes, flags, PROT_NONE); } -char* os::reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { +char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint, (requested_addr != NULL)); guarantee(requested_addr == NULL || requested_addr == addr, @@ -3073,7 +3056,7 @@ // Reserve memory at an arbitrary address, only if that area is // available (and not reserved for something else). -char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) { +char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { const int max_tries = 10; char* base[max_tries]; size_t size[max_tries]; @@ -3195,7 +3178,7 @@ return (i < max_tries) ? requested_addr : NULL; } -bool os::release_memory(char* addr, size_t bytes) { +bool os::pd_release_memory(char* addr, size_t bytes) { size_t size = bytes; return munmap(addr, size) == 0; } @@ -4809,7 +4792,7 @@ lwpSize = 16*1024; for (;;) { ::lseek64 (lwpFile, 0, SEEK_SET); - lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize); + lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize, mtInternal); if (::read(lwpFile, lwpArray, lwpSize) < 0) { if (ThreadPriorityVerbose) warning("Error reading /proc/self/lstatus\n"); break; @@ -4827,10 +4810,10 @@ break; } lwpSize = lwpArray->pr_nent * lwpArray->pr_entsize; - FREE_C_HEAP_ARRAY(char, lwpArray); // retry. - } - - FREE_C_HEAP_ARRAY(char, lwpArray); + FREE_C_HEAP_ARRAY(char, lwpArray, mtInternal); // retry. + } + + FREE_C_HEAP_ARRAY(char, lwpArray, mtInternal); ::close (lwpFile); if (ThreadPriorityVerbose) { if (isT2) tty->print_cr("We are running with a T2 libthread\n"); @@ -5154,9 +5137,9 @@ UseNUMA = false; } else { size_t lgrp_limit = os::numa_get_groups_num(); - int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit); + int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtInternal); size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit); - FREE_C_HEAP_ARRAY(int, lgrp_ids); + FREE_C_HEAP_ARRAY(int, lgrp_ids, mtInternal); if (lgrp_num < 2) { // There's only one locality group, disable NUMA. UseNUMA = false; @@ -5502,7 +5485,7 @@ } // Map a block of memory. -char* os::map_memory(int fd, const char* file_name, size_t file_offset, +char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { int prot; @@ -5534,7 +5517,7 @@ // Remap a block of memory. -char* os::remap_memory(int fd, const char* file_name, size_t file_offset, +char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { // same as map_memory() on this OS @@ -5544,7 +5527,7 @@ // Unmap a block of memory. -bool os::unmap_memory(char* addr, size_t bytes) { +bool os::pd_unmap_memory(char* addr, size_t bytes) { return munmap(addr, bytes) == 0; } @@ -6554,3 +6537,16 @@ INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\ os::Solaris::clear_interrupted); } + +// Get the default path to the core file +// Returns the length of the string +int os::get_core_path(char* buffer, size_t bufferSize) { + const char* p = get_current_directory(buffer, bufferSize); + + if (p == NULL) { + assert(p != NULL, "failed to get current directory"); + return 0; + } + + return strlen(buffer); +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/vm/os_solaris.hpp --- a/src/os/solaris/vm/os_solaris.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/vm/os_solaris.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -180,6 +180,9 @@ // proc_t structure (note that this is a system struct). static address _main_stack_base; + static void print_distro_info(outputStream* st); + static void print_libversion_info(outputStream* st); + public: static void libthread_init(); static void synchronization_init(); @@ -343,7 +346,7 @@ }; -class PlatformEvent : public CHeapObj { +class PlatformEvent : public CHeapObj { private: double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line volatile int _Event ; @@ -380,7 +383,7 @@ void unpark () ; } ; -class PlatformParker : public CHeapObj { +class PlatformParker : public CHeapObj { protected: mutex_t _mutex [1] ; cond_t _cond [1] ; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/vm/os_solaris.inline.hpp --- a/src/os/solaris/vm/os_solaris.inline.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/vm/os_solaris.inline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -71,7 +71,7 @@ // On Solaris, reservations are made on a page by page basis, nothing to do. -inline void os::split_reserved_memory(char *base, size_t size, +inline void os::pd_split_reserved_memory(char *base, size_t size, size_t split, bool realloc) { } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/solaris/vm/perfMemory_solaris.cpp --- a/src/os/solaris/vm/perfMemory_solaris.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/solaris/vm/perfMemory_solaris.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -128,7 +128,7 @@ } } } - FREE_C_HEAP_ARRAY(char, destfile); + FREE_C_HEAP_ARRAY(char, destfile, mtInternal); } @@ -155,7 +155,7 @@ const char* tmpdir = os::get_temp_directory(); const char* perfdir = PERFDATA_NAME; size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3; - char* dirname = NEW_C_HEAP_ARRAY(char, nbytes); + char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); // construct the path name to user specific tmp directory snprintf(dirname, nbytes, "%s/%s_%s", tmpdir, perfdir, user); @@ -248,7 +248,7 @@ if (bufsize == -1) bufsize = 1024; - char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize); + char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); #ifdef _GNU_SOURCE struct passwd* p = NULL; @@ -269,14 +269,14 @@ "pw_name zero length"); } } - FREE_C_HEAP_ARRAY(char, pwbuf); + FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal); return NULL; } - char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1); + char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal); strcpy(user_name, p->pw_name); - FREE_C_HEAP_ARRAY(char, pwbuf); + FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal); return user_name; } @@ -319,7 +319,7 @@ // to determine the user name for the process id. // struct dirent* dentry; - char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname)); + char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal); errno = 0; while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) { @@ -329,7 +329,7 @@ } char* usrdir_name = NEW_C_HEAP_ARRAY(char, - strlen(tmpdirname) + strlen(dentry->d_name) + 2); + strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal); strcpy(usrdir_name, tmpdirname); strcat(usrdir_name, "/"); strcat(usrdir_name, dentry->d_name); @@ -337,7 +337,7 @@ DIR* subdirp = os::opendir(usrdir_name); if (subdirp == NULL) { - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); continue; } @@ -348,13 +348,13 @@ // symlink can be exploited. // if (!is_directory_secure(usrdir_name)) { - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); os::closedir(subdirp); continue; } struct dirent* udentry; - char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name)); + char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal); errno = 0; while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) { @@ -363,7 +363,7 @@ int result; char* filename = NEW_C_HEAP_ARRAY(char, - strlen(usrdir_name) + strlen(udentry->d_name) + 2); + strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal); strcpy(filename, usrdir_name); strcat(filename, "/"); @@ -372,13 +372,13 @@ // don't follow symbolic links for the file RESTARTABLE(::lstat(filename, &statbuf), result); if (result == OS_ERR) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); continue; } // skip over files that are not regular files. if (!S_ISREG(statbuf.st_mode)) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); continue; } @@ -388,23 +388,23 @@ if (statbuf.st_ctime > oldest_ctime) { char* user = strchr(dentry->d_name, '_') + 1; - if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user); - oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1); + if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal); + oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal); strcpy(oldest_user, user); oldest_ctime = statbuf.st_ctime; } } - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); } } os::closedir(subdirp); - FREE_C_HEAP_ARRAY(char, udbuf); - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, udbuf, mtInternal); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); } os::closedir(tmpdirp); - FREE_C_HEAP_ARRAY(char, tdbuf); + FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal); return(oldest_user); } @@ -471,7 +471,7 @@ // add 2 for the file separator and a NULL terminator. size_t nbytes = strlen(dirname) + UINT_CHARS + 2; - char* name = NEW_C_HEAP_ARRAY(char, nbytes); + char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); snprintf(name, nbytes, "%s/%d", dirname, vmid); return name; @@ -509,7 +509,7 @@ static void remove_file(const char* dirname, const char* filename) { size_t nbytes = strlen(dirname) + strlen(filename) + 2; - char* path = NEW_C_HEAP_ARRAY(char, nbytes); + char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); strcpy(path, dirname); strcat(path, "/"); @@ -517,7 +517,7 @@ remove_file(path); - FREE_C_HEAP_ARRAY(char, path); + FREE_C_HEAP_ARRAY(char, path, mtInternal); } @@ -554,7 +554,7 @@ // opendir/readdir. // struct dirent* entry; - char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname)); + char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal); errno = 0; while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) { @@ -593,7 +593,7 @@ errno = 0; } os::closedir(dirp); - FREE_C_HEAP_ARRAY(char, dbuf); + FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); } // make the user specific temporary directory. Returns true if @@ -738,11 +738,11 @@ fd = create_sharedmem_resources(dirname, filename, size); - FREE_C_HEAP_ARRAY(char, user_name); - FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, user_name, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); if (fd == -1) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); return NULL; } @@ -758,7 +758,7 @@ warning("mmap failed - %s\n", strerror(errno)); } remove_file(filename); - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); return NULL; } @@ -884,7 +884,7 @@ // store file, we don't follow them when attaching either. // if (!is_directory_secure(dirname)) { - FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Process not found"); } @@ -899,9 +899,9 @@ strcpy(rfilename, filename); // free the c heap resources that are no longer needed - if (luser != user) FREE_C_HEAP_ARRAY(char, luser); - FREE_C_HEAP_ARRAY(char, dirname); - FREE_C_HEAP_ARRAY(char, filename); + if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); // open the shared memory file for the give vmid fd = open_sharedmem_file(rfilename, file_flags, CHECK); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/windows/vm/osThread_windows.hpp --- a/src/os/windows/vm/osThread_windows.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/windows/vm/osThread_windows.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -25,12 +25,13 @@ #ifndef OS_WINDOWS_VM_OSTHREAD_WINDOWS_HPP #define OS_WINDOWS_VM_OSTHREAD_WINDOWS_HPP -typedef void* HANDLE; + typedef void* HANDLE; + public: + typedef unsigned long thread_id_t; private: // Win32-specific thread information HANDLE _thread_handle; // Win32 thread handle - unsigned long _thread_id; // Win32 thread id HANDLE _interrupt_event; // Event signalled on thread interrupt ThreadState _last_state; @@ -42,9 +43,6 @@ HANDLE interrupt_event() const { return _interrupt_event; } void set_interrupt_event(HANDLE interrupt_event) { _interrupt_event = interrupt_event; } - - static size_t thread_id_size() { return sizeof(unsigned long); } - unsigned long thread_id() const { return _thread_id; } #ifndef PRODUCT // Used for debugging, return a unique integer for each thread. int thread_identifier() const { return _thread_id; } @@ -56,8 +54,6 @@ return false; } #endif // ASSERT - void set_thread_id(unsigned long thread_id) { _thread_id = thread_id; } - bool is_try_mutex_enter() { return false; } // This is a temporary fix for the thread states during diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/windows/vm/os_windows.cpp --- a/src/os/windows/vm/os_windows.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/windows/vm/os_windows.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -96,7 +96,6 @@ #include #include // For _beginthreadex(), _endthreadex() #include // For os::dll_address_to_function_name - /* for enumerating dll libraries */ #include @@ -214,13 +213,13 @@ } } - home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1); + home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal); if (home_path == NULL) return; strcpy(home_path, home_dir); Arguments::set_java_home(home_path); - dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1); + dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1, mtInternal); if (dll_path == NULL) return; strcpy(dll_path, home_dir); @@ -251,7 +250,7 @@ char *path_str = ::getenv("PATH"); library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) + - sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10); + sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal); library_path[0] = '\0'; @@ -280,7 +279,7 @@ strcat(library_path, ";."); Arguments::set_library_path(library_path); - FREE_C_HEAP_ARRAY(char, library_path); + FREE_C_HEAP_ARRAY(char, library_path, mtInternal); } /* Default extensions directory */ @@ -300,7 +299,7 @@ { #define ENDORSED_DIR "\\lib\\endorsed" size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR); - char * buf = NEW_C_HEAP_ARRAY(char, len); + char * buf = NEW_C_HEAP_ARRAY(char, len, mtInternal); sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR); Arguments::set_endorsed_dirs(buf); #undef ENDORSED_DIR @@ -324,6 +323,23 @@ os::breakpoint(); } +/* + * RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP. + * So far, this method is only used by Native Memory Tracking, which is + * only supported on Windows XP or later. + */ +address os::get_caller_pc(int n) { +#ifdef _NMT_NOINLINE_ + n ++; +#endif + address pc; + if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) { + return pc; + } + return NULL; +} + + // os::current_stack_base() // // Returns the base of the stack, which is the stack's @@ -1014,7 +1030,7 @@ os::opendir(const char *dirname) { assert(dirname != NULL, "just checking"); // hotspot change - DIR *dirp = (DIR *)malloc(sizeof(DIR)); + DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal); DWORD fattr; // hotspot change char alt_dirname[4] = { 0, 0, 0, 0 }; @@ -1036,9 +1052,9 @@ dirname = alt_dirname; } - dirp->path = (char *)malloc(strlen(dirname) + 5); + dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal); if (dirp->path == 0) { - free(dirp); + free(dirp, mtInternal); errno = ENOMEM; return 0; } @@ -1046,13 +1062,13 @@ fattr = GetFileAttributes(dirp->path); if (fattr == 0xffffffff) { - free(dirp->path); - free(dirp); + free(dirp->path, mtInternal); + free(dirp, mtInternal); errno = ENOENT; return 0; } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) { - free(dirp->path); - free(dirp); + free(dirp->path, mtInternal); + free(dirp, mtInternal); errno = ENOTDIR; return 0; } @@ -1070,8 +1086,8 @@ dirp->handle = FindFirstFile(dirp->path, &dirp->find_data); if (dirp->handle == INVALID_HANDLE_VALUE) { if (GetLastError() != ERROR_FILE_NOT_FOUND) { - free(dirp->path); - free(dirp); + free(dirp->path, mtInternal); + free(dirp, mtInternal); errno = EACCES; return 0; } @@ -1114,8 +1130,8 @@ } dirp->handle = INVALID_HANDLE_VALUE; } - free(dirp->path); - free(dirp); + free(dirp->path, mtInternal); + free(dirp, mtInternal); return 0; } @@ -1176,11 +1192,11 @@ // release the storage for (int i = 0 ; i < n ; i++) { if (pelements[i] != NULL) { - FREE_C_HEAP_ARRAY(char, pelements[i]); + FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal); } } if (pelements != NULL) { - FREE_C_HEAP_ARRAY(char*, pelements); + FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); } } else { jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname); @@ -1562,9 +1578,17 @@ enumerate_modules(pid, _print_module, (void *)st); } +void os::print_os_info_brief(outputStream* st) { + os::print_os_info(st); +} + void os::print_os_info(outputStream* st) { st->print("OS:"); + os::win32::print_windows_version(st); +} + +void os::win32::print_windows_version(outputStream* st) { OSVERSIONINFOEX osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); @@ -1583,7 +1607,8 @@ case 5001: st->print(" Windows XP"); break; case 5002: case 6000: - case 6001: { + case 6001: + case 6002: { // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could // find out whether we are running on 64 bit processor or not. SYSTEM_INFO si; @@ -1615,6 +1640,14 @@ } if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) st->print(" , 64 bit"); + } else if (os_vers == 6002) { + if (osvi.wProductType == VER_NT_WORKSTATION) { + st->print(" Windows 8"); + } else { + st->print(" Windows Server 2012"); + } + if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) + st->print(" , 64 bit"); } else { // future os // Unrecognized windows, print out its major and minor versions st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); @@ -2620,7 +2653,7 @@ void free_node_list() { if (_numa_used_node_list != NULL) { - FREE_C_HEAP_ARRAY(int, _numa_used_node_list); + FREE_C_HEAP_ARRAY(int, _numa_used_node_list, mtInternal); } } @@ -2642,7 +2675,7 @@ ULONG highest_node_number; if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false; free_node_list(); - _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1); + _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1, mtInternal); for (unsigned int i = 0; i <= highest_node_number; i++) { ULONGLONG proc_mask_numa_node; if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false; @@ -2901,7 +2934,7 @@ // On win32, one cannot release just a part of reserved memory, it's an // all or nothing deal. When we split a reservation, we must break the // reservation into two reservations. -void os::split_reserved_memory(char *base, size_t size, size_t split, +void os::pd_split_reserved_memory(char *base, size_t size, size_t split, bool realloc) { if (size > 0) { release_memory(base, size); @@ -2914,7 +2947,7 @@ } } -char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { +char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { assert((size_t)addr % os::vm_allocation_granularity() == 0, "reserve alignment"); assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size"); @@ -2947,7 +2980,7 @@ // Reserve memory at an arbitrary address, only if that area is // available (and not reserved for something else). -char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) { +char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { // Windows os::reserve_memory() fails of the requested address range is // not avilable. return reserve_memory(bytes, requested_addr); @@ -3010,7 +3043,7 @@ void os::print_statistics() { } -bool os::commit_memory(char* addr, size_t bytes, bool exec) { +bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) { if (bytes == 0) { // Don't bother the OS with noops. return true; @@ -3058,26 +3091,26 @@ return true; } -bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, +bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) { return commit_memory(addr, size, exec); } -bool os::uncommit_memory(char* addr, size_t bytes) { +bool os::pd_uncommit_memory(char* addr, size_t bytes) { if (bytes == 0) { // Don't bother the OS with noops. return true; } assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries"); assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks"); - return VirtualFree(addr, bytes, MEM_DECOMMIT) != 0; -} - -bool os::release_memory(char* addr, size_t bytes) { + return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0); +} + +bool os::pd_release_memory(char* addr, size_t bytes) { return VirtualFree(addr, 0, MEM_RELEASE) != 0; } -bool os::create_stack_guard_pages(char* addr, size_t size) { +bool os::pd_create_stack_guard_pages(char* addr, size_t size) { return os::commit_memory(addr, size); } @@ -3124,8 +3157,8 @@ return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0; } -void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } -void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) { } +void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } +void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { } void os::numa_make_global(char *addr, size_t bytes) { } void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { } bool os::numa_topology_changed() { return false; } @@ -4259,14 +4292,14 @@ numEvents = MAX_INPUT_EVENTS; } - lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD)); + lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal); if (lpBuffer == NULL) { return FALSE; } error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead); if (error == 0) { - os::free(lpBuffer); + os::free(lpBuffer, mtInternal); return FALSE; } @@ -4287,7 +4320,7 @@ } if(lpBuffer != NULL) { - os::free(lpBuffer); + os::free(lpBuffer, mtInternal); } *pbytes = (long) actualLength; @@ -4295,7 +4328,7 @@ } // Map a block of memory. -char* os::map_memory(int fd, const char* file_name, size_t file_offset, +char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { HANDLE hFile; @@ -4415,7 +4448,7 @@ // Remap a block of memory. -char* os::remap_memory(int fd, const char* file_name, size_t file_offset, +char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { // This OS does not allow existing memory maps to be remapped so we @@ -4428,15 +4461,15 @@ // call above and the map_memory() call below where a thread in native // code may be able to access an address that is no longer mapped. - return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only, - allow_exec); + return os::map_memory(fd, file_name, file_offset, addr, bytes, + read_only, allow_exec); } // Unmap a block of memory. // Returns true=success, otherwise false. -bool os::unmap_memory(char* addr, size_t bytes) { +bool os::pd_unmap_memory(char* addr, size_t bytes) { BOOL result = UnmapViewOfFile(addr); if (result == 0) { if (PrintMiscellaneous && Verbose) { @@ -4914,11 +4947,15 @@ typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD); typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG); typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG); +typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG); GetLargePageMinimum_Fn os::Kernel32Dll::_GetLargePageMinimum = NULL; VirtualAllocExNuma_Fn os::Kernel32Dll::_VirtualAllocExNuma = NULL; GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL; GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL; +RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL; + + BOOL os::Kernel32Dll::initialized = FALSE; SIZE_T os::Kernel32Dll::GetLargePageMinimum() { assert(initialized && _GetLargePageMinimum != NULL, @@ -4961,6 +4998,19 @@ return _GetNumaNodeProcessorMask(node, proc_mask); } +USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip, + ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) { + if (!initialized) { + initialize(); + } + + if (_RtlCaptureStackBackTrace != NULL) { + return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture, + BackTrace, BackTraceHash); + } else { + return 0; + } +} void os::Kernel32Dll::initializeCommon() { if (!initialized) { @@ -4970,6 +5020,7 @@ _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma"); _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber"); _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask"); + _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace"); initialized = TRUE; } } @@ -5084,7 +5135,6 @@ Module32Next_Fn os::Kernel32Dll::_Module32Next = NULL; GetNativeSystemInfo_Fn os::Kernel32Dll::_GetNativeSystemInfo = NULL; - void os::Kernel32Dll::initialize() { if (!initialized) { HMODULE handle = ::GetModuleHandle("Kernel32.dll"); @@ -5162,8 +5212,6 @@ _GetNativeSystemInfo(lpSystemInfo); } - - // PSAPI API diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/windows/vm/os_windows.hpp --- a/src/os/windows/vm/os_windows.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/windows/vm/os_windows.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -27,6 +27,7 @@ // Win32_OS defines the interface to windows operating systems class win32 { + friend class os; protected: static int _vm_page_size; @@ -39,6 +40,8 @@ static bool _is_windows_2003; static bool _is_windows_server; + static void print_windows_version(outputStream* st); + public: // Windows-specific interface: static void initialize_system_info(); @@ -95,7 +98,7 @@ static LONG WINAPI serialize_fault_filter(struct _EXCEPTION_POINTERS* e); }; -class PlatformEvent : public CHeapObj { +class PlatformEvent : public CHeapObj { private: double CachePad [4] ; // increase odds that _Event is sole occupant of cache line volatile int _Event ; @@ -121,7 +124,7 @@ -class PlatformParker : public CHeapObj { +class PlatformParker : public CHeapObj { protected: HANDLE _ParkEvent ; @@ -179,6 +182,9 @@ static BOOL GetNumaHighestNodeNumber(PULONG); static BOOL GetNumaNodeProcessorMask(UCHAR, PULONGLONG); + // Stack walking + static USHORT RtlCaptureStackBackTrace(ULONG, ULONG, PVOID*, PULONG); + private: // GetLargePageMinimum available on Windows Vista/Windows Server 2003 // and later @@ -188,6 +194,7 @@ static LPVOID (WINAPI *_VirtualAllocExNuma) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD); static BOOL (WINAPI *_GetNumaHighestNodeNumber) (PULONG); static BOOL (WINAPI *_GetNumaNodeProcessorMask) (UCHAR, PULONGLONG); + static USHORT (WINAPI *_RtlCaptureStackBackTrace)(ULONG, ULONG, PVOID*, PULONG); static BOOL initialized; static void initialize(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os/windows/vm/perfMemory_windows.cpp --- a/src/os/windows/vm/perfMemory_windows.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os/windows/vm/perfMemory_windows.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -120,7 +120,7 @@ } } - FREE_C_HEAP_ARRAY(char, destfile); + FREE_C_HEAP_ARRAY(char, destfile, mtInternal); } // Shared Memory Implementation Details @@ -157,7 +157,7 @@ const char* tmpdir = os::get_temp_directory(); const char* perfdir = PERFDATA_NAME; size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3; - char* dirname = NEW_C_HEAP_ARRAY(char, nbytes); + char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); // construct the path name to user specific tmp directory _snprintf(dirname, nbytes, "%s\\%s_%s", tmpdir, perfdir, user); @@ -281,7 +281,7 @@ } } - char* user_name = NEW_C_HEAP_ARRAY(char, strlen(user)+1); + char* user_name = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal); strcpy(user_name, user); return user_name; @@ -315,7 +315,7 @@ // to determine the user name for the process id. // struct dirent* dentry; - char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname)); + char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal); errno = 0; while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) { @@ -325,7 +325,7 @@ } char* usrdir_name = NEW_C_HEAP_ARRAY(char, - strlen(tmpdirname) + strlen(dentry->d_name) + 2); + strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal); strcpy(usrdir_name, tmpdirname); strcat(usrdir_name, "\\"); strcat(usrdir_name, dentry->d_name); @@ -333,7 +333,7 @@ DIR* subdirp = os::opendir(usrdir_name); if (subdirp == NULL) { - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); continue; } @@ -344,13 +344,13 @@ // symlink can be exploited. // if (!is_directory_secure(usrdir_name)) { - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); os::closedir(subdirp); continue; } struct dirent* udentry; - char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name)); + char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal); errno = 0; while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) { @@ -358,20 +358,20 @@ struct stat statbuf; char* filename = NEW_C_HEAP_ARRAY(char, - strlen(usrdir_name) + strlen(udentry->d_name) + 2); + strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal); strcpy(filename, usrdir_name); strcat(filename, "\\"); strcat(filename, udentry->d_name); if (::stat(filename, &statbuf) == OS_ERR) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); continue; } // skip over files that are not regular files. if ((statbuf.st_mode & S_IFMT) != S_IFREG) { - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); continue; } @@ -393,22 +393,22 @@ if (statbuf.st_ctime > latest_ctime) { char* user = strchr(dentry->d_name, '_') + 1; - if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user); - latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1); + if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user, mtInternal); + latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal); strcpy(latest_user, user); latest_ctime = statbuf.st_ctime; } - FREE_C_HEAP_ARRAY(char, filename); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); } } os::closedir(subdirp); - FREE_C_HEAP_ARRAY(char, udbuf); - FREE_C_HEAP_ARRAY(char, usrdir_name); + FREE_C_HEAP_ARRAY(char, udbuf, mtInternal); + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); } os::closedir(tmpdirp); - FREE_C_HEAP_ARRAY(char, tdbuf); + FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal); return(latest_user); } @@ -453,7 +453,7 @@ // about a name containing a '-' characters. // nbytes += UINT_CHARS; - char* name = NEW_C_HEAP_ARRAY(char, nbytes); + char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); _snprintf(name, nbytes, "%s_%s_%u", PERFDATA_NAME, user, vmid); return name; @@ -469,7 +469,7 @@ // add 2 for the file separator and a null terminator. size_t nbytes = strlen(dirname) + UINT_CHARS + 2; - char* name = NEW_C_HEAP_ARRAY(char, nbytes); + char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); _snprintf(name, nbytes, "%s\\%d", dirname, vmid); return name; @@ -485,7 +485,7 @@ static void remove_file(const char* dirname, const char* filename) { size_t nbytes = strlen(dirname) + strlen(filename) + 2; - char* path = NEW_C_HEAP_ARRAY(char, nbytes); + char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); strcpy(path, dirname); strcat(path, "\\"); @@ -500,7 +500,7 @@ } } - FREE_C_HEAP_ARRAY(char, path); + FREE_C_HEAP_ARRAY(char, path, mtInternal); } // returns true if the process represented by pid is alive, otherwise @@ -638,7 +638,7 @@ // opendir/readdir. // struct dirent* entry; - char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname)); + char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal); errno = 0; while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) { @@ -681,7 +681,7 @@ errno = 0; } os::closedir(dirp); - FREE_C_HEAP_ARRAY(char, dbuf); + FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); } // create a file mapping object with the requested name, and size @@ -747,11 +747,11 @@ // be an ACL we enlisted. free the resources. // if (success && exists && pACL != NULL && !isdefault) { - FREE_C_HEAP_ARRAY(char, pACL); + FREE_C_HEAP_ARRAY(char, pACL, mtInternal); } // free the security descriptor - FREE_C_HEAP_ARRAY(char, pSD); + FREE_C_HEAP_ARRAY(char, pSD, mtInternal); } } @@ -766,7 +766,7 @@ lpSA->lpSecurityDescriptor = NULL; // free the security attributes structure - FREE_C_HEAP_ARRAY(char, lpSA); + FREE_C_HEAP_ARRAY(char, lpSA, mtInternal); } } @@ -805,7 +805,7 @@ } } - token_buf = (PTOKEN_USER) NEW_C_HEAP_ARRAY(char, rsize); + token_buf = (PTOKEN_USER) NEW_C_HEAP_ARRAY(char, rsize, mtInternal); // get the user token information if (!GetTokenInformation(hAccessToken, TokenUser, token_buf, rsize, &rsize)) { @@ -813,28 +813,28 @@ warning("GetTokenInformation failure: lasterror = %d," " rsize = %d\n", GetLastError(), rsize); } - FREE_C_HEAP_ARRAY(char, token_buf); + FREE_C_HEAP_ARRAY(char, token_buf, mtInternal); CloseHandle(hAccessToken); return NULL; } DWORD nbytes = GetLengthSid(token_buf->User.Sid); - PSID pSID = NEW_C_HEAP_ARRAY(char, nbytes); + PSID pSID = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); if (!CopySid(nbytes, pSID, token_buf->User.Sid)) { if (PrintMiscellaneous && Verbose) { warning("GetTokenInformation failure: lasterror = %d," " rsize = %d\n", GetLastError(), rsize); } - FREE_C_HEAP_ARRAY(char, token_buf); - FREE_C_HEAP_ARRAY(char, pSID); + FREE_C_HEAP_ARRAY(char, token_buf, mtInternal); + FREE_C_HEAP_ARRAY(char, pSID, mtInternal); CloseHandle(hAccessToken); return NULL; } // close the access token. CloseHandle(hAccessToken); - FREE_C_HEAP_ARRAY(char, token_buf); + FREE_C_HEAP_ARRAY(char, token_buf, mtInternal); return pSID; } @@ -912,13 +912,13 @@ } // create the new ACL - newACL = (PACL) NEW_C_HEAP_ARRAY(char, newACLsize); + newACL = (PACL) NEW_C_HEAP_ARRAY(char, newACLsize, mtInternal); if (!InitializeAcl(newACL, newACLsize, ACL_REVISION)) { if (PrintMiscellaneous && Verbose) { warning("InitializeAcl failure: lasterror = %d \n", GetLastError()); } - FREE_C_HEAP_ARRAY(char, newACL); + FREE_C_HEAP_ARRAY(char, newACL, mtInternal); return false; } @@ -931,7 +931,7 @@ if (PrintMiscellaneous && Verbose) { warning("InitializeAcl failure: lasterror = %d \n", GetLastError()); } - FREE_C_HEAP_ARRAY(char, newACL); + FREE_C_HEAP_ARRAY(char, newACL, mtInternal); return false; } if (((ACCESS_ALLOWED_ACE *)ace)->Header.AceFlags && INHERITED_ACE) { @@ -958,7 +958,7 @@ if (PrintMiscellaneous && Verbose) { warning("AddAce failure: lasterror = %d \n", GetLastError()); } - FREE_C_HEAP_ARRAY(char, newACL); + FREE_C_HEAP_ARRAY(char, newACL, mtInternal); return false; } } @@ -974,7 +974,7 @@ warning("AddAccessAllowedAce failure: lasterror = %d \n", GetLastError()); } - FREE_C_HEAP_ARRAY(char, newACL); + FREE_C_HEAP_ARRAY(char, newACL, mtInternal); return false; } } @@ -989,7 +989,7 @@ if (PrintMiscellaneous && Verbose) { warning("InitializeAcl failure: lasterror = %d \n", GetLastError()); } - FREE_C_HEAP_ARRAY(char, newACL); + FREE_C_HEAP_ARRAY(char, newACL, mtInternal); return false; } if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace, @@ -997,7 +997,7 @@ if (PrintMiscellaneous && Verbose) { warning("AddAce failure: lasterror = %d \n", GetLastError()); } - FREE_C_HEAP_ARRAY(char, newACL); + FREE_C_HEAP_ARRAY(char, newACL, mtInternal); return false; } ace_index++; @@ -1010,7 +1010,7 @@ warning("SetSecurityDescriptorDacl failure:" " lasterror = %d \n", GetLastError()); } - FREE_C_HEAP_ARRAY(char, newACL); + FREE_C_HEAP_ARRAY(char, newACL, mtInternal); return false; } @@ -1030,7 +1030,7 @@ warning("SetSecurityDescriptorControl failure:" " lasterror = %d \n", GetLastError()); } - FREE_C_HEAP_ARRAY(char, newACL); + FREE_C_HEAP_ARRAY(char, newACL, mtInternal); return false; } } @@ -1054,7 +1054,7 @@ // allocate space for a security descriptor PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR) - NEW_C_HEAP_ARRAY(char, SECURITY_DESCRIPTOR_MIN_LENGTH); + NEW_C_HEAP_ARRAY(char, SECURITY_DESCRIPTOR_MIN_LENGTH, mtInternal); // initialize the security descriptor if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) { @@ -1076,7 +1076,7 @@ // return it to the caller. // LPSECURITY_ATTRIBUTES lpSA = (LPSECURITY_ATTRIBUTES) - NEW_C_HEAP_ARRAY(char, sizeof(SECURITY_ATTRIBUTES)); + NEW_C_HEAP_ARRAY(char, sizeof(SECURITY_ATTRIBUTES), mtInternal); lpSA->nLength = sizeof(SECURITY_ATTRIBUTES); lpSA->lpSecurityDescriptor = pSD; lpSA->bInheritHandle = FALSE; @@ -1147,7 +1147,7 @@ // create a security attributes structure with access control // entries as initialized above. LPSECURITY_ATTRIBUTES lpSA = make_security_attr(aces, 3); - FREE_C_HEAP_ARRAY(char, aces[0].pSid); + FREE_C_HEAP_ARRAY(char, aces[0].pSid, mtInternal); FreeSid(everybodySid); FreeSid(administratorsSid); return(lpSA); @@ -1462,15 +1462,15 @@ assert(((size != 0) && (size % os::vm_page_size() == 0)), "unexpected PerfMemry region size"); - FREE_C_HEAP_ARRAY(char, user); + FREE_C_HEAP_ARRAY(char, user, mtInternal); // create the shared memory resources sharedmem_fileMapHandle = create_sharedmem_resources(dirname, filename, objectname, size); - FREE_C_HEAP_ARRAY(char, filename); - FREE_C_HEAP_ARRAY(char, objectname); - FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); + FREE_C_HEAP_ARRAY(char, objectname, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); if (sharedmem_fileMapHandle == NULL) { return NULL; @@ -1621,7 +1621,7 @@ // store file, we also don't following them when attaching // if (!is_directory_secure(dirname)) { - FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Process not found"); } @@ -1640,10 +1640,10 @@ strcpy(robjectname, objectname); // free the c heap resources that are no longer needed - if (luser != user) FREE_C_HEAP_ARRAY(char, luser); - FREE_C_HEAP_ARRAY(char, dirname); - FREE_C_HEAP_ARRAY(char, filename); - FREE_C_HEAP_ARRAY(char, objectname); + if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); + FREE_C_HEAP_ARRAY(char, filename, mtInternal); + FREE_C_HEAP_ARRAY(char, objectname, mtInternal); if (*sizep == 0) { size = sharedmem_filesize(rfilename, CHECK); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp --- a/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -516,17 +516,23 @@ } } - if (thread->thread_state() == _thread_in_Java) { + // We test if stub is already set (by the stack overflow code + // above) so it is not overwritten by the code that follows. This + // check is not required on other platforms, because on other + // platforms we check for SIGSEGV only or SIGBUS only, where here + // we have to check for both SIGSEGV and SIGBUS. + if (thread->thread_state() == _thread_in_Java && stub == NULL) { // Java thread running in Java code => find exception handler if any // a fault inside compiled code, the interpreter, or a stub if ((sig == SIGSEGV || sig == SIGBUS) && os::is_poll_address((address)info->si_addr)) { stub = SharedRuntime::get_poll_stub(pc); -#if defined(__APPLE__) && !defined(AMD64) +#if defined(__APPLE__) // 32-bit Darwin reports a SIGBUS for nearly all memory access exceptions. + // 64-bit Darwin may also use a SIGBUS (seen with compressed oops). // Catching SIGBUS here prevents the implicit SIGBUS NULL check below from // being called, so only do so if the implicit NULL check is not necessary. - } else if (sig == SIGBUS && MacroAssembler::needs_explicit_null_check((int)info->si_addr)) { + } else if (sig == SIGBUS && MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) { #else } else if (sig == SIGBUS /* && info->si_code == BUS_OBJERR */) { #endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp --- a/src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,18 +29,12 @@ // constants required by the Serviceability Agent. This file is // referenced by vmStructs.cpp. -#ifdef __APPLE__ -#define OS_THREAD_ID_TYPE thread_t -#else -#define OS_THREAD_ID_TYPE pthread_t -#endif - #define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field, last_entry) \ \ /******************************/ \ /* Threads (NOTE: incomplete) */ \ /******************************/ \ - nonstatic_field(OSThread, _thread_id, OS_THREAD_ID_TYPE) \ + nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \ nonstatic_field(OSThread, _pthread_id, pthread_t) \ /* This must be the last entry, and must be present */ \ last_entry() @@ -52,7 +46,7 @@ /* Posix Thread IDs */ \ /**********************/ \ \ - declare_unsigned_integer_type(thread_t) \ + declare_unsigned_integer_type(OSThread::thread_id_t) \ declare_unsigned_integer_type(pthread_t) \ \ /* This must be the last entry, and must be present */ \ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp --- a/src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ /******************************/ \ \ nonstatic_field(JavaThread, _base_of_stack_pointer, intptr_t*) \ - nonstatic_field(OSThread, _thread_id, pid_t) \ + nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \ nonstatic_field(OSThread, _pthread_id, pthread_t) \ /* This must be the last entry, and must be present */ \ last_entry() @@ -48,7 +48,7 @@ /* POSIX Thread IDs */ \ /**********************/ \ \ - declare_integer_type(pid_t) \ + declare_integer_type(OSThread::thread_id_t) \ declare_unsigned_integer_type(pthread_t) \ \ /* This must be the last entry, and must be present */ \ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os_cpu/linux_x86/vm/vmStructs_linux_x86.hpp --- a/src/os_cpu/linux_x86/vm/vmStructs_linux_x86.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os_cpu/linux_x86/vm/vmStructs_linux_x86.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ /******************************/ \ /* Threads (NOTE: incomplete) */ \ /******************************/ \ - nonstatic_field(OSThread, _thread_id, pid_t) \ + nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \ nonstatic_field(OSThread, _pthread_id, pthread_t) \ /* This must be the last entry, and must be present */ \ last_entry() @@ -46,7 +46,7 @@ /* Posix Thread IDs */ \ /**********************/ \ \ - declare_integer_type(pid_t) \ + declare_integer_type(OSThread::thread_id_t) \ declare_unsigned_integer_type(pthread_t) \ \ /* This must be the last entry, and must be present */ \ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os_cpu/solaris_sparc/vm/vmStructs_solaris_sparc.hpp --- a/src/os_cpu/solaris_sparc/vm/vmStructs_solaris_sparc.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os_cpu/solaris_sparc/vm/vmStructs_solaris_sparc.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ /******************************/ \ \ nonstatic_field(JavaThread, _base_of_stack_pointer, intptr_t*) \ - nonstatic_field(OSThread, _thread_id, thread_t) \ + nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \ /* This must be the last entry, and must be present */ \ last_entry() @@ -47,7 +47,7 @@ /* Solaris Thread IDs */ \ /**********************/ \ \ - declare_unsigned_integer_type(thread_t) \ + declare_unsigned_integer_type(OSThread::thread_id_t) \ \ /* This must be the last entry, and must be present */ \ last_entry() diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os_cpu/solaris_x86/vm/vmStructs_solaris_x86.hpp --- a/src/os_cpu/solaris_x86/vm/vmStructs_solaris_x86.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os_cpu/solaris_x86/vm/vmStructs_solaris_x86.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ /* Threads (NOTE: incomplete) */ \ /******************************/ \ \ - nonstatic_field(OSThread, _thread_id, thread_t) \ + nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \ \ /* This must be the last entry, and must be present */ \ last_entry() @@ -46,7 +46,7 @@ /* Solaris Thread IDs */ \ /**********************/ \ \ - declare_unsigned_integer_type(thread_t) \ + declare_unsigned_integer_type(OSThread::thread_id_t) \ \ /* This must be the last entry, and must be present */ \ last_entry() diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/os_cpu/windows_x86/vm/vmStructs_windows_x86.hpp --- a/src/os_cpu/windows_x86/vm/vmStructs_windows_x86.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/os_cpu/windows_x86/vm/vmStructs_windows_x86.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ /* Threads (NOTE: incomplete) */ \ /******************************/ \ \ - nonstatic_field(OSThread, _thread_id, unsigned long) \ + nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \ unchecked_nonstatic_field(OSThread, _thread_handle, sizeof(HANDLE)) /* NOTE: no type */ \ \ /* This must be the last entry, and must be present */ \ @@ -43,6 +43,7 @@ #define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \ \ + declare_unsigned_integer_type(OSThread::thread_id_t) \ /* This must be the last entry, and must be present */ \ last_entry() diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/adlc/adlparse.cpp --- a/src/share/vm/adlc/adlparse.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/adlc/adlparse.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -115,6 +115,12 @@ parse_err(SYNERR, "expected one of - instruct, operand, ins_attrib, op_attrib, source, register, pipeline, encode\n Found %s",ident); } } + // Add reg_class spill_regs after parsing. + RegisterForm *regBlock = _AD.get_registers(); + if (regBlock == NULL) { + parse_err(SEMERR, "Did not declare 'register' definitions"); + } + regBlock->addSpillRegClass(); // Done with parsing, check consistency. @@ -768,11 +774,12 @@ //------------------------------reg_parse-------------------------------------- void ADLParser::reg_parse(void) { - - // Create the RegisterForm for the architecture description. - RegisterForm *regBlock = new RegisterForm(); // Build new Source object - regBlock->_linenum = linenum(); - _AD.addForm(regBlock); + RegisterForm *regBlock = _AD.get_registers(); // Information about registers encoding + if (regBlock == NULL) { + // Create the RegisterForm for the architecture description. + regBlock = new RegisterForm(); // Build new Source object + _AD.addForm(regBlock); + } skipws(); // Skip leading whitespace if (_curchar == '%' && *(_ptr+1) == '{') { @@ -796,15 +803,11 @@ parse_err(SYNERR, "Missing %c{ ... %c} block after register keyword.\n",'%','%'); return; } - - // Add reg_class spill_regs - regBlock->addSpillRegClass(); } //------------------------------encode_parse----------------------------------- void ADLParser::encode_parse(void) { EncodeForm *encBlock; // Information about instruction/operand encoding - char *desc = NULL; // String representation of encode rule _AD.getForm(&encBlock); if ( encBlock == NULL) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/adlc/archDesc.cpp --- a/src/share/vm/adlc/archDesc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/adlc/archDesc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ // -// Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -911,12 +911,24 @@ // Find last character in idealOp, it specifies the type char last_char = 0; const char *ptr = idealOp; - for( ; *ptr != '\0'; ++ptr) { + for (; *ptr != '\0'; ++ptr) { last_char = *ptr; } + // Match Vector types. + if (strncmp(idealOp, "Vec",3)==0) { + switch(last_char) { + case 'S': return "TypeVect::VECTS"; + case 'D': return "TypeVect::VECTD"; + case 'X': return "TypeVect::VECTX"; + case 'Y': return "TypeVect::VECTY"; + default: + internal_err("Vector type %s with unrecognized type\n",idealOp); + } + } + // !!!!! - switch( last_char ) { + switch(last_char) { case 'I': return "TypeInt::INT"; case 'P': return "TypePtr::BOTTOM"; case 'N': return "TypeNarrowOop::BOTTOM"; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/adlc/forms.cpp --- a/src/share/vm/adlc/forms.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/adlc/forms.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -261,52 +261,26 @@ if( strcmp(opType,"LoadL")==0 ) return Form::idealL; if( strcmp(opType,"LoadL_unaligned")==0 ) return Form::idealL; if( strcmp(opType,"LoadPLocked")==0 ) return Form::idealP; - if( strcmp(opType,"LoadLLocked")==0 ) return Form::idealL; if( strcmp(opType,"LoadP")==0 ) return Form::idealP; if( strcmp(opType,"LoadN")==0 ) return Form::idealN; if( strcmp(opType,"LoadRange")==0 ) return Form::idealI; if( strcmp(opType,"LoadS")==0 ) return Form::idealS; - if( strcmp(opType,"Load16B")==0 ) return Form::idealB; - if( strcmp(opType,"Load8B")==0 ) return Form::idealB; - if( strcmp(opType,"Load4B")==0 ) return Form::idealB; - if( strcmp(opType,"Load8C")==0 ) return Form::idealC; - if( strcmp(opType,"Load4C")==0 ) return Form::idealC; - if( strcmp(opType,"Load2C")==0 ) return Form::idealC; - if( strcmp(opType,"Load8S")==0 ) return Form::idealS; - if( strcmp(opType,"Load4S")==0 ) return Form::idealS; - if( strcmp(opType,"Load2S")==0 ) return Form::idealS; - if( strcmp(opType,"Load2D")==0 ) return Form::idealD; - if( strcmp(opType,"Load4F")==0 ) return Form::idealF; - if( strcmp(opType,"Load2F")==0 ) return Form::idealF; - if( strcmp(opType,"Load4I")==0 ) return Form::idealI; - if( strcmp(opType,"Load2I")==0 ) return Form::idealI; - if( strcmp(opType,"Load2L")==0 ) return Form::idealL; + if( strcmp(opType,"LoadVector")==0 ) return Form::idealV; assert( strcmp(opType,"Load") != 0, "Must type Loads" ); return Form::none; } Form::DataType Form::is_store_to_memory(const char *opType) const { if( strcmp(opType,"StoreB")==0) return Form::idealB; - if( strcmp(opType,"StoreCM")==0) return Form::idealB; + if( strcmp(opType,"StoreCM")==0) return Form::idealB; if( strcmp(opType,"StoreC")==0) return Form::idealC; if( strcmp(opType,"StoreD")==0) return Form::idealD; if( strcmp(opType,"StoreF")==0) return Form::idealF; if( strcmp(opType,"StoreI")==0) return Form::idealI; if( strcmp(opType,"StoreL")==0) return Form::idealL; if( strcmp(opType,"StoreP")==0) return Form::idealP; - if( strcmp(opType,"StoreN")==0) return Form::idealN; - if( strcmp(opType,"Store16B")==0) return Form::idealB; - if( strcmp(opType,"Store8B")==0) return Form::idealB; - if( strcmp(opType,"Store4B")==0) return Form::idealB; - if( strcmp(opType,"Store8C")==0) return Form::idealC; - if( strcmp(opType,"Store4C")==0) return Form::idealC; - if( strcmp(opType,"Store2C")==0) return Form::idealC; - if( strcmp(opType,"Store2D")==0) return Form::idealD; - if( strcmp(opType,"Store4F")==0) return Form::idealF; - if( strcmp(opType,"Store2F")==0) return Form::idealF; - if( strcmp(opType,"Store4I")==0) return Form::idealI; - if( strcmp(opType,"Store2I")==0) return Form::idealI; - if( strcmp(opType,"Store2L")==0) return Form::idealL; + if( strcmp(opType,"StoreN")==0) return Form::idealN; + if( strcmp(opType,"StoreVector")==0 ) return Form::idealV; assert( strcmp(opType,"Store") != 0, "Must type Stores" ); return Form::none; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/adlc/forms.hpp --- a/src/share/vm/adlc/forms.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/adlc/forms.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -172,7 +172,8 @@ idealB = 6, // Byte type idealC = 7, // Char type idealS = 8, // String type - idealN = 9 // Narrow oop types + idealN = 9, // Narrow oop types + idealV = 10 // Vector type }; // Convert ideal name to a DataType, return DataType::none if not a 'ConX' Form::DataType ideal_to_const_type(const char *ideal_type_name) const; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/adlc/formsopt.cpp --- a/src/share/vm/adlc/formsopt.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/adlc/formsopt.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ // for spill-slots/regs. void RegisterForm::addSpillRegClass() { // Stack slots start at the next available even register number. - _reg_ctr = (_reg_ctr+1) & ~1; + _reg_ctr = (_reg_ctr+7) & ~7; const char *rc_name = "stack_slots"; RegClass *reg_class = new RegClass(rc_name); reg_class->_stack_or_reg = true; @@ -150,9 +150,14 @@ int RegisterForm::RegMask_Size() { // Need at least this many words int words_for_regs = (_reg_ctr + 31)>>5; - // Add a few for incoming & outgoing arguments to calls. + // The array of Register Mask bits should be large enough to cover + // all the machine registers and all parameters that need to be passed + // on the stack (stack registers) up to some interesting limit. Methods + // that need more parameters will NOT be compiled. On Intel, the limit + // is something like 90+ parameters. + // Add a few (3 words == 96 bits) for incoming & outgoing arguments to calls. // Round up to the next doubleword size. - return (words_for_regs + 2 + 1) & ~1; + return (words_for_regs + 3 + 1) & ~1; } void RegisterForm::dump() { // Debug printer diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/adlc/formssel.cpp --- a/src/share/vm/adlc/formssel.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/adlc/formssel.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -432,6 +432,14 @@ return _matrule->is_ideal_store(); } +// Return 'true' if this instruction matches an ideal vector node +bool InstructForm::is_vector() const { + if( _matrule == NULL ) return false; + + return _matrule->is_vector(); +} + + // Return the input register that must match the output register // If this is not required, return 0 uint InstructForm::two_address(FormDict &globals) { @@ -751,6 +759,9 @@ if (needs_base_oop_edge(globals)) return true; + if (is_vector()) return true; + if (is_mach_constant()) return true; + return false; } @@ -3381,13 +3392,10 @@ "StoreI","StoreL","StoreP","StoreN","StoreD","StoreF" , "StoreB","StoreC","Store" ,"StoreFP", "LoadI", "LoadUI2L", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" , - "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" , - "Store4I","Store2I","Store2L","Store2D","Store4F","Store2F","Store16B", - "Store8B","Store4B","Store8C","Store4C","Store2C", - "Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" , - "Load8B" ,"Load4B" ,"Load8C" ,"Load4C" ,"Load2C" ,"Load8S", "Load4S","Load2S", + "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" , + "StoreVector", "LoadVector", "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned", - "LoadPLocked", "LoadLLocked", + "LoadPLocked", "StorePConditional", "StoreIConditional", "StoreLConditional", "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN", "StoreCM", @@ -3822,6 +3830,10 @@ strcmp(opType,"RegL")==0 || strcmp(opType,"RegF")==0 || strcmp(opType,"RegD")==0 || + strcmp(opType,"VecS")==0 || + strcmp(opType,"VecD")==0 || + strcmp(opType,"VecX")==0 || + strcmp(opType,"VecY")==0 || strcmp(opType,"Reg" )==0) ) { return 1; } @@ -3938,19 +3950,12 @@ strcmp(opType,"ReverseBytesL")==0 || strcmp(opType,"ReverseBytesUS")==0 || strcmp(opType,"ReverseBytesS")==0 || - strcmp(opType,"Replicate16B")==0 || - strcmp(opType,"Replicate8B")==0 || - strcmp(opType,"Replicate4B")==0 || - strcmp(opType,"Replicate8C")==0 || - strcmp(opType,"Replicate4C")==0 || - strcmp(opType,"Replicate8S")==0 || - strcmp(opType,"Replicate4S")==0 || - strcmp(opType,"Replicate4I")==0 || - strcmp(opType,"Replicate2I")==0 || - strcmp(opType,"Replicate2L")==0 || - strcmp(opType,"Replicate4F")==0 || - strcmp(opType,"Replicate2F")==0 || - strcmp(opType,"Replicate2D")==0 || + strcmp(opType,"ReplicateB")==0 || + strcmp(opType,"ReplicateS")==0 || + strcmp(opType,"ReplicateI")==0 || + strcmp(opType,"ReplicateL")==0 || + strcmp(opType,"ReplicateF")==0 || + strcmp(opType,"ReplicateD")==0 || 0 /* 0 to line up columns nicely */ ) return 1; } @@ -4034,6 +4039,23 @@ return ideal_load; } +bool MatchRule::is_vector() const { + if( _rChild ) { + const char *opType = _rChild->_opType; + if( strcmp(opType,"ReplicateB")==0 || + strcmp(opType,"ReplicateS")==0 || + strcmp(opType,"ReplicateI")==0 || + strcmp(opType,"ReplicateL")==0 || + strcmp(opType,"ReplicateF")==0 || + strcmp(opType,"ReplicateD")==0 || + strcmp(opType,"LoadVector")==0 || + strcmp(opType,"StoreVector")==0 || + 0 /* 0 to line up columns nicely */ ) + return true; + } + return false; +} + bool MatchRule::skip_antidep_check() const { // Some loads operate on what is effectively immutable memory so we diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/adlc/formssel.hpp --- a/src/share/vm/adlc/formssel.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/adlc/formssel.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -160,6 +160,7 @@ virtual bool is_ideal_safepoint() const; // node matches 'SafePoint' virtual bool is_ideal_nop() const; // node matches 'Nop' virtual bool is_ideal_control() const; // control node + virtual bool is_vector() const; // vector instruction virtual Form::CallType is_ideal_call() const; // matches ideal 'Call' virtual Form::DataType is_ideal_load() const; // node matches ideal 'LoadXNode' @@ -1011,6 +1012,7 @@ bool is_ideal_goto() const; // node matches ideal 'Goto' bool is_ideal_loopEnd() const; // node matches ideal 'LoopEnd' bool is_ideal_bool() const; // node matches ideal 'Bool' + bool is_vector() const; // vector instruction Form::DataType is_ideal_load() const;// node matches ideal 'LoadXNode' // Should antidep checks be disabled for this rule // See definition of MatchRule::skip_antidep_check diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/adlc/main.cpp --- a/src/share/vm/adlc/main.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/adlc/main.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -250,6 +250,7 @@ AD.addInclude(AD._HPP_file, "opto/node.hpp"); AD.addInclude(AD._HPP_file, "opto/regalloc.hpp"); AD.addInclude(AD._HPP_file, "opto/subnode.hpp"); + AD.addInclude(AD._HPP_file, "opto/vectornode.hpp"); AD.addInclude(AD._CPP_CLONE_file, "precompiled.hpp"); AD.addInclude(AD._CPP_CLONE_file, "adfiles", get_basename(AD._HPP_file._name)); AD.addInclude(AD._CPP_EXPAND_file, "precompiled.hpp"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/asm/codeBuffer.cpp --- a/src/share/vm/asm/codeBuffer.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/asm/codeBuffer.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -261,7 +261,7 @@ GrowableArray* CodeBuffer::create_patch_overflow() { if (_overflow_arena == NULL) { - _overflow_arena = new Arena(); + _overflow_arena = new (mtCode) Arena(); } return new (_overflow_arena) GrowableArray(_overflow_arena, 8, 0, 0); } @@ -910,7 +910,7 @@ _comments.add_comment(offset, comment); } -class CodeComment: public CHeapObj { +class CodeComment: public CHeapObj { private: friend class CodeComments; intptr_t _offset; @@ -919,13 +919,13 @@ ~CodeComment() { assert(_next == NULL, "wrong interface for freeing list"); - os::free((void*)_comment); + os::free((void*)_comment, mtCode); } public: CodeComment(intptr_t offset, const char * comment) { _offset = offset; - _comment = os::strdup(comment); + _comment = os::strdup(comment, mtCode); _next = NULL; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_CFGPrinter.cpp --- a/src/share/vm/c1/c1_CFGPrinter.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_CFGPrinter.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -33,7 +33,7 @@ #ifndef PRODUCT -class CFGPrinterOutput : public CHeapObj { +class CFGPrinterOutput : public CHeapObj { private: outputStream* _output; @@ -106,7 +106,7 @@ CFGPrinterOutput::CFGPrinterOutput() - : _output(new(ResourceObj::C_HEAP) fileStream("output.cfg")) + : _output(new(ResourceObj::C_HEAP, mtCompiler) fileStream("output.cfg")) { } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_Canonicalizer.cpp --- a/src/share/vm/c1/c1_Canonicalizer.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_Canonicalizer.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -42,6 +42,11 @@ // the instruction stream (because the instruction list is embedded // in the instructions). if (canonical() != x) { +#ifndef PRODUCT + if (!x->has_printable_bci()) { + x->set_printable_bci(bci()); + } +#endif if (PrintCanonicalization) { PrintValueVisitor do_print_value; canonical()->input_values_do(&do_print_value); @@ -451,6 +456,28 @@ } break; } + case vmIntrinsics::_isInstance : { + assert(x->number_of_arguments() == 2, "wrong type"); + + InstanceConstant* c = x->argument_at(0)->type()->as_InstanceConstant(); + if (c != NULL && !c->value()->is_null_object()) { + // ciInstance::java_mirror_type() returns non-NULL only for Java mirrors + ciType* t = c->value()->as_instance()->java_mirror_type(); + if (t->is_klass()) { + // substitute cls.isInstance(obj) of a constant Class into + // an InstantOf instruction + InstanceOf* i = new InstanceOf(t->as_klass(), x->argument_at(1), x->state_before()); + set_canonical(i); + // and try to canonicalize even further + do_InstanceOf(i); + } else { + assert(t->is_primitive_type(), "should be a primitive type"); + // cls.isInstance(obj) always returns false for primitive classes + set_constant(0); + } + } + break; + } } } @@ -677,8 +704,8 @@ return; } } + set_bci(cmp->state_before()->bci()); set_canonical(canon); - set_bci(cmp->state_before()->bci()); } } } else if (l->as_InstanceOf() != NULL) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_Compiler.cpp --- a/src/share/vm/c1/c1_Compiler.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_Compiler.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -55,7 +55,7 @@ void Compiler::initialize_all() { BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob(); - Arena* arena = new Arena(); + Arena* arena = new (mtCompiler) Arena(); Runtime1::initialize(buffer_blob); FrameMap::initialize(); // initialize data structures diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_GraphBuilder.cpp --- a/src/share/vm/c1/c1_GraphBuilder.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_GraphBuilder.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -2949,6 +2949,8 @@ case vmIntrinsics::_dtan : // fall through case vmIntrinsics::_dlog : // fall through case vmIntrinsics::_dlog10 : // fall through + case vmIntrinsics::_dexp : // fall through + case vmIntrinsics::_dpow : // fall through { // Compiles where the root method is an intrinsic need a special // compilation environment because the bytecodes for the method @@ -2969,6 +2971,9 @@ _state = start_block->state()->copy_for_parsing(); _last = start_block; load_local(doubleType, 0); + if (scope->method()->intrinsic_id() == vmIntrinsics::_dpow) { + load_local(doubleType, 2); + } // Emit the intrinsic node. bool result = try_inline_intrinsics(scope->method()); @@ -3165,6 +3170,7 @@ break; case vmIntrinsics::_getClass : + case vmIntrinsics::_isInstance : if (!InlineClassNatives) return false; preserves_state = true; break; @@ -3182,18 +3188,13 @@ case vmIntrinsics::_dtan : // fall through case vmIntrinsics::_dlog : // fall through case vmIntrinsics::_dlog10 : // fall through + case vmIntrinsics::_dexp : // fall through + case vmIntrinsics::_dpow : // fall through if (!InlineMathNatives) return false; cantrap = false; preserves_state = true; break; - // sun/misc/AtomicLong.attemptUpdate - case vmIntrinsics::_attemptUpdate : - if (!VM_Version::supports_cx8()) return false; - if (!InlineAtomicLong) return false; - preserves_state = true; - break; - // Use special nodes for Unsafe instructions so we can more easily // perform an address-mode optimization on the raw variants case vmIntrinsics::_getObject : return append_unsafe_get_obj(callee, T_OBJECT, false); @@ -3504,8 +3505,10 @@ } // now perform tests that are based on flag settings - if (callee->should_inline()) { + if (callee->force_inline() || callee->should_inline()) { // ignore heuristic controls on inlining + if (callee->force_inline()) + CompileTask::print_inlining(callee, scope()->level(), bci(), "force inline by annotation"); } else { if (inline_level() > MaxInlineLevel ) INLINE_BAILOUT("too-deep inlining"); if (recursive_inline_level(callee) > MaxRecursiveInlineLevel) INLINE_BAILOUT("too-deep recursive inlining"); @@ -3530,7 +3533,7 @@ } #ifndef PRODUCT - // printing + // printing if (PrintInlining) { print_inline_result(callee, true); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_Instruction.hpp --- a/src/share/vm/c1/c1_Instruction.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_Instruction.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -302,8 +302,6 @@ void update_exception_state(ValueStack* state); - bool has_printable_bci() const { return NOT_PRODUCT(_printable_bci != -99) PRODUCT_ONLY(false); } - protected: void set_type(ValueType* type) { assert(type != NULL, "type must exist"); @@ -392,8 +390,9 @@ // accessors int id() const { return _id; } #ifndef PRODUCT + bool has_printable_bci() const { return _printable_bci != -99; } int printable_bci() const { assert(has_printable_bci(), "_printable_bci should have been set"); return _printable_bci; } - void set_printable_bci(int bci) { NOT_PRODUCT(_printable_bci = bci;) } + void set_printable_bci(int bci) { _printable_bci = bci; } #endif int use_count() const { return _use_count; } int pin_state() const { return _pin_state; } @@ -576,6 +575,7 @@ , _block(b) , _index(index) { + NOT_PRODUCT(set_printable_bci(Value(b)->printable_bci())); if (type->is_illegal()) { make_illegal(); } @@ -631,7 +631,9 @@ : Instruction(type) , _java_index(index) , _declared_type(declared) - {} + { + NOT_PRODUCT(set_printable_bci(-1)); + } // accessors int java_index() const { return _java_index; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_LIR.cpp --- a/src/share/vm/c1/c1_LIR.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_LIR.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -624,11 +624,13 @@ { assert(op->as_Op2() != NULL, "must be"); LIR_Op2* op2 = (LIR_Op2*)op; + assert(op2->_tmp2->is_illegal() && op2->_tmp3->is_illegal() && + op2->_tmp4->is_illegal() && op2->_tmp5->is_illegal(), "not used"); if (op2->_info) do_info(op2->_info); if (op2->_opr1->is_valid()) do_input(op2->_opr1); if (op2->_opr2->is_valid()) do_input(op2->_opr2); - if (op2->_tmp->is_valid()) do_temp(op2->_tmp); + if (op2->_tmp1->is_valid()) do_temp(op2->_tmp1); if (op2->_result->is_valid()) do_output(op2->_result); break; @@ -641,7 +643,8 @@ assert(op->as_Op2() != NULL, "must be"); LIR_Op2* op2 = (LIR_Op2*)op; - assert(op2->_info == NULL && op2->_tmp->is_illegal(), "not used"); + assert(op2->_info == NULL && op2->_tmp1->is_illegal() && op2->_tmp2->is_illegal() && + op2->_tmp3->is_illegal() && op2->_tmp4->is_illegal() && op2->_tmp5->is_illegal(), "not used"); assert(op2->_opr1->is_valid() && op2->_opr2->is_valid() && op2->_result->is_valid(), "used"); do_input(op2->_opr1); @@ -665,10 +668,12 @@ assert(op2->_opr1->is_valid(), "used"); assert(op2->_opr2->is_valid(), "used"); assert(op2->_result->is_valid(), "used"); + assert(op2->_tmp2->is_illegal() && op2->_tmp3->is_illegal() && + op2->_tmp4->is_illegal() && op2->_tmp5->is_illegal(), "not used"); do_input(op2->_opr1); do_temp(op2->_opr1); do_input(op2->_opr2); do_temp(op2->_opr2); - if (op2->_tmp->is_valid()) do_temp(op2->_tmp); + if (op2->_tmp1->is_valid()) do_temp(op2->_tmp1); do_output(op2->_result); break; @@ -682,6 +687,8 @@ if (op2->_opr1->is_valid()) do_temp(op2->_opr1); if (op2->_opr2->is_valid()) do_input(op2->_opr2); // exception object is input parameter assert(op2->_result->is_illegal(), "no result"); + assert(op2->_tmp2->is_illegal() && op2->_tmp3->is_illegal() && + op2->_tmp4->is_illegal() && op2->_tmp5->is_illegal(), "not used"); break; } @@ -702,7 +709,8 @@ case lir_sin: case lir_cos: case lir_log: - case lir_log10: { + case lir_log10: + case lir_exp: { assert(op->as_Op2() != NULL, "must be"); LIR_Op2* op2 = (LIR_Op2*)op; @@ -711,16 +719,47 @@ // Register input operand as temp to guarantee that it doesn't // overlap with the input. assert(op2->_info == NULL, "not used"); + assert(op2->_tmp5->is_illegal(), "not used"); + assert(op2->_tmp2->is_valid() == (op->code() == lir_exp), "not used"); + assert(op2->_tmp3->is_valid() == (op->code() == lir_exp), "not used"); + assert(op2->_tmp4->is_valid() == (op->code() == lir_exp), "not used"); assert(op2->_opr1->is_valid(), "used"); do_input(op2->_opr1); do_temp(op2->_opr1); if (op2->_opr2->is_valid()) do_temp(op2->_opr2); - if (op2->_tmp->is_valid()) do_temp(op2->_tmp); + if (op2->_tmp1->is_valid()) do_temp(op2->_tmp1); + if (op2->_tmp2->is_valid()) do_temp(op2->_tmp2); + if (op2->_tmp3->is_valid()) do_temp(op2->_tmp3); + if (op2->_tmp4->is_valid()) do_temp(op2->_tmp4); if (op2->_result->is_valid()) do_output(op2->_result); break; } + case lir_pow: { + assert(op->as_Op2() != NULL, "must be"); + LIR_Op2* op2 = (LIR_Op2*)op; + + // On x86 pow needs two temporary fpu stack slots: tmp1 and + // tmp2. Register input operands as temps to guarantee that it + // doesn't overlap with the temporary slots. + assert(op2->_info == NULL, "not used"); + assert(op2->_opr1->is_valid() && op2->_opr2->is_valid(), "used"); + assert(op2->_tmp1->is_valid() && op2->_tmp2->is_valid() && op2->_tmp3->is_valid() + && op2->_tmp4->is_valid() && op2->_tmp5->is_valid(), "used"); + assert(op2->_result->is_valid(), "used"); + + do_input(op2->_opr1); do_temp(op2->_opr1); + do_input(op2->_opr2); do_temp(op2->_opr2); + do_temp(op2->_tmp1); + do_temp(op2->_tmp2); + do_temp(op2->_tmp3); + do_temp(op2->_tmp4); + do_temp(op2->_tmp5); + do_output(op2->_result); + + break; + } // LIR_Op3 case lir_idiv: @@ -1670,6 +1709,8 @@ case lir_tan: s = "tan"; break; case lir_log: s = "log"; break; case lir_log10: s = "log10"; break; + case lir_exp: s = "exp"; break; + case lir_pow: s = "pow"; break; case lir_logic_and: s = "logic_and"; break; case lir_logic_or: s = "logic_or"; break; case lir_logic_xor: s = "logic_xor"; break; @@ -1892,7 +1933,11 @@ } in_opr1()->print(out); out->print(" "); in_opr2()->print(out); out->print(" "); - if (tmp_opr()->is_valid()) { tmp_opr()->print(out); out->print(" "); } + if (tmp1_opr()->is_valid()) { tmp1_opr()->print(out); out->print(" "); } + if (tmp2_opr()->is_valid()) { tmp2_opr()->print(out); out->print(" "); } + if (tmp3_opr()->is_valid()) { tmp3_opr()->print(out); out->print(" "); } + if (tmp4_opr()->is_valid()) { tmp4_opr()->print(out); out->print(" "); } + if (tmp5_opr()->is_valid()) { tmp5_opr()->print(out); out->print(" "); } result_opr()->print(out); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_LIR.hpp --- a/src/share/vm/c1/c1_LIR.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_LIR.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -916,6 +916,8 @@ , lir_tan , lir_log , lir_log10 + , lir_exp + , lir_pow , lir_logic_and , lir_logic_or , lir_logic_xor @@ -1560,7 +1562,11 @@ LIR_Opr _opr1; LIR_Opr _opr2; BasicType _type; - LIR_Opr _tmp; + LIR_Opr _tmp1; + LIR_Opr _tmp2; + LIR_Opr _tmp3; + LIR_Opr _tmp4; + LIR_Opr _tmp5; LIR_Condition _condition; void verify() const; @@ -1573,7 +1579,11 @@ , _type(T_ILLEGAL) , _condition(condition) , _fpu_stack_size(0) - , _tmp(LIR_OprFact::illegalOpr) { + , _tmp1(LIR_OprFact::illegalOpr) + , _tmp2(LIR_OprFact::illegalOpr) + , _tmp3(LIR_OprFact::illegalOpr) + , _tmp4(LIR_OprFact::illegalOpr) + , _tmp5(LIR_OprFact::illegalOpr) { assert(code == lir_cmp, "code check"); } @@ -1584,7 +1594,11 @@ , _type(type) , _condition(condition) , _fpu_stack_size(0) - , _tmp(LIR_OprFact::illegalOpr) { + , _tmp1(LIR_OprFact::illegalOpr) + , _tmp2(LIR_OprFact::illegalOpr) + , _tmp3(LIR_OprFact::illegalOpr) + , _tmp4(LIR_OprFact::illegalOpr) + , _tmp5(LIR_OprFact::illegalOpr) { assert(code == lir_cmove, "code check"); assert(type != T_ILLEGAL, "cmove should have type"); } @@ -1597,25 +1611,38 @@ , _type(type) , _condition(lir_cond_unknown) , _fpu_stack_size(0) - , _tmp(LIR_OprFact::illegalOpr) { + , _tmp1(LIR_OprFact::illegalOpr) + , _tmp2(LIR_OprFact::illegalOpr) + , _tmp3(LIR_OprFact::illegalOpr) + , _tmp4(LIR_OprFact::illegalOpr) + , _tmp5(LIR_OprFact::illegalOpr) { assert(code != lir_cmp && is_in_range(code, begin_op2, end_op2), "code check"); } - LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, LIR_Opr tmp) + LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, LIR_Opr tmp1, LIR_Opr tmp2 = LIR_OprFact::illegalOpr, + LIR_Opr tmp3 = LIR_OprFact::illegalOpr, LIR_Opr tmp4 = LIR_OprFact::illegalOpr, LIR_Opr tmp5 = LIR_OprFact::illegalOpr) : LIR_Op(code, result, NULL) , _opr1(opr1) , _opr2(opr2) , _type(T_ILLEGAL) , _condition(lir_cond_unknown) , _fpu_stack_size(0) - , _tmp(tmp) { + , _tmp1(tmp1) + , _tmp2(tmp2) + , _tmp3(tmp3) + , _tmp4(tmp4) + , _tmp5(tmp5) { assert(code != lir_cmp && is_in_range(code, begin_op2, end_op2), "code check"); } LIR_Opr in_opr1() const { return _opr1; } LIR_Opr in_opr2() const { return _opr2; } BasicType type() const { return _type; } - LIR_Opr tmp_opr() const { return _tmp; } + LIR_Opr tmp1_opr() const { return _tmp1; } + LIR_Opr tmp2_opr() const { return _tmp2; } + LIR_Opr tmp3_opr() const { return _tmp3; } + LIR_Opr tmp4_opr() const { return _tmp4; } + LIR_Opr tmp5_opr() const { return _tmp5; } LIR_Condition condition() const { assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove"); return _condition; } @@ -2025,6 +2052,8 @@ void sin (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_sin , from, tmp1, to, tmp2)); } void cos (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_cos , from, tmp1, to, tmp2)); } void tan (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_tan , from, tmp1, to, tmp2)); } + void exp (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, LIR_Opr tmp4, LIR_Opr tmp5) { append(new LIR_Op2(lir_exp , from, tmp1, to, tmp2, tmp3, tmp4, tmp5)); } + void pow (LIR_Opr arg1, LIR_Opr arg2, LIR_Opr res, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, LIR_Opr tmp4, LIR_Opr tmp5) { append(new LIR_Op2(lir_pow, arg1, arg2, res, tmp1, tmp2, tmp3, tmp4, tmp5)); } void add (LIR_Opr left, LIR_Opr right, LIR_Opr res) { append(new LIR_Op2(lir_add, left, right, res)); } void sub (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL) { append(new LIR_Op2(lir_sub, left, right, res, info)); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_LIRAssembler.cpp --- a/src/share/vm/c1/c1_LIRAssembler.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_LIRAssembler.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -718,7 +718,7 @@ if (op->in_opr2()->is_constant()) { shift_op(op->code(), op->in_opr1(), op->in_opr2()->as_constant_ptr()->as_jint(), op->result_opr()); } else { - shift_op(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op->tmp_opr()); + shift_op(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op->tmp1_opr()); } break; @@ -746,6 +746,8 @@ case lir_cos: case lir_log: case lir_log10: + case lir_exp: + case lir_pow: intrinsic_op(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op); break; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_LIRGenerator.cpp --- a/src/share/vm/c1/c1_LIRGenerator.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_LIRGenerator.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1242,6 +1242,36 @@ NULL /* info */); } +// Example: clazz.isInstance(object) +void LIRGenerator::do_isInstance(Intrinsic* x) { + assert(x->number_of_arguments() == 2, "wrong type"); + + // TODO could try to substitute this node with an equivalent InstanceOf + // if clazz is known to be a constant Class. This will pick up newly found + // constants after HIR construction. I'll leave this to a future change. + + // as a first cut, make a simple leaf call to runtime to stay platform independent. + // could follow the aastore example in a future change. + + LIRItem clazz(x->argument_at(0), this); + LIRItem object(x->argument_at(1), this); + clazz.load_item(); + object.load_item(); + LIR_Opr result = rlock_result(x); + + // need to perform null check on clazz + if (x->needs_null_check()) { + CodeEmitInfo* info = state_for(x); + __ null_check(clazz.result(), info); + } + + LIR_Opr call_result = call_runtime(clazz.value(), object.value(), + CAST_FROM_FN_PTR(address, Runtime1::is_instance_of), + x->type(), + NULL); // NULL CodeEmitInfo results in a leaf call + __ move(call_result, result); +} + // Example: object.getClass () void LIRGenerator::do_getClass(Intrinsic* x) { assert(x->number_of_arguments() == 1, "wrong type"); @@ -2777,31 +2807,29 @@ int index = bcs.get_method_index(); size_t call_site_offset = cpcache->get_f1_offset(index); + // Load CallSite object from constant pool cache. + LIR_Opr call_site = new_register(objectType); + __ oop2reg(cpcache->constant_encoding(), call_site); + __ move_wide(new LIR_Address(call_site, call_site_offset, T_OBJECT), call_site); + // If this invokedynamic call site hasn't been executed yet in // the interpreter, the CallSite object in the constant pool // cache is still null and we need to deoptimize. if (cpcache->is_f1_null_at(index)) { - // Cannot re-use same xhandlers for multiple CodeEmitInfos, so - // clone all handlers. This is handled transparently in other - // places by the CodeEmitInfo cloning logic but is handled - // specially here because a stub isn't being used. - x->set_exception_handlers(new XHandlers(x->exception_handlers())); - + // Only deoptimize if the CallSite object is still null; we don't + // recompile methods in C1 after deoptimization so this call site + // might be resolved the next time we execute it after OSR. DeoptimizeStub* deopt_stub = new DeoptimizeStub(deopt_info); - __ jump(deopt_stub); + __ cmp(lir_cond_equal, call_site, LIR_OprFact::oopConst(NULL)); + __ branch(lir_cond_equal, T_OBJECT, deopt_stub); } // Use the receiver register for the synthetic MethodHandle // argument. receiver = LIR_Assembler::receiverOpr(); - LIR_Opr tmp = new_register(objectType); - - // Load CallSite object from constant pool cache. - __ oop2reg(cpcache->constant_encoding(), tmp); - __ move_wide(new LIR_Address(tmp, call_site_offset, T_OBJECT), tmp); // Load target MethodHandle from CallSite object. - __ load(new LIR_Address(tmp, java_lang_invoke_CallSite::target_offset_in_bytes(), T_OBJECT), receiver); + __ load(new LIR_Address(call_site, java_lang_invoke_CallSite::target_offset_in_bytes(), T_OBJECT), receiver); __ call_dynamic(target, receiver, result_register, SharedRuntime::get_resolve_opt_virtual_call_stub(), @@ -2809,7 +2837,7 @@ break; } default: - ShouldNotReachHere(); + fatal(err_msg("unexpected bytecode: %s", Bytecodes::name(x->code()))); break; } @@ -2951,6 +2979,7 @@ break; case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break; + case vmIntrinsics::_isInstance: do_isInstance(x); break; case vmIntrinsics::_getClass: do_getClass(x); break; case vmIntrinsics::_currentThread: do_currentThread(x); break; @@ -2960,7 +2989,9 @@ case vmIntrinsics::_dsqrt: // fall through case vmIntrinsics::_dtan: // fall through case vmIntrinsics::_dsin : // fall through - case vmIntrinsics::_dcos : do_MathIntrinsic(x); break; + case vmIntrinsics::_dcos : // fall through + case vmIntrinsics::_dexp : // fall through + case vmIntrinsics::_dpow : do_MathIntrinsic(x); break; case vmIntrinsics::_arraycopy: do_ArrayCopy(x); break; // java.nio.Buffer.checkIndex @@ -2976,11 +3007,6 @@ do_CompareAndSwap(x, longType); break; - // sun.misc.AtomicLongCSImpl.attemptUpdate - case vmIntrinsics::_attemptUpdate: - do_AttemptUpdate(x); - break; - case vmIntrinsics::_Reference_get: do_Reference_get(x); break; @@ -3221,4 +3247,3 @@ } } } - diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_LIRGenerator.hpp --- a/src/share/vm/c1/c1_LIRGenerator.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_LIRGenerator.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -238,12 +238,12 @@ LIR_Opr getThreadPointer(); void do_RegisterFinalizer(Intrinsic* x); + void do_isInstance(Intrinsic* x); void do_getClass(Intrinsic* x); void do_currentThread(Intrinsic* x); void do_MathIntrinsic(Intrinsic* x); void do_ArrayCopy(Intrinsic* x); void do_CompareAndSwap(Intrinsic* x, ValueType* type); - void do_AttemptUpdate(Intrinsic* x); void do_NIOCheckIndex(Intrinsic* x); void do_FPIntrinsics(Intrinsic* x); void do_Reference_get(Intrinsic* x); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_LinearScan.cpp --- a/src/share/vm/c1/c1_LinearScan.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_LinearScan.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -2467,12 +2467,12 @@ // Allocate them with new so they are never destroyed (otherwise, a // forced exit could destroy these objects while they are still in // use). -ConstantOopWriteValue* LinearScan::_oop_null_scope_value = new (ResourceObj::C_HEAP) ConstantOopWriteValue(NULL); -ConstantIntValue* LinearScan::_int_m1_scope_value = new (ResourceObj::C_HEAP) ConstantIntValue(-1); -ConstantIntValue* LinearScan::_int_0_scope_value = new (ResourceObj::C_HEAP) ConstantIntValue(0); -ConstantIntValue* LinearScan::_int_1_scope_value = new (ResourceObj::C_HEAP) ConstantIntValue(1); -ConstantIntValue* LinearScan::_int_2_scope_value = new (ResourceObj::C_HEAP) ConstantIntValue(2); -LocationValue* _illegal_value = new (ResourceObj::C_HEAP) LocationValue(Location()); +ConstantOopWriteValue* LinearScan::_oop_null_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantOopWriteValue(NULL); +ConstantIntValue* LinearScan::_int_m1_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(-1); +ConstantIntValue* LinearScan::_int_0_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(0); +ConstantIntValue* LinearScan::_int_1_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(1); +ConstantIntValue* LinearScan::_int_2_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(2); +LocationValue* _illegal_value = new (ResourceObj::C_HEAP, mtCompiler) LocationValue(Location()); void LinearScan::init_compute_debug_info() { // cache for frequently used scope values @@ -6579,6 +6579,8 @@ case lir_abs: case lir_log10: case lir_log: + case lir_pow: + case lir_exp: case lir_logic_and: case lir_logic_or: case lir_logic_xor: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_Runtime1.cpp --- a/src/share/vm/c1/c1_Runtime1.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_Runtime1.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -294,6 +294,7 @@ FUNCTION_CASE(entry, SharedRuntime::lrem); FUNCTION_CASE(entry, SharedRuntime::dtrace_method_entry); FUNCTION_CASE(entry, SharedRuntime::dtrace_method_exit); + FUNCTION_CASE(entry, is_instance_of); FUNCTION_CASE(entry, trace_block_entry); #ifdef TRACE_HAVE_INTRINSICS FUNCTION_CASE(entry, TRACE_TIME_METHOD); @@ -1270,6 +1271,19 @@ JRT_END +JRT_LEAF(int, Runtime1::is_instance_of(oopDesc* mirror, oopDesc* obj)) + // had to return int instead of bool, otherwise there may be a mismatch + // between the C calling convention and the Java one. + // e.g., on x86, GCC may clear only %al when returning a bool false, but + // JVM takes the whole %eax as the return value, which may misinterpret + // the return value as a boolean true. + + assert(mirror != NULL, "should null-check on mirror before calling"); + klassOop k = java_lang_Class::as_klassOop(mirror); + return (k != NULL && obj != NULL && obj->is_a(k)) ? 1 : 0; +JRT_END + + #ifndef PRODUCT void Runtime1::print_statistics() { tty->print_cr("C1 Runtime statistics:"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_Runtime1.hpp --- a/src/share/vm/c1/c1_Runtime1.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_Runtime1.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -186,6 +186,7 @@ static int arraycopy(oopDesc* src, int src_pos, oopDesc* dst, int dst_pos, int length); static void primitive_arraycopy(HeapWord* src, HeapWord* dst, int length); static void oop_arraycopy(HeapWord* src, HeapWord* dst, int length); + static int is_instance_of(oopDesc* mirror, oopDesc* obj); static void print_statistics() PRODUCT_RETURN; }; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/c1/c1_ValueMap.hpp --- a/src/share/vm/c1/c1_ValueMap.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/c1/c1_ValueMap.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -141,8 +141,11 @@ // visitor functions void do_StoreField (StoreField* x) { - if (x->is_init_point()) { - // putstatic is an initialization point so treat it as a wide kill + if (x->is_init_point() || // putstatic is an initialization point so treat it as a wide kill + // This is actually too strict and the JMM doesn't require + // this in all cases (e.g. load a; volatile store b; load a) + // but possible future optimizations might require this. + x->field()->is_volatile()) { kill_memory(); } else { kill_field(x->field()); @@ -160,8 +163,8 @@ void do_Local (Local* x) { /* nothing to do */ } void do_Constant (Constant* x) { /* nothing to do */ } void do_LoadField (LoadField* x) { - if (x->is_init_point()) { - // getstatic is an initialization point so treat it as a wide kill + if (x->is_init_point() || // getstatic is an initialization point so treat it as a wide kill + x->field()->is_volatile()) { // the JMM requires this kill_memory(); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/ci/ciMethod.cpp --- a/src/share/vm/ci/ciMethod.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/ci/ciMethod.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -79,7 +79,7 @@ _max_locals = h_m()->max_locals(); _code_size = h_m()->code_size(); _intrinsic_id = h_m()->intrinsic_id(); - _handler_count = h_m()->exception_table()->length() / 4; + _handler_count = h_m()->exception_table_length(); _uses_monitors = h_m()->access_flags().has_monitor_bytecodes(); _balanced_monitors = !_uses_monitors || h_m()->access_flags().is_monitor_matching(); _is_c1_compilable = !h_m()->is_not_c1_compilable(); @@ -198,7 +198,7 @@ } // And load the exception table. - typeArrayOop exc_table = me->exception_table(); + ExceptionTable exc_table(me); // Allocate one extra spot in our list of exceptions. This // last entry will be used to represent the possibility that @@ -209,13 +209,12 @@ * (_handler_count + 1)); if (_handler_count > 0) { for (int i=0; i<_handler_count; i++) { - int base = i*4; _exception_handlers[i] = new (arena) ciExceptionHandler( holder(), - /* start */ exc_table->int_at(base), - /* limit */ exc_table->int_at(base+1), - /* goto pc */ exc_table->int_at(base+2), - /* cp index */ exc_table->int_at(base+3)); + /* start */ exc_table.start_pc(i), + /* limit */ exc_table.end_pc(i), + /* goto pc */ exc_table.handler_pc(i), + /* cp index */ exc_table.catch_type_index(i)); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/ci/ciMethod.hpp --- a/src/share/vm/ci/ciMethod.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/ci/ciMethod.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -160,6 +160,8 @@ // Code size for inlining decisions. int code_size_for_inlining(); + bool force_inline() { return get_methodOop()->force_inline(); } + int comp_level(); int highest_osr_comp_level(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/ci/ciObjectFactory.cpp --- a/src/share/vm/ci/ciObjectFactory.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/ci/ciObjectFactory.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -111,7 +111,7 @@ // This Arena is long lived and exists in the resource mark of the // compiler thread that initializes the initial ciObjectFactory which // creates the shared ciObjects that all later ciObjectFactories use. - Arena* arena = new Arena(); + Arena* arena = new (mtCompiler) Arena(); ciEnv initial(arena); ciEnv* env = ciEnv::current(); env->_factory->init_shared_objects(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/altHashing.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/classfile/altHashing.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "classfile/altHashing.hpp" +#include "classfile/symbolTable.hpp" +#include "classfile/systemDictionary.hpp" +#include "oops/markOop.hpp" +#include "runtime/thread.hpp" + +// Get the hash code of the classes mirror if it exists, otherwise just +// return a random number, which is one of the possible hash code used for +// objects. We don't want to call the synchronizer hash code to install +// this value because it may safepoint. +intptr_t object_hash(klassOop k) { + intptr_t hc = k->java_mirror()->mark()->hash(); + return hc != markOopDesc::no_hash ? hc : os::random(); +} + +// Seed value used for each alternative hash calculated. +jint AltHashing::compute_seed() { + jlong nanos = os::javaTimeNanos(); + jlong now = os::javaTimeMillis(); + jint SEED_MATERIAL[8] = { + (jint) object_hash(SystemDictionary::String_klass()), + (jint) object_hash(SystemDictionary::System_klass()), + (jint) os::random(), // current thread isn't a java thread + (jint) (((julong)nanos) >> 32), + (jint) nanos, + (jint) (((julong)now) >> 32), + (jint) now, + (jint) (os::javaTimeNanos() >> 2) + }; + + return murmur3_32(SEED_MATERIAL, 8); +} + + +// Murmur3 hashing for Symbol +jint AltHashing::murmur3_32(jint seed, const jbyte* data, int len) { + jint h1 = seed; + int count = len; + int offset = 0; + + // body + while (count >= 4) { + jint k1 = (data[offset] & 0x0FF) + | (data[offset + 1] & 0x0FF) << 8 + | (data[offset + 2] & 0x0FF) << 16 + | data[offset + 3] << 24; + + count -= 4; + offset += 4; + + k1 *= 0xcc9e2d51; + k1 = Integer_rotateLeft(k1, 15); + k1 *= 0x1b873593; + + h1 ^= k1; + h1 = Integer_rotateLeft(h1, 13); + h1 = h1 * 5 + 0xe6546b64; + } + + // tail + + if (count > 0) { + jint k1 = 0; + + switch (count) { + case 3: + k1 ^= (data[offset + 2] & 0xff) << 16; + // fall through + case 2: + k1 ^= (data[offset + 1] & 0xff) << 8; + // fall through + case 1: + k1 ^= (data[offset] & 0xff); + // fall through + default: + k1 *= 0xcc9e2d51; + k1 = Integer_rotateLeft(k1, 15); + k1 *= 0x1b873593; + h1 ^= k1; + } + } + + // finalization + h1 ^= len; + + // finalization mix force all bits of a hash block to avalanche + h1 ^= ((unsigned int)h1) >> 16; + h1 *= 0x85ebca6b; + h1 ^= ((unsigned int)h1) >> 13; + h1 *= 0xc2b2ae35; + h1 ^= ((unsigned int)h1) >> 16; + + return h1; +} + +// Murmur3 hashing for Strings +jint AltHashing::murmur3_32(jint seed, const jchar* data, int len) { + jint h1 = seed; + + int off = 0; + int count = len; + + // body + while (count >= 2) { + jchar d1 = data[off++] & 0xFFFF; + jchar d2 = data[off++]; + jint k1 = (d1 | d2 << 16); + + count -= 2; + + k1 *= 0xcc9e2d51; + k1 = Integer_rotateLeft(k1, 15); + k1 *= 0x1b873593; + + h1 ^= k1; + h1 = Integer_rotateLeft(h1, 13); + h1 = h1 * 5 + 0xe6546b64; + } + + // tail + + if (count > 0) { + int k1 = data[off]; + + k1 *= 0xcc9e2d51; + k1 = Integer_rotateLeft(k1, 15); + k1 *= 0x1b873593; + h1 ^= k1; + } + + // finalization + h1 ^= len * 2; // (Character.SIZE / Byte.SIZE); + + // finalization mix force all bits of a hash block to avalanche + h1 ^= ((unsigned int)h1) >> 16; + h1 *= 0x85ebca6b; + h1 ^= ((unsigned int)h1) >> 13; + h1 *= 0xc2b2ae35; + h1 ^= ((unsigned int)h1) >> 16; + + return h1; +} + +// Hash used for the seed. +jint AltHashing::murmur3_32(jint seed, const int* data, int len) { + jint h1 = seed; + + int off = 0; + int end = len; + + // body + while (off < end) { + jint k1 = data[off++]; + + k1 *= 0xcc9e2d51; + k1 = Integer_rotateLeft(k1, 15); + k1 *= 0x1b873593; + + h1 ^= k1; + h1 = Integer_rotateLeft(h1, 13); + h1 = h1 * 5 + 0xe6546b64; + } + + // tail (always empty, as body is always 32-bit chunks) + + // finalization + + h1 ^= len * 4; // (Integer.SIZE / Byte.SIZE); + + // finalization mix force all bits of a hash block to avalanche + h1 ^= ((juint)h1) >> 16; + h1 *= 0x85ebca6b; + h1 ^= ((juint)h1) >> 13; + h1 *= 0xc2b2ae35; + h1 ^= ((juint)h1) >> 16; + + return h1; +} + +jint AltHashing::murmur3_32(const int* data, int len) { + return murmur3_32(0, data, len); +} + +#ifndef PRODUCT +// Overloaded versions for internal test. +jint AltHashing::murmur3_32(const jbyte* data, int len) { + return murmur3_32(0, data, len); +} + +jint AltHashing::murmur3_32(const jchar* data, int len) { + return murmur3_32(0, data, len); +} + +// Internal test for alternate hashing. Translated from JDK version +// test/sun/misc/Hashing.java +static const jbyte ONE_BYTE[] = { (jbyte) 0x80}; +static const jbyte TWO_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81}; +static const jchar ONE_CHAR[] = { (jchar) 0x8180}; +static const jbyte THREE_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82}; +static const jbyte FOUR_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83}; +static const jchar TWO_CHAR[] = { (jchar) 0x8180, (jchar) 0x8382}; +static const jint ONE_INT[] = { 0x83828180}; +static const jbyte SIX_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85}; +static const jchar THREE_CHAR[] = { (jchar) 0x8180, (jchar) 0x8382, (jchar) 0x8584}; +static const jbyte EIGHT_BYTE[] = { + (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, + (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85, + (jbyte) 0x86, (jbyte) 0x87}; +static const jchar FOUR_CHAR[] = { + (jchar) 0x8180, (jchar) 0x8382, + (jchar) 0x8584, (jchar) 0x8786}; + +static const jint TWO_INT[] = { 0x83828180, 0x87868584}; + +static const juint MURMUR3_32_X86_CHECK_VALUE = 0xB0F57EE3; + +void AltHashing::testMurmur3_32_ByteArray() { + // printf("testMurmur3_32_ByteArray\n"); + + jbyte* vector = new jbyte[256]; + jbyte* hashes = new jbyte[4 * 256]; + + for (int i = 0; i < 256; i++) { + vector[i] = (jbyte) i; + } + + // Hash subranges {}, {0}, {0,1}, {0,1,2}, ..., {0,...,255} + for (int i = 0; i < 256; i++) { + jint hash = murmur3_32(256 - i, vector, i); + hashes[i * 4] = (jbyte) hash; + hashes[i * 4 + 1] = (jbyte) (((juint)hash) >> 8); + hashes[i * 4 + 2] = (jbyte) (((juint)hash) >> 16); + hashes[i * 4 + 3] = (jbyte) (((juint)hash) >> 24); + } + + // hash to get const result. + juint final_hash = murmur3_32(hashes, 4*256); + + assert (MURMUR3_32_X86_CHECK_VALUE == final_hash, + err_msg( + "Calculated hash result not as expected. Expected %08X got %08X\n", + MURMUR3_32_X86_CHECK_VALUE, + final_hash)); +} + +void AltHashing::testEquivalentHashes() { + jint jbytes, jchars, ints; + + // printf("testEquivalentHashes\n"); + + jbytes = murmur3_32(TWO_BYTE, 2); + jchars = murmur3_32(ONE_CHAR, 1); + assert (jbytes == jchars, + err_msg("Hashes did not match. b:%08x != c:%08x\n", jbytes, jchars)); + + jbytes = murmur3_32(FOUR_BYTE, 4); + jchars = murmur3_32(TWO_CHAR, 2); + ints = murmur3_32(ONE_INT, 1); + assert ((jbytes == jchars) && (jbytes == ints), + err_msg("Hashes did not match. b:%08x != c:%08x != i:%08x\n", jbytes, jchars, ints)); + + jbytes = murmur3_32(SIX_BYTE, 6); + jchars = murmur3_32(THREE_CHAR, 3); + assert (jbytes == jchars, + err_msg("Hashes did not match. b:%08x != c:%08x\n", jbytes, jchars)); + + jbytes = murmur3_32(EIGHT_BYTE, 8); + jchars = murmur3_32(FOUR_CHAR, 4); + ints = murmur3_32(TWO_INT, 2); + assert ((jbytes == jchars) && (jbytes == ints), + err_msg("Hashes did not match. b:%08x != c:%08x != i:%08x\n", jbytes, jchars, ints)); +} + +// Returns true if the alternate hashcode is correct +void AltHashing::test_alt_hash() { + testMurmur3_32_ByteArray(); + testEquivalentHashes(); +} +#endif // PRODUCT diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/altHashing.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/classfile/altHashing.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_CLASSFILE_ALTHASHING_HPP +#define SHARE_VM_CLASSFILE_ALTHASHING_HPP + +#include "prims/jni.h" +#include "classfile/symbolTable.hpp" + +/** + * Hashing utilities. + * + * Implementation of Murmur3 hashing. + * This code was translated from src/share/classes/sun/misc/Hashing.java + * code in the JDK. + */ + +class AltHashing : AllStatic { + + // utility function copied from java/lang/Integer + static jint Integer_rotateLeft(jint i, int distance) { + return (i << distance) | (((juint)i) >> (32-distance)); + } + static jint murmur3_32(const int* data, int len); + static jint murmur3_32(jint seed, const int* data, int len); + +#ifndef PRODUCT + // Hashing functions used for internal testing + static jint murmur3_32(const jbyte* data, int len); + static jint murmur3_32(const jchar* data, int len); + static void testMurmur3_32_ByteArray(); + static void testEquivalentHashes(); +#endif // PRODUCT + + public: + static jint compute_seed(); + static jint murmur3_32(jint seed, const jbyte* data, int len); + static jint murmur3_32(jint seed, const jchar* data, int len); + NOT_PRODUCT(static void test_alt_hash();) +}; +#endif // SHARE_VM_CLASSFILE_ALTHASHING_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/classFileParser.cpp --- a/src/share/vm/classfile/classFileParser.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/classFileParser.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -318,6 +318,13 @@ bool inline valid_cp_range(int index, int length) { return (index > 0 && index < length); } +inline Symbol* check_symbol_at(constantPoolHandle cp, int index) { + if (valid_cp_range(index, cp->length()) && cp->tag_at(index).is_utf8()) + return cp->symbol_at(index); + else + return NULL; +} + constantPoolHandle ClassFileParser::parse_constant_pool(Handle class_loader, TRAPS) { ClassFileStream* cfs = stream(); constantPoolHandle nullHandle; @@ -902,6 +909,7 @@ bool* is_synthetic_addr, u2* generic_signature_index_addr, typeArrayHandle* field_annotations, + ClassFileParser::FieldAnnotationCollector* parsed_annotations, TRAPS) { ClassFileStream* cfs = stream(); assert(attributes_count > 0, "length should be greater than 0"); @@ -1082,12 +1090,36 @@ int num_injected = 0; InjectedField* injected = JavaClasses::get_injected(class_name, &num_injected); - - // Tuples of shorts [access, name index, sig index, initial value index, byte offset, generic signature index] - typeArrayOop new_fields = oopFactory::new_permanent_shortArray((length + num_injected) * FieldInfo::field_slots, CHECK_(nullHandle)); - typeArrayHandle fields(THREAD, new_fields); + int total_fields = length + num_injected; + + // The field array starts with tuples of shorts + // [access, name index, sig index, initial value index, byte offset]. + // A generic signature slot only exists for field with generic + // signature attribute. And the access flag is set with + // JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE for that field. The generic + // signature slots are at the end of the field array and after all + // other fields data. + // + // f1: [access, name index, sig index, initial value index, low_offset, high_offset] + // f2: [access, name index, sig index, initial value index, low_offset, high_offset] + // ... + // fn: [access, name index, sig index, initial value index, low_offset, high_offset] + // [generic signature index] + // [generic signature index] + // ... + // + // Allocate a temporary resource array for field data. For each field, + // a slot is reserved in the temporary array for the generic signature + // index. After parsing all fields, the data are copied to a permanent + // array and any unused slots will be discarded. + ResourceMark rm(THREAD); + u2* fa = NEW_RESOURCE_ARRAY_IN_THREAD( + THREAD, u2, total_fields * (FieldInfo::field_slots + 1)); typeArrayHandle field_annotations; + // The generic signature slots start after all other fields' data. + int generic_signature_slot = total_fields * FieldInfo::field_slots; + int num_generic_signature = 0; for (int n = 0; n < length; n++) { cfs->guarantee_more(8, CHECK_(nullHandle)); // access_flags, name_index, descriptor_index, attributes_count @@ -1118,12 +1150,14 @@ bool is_synthetic = false; u2 generic_signature_index = 0; bool is_static = access_flags.is_static(); + FieldAnnotationCollector parsed_annotations; u2 attributes_count = cfs->get_u2_fast(); if (attributes_count > 0) { parse_field_attributes(cp, attributes_count, is_static, signature_index, &constantvalue_index, &is_synthetic, &generic_signature_index, &field_annotations, + &parsed_annotations, CHECK_(nullHandle)); if (field_annotations.not_null()) { if (fields_annotations->is_null()) { @@ -1135,15 +1169,22 @@ if (is_synthetic) { access_flags.set_is_synthetic(); } + if (generic_signature_index != 0) { + access_flags.set_field_has_generic_signature(); + fa[generic_signature_slot] = generic_signature_index; + generic_signature_slot ++; + num_generic_signature ++; + } } - FieldInfo* field = FieldInfo::from_field_array(fields(), n); + FieldInfo* field = FieldInfo::from_field_array(fa, n); field->initialize(access_flags.as_short(), name_index, signature_index, constantvalue_index, - generic_signature_index, 0); + if (parsed_annotations.has_any_annotations()) + parsed_annotations.apply_to(field); BasicType type = cp->basic_type_for_signature_at(signature_index); @@ -1155,8 +1196,8 @@ field->set_offset(atype); } + int index = length; if (num_injected != 0) { - int index = length; for (int n = 0; n < num_injected; n++) { // Check for duplicates if (injected[n].may_be_java) { @@ -1164,7 +1205,7 @@ Symbol* signature = injected[n].signature(); bool duplicate = false; for (int i = 0; i < length; i++) { - FieldInfo* f = FieldInfo::from_field_array(fields(), i); + FieldInfo* f = FieldInfo::from_field_array(fa, i); if (name == cp->symbol_at(f->name_index()) && signature == cp->symbol_at(f->signature_index())) { // Symbol is desclared in Java so skip this one @@ -1179,12 +1220,11 @@ } // Injected field - FieldInfo* field = FieldInfo::from_field_array(fields(), index); + FieldInfo* field = FieldInfo::from_field_array(fa, index); field->initialize(JVM_ACC_FIELD_INTERNAL, injected[n].name_index, injected[n].signature_index, 0, - 0, 0); BasicType type = FieldType::basic_type(injected[n].signature()); @@ -1197,17 +1237,27 @@ field->set_offset(atype); index++; } - - if (index < length + num_injected) { - // sometimes injected fields already exist in the Java source so - // the fields array could be too long. In that case trim the - // fields array. - new_fields = oopFactory::new_permanent_shortArray(index * FieldInfo::field_slots, CHECK_(nullHandle)); - for (int i = 0; i < index * FieldInfo::field_slots; i++) { - new_fields->short_at_put(i, fields->short_at(i)); - } - fields = new_fields; + } + + // Now copy the fields' data from the temporary resource array. + // Sometimes injected fields already exist in the Java source so + // the fields array could be too long. In that case the + // fields array is trimed. Also unused slots that were reserved + // for generic signature indexes are discarded. + typeArrayOop new_fields = oopFactory::new_permanent_shortArray( + index * FieldInfo::field_slots + num_generic_signature, + CHECK_(nullHandle)); + typeArrayHandle fields(THREAD, new_fields); + { + int i = 0; + for (; i < index * FieldInfo::field_slots; i++) { + new_fields->short_at_put(i, fa[i]); } + for (int j = total_fields * FieldInfo::field_slots; + j < generic_signature_slot; j++) { + new_fields->short_at_put(i++, fa[j]); + } + assert(i == new_fields->length(), ""); } if (_need_verify && length > 1) { @@ -1246,42 +1296,38 @@ } -typeArrayHandle ClassFileParser::parse_exception_table(u4 code_length, - u4 exception_table_length, - constantPoolHandle cp, - TRAPS) { +u2* ClassFileParser::parse_exception_table(u4 code_length, + u4 exception_table_length, + constantPoolHandle cp, + TRAPS) { ClassFileStream* cfs = stream(); - typeArrayHandle nullHandle; - - // 4-tuples of ints [start_pc, end_pc, handler_pc, catch_type index] - typeArrayOop eh = oopFactory::new_permanent_intArray(exception_table_length*4, CHECK_(nullHandle)); - typeArrayHandle exception_handlers = typeArrayHandle(THREAD, eh); - - int index = 0; - cfs->guarantee_more(8 * exception_table_length, CHECK_(nullHandle)); // start_pc, end_pc, handler_pc, catch_type_index - for (unsigned int i = 0; i < exception_table_length; i++) { - u2 start_pc = cfs->get_u2_fast(); - u2 end_pc = cfs->get_u2_fast(); - u2 handler_pc = cfs->get_u2_fast(); - u2 catch_type_index = cfs->get_u2_fast(); - // Will check legal target after parsing code array in verifier. - if (_need_verify) { + + u2* exception_table_start = cfs->get_u2_buffer(); + assert(exception_table_start != NULL, "null exception table"); + cfs->guarantee_more(8 * exception_table_length, CHECK_NULL); // start_pc, end_pc, handler_pc, catch_type_index + // Will check legal target after parsing code array in verifier. + if (_need_verify) { + for (unsigned int i = 0; i < exception_table_length; i++) { + u2 start_pc = cfs->get_u2_fast(); + u2 end_pc = cfs->get_u2_fast(); + u2 handler_pc = cfs->get_u2_fast(); + u2 catch_type_index = cfs->get_u2_fast(); guarantee_property((start_pc < end_pc) && (end_pc <= code_length), - "Illegal exception table range in class file %s", CHECK_(nullHandle)); + "Illegal exception table range in class file %s", + CHECK_NULL); guarantee_property(handler_pc < code_length, - "Illegal exception table handler in class file %s", CHECK_(nullHandle)); + "Illegal exception table handler in class file %s", + CHECK_NULL); if (catch_type_index != 0) { guarantee_property(valid_cp_range(catch_type_index, cp->length()) && is_klass_reference(cp, catch_type_index), - "Catch type in exception table has bad constant type in class file %s", CHECK_(nullHandle)); + "Catch type in exception table has bad constant type in class file %s", CHECK_NULL); } } - exception_handlers->int_at_put(index++, start_pc); - exception_handlers->int_at_put(index++, end_pc); - exception_handlers->int_at_put(index++, handler_pc); - exception_handlers->int_at_put(index++, catch_type_index); + } else { + cfs->skip_u2_fast(exception_table_length * 4); } - return exception_handlers; + return exception_table_start; } void ClassFileParser::parse_linenumber_table( @@ -1330,7 +1376,7 @@ }; -class LVT_Hash: public CHeapObj { +class LVT_Hash: public CHeapObj { public: LocalVariableTableElement *_elem; // element LVT_Hash* _next; // Next entry in hash table @@ -1600,12 +1646,158 @@ name->as_C_string(), _class_name->as_C_string(), sig->as_C_string()); } +// Skip an annotation. Return >=limit if there is any problem. +int ClassFileParser::skip_annotation(u1* buffer, int limit, int index) { + // annotation := atype:u2 do(nmem:u2) {member:u2 value} + // value := switch (tag:u1) { ... } + index += 2; // skip atype + if ((index += 2) >= limit) return limit; // read nmem + int nmem = Bytes::get_Java_u2(buffer+index-2); + while (--nmem >= 0 && index < limit) { + index += 2; // skip member + index = skip_annotation_value(buffer, limit, index); + } + return index; +} + +// Skip an annotation value. Return >=limit if there is any problem. +int ClassFileParser::skip_annotation_value(u1* buffer, int limit, int index) { + // value := switch (tag:u1) { + // case B, C, I, S, Z, D, F, J, c: con:u2; + // case e: e_class:u2 e_name:u2; + // case s: s_con:u2; + // case [: do(nval:u2) {value}; + // case @: annotation; + // case s: s_con:u2; + // } + if ((index += 1) >= limit) return limit; // read tag + u1 tag = buffer[index-1]; + switch (tag) { + case 'B': case 'C': case 'I': case 'S': case 'Z': + case 'D': case 'F': case 'J': case 'c': case 's': + index += 2; // skip con or s_con + break; + case 'e': + index += 4; // skip e_class, e_name + break; + case '[': + { + if ((index += 2) >= limit) return limit; // read nval + int nval = Bytes::get_Java_u2(buffer+index-2); + while (--nval >= 0 && index < limit) { + index = skip_annotation_value(buffer, limit, index); + } + } + break; + case '@': + index = skip_annotation(buffer, limit, index); + break; + default: + assert(false, "annotation tag"); + return limit; // bad tag byte + } + return index; +} + +// Sift through annotations, looking for those significant to the VM: +void ClassFileParser::parse_annotations(u1* buffer, int limit, + constantPoolHandle cp, + ClassFileParser::AnnotationCollector* coll, + TRAPS) { + // annotations := do(nann:u2) {annotation} + int index = 0; + if ((index += 2) >= limit) return; // read nann + int nann = Bytes::get_Java_u2(buffer+index-2); + enum { // initial annotation layout + atype_off = 0, // utf8 such as 'Ljava/lang/annotation/Retention;' + count_off = 2, // u2 such as 1 (one value) + member_off = 4, // utf8 such as 'value' + tag_off = 6, // u1 such as 'c' (type) or 'e' (enum) + e_tag_val = 'e', + e_type_off = 7, // utf8 such as 'Ljava/lang/annotation/RetentionPolicy;' + e_con_off = 9, // utf8 payload, such as 'SOURCE', 'CLASS', 'RUNTIME' + e_size = 11, // end of 'e' annotation + c_tag_val = 'c', + c_con_off = 7, // utf8 payload, such as 'I' or 'Ljava/lang/String;' + c_size = 9, // end of 'c' annotation + min_size = 6 // smallest possible size (zero members) + }; + while ((--nann) >= 0 && (index-2 + min_size <= limit)) { + int index0 = index; + index = skip_annotation(buffer, limit, index); + u1* abase = buffer + index0; + int atype = Bytes::get_Java_u2(abase + atype_off); + int count = Bytes::get_Java_u2(abase + count_off); + Symbol* aname = check_symbol_at(cp, atype); + if (aname == NULL) break; // invalid annotation name + Symbol* member = NULL; + if (count >= 1) { + int member_index = Bytes::get_Java_u2(abase + member_off); + member = check_symbol_at(cp, member_index); + if (member == NULL) break; // invalid member name + } + + // Here is where parsing particular annotations will take place. + AnnotationCollector::ID id = coll->annotation_index(aname); + if (id == AnnotationCollector::_unknown) continue; + coll->set_annotation(id); + // If there are no values, just set the bit and move on: + if (count == 0) continue; + + // For the record, here is how annotation payloads can be collected. + // Suppose we want to capture @Retention.value. Here is how: + //if (id == AnnotationCollector::_class_Retention) { + // Symbol* payload = NULL; + // if (count == 1 + // && e_size == (index0 - index) // match size + // && e_tag_val == *(abase + tag_off) + // && (check_symbol_at(cp, Bytes::get_Java_u2(abase + e_type_off)) + // == vmSymbols::RetentionPolicy_signature()) + // && member == vmSymbols::value_name()) { + // payload = check_symbol_at(cp, Bytes::get_Java_u2(abase + e_con_off)); + // } + // check_property(payload != NULL, + // "Invalid @Retention annotation at offset %u in class file %s", + // index0, CHECK); + // if (payload != NULL) { + // payload->increment_refcount(); + // coll->_class_RetentionPolicy = payload; + // } + //} + } +} + +ClassFileParser::AnnotationCollector::ID ClassFileParser::AnnotationCollector::annotation_index(Symbol* name) { + vmSymbols::SID sid = vmSymbols::find_sid(name); + switch (sid) { + case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_ForceInline_signature): + if (_location != _in_method) break; // only allow for methods + return _method_ForceInline; + default: break; + } + return AnnotationCollector::_unknown; +} + +void ClassFileParser::FieldAnnotationCollector::apply_to(FieldInfo* f) { + fatal("no field annotations yet"); +} + +void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) { + if (has_annotation(_method_ForceInline)) + m->set_force_inline(true); +} + +void ClassFileParser::ClassAnnotationCollector::apply_to(instanceKlassHandle k) { + fatal("no class annotations yet"); +} + + #define MAX_ARGS_SIZE 255 #define MAX_CODE_SIZE 65535 #define INITIAL_MAX_LVT_NUMBER 256 // Note: the parse_method below is big and clunky because all parsing of the code and exceptions -// attribute is inlined. This is curbersome to avoid since we inline most of the parts in the +// attribute is inlined. This is cumbersome to avoid since we inline most of the parts in the // methodOop to save footprint, so we only know the size of the resulting methodOop when the // entire method attribute is parsed. // @@ -1674,6 +1866,7 @@ u4 code_length = 0; u1* code_start = 0; u2 exception_table_length = 0; + u2* exception_table_start = NULL; typeArrayHandle exception_handlers(THREAD, Universe::the_empty_int_array()); u2 checked_exceptions_length = 0; u2* checked_exceptions_start = NULL; @@ -1695,6 +1888,7 @@ // stackmap attribute - JDK1.5 typeArrayHandle stackmap_data; u2 generic_signature_index = 0; + MethodAnnotationCollector parsed_annotations; u1* runtime_visible_annotations = NULL; int runtime_visible_annotations_length = 0; u1* runtime_invisible_annotations = NULL; @@ -1760,7 +1954,7 @@ cfs->guarantee_more(2, CHECK_(nullHandle)); // exception_table_length exception_table_length = cfs->get_u2_fast(); if (exception_table_length > 0) { - exception_handlers = + exception_table_start = parse_exception_table(code_length, exception_table_length, cp, CHECK_(nullHandle)); } @@ -1921,6 +2115,7 @@ runtime_visible_annotations_length = method_attribute_length; runtime_visible_annotations = cfs->get_u1_buffer(); assert(runtime_visible_annotations != NULL, "null visible annotations"); + parse_annotations(runtime_visible_annotations, runtime_visible_annotations_length, cp, &parsed_annotations, CHECK_(nullHandle)); cfs->skip_u1(runtime_visible_annotations_length, CHECK_(nullHandle)); } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { runtime_invisible_annotations_length = method_attribute_length; @@ -1964,9 +2159,13 @@ } // All sizing information for a methodOop is finally available, now create it - methodOop m_oop = oopFactory::new_method(code_length, access_flags, linenumber_table_length, - total_lvt_length, checked_exceptions_length, - oopDesc::IsSafeConc, CHECK_(nullHandle)); + methodOop m_oop = oopFactory::new_method(code_length, access_flags, + linenumber_table_length, + total_lvt_length, + exception_table_length, + checked_exceptions_length, + oopDesc::IsSafeConc, + CHECK_(nullHandle)); methodHandle m (THREAD, m_oop); ClassLoadingService::add_class_method_size(m_oop->size()*HeapWordSize); @@ -1997,16 +2196,15 @@ // Fill in code attribute information m->set_max_stack(max_stack); m->set_max_locals(max_locals); - m->constMethod()->set_stackmap_data(stackmap_data()); /** - * The exception_table field is the flag used to indicate + * The stackmap_data field is the flag used to indicate * that the methodOop and it's associated constMethodOop are partially * initialized and thus are exempt from pre/post GC verification. Once * the field is set, the oops are considered fully initialized so make * sure that the oops can pass verification when this field is set. */ - m->set_exception_table(exception_handlers()); + m->constMethod()->set_stackmap_data(stackmap_data()); // Copy byte codes m->set_code(code_start); @@ -2017,6 +2215,14 @@ linenumber_table->buffer(), linenumber_table_length); } + // Copy exception table + if (exception_table_length > 0) { + int size = + exception_table_length * sizeof(ExceptionTableElement) / sizeof(u2); + copy_u2_with_conversion((u2*) m->exception_table_start(), + exception_table_start, size); + } + // Copy checked exceptions if (checked_exceptions_length > 0) { int size = checked_exceptions_length * sizeof(CheckedExceptionElement) / sizeof(u2); @@ -2098,6 +2304,8 @@ clear_hashtable(lvt_Hash); } + if (parsed_annotations.has_any_annotations()) + parsed_annotations.apply_to(m); *method_annotations = assemble_annotations(runtime_visible_annotations, runtime_visible_annotations_length, runtime_invisible_annotations, @@ -2276,7 +2484,7 @@ } -void ClassFileParser::parse_classfile_sourcefile_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) { +void ClassFileParser::parse_classfile_sourcefile_attribute(constantPoolHandle cp, TRAPS) { ClassFileStream* cfs = stream(); cfs->guarantee_more(2, CHECK); // sourcefile_index u2 sourcefile_index = cfs->get_u2_fast(); @@ -2285,13 +2493,12 @@ cp->tag_at(sourcefile_index).is_utf8(), "Invalid SourceFile attribute at constant pool index %u in class file %s", sourcefile_index, CHECK); - k->set_source_file_name(cp->symbol_at(sourcefile_index)); + set_class_sourcefile(cp->symbol_at(sourcefile_index)); } void ClassFileParser::parse_classfile_source_debug_extension_attribute(constantPoolHandle cp, - instanceKlassHandle k, int length, TRAPS) { ClassFileStream* cfs = stream(); u1* sde_buffer = cfs->get_u1_buffer(); @@ -2299,12 +2506,13 @@ // Don't bother storing it if there is no way to retrieve it if (JvmtiExport::can_get_source_debug_extension()) { - // Optimistically assume that only 1 byte UTF format is used - // (common case) - TempNewSymbol sde_symbol = SymbolTable::new_symbol((const char*)sde_buffer, length, CHECK); - k->set_source_debug_extension(sde_symbol); - // Note that set_source_debug_extension() increments the reference count - // for its copy of the Symbol*, so use a TempNewSymbol here. + assert((length+1) > length, "Overflow checking"); + u1* sde = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, u1, length+1); + for (int i = 0; i < length; i++) { + sde[i] = sde_buffer[i]; + } + sde[length] = '\0'; + set_class_sde_buffer((char*)sde, length); } // Got utf8 string, set stream position forward cfs->skip_u1(length, CHECK); @@ -2320,7 +2528,7 @@ u2 enclosing_method_class_index, u2 enclosing_method_method_index, constantPoolHandle cp, - instanceKlassHandle k, TRAPS) { + TRAPS) { ClassFileStream* cfs = stream(); u1* current_mark = cfs->current(); u2 length = 0; @@ -2411,7 +2619,7 @@ assert(index == size, "wrong size"); // Update instanceKlass with inner class info. - k->set_inner_classes(inner_classes()); + set_class_inner_classes(inner_classes); // Restore buffer's current position. cfs->set_current(current_mark); @@ -2419,11 +2627,11 @@ return length; } -void ClassFileParser::parse_classfile_synthetic_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) { - k->set_is_synthetic(); +void ClassFileParser::parse_classfile_synthetic_attribute(constantPoolHandle cp, TRAPS) { + set_class_synthetic_flag(true); } -void ClassFileParser::parse_classfile_signature_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) { +void ClassFileParser::parse_classfile_signature_attribute(constantPoolHandle cp, TRAPS) { ClassFileStream* cfs = stream(); u2 signature_index = cfs->get_u2(CHECK); check_property( @@ -2431,10 +2639,10 @@ cp->tag_at(signature_index).is_utf8(), "Invalid constant pool index %u in Signature attribute in class file %s", signature_index, CHECK); - k->set_generic_signature(cp->symbol_at(signature_index)); + set_class_generic_signature(cp->symbol_at(signature_index)); } -void ClassFileParser::parse_classfile_bootstrap_methods_attribute(constantPoolHandle cp, instanceKlassHandle k, +void ClassFileParser::parse_classfile_bootstrap_methods_attribute(constantPoolHandle cp, u4 attribute_byte_length, TRAPS) { ClassFileStream* cfs = stream(); u1* current_start = cfs->current(); @@ -2506,10 +2714,12 @@ } -void ClassFileParser::parse_classfile_attributes(constantPoolHandle cp, instanceKlassHandle k, TRAPS) { +void ClassFileParser::parse_classfile_attributes(constantPoolHandle cp, + ClassFileParser::ClassAnnotationCollector* parsed_annotations, + TRAPS) { ClassFileStream* cfs = stream(); // Set inner classes attribute to default sentinel - k->set_inner_classes(Universe::the_empty_short_array()); + set_class_inner_classes(typeArrayHandle(THREAD, Universe::the_empty_short_array())); cfs->guarantee_more(2, CHECK); // attributes_count u2 attributes_count = cfs->get_u2_fast(); bool parsed_sourcefile_attribute = false; @@ -2545,10 +2755,10 @@ } else { parsed_sourcefile_attribute = true; } - parse_classfile_sourcefile_attribute(cp, k, CHECK); + parse_classfile_sourcefile_attribute(cp, CHECK); } else if (tag == vmSymbols::tag_source_debug_extension()) { // Check for SourceDebugExtension tag - parse_classfile_source_debug_extension_attribute(cp, k, (int)attribute_length, CHECK); + parse_classfile_source_debug_extension_attribute(cp, (int)attribute_length, CHECK); } else if (tag == vmSymbols::tag_inner_classes()) { // Check for InnerClasses tag if (parsed_innerclasses_attribute) { @@ -2567,7 +2777,7 @@ "Invalid Synthetic classfile attribute length %u in class file %s", attribute_length, CHECK); } - parse_classfile_synthetic_attribute(cp, k, CHECK); + parse_classfile_synthetic_attribute(cp, CHECK); } else if (tag == vmSymbols::tag_deprecated()) { // Check for Deprecatd tag - 4276120 if (attribute_length != 0) { @@ -2582,11 +2792,16 @@ "Wrong Signature attribute length %u in class file %s", attribute_length, CHECK); } - parse_classfile_signature_attribute(cp, k, CHECK); + parse_classfile_signature_attribute(cp, CHECK); } else if (tag == vmSymbols::tag_runtime_visible_annotations()) { runtime_visible_annotations_length = attribute_length; runtime_visible_annotations = cfs->get_u1_buffer(); assert(runtime_visible_annotations != NULL, "null visible annotations"); + parse_annotations(runtime_visible_annotations, + runtime_visible_annotations_length, + cp, + parsed_annotations, + CHECK); cfs->skip_u1(runtime_visible_annotations_length, CHECK); } else if (PreserveAllAnnotations && tag == vmSymbols::tag_runtime_invisible_annotations()) { runtime_invisible_annotations_length = attribute_length; @@ -2620,7 +2835,7 @@ if (parsed_bootstrap_methods_attribute) classfile_parse_error("Multiple BootstrapMethods attributes in class file %s", CHECK); parsed_bootstrap_methods_attribute = true; - parse_classfile_bootstrap_methods_attribute(cp, k, attribute_length, CHECK); + parse_classfile_bootstrap_methods_attribute(cp, attribute_length, CHECK); } else { // Unknown attribute cfs->skip_u1(attribute_length, CHECK); @@ -2635,7 +2850,7 @@ runtime_invisible_annotations, runtime_invisible_annotations_length, CHECK); - k->set_class_annotations(annotations()); + set_class_annotations(annotations); if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) { u2 num_of_classes = parse_classfile_inner_classes_attribute( @@ -2643,7 +2858,7 @@ parsed_innerclasses_attribute, enclosing_method_class_index, enclosing_method_method_index, - cp, k, CHECK); + cp, CHECK); if (parsed_innerclasses_attribute &&_need_verify && _major_version >= JAVA_1_5_VERSION) { guarantee_property( inner_classes_attribute_length == sizeof(num_of_classes) + 4 * sizeof(u2) * num_of_classes, @@ -2657,6 +2872,23 @@ } } +void ClassFileParser::apply_parsed_class_attributes(instanceKlassHandle k) { + if (_synthetic_flag) + k->set_is_synthetic(); + if (_sourcefile != NULL) { + _sourcefile->increment_refcount(); + k->set_source_file_name(_sourcefile); + } + if (_generic_signature != NULL) { + _generic_signature->increment_refcount(); + k->set_generic_signature(_generic_signature); + } + if (_sde_buffer != NULL) { + k->set_source_debug_extension(_sde_buffer, _sde_length); + } + k->set_inner_classes(_inner_classes()); + k->set_class_annotations(_annotations()); +} typeArrayHandle ClassFileParser::assemble_annotations(u1* runtime_visible_annotations, int runtime_visible_annotations_length, @@ -2707,8 +2939,7 @@ jt->get_thread_stat()->perf_timers_addr(), PerfClassTraceTime::PARSE_CLASS); - _has_finalizer = _has_empty_finalizer = _has_vanilla_constructor = false; - _max_bootstrap_specifier_index = -1; + init_parsed_class_attributes(); if (JvmtiExport::should_post_class_file_load_hook()) { // Get the cached class file bytes (if any) from the class that @@ -2941,6 +3172,13 @@ objArrayHandle methods_parameter_annotations(THREAD, methods_parameter_annotations_oop); objArrayHandle methods_default_annotations(THREAD, methods_default_annotations_oop); + // Additional attributes + ClassAnnotationCollector parsed_annotations; + parse_classfile_attributes(cp, &parsed_annotations, CHECK_(nullHandle)); + + // Make sure this is the end of class file stream + guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle)); + // We check super class after class file is parsed and format is checked if (super_class_index > 0 && super_klass.is_null()) { Symbol* sk = cp->klass_name_at(super_class_index); @@ -3429,11 +3667,10 @@ this_klass->set_has_miranda_methods(); // then set a flag } - // Additional attributes - parse_classfile_attributes(cp, this_klass, CHECK_(nullHandle)); - - // Make sure this is the end of class file stream - guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle)); + // Fill in field values obtained by parse_classfile_attributes + if (parsed_annotations.has_any_annotations()) + parsed_annotations.apply_to(this_klass); + apply_parsed_class_attributes(this_klass); // VerifyOops believes that once this has been set, the object is completely loaded. // Compute transitive closure of interfaces this class implements @@ -3448,6 +3685,7 @@ // Do final class setup fill_oop_maps(this_klass, nonstatic_oop_map_count, nonstatic_oop_offsets, nonstatic_oop_counts); + // Fill in has_finalizer, has_vanilla_constructor, and layout_helper set_precomputed_flags(this_klass); // reinitialize modifiers, using the InnerClasses attribute diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/classFileParser.hpp --- a/src/share/vm/classfile/classFileParser.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/classFileParser.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -31,8 +31,8 @@ #include "oops/typeArrayOop.hpp" #include "runtime/handles.inline.hpp" #include "utilities/accessFlags.hpp" +#include "classfile/symbolTable.hpp" -class TempNewSymbol; class FieldAllocationCount; @@ -50,11 +50,80 @@ KlassHandle _host_klass; GrowableArray* _cp_patches; // overrides for CP entries + // precomputed flags bool _has_finalizer; bool _has_empty_finalizer; bool _has_vanilla_constructor; + int _max_bootstrap_specifier_index; // detects BSS values - int _max_bootstrap_specifier_index; + // class attributes parsed before the instance klass is created: + bool _synthetic_flag; + Symbol* _sourcefile; + Symbol* _generic_signature; + char* _sde_buffer; + int _sde_length; + typeArrayHandle _inner_classes; + typeArrayHandle _annotations; + + void set_class_synthetic_flag(bool x) { _synthetic_flag = x; } + void set_class_sourcefile(Symbol* x) { _sourcefile = x; } + void set_class_generic_signature(Symbol* x) { _generic_signature = x; } + void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; } + void set_class_inner_classes(typeArrayHandle x) { _inner_classes = x; } + void set_class_annotations(typeArrayHandle x) { _annotations = x; } + void init_parsed_class_attributes() { + _synthetic_flag = false; + _sourcefile = NULL; + _generic_signature = NULL; + _sde_buffer = NULL; + _sde_length = 0; + // initialize the other flags too: + _has_finalizer = _has_empty_finalizer = _has_vanilla_constructor = false; + _max_bootstrap_specifier_index = -1; + } + void apply_parsed_class_attributes(instanceKlassHandle k); // update k + + class AnnotationCollector { + public: + enum Location { _in_field, _in_method, _in_class }; + enum ID { + _unknown = 0, + _method_ForceInline, + _annotation_LIMIT + }; + const Location _location; + int _annotations_present; + AnnotationCollector(Location location) + : _location(location), _annotations_present(0) + { + assert((int)_annotation_LIMIT <= (int)sizeof(_annotations_present) * BitsPerByte, ""); + } + // If this annotation name has an ID, report it (or _none). + ID annotation_index(Symbol* name); + // Set the annotation name: + void set_annotation(ID id) { + assert((int)id >= 0 && (int)id < (int)_annotation_LIMIT, "oob"); + _annotations_present |= nth_bit((int)id); + } + // Report if the annotation is present. + bool has_any_annotations() { return _annotations_present != 0; } + bool has_annotation(ID id) { return (nth_bit((int)id) & _annotations_present) != 0; } + }; + class FieldAnnotationCollector: public AnnotationCollector { + public: + FieldAnnotationCollector() : AnnotationCollector(_in_field) { } + void apply_to(FieldInfo* f); + }; + class MethodAnnotationCollector: public AnnotationCollector { + public: + MethodAnnotationCollector() : AnnotationCollector(_in_method) { } + void apply_to(methodHandle m); + }; + class ClassAnnotationCollector: public AnnotationCollector { + public: + ClassAnnotationCollector() : AnnotationCollector(_in_class) { } + void apply_to(instanceKlassHandle k); + }; enum { fixed_buffer_size = 128 }; u_char linenumbertable_buffer[fixed_buffer_size]; @@ -87,7 +156,9 @@ u2* constantvalue_index_addr, bool* is_synthetic_addr, u2* generic_signature_index_addr, - typeArrayHandle* field_annotations, TRAPS); + typeArrayHandle* field_annotations, + FieldAnnotationCollector* parsed_annotations, + TRAPS); typeArrayHandle parse_fields(Symbol* class_name, constantPoolHandle cp, bool is_interface, FieldAllocationCount *fac, @@ -113,8 +184,8 @@ objArrayHandle methods_parameter_annotations, objArrayHandle methods_default_annotations, TRAPS); - typeArrayHandle parse_exception_table(u4 code_length, u4 exception_table_length, - constantPoolHandle cp, TRAPS); + u2* parse_exception_table(u4 code_length, u4 exception_table_length, + constantPoolHandle cp, TRAPS); void parse_linenumber_table( u4 code_attribute_length, u4 code_length, CompressedLineNumberWriteStream** write_stream, TRAPS); @@ -128,25 +199,32 @@ typeArrayOop parse_stackmap_table(u4 code_attribute_length, TRAPS); // Classfile attribute parsing - void parse_classfile_sourcefile_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS); - void parse_classfile_source_debug_extension_attribute(constantPoolHandle cp, - instanceKlassHandle k, int length, TRAPS); + void parse_classfile_sourcefile_attribute(constantPoolHandle cp, TRAPS); + void parse_classfile_source_debug_extension_attribute(constantPoolHandle cp, int length, TRAPS); u2 parse_classfile_inner_classes_attribute(u1* inner_classes_attribute_start, bool parsed_enclosingmethod_attribute, u2 enclosing_method_class_index, u2 enclosing_method_method_index, constantPoolHandle cp, - instanceKlassHandle k, TRAPS); - void parse_classfile_attributes(constantPoolHandle cp, instanceKlassHandle k, TRAPS); - void parse_classfile_synthetic_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS); - void parse_classfile_signature_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS); - void parse_classfile_bootstrap_methods_attribute(constantPoolHandle cp, instanceKlassHandle k, u4 attribute_length, TRAPS); + TRAPS); + void parse_classfile_attributes(constantPoolHandle cp, + ClassAnnotationCollector* parsed_annotations, + TRAPS); + void parse_classfile_synthetic_attribute(constantPoolHandle cp, TRAPS); + void parse_classfile_signature_attribute(constantPoolHandle cp, TRAPS); + void parse_classfile_bootstrap_methods_attribute(constantPoolHandle cp, u4 attribute_length, TRAPS); // Annotations handling typeArrayHandle assemble_annotations(u1* runtime_visible_annotations, int runtime_visible_annotations_length, u1* runtime_invisible_annotations, int runtime_invisible_annotations_length, TRAPS); + int skip_annotation(u1* buffer, int limit, int index); + int skip_annotation_value(u1* buffer, int limit, int index); + void parse_annotations(u1* buffer, int limit, constantPoolHandle cp, + /* Results (currently, only one result is supported): */ + AnnotationCollector* result, + TRAPS); // Final setup unsigned int compute_oop_map_count(instanceKlassHandle super, diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/classLoader.cpp --- a/src/share/vm/classfile/classLoader.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/classLoader.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -153,7 +153,7 @@ _meta_package_names = NULL; _num_meta_package_names = 0; } else { - _meta_package_names = NEW_C_HEAP_ARRAY(char*, num_meta_package_names); + _meta_package_names = NEW_C_HEAP_ARRAY(char*, num_meta_package_names, mtClass); _num_meta_package_names = num_meta_package_names; memcpy(_meta_package_names, meta_package_names, num_meta_package_names * sizeof(char*)); } @@ -161,7 +161,7 @@ MetaIndex::~MetaIndex() { - FREE_C_HEAP_ARRAY(char*, _meta_package_names); + FREE_C_HEAP_ARRAY(char*, _meta_package_names, mtClass); } @@ -192,7 +192,7 @@ } ClassPathDirEntry::ClassPathDirEntry(char* dir) : ClassPathEntry() { - _dir = NEW_C_HEAP_ARRAY(char, strlen(dir)+1); + _dir = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass); strcpy(_dir, dir); } @@ -229,7 +229,7 @@ ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name) : ClassPathEntry() { _zip = zip; - _zip_name = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1); + _zip_name = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1, mtClass); strcpy(_zip_name, zip_name); } @@ -237,7 +237,7 @@ if (ZipClose != NULL) { (*ZipClose)(_zip); } - FREE_C_HEAP_ARRAY(char, _zip_name); + FREE_C_HEAP_ARRAY(char, _zip_name, mtClass); } ClassFileStream* ClassPathZipEntry::open_stream(const char* name) { @@ -454,11 +454,11 @@ while (sys_class_path[end] && sys_class_path[end] != os::path_separator()[0]) { end++; } - char* path = NEW_C_HEAP_ARRAY(char, end-start+1); + char* path = NEW_C_HEAP_ARRAY(char, end-start+1, mtClass); strncpy(path, &sys_class_path[start], end-start); path[end-start] = '\0'; update_class_path_entry_list(path, false); - FREE_C_HEAP_ARRAY(char, path); + FREE_C_HEAP_ARRAY(char, path, mtClass); while (sys_class_path[end] == os::path_separator()[0]) { end++; } @@ -652,13 +652,13 @@ // in the classpath must be the same files, in the same order, even // though the exact name is not the same. -class PackageInfo: public BasicHashtableEntry { +class PackageInfo: public BasicHashtableEntry { public: const char* _pkgname; // Package name int _classpath_index; // Index of directory or JAR file loaded from PackageInfo* next() { - return (PackageInfo*)BasicHashtableEntry::next(); + return (PackageInfo*)BasicHashtableEntry::next(); } const char* pkgname() { return _pkgname; } @@ -674,7 +674,7 @@ }; -class PackageHashtable : public BasicHashtable { +class PackageHashtable : public BasicHashtable { private: inline unsigned int compute_hash(const char *s, int n) { unsigned int val = 0; @@ -685,7 +685,7 @@ } PackageInfo* bucket(int index) { - return (PackageInfo*)BasicHashtable::bucket(index); + return (PackageInfo*)BasicHashtable::bucket(index); } PackageInfo* get_entry(int index, unsigned int hash, @@ -702,10 +702,10 @@ public: PackageHashtable(int table_size) - : BasicHashtable(table_size, sizeof(PackageInfo)) {} + : BasicHashtable(table_size, sizeof(PackageInfo)) {} - PackageHashtable(int table_size, HashtableBucket* t, int number_of_entries) - : BasicHashtable(table_size, sizeof(PackageInfo), t, number_of_entries) {} + PackageHashtable(int table_size, HashtableBucket* t, int number_of_entries) + : BasicHashtable(table_size, sizeof(PackageInfo), t, number_of_entries) {} PackageInfo* get_entry(const char* pkgname, int n) { unsigned int hash = compute_hash(pkgname, n); @@ -715,14 +715,14 @@ PackageInfo* new_entry(char* pkgname, int n) { unsigned int hash = compute_hash(pkgname, n); PackageInfo* pp; - pp = (PackageInfo*)BasicHashtable::new_entry(hash); + pp = (PackageInfo*)BasicHashtable::new_entry(hash); pp->set_pkgname(pkgname); return pp; } void add_entry(PackageInfo* pp) { int index = hash_to_index(pp->hash()); - BasicHashtable::add_entry(index, pp); + BasicHashtable::add_entry(index, pp); } void copy_pkgnames(const char** packages) { @@ -742,7 +742,7 @@ void PackageHashtable::copy_table(char** top, char* end, PackageHashtable* table) { // Copy (relocate) the table to the shared space. - BasicHashtable::copy_table(top, end); + BasicHashtable::copy_table(top, end); // Calculate the space needed for the package name strings. int i; @@ -815,7 +815,7 @@ // Package prefix found int n = cp - pkgname + 1; - char* new_pkgname = NEW_C_HEAP_ARRAY(char, n + 1); + char* new_pkgname = NEW_C_HEAP_ARRAY(char, n + 1, mtClass); if (new_pkgname == NULL) { return false; } @@ -929,10 +929,10 @@ } -void ClassLoader::create_package_info_table(HashtableBucket *t, int length, +void ClassLoader::create_package_info_table(HashtableBucket *t, int length, int number_of_entries) { assert(_package_hash_table == NULL, "One package info table allowed."); - assert(length == package_hash_table_size * sizeof(HashtableBucket), + assert(length == package_hash_table_size * sizeof(HashtableBucket), "bad shared package info size."); _package_hash_table = new PackageHashtable(package_hash_table_size, t, number_of_entries); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/classLoader.hpp --- a/src/share/vm/classfile/classLoader.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/classLoader.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -33,7 +33,7 @@ // Meta-index (optional, to be able to skip opening boot classpath jar files) -class MetaIndex: public CHeapObj { +class MetaIndex: public CHeapObj { private: char** _meta_package_names; int _num_meta_package_names; @@ -46,7 +46,7 @@ // Class path entry (directory or zip file) -class ClassPathEntry: public CHeapObj { +class ClassPathEntry: public CHeapObj { private: ClassPathEntry* _next; public: @@ -141,7 +141,7 @@ class PackageHashtable; class PackageInfo; -class HashtableBucket; +template class HashtableBucket; class ClassLoader: AllStatic { public: @@ -299,7 +299,7 @@ // Initialization static void initialize(); static void create_package_info_table(); - static void create_package_info_table(HashtableBucket *t, int length, + static void create_package_info_table(HashtableBucket *t, int length, int number_of_entries); static int compute_Object_vtable(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/dictionary.cpp --- a/src/share/vm/classfile/dictionary.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/dictionary.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -36,16 +36,16 @@ Dictionary::Dictionary(int table_size) - : TwoOopHashtable(table_size, sizeof(DictionaryEntry)) { + : TwoOopHashtable(table_size, sizeof(DictionaryEntry)) { _current_class_index = 0; _current_class_entry = NULL; }; -Dictionary::Dictionary(int table_size, HashtableBucket* t, +Dictionary::Dictionary(int table_size, HashtableBucket* t, int number_of_entries) - : TwoOopHashtable(table_size, sizeof(DictionaryEntry), t, number_of_entries) { + : TwoOopHashtable(table_size, sizeof(DictionaryEntry), t, number_of_entries) { _current_class_index = 0; _current_class_entry = NULL; }; @@ -54,7 +54,7 @@ DictionaryEntry* Dictionary::new_entry(unsigned int hash, klassOop klass, oop loader) { DictionaryEntry* entry; - entry = (DictionaryEntry*)Hashtable::new_entry(hash, klass); + entry = (DictionaryEntry*)Hashtable::new_entry(hash, klass); entry->set_loader(loader); entry->set_pd_set(NULL); return entry; @@ -62,7 +62,7 @@ DictionaryEntry* Dictionary::new_entry() { - DictionaryEntry* entry = (DictionaryEntry*)Hashtable::new_entry(0L, NULL); + DictionaryEntry* entry = (DictionaryEntry*)Hashtable::new_entry(0L, NULL); entry->set_loader(NULL); entry->set_pd_set(NULL); return entry; @@ -76,7 +76,7 @@ entry->set_pd_set(to_delete->next()); delete to_delete; } - Hashtable::free_entry(entry); + Hashtable::free_entry(entry); } @@ -554,12 +554,12 @@ } SymbolPropertyTable::SymbolPropertyTable(int table_size) - : Hashtable(table_size, sizeof(SymbolPropertyEntry)) + : Hashtable(table_size, sizeof(SymbolPropertyEntry)) { } -SymbolPropertyTable::SymbolPropertyTable(int table_size, HashtableBucket* t, +SymbolPropertyTable::SymbolPropertyTable(int table_size, HashtableBucket* t, int number_of_entries) - : Hashtable(table_size, sizeof(SymbolPropertyEntry), t, number_of_entries) + : Hashtable(table_size, sizeof(SymbolPropertyEntry), t, number_of_entries) { } @@ -584,7 +584,7 @@ assert(find_entry(index, hash, sym, sym_mode) == NULL, "no double entry"); SymbolPropertyEntry* p = new_entry(hash, sym, sym_mode); - Hashtable::add_entry(index, p); + Hashtable::add_entry(index, p); return p; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/dictionary.hpp --- a/src/share/vm/classfile/dictionary.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/dictionary.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -36,7 +36,7 @@ // The data structure for the system dictionary (and the shared system // dictionary). -class Dictionary : public TwoOopHashtable { +class Dictionary : public TwoOopHashtable { friend class VMStructs; private: // current iteration index. @@ -48,22 +48,22 @@ Symbol* name, Handle loader); DictionaryEntry* bucket(int i) { - return (DictionaryEntry*)Hashtable::bucket(i); + return (DictionaryEntry*)Hashtable::bucket(i); } // The following method is not MT-safe and must be done under lock. DictionaryEntry** bucket_addr(int i) { - return (DictionaryEntry**)Hashtable::bucket_addr(i); + return (DictionaryEntry**)Hashtable::bucket_addr(i); } void add_entry(int index, DictionaryEntry* new_entry) { - Hashtable::add_entry(index, (HashtableEntry*)new_entry); + Hashtable::add_entry(index, (HashtableEntry*)new_entry); } public: Dictionary(int table_size); - Dictionary(int table_size, HashtableBucket* t, int number_of_entries); + Dictionary(int table_size, HashtableBucket* t, int number_of_entries); DictionaryEntry* new_entry(unsigned int hash, klassOop klass, oop loader); @@ -129,7 +129,7 @@ // The following classes can be in dictionary.cpp, but we need these // to be in header file so that SA's vmStructs can access. -class ProtectionDomainEntry :public CHeapObj { +class ProtectionDomainEntry :public CHeapObj { friend class VMStructs; public: ProtectionDomainEntry* _next; @@ -147,7 +147,7 @@ // An entry in the system dictionary, this describes a class as // { klassOop, loader, protection_domain }. -class DictionaryEntry : public HashtableEntry { +class DictionaryEntry : public HashtableEntry { friend class VMStructs; private: // Contains the set of approved protection domains that can access @@ -166,11 +166,11 @@ klassOop* klass_addr() { return (klassOop*)literal_addr(); } DictionaryEntry* next() const { - return (DictionaryEntry*)HashtableEntry::next(); + return (DictionaryEntry*)HashtableEntry::next(); } DictionaryEntry** next_addr() { - return (DictionaryEntry**)HashtableEntry::next_addr(); + return (DictionaryEntry**)HashtableEntry::next_addr(); } oop loader() const { return _loader; } @@ -228,7 +228,7 @@ // Entry in a SymbolPropertyTable, mapping a single Symbol* // to a managed and an unmanaged pointer. -class SymbolPropertyEntry : public HashtableEntry { +class SymbolPropertyEntry : public HashtableEntry { friend class VMStructs; private: intptr_t _symbol_mode; // secondary key @@ -248,11 +248,11 @@ void set_property_data(address p) { _property_data = p; } SymbolPropertyEntry* next() const { - return (SymbolPropertyEntry*)HashtableEntry::next(); + return (SymbolPropertyEntry*)HashtableEntry::next(); } SymbolPropertyEntry** next_addr() { - return (SymbolPropertyEntry**)HashtableEntry::next_addr(); + return (SymbolPropertyEntry**)HashtableEntry::next_addr(); } oop* property_oop_addr() { return &_property_oop; } @@ -278,16 +278,16 @@ // A system-internal mapping of symbols to pointers, both managed // and unmanaged. Used to record the auto-generation of each method // MethodHandle.invoke(S)T, for all signatures (S)T. -class SymbolPropertyTable : public Hashtable { +class SymbolPropertyTable : public Hashtable { friend class VMStructs; private: SymbolPropertyEntry* bucket(int i) { - return (SymbolPropertyEntry*) Hashtable::bucket(i); + return (SymbolPropertyEntry*) Hashtable::bucket(i); } // The following method is not MT-safe and must be done under lock. SymbolPropertyEntry** bucket_addr(int i) { - return (SymbolPropertyEntry**) Hashtable::bucket_addr(i); + return (SymbolPropertyEntry**) Hashtable::bucket_addr(i); } void add_entry(int index, SymbolPropertyEntry* new_entry) { @@ -298,7 +298,7 @@ } SymbolPropertyEntry* new_entry(unsigned int hash, Symbol* symbol, intptr_t symbol_mode) { - SymbolPropertyEntry* entry = (SymbolPropertyEntry*) Hashtable::new_entry(hash, symbol); + SymbolPropertyEntry* entry = (SymbolPropertyEntry*) Hashtable::new_entry(hash, symbol); // Hashtable with Symbol* literal must increment and decrement refcount. symbol->increment_refcount(); entry->set_symbol_mode(symbol_mode); @@ -309,17 +309,17 @@ public: SymbolPropertyTable(int table_size); - SymbolPropertyTable(int table_size, HashtableBucket* t, int number_of_entries); + SymbolPropertyTable(int table_size, HashtableBucket* t, int number_of_entries); void free_entry(SymbolPropertyEntry* entry) { // decrement Symbol refcount here because hashtable doesn't. entry->literal()->decrement_refcount(); - Hashtable::free_entry(entry); + Hashtable::free_entry(entry); } unsigned int compute_hash(Symbol* sym, intptr_t symbol_mode) { // Use the regular identity_hash. - return Hashtable::compute_hash(sym) ^ symbol_mode; + return Hashtable::compute_hash(sym) ^ symbol_mode; } int index_for(Symbol* name, intptr_t symbol_mode) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/javaAssertions.cpp --- a/src/share/vm/classfile/javaAssertions.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/javaAssertions.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -58,7 +58,7 @@ // it is never freed, so will be leaked (along with other option strings - // e.g., bootclasspath) if a process creates/destroys multiple VMs. int len = (int)strlen(name); - char *name_copy = NEW_C_HEAP_ARRAY(char, len + 1); + char *name_copy = NEW_C_HEAP_ARRAY(char, len + 1, mtClass); strcpy(name_copy, name); // Figure out which list the new item should go on. Names that end in "..." diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/javaAssertions.hpp --- a/src/share/vm/classfile/javaAssertions.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/javaAssertions.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -68,7 +68,7 @@ static OptionList* _packages; // Options for package trees. }; -class JavaAssertions::OptionList: public CHeapObj { +class JavaAssertions::OptionList: public CHeapObj { public: inline OptionList(const char* name, bool enable, OptionList* next); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/javaClasses.cpp --- a/src/share/vm/classfile/javaClasses.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/javaClasses.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/altHashing.hpp" #include "classfile/javaClasses.hpp" #include "classfile/symbolTable.hpp" #include "classfile/vmSymbols.hpp" @@ -143,7 +144,27 @@ } +int java_lang_String::value_offset = 0; +int java_lang_String::offset_offset = 0; +int java_lang_String::count_offset = 0; +int java_lang_String::hash_offset = 0; + +bool java_lang_String::initialized = false; + +void java_lang_String::compute_offsets() { + assert(!initialized, "offsets should be initialized only once"); + + klassOop k = SystemDictionary::String_klass(); + compute_offset(value_offset, k, vmSymbols::value_name(), vmSymbols::char_array_signature()); + compute_optional_offset(offset_offset, k, vmSymbols::offset_name(), vmSymbols::int_signature()); + compute_optional_offset(count_offset, k, vmSymbols::count_name(), vmSymbols::int_signature()); + compute_optional_offset(hash_offset, k, vmSymbols::hash_name(), vmSymbols::int_signature()); + + initialized = true; +} + Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) { + assert(initialized, "Must be initialized"); // Create the String object first, so there's a chance that the String // and the char array it points to end up in the same cache line. oop obj; @@ -327,13 +348,26 @@ return result; } -unsigned int java_lang_String::hash_string(oop java_string) { +unsigned int java_lang_String::to_hash(oop java_string) { + int length = java_lang_String::length(java_string); + // Zero length string will hash to zero with String.toHash() function. + if (length == 0) return 0; + typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); + return java_lang_String::to_hash(value->char_at_addr(offset), length); +} + +unsigned int java_lang_String::hash_string(oop java_string) { int length = java_lang_String::length(java_string); - - if (length == 0) return 0; - return hash_string(value->char_at_addr(offset), length); + // Zero length string doesn't hash necessarily hash to zero. + if (length == 0) { + return StringTable::hash_string(NULL, 0); + } + + typeArrayOop value = java_lang_String::value(java_string); + int offset = java_lang_String::offset(java_string); + return StringTable::hash_string(value->char_at_addr(offset), length); } Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) { @@ -2704,17 +2738,6 @@ if (k != NULL) { compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature()); } - - // Disallow compilation of CallSite.setTargetNormal and CallSite.setTargetVolatile - // (For C2: keep this until we have throttling logic for uncommon traps.) - if (k != NULL) { - instanceKlass* ik = instanceKlass::cast(k); - methodOop m_normal = ik->lookup_method(vmSymbols::setTargetNormal_name(), vmSymbols::setTarget_signature()); - methodOop m_volatile = ik->lookup_method(vmSymbols::setTargetVolatile_name(), vmSymbols::setTarget_signature()); - guarantee(m_normal != NULL && m_volatile != NULL, "must exist"); - m_normal->set_not_compilable_quietly(); - m_volatile->set_not_compilable_quietly(); - } } @@ -2837,10 +2860,6 @@ -int java_lang_String::value_offset; -int java_lang_String::offset_offset; -int java_lang_String::count_offset; -int java_lang_String::hash_offset; int java_lang_Class::_klass_offset; int java_lang_Class::_array_klass_offset; int java_lang_Class::_resolved_constructor_offset; @@ -2903,7 +2922,6 @@ int java_lang_AssertionStatusDirectives::packageEnabled_offset; int java_lang_AssertionStatusDirectives::deflt_offset; int java_nio_Buffer::_limit_offset; -int sun_misc_AtomicLongCSImpl::_value_offset; int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0; int sun_reflect_ConstantPool::_cp_oop_offset; int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset; @@ -2963,21 +2981,6 @@ compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature()); } -// Support for intrinsification of sun.misc.AtomicLongCSImpl.attemptUpdate -int sun_misc_AtomicLongCSImpl::value_offset() { - assert(SystemDictionary::AtomicLongCSImpl_klass() != NULL, "can't call this"); - return _value_offset; -} - - -void sun_misc_AtomicLongCSImpl::compute_offsets() { - klassOop k = SystemDictionary::AtomicLongCSImpl_klass(); - // If this class is not present, its value field offset won't be referenced. - if (k != NULL) { - compute_offset(_value_offset, k, vmSymbols::value_name(), vmSymbols::long_signature()); - } -} - void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) { if (_owner_offset != 0) return; @@ -3000,12 +3003,6 @@ const int x = heapOopSize; const int header = instanceOopDesc::base_offset_in_bytes(); - // Do the String Class - java_lang_String::value_offset = java_lang_String::hc_value_offset * x + header; - java_lang_String::offset_offset = java_lang_String::hc_offset_offset * x + header; - java_lang_String::count_offset = java_lang_String::offset_offset + sizeof (jint); - java_lang_String::hash_offset = java_lang_String::count_offset + sizeof (jint); - // Throwable Class java_lang_Throwable::backtrace_offset = java_lang_Throwable::hc_backtrace_offset * x + header; java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header; @@ -3088,7 +3085,6 @@ sun_reflect_ConstantPool::compute_offsets(); sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets(); } - sun_misc_AtomicLongCSImpl::compute_offsets(); // generated interpreter code wants to know about the offsets we just computed: AbstractAssembler::update_delayed_values(); @@ -3200,9 +3196,13 @@ // java.lang.String CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C"); - CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I"); - CHECK_OFFSET("java/lang/String", java_lang_String, count, "I"); - CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); + if (java_lang_String::has_offset_field()) { + CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I"); + CHECK_OFFSET("java/lang/String", java_lang_String, count, "I"); + } + if (java_lang_String::has_hash_field()) { + CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); + } // java.lang.Class diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/javaClasses.hpp --- a/src/share/vm/classfile/javaClasses.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/javaClasses.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,26 +52,36 @@ class java_lang_String : AllStatic { private: - enum { - hc_value_offset = 0, - hc_offset_offset = 1 - //hc_count_offset = 2 -- not a word-scaled offset - //hc_hash_offset = 3 -- not a word-scaled offset - }; - static int value_offset; static int offset_offset; static int count_offset; static int hash_offset; + static bool initialized; + static Handle basic_create(int length, bool tenured, TRAPS); static Handle basic_create_from_unicode(jchar* unicode, int length, bool tenured, TRAPS); - static void set_value( oop string, typeArrayOop buffer) { string->obj_field_put(value_offset, (oop)buffer); } - static void set_offset(oop string, int offset) { string->int_field_put(offset_offset, offset); } - static void set_count( oop string, int count) { string->int_field_put(count_offset, count); } + static void set_value( oop string, typeArrayOop buffer) { + assert(initialized, "Must be initialized"); + string->obj_field_put(value_offset, (oop)buffer); + } + static void set_offset(oop string, int offset) { + assert(initialized, "Must be initialized"); + if (offset_offset > 0) { + string->int_field_put(offset_offset, offset); + } + } + static void set_count( oop string, int count) { + assert(initialized, "Must be initialized"); + if (count_offset > 0) { + string->int_field_put(count_offset, count); + } + } public: + static void compute_offsets(); + // Instance creation static Handle create_from_unicode(jchar* unicode, int len, TRAPS); static Handle create_tenured_from_unicode(jchar* unicode, int len, TRAPS); @@ -82,23 +92,61 @@ static Handle create_from_platform_dependent_str(const char* str, TRAPS); static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS); - static int value_offset_in_bytes() { return value_offset; } - static int count_offset_in_bytes() { return count_offset; } - static int offset_offset_in_bytes() { return offset_offset; } - static int hash_offset_in_bytes() { return hash_offset; } + static bool has_offset_field() { + assert(initialized, "Must be initialized"); + return (offset_offset > 0); + } + + static bool has_count_field() { + assert(initialized, "Must be initialized"); + return (count_offset > 0); + } + + static bool has_hash_field() { + assert(initialized, "Must be initialized"); + return (hash_offset > 0); + } + + static int value_offset_in_bytes() { + assert(initialized && (value_offset > 0), "Must be initialized"); + return value_offset; + } + static int count_offset_in_bytes() { + assert(initialized && (count_offset > 0), "Must be initialized"); + return count_offset; + } + static int offset_offset_in_bytes() { + assert(initialized && (offset_offset > 0), "Must be initialized"); + return offset_offset; + } + static int hash_offset_in_bytes() { + assert(initialized && (hash_offset > 0), "Must be initialized"); + return hash_offset; + } // Accessors static typeArrayOop value(oop java_string) { + assert(initialized && (value_offset > 0), "Must be initialized"); assert(is_instance(java_string), "must be java_string"); return (typeArrayOop) java_string->obj_field(value_offset); } static int offset(oop java_string) { + assert(initialized, "Must be initialized"); assert(is_instance(java_string), "must be java_string"); - return java_string->int_field(offset_offset); + if (offset_offset > 0) { + return java_string->int_field(offset_offset); + } else { + return 0; + } } static int length(oop java_string) { + assert(initialized, "Must be initialized"); assert(is_instance(java_string), "must be java_string"); - return java_string->int_field(count_offset); + if (count_offset > 0) { + return java_string->int_field(count_offset); + } else { + return ((typeArrayOop)java_string->obj_field(value_offset))->length(); + } } static int utf8_length(oop java_string); @@ -110,20 +158,16 @@ static jchar* as_unicode_string(oop java_string, int& length); // Compute the hash value for a java.lang.String object which would - // contain the characters passed in. This hash value is used for at - // least two purposes. - // - // (a) As the hash value used by the StringTable for bucket selection - // and comparison (stored in the HashtableEntry structures). This - // is used in the String.intern() method. + // contain the characters passed in. // - // (b) As the hash value used by the String object itself, in - // String.hashCode(). This value is normally calculate in Java code - // in the String.hashCode method(), but is precomputed for String - // objects in the shared archive file. + // As the hash value used by the String object itself, in + // String.hashCode(). This value is normally calculated in Java code + // in the String.hashCode method(), but is precomputed for String + // objects in the shared archive file. + // hash P(31) from Kernighan & Ritchie // - // For this reason, THIS ALGORITHM MUST MATCH String.hashCode(). - static unsigned int hash_string(jchar* s, int len) { + // For this reason, THIS ALGORITHM MUST MATCH String.toHash(). + template static unsigned int to_hash(T* s, int len) { unsigned int h = 0; while (len-- > 0) { h = 31*h + (unsigned int) *s; @@ -131,6 +175,10 @@ } return h; } + static unsigned int to_hash(oop java_string); + + // This is the string hash code used by the StringTable, which may be + // the same as String.toHash or an alternate hash code. static unsigned int hash_string(oop java_string); static bool equals(oop java_string, jchar* chars, int len); @@ -1335,15 +1383,6 @@ static void compute_offsets(); }; -class sun_misc_AtomicLongCSImpl: AllStatic { - private: - static int _value_offset; - - public: - static int value_offset(); - static void compute_offsets(); -}; - class java_util_concurrent_locks_AbstractOwnableSynchronizer : AllStatic { private: static int _owner_offset; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/loaderConstraints.cpp --- a/src/share/vm/classfile/loaderConstraints.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/loaderConstraints.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -31,7 +31,7 @@ #include "utilities/hashtable.inline.hpp" LoaderConstraintTable::LoaderConstraintTable(int nof_buckets) - : Hashtable(nof_buckets, sizeof(LoaderConstraintEntry)) {}; + : Hashtable(nof_buckets, sizeof(LoaderConstraintEntry)) {}; LoaderConstraintEntry* LoaderConstraintTable::new_entry( @@ -39,7 +39,7 @@ klassOop klass, int num_loaders, int max_loaders) { LoaderConstraintEntry* entry; - entry = (LoaderConstraintEntry*)Hashtable::new_entry(hash, klass); + entry = (LoaderConstraintEntry*)Hashtable::new_entry(hash, klass); entry->set_name(name); entry->set_num_loaders(num_loaders); entry->set_max_loaders(max_loaders); @@ -49,7 +49,7 @@ void LoaderConstraintTable::free_entry(LoaderConstraintEntry *entry) { // decrement name refcount before freeing entry->name()->decrement_refcount(); - Hashtable::free_entry(entry); + Hashtable::free_entry(entry); } @@ -164,7 +164,7 @@ // Purge entry *p = probe->next(); - FREE_C_HEAP_ARRAY(oop, probe->loaders()); + FREE_C_HEAP_ARRAY(oop, probe->loaders(), mtClass); free_entry(probe); } else { #ifdef ASSERT @@ -224,7 +224,7 @@ int index = hash_to_index(hash); LoaderConstraintEntry* p; p = new_entry(hash, class_name, klass, 2, 2); - p->set_loaders(NEW_C_HEAP_ARRAY(oop, 2)); + p->set_loaders(NEW_C_HEAP_ARRAY(oop, 2, mtClass)); p->set_loader(0, class_loader1()); p->set_loader(1, class_loader2()); p->set_klass(klass); @@ -340,10 +340,10 @@ int nfree) { if (p->max_loaders() - p->num_loaders() < nfree) { int n = nfree + p->num_loaders(); - oop* new_loaders = NEW_C_HEAP_ARRAY(oop, n); + oop* new_loaders = NEW_C_HEAP_ARRAY(oop, n, mtClass); memcpy(new_loaders, p->loaders(), sizeof(oop) * p->num_loaders()); p->set_max_loaders(n); - FREE_C_HEAP_ARRAY(oop, p->loaders()); + FREE_C_HEAP_ARRAY(oop, p->loaders(), mtClass); p->set_loaders(new_loaders); } } @@ -425,7 +425,7 @@ } *pp2 = p2->next(); - FREE_C_HEAP_ARRAY(oop, p2->loaders()); + FREE_C_HEAP_ARRAY(oop, p2->loaders(), mtClass); free_entry(p2); return; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/loaderConstraints.hpp --- a/src/share/vm/classfile/loaderConstraints.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/loaderConstraints.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -31,7 +31,7 @@ class LoaderConstraintEntry; -class LoaderConstraintTable : public Hashtable { +class LoaderConstraintTable : public Hashtable { friend class VMStructs; private: @@ -53,11 +53,11 @@ void free_entry(LoaderConstraintEntry *entry); LoaderConstraintEntry* bucket(int i) { - return (LoaderConstraintEntry*)Hashtable::bucket(i); + return (LoaderConstraintEntry*)Hashtable::bucket(i); } LoaderConstraintEntry** bucket_addr(int i) { - return (LoaderConstraintEntry**)Hashtable::bucket_addr(i); + return (LoaderConstraintEntry**)Hashtable::bucket_addr(i); } // GC support @@ -94,7 +94,7 @@ #endif }; -class LoaderConstraintEntry : public HashtableEntry { +class LoaderConstraintEntry : public HashtableEntry { friend class VMStructs; private: Symbol* _name; // class name @@ -109,14 +109,14 @@ void set_klass(klassOop k) { set_literal(k); } LoaderConstraintEntry* next() { - return (LoaderConstraintEntry*)HashtableEntry::next(); + return (LoaderConstraintEntry*)HashtableEntry::next(); } LoaderConstraintEntry** next_addr() { - return (LoaderConstraintEntry**)HashtableEntry::next_addr(); + return (LoaderConstraintEntry**)HashtableEntry::next_addr(); } void set_next(LoaderConstraintEntry* next) { - HashtableEntry::set_next(next); + HashtableEntry::set_next(next); } Symbol* name() { return _name; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/placeholders.cpp --- a/src/share/vm/classfile/placeholders.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/placeholders.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ PlaceholderEntry* PlaceholderTable::new_entry(int hash, Symbol* name, oop loader, bool havesupername, Symbol* supername) { - PlaceholderEntry* entry = (PlaceholderEntry*)Hashtable::new_entry(hash, name); + PlaceholderEntry* entry = (PlaceholderEntry*)Hashtable::new_entry(hash, name); // Hashtable with Symbol* literal must increment and decrement refcount. name->increment_refcount(); entry->set_loader(loader); @@ -52,7 +52,7 @@ // decrement Symbol refcount here because Hashtable doesn't. entry->literal()->decrement_refcount(); if (entry->supername() != NULL) entry->supername()->decrement_refcount(); - Hashtable::free_entry(entry); + Hashtable::free_entry(entry); } @@ -166,7 +166,7 @@ } PlaceholderTable::PlaceholderTable(int table_size) - : TwoOopHashtable(table_size, sizeof(PlaceholderEntry)) { + : TwoOopHashtable(table_size, sizeof(PlaceholderEntry)) { } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/placeholders.hpp --- a/src/share/vm/classfile/placeholders.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/placeholders.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ // being loaded, as well as arrays of primitives. // -class PlaceholderTable : public TwoOopHashtable { +class PlaceholderTable : public TwoOopHashtable { friend class VMStructs; public: @@ -44,15 +44,15 @@ void free_entry(PlaceholderEntry* entry); PlaceholderEntry* bucket(int i) { - return (PlaceholderEntry*)Hashtable::bucket(i); + return (PlaceholderEntry*)Hashtable::bucket(i); } PlaceholderEntry** bucket_addr(int i) { - return (PlaceholderEntry**)Hashtable::bucket_addr(i); + return (PlaceholderEntry**)Hashtable::bucket_addr(i); } void add_entry(int index, PlaceholderEntry* new_entry) { - Hashtable::add_entry(index, (HashtableEntry*)new_entry); + Hashtable::add_entry(index, (HashtableEntry*)new_entry); } void add_entry(int index, unsigned int hash, Symbol* name, @@ -116,7 +116,7 @@ // For DEFINE_CLASS, the head of the queue owns the // define token and the rest of the threads wait to return the // result the first thread gets. -class SeenThread: public CHeapObj { +class SeenThread: public CHeapObj { private: Thread *_thread; SeenThread* _stnext; @@ -152,7 +152,7 @@ // on store ordering here. // The system dictionary is the only user of this class. -class PlaceholderEntry : public HashtableEntry { +class PlaceholderEntry : public HashtableEntry { friend class VMStructs; @@ -206,11 +206,11 @@ void set_defineThreadQ(SeenThread* SeenThread) { _defineThreadQ = SeenThread; } PlaceholderEntry* next() const { - return (PlaceholderEntry*)HashtableEntry::next(); + return (PlaceholderEntry*)HashtableEntry::next(); } PlaceholderEntry** next_addr() { - return (PlaceholderEntry**)HashtableEntry::next_addr(); + return (PlaceholderEntry**)HashtableEntry::next_addr(); } // Test for equality diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/resolutionErrors.cpp --- a/src/share/vm/classfile/resolutionErrors.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/resolutionErrors.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -67,7 +67,7 @@ ResolutionErrorEntry* ResolutionErrorTable::new_entry(int hash, constantPoolOop pool, int cp_index, Symbol* error) { - ResolutionErrorEntry* entry = (ResolutionErrorEntry*)Hashtable::new_entry(hash, pool); + ResolutionErrorEntry* entry = (ResolutionErrorEntry*)Hashtable::new_entry(hash, pool); entry->set_cp_index(cp_index); NOT_PRODUCT(entry->set_error(NULL);) entry->set_error(error); @@ -79,13 +79,13 @@ // decrement error refcount assert(entry->error() != NULL, "error should be set"); entry->error()->decrement_refcount(); - Hashtable::free_entry(entry); + Hashtable::free_entry(entry); } // create resolution error table ResolutionErrorTable::ResolutionErrorTable(int table_size) - : Hashtable(table_size, sizeof(ResolutionErrorEntry)) { + : Hashtable(table_size, sizeof(ResolutionErrorEntry)) { } // GC support diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/resolutionErrors.hpp --- a/src/share/vm/classfile/resolutionErrors.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/resolutionErrors.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -33,7 +33,7 @@ // ResolutionError objects are used to record errors encountered during // constant pool resolution (JVMS 5.4.3). -class ResolutionErrorTable : public Hashtable { +class ResolutionErrorTable : public Hashtable { public: ResolutionErrorTable(int table_size); @@ -42,15 +42,16 @@ void free_entry(ResolutionErrorEntry *entry); ResolutionErrorEntry* bucket(int i) { - return (ResolutionErrorEntry*)Hashtable::bucket(i); + return (ResolutionErrorEntry*)Hashtable::bucket(i); } ResolutionErrorEntry** bucket_addr(int i) { - return (ResolutionErrorEntry**)Hashtable::bucket_addr(i); + return (ResolutionErrorEntry**)Hashtable::bucket_addr(i); } void add_entry(int index, ResolutionErrorEntry* new_entry) { - Hashtable::add_entry(index, (HashtableEntry*)new_entry); + Hashtable::add_entry(index, + (HashtableEntry*)new_entry); } void add_entry(int index, unsigned int hash, @@ -74,7 +75,7 @@ }; -class ResolutionErrorEntry : public HashtableEntry { +class ResolutionErrorEntry : public HashtableEntry { private: int _cp_index; Symbol* _error; @@ -90,11 +91,11 @@ void set_error(Symbol* e); ResolutionErrorEntry* next() const { - return (ResolutionErrorEntry*)HashtableEntry::next(); + return (ResolutionErrorEntry*)HashtableEntry::next(); } ResolutionErrorEntry** next_addr() { - return (ResolutionErrorEntry**)HashtableEntry::next_addr(); + return (ResolutionErrorEntry**)HashtableEntry::next_addr(); } // GC support diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/symbolTable.cpp --- a/src/share/vm/classfile/symbolTable.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/symbolTable.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/altHashing.hpp" #include "classfile/javaClasses.hpp" #include "classfile/symbolTable.hpp" #include "classfile/systemDictionary.hpp" @@ -34,19 +35,18 @@ #include "oops/oop.inline2.hpp" #include "runtime/mutexLocker.hpp" #include "utilities/hashtable.inline.hpp" +#include "utilities/numberSeq.hpp" // -------------------------------------------------------------------------- SymbolTable* SymbolTable::_the_table = NULL; // Static arena for symbols that are not deallocated Arena* SymbolTable::_arena = NULL; +bool SymbolTable::_needs_rehashing = false; Symbol* SymbolTable::allocate_symbol(const u1* name, int len, bool c_heap, TRAPS) { - // Don't allow symbols to be created which cannot fit in a Symbol*. - if (len > Symbol::max_length()) { - THROW_MSG_0(vmSymbols::java_lang_InternalError(), - "name is too long to represent"); - } + assert (len <= Symbol::max_length(), "should be checked by caller"); + Symbol* sym; // Allocate symbols in the C heap when dumping shared spaces in case there // are temporary symbols we can remove. @@ -63,9 +63,9 @@ void SymbolTable::initialize_symbols(int arena_alloc_size) { // Initialize the arena for global symbols, size passed in depends on CDS. if (arena_alloc_size == 0) { - _arena = new Arena(); + _arena = new (mtSymbol) Arena(); } else { - _arena = new Arena(arena_alloc_size); + _arena = new (mtSymbol) Arena(arena_alloc_size); } } @@ -73,7 +73,7 @@ void SymbolTable::symbols_do(SymbolClosure *cl) { const int n = the_table()->table_size(); for (int i = 0; i < n; i++) { - for (HashtableEntry* p = the_table()->bucket(i); + for (HashtableEntry* p = the_table()->bucket(i); p != NULL; p = p->next()) { cl->do_symbol(p->literal_addr()); @@ -91,9 +91,14 @@ int total = 0; size_t memory_total = 0; for (int i = 0; i < the_table()->table_size(); ++i) { - for (HashtableEntry** p = the_table()->bucket_addr(i); *p != NULL; ) { - HashtableEntry* entry = *p; - if (entry->is_shared()) { + HashtableEntry** p = the_table()->bucket_addr(i); + HashtableEntry* entry = the_table()->bucket(i); + while (entry != NULL) { + // Shared entries are normally at the end of the bucket and if we run into + // a shared entry, then there is nothing more to remove. However, if we + // have rehashed the table, then the shared entries are no longer at the + // end of the bucket. + if (entry->is_shared() && !use_alternate_hashcode()) { break; } Symbol* s = entry->literal(); @@ -102,6 +107,7 @@ assert(s != NULL, "just checking"); // If reference count is zero, remove. if (s->refcount() == 0) { + assert(!entry->is_shared(), "shared entries should be kept live"); delete s; removed++; *p = entry->next(); @@ -109,6 +115,8 @@ } else { p = entry->next_addr(); } + // get next entry + entry = (HashtableEntry*)HashtableEntry::make_ptr(*p); } } symbols_removed += removed; @@ -121,12 +129,32 @@ } } +// Create a new table and using alternate hash code, populate the new table +// with the existing strings. Set flag to use the alternate hash code afterwards. +void SymbolTable::rehash_table() { + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); + // This should never happen with -Xshare:dump but it might in testing mode. + if (DumpSharedSpaces) return; + // Create a new symbol table + SymbolTable* new_table = new SymbolTable(); + + the_table()->move_to(new_table); + + // Delete the table and buckets (entries are reused in new table). + delete _the_table; + // Don't check if we need rehashing until the table gets unbalanced again. + // Then rehash with a new global seed. + _needs_rehashing = false; + _the_table = new_table; +} // Lookup a symbol in a bucket. Symbol* SymbolTable::lookup(int index, const char* name, int len, unsigned int hash) { - for (HashtableEntry* e = bucket(index); e != NULL; e = e->next()) { + int count = 0; + for (HashtableEntry* e = bucket(index); e != NULL; e = e->next()) { + count++; // count all entries in this bucket, not just ones with same hash if (e->hash() == hash) { Symbol* sym = e->literal(); if (sym->equals(name, len)) { @@ -136,9 +164,20 @@ } } } + // If the bucket size is too deep check if this hash code is insufficient. + if (count >= BasicHashtable::rehash_count && !needs_rehashing()) { + _needs_rehashing = check_rehash_table(count); + } return NULL; } +// Pick hashing algorithm. +unsigned int SymbolTable::hash_symbol(const char* s, int len) { + return use_alternate_hashcode() ? + AltHashing::murmur3_32(seed(), (const jbyte*)s, len) : + java_lang_String::to_hash(s, len); +} + // We take care not to be blocking while holding the // SymbolTable_lock. Otherwise, the system might deadlock, since the @@ -156,6 +195,9 @@ // Found if (s != NULL) return s; + // Grab SymbolTable_lock first. + MutexLocker ml(SymbolTable_lock, THREAD); + // Otherwise, add to symbol to table return the_table()->basic_add(index, (u1*)name, len, hashValue, true, CHECK_NULL); } @@ -193,6 +235,9 @@ // We can't include the code in No_Safepoint_Verifier because of the // ResourceMark. + // Grab SymbolTable_lock first. + MutexLocker ml(SymbolTable_lock, THREAD); + return the_table()->basic_add(index, (u1*)buffer, len, hashValue, true, CHECK_NULL); } @@ -212,7 +257,7 @@ unsigned int hash = hash_symbol((char*)sym->bytes(), sym->utf8_length()); int index = the_table()->hash_to_index(hash); - for (HashtableEntry* e = the_table()->bucket(index); e != NULL; e = e->next()) { + for (HashtableEntry* e = the_table()->bucket(index); e != NULL; e = e->next()) { if (e->hash() == hash) { Symbol* literal_sym = e->literal(); if (sym == literal_sym) { @@ -261,6 +306,9 @@ int names_count, const char** names, int* lengths, int* cp_indices, unsigned int* hashValues, TRAPS) { + // Grab SymbolTable_lock first. + MutexLocker ml(SymbolTable_lock, THREAD); + SymbolTable* table = the_table(); bool added = table->basic_add(class_loader, cp, names_count, names, lengths, cp_indices, hashValues, CHECK); @@ -281,18 +329,39 @@ if (result != NULL) { return result; } + // Grab SymbolTable_lock first. + MutexLocker ml(SymbolTable_lock, THREAD); + SymbolTable* table = the_table(); int index = table->hash_to_index(hash); return table->basic_add(index, (u1*)name, (int)strlen(name), hash, false, THREAD); } -Symbol* SymbolTable::basic_add(int index, u1 *name, int len, - unsigned int hashValue, bool c_heap, TRAPS) { +Symbol* SymbolTable::basic_add(int index_arg, u1 *name, int len, + unsigned int hashValue_arg, bool c_heap, TRAPS) { assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(), "proposed name of symbol must be stable"); - // Grab SymbolTable_lock first. - MutexLocker ml(SymbolTable_lock, THREAD); + // Don't allow symbols to be created which cannot fit in a Symbol*. + if (len > Symbol::max_length()) { + THROW_MSG_0(vmSymbols::java_lang_InternalError(), + "name is too long to represent"); + } + + // Cannot hit a safepoint in this function because the "this" pointer can move. + No_Safepoint_Verifier nsv; + + // Check if the symbol table has been rehashed, if so, need to recalculate + // the hash value and index. + unsigned int hashValue; + int index; + if (use_alternate_hashcode()) { + hashValue = hash_symbol((const char*)name, len); + index = hash_to_index(hashValue); + } else { + hashValue = hashValue_arg; + index = index_arg; + } // Since look-up was done lock-free, we need to check if another // thread beat us in the race to insert the symbol. @@ -307,7 +376,7 @@ Symbol* sym = allocate_symbol(name, len, c_heap, CHECK_NULL); assert(sym->equals((char*)name, len), "symbol must be properly initialized"); - HashtableEntry* entry = new_entry(hashValue, sym); + HashtableEntry* entry = new_entry(hashValue, sym); add_entry(index, entry); return sym; } @@ -328,14 +397,22 @@ } } - // Hold SymbolTable_lock through the symbol creation - MutexLocker ml(SymbolTable_lock, THREAD); + // Cannot hit a safepoint in this function because the "this" pointer can move. + No_Safepoint_Verifier nsv; for (int i=0; iequals(names[i], lengths[i]), "symbol must be properly initialized"); // why wouldn't it be??? - HashtableEntry* entry = new_entry(hashValues[i], sym); + HashtableEntry* entry = new_entry(hashValue, sym); add_entry(index, entry); cp->symbol_at_put(cp_indices[i], sym); } @@ -358,7 +435,7 @@ void SymbolTable::verify() { for (int i = 0; i < the_table()->table_size(); ++i) { - HashtableEntry* p = the_table()->bucket(i); + HashtableEntry* p = the_table()->bucket(i); for ( ; p != NULL; p = p->next()) { Symbol* s = (Symbol*)(p->literal()); guarantee(s != NULL, "symbol is NULL"); @@ -370,6 +447,24 @@ } } +void SymbolTable::dump(outputStream* st) { + NumberSeq summary; + for (int i = 0; i < the_table()->table_size(); ++i) { + int count = 0; + for (HashtableEntry* e = the_table()->bucket(i); + e != NULL; e = e->next()) { + count++; + } + summary.add((double)count); + } + st->print_cr("SymbolTable statistics:"); + st->print_cr("Number of buckets : %7d", summary.num()); + st->print_cr("Average bucket size : %7.0f", summary.avg()); + st->print_cr("Variance of bucket size : %7.0f", summary.variance()); + st->print_cr("Std. dev. of bucket size: %7.0f", summary.sd()); + st->print_cr("Maximum bucket size : %7.0f", summary.maximum()); +} + //--------------------------------------------------------------------------- // Non-product code @@ -393,7 +488,7 @@ int memory_total = 0; int count = 0; for (i = 0; i < the_table()->table_size(); i++) { - HashtableEntry* p = the_table()->bucket(i); + HashtableEntry* p = the_table()->bucket(i); for ( ; p != NULL; p = p->next()) { memory_total += p->literal()->object_size(); count++; @@ -454,21 +549,20 @@ void SymbolTable::print() { for (int i = 0; i < the_table()->table_size(); ++i) { - HashtableEntry** p = the_table()->bucket_addr(i); - HashtableEntry* entry = the_table()->bucket(i); + HashtableEntry** p = the_table()->bucket_addr(i); + HashtableEntry* entry = the_table()->bucket(i); if (entry != NULL) { while (entry != NULL) { tty->print(PTR_FORMAT " ", entry->literal()); entry->literal()->print(); tty->print(" %d", entry->literal()->refcount()); p = entry->next_addr(); - entry = (HashtableEntry*)HashtableEntry::make_ptr(*p); + entry = (HashtableEntry*)HashtableEntry::make_ptr(*p); } tty->cr(); } } } - #endif // PRODUCT // -------------------------------------------------------------------------- @@ -514,21 +608,87 @@ // -------------------------------------------------------------------------- StringTable* StringTable::_the_table = NULL; +bool StringTable::_needs_rehashing = false; + +// Pick hashing algorithm +unsigned int StringTable::hash_string(const jchar* s, int len) { + return use_alternate_hashcode() ? AltHashing::murmur3_32(seed(), s, len) : + java_lang_String::to_hash(s, len); +} + oop StringTable::lookup(int index, jchar* name, int len, unsigned int hash) { - for (HashtableEntry* l = bucket(index); l != NULL; l = l->next()) { + int count = 0; + for (HashtableEntry* l = bucket(index); l != NULL; l = l->next()) { + count++; if (l->hash() == hash) { if (java_lang_String::equals(l->literal(), name, len)) { return l->literal(); } } } + // If the bucket size is too deep check if this hash code is insufficient. + if (count >= BasicHashtable::rehash_count && !needs_rehashing()) { + _needs_rehashing = check_rehash_table(count); + } return NULL; } -oop StringTable::basic_add(int index, Handle string_or_null, jchar* name, - int len, unsigned int hashValue, TRAPS) { +oop StringTable::basic_add(int index_arg, Handle string, jchar* name, + int len, unsigned int hashValue_arg, TRAPS) { + + assert(java_lang_String::equals(string(), name, len), + "string must be properly initialized"); + // Cannot hit a safepoint in this function because the "this" pointer can move. + No_Safepoint_Verifier nsv; + + // Check if the symbol table has been rehashed, if so, need to recalculate + // the hash value and index before second lookup. + unsigned int hashValue; + int index; + if (use_alternate_hashcode()) { + hashValue = hash_string(name, len); + index = hash_to_index(hashValue); + } else { + hashValue = hashValue_arg; + index = index_arg; + } + + // Since look-up was done lock-free, we need to check if another + // thread beat us in the race to insert the symbol. + + oop test = lookup(index, name, len, hashValue); // calls lookup(u1*, int) + if (test != NULL) { + // Entry already added + return test; + } + + HashtableEntry* entry = new_entry(hashValue, string()); + add_entry(index, entry); + return string(); +} + + +oop StringTable::lookup(Symbol* symbol) { + ResourceMark rm; + int length; + jchar* chars = symbol->as_unicode(length); + unsigned int hashValue = hash_string(chars, length); + int index = the_table()->hash_to_index(hashValue); + return the_table()->lookup(index, chars, length, hashValue); +} + + +oop StringTable::intern(Handle string_or_null, jchar* name, + int len, TRAPS) { + unsigned int hashValue = hash_string(name, len); + int index = the_table()->hash_to_index(hashValue); + oop found_string = the_table()->lookup(index, name, len, hashValue); + + // Found + if (found_string != NULL) return found_string; + debug_only(StableMemoryChecker smc(name, len * sizeof(name[0]))); assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(), "proposed name of symbol must be stable"); @@ -541,48 +701,12 @@ string = java_lang_String::create_tenured_from_unicode(name, len, CHECK_NULL); } - // Allocation must be done before grapping the SymbolTable_lock lock + // Grab the StringTable_lock before getting the_table() because it could + // change at safepoint. MutexLocker ml(StringTable_lock, THREAD); - assert(java_lang_String::equals(string(), name, len), - "string must be properly initialized"); - - // Since look-up was done lock-free, we need to check if another - // thread beat us in the race to insert the symbol. - - oop test = lookup(index, name, len, hashValue); // calls lookup(u1*, int) - if (test != NULL) { - // Entry already added - return test; - } - - HashtableEntry* entry = new_entry(hashValue, string()); - add_entry(index, entry); - return string(); -} - - -oop StringTable::lookup(Symbol* symbol) { - ResourceMark rm; - int length; - jchar* chars = symbol->as_unicode(length); - unsigned int hashValue = java_lang_String::hash_string(chars, length); - int index = the_table()->hash_to_index(hashValue); - return the_table()->lookup(index, chars, length, hashValue); -} - - -oop StringTable::intern(Handle string_or_null, jchar* name, - int len, TRAPS) { - unsigned int hashValue = java_lang_String::hash_string(name, len); - int index = the_table()->hash_to_index(hashValue); - oop string = the_table()->lookup(index, name, len, hashValue); - - // Found - if (string != NULL) return string; - // Otherwise, add to symbol to table - return the_table()->basic_add(index, string_or_null, name, len, + return the_table()->basic_add(index, string, name, len, hashValue, CHECK_NULL); } @@ -625,26 +749,32 @@ // entries at a safepoint. assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); for (int i = 0; i < the_table()->table_size(); ++i) { - for (HashtableEntry** p = the_table()->bucket_addr(i); *p != NULL; ) { - HashtableEntry* entry = *p; - if (entry->is_shared()) { + HashtableEntry** p = the_table()->bucket_addr(i); + HashtableEntry* entry = the_table()->bucket(i); + while (entry != NULL) { + // Shared entries are normally at the end of the bucket and if we run into + // a shared entry, then there is nothing more to remove. However, if we + // have rehashed the table, then the shared entries are no longer at the + // end of the bucket. + if (entry->is_shared() && !use_alternate_hashcode()) { break; } assert(entry->literal() != NULL, "just checking"); - if (is_alive->do_object_b(entry->literal())) { + if (entry->is_shared() || is_alive->do_object_b(entry->literal())) { p = entry->next_addr(); } else { *p = entry->next(); the_table()->free_entry(entry); } + entry = (HashtableEntry*)HashtableEntry::make_ptr(*p); } } } void StringTable::oops_do(OopClosure* f) { for (int i = 0; i < the_table()->table_size(); ++i) { - HashtableEntry** p = the_table()->bucket_addr(i); - HashtableEntry* entry = the_table()->bucket(i); + HashtableEntry** p = the_table()->bucket_addr(i); + HashtableEntry* entry = the_table()->bucket(i); while (entry != NULL) { f->do_oop((oop*)entry->literal_addr()); @@ -656,14 +786,14 @@ } else { p = entry->next_addr(); } - entry = (HashtableEntry*)HashtableEntry::make_ptr(*p); + entry = (HashtableEntry*)HashtableEntry::make_ptr(*p); } } } void StringTable::verify() { for (int i = 0; i < the_table()->table_size(); ++i) { - HashtableEntry* p = the_table()->bucket(i); + HashtableEntry* p = the_table()->bucket(i); for ( ; p != NULL; p = p->next()) { oop s = p->literal(); guarantee(s != NULL, "interned string is NULL"); @@ -675,3 +805,41 @@ } } } + +void StringTable::dump(outputStream* st) { + NumberSeq summary; + for (int i = 0; i < the_table()->table_size(); ++i) { + HashtableEntry* p = the_table()->bucket(i); + int count = 0; + for ( ; p != NULL; p = p->next()) { + count++; + } + summary.add((double)count); + } + st->print_cr("StringTable statistics:"); + st->print_cr("Number of buckets : %7d", summary.num()); + st->print_cr("Average bucket size : %7.0f", summary.avg()); + st->print_cr("Variance of bucket size : %7.0f", summary.variance()); + st->print_cr("Std. dev. of bucket size: %7.0f", summary.sd()); + st->print_cr("Maximum bucket size : %7.0f", summary.maximum()); +} + + +// Create a new table and using alternate hash code, populate the new table +// with the existing strings. Set flag to use the alternate hash code afterwards. +void StringTable::rehash_table() { + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); + // This should never happen with -Xshare:dump but it might in testing mode. + if (DumpSharedSpaces) return; + StringTable* new_table = new StringTable(); + + // Rehash the table + the_table()->move_to(new_table); + + // Delete the table and buckets (entries are reused in new table). + delete _the_table; + // Don't check if we need rehashing until the table gets unbalanced again. + // Then rehash with a new global seed. + _needs_rehashing = false; + _the_table = new_table; +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/symbolTable.hpp --- a/src/share/vm/classfile/symbolTable.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/symbolTable.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,6 +40,7 @@ // - symbolTableEntrys are allocated in blocks to reduce the space overhead. class BoolObjectClosure; +class outputStream; // Class to hold a newly created or referenced Symbol* temporarily in scope. @@ -70,7 +71,7 @@ operator Symbol*() { return _temp; } }; -class SymbolTable : public Hashtable { +class SymbolTable : public Hashtable { friend class VMStructs; friend class ClassFileParser; @@ -78,6 +79,9 @@ // The symbol table static SymbolTable* _the_table; + // Set if one bucket is out of balance due to hash algorithm deficiency + static bool _needs_rehashing; + // For statistics static int symbols_removed; static int symbols_counted; @@ -108,10 +112,10 @@ Symbol* lookup(int index, const char* name, int len, unsigned int hash); SymbolTable() - : Hashtable(symbol_table_size, sizeof (HashtableEntry)) {} + : Hashtable(symbol_table_size, sizeof (HashtableEntry)) {} - SymbolTable(HashtableBucket* t, int number_of_entries) - : Hashtable(symbol_table_size, sizeof (HashtableEntry), t, + SymbolTable(HashtableBucket* t, int number_of_entries) + : Hashtable(symbol_table_size, sizeof (HashtableEntry), t, number_of_entries) {} // Arena for permanent symbols (null class loader) that are never unloaded @@ -135,10 +139,10 @@ initialize_symbols(symbol_alloc_arena_size); } - static void create_table(HashtableBucket* t, int length, + static void create_table(HashtableBucket* t, int length, int number_of_entries) { assert(_the_table == NULL, "One symbol table allowed."); - assert(length == symbol_table_size * sizeof(HashtableBucket), + assert(length == symbol_table_size * sizeof(HashtableBucket), "bad shared symbol size."); _the_table = new SymbolTable(t, number_of_entries); // if CDS give symbol table a default arena size since most symbols @@ -146,6 +150,8 @@ initialize_symbols(); } + static unsigned int hash_symbol(const char* s, int len); + static Symbol* lookup(const char* name, int len, TRAPS); // lookup only, won't add. Also calculate hash. static Symbol* lookup_only(const char* name, int len, unsigned int& hash); @@ -208,39 +214,46 @@ // Debugging static void verify(); + static void dump(outputStream* st); // Sharing static void copy_buckets(char** top, char*end) { - the_table()->Hashtable::copy_buckets(top, end); + the_table()->Hashtable::copy_buckets(top, end); } static void copy_table(char** top, char*end) { - the_table()->Hashtable::copy_table(top, end); + the_table()->Hashtable::copy_table(top, end); } static void reverse(void* boundary = NULL) { - the_table()->Hashtable::reverse(boundary); + the_table()->Hashtable::reverse(boundary); } + + // Rehash the symbol table if it gets out of balance + static void rehash_table(); + static bool needs_rehashing() { return _needs_rehashing; } }; -class StringTable : public Hashtable { +class StringTable : public Hashtable { friend class VMStructs; private: // The string table static StringTable* _the_table; + // Set if one bucket is out of balance due to hash algorithm deficiency + static bool _needs_rehashing; + static oop intern(Handle string_or_null, jchar* chars, int length, TRAPS); oop basic_add(int index, Handle string_or_null, jchar* name, int len, unsigned int hashValue, TRAPS); oop lookup(int index, jchar* chars, int length, unsigned int hashValue); - StringTable() : Hashtable((int)StringTableSize, - sizeof (HashtableEntry)) {} + StringTable() : Hashtable((int)StringTableSize, + sizeof (HashtableEntry)) {} - StringTable(HashtableBucket* t, int number_of_entries) - : Hashtable((int)StringTableSize, sizeof (HashtableEntry), t, + StringTable(HashtableBucket* t, int number_of_entries) + : Hashtable((int)StringTableSize, sizeof (HashtableEntry), t, number_of_entries) {} - public: // The string table static StringTable* the_table() { return _the_table; } @@ -250,10 +263,10 @@ _the_table = new StringTable(); } - static void create_table(HashtableBucket* t, int length, + static void create_table(HashtableBucket* t, int length, int number_of_entries) { assert(_the_table == NULL, "One string table allowed."); - assert((size_t)length == StringTableSize * sizeof(HashtableBucket), + assert((size_t)length == StringTableSize * sizeof(HashtableBucket), "bad shared string size."); _the_table = new StringTable(t, number_of_entries); } @@ -265,6 +278,14 @@ // Invoke "f->do_oop" on the locations of all oops in the table. static void oops_do(OopClosure* f); + // Hashing algorithm, used as the hash value used by the + // StringTable for bucket selection and comparison (stored in the + // HashtableEntry structures). This is used in the String.intern() method. + static unsigned int hash_string(const jchar* s, int len); + + // Internal test. + static void test_alt_hash() PRODUCT_RETURN; + // Probing static oop lookup(Symbol* symbol); @@ -275,17 +296,21 @@ // Debugging static void verify(); + static void dump(outputStream* st); // Sharing static void copy_buckets(char** top, char*end) { - the_table()->Hashtable::copy_buckets(top, end); + the_table()->Hashtable::copy_buckets(top, end); } static void copy_table(char** top, char*end) { - the_table()->Hashtable::copy_table(top, end); + the_table()->Hashtable::copy_table(top, end); } static void reverse() { - the_table()->Hashtable::reverse(); + the_table()->Hashtable::reverse(); } + + // Rehash the symbol table if it gets out of balance + static void rehash_table(); + static bool needs_rehashing() { return _needs_rehashing; } }; - #endif // SHARE_VM_CLASSFILE_SYMBOLTABLE_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/systemDictionary.cpp --- a/src/share/vm/classfile/systemDictionary.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/systemDictionary.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1168,9 +1168,9 @@ } -void SystemDictionary::set_shared_dictionary(HashtableBucket* t, int length, +void SystemDictionary::set_shared_dictionary(HashtableBucket* t, int length, int number_of_entries) { - assert(length == _nof_buckets * sizeof(HashtableBucket), + assert(length == _nof_buckets * sizeof(HashtableBucket), "bad shared dictionary size."); _shared_dictionary = new Dictionary(_nof_buckets, t, number_of_entries); } @@ -1971,6 +1971,9 @@ // first do Object, String, Class initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK); + // Calculate offsets for String and Class classes since they are loaded and + // can be used after this point. + java_lang_String::compute_offsets(); java_lang_Class::compute_offsets(); // Fixup mirrors for classes loaded before java.lang.Class. @@ -2760,7 +2763,7 @@ class_size += ik->local_interfaces()->size(); class_size += ik->transitive_interfaces()->size(); // We do not have to count implementors, since we only store one! - class_size += ik->all_fields_count() * FieldInfo::field_slots; + class_size += ik->fields()->length(); } } @@ -2768,7 +2771,6 @@ nmethods++; method_size += m->size(); // class loader uses same objArray for empty vectors, so don't count these - if (m->exception_table()->length() != 0) method_size += m->exception_table()->size(); if (m->has_stackmap_table()) { method_size += m->stackmap_data()->size(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/systemDictionary.hpp --- a/src/share/vm/classfile/systemDictionary.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/systemDictionary.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -32,6 +32,7 @@ #include "runtime/java.hpp" #include "runtime/reflectionUtils.hpp" #include "utilities/hashtable.hpp" +#include "utilities/hashtable.inline.hpp" // The system dictionary stores all loaded classes and maps: // @@ -72,7 +73,7 @@ class Dictionary; class PlaceholderTable; class LoaderConstraintTable; -class HashtableBucket; +template class HashtableBucket; class ResolutionErrorTable; class SymbolPropertyTable; @@ -170,9 +171,6 @@ /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \ template(nio_Buffer_klass, java_nio_Buffer, Opt) \ \ - /* If this class isn't present, it won't be referenced. */ \ - template(AtomicLongCSImpl_klass, sun_misc_AtomicLongCSImpl, Opt) \ - \ template(DownloadManager_klass, sun_jkernel_DownloadManager, Opt_Kernel) \ \ template(PostVMInitHook_klass, sun_misc_PostVMInitHook, Opt) \ @@ -366,7 +364,7 @@ static void copy_buckets(char** top, char* end); static void copy_table(char** top, char* end); static void reverse(); - static void set_shared_dictionary(HashtableBucket* t, int length, + static void set_shared_dictionary(HashtableBucket* t, int length, int number_of_entries); // Printing static void print() PRODUCT_RETURN; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/verifier.cpp --- a/src/share/vm/classfile/verifier.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/verifier.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1368,47 +1368,48 @@ } void ClassVerifier::verify_exception_handler_table(u4 code_length, char* code_data, int& min, int& max, TRAPS) { - typeArrayHandle exhandlers (THREAD, _method->exception_table()); + ExceptionTable exhandlers(_method()); + int exlength = exhandlers.length(); constantPoolHandle cp (THREAD, _method->constants()); - if (exhandlers() != NULL) { - for(int i = 0; i < exhandlers->length();) { - u2 start_pc = exhandlers->int_at(i++); - u2 end_pc = exhandlers->int_at(i++); - u2 handler_pc = exhandlers->int_at(i++); - if (start_pc >= code_length || code_data[start_pc] == 0) { - class_format_error("Illegal exception table start_pc %d", start_pc); + for(int i = 0; i < exlength; i++) { + //reacquire the table in case a GC happened + ExceptionTable exhandlers(_method()); + u2 start_pc = exhandlers.start_pc(i); + u2 end_pc = exhandlers.end_pc(i); + u2 handler_pc = exhandlers.handler_pc(i); + if (start_pc >= code_length || code_data[start_pc] == 0) { + class_format_error("Illegal exception table start_pc %d", start_pc); + return; + } + if (end_pc != code_length) { // special case: end_pc == code_length + if (end_pc > code_length || code_data[end_pc] == 0) { + class_format_error("Illegal exception table end_pc %d", end_pc); return; } - if (end_pc != code_length) { // special case: end_pc == code_length - if (end_pc > code_length || code_data[end_pc] == 0) { - class_format_error("Illegal exception table end_pc %d", end_pc); - return; - } - } - if (handler_pc >= code_length || code_data[handler_pc] == 0) { - class_format_error("Illegal exception table handler_pc %d", handler_pc); + } + if (handler_pc >= code_length || code_data[handler_pc] == 0) { + class_format_error("Illegal exception table handler_pc %d", handler_pc); + return; + } + int catch_type_index = exhandlers.catch_type_index(i); + if (catch_type_index != 0) { + VerificationType catch_type = cp_index_to_type( + catch_type_index, cp, CHECK_VERIFY(this)); + VerificationType throwable = + VerificationType::reference_type(vmSymbols::java_lang_Throwable()); + bool is_subclass = throwable.is_assignable_from( + catch_type, this, CHECK_VERIFY(this)); + if (!is_subclass) { + // 4286534: should throw VerifyError according to recent spec change + verify_error( + "Catch type is not a subclass of Throwable in handler %d", + handler_pc); return; } - int catch_type_index = exhandlers->int_at(i++); - if (catch_type_index != 0) { - VerificationType catch_type = cp_index_to_type( - catch_type_index, cp, CHECK_VERIFY(this)); - VerificationType throwable = - VerificationType::reference_type(vmSymbols::java_lang_Throwable()); - bool is_subclass = throwable.is_assignable_from( - catch_type, this, CHECK_VERIFY(this)); - if (!is_subclass) { - // 4286534: should throw VerifyError according to recent spec change - verify_error( - "Catch type is not a subclass of Throwable in handler %d", - handler_pc); - return; - } - } - if (start_pc < min) min = start_pc; - if (end_pc > max) max = end_pc; } + if (start_pc < min) min = start_pc; + if (end_pc > max) max = end_pc; } } @@ -1474,35 +1475,36 @@ void ClassVerifier::verify_exception_handler_targets(u2 bci, bool this_uninit, StackMapFrame* current_frame, StackMapTable* stackmap_table, TRAPS) { constantPoolHandle cp (THREAD, _method->constants()); - typeArrayHandle exhandlers (THREAD, _method->exception_table()); - if (exhandlers() != NULL) { - for(int i = 0; i < exhandlers->length();) { - u2 start_pc = exhandlers->int_at(i++); - u2 end_pc = exhandlers->int_at(i++); - u2 handler_pc = exhandlers->int_at(i++); - int catch_type_index = exhandlers->int_at(i++); - if(bci >= start_pc && bci < end_pc) { - u1 flags = current_frame->flags(); - if (this_uninit) { flags |= FLAG_THIS_UNINIT; } - StackMapFrame* new_frame = current_frame->frame_in_exception_handler(flags); - if (catch_type_index != 0) { - // We know that this index refers to a subclass of Throwable - VerificationType catch_type = cp_index_to_type( - catch_type_index, cp, CHECK_VERIFY(this)); - new_frame->push_stack(catch_type, CHECK_VERIFY(this)); - } else { - VerificationType throwable = - VerificationType::reference_type(vmSymbols::java_lang_Throwable()); - new_frame->push_stack(throwable, CHECK_VERIFY(this)); - } - bool match = stackmap_table->match_stackmap( - new_frame, handler_pc, true, false, CHECK_VERIFY(this)); - if (!match) { - verify_error(bci, - "Stack map does not match the one at exception handler %d", - handler_pc); - return; - } + ExceptionTable exhandlers(_method()); + int exlength = exhandlers.length(); + for(int i = 0; i < exlength; i++) { + //reacquire the table in case a GC happened + ExceptionTable exhandlers(_method()); + u2 start_pc = exhandlers.start_pc(i); + u2 end_pc = exhandlers.end_pc(i); + u2 handler_pc = exhandlers.handler_pc(i); + int catch_type_index = exhandlers.catch_type_index(i); + if(bci >= start_pc && bci < end_pc) { + u1 flags = current_frame->flags(); + if (this_uninit) { flags |= FLAG_THIS_UNINIT; } + StackMapFrame* new_frame = current_frame->frame_in_exception_handler(flags); + if (catch_type_index != 0) { + // We know that this index refers to a subclass of Throwable + VerificationType catch_type = cp_index_to_type( + catch_type_index, cp, CHECK_VERIFY(this)); + new_frame->push_stack(catch_type, CHECK_VERIFY(this)); + } else { + VerificationType throwable = + VerificationType::reference_type(vmSymbols::java_lang_Throwable()); + new_frame->push_stack(throwable, CHECK_VERIFY(this)); + } + bool match = stackmap_table->match_stackmap( + new_frame, handler_pc, true, false, CHECK_VERIFY(this)); + if (!match) { + verify_error(bci, + "Stack map does not match the one at exception handler %d", + handler_pc); + return; } } } @@ -1738,10 +1740,14 @@ int target = bci + default_offset; stackmap_table->check_jump_target(current_frame, target, CHECK_VERIFY(this)); for (int i = 0; i < keys; i++) { + // Because check_jump_target() may safepoint, the bytecode could have + // moved, which means 'aligned_bcp' is no good and needs to be recalculated. + aligned_bcp = (address)round_to((intptr_t)(bcs->bcp() + 1), jintSize); target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize); stackmap_table->check_jump_target( current_frame, target, CHECK_VERIFY(this)); } + NOT_PRODUCT(aligned_bcp = NULL); // no longer valid at this point } bool ClassVerifier::name_in_supers( diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/classfile/vmSymbols.hpp --- a/src/share/vm/classfile/vmSymbols.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/classfile/vmSymbols.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -111,6 +111,10 @@ template(getBootClassPathEntryForClass_name, "getBootClassPathEntryForClass") \ template(sun_misc_PostVMInitHook, "sun/misc/PostVMInitHook") \ \ + /* Java runtime version access */ \ + template(sun_misc_Version, "sun/misc/Version") \ + template(java_runtime_name_name, "java_runtime_name") \ + \ /* class file format tags */ \ template(tag_source_file, "SourceFile") \ template(tag_inner_classes, "InnerClasses") \ @@ -253,6 +257,7 @@ template(java_lang_invoke_BoundMethodHandle, "java/lang/invoke/BoundMethodHandle") \ template(java_lang_invoke_DirectMethodHandle, "java/lang/invoke/DirectMethodHandle") \ template(java_lang_invoke_CountingMethodHandle, "java/lang/invoke/CountingMethodHandle") \ + template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \ /* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */ \ template(findMethodHandleType_name, "findMethodHandleType") \ template(findMethodHandleType_signature, "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \ @@ -340,6 +345,9 @@ template(park_event_name, "nativeParkEventPointer") \ template(cache_field_name, "cache") \ template(value_name, "value") \ + template(offset_name, "offset") \ + template(count_name, "count") \ + template(hash_name, "hash") \ template(frontCacheEnabled_name, "frontCacheEnabled") \ template(stringCacheEnabled_name, "stringCacheEnabled") \ template(numberOfLeadingZeros_name, "numberOfLeadingZeros") \ @@ -719,15 +727,6 @@ /* java/lang/ref/Reference */ \ do_intrinsic(_Reference_get, java_lang_ref_Reference, get_name, void_object_signature, F_R) \ \ - \ - do_class(sun_misc_AtomicLongCSImpl, "sun/misc/AtomicLongCSImpl") \ - do_intrinsic(_get_AtomicLong, sun_misc_AtomicLongCSImpl, get_name, void_long_signature, F_R) \ - /* (symbols get_name and void_long_signature defined above) */ \ - \ - do_intrinsic(_attemptUpdate, sun_misc_AtomicLongCSImpl, attemptUpdate_name, attemptUpdate_signature, F_R) \ - do_name( attemptUpdate_name, "attemptUpdate") \ - do_signature(attemptUpdate_signature, "(JJ)Z") \ - \ /* support for sun.misc.Unsafe */ \ do_class(sun_misc_Unsafe, "sun/misc/Unsafe") \ \ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/code/codeBlob.cpp --- a/src/share/vm/code/codeBlob.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/code/codeBlob.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -144,7 +144,7 @@ // chunk of memory, its your job to free it. if (p != NULL) { // We need to allocate a chunk big enough to hold the OopMapSet and all of its OopMaps - _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size()); + _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size(), mtCode); p->copy_to((address)_oop_maps); } else { _oop_maps = NULL; @@ -180,7 +180,7 @@ void CodeBlob::flush() { if (_oop_maps) { - FREE_C_HEAP_ARRAY(unsigned char, _oop_maps); + FREE_C_HEAP_ARRAY(unsigned char, _oop_maps, mtCode); _oop_maps = NULL; } _comments.free(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/code/codeCache.cpp --- a/src/share/vm/code/codeCache.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/code/codeCache.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -856,7 +856,7 @@ int bucketSize = 512; int bucketLimit = maxCodeSize / bucketSize + 1; - int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit); + int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit, mtCode); memset(buckets,0,sizeof(int) * bucketLimit); for (cb = first(); cb != NULL; cb = next(cb)) { @@ -893,7 +893,7 @@ } } - FREE_C_HEAP_ARRAY(int, buckets); + FREE_C_HEAP_ARRAY(int, buckets, mtCode); } void CodeCache::print() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/code/codeCache.hpp --- a/src/share/vm/code/codeCache.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/code/codeCache.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -88,6 +88,9 @@ // Lookup that does not fail if you lookup a zombie method (if you call this, be sure to know // what you are doing) static CodeBlob* find_blob_unsafe(void* start) { + // NMT can walk the stack before code cache is created + if (_heap == NULL) return NULL; + CodeBlob* result = (CodeBlob*)_heap->find_start(start); // this assert is too strong because the heap code will return the // heapblock containing start. That block can often be larger than diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/code/nmethod.hpp --- a/src/share/vm/code/nmethod.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/code/nmethod.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -31,7 +31,7 @@ // This class is used internally by nmethods, to cache // exception/pc/handler information. -class ExceptionCache : public CHeapObj { +class ExceptionCache : public CHeapObj { friend class VMStructs; private: enum { cache_size = 16 }; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/code/stubs.hpp --- a/src/share/vm/code/stubs.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/code/stubs.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -101,7 +101,7 @@ // of the concrete stub (see also macro below). There's exactly // one stub interface instance required per stub queue. -class StubInterface: public CHeapObj { +class StubInterface: public CHeapObj { public: // Initialization/finalization virtual void initialize(Stub* self, int size) = 0; // called after creation (called twice if allocated via (request, commit)) @@ -152,7 +152,7 @@ // A StubQueue maintains a queue of stubs. // Note: All sizes (spaces) are given in bytes. -class StubQueue: public CHeapObj { +class StubQueue: public CHeapObj { friend class VMStructs; private: StubInterface* _stub_interface; // the interface prototype diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/code/vmreg.cpp --- a/src/share/vm/code/vmreg.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/code/vmreg.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ #include "code/vmreg.hpp" // First VMReg value that could refer to a stack slot -VMReg VMRegImpl::stack0 = (VMReg)(intptr_t)((ConcreteRegisterImpl::number_of_registers + 1) & ~1); +VMReg VMRegImpl::stack0 = (VMReg)(intptr_t)((ConcreteRegisterImpl::number_of_registers + 7) & ~7); // VMRegs are 4 bytes wide on all platforms const int VMRegImpl::stack_slot_size = 4; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/code/vmreg.hpp --- a/src/share/vm/code/vmreg.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/code/vmreg.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -131,6 +131,10 @@ assert((is_reg() && value() < stack0->value() - 1) || is_stack(), "must be"); return (VMReg)(intptr_t)(value() + 1); } + VMReg next(int i) { + assert((is_reg() && value() < stack0->value() - i) || is_stack(), "must be"); + return (VMReg)(intptr_t)(value() + i); + } VMReg prev() { assert((is_stack() && value() > stack0->value()) || (is_reg() && value() != 0), "must be"); return (VMReg)(intptr_t)(value() - 1); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/compiler/abstractCompiler.hpp --- a/src/share/vm/compiler/abstractCompiler.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/compiler/abstractCompiler.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,7 +29,7 @@ typedef void (*initializer)(void); -class AbstractCompiler : public CHeapObj { +class AbstractCompiler : public CHeapObj { private: bool _is_initialized; // Mark whether compiler object is initialized diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/compiler/compileBroker.cpp --- a/src/share/vm/compiler/compileBroker.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/compiler/compileBroker.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -951,7 +951,7 @@ int compiler_count = c1_compiler_count + c2_compiler_count; _method_threads = - new (ResourceObj::C_HEAP) GrowableArray(compiler_count, true); + new (ResourceObj::C_HEAP, mtCompiler) GrowableArray(compiler_count, true); char name_buffer[256]; for (int i = 0; i < c2_compiler_count; i++) { @@ -1627,7 +1627,7 @@ } fp = fopen(fileBuf, "at"); if (fp != NULL) { - file = NEW_C_HEAP_ARRAY(char, strlen(fileBuf)+1); + file = NEW_C_HEAP_ARRAY(char, strlen(fileBuf)+1, mtCompiler); strcpy(file, fileBuf); break; } @@ -1637,7 +1637,7 @@ } else { if (LogCompilation && Verbose) tty->print_cr("Opening compilation log %s", file); - CompileLog* log = new(ResourceObj::C_HEAP) CompileLog(file, fp, thread_id); + CompileLog* log = new(ResourceObj::C_HEAP, mtCompiler) CompileLog(file, fp, thread_id); thread->init_log(log); if (xtty != NULL) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/compiler/compileBroker.hpp --- a/src/share/vm/compiler/compileBroker.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/compiler/compileBroker.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -36,7 +36,7 @@ // // An entry in the compile queue. It represents a pending or current // compilation. -class CompileTask : public CHeapObj { +class CompileTask : public CHeapObj { friend class VMStructs; private: @@ -131,7 +131,7 @@ // // Per Compiler Performance Counters. // -class CompilerCounters : public CHeapObj { +class CompilerCounters : public CHeapObj { public: enum { @@ -175,7 +175,7 @@ // CompileQueue // // A list of CompileTasks. -class CompileQueue : public CHeapObj { +class CompileQueue : public CHeapObj { private: const char* _name; Monitor* _lock; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/compiler/compileLog.cpp --- a/src/share/vm/compiler/compileLog.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/compiler/compileLog.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -37,14 +37,14 @@ CompileLog::CompileLog(const char* file, FILE* fp, intx thread_id) : _context(_context_buffer, sizeof(_context_buffer)) { - initialize(new(ResourceObj::C_HEAP) fileStream(fp)); + initialize(new(ResourceObj::C_HEAP, mtCompiler) fileStream(fp)); _file = file; _file_end = 0; _thread_id = thread_id; _identities_limit = 0; _identities_capacity = 400; - _identities = NEW_C_HEAP_ARRAY(char, _identities_capacity); + _identities = NEW_C_HEAP_ARRAY(char, _identities_capacity, mtCompiler); // link into the global list { MutexLocker locker(CompileTaskAlloc_lock); @@ -56,7 +56,7 @@ CompileLog::~CompileLog() { delete _out; _out = NULL; - FREE_C_HEAP_ARRAY(char, _identities); + FREE_C_HEAP_ARRAY(char, _identities, mtCompiler); } @@ -109,7 +109,7 @@ if (id >= _identities_capacity) { int new_cap = _identities_capacity * 2; if (new_cap <= id) new_cap = id + 100; - _identities = REALLOC_C_HEAP_ARRAY(char, _identities, new_cap); + _identities = REALLOC_C_HEAP_ARRAY(char, _identities, new_cap, mtCompiler); _identities_capacity = new_cap; } while (id >= _identities_limit) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/compiler/compilerOracle.cpp --- a/src/share/vm/compiler/compilerOracle.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/compiler/compilerOracle.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ #include "runtime/handles.inline.hpp" #include "runtime/jniHandles.hpp" -class MethodMatcher : public CHeapObj { +class MethodMatcher : public CHeapObj { public: enum Mode { Exact, @@ -550,10 +550,12 @@ } } +static const char* default_cc_file = ".hotspot_compiler"; + static const char* cc_file() { #ifdef ASSERT if (CompileCommandFile == NULL) - return ".hotspot_compiler"; + return default_cc_file; #endif return CompileCommandFile; } @@ -636,10 +638,17 @@ CompilerOracle::parse_from_string(CompileOnly, CompilerOracle::parse_compile_only); if (CompilerOracle::has_command_file()) { CompilerOracle::parse_from_file(); + } else { + struct stat buf; + if (os::stat(default_cc_file, &buf) == 0) { + warning("%s file is present but has been ignored. " + "Run with -XX:CompileCommandFile=%s to load the file.", + default_cc_file, default_cc_file); + } } if (lists[PrintCommand] != NULL) { if (PrintAssembly) { - warning("CompileCommand and/or .hotspot_compiler file contains 'print' commands, but PrintAssembly is also enabled"); + warning("CompileCommand and/or %s file contains 'print' commands, but PrintAssembly is also enabled", default_cc_file); } else if (FLAG_IS_DEFAULT(DebugNonSafepoints)) { warning("printing of assembly code is enabled; turning on DebugNonSafepoints to gain additional output"); DebugNonSafepoints = true; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/compiler/oopMap.cpp --- a/src/share/vm/compiler/oopMap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/compiler/oopMap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -599,7 +599,7 @@ #ifdef COMPILER2 -class DerivedPointerEntry : public CHeapObj { +class DerivedPointerEntry : public CHeapObj { private: oop* _location; // Location of derived pointer (also pointing to the base) intptr_t _offset; // Offset from base pointer @@ -621,7 +621,7 @@ assert (!_active, "should not be active"); assert(_list == NULL || _list->length() == 0, "table not empty"); if (_list == NULL) { - _list = new (ResourceObj::C_HEAP) GrowableArray(10, true); // Allocated on C heap + _list = new (ResourceObj::C_HEAP, mtCompiler) GrowableArray(10, true); // Allocated on C heap } _active = true; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp --- a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -58,8 +58,11 @@ void CompactibleFreeListSpace::set_cms_values() { // Set CMS global values assert(MinChunkSize == 0, "already set"); - #define numQuanta(x,y) ((x+y-1)/y) - MinChunkSize = numQuanta(sizeof(FreeChunk), MinObjAlignmentInBytes) * MinObjAlignment; + + // MinChunkSize should be a multiple of MinObjAlignment and be large enough + // for chunks to contain a FreeChunk. + size_t min_chunk_size_in_bytes = align_size_up(sizeof(FreeChunk), MinObjAlignmentInBytes); + MinChunkSize = min_chunk_size_in_bytes / BytesPerWord; assert(IndexSetStart == 0 && IndexSetStride == 0, "already set"); IndexSetStart = MinChunkSize; @@ -2534,12 +2537,8 @@ " linear allocation buffers"); assert(BinaryTreeDictionary::min_tree_chunk_size*HeapWordSize == sizeof(TreeChunk), "else MIN_TREE_CHUNK_SIZE is wrong"); - assert((IndexSetStride == 2 && IndexSetStart == 4) || // 32-bit - (IndexSetStride == 1 && IndexSetStart == 3), "just checking"); // 64-bit - assert((IndexSetStride != 2) || (IndexSetStart % 2 == 0), - "Some for-loops may be incorrectly initialized"); - assert((IndexSetStride != 2) || (IndexSetSize % 2 == 1), - "For-loops that iterate over IndexSet with stride 2 may be wrong"); + assert(IndexSetStart != 0, "IndexSetStart not initialized"); + assert(IndexSetStride != 0, "IndexSetStride not initialized"); } #endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp --- a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -617,7 +617,7 @@ // A parallel-GC-thread-local allocation buffer for allocation into a // CompactibleFreeListSpace. -class CFLS_LAB : public CHeapObj { +class CFLS_LAB : public CHeapObj { // The space that this buffer allocates into. CompactibleFreeListSpace* _cfls; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp --- a/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -174,7 +174,7 @@ // This struct contains per-thread things necessary to support parallel // young-gen collection. -class CMSParGCThreadState: public CHeapObj { +class CMSParGCThreadState: public CHeapObj { public: CFLS_LAB lab; PromotionInfo promo; @@ -229,7 +229,7 @@ if (CollectedHeap::use_parallel_gc_threads()) { typedef CMSParGCThreadState* CMSParGCThreadStatePtr; _par_gc_thread_states = - NEW_C_HEAP_ARRAY(CMSParGCThreadStatePtr, ParallelGCThreads); + NEW_C_HEAP_ARRAY(CMSParGCThreadStatePtr, ParallelGCThreads, mtGC); if (_par_gc_thread_states == NULL) { vm_exit_during_initialization("Could not allocate par gc structs"); } @@ -687,7 +687,7 @@ warning("task_queues allocation failure."); return; } - _hash_seed = NEW_C_HEAP_ARRAY(int, num_queues); + _hash_seed = NEW_C_HEAP_ARRAY(int, num_queues, mtGC); if (_hash_seed == NULL) { warning("_hash_seed array allocation failure"); return; @@ -737,7 +737,7 @@ assert(_young_gen != NULL, "no _young_gen"); _eden_chunk_index = 0; _eden_chunk_capacity = (_young_gen->max_capacity()+CMSSamplingGrain)/CMSSamplingGrain; - _eden_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, _eden_chunk_capacity); + _eden_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, _eden_chunk_capacity, mtGC); if (_eden_chunk_array == NULL) { _eden_chunk_capacity = 0; warning("GC/CMS: _eden_chunk_array allocation failure"); @@ -750,35 +750,35 @@ const size_t max_plab_samples = ((DefNewGeneration*)_young_gen)->max_survivor_size()/MinTLABSize; - _survivor_plab_array = NEW_C_HEAP_ARRAY(ChunkArray, ParallelGCThreads); - _survivor_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, 2*max_plab_samples); - _cursor = NEW_C_HEAP_ARRAY(size_t, ParallelGCThreads); + _survivor_plab_array = NEW_C_HEAP_ARRAY(ChunkArray, ParallelGCThreads, mtGC); + _survivor_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, 2*max_plab_samples, mtGC); + _cursor = NEW_C_HEAP_ARRAY(size_t, ParallelGCThreads, mtGC); if (_survivor_plab_array == NULL || _survivor_chunk_array == NULL || _cursor == NULL) { warning("Failed to allocate survivor plab/chunk array"); if (_survivor_plab_array != NULL) { - FREE_C_HEAP_ARRAY(ChunkArray, _survivor_plab_array); + FREE_C_HEAP_ARRAY(ChunkArray, _survivor_plab_array, mtGC); _survivor_plab_array = NULL; } if (_survivor_chunk_array != NULL) { - FREE_C_HEAP_ARRAY(HeapWord*, _survivor_chunk_array); + FREE_C_HEAP_ARRAY(HeapWord*, _survivor_chunk_array, mtGC); _survivor_chunk_array = NULL; } if (_cursor != NULL) { - FREE_C_HEAP_ARRAY(size_t, _cursor); + FREE_C_HEAP_ARRAY(size_t, _cursor, mtGC); _cursor = NULL; } } else { _survivor_chunk_capacity = 2*max_plab_samples; for (uint i = 0; i < ParallelGCThreads; i++) { - HeapWord** vec = NEW_C_HEAP_ARRAY(HeapWord*, max_plab_samples); + HeapWord** vec = NEW_C_HEAP_ARRAY(HeapWord*, max_plab_samples, mtGC); if (vec == NULL) { warning("Failed to allocate survivor plab array"); for (int j = i; j > 0; j--) { - FREE_C_HEAP_ARRAY(HeapWord*, _survivor_plab_array[j-1].array()); + FREE_C_HEAP_ARRAY(HeapWord*, _survivor_plab_array[j-1].array(), mtGC); } - FREE_C_HEAP_ARRAY(ChunkArray, _survivor_plab_array); - FREE_C_HEAP_ARRAY(HeapWord*, _survivor_chunk_array); + FREE_C_HEAP_ARRAY(ChunkArray, _survivor_plab_array, mtGC); + FREE_C_HEAP_ARRAY(HeapWord*, _survivor_chunk_array, mtGC); _survivor_plab_array = NULL; _survivor_chunk_array = NULL; _survivor_chunk_capacity = 0; @@ -6332,10 +6332,10 @@ ) } -void CMSCollector::do_CMS_operation(CMS_op_type op) { +void CMSCollector::do_CMS_operation(CMS_op_type op, GCCause::Cause gc_cause) { gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps); TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); - TraceTime t("GC", PrintGC, !PrintGCDetails, gclog_or_tty); + TraceTime t(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, gclog_or_tty); TraceCollectorStats tcs(counters()); switch (op) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp --- a/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -161,7 +161,7 @@ // Represents a marking stack used by the CMS collector. // Ideally this should be GrowableArray<> just like MSC's marking stack(s). -class CMSMarkStack: public CHeapObj { +class CMSMarkStack: public CHeapObj { // friend class CMSCollector; // to get at expasion stats further below // @@ -265,7 +265,7 @@ // Survivor Chunk Array in support of parallelization of // Survivor Space rescan. -class ChunkArray: public CHeapObj { +class ChunkArray: public CHeapObj { size_t _index; size_t _capacity; size_t _overflows; @@ -506,7 +506,7 @@ }; -class CMSCollector: public CHeapObj { +class CMSCollector: public CHeapObj { friend class VMStructs; friend class ConcurrentMarkSweepThread; friend class ConcurrentMarkSweepGeneration; @@ -553,8 +553,8 @@ // The following array-pair keeps track of mark words // displaced for accomodating overflow list above. // This code will likely be revisited under RFE#4922830. - Stack _preserved_oop_stack; - Stack _preserved_mark_stack; + Stack _preserved_oop_stack; + Stack _preserved_mark_stack; int* _hash_seed; @@ -717,7 +717,7 @@ CMS_op_checkpointRootsFinal }; - void do_CMS_operation(CMS_op_type op); + void do_CMS_operation(CMS_op_type op, GCCause::Cause gc_cause); bool stop_world_and_do(CMS_op_type op); OopTaskQueueSet* task_queues() { return _task_queues; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp --- a/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -146,7 +146,7 @@ VM_CMS_Operation::verify_before_gc(); IsGCActiveMark x; // stop-world GC active - _collector->do_CMS_operation(CMSCollector::CMS_op_checkpointRootsInitial); + _collector->do_CMS_operation(CMSCollector::CMS_op_checkpointRootsInitial, gch->gc_cause()); VM_CMS_Operation::verify_after_gc(); #ifndef USDT2 @@ -178,7 +178,7 @@ VM_CMS_Operation::verify_before_gc(); IsGCActiveMark x; // stop-world GC active - _collector->do_CMS_operation(CMSCollector::CMS_op_checkpointRootsFinal); + _collector->do_CMS_operation(CMSCollector::CMS_op_checkpointRootsFinal, gch->gc_cause()); VM_CMS_Operation::verify_after_gc(); #ifndef USDT2 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/collectionSetChooser.hpp --- a/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -28,7 +28,7 @@ #include "gc_implementation/g1/heapRegion.hpp" #include "utilities/growableArray.hpp" -class CollectionSetChooser: public CHeapObj { +class CollectionSetChooser: public CHeapObj { GrowableArray _regions; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp --- a/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ #include "gc_implementation/g1/concurrentG1RefineThread.hpp" #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" #include "gc_implementation/g1/g1CollectorPolicy.hpp" +#include "gc_implementation/g1/g1GCPhaseTimes.hpp" #include "gc_implementation/g1/g1RemSet.hpp" #include "gc_implementation/g1/heapRegionSeq.inline.hpp" #include "memory/space.inline.hpp" @@ -79,7 +80,7 @@ _n_threads = _n_worker_threads + 1; reset_threshold_step(); - _threads = NEW_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _n_threads); + _threads = NEW_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _n_threads, mtGC); int worker_id_offset = (int)DirtyCardQueueSet::num_par_ids(); ConcurrentG1RefineThread *next = NULL; for (int i = _n_threads - 1; i >= 0; i--) { @@ -157,7 +158,7 @@ _def_use_cache = true; _use_cache = true; _hot_cache_size = (1 << G1ConcRSLogCacheSize); - _hot_cache = NEW_C_HEAP_ARRAY(jbyte*, _hot_cache_size); + _hot_cache = NEW_C_HEAP_ARRAY(jbyte*, _hot_cache_size, mtGC); _n_hot = 0; _hot_cache_idx = 0; @@ -191,18 +192,18 @@ // Please see the comment in allocate_card_count_cache // for why we call os::malloc() and os::free() directly. assert(_card_counts != NULL, "Logic"); - os::free(_card_counts); + os::free(_card_counts, mtGC); assert(_card_epochs != NULL, "Logic"); - os::free(_card_epochs); + os::free(_card_epochs, mtGC); assert(_hot_cache != NULL, "Logic"); - FREE_C_HEAP_ARRAY(jbyte*, _hot_cache); + FREE_C_HEAP_ARRAY(jbyte*, _hot_cache, mtGC); } if (_threads != NULL) { for (int i = 0; i < _n_threads; i++) { delete _threads[i]; } - FREE_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _threads); + FREE_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _threads, mtGC); } } @@ -436,17 +437,17 @@ size_t counts_size = n * sizeof(CardCountCacheEntry); size_t epochs_size = n * sizeof(CardEpochCacheEntry); - *counts = (CardCountCacheEntry*) os::malloc(counts_size); + *counts = (CardCountCacheEntry*) os::malloc(counts_size, mtGC); if (*counts == NULL) { // allocation was unsuccessful return false; } - *epochs = (CardEpochCacheEntry*) os::malloc(epochs_size); + *epochs = (CardEpochCacheEntry*) os::malloc(epochs_size, mtGC); if (*epochs == NULL) { // allocation was unsuccessful - free counts array assert(*counts != NULL, "must be"); - os::free(*counts); + os::free(*counts, mtGC); *counts = NULL; return false; } @@ -479,8 +480,8 @@ // Allocation was successful. // We can just free the old arrays; we're // not interested in preserving the contents - if (_card_counts != NULL) os::free(_card_counts); - if (_card_epochs != NULL) os::free(_card_epochs); + if (_card_counts != NULL) os::free(_card_counts, mtGC); + if (_card_epochs != NULL) os::free(_card_epochs, mtGC); // Cache the size of the arrays and the index that got us there. _n_card_counts = cache_size; @@ -500,11 +501,11 @@ } void ConcurrentG1Refine::clear_and_record_card_counts() { - if (G1ConcRSLogCacheSize == 0) return; + if (G1ConcRSLogCacheSize == 0) { + return; + } -#ifndef PRODUCT double start = os::elapsedTime(); -#endif if (_expand_card_counts) { int new_idx = _cache_size_index + 1; @@ -523,11 +524,8 @@ assert((this_epoch+1) <= max_jint, "to many periods"); // Update epoch _n_periods++; - -#ifndef PRODUCT - double elapsed = os::elapsedTime() - start; - _g1h->g1_policy()->record_cc_clear_time(elapsed * 1000.0); -#endif + double cc_clear_time_ms = (os::elapsedTime() - start) * 1000; + _g1h->g1_policy()->phase_times()->record_cc_clear_time_ms(cc_clear_time_ms); } void ConcurrentG1Refine::print_worker_threads_on(outputStream* st) const { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp --- a/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ class ConcurrentG1RefineThread; class G1RemSet; -class ConcurrentG1Refine: public CHeapObj { +class ConcurrentG1Refine: public CHeapObj { ConcurrentG1RefineThread** _threads; int _n_threads; int _n_worker_threads; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/concurrentMark.cpp --- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -42,6 +42,7 @@ #include "oops/oop.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/java.hpp" +#include "services/memTracker.hpp" // Concurrent marking bit map wrapper @@ -53,6 +54,8 @@ ReservedSpace brs(ReservedSpace::allocation_align_size_up( (_bmWordSize >> (_shifter + LogBitsPerByte)) + 1)); + MemTracker::record_virtual_memory_type((address)brs.base(), mtGC); + guarantee(brs.is_reserved(), "couldn't allocate concurrent marking bit map"); // For now we'll just commit all of the bit map up fromt. // Later on we'll try to be more parsimonious with swap. @@ -161,7 +164,7 @@ {} void CMMarkStack::allocate(size_t size) { - _base = NEW_C_HEAP_ARRAY(oop, size); + _base = NEW_C_HEAP_ARRAY(oop, size, mtGC); if (_base == NULL) { vm_exit_during_initialization("Failed to allocate CM region mark stack"); } @@ -173,7 +176,7 @@ CMMarkStack::~CMMarkStack() { if (_base != NULL) { - FREE_C_HEAP_ARRAY(oop, _base); + FREE_C_HEAP_ARRAY(oop, _base, mtGC); } } @@ -480,11 +483,11 @@ _root_regions.init(_g1h, this); - _tasks = NEW_C_HEAP_ARRAY(CMTask*, _max_task_num); - _accum_task_vtime = NEW_C_HEAP_ARRAY(double, _max_task_num); - - _count_card_bitmaps = NEW_C_HEAP_ARRAY(BitMap, _max_task_num); - _count_marked_bytes = NEW_C_HEAP_ARRAY(size_t*, _max_task_num); + _tasks = NEW_C_HEAP_ARRAY(CMTask*, _max_task_num, mtGC); + _accum_task_vtime = NEW_C_HEAP_ARRAY(double, _max_task_num, mtGC); + + _count_card_bitmaps = NEW_C_HEAP_ARRAY(BitMap, _max_task_num, mtGC); + _count_marked_bytes = NEW_C_HEAP_ARRAY(size_t*, _max_task_num, mtGC); BitMap::idx_t card_bm_size = _card_bm.size(); @@ -496,7 +499,7 @@ _task_queues->register_queue(i, task_queue); _count_card_bitmaps[i] = BitMap(card_bm_size, false); - _count_marked_bytes[i] = NEW_C_HEAP_ARRAY(size_t, (size_t) max_regions); + _count_marked_bytes[i] = NEW_C_HEAP_ARRAY(size_t, (size_t) max_regions, mtGC); _tasks[i] = new CMTask(i, this, _count_marked_bytes[i], @@ -3153,9 +3156,6 @@ _g1h->g1_policy()->record_concurrent_pause(); } cmThread()->yield(); - if (worker_id == 0) { - _g1h->g1_policy()->record_concurrent_pause_end(); - } return true; } else { return false; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/concurrentMark.hpp --- a/src/share/vm/gc_implementation/g1/concurrentMark.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -30,8 +30,8 @@ class G1CollectedHeap; class CMTask; -typedef GenericTaskQueue CMTaskQueue; -typedef GenericTaskQueueSet CMTaskQueueSet; +typedef GenericTaskQueue CMTaskQueue; +typedef GenericTaskQueueSet CMTaskQueueSet; // Closure used by CM during concurrent reference discovery // and reference processing (during remarking) to determine @@ -343,7 +343,7 @@ class ConcurrentMarkThread; -class ConcurrentMark : public CHeapObj { +class ConcurrentMark: public CHeapObj { friend class ConcurrentMarkThread; friend class CMTask; friend class CMBitMapClosure; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp --- a/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -293,7 +293,7 @@ // Java thread is waiting for a full GC to happen (e.g., it // called System.gc() with +ExplicitGCInvokesConcurrent). _sts.join(); - g1h->increment_full_collections_completed(true /* concurrent */); + g1h->increment_old_marking_cycles_completed(true /* concurrent */); _sts.leave(); } assert(_should_terminate, "just checking"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp --- a/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -32,7 +32,7 @@ // A closure class for processing card table entries. Note that we don't // require these closure objects to be stack-allocated. -class CardTableEntryClosure: public CHeapObj { +class CardTableEntryClosure: public CHeapObj { public: // Process the card whose card table entry is "card_ptr". If returns // "false", terminate the iteration early. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp --- a/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -27,6 +27,7 @@ #include "memory/space.hpp" #include "oops/oop.inline.hpp" #include "runtime/java.hpp" +#include "services/memTracker.hpp" ////////////////////////////////////////////////////////////////////// // G1BlockOffsetSharedArray @@ -44,6 +45,9 @@ if (!_vs.initialize(rs, 0)) { vm_exit_during_initialization("Could not reserve enough space for heap offset array"); } + + MemTracker::record_virtual_memory_type((address)rs.base(), mtGC); + _offset_array = (u_char*)_vs.low_boundary(); resize(init_word_size); if (TraceBlockOffsetTable) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp --- a/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -117,7 +117,7 @@ // Here is the shared array type. -class G1BlockOffsetSharedArray: public CHeapObj { +class G1BlockOffsetSharedArray: public CHeapObj { friend class G1BlockOffsetArray; friend class G1BlockOffsetArrayContigSpace; friend class VMStructs; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -33,6 +33,7 @@ #include "gc_implementation/g1/g1CollectorPolicy.hpp" #include "gc_implementation/g1/g1ErgoVerbose.hpp" #include "gc_implementation/g1/g1EvacFailure.hpp" +#include "gc_implementation/g1/g1GCPhaseTimes.hpp" #include "gc_implementation/g1/g1Log.hpp" #include "gc_implementation/g1/g1MarkSweep.hpp" #include "gc_implementation/g1/g1OopClosures.inline.hpp" @@ -952,9 +953,18 @@ } should_try_gc = false; } else { - // Read the GC count while still holding the Heap_lock. - gc_count_before = total_collections(); - should_try_gc = true; + // The GCLocker may not be active but the GCLocker initiated + // GC may not yet have been performed (GCLocker::needs_gc() + // returns true). In this case we do not try this GC and + // wait until the GCLocker initiated GC is performed, and + // then retry the allocation. + if (GC_locker::needs_gc()) { + should_try_gc = false; + } else { + // Read the GC count while still holding the Heap_lock. + gc_count_before = total_collections(); + should_try_gc = true; + } } } @@ -975,6 +985,9 @@ return NULL; } } else { + // The GCLocker is either active or the GCLocker initiated + // GC has not yet been performed. Stall until it is and + // then retry the allocation. GC_locker::stall_until_clear(); } @@ -1054,9 +1067,18 @@ if (GC_locker::is_active_and_needs_gc()) { should_try_gc = false; } else { - // Read the GC count while still holding the Heap_lock. - gc_count_before = total_collections(); - should_try_gc = true; + // The GCLocker may not be active but the GCLocker initiated + // GC may not yet have been performed (GCLocker::needs_gc() + // returns true). In this case we do not try this GC and + // wait until the GCLocker initiated GC is performed, and + // then retry the allocation. + if (GC_locker::needs_gc()) { + should_try_gc = false; + } else { + // Read the GC count while still holding the Heap_lock. + gc_count_before = total_collections(); + should_try_gc = true; + } } } @@ -1081,6 +1103,9 @@ return NULL; } } else { + // The GCLocker is either active or the GCLocker initiated + // GC has not yet been performed. Stall until it is and + // then retry the allocation. GC_locker::stall_until_clear(); } @@ -1252,10 +1277,7 @@ gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps); TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty); - char verbose_str[128]; - sprintf(verbose_str, "Full GC (%s)", GCCause::to_string(gc_cause())); - TraceTime t(verbose_str, G1Log::fine(), true, gclog_or_tty); - + TraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, gclog_or_tty); TraceCollectorStats tcs(g1mm()->full_collection_counters()); TraceMemoryManagerStats tms(true /* fullGC */, gc_cause()); @@ -1278,6 +1300,7 @@ gc_prologue(true); increment_total_collections(true /* full gc */); + increment_old_marking_cycles_started(); size_t g1h_prev_used = used(); assert(used() == recalculate_used(), "Should be equal"); @@ -1471,22 +1494,28 @@ JavaThread::dirty_card_queue_set().abandon_logs(); assert(!G1DeferredRSUpdate || (G1DeferredRSUpdate && (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any"); - } - - _young_list->reset_sampled_info(); - // At this point there should be no regions in the - // entire heap tagged as young. - assert( check_young_list_empty(true /* check_heap */), - "young list should be empty at this point"); - - // Update the number of full collections that have been completed. - increment_full_collections_completed(false /* concurrent */); - - _hrs.verify_optional(); - verify_region_sets_optional(); - - print_heap_after_gc(); - g1mm()->update_sizes(); + + _young_list->reset_sampled_info(); + // At this point there should be no regions in the + // entire heap tagged as young. + assert( check_young_list_empty(true /* check_heap */), + "young list should be empty at this point"); + + // Update the number of full collections that have been completed. + increment_old_marking_cycles_completed(false /* concurrent */); + + _hrs.verify_optional(); + verify_region_sets_optional(); + + print_heap_after_gc(); + + // We must call G1MonitoringSupport::update_sizes() in the same scoping level + // as an active TraceMemoryManagerStats object (i.e. before the destructor for the + // TraceMemoryManagerStats is called) so that the G1 memory pools are updated + // before any GC notifications are raised. + g1mm()->update_sizes(); + } + post_full_gc_dump(); return true; @@ -1867,7 +1896,8 @@ _retained_old_gc_alloc_region(NULL), _expand_heap_after_alloc_failure(true), _surviving_young_words(NULL), - _full_collections_completed(0), + _old_marking_cycles_started(0), + _old_marking_cycles_completed(0), _in_cset_fast_test(NULL), _in_cset_fast_test_base(NULL), _dirty_cards_region_list(NULL), @@ -1887,14 +1917,14 @@ assert(n_rem_sets > 0, "Invariant."); HeapRegionRemSetIterator** iter_arr = - NEW_C_HEAP_ARRAY(HeapRegionRemSetIterator*, n_queues); + NEW_C_HEAP_ARRAY(HeapRegionRemSetIterator*, n_queues, mtGC); for (int i = 0; i < n_queues; i++) { iter_arr[i] = new HeapRegionRemSetIterator(); } _rem_set_iterator = iter_arr; - _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues); - _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(unsigned int, n_queues); + _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC); + _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(unsigned int, n_queues, mtGC); for (int i = 0; i < n_queues; i++) { RefToScanQueue* q = new RefToScanQueue(); @@ -2053,7 +2083,7 @@ _in_cset_fast_test_length = max_regions(); _in_cset_fast_test_base = - NEW_C_HEAP_ARRAY(bool, (size_t) _in_cset_fast_test_length); + NEW_C_HEAP_ARRAY(bool, (size_t) _in_cset_fast_test_length, mtGC); // We're biasing _in_cset_fast_test to avoid subtracting the // beginning of the heap every time we want to index; basically @@ -2245,7 +2275,7 @@ while (dcqs.apply_closure_to_completed_buffer(cl, worker_i, 0, true)) { n_completed_buffers++; } - g1_policy()->record_update_rs_processed_buffers(worker_i, + g1_policy()->phase_times()->record_update_rs_processed_buffers(worker_i, (double) n_completed_buffers); dcqs.clear_n_completed_buffers(); assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!"); @@ -2339,7 +2369,16 @@ } #endif // !PRODUCT -void G1CollectedHeap::increment_full_collections_completed(bool concurrent) { +void G1CollectedHeap::increment_old_marking_cycles_started() { + assert(_old_marking_cycles_started == _old_marking_cycles_completed || + _old_marking_cycles_started == _old_marking_cycles_completed + 1, + err_msg("Wrong marking cycle count (started: %d, completed: %d)", + _old_marking_cycles_started, _old_marking_cycles_completed)); + + _old_marking_cycles_started++; +} + +void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent) { MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag); // We assume that if concurrent == true, then the caller is a @@ -2347,11 +2386,6 @@ // Set. If there's ever a cheap way to check this, we should add an // assert here. - // We have already incremented _total_full_collections at the start - // of the GC, so total_full_collections() represents how many full - // collections have been started. - unsigned int full_collections_started = total_full_collections(); - // Given that this method is called at the end of a Full GC or of a // concurrent cycle, and those can be nested (i.e., a Full GC can // interrupt a concurrent cycle), the number of full collections @@ -2361,21 +2395,21 @@ // This is the case for the inner caller, i.e. a Full GC. assert(concurrent || - (full_collections_started == _full_collections_completed + 1) || - (full_collections_started == _full_collections_completed + 2), - err_msg("for inner caller (Full GC): full_collections_started = %u " - "is inconsistent with _full_collections_completed = %u", - full_collections_started, _full_collections_completed)); + (_old_marking_cycles_started == _old_marking_cycles_completed + 1) || + (_old_marking_cycles_started == _old_marking_cycles_completed + 2), + err_msg("for inner caller (Full GC): _old_marking_cycles_started = %u " + "is inconsistent with _old_marking_cycles_completed = %u", + _old_marking_cycles_started, _old_marking_cycles_completed)); // This is the case for the outer caller, i.e. the concurrent cycle. assert(!concurrent || - (full_collections_started == _full_collections_completed + 1), + (_old_marking_cycles_started == _old_marking_cycles_completed + 1), err_msg("for outer caller (concurrent cycle): " - "full_collections_started = %u " - "is inconsistent with _full_collections_completed = %u", - full_collections_started, _full_collections_completed)); - - _full_collections_completed += 1; + "_old_marking_cycles_started = %u " + "is inconsistent with _old_marking_cycles_completed = %u", + _old_marking_cycles_started, _old_marking_cycles_completed)); + + _old_marking_cycles_completed += 1; // We need to clear the "in_progress" flag in the CM thread before // we wake up any waiters (especially when ExplicitInvokesConcurrent @@ -2411,7 +2445,7 @@ assert_heap_not_locked(); unsigned int gc_count_before; - unsigned int full_gc_count_before; + unsigned int old_marking_count_before; bool retry_gc; do { @@ -2422,7 +2456,7 @@ // Read the GC count while holding the Heap_lock gc_count_before = total_collections(); - full_gc_count_before = total_full_collections(); + old_marking_count_before = _old_marking_cycles_started; } if (should_do_concurrent_full_gc(cause)) { @@ -2437,7 +2471,7 @@ VMThread::execute(&op); if (!op.pause_succeeded()) { - if (full_gc_count_before == total_full_collections()) { + if (old_marking_count_before == _old_marking_cycles_started) { retry_gc = op.should_retry_gc(); } else { // A Full GC happened while we were trying to schedule the @@ -2465,7 +2499,7 @@ VMThread::execute(&op); } else { // Schedule a Full GC. - VM_G1CollectFull op(gc_count_before, full_gc_count_before, cause); + VM_G1CollectFull op(gc_count_before, old_marking_count_before, cause); VMThread::execute(&op); } } @@ -3472,7 +3506,7 @@ G1CollectedHeap::setup_surviving_young_words() { assert(_surviving_young_words == NULL, "pre-condition"); uint array_length = g1_policy()->young_cset_region_length(); - _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length); + _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC); if (_surviving_young_words == NULL) { vm_exit_out_of_memory(sizeof(size_t) * array_length, "Not enough space for young surv words summary."); @@ -3497,7 +3531,7 @@ void G1CollectedHeap::cleanup_surviving_young_words() { guarantee( _surviving_young_words != NULL, "pre-condition" ); - FREE_C_HEAP_ARRAY(size_t, _surviving_young_words); + FREE_C_HEAP_ARRAY(size_t, _surviving_young_words, mtGC); _surviving_young_words = NULL; } @@ -3592,7 +3626,7 @@ if (g1_policy()->during_initial_mark_pause()) { // We are about to start a marking cycle, so we increment the // full collection counter. - increment_total_full_collections(); + increment_old_marking_cycles_started(); } // if the log level is "finer" is on, we'll print long statistics information // in the collector policy code, so let's not print this as the output @@ -3600,12 +3634,10 @@ gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps); TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty); - char verbose_str[128]; - sprintf(verbose_str, "GC pause (%s) (%s)%s", - GCCause::to_string(gc_cause()), - g1_policy()->gcs_are_young() ? "young" : "mixed", - g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : ""); - TraceTime t(verbose_str, G1Log::fine() && !G1Log::finer(), true, gclog_or_tty); + int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ? + workers()->active_workers() : 1); + g1_policy()->phase_times()->note_gc_start(os::elapsedTime(), active_workers, + g1_policy()->gcs_are_young(), g1_policy()->during_initial_mark_pause(), gc_cause()); TraceCollectorStats tcs(g1mm()->incremental_collection_counters()); TraceMemoryManagerStats tms(false /* fullGC */, gc_cause()); @@ -3668,9 +3700,15 @@ // before the start GC event. _hr_printer.start_gc(false /* full */, (size_t) total_collections()); + // This timing is only used by the ergonomics to handle our pause target. + // It is unclear why this should not include the full pause. We will + // investigate this in CR 7178365. + // + // Preserving the old comment here if that helps the investigation: + // // The elapsed time induced by the start time below deliberately elides // the possible verification above. - double start_time_sec = os::elapsedTime(); + double sample_start_time_sec = os::elapsedTime(); size_t start_used_bytes = used(); #if YOUNG_LIST_VERBOSE @@ -3679,7 +3717,7 @@ g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty); #endif // YOUNG_LIST_VERBOSE - g1_policy()->record_collection_pause_start(start_time_sec, + g1_policy()->record_collection_pause_start(sample_start_time_sec, start_used_bytes); double scan_wait_start = os::elapsedTime(); @@ -3688,11 +3726,12 @@ // objects on them have been correctly scanned before we start // moving them during the GC. bool waited = _cm->root_regions()->wait_until_scan_finished(); + double wait_time_ms = 0.0; if (waited) { double scan_wait_end = os::elapsedTime(); - double wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0; - g1_policy()->record_root_region_scan_wait_time(wait_time_ms); + wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0; } + g1_policy()->phase_times()->record_root_region_scan_wait_time(wait_time_ms); #if YOUNG_LIST_VERBOSE gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:"); @@ -3846,12 +3885,16 @@ true /* verify_fingers */); _cm->note_end_of_gc(); - double end_time_sec = os::elapsedTime(); - double pause_time_ms = (end_time_sec - start_time_sec) * MILLIUNITS; - g1_policy()->record_pause_time_ms(pause_time_ms); - int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ? - workers()->active_workers() : 1); - g1_policy()->record_collection_pause_end(active_workers); + // Collect thread local data to allow the ergonomics to use + // the collected information + g1_policy()->phase_times()->collapse_par_times(); + + // This timing is only used by the ergonomics to handle our pause target. + // It is unclear why this should not include the full pause. We will + // investigate this in CR 7178365. + double sample_end_time_sec = os::elapsedTime(); + double pause_time_ms = (sample_end_time_sec - sample_start_time_sec) * MILLIUNITS; + g1_policy()->record_collection_pause_end(pause_time_ms); MemoryService::track_memory_usage(); @@ -3898,9 +3941,6 @@ // RETIRE events are generated before the end GC event. _hr_printer.end_gc(false /* full */, (size_t) total_collections()); - // We have to do this after we decide whether to expand the heap or not. - g1_policy()->print_heap_transition(); - if (mark_in_progress()) { concurrent_mark()->update_g1_committed(); } @@ -3910,32 +3950,32 @@ #endif gc_epilogue(false); - } - - if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) { - gclog_or_tty->print_cr("Stopping after GC #%d", ExitAfterGCNum); - print_tracing_info(); - vm_exit(-1); + + g1_policy()->phase_times()->note_gc_end(os::elapsedTime()); + + // We have to do this after we decide whether to expand the heap or not. + g1_policy()->print_heap_transition(); } - } - - // The closing of the inner scope, immediately above, will complete - // logging at the "fine" level. The record_collection_pause_end() call - // above will complete logging at the "finer" level. - // - // It is not yet to safe, however, to tell the concurrent mark to - // start as we have some optional output below. We don't want the - // output from the concurrent mark thread interfering with this - // logging output either. - - _hrs.verify_optional(); - verify_region_sets_optional(); - - TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats()); - TASKQUEUE_STATS_ONLY(reset_taskqueue_stats()); - - print_heap_after_gc(); - g1mm()->update_sizes(); + + // It is not yet to safe to tell the concurrent mark to + // start as we have some optional output below. We don't want the + // output from the concurrent mark thread interfering with this + // logging output either. + + _hrs.verify_optional(); + verify_region_sets_optional(); + + TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats()); + TASKQUEUE_STATS_ONLY(reset_taskqueue_stats()); + + print_heap_after_gc(); + + // We must call G1MonitoringSupport::update_sizes() in the same scoping level + // as an active TraceMemoryManagerStats object (i.e. before the destructor for the + // TraceMemoryManagerStats is called) so that the G1 memory pools are updated + // before any GC notifications are raised. + g1mm()->update_sizes(); + } if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) && @@ -4043,7 +4083,7 @@ void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) { _drain_in_progress = false; set_evac_failure_closure(cl); - _evac_failure_scan_stack = new (ResourceObj::C_HEAP) GrowableArray(40, true); + _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray(40, true); } void G1CollectedHeap::finalize_for_evac_failure() { @@ -4177,9 +4217,9 @@ if (_objs_with_preserved_marks == NULL) { assert(_preserved_marks_of_objs == NULL, "Both or none."); _objs_with_preserved_marks = - new (ResourceObj::C_HEAP) GrowableArray(40, true); + new (ResourceObj::C_HEAP, mtGC) GrowableArray(40, true); _preserved_marks_of_objs = - new (ResourceObj::C_HEAP) GrowableArray(40, true); + new (ResourceObj::C_HEAP, mtGC) GrowableArray(40, true); } _objs_with_preserved_marks->push(obj); _preserved_marks_of_objs->push(m); @@ -4239,7 +4279,7 @@ uint array_length = PADDING_ELEM_NUM + real_length + PADDING_ELEM_NUM; - _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length); + _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length, mtGC); if (_surviving_young_words_base == NULL) vm_exit_out_of_memory(array_length * sizeof(size_t), "Not enough space for young surv histo."); @@ -4665,7 +4705,7 @@ if (worker_id >= _n_workers) return; // no work needed this round double start_time_ms = os::elapsedTime() * 1000.0; - _g1h->g1_policy()->record_gc_worker_start_time(worker_id, start_time_ms); + _g1h->g1_policy()->phase_times()->record_gc_worker_start_time(worker_id, start_time_ms); { ResourceMark rm; @@ -4714,15 +4754,12 @@ evac.do_void(); double elapsed_ms = (os::elapsedTime()-start)*1000.0; double term_ms = pss.term_time()*1000.0; - _g1h->g1_policy()->record_obj_copy_time(worker_id, elapsed_ms-term_ms); - _g1h->g1_policy()->record_termination(worker_id, term_ms, pss.term_attempts()); + _g1h->g1_policy()->phase_times()->record_obj_copy_time(worker_id, elapsed_ms-term_ms); + _g1h->g1_policy()->phase_times()->record_termination(worker_id, term_ms, pss.term_attempts()); } _g1h->g1_policy()->record_thread_age_table(pss.age_table()); _g1h->update_surviving_young_words(pss.surviving_young_words()+1); - // Clean up any par-expanded rem sets. - HeapRegionRemSet::par_cleanup(); - if (ParallelGCVerbose) { MutexLocker x(stats_lock()); pss.print_termination_stats(worker_id); @@ -4736,7 +4773,7 @@ } double end_time_ms = os::elapsedTime() * 1000.0; - _g1h->g1_policy()->record_gc_worker_end_time(worker_id, end_time_ms); + _g1h->g1_policy()->phase_times()->record_gc_worker_end_time(worker_id, end_time_ms); } }; @@ -4847,15 +4884,15 @@ double ext_roots_end = os::elapsedTime(); - g1_policy()->reset_obj_copy_time(worker_i); + g1_policy()->phase_times()->reset_obj_copy_time(worker_i); double obj_copy_time_sec = buf_scan_perm.closure_app_seconds() + buf_scan_non_heap_roots.closure_app_seconds(); - g1_policy()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0); + g1_policy()->phase_times()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0); double ext_root_time_ms = ((ext_roots_end - ext_roots_start) - obj_copy_time_sec) * 1000.0; - g1_policy()->record_ext_root_scan_time(worker_i, ext_root_time_ms); + g1_policy()->phase_times()->record_ext_root_scan_time(worker_i, ext_root_time_ms); // During conc marking we have to filter the per-thread SATB buffers // to make sure we remove any oops into the CSet (which will show up @@ -4866,7 +4903,7 @@ } } double satb_filtering_ms = (os::elapsedTime() - ext_roots_end) * 1000.0; - g1_policy()->record_satb_filtering_time(worker_i, satb_filtering_ms); + g1_policy()->phase_times()->record_satb_filtering_time(worker_i, satb_filtering_ms); // Now scan the complement of the collection set. if (scan_rs != NULL) { @@ -5366,7 +5403,7 @@ assert(pss.refs()->is_empty(), "both queue and overflow should be empty"); double ref_proc_time = os::elapsedTime() - ref_proc_start; - g1_policy()->record_ref_proc_time(ref_proc_time * 1000.0); + g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0); } // Weak Reference processing during an evacuation pause (part 2). @@ -5403,7 +5440,7 @@ // and could signicantly increase the pause time. double ref_enq_time = os::elapsedTime() - ref_enq_start; - g1_policy()->record_ref_enq_time(ref_enq_time * 1000.0); + g1_policy()->phase_times()->record_ref_enq_time(ref_enq_time * 1000.0); } void G1CollectedHeap::evacuate_collection_set() { @@ -5466,11 +5503,11 @@ } double par_time_ms = (end_par_time_sec - start_par_time_sec) * 1000.0; - g1_policy()->record_par_time(par_time_ms); + g1_policy()->phase_times()->record_par_time(par_time_ms); double code_root_fixup_time_ms = (os::elapsedTime() - end_par_time_sec) * 1000.0; - g1_policy()->record_code_root_fixup_time(code_root_fixup_time_ms); + g1_policy()->phase_times()->record_code_root_fixup_time(code_root_fixup_time_ms); set_par_threads(0); @@ -5502,7 +5539,7 @@ if (evacuation_failed()) { remove_self_forwarding_pointers(); if (G1Log::finer()) { - gclog_or_tty->print(" (to-space overflow)"); + gclog_or_tty->print(" (to-space exhausted)"); } else if (G1Log::fine()) { gclog_or_tty->print("--"); } @@ -5732,7 +5769,7 @@ } double elapsed = os::elapsedTime() - start; - g1_policy()->record_clear_ct_time(elapsed * 1000.0); + g1_policy()->phase_times()->record_clear_ct_time(elapsed * 1000.0); } void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) { @@ -5841,8 +5878,8 @@ NULL /* old_proxy_set */, NULL /* humongous_proxy_set */, false /* par */); - policy->record_young_free_cset_time_ms(young_time_ms); - policy->record_non_young_free_cset_time_ms(non_young_time_ms); + policy->phase_times()->record_young_free_cset_time_ms(young_time_ms); + policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms); } // This routine is similar to the above but does not record diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -62,8 +62,8 @@ class ConcurrentG1Refine; class GenerationCounters; -typedef OverflowTaskQueue RefToScanQueue; -typedef GenericTaskQueueSet RefToScanQueueSet; +typedef OverflowTaskQueue RefToScanQueue; +typedef GenericTaskQueueSet RefToScanQueueSet; typedef int RegionIdx_t; // needs to hold [ 0..max_regions() ) typedef int CardIdx_t; // needs to hold [ 0..CardsPerRegion ) @@ -74,7 +74,7 @@ GCAllocPurposeCount }; -class YoungList : public CHeapObj { +class YoungList : public CHeapObj { private: G1CollectedHeap* _g1h; @@ -359,10 +359,13 @@ // (c) cause == _g1_humongous_allocation bool should_do_concurrent_full_gc(GCCause::Cause cause); - // Keeps track of how many "full collections" (i.e., Full GCs or - // concurrent cycles) we have completed. The number of them we have - // started is maintained in _total_full_collections in CollectedHeap. - volatile unsigned int _full_collections_completed; + // Keeps track of how many "old marking cycles" (i.e., Full GCs or + // concurrent cycles) we have started. + volatile unsigned int _old_marking_cycles_started; + + // Keeps track of how many "old marking cycles" (i.e., Full GCs or + // concurrent cycles) we have completed. + volatile unsigned int _old_marking_cycles_completed; // This is a non-product method that is helpful for testing. It is // called at the end of a GC and artificially expands the heap by @@ -673,8 +676,12 @@ (size_t) _in_cset_fast_test_length * sizeof(bool)); } + // This is called at the start of either a concurrent cycle or a Full + // GC to update the number of old marking cycles started. + void increment_old_marking_cycles_started(); + // This is called at the end of either a concurrent cycle or a Full - // GC to update the number of full collections completed. Those two + // GC to update the number of old marking cycles completed. Those two // can happen in a nested fashion, i.e., we start a concurrent // cycle, a Full GC happens half-way through it which ends first, // and then the cycle notices that a Full GC happened and ends @@ -683,14 +690,14 @@ // false, the caller is the inner caller in the nesting (i.e., the // Full GC). If concurrent is true, the caller is the outer caller // in this nesting (i.e., the concurrent cycle). Further nesting is - // not currently supported. The end of the this call also notifies + // not currently supported. The end of this call also notifies // the FullGCCount_lock in case a Java thread is waiting for a full // GC to happen (e.g., it called System.gc() with // +ExplicitGCInvokesConcurrent). - void increment_full_collections_completed(bool concurrent); + void increment_old_marking_cycles_completed(bool concurrent); - unsigned int full_collections_completed() { - return _full_collections_completed; + unsigned int old_marking_cycles_completed() { + return _old_marking_cycles_completed; } G1HRPrinter* hr_printer() { return &_hr_printer; } @@ -1765,7 +1772,7 @@ G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num); ~G1ParScanThreadState() { - FREE_C_HEAP_ARRAY(size_t, _surviving_young_words_base); + FREE_C_HEAP_ARRAY(size_t, _surviving_young_words_base, mtGC); } RefToScanQueue* refs() { return _refs; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp --- a/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,6 +29,7 @@ #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" #include "gc_implementation/g1/g1CollectorPolicy.hpp" #include "gc_implementation/g1/g1ErgoVerbose.hpp" +#include "gc_implementation/g1/g1GCPhaseTimes.hpp" #include "gc_implementation/g1/g1Log.hpp" #include "gc_implementation/g1/heapRegionRemSet.hpp" #include "gc_implementation/shared/gcPolicyCounters.hpp" @@ -77,88 +78,12 @@ 1.0, 0.7, 0.7, 0.5, 0.5, 0.42, 0.42, 0.30 }; -// Help class for avoiding interleaved logging -class LineBuffer: public StackObj { - -private: - static const int BUFFER_LEN = 1024; - static const int INDENT_CHARS = 3; - char _buffer[BUFFER_LEN]; - int _indent_level; - int _cur; - - void vappend(const char* format, va_list ap) { - int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap); - if (res != -1) { - _cur += res; - } else { - DEBUG_ONLY(warning("buffer too small in LineBuffer");) - _buffer[BUFFER_LEN -1] = 0; - _cur = BUFFER_LEN; // vsnprintf above should not add to _buffer if we are called again - } - } - -public: - explicit LineBuffer(int indent_level): _indent_level(indent_level), _cur(0) { - for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) { - _buffer[_cur] = ' '; - } - } - -#ifndef PRODUCT - ~LineBuffer() { - assert(_cur == _indent_level * INDENT_CHARS, "pending data in buffer - append_and_print_cr() not called?"); - } -#endif - - void append(const char* format, ...) { - va_list ap; - va_start(ap, format); - vappend(format, ap); - va_end(ap); - } - - void append_and_print_cr(const char* format, ...) { - va_list ap; - va_start(ap, format); - vappend(format, ap); - va_end(ap); - gclog_or_tty->print_cr("%s", _buffer); - _cur = _indent_level * INDENT_CHARS; - } -}; - G1CollectorPolicy::G1CollectorPolicy() : _parallel_gc_threads(G1CollectedHeap::use_parallel_gc_threads() ? ParallelGCThreads : 1), _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), - _all_pause_times_ms(new NumberSeq()), _stop_world_start(0.0), - _all_stop_world_times_ms(new NumberSeq()), - _all_yield_times_ms(new NumberSeq()), - - _summary(new Summary()), - - _cur_clear_ct_time_ms(0.0), - _root_region_scan_wait_time_ms(0.0), - - _cur_ref_proc_time_ms(0.0), - _cur_ref_enq_time_ms(0.0), - -#ifndef PRODUCT - _min_clear_cc_time_ms(-1.0), - _max_clear_cc_time_ms(-1.0), - _cur_clear_cc_time_ms(0.0), - _cum_clear_cc_time_ms(0.0), - _num_cc_clears(0L), -#endif - - _aux_num(10), - _all_aux_times_ms(new NumberSeq[_aux_num]), - _cur_aux_start_times_ms(new double[_aux_num]), - _cur_aux_times_ms(new double[_aux_num]), - _cur_aux_times_set(new bool[_aux_num]), _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), @@ -185,8 +110,6 @@ _pause_time_target_ms((double) MaxGCPauseMillis), _gcs_are_young(true), - _young_pause_num(0), - _mixed_pause_num(0), _during_marking(false), _in_marking_window(false), @@ -197,8 +120,6 @@ _recent_avg_pause_time_ratio(0.0), - _all_full_gc_times_ms(new NumberSeq()), - _initiate_conc_mark_if_possible(false), _during_initial_mark_pause(false), _last_young_gc(false), @@ -272,30 +193,9 @@ _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime()); _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0; - _par_last_gc_worker_start_times_ms = new double[_parallel_gc_threads]; - _par_last_ext_root_scan_times_ms = new double[_parallel_gc_threads]; - _par_last_satb_filtering_times_ms = new double[_parallel_gc_threads]; - - _par_last_update_rs_times_ms = new double[_parallel_gc_threads]; - _par_last_update_rs_processed_buffers = new double[_parallel_gc_threads]; - - _par_last_scan_rs_times_ms = new double[_parallel_gc_threads]; - - _par_last_obj_copy_times_ms = new double[_parallel_gc_threads]; + _phase_times = new G1GCPhaseTimes(_parallel_gc_threads); - _par_last_termination_times_ms = new double[_parallel_gc_threads]; - _par_last_termination_attempts = new double[_parallel_gc_threads]; - _par_last_gc_worker_end_times_ms = new double[_parallel_gc_threads]; - _par_last_gc_worker_times_ms = new double[_parallel_gc_threads]; - _par_last_gc_worker_other_times_ms = new double[_parallel_gc_threads]; - - int index; - if (ParallelGCThreads == 0) - index = 0; - else if (ParallelGCThreads > 8) - index = 7; - else - index = ParallelGCThreads - 1; + int index = MIN2(_parallel_gc_threads - 1, 7); _pending_card_diff_seq->add(0.0); _rs_length_diff_seq->add(rs_length_diff_defaults[index]); @@ -839,7 +739,7 @@ #endif // PRODUCT void G1CollectorPolicy::record_full_collection_start() { - _cur_collection_start_sec = os::elapsedTime(); + _full_collection_start_sec = os::elapsedTime(); // Release the future to-space so that it is available for compaction into. _g1->set_full_collection(); } @@ -848,10 +748,10 @@ // Consider this like a collection pause for the purposes of allocation // since last pause. double end_sec = os::elapsedTime(); - double full_gc_time_sec = end_sec - _cur_collection_start_sec; + double full_gc_time_sec = end_sec - _full_collection_start_sec; double full_gc_time_ms = full_gc_time_sec * 1000.0; - _all_full_gc_times_ms->add(full_gc_time_ms); + _trace_gen1_time_data.record_full_collection(full_gc_time_ms); update_recent_gc_times(end_sec, full_gc_time_ms); @@ -884,13 +784,6 @@ void G1CollectorPolicy::record_collection_pause_start(double start_time_sec, size_t start_used) { - if (G1Log::finer()) { - gclog_or_tty->stamp(PrintGCTimeStamps); - gclog_or_tty->print("[GC pause (%s) (%s)", - GCCause::to_string(_g1->gc_cause()), - gcs_are_young() ? "young" : "mixed"); - } - // We only need to do this here as the policy will only be applied // to the GC we're about to start. so, no point is calculating this // every time we calculate / recalculate the target young length. @@ -901,10 +794,10 @@ _g1->used(), _g1->recalculate_used())); double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0; - _all_stop_world_times_ms->add(s_w_t_ms); + _trace_gen0_time_data.record_start_collection(s_w_t_ms); _stop_world_start = 0.0; - _cur_collection_start_sec = start_time_sec; + phase_times()->_cur_collection_start_sec = start_time_sec; _cur_collection_pause_used_at_start_bytes = start_used; _cur_collection_pause_used_regions_at_start = _g1->used_regions(); _pending_cards = _g1->pending_card_num(); @@ -918,35 +811,6 @@ _survivor_bytes_before_gc = young_list->survivor_used_bytes(); _capacity_before_gc = _g1->capacity(); -#ifdef DEBUG - // initialise these to something well known so that we can spot - // if they are not set properly - - for (int i = 0; i < _parallel_gc_threads; ++i) { - _par_last_gc_worker_start_times_ms[i] = -1234.0; - _par_last_ext_root_scan_times_ms[i] = -1234.0; - _par_last_satb_filtering_times_ms[i] = -1234.0; - _par_last_update_rs_times_ms[i] = -1234.0; - _par_last_update_rs_processed_buffers[i] = -1234.0; - _par_last_scan_rs_times_ms[i] = -1234.0; - _par_last_obj_copy_times_ms[i] = -1234.0; - _par_last_termination_times_ms[i] = -1234.0; - _par_last_termination_attempts[i] = -1234.0; - _par_last_gc_worker_end_times_ms[i] = -1234.0; - _par_last_gc_worker_times_ms[i] = -1234.0; - _par_last_gc_worker_other_times_ms[i] = -1234.0; - } -#endif - - for (int i = 0; i < _aux_num; ++i) { - _cur_aux_times_ms[i] = 0.0; - _cur_aux_times_set[i] = false; - } - - // This is initialized to zero here and is set during the evacuation - // pause if we actually waited for the root region scanning to finish. - _root_region_scan_wait_time_ms = 0.0; - _last_gc_was_young = false; // do that for any other surv rate groups @@ -991,134 +855,8 @@ void G1CollectorPolicy::record_concurrent_pause() { if (_stop_world_start > 0.0) { double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0; - _all_yield_times_ms->add(yield_ms); - } -} - -void G1CollectorPolicy::record_concurrent_pause_end() { -} - -template -T sum_of(T* sum_arr, int start, int n, int N) { - T sum = (T)0; - for (int i = 0; i < n; i++) { - int j = (start + i) % N; - sum += sum_arr[j]; - } - return sum; -} - -void G1CollectorPolicy::print_par_stats(int level, - const char* str, - double* data) { - double min = data[0], max = data[0]; - double total = 0.0; - LineBuffer buf(level); - buf.append("[%s (ms):", str); - for (uint i = 0; i < no_of_gc_threads(); ++i) { - double val = data[i]; - if (val < min) - min = val; - if (val > max) - max = val; - total += val; - if (G1Log::finest()) { - buf.append(" %.1lf", val); - } - } - - if (G1Log::finest()) { - buf.append_and_print_cr(""); - } - double avg = total / (double) no_of_gc_threads(); - buf.append_and_print_cr(" Avg: %.1lf Min: %.1lf Max: %.1lf Diff: %.1lf]", - avg, min, max, max - min); -} - -void G1CollectorPolicy::print_par_sizes(int level, - const char* str, - double* data) { - double min = data[0], max = data[0]; - double total = 0.0; - LineBuffer buf(level); - buf.append("[%s :", str); - for (uint i = 0; i < no_of_gc_threads(); ++i) { - double val = data[i]; - if (val < min) - min = val; - if (val > max) - max = val; - total += val; - buf.append(" %d", (int) val); + _trace_gen0_time_data.record_yield_time(yield_ms); } - buf.append_and_print_cr(""); - double avg = total / (double) no_of_gc_threads(); - buf.append_and_print_cr(" Sum: %d, Avg: %d, Min: %d, Max: %d, Diff: %d]", - (int)total, (int)avg, (int)min, (int)max, (int)max - (int)min); -} - -void G1CollectorPolicy::print_stats(int level, - const char* str, - double value) { - LineBuffer(level).append_and_print_cr("[%s: %5.1lf ms]", str, value); -} - -void G1CollectorPolicy::print_stats(int level, - const char* str, - int value) { - LineBuffer(level).append_and_print_cr("[%s: %d]", str, value); -} - -double G1CollectorPolicy::avg_value(double* data) { - if (G1CollectedHeap::use_parallel_gc_threads()) { - double ret = 0.0; - for (uint i = 0; i < no_of_gc_threads(); ++i) { - ret += data[i]; - } - return ret / (double) no_of_gc_threads(); - } else { - return data[0]; - } -} - -double G1CollectorPolicy::max_value(double* data) { - if (G1CollectedHeap::use_parallel_gc_threads()) { - double ret = data[0]; - for (uint i = 1; i < no_of_gc_threads(); ++i) { - if (data[i] > ret) { - ret = data[i]; - } - } - return ret; - } else { - return data[0]; - } -} - -double G1CollectorPolicy::sum_of_values(double* data) { - if (G1CollectedHeap::use_parallel_gc_threads()) { - double sum = 0.0; - for (uint i = 0; i < no_of_gc_threads(); i++) { - sum += data[i]; - } - return sum; - } else { - return data[0]; - } -} - -double G1CollectorPolicy::max_sum(double* data1, double* data2) { - double ret = data1[0] + data2[0]; - - if (G1CollectedHeap::use_parallel_gc_threads()) { - for (uint i = 1; i < no_of_gc_threads(); ++i) { - double data = data1[i] + data2[i]; - if (data > ret) { - ret = data; - } - } - } - return ret; } bool G1CollectorPolicy::need_to_start_conc_mark(const char* source, size_t alloc_word_size) { @@ -1168,10 +906,8 @@ // Anything below that is considered to be zero #define MIN_TIMER_GRANULARITY 0.0000001 -void G1CollectorPolicy::record_collection_pause_end(int no_of_gc_threads) { +void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms) { double end_time_sec = os::elapsedTime(); - double elapsed_ms = _last_pause_time_ms; - bool parallel = G1CollectedHeap::use_parallel_gc_threads(); assert(_cur_collection_pause_used_regions_at_start >= cset_region_length(), "otherwise, the subtraction below does not make sense"); size_t rs_size = @@ -1180,7 +916,6 @@ assert(cur_used_bytes == _g1->recalculate_used(), "It should!"); bool last_pause_included_initial_mark = false; bool update_stats = !_g1->evacuation_failed(); - set_no_of_gc_threads(no_of_gc_threads); #ifndef PRODUCT if (G1YoungSurvRateVerbose) { @@ -1200,24 +935,9 @@ set_initiate_conc_mark_if_possible(); } - _mmu_tracker->add_pause(end_time_sec - elapsed_ms/1000.0, + _mmu_tracker->add_pause(end_time_sec - pause_time_ms/1000.0, end_time_sec, false); - // This assert is exempted when we're doing parallel collection pauses, - // because the fragmentation caused by the parallel GC allocation buffers - // can lead to more memory being used during collection than was used - // before. Best leave this out until the fragmentation problem is fixed. - // Pauses in which evacuation failed can also lead to negative - // collections, since no space is reclaimed from a region containing an - // object whose evacuation failed. - // Further, we're now always doing parallel collection. But I'm still - // leaving this here as a placeholder for a more precise assertion later. - // (DLD, 10/05.) - assert((true || parallel) // Always using GC LABs now. - || _g1->evacuation_failed() - || _cur_collection_pause_used_at_start_bytes >= cur_used_bytes, - "Negative collection"); - size_t freed_bytes = _cur_collection_pause_used_at_start_bytes - cur_used_bytes; size_t surviving_bytes = _collection_set_bytes_used_before - freed_bytes; @@ -1226,87 +946,11 @@ (double)surviving_bytes/ (double)_collection_set_bytes_used_before; - // These values are used to update the summary information that is - // displayed when TraceGen0Time is enabled, and are output as part - // of the "finer" output, in the non-parallel case. - - double ext_root_scan_time = avg_value(_par_last_ext_root_scan_times_ms); - double satb_filtering_time = avg_value(_par_last_satb_filtering_times_ms); - double update_rs_time = avg_value(_par_last_update_rs_times_ms); - double update_rs_processed_buffers = - sum_of_values(_par_last_update_rs_processed_buffers); - double scan_rs_time = avg_value(_par_last_scan_rs_times_ms); - double obj_copy_time = avg_value(_par_last_obj_copy_times_ms); - double termination_time = avg_value(_par_last_termination_times_ms); - - double known_time = ext_root_scan_time + - satb_filtering_time + - update_rs_time + - scan_rs_time + - obj_copy_time; - - double other_time_ms = elapsed_ms; - - // Subtract the root region scanning wait time. It's initialized to - // zero at the start of the pause. - other_time_ms -= _root_region_scan_wait_time_ms; - - if (parallel) { - other_time_ms -= _cur_collection_par_time_ms; - } else { - other_time_ms -= known_time; - } - - // Now subtract the time taken to fix up roots in generated code - other_time_ms -= _cur_collection_code_root_fixup_time_ms; - - // Subtract the time taken to clean the card table from the - // current value of "other time" - other_time_ms -= _cur_clear_ct_time_ms; - - // TraceGen0Time and TraceGen1Time summary info updating. - _all_pause_times_ms->add(elapsed_ms); - if (update_stats) { - _summary->record_total_time_ms(elapsed_ms); - _summary->record_other_time_ms(other_time_ms); - - MainBodySummary* body_summary = _summary->main_body_summary(); - assert(body_summary != NULL, "should not be null!"); - - body_summary->record_root_region_scan_wait_time_ms( - _root_region_scan_wait_time_ms); - body_summary->record_ext_root_scan_time_ms(ext_root_scan_time); - body_summary->record_satb_filtering_time_ms(satb_filtering_time); - body_summary->record_update_rs_time_ms(update_rs_time); - body_summary->record_scan_rs_time_ms(scan_rs_time); - body_summary->record_obj_copy_time_ms(obj_copy_time); - - if (parallel) { - body_summary->record_parallel_time_ms(_cur_collection_par_time_ms); - body_summary->record_termination_time_ms(termination_time); - - double parallel_known_time = known_time + termination_time; - double parallel_other_time = _cur_collection_par_time_ms - parallel_known_time; - body_summary->record_parallel_other_time_ms(parallel_other_time); - } - - body_summary->record_clear_ct_time_ms(_cur_clear_ct_time_ms); - - // We exempt parallel collection from this check because Alloc Buffer - // fragmentation can produce negative collections. Same with evac - // failure. - // Further, we're now always doing parallel collection. But I'm still - // leaving this here as a placeholder for a more precise assertion later. - // (DLD, 10/05. - assert((true || parallel) - || _g1->evacuation_failed() - || surviving_bytes <= _collection_set_bytes_used_before, - "Or else negative collection!"); - + _trace_gen0_time_data.record_end_collection(pause_time_ms, phase_times()); // this is where we update the allocation rate of the application double app_time_ms = - (_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms); + (phase_times()->_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms); if (app_time_ms < MIN_TIMER_GRANULARITY) { // This usually happens due to the timer not having the required // granularity. Some Linuxes are the usual culprits. @@ -1327,7 +971,7 @@ double interval_ms = (end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0; - update_recent_gc_times(end_time_sec, elapsed_ms); + update_recent_gc_times(end_time_sec, pause_time_ms); _recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms; if (recent_avg_pause_time_ratio() < 0.0 || (recent_avg_pause_time_ratio() - 1.0 > 0.0)) { @@ -1354,102 +998,6 @@ } } } - - for (int i = 0; i < _aux_num; ++i) { - if (_cur_aux_times_set[i]) { - _all_aux_times_ms[i].add(_cur_aux_times_ms[i]); - } - } - - if (G1Log::finer()) { - bool print_marking_info = - _g1->mark_in_progress() && !last_pause_included_initial_mark; - - gclog_or_tty->print_cr("%s, %1.8lf secs]", - (last_pause_included_initial_mark) ? " (initial-mark)" : "", - elapsed_ms / 1000.0); - - if (_root_region_scan_wait_time_ms > 0.0) { - print_stats(1, "Root Region Scan Waiting", _root_region_scan_wait_time_ms); - } - if (parallel) { - print_stats(1, "Parallel Time", _cur_collection_par_time_ms); - print_par_stats(2, "GC Worker Start", _par_last_gc_worker_start_times_ms); - print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms); - if (print_marking_info) { - print_par_stats(2, "SATB Filtering", _par_last_satb_filtering_times_ms); - } - print_par_stats(2, "Update RS", _par_last_update_rs_times_ms); - if (G1Log::finest()) { - print_par_sizes(3, "Processed Buffers", _par_last_update_rs_processed_buffers); - } - print_par_stats(2, "Scan RS", _par_last_scan_rs_times_ms); - print_par_stats(2, "Object Copy", _par_last_obj_copy_times_ms); - print_par_stats(2, "Termination", _par_last_termination_times_ms); - if (G1Log::finest()) { - print_par_sizes(3, "Termination Attempts", _par_last_termination_attempts); - } - - for (int i = 0; i < _parallel_gc_threads; i++) { - _par_last_gc_worker_times_ms[i] = _par_last_gc_worker_end_times_ms[i] - - _par_last_gc_worker_start_times_ms[i]; - - double worker_known_time = _par_last_ext_root_scan_times_ms[i] + - _par_last_satb_filtering_times_ms[i] + - _par_last_update_rs_times_ms[i] + - _par_last_scan_rs_times_ms[i] + - _par_last_obj_copy_times_ms[i] + - _par_last_termination_times_ms[i]; - - _par_last_gc_worker_other_times_ms[i] = _par_last_gc_worker_times_ms[i] - - worker_known_time; - } - - print_par_stats(2, "GC Worker Other", _par_last_gc_worker_other_times_ms); - print_par_stats(2, "GC Worker Total", _par_last_gc_worker_times_ms); - print_par_stats(2, "GC Worker End", _par_last_gc_worker_end_times_ms); - } else { - print_stats(1, "Ext Root Scanning", ext_root_scan_time); - if (print_marking_info) { - print_stats(1, "SATB Filtering", satb_filtering_time); - } - print_stats(1, "Update RS", update_rs_time); - if (G1Log::finest()) { - print_stats(2, "Processed Buffers", (int)update_rs_processed_buffers); - } - print_stats(1, "Scan RS", scan_rs_time); - print_stats(1, "Object Copying", obj_copy_time); - } - print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms); - print_stats(1, "Clear CT", _cur_clear_ct_time_ms); -#ifndef PRODUCT - print_stats(1, "Cur Clear CC", _cur_clear_cc_time_ms); - print_stats(1, "Cum Clear CC", _cum_clear_cc_time_ms); - print_stats(1, "Min Clear CC", _min_clear_cc_time_ms); - print_stats(1, "Max Clear CC", _max_clear_cc_time_ms); - if (_num_cc_clears > 0) { - print_stats(1, "Avg Clear CC", _cum_clear_cc_time_ms / ((double)_num_cc_clears)); - } -#endif - print_stats(1, "Other", other_time_ms); - print_stats(2, "Choose CSet", - (_recorded_young_cset_choice_time_ms + - _recorded_non_young_cset_choice_time_ms)); - print_stats(2, "Ref Proc", _cur_ref_proc_time_ms); - print_stats(2, "Ref Enq", _cur_ref_enq_time_ms); - print_stats(2, "Free CSet", - (_recorded_young_free_cset_time_ms + - _recorded_non_young_free_cset_time_ms)); - - for (int i = 0; i < _aux_num; ++i) { - if (_cur_aux_times_set[i]) { - char buffer[96]; - sprintf(buffer, "Aux%d", i); - print_stats(1, buffer, _cur_aux_times_ms[i]); - } - } - } - bool new_in_marking_window = _in_marking_window; bool new_in_marking_window_im = false; if (during_initial_mark_pause()) { @@ -1488,8 +1036,6 @@ // do that for any other surv rate groupsx if (update_stats) { - double pause_time_ms = elapsed_ms; - size_t diff = 0; if (_max_pending_cards >= _pending_cards) { diff = _max_pending_cards - _pending_cards; @@ -1498,7 +1044,7 @@ double cost_per_card_ms = 0.0; if (_pending_cards > 0) { - cost_per_card_ms = update_rs_time / (double) _pending_cards; + cost_per_card_ms = phase_times()->_update_rs_time / (double) _pending_cards; _cost_per_card_ms_seq->add(cost_per_card_ms); } @@ -1506,7 +1052,7 @@ double cost_per_entry_ms = 0.0; if (cards_scanned > 10) { - cost_per_entry_ms = scan_rs_time / (double) cards_scanned; + cost_per_entry_ms = phase_times()->_scan_rs_time / (double) cards_scanned; if (_last_gc_was_young) { _cost_per_entry_ms_seq->add(cost_per_entry_ms); } else { @@ -1546,7 +1092,7 @@ size_t copied_bytes = surviving_bytes; double cost_per_byte_ms = 0.0; if (copied_bytes > 0) { - cost_per_byte_ms = obj_copy_time / (double) copied_bytes; + cost_per_byte_ms = phase_times()->_obj_copy_time / (double) copied_bytes; if (_in_marking_window) { _cost_per_byte_ms_during_cm_seq->add(cost_per_byte_ms); } else { @@ -1555,21 +1101,21 @@ } double all_other_time_ms = pause_time_ms - - (update_rs_time + scan_rs_time + obj_copy_time + termination_time); + (phase_times()->_update_rs_time + phase_times()->_scan_rs_time + phase_times()->_obj_copy_time + phase_times()->_termination_time); double young_other_time_ms = 0.0; if (young_cset_region_length() > 0) { young_other_time_ms = - _recorded_young_cset_choice_time_ms + - _recorded_young_free_cset_time_ms; + phase_times()->_recorded_young_cset_choice_time_ms + + phase_times()->_recorded_young_free_cset_time_ms; _young_other_cost_per_region_ms_seq->add(young_other_time_ms / (double) young_cset_region_length()); } double non_young_other_time_ms = 0.0; if (old_cset_region_length() > 0) { non_young_other_time_ms = - _recorded_non_young_cset_choice_time_ms + - _recorded_non_young_free_cset_time_ms; + phase_times()->_recorded_non_young_cset_choice_time_ms + + phase_times()->_recorded_non_young_free_cset_time_ms; _non_young_other_cost_per_region_ms_seq->add(non_young_other_time_ms / (double) old_cset_region_length()); @@ -1596,14 +1142,14 @@ // Note that _mmu_tracker->max_gc_time() returns the time in seconds. double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0; - adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms); + adjust_concurrent_refinement(phase_times()->_update_rs_time, phase_times()->_update_rs_processed_buffers, update_rs_time_goal_ms); _collectionSetChooser->verify(); } -#define EXT_SIZE_FORMAT "%d%s" +#define EXT_SIZE_FORMAT "%.1f%s" #define EXT_SIZE_PARAMS(bytes) \ - byte_size_in_proper_unit((bytes)), \ + byte_size_in_proper_unit((double)(bytes)), \ proper_unit_for_byte_size((bytes)) void G1CollectorPolicy::print_heap_transition() { @@ -1812,179 +1358,9 @@ _g1->collection_set_iterate(&cs_closure); } -void G1CollectorPolicy::print_summary(int level, - const char* str, - NumberSeq* seq) const { - double sum = seq->sum(); - LineBuffer(level + 1).append_and_print_cr("%-24s = %8.2lf s (avg = %8.2lf ms)", - str, sum / 1000.0, seq->avg()); -} - -void G1CollectorPolicy::print_summary_sd(int level, - const char* str, - NumberSeq* seq) const { - print_summary(level, str, seq); - LineBuffer(level + 6).append_and_print_cr("(num = %5d, std dev = %8.2lf ms, max = %8.2lf ms)", - seq->num(), seq->sd(), seq->maximum()); -} - -void G1CollectorPolicy::check_other_times(int level, - NumberSeq* other_times_ms, - NumberSeq* calc_other_times_ms) const { - bool should_print = false; - LineBuffer buf(level + 2); - - double max_sum = MAX2(fabs(other_times_ms->sum()), - fabs(calc_other_times_ms->sum())); - double min_sum = MIN2(fabs(other_times_ms->sum()), - fabs(calc_other_times_ms->sum())); - double sum_ratio = max_sum / min_sum; - if (sum_ratio > 1.1) { - should_print = true; - buf.append_and_print_cr("## CALCULATED OTHER SUM DOESN'T MATCH RECORDED ###"); - } - - double max_avg = MAX2(fabs(other_times_ms->avg()), - fabs(calc_other_times_ms->avg())); - double min_avg = MIN2(fabs(other_times_ms->avg()), - fabs(calc_other_times_ms->avg())); - double avg_ratio = max_avg / min_avg; - if (avg_ratio > 1.1) { - should_print = true; - buf.append_and_print_cr("## CALCULATED OTHER AVG DOESN'T MATCH RECORDED ###"); - } - - if (other_times_ms->sum() < -0.01) { - buf.append_and_print_cr("## RECORDED OTHER SUM IS NEGATIVE ###"); - } - - if (other_times_ms->avg() < -0.01) { - buf.append_and_print_cr("## RECORDED OTHER AVG IS NEGATIVE ###"); - } - - if (calc_other_times_ms->sum() < -0.01) { - should_print = true; - buf.append_and_print_cr("## CALCULATED OTHER SUM IS NEGATIVE ###"); - } - - if (calc_other_times_ms->avg() < -0.01) { - should_print = true; - buf.append_and_print_cr("## CALCULATED OTHER AVG IS NEGATIVE ###"); - } - - if (should_print) - print_summary(level, "Other(Calc)", calc_other_times_ms); -} - -void G1CollectorPolicy::print_summary(PauseSummary* summary) const { - bool parallel = G1CollectedHeap::use_parallel_gc_threads(); - MainBodySummary* body_summary = summary->main_body_summary(); - if (summary->get_total_seq()->num() > 0) { - print_summary_sd(0, "Evacuation Pauses", summary->get_total_seq()); - if (body_summary != NULL) { - print_summary(1, "Root Region Scan Wait", body_summary->get_root_region_scan_wait_seq()); - if (parallel) { - print_summary(1, "Parallel Time", body_summary->get_parallel_seq()); - print_summary(2, "Ext Root Scanning", body_summary->get_ext_root_scan_seq()); - print_summary(2, "SATB Filtering", body_summary->get_satb_filtering_seq()); - print_summary(2, "Update RS", body_summary->get_update_rs_seq()); - print_summary(2, "Scan RS", body_summary->get_scan_rs_seq()); - print_summary(2, "Object Copy", body_summary->get_obj_copy_seq()); - print_summary(2, "Termination", body_summary->get_termination_seq()); - print_summary(2, "Parallel Other", body_summary->get_parallel_other_seq()); - { - NumberSeq* other_parts[] = { - body_summary->get_ext_root_scan_seq(), - body_summary->get_satb_filtering_seq(), - body_summary->get_update_rs_seq(), - body_summary->get_scan_rs_seq(), - body_summary->get_obj_copy_seq(), - body_summary->get_termination_seq() - }; - NumberSeq calc_other_times_ms(body_summary->get_parallel_seq(), - 6, other_parts); - check_other_times(2, body_summary->get_parallel_other_seq(), - &calc_other_times_ms); - } - } else { - print_summary(1, "Ext Root Scanning", body_summary->get_ext_root_scan_seq()); - print_summary(1, "SATB Filtering", body_summary->get_satb_filtering_seq()); - print_summary(1, "Update RS", body_summary->get_update_rs_seq()); - print_summary(1, "Scan RS", body_summary->get_scan_rs_seq()); - print_summary(1, "Object Copy", body_summary->get_obj_copy_seq()); - } - } - print_summary(1, "Clear CT", body_summary->get_clear_ct_seq()); - print_summary(1, "Other", summary->get_other_seq()); - { - if (body_summary != NULL) { - NumberSeq calc_other_times_ms; - if (parallel) { - // parallel - NumberSeq* other_parts[] = { - body_summary->get_root_region_scan_wait_seq(), - body_summary->get_parallel_seq(), - body_summary->get_clear_ct_seq() - }; - calc_other_times_ms = NumberSeq(summary->get_total_seq(), - 3, other_parts); - } else { - // serial - NumberSeq* other_parts[] = { - body_summary->get_root_region_scan_wait_seq(), - body_summary->get_update_rs_seq(), - body_summary->get_ext_root_scan_seq(), - body_summary->get_satb_filtering_seq(), - body_summary->get_scan_rs_seq(), - body_summary->get_obj_copy_seq() - }; - calc_other_times_ms = NumberSeq(summary->get_total_seq(), - 6, other_parts); - } - check_other_times(1, summary->get_other_seq(), &calc_other_times_ms); - } - } - } else { - LineBuffer(1).append_and_print_cr("none"); - } - LineBuffer(0).append_and_print_cr(""); -} - void G1CollectorPolicy::print_tracing_info() const { - if (TraceGen0Time) { - gclog_or_tty->print_cr("ALL PAUSES"); - print_summary_sd(0, "Total", _all_pause_times_ms); - gclog_or_tty->print_cr(""); - gclog_or_tty->print_cr(""); - gclog_or_tty->print_cr(" Young GC Pauses: %8d", _young_pause_num); - gclog_or_tty->print_cr(" Mixed GC Pauses: %8d", _mixed_pause_num); - gclog_or_tty->print_cr(""); - - gclog_or_tty->print_cr("EVACUATION PAUSES"); - print_summary(_summary); - - gclog_or_tty->print_cr("MISC"); - print_summary_sd(0, "Stop World", _all_stop_world_times_ms); - print_summary_sd(0, "Yields", _all_yield_times_ms); - for (int i = 0; i < _aux_num; ++i) { - if (_all_aux_times_ms[i].num() > 0) { - char buffer[96]; - sprintf(buffer, "Aux%d", i); - print_summary_sd(0, buffer, &_all_aux_times_ms[i]); - } - } - } - if (TraceGen1Time) { - if (_all_full_gc_times_ms->num() > 0) { - gclog_or_tty->print("\n%4d full_gcs: total time = %8.2f s", - _all_full_gc_times_ms->num(), - _all_full_gc_times_ms->sum() / 1000.0); - gclog_or_tty->print_cr(" (avg = %8.2fms).", _all_full_gc_times_ms->avg()); - gclog_or_tty->print_cr(" [std. dev = %8.2f ms, max = %8.2f ms]", - _all_full_gc_times_ms->sd(), - _all_full_gc_times_ms->maximum()); - } - } + _trace_gen0_time_data.print(); + _trace_gen1_time_data.print(); } void G1CollectorPolicy::print_yg_surv_rate_info() const { @@ -2535,9 +1911,9 @@ _last_gc_was_young = gcs_are_young() ? true : false; if (_last_gc_was_young) { - ++_young_pause_num; + _trace_gen0_time_data.increment_young_collection_count(); } else { - ++_mixed_pause_num; + _trace_gen0_time_data.increment_mixed_collection_count(); } // The young list is laid with the survivor regions from the previous @@ -2575,7 +1951,7 @@ set_recorded_rs_lengths(_inc_cset_recorded_rs_lengths); double young_end_time_sec = os::elapsedTime(); - _recorded_young_cset_choice_time_ms = + phase_times()->_recorded_young_cset_choice_time_ms = (young_end_time_sec - young_start_time_sec) * 1000.0; // We are doing young collections so reset this. @@ -2691,6 +2067,130 @@ predicted_pause_time_ms, target_pause_time_ms); double non_young_end_time_sec = os::elapsedTime(); - _recorded_non_young_cset_choice_time_ms = + phase_times()->_recorded_non_young_cset_choice_time_ms = (non_young_end_time_sec - non_young_start_time_sec) * 1000.0; } + +void TraceGen0TimeData::record_start_collection(double time_to_stop_the_world_ms) { + if(TraceGen0Time) { + _all_stop_world_times_ms.add(time_to_stop_the_world_ms); + } +} + +void TraceGen0TimeData::record_yield_time(double yield_time_ms) { + if(TraceGen0Time) { + _all_yield_times_ms.add(yield_time_ms); + } +} + +void TraceGen0TimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) { + if(TraceGen0Time) { + _total.add(pause_time_ms); + _other.add(pause_time_ms - phase_times->accounted_time_ms()); + _root_region_scan_wait.add(phase_times->_root_region_scan_wait_time_ms); + _parallel.add(phase_times->_cur_collection_par_time_ms); + _ext_root_scan.add(phase_times->_ext_root_scan_time); + _satb_filtering.add(phase_times->_satb_filtering_time); + _update_rs.add(phase_times->_update_rs_time); + _scan_rs.add(phase_times->_scan_rs_time); + _obj_copy.add(phase_times->_obj_copy_time); + _termination.add(phase_times->_termination_time); + + double parallel_known_time = phase_times->_ext_root_scan_time + + phase_times->_satb_filtering_time + + phase_times->_update_rs_time + + phase_times->_scan_rs_time + + phase_times->_obj_copy_time + + + phase_times->_termination_time; + + double parallel_other_time = phase_times->_cur_collection_par_time_ms - parallel_known_time; + _parallel_other.add(parallel_other_time); + _clear_ct.add(phase_times->_cur_clear_ct_time_ms); + } +} + +void TraceGen0TimeData::increment_young_collection_count() { + if(TraceGen0Time) { + ++_young_pause_num; + } +} + +void TraceGen0TimeData::increment_mixed_collection_count() { + if(TraceGen0Time) { + ++_mixed_pause_num; + } +} + +void TraceGen0TimeData::print_summary(const char* str, + const NumberSeq* seq) const { + double sum = seq->sum(); + gclog_or_tty->print_cr("%-27s = %8.2lf s (avg = %8.2lf ms)", + str, sum / 1000.0, seq->avg()); +} + +void TraceGen0TimeData::print_summary_sd(const char* str, + const NumberSeq* seq) const { + print_summary(str, seq); + gclog_or_tty->print_cr("%+45s = %5d, std dev = %8.2lf ms, max = %8.2lf ms)", + "(num", seq->num(), seq->sd(), seq->maximum()); +} + +void TraceGen0TimeData::print() const { + if (!TraceGen0Time) { + return; + } + + gclog_or_tty->print_cr("ALL PAUSES"); + print_summary_sd(" Total", &_total); + gclog_or_tty->print_cr(""); + gclog_or_tty->print_cr(""); + gclog_or_tty->print_cr(" Young GC Pauses: %8d", _young_pause_num); + gclog_or_tty->print_cr(" Mixed GC Pauses: %8d", _mixed_pause_num); + gclog_or_tty->print_cr(""); + + gclog_or_tty->print_cr("EVACUATION PAUSES"); + + if (_young_pause_num == 0 && _mixed_pause_num == 0) { + gclog_or_tty->print_cr("none"); + } else { + print_summary_sd(" Evacuation Pauses", &_total); + print_summary(" Root Region Scan Wait", &_root_region_scan_wait); + print_summary(" Parallel Time", &_parallel); + print_summary(" Ext Root Scanning", &_ext_root_scan); + print_summary(" SATB Filtering", &_satb_filtering); + print_summary(" Update RS", &_update_rs); + print_summary(" Scan RS", &_scan_rs); + print_summary(" Object Copy", &_obj_copy); + print_summary(" Termination", &_termination); + print_summary(" Parallel Other", &_parallel_other); + print_summary(" Clear CT", &_clear_ct); + print_summary(" Other", &_other); + } + gclog_or_tty->print_cr(""); + + gclog_or_tty->print_cr("MISC"); + print_summary_sd(" Stop World", &_all_stop_world_times_ms); + print_summary_sd(" Yields", &_all_yield_times_ms); +} + +void TraceGen1TimeData::record_full_collection(double full_gc_time_ms) { + if (TraceGen1Time) { + _all_full_gc_times.add(full_gc_time_ms); + } +} + +void TraceGen1TimeData::print() const { + if (!TraceGen1Time) { + return; + } + + if (_all_full_gc_times.num() > 0) { + gclog_or_tty->print("\n%4d full_gcs: total time = %8.2f s", + _all_full_gc_times.num(), + _all_full_gc_times.sum() / 1000.0); + gclog_or_tty->print_cr(" (avg = %8.2fms).", _all_full_gc_times.avg()); + gclog_or_tty->print_cr(" [std. dev = %8.2f ms, max = %8.2f ms]", + _all_full_gc_times.sd(), + _all_full_gc_times.maximum()); + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp --- a/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -36,50 +36,52 @@ class HeapRegion; class CollectionSetChooser; +class G1GCPhaseTimes; -// Yes, this is a bit unpleasant... but it saves replicating the same thing -// over and over again and introducing subtle problems through small typos and -// cutting and pasting mistakes. The macros below introduces a number -// sequnce into the following two classes and the methods that access it. +// TraceGen0Time collects data on _both_ young and mixed evacuation pauses +// (the latter may contain non-young regions - i.e. regions that are +// technically in Gen1) while TraceGen1Time collects data about full GCs. +class TraceGen0TimeData : public CHeapObj { + private: + unsigned _young_pause_num; + unsigned _mixed_pause_num; + + NumberSeq _all_stop_world_times_ms; + NumberSeq _all_yield_times_ms; -#define define_num_seq(name) \ -private: \ - NumberSeq _all_##name##_times_ms; \ -public: \ - void record_##name##_time_ms(double ms) { \ - _all_##name##_times_ms.add(ms); \ - } \ - NumberSeq* get_##name##_seq() { \ - return &_all_##name##_times_ms; \ - } + NumberSeq _total; + NumberSeq _other; + NumberSeq _root_region_scan_wait; + NumberSeq _parallel; + NumberSeq _ext_root_scan; + NumberSeq _satb_filtering; + NumberSeq _update_rs; + NumberSeq _scan_rs; + NumberSeq _obj_copy; + NumberSeq _termination; + NumberSeq _parallel_other; + NumberSeq _clear_ct; -class MainBodySummary; - -class PauseSummary: public CHeapObj { - define_num_seq(total) - define_num_seq(other) + void print_summary(const char* str, const NumberSeq* seq) const; + void print_summary_sd(const char* str, const NumberSeq* seq) const; public: - virtual MainBodySummary* main_body_summary() { return NULL; } + TraceGen0TimeData() : _young_pause_num(0), _mixed_pause_num(0) {}; + void record_start_collection(double time_to_stop_the_world_ms); + void record_yield_time(double yield_time_ms); + void record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times); + void increment_young_collection_count(); + void increment_mixed_collection_count(); + void print() const; }; -class MainBodySummary: public CHeapObj { - define_num_seq(root_region_scan_wait) - define_num_seq(parallel) // parallel only - define_num_seq(ext_root_scan) - define_num_seq(satb_filtering) - define_num_seq(update_rs) - define_num_seq(scan_rs) - define_num_seq(obj_copy) - define_num_seq(termination) // parallel only - define_num_seq(parallel_other) // parallel only - define_num_seq(clear_ct) -}; +class TraceGen1TimeData : public CHeapObj { + private: + NumberSeq _all_full_gc_times; -class Summary: public PauseSummary, - public MainBodySummary { -public: - virtual MainBodySummary* main_body_summary() { return this; } + public: + void record_full_collection(double full_gc_time_ms); + void print() const; }; // There are three command line options related to the young gen size: @@ -118,7 +120,7 @@ // // NewSize and MaxNewSize override NewRatio. So, NewRatio is ignored if it is // combined with either NewSize or MaxNewSize. (A warning message is printed.) -class G1YoungGenSizer : public CHeapObj { +class G1YoungGenSizer : public CHeapObj { private: enum SizerKind { SizerDefaults, @@ -173,25 +175,9 @@ CollectionSetChooser* _collectionSetChooser; - double _cur_collection_start_sec; + double _full_collection_start_sec; size_t _cur_collection_pause_used_at_start_bytes; uint _cur_collection_pause_used_regions_at_start; - double _cur_collection_par_time_ms; - - double _cur_collection_code_root_fixup_time_ms; - - double _cur_clear_ct_time_ms; - double _cur_ref_proc_time_ms; - double _cur_ref_enq_time_ms; - -#ifndef PRODUCT - // Card Table Count Cache stats - double _min_clear_cc_time_ms; // min - double _max_clear_cc_time_ms; // max - double _cur_clear_cc_time_ms; // clearing time during current pause - double _cum_clear_cc_time_ms; // cummulative clearing time - jlong _num_cc_clears; // number of times the card count cache has been cleared -#endif // These exclude marking times. TruncatedSeq* _recent_gc_times_ms; @@ -199,36 +185,10 @@ TruncatedSeq* _concurrent_mark_remark_times_ms; TruncatedSeq* _concurrent_mark_cleanup_times_ms; - Summary* _summary; - - NumberSeq* _all_pause_times_ms; - NumberSeq* _all_full_gc_times_ms; - double _stop_world_start; - NumberSeq* _all_stop_world_times_ms; - NumberSeq* _all_yield_times_ms; - - int _aux_num; - NumberSeq* _all_aux_times_ms; - double* _cur_aux_start_times_ms; - double* _cur_aux_times_ms; - bool* _cur_aux_times_set; + TraceGen0TimeData _trace_gen0_time_data; + TraceGen1TimeData _trace_gen1_time_data; - double* _par_last_gc_worker_start_times_ms; - double* _par_last_ext_root_scan_times_ms; - double* _par_last_satb_filtering_times_ms; - double* _par_last_update_rs_times_ms; - double* _par_last_update_rs_processed_buffers; - double* _par_last_scan_rs_times_ms; - double* _par_last_obj_copy_times_ms; - double* _par_last_termination_times_ms; - double* _par_last_termination_attempts; - double* _par_last_gc_worker_end_times_ms; - double* _par_last_gc_worker_times_ms; - - // Each workers 'other' time i.e. the elapsed time of the parallel - // code executed by a worker minus the sum of the individual sub-phase - // times for that worker thread. - double* _par_last_gc_worker_other_times_ms; + double _stop_world_start; // indicates whether we are in young or mixed GC mode bool _gcs_are_young; @@ -243,9 +203,6 @@ bool _last_gc_was_young; - unsigned _young_pause_num; - unsigned _mixed_pause_num; - bool _during_marking; bool _in_marking_window; bool _in_marking_window_im; @@ -305,10 +262,6 @@ size_t _recorded_rs_lengths; size_t _max_rs_lengths; - - double _recorded_young_free_cset_time_ms; - double _recorded_non_young_free_cset_time_ms; - double _sigma; size_t _rs_lengths_prediction; @@ -340,8 +293,7 @@ void set_no_of_gc_threads(uintx v) { _no_of_gc_threads = v; } double _pause_time_target_ms; - double _recorded_young_cset_choice_time_ms; - double _recorded_non_young_cset_choice_time_ms; + size_t _pending_cards; size_t _max_pending_cards; @@ -496,14 +448,6 @@ uint young_cset_region_length() { return eden_cset_region_length() + survivor_cset_region_length(); } - void record_young_free_cset_time_ms(double time_ms) { - _recorded_young_free_cset_time_ms = time_ms; - } - - void record_non_young_free_cset_time_ms(double time_ms) { - _recorded_non_young_free_cset_time_ms = time_ms; - } - double predict_survivor_regions_evac_time(); void cset_regions_freed() { @@ -551,28 +495,6 @@ } private: - void print_stats(int level, const char* str, double value); - void print_stats(int level, const char* str, int value); - - void print_par_stats(int level, const char* str, double* data); - void print_par_sizes(int level, const char* str, double* data); - - void check_other_times(int level, - NumberSeq* other_times_ms, - NumberSeq* calc_other_times_ms) const; - - void print_summary (PauseSummary* stats) const; - - void print_summary (int level, const char* str, NumberSeq* seq) const; - void print_summary_sd (int level, const char* str, NumberSeq* seq) const; - - double avg_value (double* data); - double max_value (double* data); - double sum_of_values (double* data); - double max_sum (double* data1, double* data2); - - double _last_pause_time_ms; - size_t _bytes_in_collection_set_before_gc; size_t _bytes_copied_during_gc; @@ -646,6 +568,8 @@ // Stash a pointer to the g1 heap. G1CollectedHeap* _g1; + G1GCPhaseTimes* _phase_times; + // The ratio of gc time to elapsed time, computed over recent pauses. double _recent_avg_pause_time_ratio; @@ -685,7 +609,6 @@ double _cur_mark_stop_world_time_ms; double _mark_remark_start_sec; double _mark_cleanup_start_sec; - double _root_region_scan_wait_time_ms; // Update the young list target length either by setting it to the // desired fixed value or by calculating it using G1's pause @@ -736,6 +659,8 @@ return CollectorPolicy::G1CollectorPolicyKind; } + G1GCPhaseTimes* phase_times() const { return _phase_times; } + // Check the current value of the young list RSet lengths and // compare it against the last prediction. If the current value is // higher, recalculate the young list target length prediction. @@ -745,10 +670,6 @@ return _bytes_in_collection_set_before_gc; } - unsigned calc_gc_alloc_time_stamp() { - return _all_pause_times_ms->num() + 1; - } - // This should be called after the heap is resized. void record_new_heap_size(uint new_number_of_regions); @@ -784,10 +705,6 @@ void record_concurrent_mark_init_end(double mark_init_elapsed_time_ms); - void record_root_region_scan_wait_time(double time_ms) { - _root_region_scan_wait_time_ms = time_ms; - } - void record_concurrent_mark_remark_start(); void record_concurrent_mark_remark_end(); @@ -796,109 +713,14 @@ void record_concurrent_mark_cleanup_completed(); void record_concurrent_pause(); - void record_concurrent_pause_end(); - void record_collection_pause_end(int no_of_gc_threads); + void record_collection_pause_end(double pause_time); void print_heap_transition(); // Record the fact that a full collection occurred. void record_full_collection_start(); void record_full_collection_end(); - void record_gc_worker_start_time(int worker_i, double ms) { - _par_last_gc_worker_start_times_ms[worker_i] = ms; - } - - void record_ext_root_scan_time(int worker_i, double ms) { - _par_last_ext_root_scan_times_ms[worker_i] = ms; - } - - void record_satb_filtering_time(int worker_i, double ms) { - _par_last_satb_filtering_times_ms[worker_i] = ms; - } - - void record_update_rs_time(int thread, double ms) { - _par_last_update_rs_times_ms[thread] = ms; - } - - void record_update_rs_processed_buffers (int thread, - double processed_buffers) { - _par_last_update_rs_processed_buffers[thread] = processed_buffers; - } - - void record_scan_rs_time(int thread, double ms) { - _par_last_scan_rs_times_ms[thread] = ms; - } - - void reset_obj_copy_time(int thread) { - _par_last_obj_copy_times_ms[thread] = 0.0; - } - - void reset_obj_copy_time() { - reset_obj_copy_time(0); - } - - void record_obj_copy_time(int thread, double ms) { - _par_last_obj_copy_times_ms[thread] += ms; - } - - void record_termination(int thread, double ms, size_t attempts) { - _par_last_termination_times_ms[thread] = ms; - _par_last_termination_attempts[thread] = (double) attempts; - } - - void record_gc_worker_end_time(int worker_i, double ms) { - _par_last_gc_worker_end_times_ms[worker_i] = ms; - } - - void record_pause_time_ms(double ms) { - _last_pause_time_ms = ms; - } - - void record_clear_ct_time(double ms) { - _cur_clear_ct_time_ms = ms; - } - - void record_par_time(double ms) { - _cur_collection_par_time_ms = ms; - } - - void record_code_root_fixup_time(double ms) { - _cur_collection_code_root_fixup_time_ms = ms; - } - - void record_aux_start_time(int i) { - guarantee(i < _aux_num, "should be within range"); - _cur_aux_start_times_ms[i] = os::elapsedTime() * 1000.0; - } - - void record_aux_end_time(int i) { - guarantee(i < _aux_num, "should be within range"); - double ms = os::elapsedTime() * 1000.0 - _cur_aux_start_times_ms[i]; - _cur_aux_times_set[i] = true; - _cur_aux_times_ms[i] += ms; - } - - void record_ref_proc_time(double ms) { - _cur_ref_proc_time_ms = ms; - } - - void record_ref_enq_time(double ms) { - _cur_ref_enq_time_ms = ms; - } - -#ifndef PRODUCT - void record_cc_clear_time(double ms) { - if (_min_clear_cc_time_ms < 0.0 || ms <= _min_clear_cc_time_ms) - _min_clear_cc_time_ms = ms; - if (_max_clear_cc_time_ms < 0.0 || ms >= _max_clear_cc_time_ms) - _max_clear_cc_time_ms = ms; - _cur_clear_cc_time_ms = ms; - _cum_clear_cc_time_ms += ms; - _num_cc_clears++; - } -#endif - // Record how much space we copied during a GC. This is typically // called when a GC alloc region is being retired. void record_bytes_copied_during_gc(size_t bytes) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,379 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + + +#include "precompiled.hpp" +#include "gc_implementation/g1/g1CollectedHeap.inline.hpp" +#include "gc_implementation/g1/g1GCPhaseTimes.hpp" +#include "gc_implementation/g1/g1Log.hpp" + +// Helper class for avoiding interleaved logging +class LineBuffer: public StackObj { + +private: + static const int BUFFER_LEN = 1024; + static const int INDENT_CHARS = 3; + char _buffer[BUFFER_LEN]; + int _indent_level; + int _cur; + + void vappend(const char* format, va_list ap) { + int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap); + if (res != -1) { + _cur += res; + } else { + DEBUG_ONLY(warning("buffer too small in LineBuffer");) + _buffer[BUFFER_LEN -1] = 0; + _cur = BUFFER_LEN; // vsnprintf above should not add to _buffer if we are called again + } + } + +public: + explicit LineBuffer(int indent_level): _indent_level(indent_level), _cur(0) { + for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) { + _buffer[_cur] = ' '; + } + } + +#ifndef PRODUCT + ~LineBuffer() { + assert(_cur == _indent_level * INDENT_CHARS, "pending data in buffer - append_and_print_cr() not called?"); + } +#endif + + void append(const char* format, ...) { + va_list ap; + va_start(ap, format); + vappend(format, ap); + va_end(ap); + } + + void append_and_print_cr(const char* format, ...) { + va_list ap; + va_start(ap, format); + vappend(format, ap); + va_end(ap); + gclog_or_tty->print_cr("%s", _buffer); + _cur = _indent_level * INDENT_CHARS; + } +}; + +G1GCPhaseTimes::G1GCPhaseTimes(uint max_gc_threads) : + _max_gc_threads(max_gc_threads), + _min_clear_cc_time_ms(-1.0), + _max_clear_cc_time_ms(-1.0), + _cur_clear_cc_time_ms(0.0), + _cum_clear_cc_time_ms(0.0), + _num_cc_clears(0L) +{ + assert(max_gc_threads > 0, "Must have some GC threads"); + _par_last_gc_worker_start_times_ms = new double[_max_gc_threads]; + _par_last_ext_root_scan_times_ms = new double[_max_gc_threads]; + _par_last_satb_filtering_times_ms = new double[_max_gc_threads]; + _par_last_update_rs_times_ms = new double[_max_gc_threads]; + _par_last_update_rs_processed_buffers = new double[_max_gc_threads]; + _par_last_scan_rs_times_ms = new double[_max_gc_threads]; + _par_last_obj_copy_times_ms = new double[_max_gc_threads]; + _par_last_termination_times_ms = new double[_max_gc_threads]; + _par_last_termination_attempts = new double[_max_gc_threads]; + _par_last_gc_worker_end_times_ms = new double[_max_gc_threads]; + _par_last_gc_worker_times_ms = new double[_max_gc_threads]; + _par_last_gc_worker_other_times_ms = new double[_max_gc_threads]; +} + +void G1GCPhaseTimes::note_gc_start(double pause_start_time_sec, uint active_gc_threads, + bool is_young_gc, bool is_initial_mark_gc, GCCause::Cause gc_cause) { + assert(active_gc_threads > 0, "The number of threads must be > 0"); + assert(active_gc_threads <= _max_gc_threads, "The number of active threads must be <= the max nubmer of threads"); + _active_gc_threads = active_gc_threads; + _pause_start_time_sec = pause_start_time_sec; + _is_young_gc = is_young_gc; + _is_initial_mark_gc = is_initial_mark_gc; + _gc_cause = gc_cause; + +#ifdef ASSERT + // initialise the timing data to something well known so that we can spot + // if something is not set properly + + for (uint i = 0; i < _max_gc_threads; ++i) { + _par_last_gc_worker_start_times_ms[i] = -1234.0; + _par_last_ext_root_scan_times_ms[i] = -1234.0; + _par_last_satb_filtering_times_ms[i] = -1234.0; + _par_last_update_rs_times_ms[i] = -1234.0; + _par_last_update_rs_processed_buffers[i] = -1234.0; + _par_last_scan_rs_times_ms[i] = -1234.0; + _par_last_obj_copy_times_ms[i] = -1234.0; + _par_last_termination_times_ms[i] = -1234.0; + _par_last_termination_attempts[i] = -1234.0; + _par_last_gc_worker_end_times_ms[i] = -1234.0; + _par_last_gc_worker_times_ms[i] = -1234.0; + _par_last_gc_worker_other_times_ms[i] = -1234.0; + } +#endif +} + +void G1GCPhaseTimes::note_gc_end(double pause_end_time_sec) { + if (G1Log::fine()) { + double pause_time_ms = (pause_end_time_sec - _pause_start_time_sec) * MILLIUNITS; + + for (uint i = 0; i < _active_gc_threads; i++) { + _par_last_gc_worker_times_ms[i] = _par_last_gc_worker_end_times_ms[i] - + _par_last_gc_worker_start_times_ms[i]; + + double worker_known_time = _par_last_ext_root_scan_times_ms[i] + + _par_last_satb_filtering_times_ms[i] + + _par_last_update_rs_times_ms[i] + + _par_last_scan_rs_times_ms[i] + + _par_last_obj_copy_times_ms[i] + + _par_last_termination_times_ms[i]; + + _par_last_gc_worker_other_times_ms[i] = _par_last_gc_worker_times_ms[i] - + worker_known_time; + } + + print(pause_time_ms); + } + +} + +void G1GCPhaseTimes::print_par_stats(int level, + const char* str, + double* data, + bool showDecimals) { + double min = data[0], max = data[0]; + double total = 0.0; + LineBuffer buf(level); + buf.append("[%s (ms):", str); + for (uint i = 0; i < _active_gc_threads; ++i) { + double val = data[i]; + if (val < min) + min = val; + if (val > max) + max = val; + total += val; + if (G1Log::finest()) { + if (showDecimals) { + buf.append(" %.1lf", val); + } else { + buf.append(" %d", (int)val); + } + } + } + + if (G1Log::finest()) { + buf.append_and_print_cr(""); + } + double avg = total / (double) _active_gc_threads; + if (showDecimals) { + buf.append_and_print_cr(" Min: %.1lf, Avg: %.1lf, Max: %.1lf, Diff: %.1lf, Sum: %.1lf]", + min, avg, max, max - min, total); + } else { + buf.append_and_print_cr(" Min: %d, Avg: %d, Max: %d, Diff: %d, Sum: %d]", + (int)min, (int)avg, (int)max, (int)max - (int)min, (int)total); + } +} + +void G1GCPhaseTimes::print_stats(int level, const char* str, double value) { + LineBuffer(level).append_and_print_cr("[%s: %.1lf ms]", str, value); +} + +void G1GCPhaseTimes::print_stats(int level, const char* str, double value, int workers) { + LineBuffer(level).append_and_print_cr("[%s: %.1lf ms, GC Workers: %d]", str, value, workers); +} + +void G1GCPhaseTimes::print_stats(int level, const char* str, int value) { + LineBuffer(level).append_and_print_cr("[%s: %d]", str, value); +} + +double G1GCPhaseTimes::avg_value(double* data) { + if (G1CollectedHeap::use_parallel_gc_threads()) { + double ret = 0.0; + for (uint i = 0; i < _active_gc_threads; ++i) { + ret += data[i]; + } + return ret / (double) _active_gc_threads; + } else { + return data[0]; + } +} + +double G1GCPhaseTimes::max_value(double* data) { + if (G1CollectedHeap::use_parallel_gc_threads()) { + double ret = data[0]; + for (uint i = 1; i < _active_gc_threads; ++i) { + if (data[i] > ret) { + ret = data[i]; + } + } + return ret; + } else { + return data[0]; + } +} + +double G1GCPhaseTimes::sum_of_values(double* data) { + if (G1CollectedHeap::use_parallel_gc_threads()) { + double sum = 0.0; + for (uint i = 0; i < _active_gc_threads; i++) { + sum += data[i]; + } + return sum; + } else { + return data[0]; + } +} + +double G1GCPhaseTimes::max_sum(double* data1, double* data2) { + double ret = data1[0] + data2[0]; + + if (G1CollectedHeap::use_parallel_gc_threads()) { + for (uint i = 1; i < _active_gc_threads; ++i) { + double data = data1[i] + data2[i]; + if (data > ret) { + ret = data; + } + } + } + return ret; +} + +void G1GCPhaseTimes::collapse_par_times() { + _ext_root_scan_time = avg_value(_par_last_ext_root_scan_times_ms); + _satb_filtering_time = avg_value(_par_last_satb_filtering_times_ms); + _update_rs_time = avg_value(_par_last_update_rs_times_ms); + _update_rs_processed_buffers = + sum_of_values(_par_last_update_rs_processed_buffers); + _scan_rs_time = avg_value(_par_last_scan_rs_times_ms); + _obj_copy_time = avg_value(_par_last_obj_copy_times_ms); + _termination_time = avg_value(_par_last_termination_times_ms); +} + +double G1GCPhaseTimes::accounted_time_ms() { + // Subtract the root region scanning wait time. It's initialized to + // zero at the start of the pause. + double misc_time_ms = _root_region_scan_wait_time_ms; + + misc_time_ms += _cur_collection_par_time_ms; + + // Now subtract the time taken to fix up roots in generated code + misc_time_ms += _cur_collection_code_root_fixup_time_ms; + + // Subtract the time taken to clean the card table from the + // current value of "other time" + misc_time_ms += _cur_clear_ct_time_ms; + + return misc_time_ms; +} + +void G1GCPhaseTimes::print(double pause_time_ms) { + + if (PrintGCTimeStamps) { + gclog_or_tty->stamp(); + gclog_or_tty->print(": "); + } + + GCCauseString gc_cause_str = GCCauseString("GC pause", _gc_cause) + .append(_is_young_gc ? " (young)" : " (mixed)") + .append(_is_initial_mark_gc ? " (initial-mark)" : ""); + gclog_or_tty->print_cr("[%s, %3.7f secs]", (const char*)gc_cause_str, pause_time_ms / 1000.0); + + if (!G1Log::finer()) { + return; + } + + if (_root_region_scan_wait_time_ms > 0.0) { + print_stats(1, "Root Region Scan Waiting", _root_region_scan_wait_time_ms); + } + if (G1CollectedHeap::use_parallel_gc_threads()) { + print_stats(1, "Parallel Time", _cur_collection_par_time_ms, _active_gc_threads); + print_par_stats(2, "GC Worker Start", _par_last_gc_worker_start_times_ms); + print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms); + if (_satb_filtering_time > 0.0) { + print_par_stats(2, "SATB Filtering", _par_last_satb_filtering_times_ms); + } + print_par_stats(2, "Update RS", _par_last_update_rs_times_ms); + if (G1Log::finest()) { + print_par_stats(3, "Processed Buffers", _par_last_update_rs_processed_buffers, + false /* showDecimals */); + } + print_par_stats(2, "Scan RS", _par_last_scan_rs_times_ms); + print_par_stats(2, "Object Copy", _par_last_obj_copy_times_ms); + print_par_stats(2, "Termination", _par_last_termination_times_ms); + if (G1Log::finest()) { + print_par_stats(3, "Termination Attempts", _par_last_termination_attempts, + false /* showDecimals */); + } + print_par_stats(2, "GC Worker Other", _par_last_gc_worker_other_times_ms); + print_par_stats(2, "GC Worker Total", _par_last_gc_worker_times_ms); + print_par_stats(2, "GC Worker End", _par_last_gc_worker_end_times_ms); + } else { + print_stats(1, "Ext Root Scanning", _ext_root_scan_time); + if (_satb_filtering_time > 0.0) { + print_stats(1, "SATB Filtering", _satb_filtering_time); + } + print_stats(1, "Update RS", _update_rs_time); + if (G1Log::finest()) { + print_stats(2, "Processed Buffers", (int)_update_rs_processed_buffers); + } + print_stats(1, "Scan RS", _scan_rs_time); + print_stats(1, "Object Copying", _obj_copy_time); + } + print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms); + print_stats(1, "Clear CT", _cur_clear_ct_time_ms); + if (Verbose && G1Log::finest()) { + print_stats(1, "Cur Clear CC", _cur_clear_cc_time_ms); + print_stats(1, "Cum Clear CC", _cum_clear_cc_time_ms); + print_stats(1, "Min Clear CC", _min_clear_cc_time_ms); + print_stats(1, "Max Clear CC", _max_clear_cc_time_ms); + if (_num_cc_clears > 0) { + print_stats(1, "Avg Clear CC", _cum_clear_cc_time_ms / ((double)_num_cc_clears)); + } + } + double misc_time_ms = pause_time_ms - accounted_time_ms(); + print_stats(1, "Other", misc_time_ms); + print_stats(2, "Choose CSet", + (_recorded_young_cset_choice_time_ms + + _recorded_non_young_cset_choice_time_ms)); + print_stats(2, "Ref Proc", _cur_ref_proc_time_ms); + print_stats(2, "Ref Enq", _cur_ref_enq_time_ms); + print_stats(2, "Free CSet", + (_recorded_young_free_cset_time_ms + + _recorded_non_young_free_cset_time_ms)); +} + +void G1GCPhaseTimes::record_cc_clear_time_ms(double ms) { + if (!(Verbose && G1Log::finest())) { + return; + } + + if (_min_clear_cc_time_ms < 0.0 || ms <= _min_clear_cc_time_ms) { + _min_clear_cc_time_ms = ms; + } + if (_max_clear_cc_time_ms < 0.0 || ms >= _max_clear_cc_time_ms) { + _max_clear_cc_time_ms = ms; + } + _cur_clear_cc_time_ms = ms; + _cum_clear_cc_time_ms += ms; + _num_cc_clears++; +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP +#define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP + +#include "memory/allocation.hpp" +#include "gc_interface/gcCause.hpp" + +class G1GCPhaseTimes : public CHeapObj { + friend class G1CollectorPolicy; + friend class TraceGen0TimeData; + + private: + uint _active_gc_threads; + uint _max_gc_threads; + + GCCause::Cause _gc_cause; + bool _is_young_gc; + bool _is_initial_mark_gc; + + double _pause_start_time_sec; + + double* _par_last_gc_worker_start_times_ms; + double* _par_last_ext_root_scan_times_ms; + double* _par_last_satb_filtering_times_ms; + double* _par_last_update_rs_times_ms; + double* _par_last_update_rs_processed_buffers; + double* _par_last_scan_rs_times_ms; + double* _par_last_obj_copy_times_ms; + double* _par_last_termination_times_ms; + double* _par_last_termination_attempts; + double* _par_last_gc_worker_end_times_ms; + double* _par_last_gc_worker_times_ms; + double* _par_last_gc_worker_other_times_ms; + + double _cur_collection_par_time_ms; + + double _cur_collection_code_root_fixup_time_ms; + + double _cur_clear_ct_time_ms; + double _cur_ref_proc_time_ms; + double _cur_ref_enq_time_ms; + + // Helper methods for detailed logging + void print_par_stats(int level, const char* str, double* data, bool showDecimals = true); + void print_stats(int level, const char* str, double value); + void print_stats(int level, const char* str, double value, int workers); + void print_stats(int level, const char* str, int value); + double avg_value(double* data); + double max_value(double* data); + double sum_of_values(double* data); + double max_sum(double* data1, double* data2); + double accounted_time_ms(); + + // Card Table Count Cache stats + double _min_clear_cc_time_ms; // min + double _max_clear_cc_time_ms; // max + double _cur_clear_cc_time_ms; // clearing time during current pause + double _cum_clear_cc_time_ms; // cummulative clearing time + jlong _num_cc_clears; // number of times the card count cache has been cleared + + // The following insance variables are directly accessed by G1CollectorPolicy + // and TraceGen0TimeData. This is why those classes are declared friends. + // An alternative is to add getters and setters for all of these fields. + // It might also be possible to restructure the code to reduce these + // dependencies. + double _ext_root_scan_time; + double _satb_filtering_time; + double _update_rs_time; + double _update_rs_processed_buffers; + double _scan_rs_time; + double _obj_copy_time; + double _termination_time; + + double _cur_collection_start_sec; + double _root_region_scan_wait_time_ms; + + double _recorded_young_cset_choice_time_ms; + double _recorded_non_young_cset_choice_time_ms; + + double _recorded_young_free_cset_time_ms; + double _recorded_non_young_free_cset_time_ms; + + void print(double pause_time_ms); + + public: + G1GCPhaseTimes(uint max_gc_threads); + void note_gc_start(double pause_start_time_sec, uint active_gc_threads, + bool is_young_gc, bool is_initial_mark_gc, GCCause::Cause gc_cause); + void note_gc_end(double pause_end_time_sec); + void collapse_par_times(); + + void record_gc_worker_start_time(uint worker_i, double ms) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_gc_worker_start_times_ms[worker_i] = ms; + } + + void record_ext_root_scan_time(uint worker_i, double ms) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_ext_root_scan_times_ms[worker_i] = ms; + } + + void record_satb_filtering_time(uint worker_i, double ms) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_satb_filtering_times_ms[worker_i] = ms; + } + + void record_update_rs_time(uint worker_i, double ms) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_update_rs_times_ms[worker_i] = ms; + } + + void record_update_rs_processed_buffers (uint worker_i, + double processed_buffers) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_update_rs_processed_buffers[worker_i] = processed_buffers; + } + + void record_scan_rs_time(uint worker_i, double ms) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_scan_rs_times_ms[worker_i] = ms; + } + + void reset_obj_copy_time(uint worker_i) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_obj_copy_times_ms[worker_i] = 0.0; + } + + void reset_obj_copy_time() { + reset_obj_copy_time(0); + } + + void record_obj_copy_time(uint worker_i, double ms) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_obj_copy_times_ms[worker_i] += ms; + } + + void record_termination(uint worker_i, double ms, size_t attempts) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_termination_times_ms[worker_i] = ms; + _par_last_termination_attempts[worker_i] = (double) attempts; + } + + void record_gc_worker_end_time(uint worker_i, double ms) { + assert(worker_i >= 0, "worker index must be > 0"); + assert(worker_i < _active_gc_threads, "worker index out of bounds"); + _par_last_gc_worker_end_times_ms[worker_i] = ms; + } + + void record_clear_ct_time(double ms) { + _cur_clear_ct_time_ms = ms; + } + + void record_par_time(double ms) { + _cur_collection_par_time_ms = ms; + } + + void record_code_root_fixup_time(double ms) { + _cur_collection_code_root_fixup_time_ms = ms; + } + + void record_ref_proc_time(double ms) { + _cur_ref_proc_time_ms = ms; + } + + void record_ref_enq_time(double ms) { + _cur_ref_enq_time_ms = ms; + } + + void record_root_region_scan_wait_time(double time_ms) { + _root_region_scan_wait_time_ms = time_ms; + } + + void record_cc_clear_time_ms(double ms); + + void record_young_free_cset_time_ms(double time_ms) { + _recorded_young_free_cset_time_ms = time_ms; + } + + void record_non_young_free_cset_time_ms(double time_ms) { + _recorded_non_young_free_cset_time_ms = time_ms; + } +}; + +#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1MMUTracker.hpp --- a/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ /***** ALL TIMES ARE IN SECS!!!!!!! *****/ // this is the "interface" -class G1MMUTracker: public CHeapObj { +class G1MMUTracker: public CHeapObj { protected: double _time_slice; double _max_gc_time; // this is per time slice diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1MonitoringSupport.hpp --- a/src/share/vm/gc_implementation/g1/g1MonitoringSupport.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1MonitoringSupport.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -112,7 +112,7 @@ // do which is important as we want to keep the eden region allocation // path as low-overhead as possible. -class G1MonitoringSupport : public CHeapObj { +class G1MonitoringSupport : public CHeapObj { friend class VMStructs; G1CollectedHeap* _g1h; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1RemSet.cpp --- a/src/share/vm/gc_implementation/g1/g1RemSet.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1RemSet.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,6 +29,7 @@ #include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp" #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" #include "gc_implementation/g1/g1CollectorPolicy.hpp" +#include "gc_implementation/g1/g1GCPhaseTimes.hpp" #include "gc_implementation/g1/g1OopClosures.inline.hpp" #include "gc_implementation/g1/g1RemSet.inline.hpp" #include "gc_implementation/g1/heapRegionSeq.inline.hpp" @@ -75,7 +76,7 @@ { _seq_task = new SubTasksDone(NumSeqTasks); guarantee(n_workers() > 0, "There should be some workers"); - _cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers()); + _cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers(), mtGC); for (uint i = 0; i < n_workers(); i++) { _cset_rs_update_cl[i] = NULL; } @@ -86,7 +87,7 @@ for (uint i = 0; i < n_workers(); i++) { assert(_cset_rs_update_cl[i] == NULL, "it should be"); } - FREE_C_HEAP_ARRAY(OopsInHeapRegionClosure*, _cset_rs_update_cl); + FREE_C_HEAP_ARRAY(OopsInHeapRegionClosure*, _cset_rs_update_cl, mtGC); } void CountNonCleanMemRegionClosure::do_MemRegion(MemRegion mr) { @@ -224,7 +225,7 @@ assert( _cards_scanned != NULL, "invariant" ); _cards_scanned[worker_i] = scanRScl.cards_done(); - _g1p->record_scan_rs_time(worker_i, scan_rs_time_sec * 1000.0); + _g1p->phase_times()->record_scan_rs_time(worker_i, scan_rs_time_sec * 1000.0); } // Closure used for updating RSets and recording references that @@ -276,7 +277,7 @@ guarantee(cl.n() == 0, "Card table should be clean."); } - _g1p->record_update_rs_time(worker_i, (os::elapsedTime() - start) * 1000.0); + _g1p->phase_times()->record_update_rs_time(worker_i, (os::elapsedTime() - start) * 1000.0); } class CountRSSizeClosure: public HeapRegionClosure { @@ -390,13 +391,13 @@ if (G1UseParallelRSetUpdating || (worker_i == 0)) { updateRS(&into_cset_dcq, worker_i); } else { - _g1p->record_update_rs_processed_buffers(worker_i, 0.0); - _g1p->record_update_rs_time(worker_i, 0.0); + _g1p->phase_times()->record_update_rs_processed_buffers(worker_i, 0.0); + _g1p->phase_times()->record_update_rs_time(worker_i, 0.0); } if (G1UseParallelRSetScanning || (worker_i == 0)) { scanRS(oc, worker_i); } else { - _g1p->record_scan_rs_time(worker_i, 0.0); + _g1p->phase_times()->record_scan_rs_time(worker_i, 0.0); } // We now clear the cached values of _cset_rs_update_cl for this worker @@ -416,7 +417,7 @@ // _seq_task->set_n_termination((int)n_workers()); } guarantee( _cards_scanned == NULL, "invariant" ); - _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers()); + _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers(), mtGC); for (uint i = 0; i < n_workers(); ++i) { _cards_scanned[i] = 0; } @@ -487,7 +488,7 @@ for (uint i = 0; i < n_workers(); ++i) { _total_cards_scanned += _cards_scanned[i]; } - FREE_C_HEAP_ARRAY(size_t, _cards_scanned); + FREE_C_HEAP_ARRAY(size_t, _cards_scanned, mtGC); _cards_scanned = NULL; // Cleanup after copy _g1->set_refine_cte_cl_concurrency(true); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1RemSet.hpp --- a/src/share/vm/gc_implementation/g1/g1RemSet.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1RemSet.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -36,7 +36,7 @@ // external heap references into it. Uses a mod ref bs to track updates, // so that they can be used to update the individual region remsets. -class G1RemSet: public CHeapObj { +class G1RemSet: public CHeapObj { protected: G1CollectedHeap* _g1; unsigned _conc_refine_cards; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/g1_globals.hpp --- a/src/share/vm/gc_implementation/g1/g1_globals.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/g1_globals.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -53,6 +53,9 @@ develop(bool, G1TraceMarkStackOverflow, false, \ "If true, extra debugging code for CM restart for ovflw.") \ \ + develop(bool, G1TraceHeapRegionRememberedSet, false, \ + "Enables heap region remembered set debug logs") \ + \ diagnostic(bool, G1SummarizeConcMark, false, \ "Summarize concurrent mark info") \ \ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp --- a/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -30,29 +30,22 @@ #include "gc_implementation/g1/heapRegionSeq.inline.hpp" #include "memory/allocation.hpp" #include "memory/space.inline.hpp" +#include "oops/oop.inline.hpp" #include "utilities/bitMap.inline.hpp" #include "utilities/globalDefinitions.hpp" -#define HRRS_VERBOSE 0 - -#define PRT_COUNT_OCCUPIED 1 - // OtherRegionsTable -class PerRegionTable: public CHeapObj { +class PerRegionTable: public CHeapObj { friend class OtherRegionsTable; friend class HeapRegionRemSetIterator; HeapRegion* _hr; BitMap _bm; -#if PRT_COUNT_OCCUPIED jint _occupied; -#endif - PerRegionTable* _next_free; - PerRegionTable* next_free() { return _next_free; } - void set_next_free(PerRegionTable* prt) { _next_free = prt; } - + // next pointer for free/allocated lis + PerRegionTable* _next; static PerRegionTable* _free_list; @@ -69,63 +62,25 @@ // We need access in order to union things into the base table. BitMap* bm() { return &_bm; } -#if PRT_COUNT_OCCUPIED void recount_occupied() { _occupied = (jint) bm()->count_one_bits(); } -#endif PerRegionTable(HeapRegion* hr) : _hr(hr), -#if PRT_COUNT_OCCUPIED _occupied(0), -#endif _bm(HeapRegion::CardsPerRegion, false /* in-resource-area */) {} - static void free(PerRegionTable* prt) { - while (true) { - PerRegionTable* fl = _free_list; - prt->set_next_free(fl); - PerRegionTable* res = - (PerRegionTable*) - Atomic::cmpxchg_ptr(prt, &_free_list, fl); - if (res == fl) return; - } - ShouldNotReachHere(); - } - - static PerRegionTable* alloc(HeapRegion* hr) { - PerRegionTable* fl = _free_list; - while (fl != NULL) { - PerRegionTable* nxt = fl->next_free(); - PerRegionTable* res = - (PerRegionTable*) - Atomic::cmpxchg_ptr(nxt, &_free_list, fl); - if (res == fl) { - fl->init(hr); - return fl; - } else { - fl = _free_list; - } - } - assert(fl == NULL, "Loop condition."); - return new PerRegionTable(hr); - } - void add_card_work(CardIdx_t from_card, bool par) { if (!_bm.at(from_card)) { if (par) { if (_bm.par_at_put(from_card, 1)) { -#if PRT_COUNT_OCCUPIED Atomic::inc(&_occupied); -#endif } } else { _bm.at_put(from_card, 1); -#if PRT_COUNT_OCCUPIED _occupied++; -#endif } } } @@ -134,10 +89,13 @@ // Must make this robust in case "from" is not in "_hr", because of // concurrency. -#if HRRS_VERBOSE - gclog_or_tty->print_cr(" PRT::Add_reference_work(" PTR_FORMAT "->" PTR_FORMAT").", - from, *from); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr(" PRT::Add_reference_work(" PTR_FORMAT "->" PTR_FORMAT").", + from, + UseCompressedOops + ? oopDesc::load_decode_heap_oop((narrowOop*)from) + : oopDesc::load_decode_heap_oop((oop*)from)); + } HeapRegion* loc_hr = hr(); // If the test below fails, then this table was reused concurrently @@ -162,23 +120,16 @@ HeapRegion* hr() const { return _hr; } -#if PRT_COUNT_OCCUPIED jint occupied() const { // Overkill, but if we ever need it... // guarantee(_occupied == _bm.count_one_bits(), "Check"); return _occupied; } -#else - jint occupied() const { - return _bm.count_one_bits(); - } -#endif void init(HeapRegion* hr) { _hr = hr; -#if PRT_COUNT_OCCUPIED + _next = NULL; _occupied = 0; -#endif _bm.clear(); } @@ -194,9 +145,7 @@ HeapWord* hr_bot = hr()->bottom(); size_t hr_first_card_index = ctbs->index_for(hr_bot); bm()->set_intersection_at_offset(*card_bm, hr_first_card_index); -#if PRT_COUNT_OCCUPIED recount_occupied(); -#endif } void add_card(CardIdx_t from_card_index) { @@ -218,16 +167,6 @@ return sizeof(this) + _bm.size_in_words() * HeapWordSize; } - static size_t fl_mem_size() { - PerRegionTable* cur = _free_list; - size_t res = 0; - while (cur != NULL) { - res += sizeof(PerRegionTable); - cur = cur->next_free(); - } - return res; - } - // Requires "from" to be in "hr()". bool contains_reference(OopOrNarrowOopStar from) const { assert(hr()->is_in_reserved(from), "Precondition."); @@ -235,122 +174,29 @@ CardTableModRefBS::card_size); return _bm.at(card_ind); } -}; -PerRegionTable* PerRegionTable::_free_list = NULL; - - -#define COUNT_PAR_EXPANDS 0 - -#if COUNT_PAR_EXPANDS -static jint n_par_expands = 0; -static jint n_par_contracts = 0; -static jint par_expand_list_len = 0; -static jint max_par_expand_list_len = 0; - -static void print_par_expand() { - Atomic::inc(&n_par_expands); - Atomic::inc(&par_expand_list_len); - if (par_expand_list_len > max_par_expand_list_len) { - max_par_expand_list_len = par_expand_list_len; - } - if ((n_par_expands % 10) == 0) { - gclog_or_tty->print_cr("\n\n%d par expands: %d contracts, " - "len = %d, max_len = %d\n.", - n_par_expands, n_par_contracts, par_expand_list_len, - max_par_expand_list_len); - } -} -#endif - -class PosParPRT: public PerRegionTable { - PerRegionTable** _par_tables; - - enum SomePrivateConstants { - ReserveParTableExpansion = 1 - }; + PerRegionTable* next() const { return _next; } + void set_next(PerRegionTable* nxt) { _next = nxt; } + PerRegionTable** next_addr() { return &_next; } - void par_contract() { - assert(_par_tables != NULL, "Precondition."); - int n = HeapRegionRemSet::num_par_rem_sets()-1; - for (int i = 0; i < n; i++) { - _par_tables[i]->union_bitmap_into(bm()); - PerRegionTable::free(_par_tables[i]); - _par_tables[i] = NULL; - } -#if PRT_COUNT_OCCUPIED - // We must recount the "occupied." - recount_occupied(); -#endif - FREE_C_HEAP_ARRAY(PerRegionTable*, _par_tables); - _par_tables = NULL; -#if COUNT_PAR_EXPANDS - Atomic::inc(&n_par_contracts); - Atomic::dec(&par_expand_list_len); -#endif - } - - static PerRegionTable** _par_table_fl; - - PosParPRT* _next; - - static PosParPRT* _free_list; - - PerRegionTable** par_tables() const { - assert(uintptr_t(NULL) == 0, "Assumption."); - if (uintptr_t(_par_tables) <= ReserveParTableExpansion) - return NULL; - else - return _par_tables; - } - - PosParPRT* _next_par_expanded; - PosParPRT* next_par_expanded() { return _next_par_expanded; } - void set_next_par_expanded(PosParPRT* ppprt) { _next_par_expanded = ppprt; } - static PosParPRT* _par_expanded_list; - -public: - - PosParPRT(HeapRegion* hr) : PerRegionTable(hr), _par_tables(NULL) {} - - jint occupied() const { - jint res = PerRegionTable::occupied(); - if (par_tables() != NULL) { - for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) { - res += par_tables()[i]->occupied(); - } - } - return res; - } - - void init(HeapRegion* hr) { - PerRegionTable::init(hr); - _next = NULL; - if (par_tables() != NULL) { - for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) { - par_tables()[i]->init(hr); - } - } - } - - static void free(PosParPRT* prt) { + static void free(PerRegionTable* prt) { while (true) { - PosParPRT* fl = _free_list; + PerRegionTable* fl = _free_list; prt->set_next(fl); - PosParPRT* res = - (PosParPRT*) + PerRegionTable* res = + (PerRegionTable*) Atomic::cmpxchg_ptr(prt, &_free_list, fl); if (res == fl) return; } ShouldNotReachHere(); } - static PosParPRT* alloc(HeapRegion* hr) { - PosParPRT* fl = _free_list; + static PerRegionTable* alloc(HeapRegion* hr) { + PerRegionTable* fl = _free_list; while (fl != NULL) { - PosParPRT* nxt = fl->next(); - PosParPRT* res = - (PosParPRT*) + PerRegionTable* nxt = fl->next(); + PerRegionTable* res = + (PerRegionTable*) Atomic::cmpxchg_ptr(nxt, &_free_list, fl); if (res == fl) { fl->init(hr); @@ -360,148 +206,26 @@ } } assert(fl == NULL, "Loop condition."); - return new PosParPRT(hr); - } - - PosParPRT* next() const { return _next; } - void set_next(PosParPRT* nxt) { _next = nxt; } - PosParPRT** next_addr() { return &_next; } - - bool should_expand(int tid) { - // Given that we now defer RSet updates for after a GC we don't - // really need to expand the tables any more. This code should be - // cleaned up in the future (see CR 6921087). - return false; - } - - void par_expand() { - int n = HeapRegionRemSet::num_par_rem_sets()-1; - if (n <= 0) return; - if (_par_tables == NULL) { - PerRegionTable* res = - (PerRegionTable*) - Atomic::cmpxchg_ptr((PerRegionTable*)ReserveParTableExpansion, - &_par_tables, NULL); - if (res != NULL) return; - // Otherwise, we reserved the right to do the expansion. - - PerRegionTable** ptables = NEW_C_HEAP_ARRAY(PerRegionTable*, n); - for (int i = 0; i < n; i++) { - PerRegionTable* ptable = PerRegionTable::alloc(hr()); - ptables[i] = ptable; - } - // Here we do not need an atomic. - _par_tables = ptables; -#if COUNT_PAR_EXPANDS - print_par_expand(); -#endif - // We must put this table on the expanded list. - PosParPRT* exp_head = _par_expanded_list; - while (true) { - set_next_par_expanded(exp_head); - PosParPRT* res = - (PosParPRT*) - Atomic::cmpxchg_ptr(this, &_par_expanded_list, exp_head); - if (res == exp_head) return; - // Otherwise. - exp_head = res; - } - ShouldNotReachHere(); - } - } - - void add_reference(OopOrNarrowOopStar from, int tid) { - // Expand if necessary. - PerRegionTable** pt = par_tables(); - if (pt != NULL) { - // We always have to assume that mods to table 0 are in parallel, - // because of the claiming scheme in parallel expansion. A thread - // with tid != 0 that finds the table to be NULL, but doesn't succeed - // in claiming the right of expanding it, will end up in the else - // clause of the above if test. That thread could be delayed, and a - // thread 0 add reference could see the table expanded, and come - // here. Both threads would be adding in parallel. But we get to - // not use atomics for tids > 0. - if (tid == 0) { - PerRegionTable::add_reference(from); - } else { - pt[tid-1]->seq_add_reference(from); - } - } else { - // Not expanded -- add to the base table. - PerRegionTable::add_reference(from); - } - } - - void scrub(CardTableModRefBS* ctbs, BitMap* card_bm) { - assert(_par_tables == NULL, "Precondition"); - PerRegionTable::scrub(ctbs, card_bm); - } - - size_t mem_size() const { - size_t res = - PerRegionTable::mem_size() + sizeof(this) - sizeof(PerRegionTable); - if (_par_tables != NULL) { - for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) { - res += _par_tables[i]->mem_size(); - } - } - return res; + return new PerRegionTable(hr); } static size_t fl_mem_size() { - PosParPRT* cur = _free_list; + PerRegionTable* cur = _free_list; size_t res = 0; while (cur != NULL) { - res += sizeof(PosParPRT); + res += sizeof(PerRegionTable); cur = cur->next(); } return res; } - - bool contains_reference(OopOrNarrowOopStar from) const { - if (PerRegionTable::contains_reference(from)) return true; - if (_par_tables != NULL) { - for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) { - if (_par_tables[i]->contains_reference(from)) return true; - } - } - return false; - } - - static void par_contract_all(); }; -void PosParPRT::par_contract_all() { - PosParPRT* hd = _par_expanded_list; - while (hd != NULL) { - PosParPRT* nxt = hd->next_par_expanded(); - PosParPRT* res = - (PosParPRT*) - Atomic::cmpxchg_ptr(nxt, &_par_expanded_list, hd); - if (res == hd) { - // We claimed the right to contract this table. - hd->set_next_par_expanded(NULL); - hd->par_contract(); - hd = _par_expanded_list; - } else { - hd = res; - } - } -} - -PosParPRT* PosParPRT::_free_list = NULL; -PosParPRT* PosParPRT::_par_expanded_list = NULL; - -jint OtherRegionsTable::_cache_probes = 0; -jint OtherRegionsTable::_cache_hits = 0; +PerRegionTable* PerRegionTable::_free_list = NULL; size_t OtherRegionsTable::_max_fine_entries = 0; size_t OtherRegionsTable::_mod_max_fine_entries_mask = 0; -#if SAMPLE_FOR_EVICTION size_t OtherRegionsTable::_fine_eviction_stride = 0; size_t OtherRegionsTable::_fine_eviction_sample_size = 0; -#endif OtherRegionsTable::OtherRegionsTable(HeapRegion* hr) : _g1h(G1CollectedHeap::heap()), @@ -511,34 +235,36 @@ false /* in-resource-area */), _fine_grain_regions(NULL), _n_fine_entries(0), _n_coarse_entries(0), -#if SAMPLE_FOR_EVICTION _fine_eviction_start(0), -#endif _sparse_table(hr) { - typedef PosParPRT* PosParPRTPtr; + typedef PerRegionTable* PerRegionTablePtr; + if (_max_fine_entries == 0) { assert(_mod_max_fine_entries_mask == 0, "Both or none."); size_t max_entries_log = (size_t)log2_long((jlong)G1RSetRegionEntries); _max_fine_entries = (size_t)(1 << max_entries_log); _mod_max_fine_entries_mask = _max_fine_entries - 1; -#if SAMPLE_FOR_EVICTION + assert(_fine_eviction_sample_size == 0 && _fine_eviction_stride == 0, "All init at same time."); _fine_eviction_sample_size = MAX2((size_t)4, max_entries_log); _fine_eviction_stride = _max_fine_entries / _fine_eviction_sample_size; -#endif } - _fine_grain_regions = new PosParPRTPtr[_max_fine_entries]; - if (_fine_grain_regions == NULL) + + _fine_grain_regions = new PerRegionTablePtr[_max_fine_entries]; + + if (_fine_grain_regions == NULL) { vm_exit_out_of_memory(sizeof(void*)*_max_fine_entries, "Failed to allocate _fine_grain_entries."); + } + for (size_t i = 0; i < _max_fine_entries; i++) { _fine_grain_regions[i] = NULL; } } -int** OtherRegionsTable::_from_card_cache = NULL; +int** OtherRegionsTable::_from_card_cache = NULL; size_t OtherRegionsTable::_from_card_cache_max_regions = 0; size_t OtherRegionsTable::_from_card_cache_mem_size = 0; @@ -546,9 +272,9 @@ _from_card_cache_max_regions = max_regions; int n_par_rs = HeapRegionRemSet::num_par_rem_sets(); - _from_card_cache = NEW_C_HEAP_ARRAY(int*, n_par_rs); + _from_card_cache = NEW_C_HEAP_ARRAY(int*, n_par_rs, mtGC); for (int i = 0; i < n_par_rs; i++) { - _from_card_cache[i] = NEW_C_HEAP_ARRAY(int, max_regions); + _from_card_cache[i] = NEW_C_HEAP_ARRAY(int, max_regions, mtGC); for (size_t j = 0; j < max_regions; j++) { _from_card_cache[i][j] = -1; // An invalid value. } @@ -579,38 +305,26 @@ void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, int tid) { size_t cur_hrs_ind = (size_t) hr()->hrs_index(); -#if HRRS_VERBOSE - gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").", - from, - UseCompressedOops - ? oopDesc::load_decode_heap_oop((narrowOop*)from) - : oopDesc::load_decode_heap_oop((oop*)from)); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").", + from, + UseCompressedOops + ? oopDesc::load_decode_heap_oop((narrowOop*)from) + : oopDesc::load_decode_heap_oop((oop*)from)); + } int from_card = (int)(uintptr_t(from) >> CardTableModRefBS::card_shift); -#if HRRS_VERBOSE - gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = %d)", - hr()->bottom(), from_card, - _from_card_cache[tid][cur_hrs_ind]); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = %d)", + hr()->bottom(), from_card, + _from_card_cache[tid][cur_hrs_ind]); + } -#define COUNT_CACHE 0 -#if COUNT_CACHE - jint p = Atomic::add(1, &_cache_probes); - if ((p % 10000) == 0) { - jint hits = _cache_hits; - gclog_or_tty->print_cr("%d/%d = %5.2f%% RS cache hits.", - _cache_hits, p, 100.0* (float)hits/(float)p); - } -#endif if (from_card == _from_card_cache[tid][cur_hrs_ind]) { -#if HRRS_VERBOSE - gclog_or_tty->print_cr(" from-card cache hit."); -#endif -#if COUNT_CACHE - Atomic::inc(&_cache_hits); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr(" from-card cache hit."); + } assert(contains_reference(from), "We just added it!"); return; } else { @@ -623,16 +337,16 @@ // If the region is already coarsened, return. if (_coarse_map.at(from_hrs_ind)) { -#if HRRS_VERBOSE - gclog_or_tty->print_cr(" coarse map hit."); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr(" coarse map hit."); + } assert(contains_reference(from), "We just added it!"); return; } // Otherwise find a per-region table to add it to. size_t ind = from_hrs_ind & _mod_max_fine_entries_mask; - PosParPRT* prt = find_region_table(ind, from_hr); + PerRegionTable* prt = find_region_table(ind, from_hr); if (prt == NULL) { MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); // Confirm that it's really not there... @@ -649,35 +363,35 @@ _sparse_table.add_card(from_hrs_ind, card_index)) { if (G1RecordHRRSOops) { HeapRegionRemSet::record(hr(), from); -#if HRRS_VERBOSE - gclog_or_tty->print(" Added card " PTR_FORMAT " to region " - "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n", - align_size_down(uintptr_t(from), - CardTableModRefBS::card_size), - hr()->bottom(), from); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print(" Added card " PTR_FORMAT " to region " + "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n", + align_size_down(uintptr_t(from), + CardTableModRefBS::card_size), + hr()->bottom(), from); + } } -#if HRRS_VERBOSE - gclog_or_tty->print_cr(" added card to sparse table."); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr(" added card to sparse table."); + } assert(contains_reference_locked(from), "We just added it!"); return; } else { -#if HRRS_VERBOSE - gclog_or_tty->print_cr(" [tid %d] sparse table entry " - "overflow(f: %d, t: %d)", - tid, from_hrs_ind, cur_hrs_ind); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr(" [tid %d] sparse table entry " + "overflow(f: %d, t: %d)", + tid, from_hrs_ind, cur_hrs_ind); + } } if (_n_fine_entries == _max_fine_entries) { prt = delete_region_table(); } else { - prt = PosParPRT::alloc(from_hr); + prt = PerRegionTable::alloc(from_hr); } prt->init(from_hr); - PosParPRT* first_prt = _fine_grain_regions[ind]; + PerRegionTable* first_prt = _fine_grain_regions[ind]; prt->set_next(first_prt); // XXX Maybe move to init? _fine_grain_regions[ind] = prt; _n_fine_entries++; @@ -704,38 +418,25 @@ // OtherRegionsTable for why this is OK. assert(prt != NULL, "Inv"); - if (prt->should_expand(tid)) { - MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); - HeapRegion* prt_hr = prt->hr(); - if (prt_hr == from_hr) { - // Make sure the table still corresponds to the same region - prt->par_expand(); - prt->add_reference(from, tid); - } - // else: The table has been concurrently coarsened, evicted, and - // the table data structure re-used for another table. So, we - // don't need to add the reference any more given that the table - // has been coarsened and the whole region will be scanned anyway. - } else { - prt->add_reference(from, tid); - } + prt->add_reference(from); + if (G1RecordHRRSOops) { HeapRegionRemSet::record(hr(), from); -#if HRRS_VERBOSE - gclog_or_tty->print("Added card " PTR_FORMAT " to region " - "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n", - align_size_down(uintptr_t(from), - CardTableModRefBS::card_size), - hr()->bottom(), from); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print("Added card " PTR_FORMAT " to region " + "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n", + align_size_down(uintptr_t(from), + CardTableModRefBS::card_size), + hr()->bottom(), from); + } } assert(contains_reference(from), "We just added it!"); } -PosParPRT* +PerRegionTable* OtherRegionsTable::find_region_table(size_t ind, HeapRegion* hr) const { assert(0 <= ind && ind < _max_fine_entries, "Preconditions."); - PosParPRT* prt = _fine_grain_regions[ind]; + PerRegionTable* prt = _fine_grain_regions[ind]; while (prt != NULL && prt->hr() != hr) { prt = prt->next(); } @@ -743,32 +444,16 @@ return prt; } - -#define DRT_CENSUS 0 - -#if DRT_CENSUS -static const int HistoSize = 6; -static int global_histo[HistoSize] = { 0, 0, 0, 0, 0, 0 }; -static int coarsenings = 0; -static int occ_sum = 0; -#endif - jint OtherRegionsTable::_n_coarsenings = 0; -PosParPRT* OtherRegionsTable::delete_region_table() { -#if DRT_CENSUS - int histo[HistoSize] = { 0, 0, 0, 0, 0, 0 }; - const int histo_limits[] = { 1, 4, 16, 64, 256, 2048 }; -#endif - +PerRegionTable* OtherRegionsTable::delete_region_table() { assert(_m.owned_by_self(), "Precondition"); assert(_n_fine_entries == _max_fine_entries, "Precondition"); - PosParPRT* max = NULL; + PerRegionTable* max = NULL; jint max_occ = 0; - PosParPRT** max_prev; + PerRegionTable** max_prev; size_t max_ind; -#if SAMPLE_FOR_EVICTION size_t i = _fine_eviction_start; for (size_t k = 0; k < _fine_eviction_sample_size; k++) { size_t ii = i; @@ -778,8 +463,8 @@ if (ii == _max_fine_entries) ii = 0; guarantee(ii != i, "We must find one."); } - PosParPRT** prev = &_fine_grain_regions[ii]; - PosParPRT* cur = *prev; + PerRegionTable** prev = &_fine_grain_regions[ii]; + PerRegionTable* cur = *prev; while (cur != NULL) { jint cur_occ = cur->occupied(); if (max == NULL || cur_occ > max_occ) { @@ -794,64 +479,27 @@ i = i + _fine_eviction_stride; if (i >= _n_fine_entries) i = i - _n_fine_entries; } + _fine_eviction_start++; - if (_fine_eviction_start >= _n_fine_entries) + + if (_fine_eviction_start >= _n_fine_entries) { _fine_eviction_start -= _n_fine_entries; -#else - for (int i = 0; i < _max_fine_entries; i++) { - PosParPRT** prev = &_fine_grain_regions[i]; - PosParPRT* cur = *prev; - while (cur != NULL) { - jint cur_occ = cur->occupied(); -#if DRT_CENSUS - for (int k = 0; k < HistoSize; k++) { - if (cur_occ <= histo_limits[k]) { - histo[k]++; global_histo[k]++; break; - } - } -#endif - if (max == NULL || cur_occ > max_occ) { - max = cur; - max_prev = prev; - max_ind = i; - max_occ = cur_occ; - } - prev = cur->next_addr(); - cur = cur->next(); - } } -#endif - // XXX + guarantee(max != NULL, "Since _n_fine_entries > 0"); -#if DRT_CENSUS - gclog_or_tty->print_cr("In a coarsening: histo of occs:"); - for (int k = 0; k < HistoSize; k++) { - gclog_or_tty->print_cr(" <= %4d: %5d.", histo_limits[k], histo[k]); - } - coarsenings++; - occ_sum += max_occ; - if ((coarsenings % 100) == 0) { - gclog_or_tty->print_cr("\ncoarsenings = %d; global summary:", coarsenings); - for (int k = 0; k < HistoSize; k++) { - gclog_or_tty->print_cr(" <= %4d: %5d.", histo_limits[k], global_histo[k]); - } - gclog_or_tty->print_cr("Avg occ of deleted region = %6.2f.", - (float)occ_sum/(float)coarsenings); - } -#endif // Set the corresponding coarse bit. size_t max_hrs_index = (size_t) max->hr()->hrs_index(); if (!_coarse_map.at(max_hrs_index)) { _coarse_map.at_put(max_hrs_index, true); _n_coarse_entries++; -#if 0 - gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] " - "for region [" PTR_FORMAT "...] (%d coarse entries).\n", - hr()->bottom(), - max->hr()->bottom(), - _n_coarse_entries); -#endif + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] " + "for region [" PTR_FORMAT "...] (%d coarse entries).\n", + hr()->bottom(), + max->hr()->bottom(), + _n_coarse_entries); + } } // Unsplice. @@ -883,10 +531,10 @@ // Now do the fine-grained maps. for (size_t i = 0; i < _max_fine_entries; i++) { - PosParPRT* cur = _fine_grain_regions[i]; - PosParPRT** prev = &_fine_grain_regions[i]; + PerRegionTable* cur = _fine_grain_regions[i]; + PerRegionTable** prev = &_fine_grain_regions[i]; while (cur != NULL) { - PosParPRT* nxt = cur->next(); + PerRegionTable* nxt = cur->next(); // If the entire region is dead, eliminate. if (G1RSScrubVerbose) { gclog_or_tty->print_cr(" For other region %u:", @@ -899,7 +547,7 @@ if (G1RSScrubVerbose) { gclog_or_tty->print_cr(" deleted via region map."); } - PosParPRT::free(cur); + PerRegionTable::free(cur); } else { // Do fine-grain elimination. if (G1RSScrubVerbose) { @@ -914,7 +562,7 @@ *prev = nxt; cur->set_next(NULL); _n_fine_entries--; - PosParPRT::free(cur); + PerRegionTable::free(cur); } else { prev = cur->next_addr(); } @@ -940,7 +588,7 @@ size_t OtherRegionsTable::occ_fine() const { size_t sum = 0; for (size_t i = 0; i < _max_fine_entries; i++) { - PosParPRT* cur = _fine_grain_regions[i]; + PerRegionTable* cur = _fine_grain_regions[i]; while (cur != NULL) { sum += cur->occupied(); cur = cur->next(); @@ -962,13 +610,13 @@ MutexLockerEx x((Mutex*)&_m, Mutex::_no_safepoint_check_flag); size_t sum = 0; for (size_t i = 0; i < _max_fine_entries; i++) { - PosParPRT* cur = _fine_grain_regions[i]; + PerRegionTable* cur = _fine_grain_regions[i]; while (cur != NULL) { sum += cur->mem_size(); cur = cur->next(); } } - sum += (sizeof(PosParPRT*) * _max_fine_entries); + sum += (sizeof(PerRegionTable*) * _max_fine_entries); sum += (_coarse_map.size_in_words() * HeapWordSize); sum += (_sparse_table.mem_size()); sum += sizeof(*this) - sizeof(_sparse_table); // Avoid double counting above. @@ -980,7 +628,7 @@ } size_t OtherRegionsTable::fl_mem_size() { - return PerRegionTable::fl_mem_size() + PosParPRT::fl_mem_size(); + return PerRegionTable::fl_mem_size(); } void OtherRegionsTable::clear_fcc() { @@ -992,10 +640,10 @@ void OtherRegionsTable::clear() { MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); for (size_t i = 0; i < _max_fine_entries; i++) { - PosParPRT* cur = _fine_grain_regions[i]; + PerRegionTable* cur = _fine_grain_regions[i]; while (cur != NULL) { - PosParPRT* nxt = cur->next(); - PosParPRT::free(cur); + PerRegionTable* nxt = cur->next(); + PerRegionTable::free(cur); cur = nxt; } _fine_grain_regions[i] = NULL; @@ -1035,8 +683,8 @@ bool OtherRegionsTable::del_single_region_table(size_t ind, HeapRegion* hr) { assert(0 <= ind && ind < _max_fine_entries, "Preconditions."); - PosParPRT** prev_addr = &_fine_grain_regions[ind]; - PosParPRT* prt = *prev_addr; + PerRegionTable** prev_addr = &_fine_grain_regions[ind]; + PerRegionTable* prt = *prev_addr; while (prt != NULL && prt->hr() != hr) { prev_addr = prt->next_addr(); prt = prt->next(); @@ -1044,7 +692,7 @@ if (prt != NULL) { assert(prt->hr() == hr, "Loop postcondition."); *prev_addr = prt->next(); - PosParPRT::free(prt); + PerRegionTable::free(prt); _n_fine_entries--; return true; } else { @@ -1065,7 +713,7 @@ // Is this region in the coarse map? if (_coarse_map.at(hr_ind)) return true; - PosParPRT* prt = find_region_table(hr_ind & _mod_max_fine_entries_mask, + PerRegionTable* prt = find_region_table(hr_ind & _mod_max_fine_entries_mask, hr); if (prt != NULL) { return prt->contains_reference(from); @@ -1106,7 +754,8 @@ void HeapRegionRemSet::setup_remset_size() { // Setup sparse and fine-grain tables sizes. // table_size = base * (log(region_size / 1M) + 1) - int region_size_log_mb = MAX2((int)HeapRegion::LogOfHRGrainBytes - (int)LOG_M, 0); + const int LOG_M = 20; + int region_size_log_mb = MAX2(HeapRegion::LogOfHRGrainBytes - LOG_M, 0); if (FLAG_IS_DEFAULT(G1RSetSparseRegionEntries)) { G1RSetSparseRegionEntries = G1RSetSparseRegionEntriesBase * (region_size_log_mb + 1); } @@ -1144,7 +793,7 @@ G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index); gclog_or_tty->print_cr(" Card " PTR_FORMAT, card_start); } - // XXX + if (iter.n_yielded() != occupied()) { gclog_or_tty->print_cr("Yielded disagrees with occupied:"); gclog_or_tty->print_cr(" %6d yielded (%6d coarse, %6d fine).", @@ -1162,10 +811,6 @@ SparsePRT::cleanup_all(); } -void HeapRegionRemSet::par_cleanup() { - PosParPRT::par_contract_all(); -} - void HeapRegionRemSet::clear() { _other_regions.clear(); assert(occupied() == 0, "Should be clear."); @@ -1332,9 +977,9 @@ && _recorded_cards == NULL && _recorded_regions == NULL, "Inv"); - _recorded_oops = NEW_C_HEAP_ARRAY(OopOrNarrowOopStar, MaxRecorded); - _recorded_cards = NEW_C_HEAP_ARRAY(HeapWord*, MaxRecorded); - _recorded_regions = NEW_C_HEAP_ARRAY(HeapRegion*, MaxRecorded); + _recorded_oops = NEW_C_HEAP_ARRAY(OopOrNarrowOopStar, MaxRecorded, mtGC); + _recorded_cards = NEW_C_HEAP_ARRAY(HeapWord*, MaxRecorded, mtGC); + _recorded_regions = NEW_C_HEAP_ARRAY(HeapRegion*, MaxRecorded, mtGC); } if (_n_recorded == MaxRecorded) { gclog_or_tty->print_cr("Filled up 'recorded' (%d).", MaxRecorded); @@ -1355,8 +1000,8 @@ assert(_n_recorded_events == 0 && _recorded_event_index == NULL, "Inv"); - _recorded_events = NEW_C_HEAP_ARRAY(Event, MaxRecordedEvents); - _recorded_event_index = NEW_C_HEAP_ARRAY(int, MaxRecordedEvents); + _recorded_events = NEW_C_HEAP_ARRAY(Event, MaxRecordedEvents, mtGC); + _recorded_event_index = NEW_C_HEAP_ARRAY(int, MaxRecordedEvents, mtGC); } if (_n_recorded_events == MaxRecordedEvents) { gclog_or_tty->print_cr("Filled up 'recorded_events' (%d).", MaxRecordedEvents); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp --- a/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ class G1BlockOffsetSharedArray; class HeapRegion; class HeapRegionRemSetIterator; -class PosParPRT; +class PerRegionTable; class SparsePRT; // Essentially a wrapper around SparsePRTCleanupTask. See @@ -79,15 +79,14 @@ size_t _n_coarse_entries; static jint _n_coarsenings; - PosParPRT** _fine_grain_regions; - size_t _n_fine_entries; + PerRegionTable** _fine_grain_regions; + size_t _n_fine_entries; -#define SAMPLE_FOR_EVICTION 1 -#if SAMPLE_FOR_EVICTION + // Used to sample a subset of the fine grain PRTs to determine which + // PRT to evict and coarsen. size_t _fine_eviction_start; static size_t _fine_eviction_stride; static size_t _fine_eviction_sample_size; -#endif SparsePRT _sparse_table; @@ -98,21 +97,18 @@ // Requires "prt" to be the first element of the bucket list appropriate // for "hr". If this list contains an entry for "hr", return it, // otherwise return "NULL". - PosParPRT* find_region_table(size_t ind, HeapRegion* hr) const; + PerRegionTable* find_region_table(size_t ind, HeapRegion* hr) const; - // Find, delete, and return a candidate PosParPRT, if any exists, + // Find, delete, and return a candidate PerRegionTable, if any exists, // adding the deleted region to the coarse bitmap. Requires the caller // to hold _m, and the fine-grain table to be full. - PosParPRT* delete_region_table(); + PerRegionTable* delete_region_table(); // If a PRT for "hr" is in the bucket list indicated by "ind" (which must // be the correct index for "hr"), delete it and return true; else return // false. bool del_single_region_table(size_t ind, HeapRegion* hr); - static jint _cache_probes; - static jint _cache_hits; - // Indexed by thread X heap region, to minimize thread contention. static int** _from_card_cache; static size_t _from_card_cache_max_regions; @@ -127,10 +123,6 @@ // sense. void add_reference(OopOrNarrowOopStar from, int tid); - void add_reference(OopOrNarrowOopStar from) { - return add_reference(from, 0); - } - // Removes any entries shown by the given bitmaps to contain only dead // objects. void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm); @@ -173,7 +165,7 @@ static void print_from_card_cache(); }; -class HeapRegionRemSet : public CHeapObj { +class HeapRegionRemSet : public CHeapObj { friend class VMStructs; friend class HeapRegionRemSetIterator; @@ -233,14 +225,12 @@ static jint n_coarsenings() { return OtherRegionsTable::n_coarsenings(); } - /* Used in the sequential case. Returns "true" iff this addition causes - the size limit to be reached. */ + // Used in the sequential case. void add_reference(OopOrNarrowOopStar from) { - _other_regions.add_reference(from); + _other_regions.add_reference(from, 0); } - /* Used in the parallel case. Returns "true" iff this addition causes - the size limit to be reached. */ + // Used in the parallel case. void add_reference(OopOrNarrowOopStar from, int tid) { _other_regions.add_reference(from, tid); } @@ -253,15 +243,6 @@ // entries for this region in other remsets. void clear(); - // Forget any entries due to pointers from "from_hr". - void clear_incoming_entry(HeapRegion* from_hr) { - _other_regions.clear_incoming_entry(from_hr); - } - -#if 0 - virtual void cleanup() = 0; -#endif - // Attempt to claim the region. Returns true iff this call caused an // atomic transition from Unclaimed to Claimed. bool claim_iter(); @@ -290,12 +271,6 @@ // Initialize the given iterator to iterate over this rem set. void init_iterator(HeapRegionRemSetIterator* iter) const; -#if 0 - // Apply the "do_card" method to the start address of every card in the - // rem set. Returns false if some application of the closure aborted. - virtual bool card_iterate(CardClosure* iter) = 0; -#endif - // The actual # of bytes this hr_remset takes up. size_t mem_size() { return _other_regions.mem_size() @@ -322,10 +297,7 @@ void print() const; // Called during a stop-world phase to perform any deferred cleanups. - // The second version may be called by parallel threads after then finish - // collection work. static void cleanup(); - static void par_cleanup(); // Declare the heap size (in # of regions) to the HeapRegionRemSet(s). // (Uses it to initialize from_card_cache). @@ -360,14 +332,14 @@ #endif }; -class HeapRegionRemSetIterator : public CHeapObj { +class HeapRegionRemSetIterator : public CHeapObj { // The region over which we're iterating. const HeapRegionRemSet* _hrrs; // Local caching of HRRS fields. const BitMap* _coarse_map; - PosParPRT** _fine_grain_regions; + PerRegionTable** _fine_grain_regions; G1BlockOffsetSharedArray* _bosa; G1CollectedHeap* _g1h; @@ -404,8 +376,9 @@ // Index of bucket-list we're working on. int _fine_array_index; + // Per Region Table we're doing within current bucket list. - PosParPRT* _fine_cur_prt; + PerRegionTable* _fine_cur_prt; /* SparsePRT::*/ SparsePRTIter _sparse_iter; @@ -435,12 +408,4 @@ } }; -#if 0 -class CardClosure: public Closure { -public: - virtual void do_card(HeapWord* card_start) = 0; -}; - -#endif - #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONREMSET_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/heapRegionSeq.cpp --- a/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -86,7 +86,7 @@ _allocated_length = 0; _max_length = max_length; - _regions = NEW_C_HEAP_ARRAY(HeapRegion*, max_length); + _regions = NEW_C_HEAP_ARRAY(HeapRegion*, max_length, mtGC); memset(_regions, 0, (size_t) max_length * sizeof(HeapRegion*)); _regions_biased = _regions - ((uintx) bottom >> _region_shift); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/heapRegionSeq.hpp --- a/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -53,7 +53,7 @@ // // and maintain that: _length <= _allocated_length <= _max_length -class HeapRegionSeq: public CHeapObj { +class HeapRegionSeq: public CHeapObj { friend class VMStructs; // The array that holds the HeapRegions. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/ptrQueue.cpp --- a/src/share/vm/gc_implementation/g1/ptrQueue.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/ptrQueue.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -126,7 +126,7 @@ return res; } else { // Allocate space for the BufferNode in front of the buffer. - char *b = NEW_C_HEAP_ARRAY(char, _sz + BufferNode::aligned_size()); + char *b = NEW_C_HEAP_ARRAY(char, _sz + BufferNode::aligned_size(), mtGC); return BufferNode::make_buffer_from_block(b); } } @@ -149,7 +149,7 @@ assert(_buf_free_list != NULL, "_buf_free_list_sz must be wrong."); void* b = BufferNode::make_block_from_node(_buf_free_list); _buf_free_list = _buf_free_list->next(); - FREE_C_HEAP_ARRAY(char, b); + FREE_C_HEAP_ARRAY(char, b, mtGC); _buf_free_list_sz --; n--; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/satbQueue.cpp --- a/src/share/vm/gc_implementation/g1/satbQueue.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/satbQueue.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -208,7 +208,7 @@ PtrQueueSet::initialize(cbl_mon, fl_lock, process_completed_threshold, -1); _shared_satb_queue.set_lock(lock); if (ParallelGCThreads > 0) { - _par_closures = NEW_C_HEAP_ARRAY(ObjectClosure*, ParallelGCThreads); + _par_closures = NEW_C_HEAP_ARRAY(ObjectClosure*, ParallelGCThreads, mtGC); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/sparsePRT.cpp --- a/src/share/vm/gc_implementation/g1/sparsePRT.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/sparsePRT.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -148,8 +148,8 @@ RSHashTable::RSHashTable(size_t capacity) : _capacity(capacity), _capacity_mask(capacity-1), _occupied_entries(0), _occupied_cards(0), - _entries((SparsePRTEntry*)NEW_C_HEAP_ARRAY(char, SparsePRTEntry::size() * capacity)), - _buckets(NEW_C_HEAP_ARRAY(int, capacity)), + _entries((SparsePRTEntry*)NEW_C_HEAP_ARRAY(char, SparsePRTEntry::size() * capacity, mtGC)), + _buckets(NEW_C_HEAP_ARRAY(int, capacity, mtGC)), _free_list(NullEntry), _free_region(0) { clear(); @@ -157,11 +157,11 @@ RSHashTable::~RSHashTable() { if (_entries != NULL) { - FREE_C_HEAP_ARRAY(SparsePRTEntry, _entries); + FREE_C_HEAP_ARRAY(SparsePRTEntry, _entries, mtGC); _entries = NULL; } if (_buckets != NULL) { - FREE_C_HEAP_ARRAY(int, _buckets); + FREE_C_HEAP_ARRAY(int, _buckets, mtGC); _buckets = NULL; } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/sparsePRT.hpp --- a/src/share/vm/gc_implementation/g1/sparsePRT.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/sparsePRT.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -42,7 +42,7 @@ // insertions only enqueue old versions for deletions, but do not delete // old versions synchronously. -class SparsePRTEntry: public CHeapObj { +class SparsePRTEntry: public CHeapObj { public: enum SomePublicConstants { NullEntry = -1, @@ -101,7 +101,7 @@ }; -class RSHashTable : public CHeapObj { +class RSHashTable : public CHeapObj { friend class RSHashTableIter; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/survRateGroup.cpp --- a/src/share/vm/gc_implementation/g1/survRateGroup.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/survRateGroup.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -43,7 +43,7 @@ reset(); if (summary_surv_rates_len > 0) { size_t length = summary_surv_rates_len; - _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length); + _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length, mtGC); for (size_t i = 0; i < length; ++i) { _summary_surv_rates[i] = new NumberSeq(); } @@ -90,9 +90,9 @@ double* old_accum_surv_rate_pred = _accum_surv_rate_pred; TruncatedSeq** old_surv_rate_pred = _surv_rate_pred; - _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num); - _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num); - _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num); + _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num, mtGC); + _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num, mtGC); + _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num, mtGC); for (size_t i = 0; i < _stats_arrays_length; ++i) { _surv_rate_pred[i] = old_surv_rate_pred[i]; @@ -104,13 +104,13 @@ _stats_arrays_length = _region_num; if (old_surv_rate != NULL) { - FREE_C_HEAP_ARRAY(double, old_surv_rate); + FREE_C_HEAP_ARRAY(double, old_surv_rate, mtGC); } if (old_accum_surv_rate_pred != NULL) { - FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred); + FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred, mtGC); } if (old_surv_rate_pred != NULL) { - FREE_C_HEAP_ARRAY(TruncatedSeq*, old_surv_rate_pred); + FREE_C_HEAP_ARRAY(TruncatedSeq*, old_surv_rate_pred, mtGC); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/survRateGroup.hpp --- a/src/share/vm/gc_implementation/g1/survRateGroup.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/survRateGroup.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,7 +29,7 @@ class G1CollectorPolicy; -class SurvRateGroup : public CHeapObj { +class SurvRateGroup : public CHeapObj { private: G1CollectorPolicy* _g1p; const char* _name; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/vm_operations_g1.cpp --- a/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -42,6 +42,7 @@ void VM_G1CollectForAllocation::doit() { G1CollectedHeap* g1h = G1CollectedHeap::heap(); + GCCauseSetter x(g1h, _gc_cause); _result = g1h->satisfy_failed_allocation(_word_size, &_pause_succeeded); assert(_result == NULL || _pause_succeeded, "if we get back a result, the pause should have succeeded"); @@ -63,7 +64,7 @@ _should_initiate_conc_mark(should_initiate_conc_mark), _target_pause_time_ms(target_pause_time_ms), _should_retry_gc(false), - _full_collections_completed_before(0) { + _old_marking_cycles_completed_before(0) { guarantee(target_pause_time_ms > 0.0, err_msg("target_pause_time_ms = %1.6lf should be positive", target_pause_time_ms)); @@ -111,11 +112,11 @@ GCCauseSetter x(g1h, _gc_cause); if (_should_initiate_conc_mark) { - // It's safer to read full_collections_completed() here, given + // It's safer to read old_marking_cycles_completed() here, given // that noone else will be updating it concurrently. Since we'll // only need it if we're initiating a marking cycle, no point in // setting it earlier. - _full_collections_completed_before = g1h->full_collections_completed(); + _old_marking_cycles_completed_before = g1h->old_marking_cycles_completed(); // At this point we are supposed to start a concurrent cycle. We // will do so if one is not already in progress. @@ -180,17 +181,17 @@ G1CollectedHeap* g1h = G1CollectedHeap::heap(); - // In the doit() method we saved g1h->full_collections_completed() - // in the _full_collections_completed_before field. We have to - // wait until we observe that g1h->full_collections_completed() + // In the doit() method we saved g1h->old_marking_cycles_completed() + // in the _old_marking_cycles_completed_before field. We have to + // wait until we observe that g1h->old_marking_cycles_completed() // has increased by at least one. This can happen if a) we started // a cycle and it completes, b) a cycle already in progress // completes, or c) a Full GC happens. // If the condition has already been reached, there's no point in // actually taking the lock and doing the wait. - if (g1h->full_collections_completed() <= - _full_collections_completed_before) { + if (g1h->old_marking_cycles_completed() <= + _old_marking_cycles_completed_before) { // The following is largely copied from CMS Thread* thr = Thread::current(); @@ -199,8 +200,8 @@ ThreadToNativeFromVM native(jt); MutexLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag); - while (g1h->full_collections_completed() <= - _full_collections_completed_before) { + while (g1h->old_marking_cycles_completed() <= + _old_marking_cycles_completed_before) { FullGCCount_lock->wait(Mutex::_no_safepoint_check_flag); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/g1/vm_operations_g1.hpp --- a/src/share/vm/gc_implementation/g1/vm_operations_g1.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/g1/vm_operations_g1.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -80,7 +80,7 @@ bool _should_initiate_conc_mark; bool _should_retry_gc; double _target_pause_time_ms; - unsigned int _full_collections_completed_before; + unsigned int _old_marking_cycles_completed_before; public: VM_G1IncCollectionPause(unsigned int gc_count_before, size_t word_size, diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp --- a/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -457,12 +457,12 @@ if (_lowest_non_clean[i] != NULL) { assert(n_chunks != _lowest_non_clean_chunk_size[i], "logical consequence"); - FREE_C_HEAP_ARRAY(CardPtr, _lowest_non_clean[i]); + FREE_C_HEAP_ARRAY(CardPtr, _lowest_non_clean[i], mtGC); _lowest_non_clean[i] = NULL; } // Now allocate a new one if necessary. if (_lowest_non_clean[i] == NULL) { - _lowest_non_clean[i] = NEW_C_HEAP_ARRAY(CardPtr, n_chunks); + _lowest_non_clean[i] = NEW_C_HEAP_ARRAY(CardPtr, n_chunks, mtGC); _lowest_non_clean_chunk_size[i] = n_chunks; _lowest_non_clean_base_chunk_index[i] = addr_to_chunk_index(covered.start()); for (int j = 0; j < (int)n_chunks; j++) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp --- a/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,7 +35,7 @@ class PLABStats; // A per-thread allocation buffer used during GC. -class ParGCAllocBuffer: public CHeapObj { +class ParGCAllocBuffer: public CHeapObj { protected: char head[32]; size_t _word_sz; // in HeapWord units diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parNew/parNewGeneration.cpp --- a/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -59,7 +59,7 @@ Generation* old_gen_, int thread_num_, ObjToScanQueueSet* work_queue_set_, - Stack* overflow_stacks_, + Stack* overflow_stacks_, size_t desired_plab_sz_, ParallelTaskTerminator& term_) : _to_space(to_space_), _old_gen(old_gen_), _young_gen(gen_), _thread_num(thread_num_), @@ -184,7 +184,7 @@ assert(ParGCUseLocalOverflow, "Else should not call"); assert(young_gen()->overflow_list() == NULL, "Error"); ObjToScanQueue* queue = work_queue(); - Stack* const of_stack = overflow_stack(); + Stack* const of_stack = overflow_stack(); const size_t num_overflow_elems = of_stack->size(); const size_t space_available = queue->max_elems() - queue->size(); const size_t num_take_elems = MIN3(space_available / 4, @@ -297,7 +297,7 @@ ParNewGeneration& gen, Generation& old_gen, ObjToScanQueueSet& queue_set, - Stack* overflow_stacks_, + Stack* overflow_stacks_, size_t desired_plab_sz, ParallelTaskTerminator& term); @@ -331,7 +331,7 @@ ParScanThreadStateSet::ParScanThreadStateSet( int num_threads, Space& to_space, ParNewGeneration& gen, Generation& old_gen, ObjToScanQueueSet& queue_set, - Stack* overflow_stacks, + Stack* overflow_stacks, size_t desired_plab_sz, ParallelTaskTerminator& term) : ResourceArray(sizeof(ParScanThreadState), num_threads), _gen(gen), _next_gen(old_gen), _term(term) @@ -649,9 +649,14 @@ _overflow_stacks = NULL; if (ParGCUseLocalOverflow) { - _overflow_stacks = NEW_C_HEAP_ARRAY(Stack, ParallelGCThreads); + + // typedef to workaround NEW_C_HEAP_ARRAY macro, which can not deal + // with ',' + typedef Stack GCOopStack; + + _overflow_stacks = NEW_C_HEAP_ARRAY(GCOopStack, ParallelGCThreads, mtGC); for (size_t i = 0; i < ParallelGCThreads; ++i) { - new (_overflow_stacks + i) Stack(); + new (_overflow_stacks + i) Stack(); } } @@ -916,7 +921,7 @@ size_policy->minor_collection_begin(); } - TraceTime t1("GC", PrintGC && !PrintGCDetails, true, gclog_or_tty); + TraceTime t1(GCCauseString("GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, gclog_or_tty); // Capture heap used before collection (for printing). size_t gch_prev_used = gch->used(); @@ -1401,7 +1406,7 @@ assert(_num_par_pushes > 0, "Tautology"); #endif if (from_space_obj->forwardee() == from_space_obj) { - oopDesc* listhead = NEW_C_HEAP_ARRAY(oopDesc, 1); + oopDesc* listhead = NEW_C_HEAP_ARRAY(oopDesc, 1, mtGC); listhead->forward_to(from_space_obj); from_space_obj = listhead; } @@ -1553,7 +1558,7 @@ // This can become a scaling bottleneck when there is work queue overflow coincident // with promotion failure. oopDesc* f = cur; - FREE_C_HEAP_ARRAY(oopDesc, f); + FREE_C_HEAP_ARRAY(oopDesc, f, mtGC); } else if (par_scan_state->should_be_partially_scanned(obj_to_push, cur)) { assert(arrayOop(cur)->length() == 0, "entire array remaining to be scanned"); obj_to_push = cur; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parNew/parNewGeneration.hpp --- a/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -41,7 +41,7 @@ // in genOopClosures.inline.hpp. typedef Padded ObjToScanQueue; -typedef GenericTaskQueueSet ObjToScanQueueSet; +typedef GenericTaskQueueSet ObjToScanQueueSet; class ParKeepAliveClosure: public DefNewGeneration::KeepAliveClosure { private: @@ -59,7 +59,7 @@ friend class ParScanThreadStateSet; private: ObjToScanQueue *_work_queue; - Stack* const _overflow_stack; + Stack* const _overflow_stack; ParGCAllocBuffer _to_space_alloc_buffer; @@ -127,7 +127,7 @@ ParScanThreadState(Space* to_space_, ParNewGeneration* gen_, Generation* old_gen_, int thread_num_, ObjToScanQueueSet* work_queue_set_, - Stack* overflow_stacks_, + Stack* overflow_stacks_, size_t desired_plab_sz_, ParallelTaskTerminator& term_); @@ -151,7 +151,7 @@ void trim_queues(int max_size); // Private overflow stack usage - Stack* overflow_stack() { return _overflow_stack; } + Stack* overflow_stack() { return _overflow_stack; } bool take_from_overflow_stack(); void push_on_overflow_stack(oop p); @@ -312,7 +312,7 @@ ObjToScanQueueSet* _task_queues; // Per-worker-thread local overflow stacks - Stack* _overflow_stacks; + Stack* _overflow_stacks; // Desired size of survivor space plab's PLABStats _plab_stats; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parNew/parOopClosures.hpp --- a/src/share/vm/gc_implementation/parNew/parOopClosures.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parNew/parOopClosures.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -32,7 +32,7 @@ class ParScanThreadState; class ParNewGeneration; typedef Padded ObjToScanQueue; -typedef GenericTaskQueueSet ObjToScanQueueSet; +typedef GenericTaskQueueSet ObjToScanQueueSet; class ParallelTaskTerminator; class ParScanClosure: public OopsInGenClosure { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,7 +40,7 @@ // must be shrunk. Adjusting the boundary between the generations // is called for in this class. -class AdjoiningGenerations : public CHeapObj { +class AdjoiningGenerations : public CHeapObj { friend class VMStructs; private: // The young generation and old generation, respectively diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -116,7 +116,7 @@ } GCTaskQueue* GCTaskQueue::create_on_c_heap() { - GCTaskQueue* result = new(ResourceObj::C_HEAP) GCTaskQueue(true); + GCTaskQueue* result = new(ResourceObj::C_HEAP, mtGC) GCTaskQueue(true); if (TraceGCTaskQueue) { tty->print_cr("GCTaskQueue::create_on_c_heap()" " returns " INTPTR_FORMAT, @@ -403,19 +403,19 @@ _queue = SynchronizedGCTaskQueue::create(unsynchronized_queue, lock()); _noop_task = NoopGCTask::create_on_c_heap(); _idle_inactive_task = WaitForBarrierGCTask::create_on_c_heap(); - _resource_flag = NEW_C_HEAP_ARRAY(bool, workers()); + _resource_flag = NEW_C_HEAP_ARRAY(bool, workers(), mtGC); { // Set up worker threads. // Distribute the workers among the available processors, // unless we were told not to, or if the os doesn't want to. - uint* processor_assignment = NEW_C_HEAP_ARRAY(uint, workers()); + uint* processor_assignment = NEW_C_HEAP_ARRAY(uint, workers(), mtGC); if (!BindGCTaskThreadsToCPUs || !os::distribute_processes(workers(), processor_assignment)) { for (uint a = 0; a < workers(); a += 1) { processor_assignment[a] = sentinel_worker(); } } - _thread = NEW_C_HEAP_ARRAY(GCTaskThread*, workers()); + _thread = NEW_C_HEAP_ARRAY(GCTaskThread*, workers(), mtGC); for (uint t = 0; t < workers(); t += 1) { set_thread(t, GCTaskThread::create(this, t, processor_assignment[t])); } @@ -426,7 +426,7 @@ } tty->cr(); } - FREE_C_HEAP_ARRAY(uint, processor_assignment); + FREE_C_HEAP_ARRAY(uint, processor_assignment, mtGC); } reset_busy_workers(); set_unblocked(); @@ -455,11 +455,11 @@ GCTaskThread::destroy(thread(i)); set_thread(i, NULL); } - FREE_C_HEAP_ARRAY(GCTaskThread*, _thread); + FREE_C_HEAP_ARRAY(GCTaskThread*, _thread, mtGC); _thread = NULL; } if (_resource_flag != NULL) { - FREE_C_HEAP_ARRAY(bool, _resource_flag); + FREE_C_HEAP_ARRAY(bool, _resource_flag, mtGC); _resource_flag = NULL; } if (queue() != NULL) { @@ -817,7 +817,7 @@ } NoopGCTask* NoopGCTask::create_on_c_heap() { - NoopGCTask* result = new(ResourceObj::C_HEAP) NoopGCTask(true); + NoopGCTask* result = new(ResourceObj::C_HEAP, mtGC) NoopGCTask(true); return result; } @@ -848,7 +848,7 @@ } IdleGCTask* IdleGCTask::create_on_c_heap() { - IdleGCTask* result = new(ResourceObj::C_HEAP) IdleGCTask(true); + IdleGCTask* result = new(ResourceObj::C_HEAP, mtGC) IdleGCTask(true); assert(UseDynamicNumberOfGCThreads, "Should only be used with dynamic GC thread"); return result; @@ -984,7 +984,7 @@ WaitForBarrierGCTask* WaitForBarrierGCTask::create_on_c_heap() { WaitForBarrierGCTask* result = - new (ResourceObj::C_HEAP) WaitForBarrierGCTask(true); + new (ResourceObj::C_HEAP, mtGC) WaitForBarrierGCTask(true); return result; } @@ -1114,7 +1114,7 @@ // Lazy initialization. if (freelist() == NULL) { _freelist = - new(ResourceObj::C_HEAP) GrowableArray(ParallelGCThreads, + new(ResourceObj::C_HEAP, mtGC) GrowableArray(ParallelGCThreads, true); } if (! freelist()->is_empty()) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -216,7 +216,7 @@ // A GCTaskQueue that can be synchronized. // This "has-a" GCTaskQueue and a mutex to do the exclusion. -class SynchronizedGCTaskQueue : public CHeapObj { +class SynchronizedGCTaskQueue : public CHeapObj { private: // Instance state. GCTaskQueue* _unsynchronized_queue; // Has-a unsynchronized queue. @@ -278,7 +278,7 @@ // This is an abstract base class for getting notifications // when a GCTaskManager is done. -class NotifyDoneClosure : public CHeapObj { +class NotifyDoneClosure : public CHeapObj { public: // The notification callback method. virtual void notify(GCTaskManager* manager) = 0; @@ -355,7 +355,7 @@ // held in the GCTaskThread** _thread array in GCTaskManager. -class GCTaskManager : public CHeapObj { +class GCTaskManager : public CHeapObj { friend class ParCompactionManager; friend class PSParallelCompact; friend class PSScavenge; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -46,7 +46,7 @@ vm_exit_out_of_memory(0, "Cannot create GC thread. Out of system resources."); if (PrintGCTaskTimeStamps) { - _time_stamps = NEW_C_HEAP_ARRAY(GCTaskTimeStamp, GCTaskTimeStampEntries ); + _time_stamps = NEW_C_HEAP_ARRAY(GCTaskTimeStamp, GCTaskTimeStampEntries, mtGC); guarantee(_time_stamps != NULL, "Sanity"); } @@ -56,7 +56,7 @@ GCTaskThread::~GCTaskThread() { if (_time_stamps != NULL) { - FREE_C_HEAP_ARRAY(GCTaskTimeStamp, _time_stamps); + FREE_C_HEAP_ARRAY(GCTaskTimeStamp, _time_stamps, mtGC); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -90,7 +90,7 @@ void set_is_working(bool v) { _is_working = v; } }; -class GCTaskTimeStamp : public CHeapObj +class GCTaskTimeStamp : public CHeapObj { private: jlong _entry_time; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -28,6 +28,7 @@ #include "memory/cardTableModRefBS.hpp" #include "oops/oop.inline.hpp" #include "runtime/java.hpp" +#include "services/memTracker.hpp" void ObjectStartArray::initialize(MemRegion reserved_region) { // We're based on the assumption that we use the same @@ -50,6 +51,7 @@ if (!backing_store.is_reserved()) { vm_exit_during_initialization("Could not reserve space for ObjectStartArray"); } + MemTracker::record_virtual_memory_type((address)backing_store.base(), mtGC); // We do not commit any memory initially if (!_virtual_space.initialize(backing_store, 0)) { @@ -57,10 +59,14 @@ } _raw_base = (jbyte*)_virtual_space.low_boundary(); + if (_raw_base == NULL) { vm_exit_during_initialization("Could not get raw_base address"); } + MemTracker::record_virtual_memory_type((address)_raw_base, mtGC); + + _offset_base = _raw_base - (size_t(reserved_region.start()) >> block_shift); _covered_region.set_start(reserved_region.start()); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,7 +35,7 @@ // covered region. // -class ObjectStartArray : public CHeapObj { +class ObjectStartArray : public CHeapObj { friend class VerifyObjectStartArrayClosure; private: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,6 +29,7 @@ #include "oops/oop.inline.hpp" #include "runtime/os.hpp" #include "utilities/bitMap.inline.hpp" +#include "services/memTracker.hpp" #ifdef TARGET_OS_FAMILY_linux # include "os_linux.inline.hpp" #endif @@ -61,6 +62,9 @@ ReservedSpace rs(bytes, rs_align, rs_align > 0); os::trace_page_sizes("par bitmap", raw_bytes, raw_bytes, page_sz, rs.base(), rs.size()); + + MemTracker::record_virtual_memory_type((address)rs.base(), mtGC); + _virtual_space = new PSVirtualSpace(rs, page_sz); if (_virtual_space != NULL && _virtual_space->expand_by(bytes)) { _region_start = covered_region.start(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -32,7 +32,7 @@ class oopDesc; class ParMarkBitMapClosure; -class ParMarkBitMap: public CHeapObj +class ParMarkBitMap: public CHeapObj { public: typedef BitMap::idx_t idx_t; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,6 +40,7 @@ #include "runtime/handles.inline.hpp" #include "runtime/java.hpp" #include "runtime/vmThread.hpp" +#include "services/memTracker.hpp" #include "utilities/vmError.hpp" PSYoungGen* ParallelScavengeHeap::_young_gen = NULL; @@ -161,6 +162,8 @@ } } + MemTracker::record_virtual_memory_type((address)heap_rs.base(), mtJavaHeap); + os::trace_page_sizes("ps perm", pg_min_size, pg_max_size, pg_page_sz, heap_rs.base(), pg_max_size); os::trace_page_sizes("ps main", og_min_size + yg_min_size, diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -81,14 +81,14 @@ uint parallel_gc_threads = PSParallelCompact::gc_task_manager()->workers(); assert(_manager_array == NULL, "Attempt to initialize twice"); - _manager_array = NEW_C_HEAP_ARRAY(ParCompactionManager*, parallel_gc_threads+1 ); + _manager_array = NEW_C_HEAP_ARRAY(ParCompactionManager*, parallel_gc_threads+1, mtGC); guarantee(_manager_array != NULL, "Could not allocate manager_array"); _region_list = NEW_C_HEAP_ARRAY(RegionTaskQueue*, - parallel_gc_threads+1); + parallel_gc_threads+1, mtGC); guarantee(_region_list != NULL, "Could not initialize promotion manager"); - _recycled_stack_index = NEW_C_HEAP_ARRAY(uint, parallel_gc_threads); + _recycled_stack_index = NEW_C_HEAP_ARRAY(uint, parallel_gc_threads, mtGC); // parallel_gc-threads + 1 to be consistent with the number of // compaction managers. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -41,7 +41,7 @@ class ParallelCompactData; class ParMarkBitMap; -class ParCompactionManager : public CHeapObj { +class ParCompactionManager : public CHeapObj { friend class ParallelTaskTerminator; friend class ParMarkBitMap; friend class PSParallelCompact; @@ -66,8 +66,8 @@ private: // 32-bit: 4K * 8 = 32KiB; 64-bit: 8K * 16 = 128KiB #define QUEUE_SIZE (1 << NOT_LP64(12) LP64_ONLY(13)) - typedef OverflowTaskQueue ObjArrayTaskQueue; - typedef GenericTaskQueueSet ObjArrayTaskQueueSet; + typedef OverflowTaskQueue ObjArrayTaskQueue; + typedef GenericTaskQueueSet ObjArrayTaskQueueSet; #undef QUEUE_SIZE static ParCompactionManager** _manager_array; @@ -78,7 +78,7 @@ static PSOldGen* _old_gen; private: - OverflowTaskQueue _marking_stack; + OverflowTaskQueue _marking_stack; ObjArrayTaskQueue _objarray_stack; // Is there a way to reuse the _marking_stack for the @@ -110,8 +110,8 @@ // popped. If -1, there has not been any entry popped. static int _recycled_bottom; - Stack _revisit_klass_stack; - Stack _revisit_mdo_stack; + Stack _revisit_klass_stack; + Stack _revisit_mdo_stack; static ParMarkBitMap* _mark_bitmap; @@ -126,7 +126,7 @@ protected: // Array of tasks. Needed by the ParallelTaskTerminator. static RegionTaskQueueSet* region_array() { return _region_array; } - OverflowTaskQueue* marking_stack() { return &_marking_stack; } + OverflowTaskQueue* marking_stack() { return &_marking_stack; } // Pushes onto the marking stack. If the marking stack is full, // pushes onto the overflow stack. @@ -175,8 +175,8 @@ bool should_update(); bool should_copy(); - Stack* revisit_klass_stack() { return &_revisit_klass_stack; } - Stack* revisit_mdo_stack() { return &_revisit_mdo_stack; } + Stack* revisit_klass_stack() { return &_revisit_klass_stack; } + Stack* revisit_mdo_stack() { return &_revisit_mdo_stack; } // Save for later processing. Must not fail. inline void push(oop obj) { _marking_stack.push(obj); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,7 +40,7 @@ const char* cns = PerfDataManager::name_space("generation", ordinal); - _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1); + _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC); strcpy(_name_space, cns); const char* cname = PerfDataManager::counter_name(_name_space, "name"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -160,16 +160,10 @@ { HandleMark hm; - const bool is_system_gc = gc_cause == GCCause::_java_lang_system_gc; - // This is useful for debugging but don't change the output the - // the customer sees. - const char* gc_cause_str = "Full GC"; - if (is_system_gc && PrintGCDetails) { - gc_cause_str = "Full GC (System)"; - } + gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps); TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); - TraceTime t1(gc_cause_str, PrintGC, !PrintGCDetails, gclog_or_tty); + TraceTime t1(GCCauseString("Full GC", gc_cause), PrintGC, !PrintGCDetails, gclog_or_tty); TraceCollectorStats tcs(counters()); TraceMemoryManagerStats tms(true /* Full GC */,gc_cause); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ class ObjectStartArray; -class PSMarkSweepDecorator: public CHeapObj { +class PSMarkSweepDecorator: public CHeapObj { private: static PSMarkSweepDecorator* _destination_decorator; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ class PSMarkSweepDecorator; -class PSOldGen : public CHeapObj { +class PSOldGen : public CHeapObj { friend class VMStructs; friend class PSPromotionManager; // Uses the cas_allocate methods friend class ParallelScavengeHeap; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -53,6 +53,7 @@ #include "runtime/vmThread.hpp" #include "services/management.hpp" #include "services/memoryService.hpp" +#include "services/memTracker.hpp" #include "utilities/events.hpp" #include "utilities/stack.inline.hpp" @@ -405,6 +406,9 @@ ReservedSpace rs(bytes, rs_align, rs_align > 0); os::trace_page_sizes("par compact", raw_bytes, raw_bytes, page_sz, rs.base(), rs.size()); + + MemTracker::record_virtual_memory_type((address)rs.base(), mtGC); + PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz); if (vspace != 0) { if (vspace->expand_by(bytes)) { @@ -2047,17 +2051,9 @@ gc_task_manager()->task_idle_workers(); heap->set_par_threads(gc_task_manager()->active_workers()); - const bool is_system_gc = gc_cause == GCCause::_java_lang_system_gc; - - // This is useful for debugging but don't change the output the - // the customer sees. - const char* gc_cause_str = "Full GC"; - if (is_system_gc && PrintGCDetails) { - gc_cause_str = "Full GC (System)"; - } gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps); TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); - TraceTime t1(gc_cause_str, PrintGC, !PrintGCDetails, gclog_or_tty); + TraceTime t1(GCCauseString("Full GC", gc_cause), PrintGC, !PrintGCDetails, gclog_or_tty); TraceCollectorStats tcs(counters()); TraceMemoryManagerStats tms(true /* Full GC */,gc_cause); @@ -2090,7 +2086,8 @@ } #endif // #ifndef PRODUCT - bool max_on_system_gc = UseMaximumCompactionOnSystemGC && is_system_gc; + bool max_on_system_gc = UseMaximumCompactionOnSystemGC + && gc_cause == GCCause::_java_lang_system_gc; summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc); COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity")); @@ -2739,7 +2736,7 @@ for (uint i = 0; i < ParallelGCThreads + 1; i++) { ParCompactionManager* cm = ParCompactionManager::manager_array(i); KeepAliveClosure keep_alive_closure(cm); - Stack* const rks = cm->revisit_klass_stack(); + Stack* const rks = cm->revisit_klass_stack(); if (PrintRevisitStats) { gclog_or_tty->print_cr("Revisit klass stack[%u] length = " SIZE_FORMAT, i, rks->size()); @@ -2772,7 +2769,7 @@ } for (uint i = 0; i < ParallelGCThreads + 1; i++) { ParCompactionManager* cm = ParCompactionManager::manager_array(i); - Stack* rms = cm->revisit_mdo_stack(); + Stack* rms = cm->revisit_mdo_stack(); if (PrintRevisitStats) { gclog_or_tty->print_cr("Revisit MDO stack[%u] size = " SIZE_FORMAT, i, rms->size()); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -36,7 +36,7 @@ class ObjectStartArray; -class PSPromotionLAB : public CHeapObj { +class PSPromotionLAB : public CHeapObj { protected: static size_t filler_header_size; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -45,7 +45,7 @@ _young_space = heap->young_gen()->to_space(); assert(_manager_array == NULL, "Attempt to initialize twice"); - _manager_array = NEW_C_HEAP_ARRAY(PSPromotionManager*, ParallelGCThreads+1 ); + _manager_array = NEW_C_HEAP_ARRAY(PSPromotionManager*, ParallelGCThreads+1, mtGC); guarantee(_manager_array != NULL, "Could not initialize promotion manager"); _stack_array_depth = new OopStarTaskQueueSet(ParallelGCThreads); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -49,7 +49,7 @@ class PSOldGen; class ParCompactionManager; -class PSPromotionManager : public CHeapObj { +class PSPromotionManager : public CHeapObj { friend class PSScavenge; friend class PSRefProcTaskExecutor; private: @@ -77,7 +77,7 @@ bool _old_gen_is_full; OopStarTaskQueue _claimed_stack_depth; - OverflowTaskQueue _claimed_stack_breadth; + OverflowTaskQueue _claimed_stack_breadth; bool _totally_drain; uint _target_stack_size; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -62,8 +62,8 @@ int PSScavenge::_tenuring_threshold = 0; HeapWord* PSScavenge::_young_generation_boundary = NULL; elapsedTimer PSScavenge::_accumulated_time; -Stack PSScavenge::_preserved_mark_stack; -Stack PSScavenge::_preserved_oop_stack; +Stack PSScavenge::_preserved_mark_stack; +Stack PSScavenge::_preserved_oop_stack; CollectorCounters* PSScavenge::_counters = NULL; bool PSScavenge::_promotion_failed = false; @@ -325,7 +325,7 @@ gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps); TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); - TraceTime t1("GC", PrintGC, !PrintGCDetails, gclog_or_tty); + TraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, gclog_or_tty); TraceCollectorStats tcs(counters()); TraceMemoryManagerStats tms(false /* not full GC */,gc_cause); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -71,8 +71,8 @@ static HeapWord* _young_generation_boundary; // The lowest address possible for the young_gen. // This is used to decide if an oop should be scavenged, // cards should be marked, etc. - static Stack _preserved_mark_stack; // List of marks to be restored after failed promotion - static Stack _preserved_oop_stack; // List of oops that need their mark restored. + static Stack _preserved_mark_stack; // List of marks to be restored after failed promotion + static Stack _preserved_oop_stack; // List of oops that need their mark restored. static CollectorCounters* _counters; // collector performance counters static bool _promotion_failed; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -32,7 +32,7 @@ // VirtualSpace is data structure for committing a previously reserved address // range in smaller chunks. -class PSVirtualSpace : public CHeapObj { +class PSVirtualSpace : public CHeapObj { friend class VMStructs; protected: // The space is committed/uncommited in chunks of size _alignment. The diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -33,7 +33,7 @@ class PSMarkSweepDecorator; -class PSYoungGen : public CHeapObj { +class PSYoungGen : public CHeapObj { friend class VMStructs; friend class ParallelScavengeHeap; friend class AdjoiningGenerations; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp --- a/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -38,7 +38,7 @@ class elapsedTimer; class CollectorPolicy; -class AdaptiveSizePolicy : public CHeapObj { +class AdaptiveSizePolicy : public CHeapObj { friend class GCAdaptivePolicyCounters; friend class PSGCAdaptivePolicyCounters; friend class CMSGCAdaptivePolicyCounters; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/cSpaceCounters.cpp --- a/src/share/vm/gc_implementation/shared/cSpaceCounters.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/cSpaceCounters.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -37,7 +37,7 @@ const char* cns = PerfDataManager::name_space(gc->name_space(), "space", ordinal); - _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1); + _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC); strcpy(_name_space, cns); const char* cname = PerfDataManager::counter_name(_name_space, "name"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/cSpaceCounters.hpp --- a/src/share/vm/gc_implementation/shared/cSpaceCounters.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/cSpaceCounters.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -32,7 +32,7 @@ // A CSpaceCounters is a holder class for performance counters // that track a space; -class CSpaceCounters: public CHeapObj { +class CSpaceCounters: public CHeapObj { friend class VMStructs; private: @@ -52,7 +52,7 @@ ContiguousSpace* s, GenerationCounters* gc); ~CSpaceCounters() { - if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space); + if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtInternal); } inline void update_capacity() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/collectorCounters.cpp --- a/src/share/vm/gc_implementation/shared/collectorCounters.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/collectorCounters.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ const char* cns = PerfDataManager::name_space("collector", ordinal); - _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1); + _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC); strcpy(_name_space, cns); char* cname = PerfDataManager::counter_name(_name_space, "name"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/collectorCounters.hpp --- a/src/share/vm/gc_implementation/shared/collectorCounters.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/collectorCounters.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -30,7 +30,7 @@ // CollectorCounters is a holder class for performance counters // that track a collector -class CollectorCounters: public CHeapObj { +class CollectorCounters: public CHeapObj { friend class VMStructs; private: @@ -50,7 +50,7 @@ CollectorCounters(const char* name, int ordinal); ~CollectorCounters() { - if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space); + if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC); } inline PerfCounter* invocation_counter() const { return _invocations; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/gSpaceCounters.cpp --- a/src/share/vm/gc_implementation/shared/gSpaceCounters.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/gSpaceCounters.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -41,7 +41,7 @@ const char* cns = PerfDataManager::name_space(gc->name_space(), "space", ordinal); - _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1); + _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC); strcpy(_name_space, cns); const char* cname = PerfDataManager::counter_name(_name_space, "name"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/gSpaceCounters.hpp --- a/src/share/vm/gc_implementation/shared/gSpaceCounters.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/gSpaceCounters.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ // A GSpaceCounter is a holder class for performance counters // that track a space; -class GSpaceCounters: public CHeapObj { +class GSpaceCounters: public CHeapObj { friend class VMStructs; private: @@ -54,7 +54,7 @@ GenerationCounters* gc, bool sampled=true); ~GSpaceCounters() { - if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space); + if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC); } inline void update_capacity() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/gcPolicyCounters.hpp --- a/src/share/vm/gc_implementation/shared/gcPolicyCounters.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/gcPolicyCounters.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -30,7 +30,7 @@ // GCPolicyCounters is a holder class for performance counters // that track a generation -class GCPolicyCounters: public CHeapObj { +class GCPolicyCounters: public CHeapObj { friend class VMStructs; private: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/gcStats.hpp --- a/src/share/vm/gc_implementation/shared/gcStats.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/gcStats.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -27,7 +27,7 @@ #include "gc_implementation/shared/gcUtil.hpp" -class GCStats : public CHeapObj { +class GCStats : public CHeapObj { protected: // Avg amount promoted; used for avoiding promotion undo // This class does not update deviations if the sample is zero. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/gcUtil.cpp --- a/src/share/vm/gc_implementation/shared/gcUtil.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/gcUtil.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -31,9 +31,15 @@ float average) { // We smooth the samples by not using weight() directly until we've // had enough data to make it meaningful. We'd like the first weight - // used to be 1, the second to be 1/2, etc until we have 100/weight - // samples. - unsigned count_weight = 100/count(); + // used to be 1, the second to be 1/2, etc until we have + // OLD_THRESHOLD/weight samples. + unsigned count_weight = 0; + + // Avoid division by zero if the counter wraps (7158457) + if (!is_old()) { + count_weight = OLD_THRESHOLD/count(); + } + unsigned adaptive_weight = (MAX2(weight(), count_weight)); float new_avg = exp_avg(average, new_sample, adaptive_weight); @@ -43,8 +49,6 @@ void AdaptiveWeightedAverage::sample(float new_sample) { increment_count(); - assert(count() != 0, - "Wraparound -- history would be incorrectly discarded"); // Compute the new weighted average float new_avg = compute_adaptive_average(new_sample, average()); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/gcUtil.hpp --- a/src/share/vm/gc_implementation/shared/gcUtil.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/gcUtil.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -43,18 +43,27 @@ // // This serves as our best estimate of a future unknown. // -class AdaptiveWeightedAverage : public CHeapObj { +class AdaptiveWeightedAverage : public CHeapObj { private: float _average; // The last computed average unsigned _sample_count; // How often we've sampled this average unsigned _weight; // The weight used to smooth the averages // A higher weight favors the most // recent data. + bool _is_old; // Has enough historical data + + const static unsigned OLD_THRESHOLD = 100; protected: float _last_sample; // The last value sampled. - void increment_count() { _sample_count++; } + void increment_count() { + _sample_count++; + if (!_is_old && _sample_count > OLD_THRESHOLD) { + _is_old = true; + } + } + void set_average(float avg) { _average = avg; } // Helper function, computes an adaptive weighted average @@ -64,13 +73,15 @@ public: // Input weight must be between 0 and 100 AdaptiveWeightedAverage(unsigned weight, float avg = 0.0) : - _average(avg), _sample_count(0), _weight(weight), _last_sample(0.0) { + _average(avg), _sample_count(0), _weight(weight), _last_sample(0.0), + _is_old(false) { } void clear() { _average = 0; _sample_count = 0; _last_sample = 0; + _is_old = false; } // Useful for modifying static structures after startup. @@ -84,7 +95,8 @@ float average() const { return _average; } unsigned weight() const { return _weight; } unsigned count() const { return _sample_count; } - float last_sample() const { return _last_sample; } + float last_sample() const { return _last_sample; } + bool is_old() const { return _is_old; } // Update data with a new sample. void sample(float new_sample); @@ -134,7 +146,7 @@ // Placement support void* operator new(size_t ignored, void* p) { return p; } // Allocator - void* operator new(size_t size) { return CHeapObj::operator new(size); } + void* operator new(size_t size) { return CHeapObj::operator new(size); } // Accessor float padded_average() const { return _padded_avg; } @@ -180,7 +192,7 @@ // equation. // y = intercept + slope * x -class LinearLeastSquareFit : public CHeapObj { +class LinearLeastSquareFit : public CHeapObj { double _sum_x; // sum of all independent data points x double _sum_x_squared; // sum of all independent data points x**2 double _sum_y; // sum of all dependent data points y diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/generationCounters.cpp --- a/src/share/vm/gc_implementation/shared/generationCounters.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/generationCounters.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,7 +35,7 @@ const char* cns = PerfDataManager::name_space("generation", ordinal); - _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1); + _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC); strcpy(_name_space, cns); const char* cname = PerfDataManager::counter_name(_name_space, "name"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/generationCounters.hpp --- a/src/share/vm/gc_implementation/shared/generationCounters.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/generationCounters.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -31,7 +31,7 @@ // A GenerationCounter is a holder class for performance counters // that track a generation -class GenerationCounters: public CHeapObj { +class GenerationCounters: public CHeapObj { friend class VMStructs; private: @@ -69,7 +69,7 @@ VirtualSpace* v); ~GenerationCounters() { - if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space); + if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC); } virtual void update_all(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/hSpaceCounters.cpp --- a/src/share/vm/gc_implementation/shared/hSpaceCounters.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/hSpaceCounters.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,7 +40,7 @@ const char* cns = PerfDataManager::name_space(gc->name_space(), "space", ordinal); - _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1); + _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC); strcpy(_name_space, cns); const char* cname = PerfDataManager::counter_name(_name_space, "name"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/hSpaceCounters.hpp --- a/src/share/vm/gc_implementation/shared/hSpaceCounters.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/hSpaceCounters.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -37,7 +37,7 @@ class HeapSpaceUsedHelper; class G1SpaceMonitoringSupport; -class HSpaceCounters: public CHeapObj { +class HSpaceCounters: public CHeapObj { friend class VMStructs; private: @@ -55,7 +55,7 @@ size_t initial_capacity, GenerationCounters* gc); ~HSpaceCounters() { - if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space); + if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC); } inline void update_capacity(size_t v) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/immutableSpace.hpp --- a/src/share/vm/gc_implementation/shared/immutableSpace.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/immutableSpace.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -33,7 +33,7 @@ // Invariant: bottom() and end() are on page_size boundaries and // bottom() <= end() -class ImmutableSpace: public CHeapObj { +class ImmutableSpace: public CHeapObj { friend class VMStructs; protected: HeapWord* _bottom; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/markSweep.cpp --- a/src/share/vm/gc_implementation/shared/markSweep.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/markSweep.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -30,13 +30,13 @@ #include "oops/objArrayKlass.inline.hpp" #include "oops/oop.inline.hpp" -Stack MarkSweep::_marking_stack; -Stack MarkSweep::_revisit_mdo_stack; -Stack MarkSweep::_revisit_klass_stack; -Stack MarkSweep::_objarray_stack; +Stack MarkSweep::_marking_stack; +Stack MarkSweep::_revisit_mdo_stack; +Stack MarkSweep::_revisit_klass_stack; +Stack MarkSweep::_objarray_stack; -Stack MarkSweep::_preserved_oop_stack; -Stack MarkSweep::_preserved_mark_stack; +Stack MarkSweep::_preserved_oop_stack; +Stack MarkSweep::_preserved_mark_stack; size_t MarkSweep::_preserved_count = 0; size_t MarkSweep::_preserved_count_max = 0; PreservedMark* MarkSweep::_preserved_marks = NULL; @@ -166,7 +166,7 @@ } // deal with the overflow stack - StackIterator iter(_preserved_oop_stack); + StackIterator iter(_preserved_oop_stack); while (!iter.is_empty()) { oop* p = iter.next_addr(); adjust_pointer(p); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/markSweep.hpp --- a/src/share/vm/gc_implementation/shared/markSweep.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/markSweep.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -122,16 +122,16 @@ // protected: // Traversal stacks used during phase1 - static Stack _marking_stack; - static Stack _objarray_stack; + static Stack _marking_stack; + static Stack _objarray_stack; // Stack for live klasses to revisit at end of marking phase - static Stack _revisit_klass_stack; + static Stack _revisit_klass_stack; // Set (stack) of MDO's to revisit at end of marking phase - static Stack _revisit_mdo_stack; + static Stack _revisit_mdo_stack; // Space for storing/restoring mark word - static Stack _preserved_mark_stack; - static Stack _preserved_oop_stack; + static Stack _preserved_mark_stack; + static Stack _preserved_oop_stack; static size_t _preserved_count; static size_t _preserved_count_max; static PreservedMark* _preserved_marks; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp --- a/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -43,7 +43,7 @@ MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment) { - _lgrp_spaces = new (ResourceObj::C_HEAP) GrowableArray(0, true); + _lgrp_spaces = new (ResourceObj::C_HEAP, mtGC) GrowableArray(0, true); _page_size = os::vm_page_size(); _adaptation_cycles = 0; _samples_count = 0; @@ -231,7 +231,7 @@ if (force || changed) { // Compute lgrp intersection. Add/remove spaces. int lgrp_limit = (int)os::numa_get_groups_num(); - int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit); + int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtGC); int lgrp_num = (int)os::numa_get_leaf_groups(lgrp_ids, lgrp_limit); assert(lgrp_num > 0, "There should be at least one locality group"); // Add new spaces for the new nodes @@ -265,7 +265,7 @@ } } - FREE_C_HEAP_ARRAY(int, lgrp_ids); + FREE_C_HEAP_ARRAY(int, lgrp_ids, mtGC); if (changed) { for (JavaThread *thread = Threads::first(); thread; thread = thread->next()) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp --- a/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -63,7 +63,7 @@ class MutableNUMASpace : public MutableSpace { friend class VMStructs; - class LGRPSpace : public CHeapObj { + class LGRPSpace : public CHeapObj { int _lgrp_id; MutableSpace* _space; MemRegion _invalid_region; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/spaceCounters.cpp --- a/src/share/vm/gc_implementation/shared/spaceCounters.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/spaceCounters.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -39,7 +39,7 @@ const char* cns = PerfDataManager::name_space(gc->name_space(), "space", ordinal); - _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1); + _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC); strcpy(_name_space, cns); const char* cname = PerfDataManager::counter_name(_name_space, "name"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/spaceCounters.hpp --- a/src/share/vm/gc_implementation/shared/spaceCounters.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/spaceCounters.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,7 +35,7 @@ // A SpaceCounter is a holder class for performance counters // that track a space; -class SpaceCounters: public CHeapObj { +class SpaceCounters: public CHeapObj { friend class VMStructs; private: @@ -55,7 +55,7 @@ MutableSpace* m, GenerationCounters* gc); ~SpaceCounters() { - if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space); + if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC); } inline void update_capacity() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_implementation/shared/spaceDecorator.hpp --- a/src/share/vm/gc_implementation/shared/spaceDecorator.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/spaceDecorator.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -70,7 +70,7 @@ // These subclasses abstract the differences in the types of spaces used // by each heap. -class SpaceMangler: public CHeapObj { +class SpaceMangler: public CHeapObj { friend class VMStructs; // High water mark for allocations. Typically, the space above diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_interface/collectedHeap.hpp --- a/src/share/vm/gc_interface/collectedHeap.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_interface/collectedHeap.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -74,7 +74,7 @@ // G1CollectedHeap // ParallelScavengeHeap // -class CollectedHeap : public CHeapObj { +class CollectedHeap : public CHeapObj { friend class VMStructs; friend class IsGCActiveMark; // Block structured external access to _is_gc_active friend class constantPoolCacheKlass; // allocate() method inserts is_conc_safe diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/gc_interface/gcCause.hpp --- a/src/share/vm/gc_interface/gcCause.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/gc_interface/gcCause.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -88,4 +88,36 @@ static const char* to_string(GCCause::Cause cause); }; +// Helper class for doing logging that includes the GC Cause +// as a string. +class GCCauseString : StackObj { + private: + static const int _length = 128; + char _buffer[_length]; + int _position; + + public: + GCCauseString(const char* prefix, GCCause::Cause cause) { + if (PrintGCCause) { + _position = jio_snprintf(_buffer, _length, "%s (%s)", prefix, GCCause::to_string(cause)); + } else { + _position = jio_snprintf(_buffer, _length, "%s", prefix); + } + assert(_position >= 0 && _position <= _length, + err_msg("Need to increase the buffer size in GCCauseString? %d", _position)); + } + + GCCauseString& append(const char* str) { + int res = jio_snprintf(_buffer + _position, _length - _position, "%s", str); + _position += res; + assert(res >= 0 && _position <= _length, + err_msg("Need to increase the buffer size in GCCauseString? %d", res)); + return *this; + } + + operator const char*() { + return _buffer; + } +}; + #endif // SHARE_VM_GC_INTERFACE_GCCAUSE_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/interpreter/abstractInterpreter.hpp --- a/src/share/vm/interpreter/abstractInterpreter.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/interpreter/abstractInterpreter.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -107,6 +107,8 @@ java_lang_math_sqrt, // implementation of java.lang.Math.sqrt (x) java_lang_math_log, // implementation of java.lang.Math.log (x) java_lang_math_log10, // implementation of java.lang.Math.log10 (x) + java_lang_math_pow, // implementation of java.lang.Math.pow (x,y) + java_lang_math_exp, // implementation of java.lang.Math.exp (x) java_lang_ref_reference_get, // implementation of java.lang.ref.Reference.get() number_of_method_entries, invalid = -1 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/interpreter/interpreter.cpp --- a/src/share/vm/interpreter/interpreter.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/interpreter/interpreter.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -221,6 +221,8 @@ case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ; case vmIntrinsics::_dlog : return java_lang_math_log ; case vmIntrinsics::_dlog10: return java_lang_math_log10; + case vmIntrinsics::_dpow : return java_lang_math_pow ; + case vmIntrinsics::_dexp : return java_lang_math_exp ; case vmIntrinsics::_Reference_get: return java_lang_ref_reference_get; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/interpreter/interpreterRuntime.cpp --- a/src/share/vm/interpreter/interpreterRuntime.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/interpreter/interpreterRuntime.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -375,7 +375,6 @@ Handle h_exception(thread, exception); methodHandle h_method (thread, method(thread)); constantPoolHandle h_constants(thread, h_method->constants()); - typeArrayHandle h_extable (thread, h_method->exception_table()); bool should_repeat; int handler_bci; int current_bci = bci(thread); @@ -547,23 +546,6 @@ } } - if (is_put && !is_static && klass->is_subclass_of(SystemDictionary::CallSite_klass()) && (info.name() == vmSymbols::target_name())) { - const jint direction = frame::interpreter_frame_expression_stack_direction(); - Handle call_site (THREAD, *((oop*) thread->last_frame().interpreter_frame_tos_at(-1 * direction))); - Handle method_handle(THREAD, *((oop*) thread->last_frame().interpreter_frame_tos_at( 0 * direction))); - assert(call_site ->is_a(SystemDictionary::CallSite_klass()), "must be"); - assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "must be"); - - { - // Walk all nmethods depending on this call site. - MutexLocker mu(Compile_lock, thread); - Universe::flush_dependents_on(call_site, method_handle); - } - - // Don't allow fast path for setting CallSite.target and sub-classes. - put_code = (Bytecodes::Code) 0; - } - cache_entry(thread)->set_field( get_code, put_code, @@ -844,6 +826,14 @@ int bci = method->bci_from(fr.interpreter_frame_bcp()); nm = method->lookup_osr_nmethod_for(bci, CompLevel_none, false); } +#ifndef PRODUCT + if (TraceOnStackReplacement) { + if (nm != NULL) { + tty->print("OSR entry @ pc: " INTPTR_FORMAT ": ", nm->osr_entry()); + nm->print(); + } + } +#endif return nm; } @@ -1110,8 +1100,8 @@ SignatureHandlerLibrary::buffer_size); _buffer = bb->code_begin(); - _fingerprints = new(ResourceObj::C_HEAP)GrowableArray(32, true); - _handlers = new(ResourceObj::C_HEAP)GrowableArray
(32, true); + _fingerprints = new(ResourceObj::C_HEAP, mtCode)GrowableArray(32, true); + _handlers = new(ResourceObj::C_HEAP, mtCode)GrowableArray
(32, true); } address SignatureHandlerLibrary::set_handler(CodeBuffer* buffer) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/interpreter/oopMapCache.cpp --- a/src/share/vm/interpreter/oopMapCache.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/interpreter/oopMapCache.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -348,7 +348,7 @@ if (mask_size() > small_mask_limit) { assert(_bit_mask[0] == 0, "bit mask should be new or just flushed"); _bit_mask[0] = (intptr_t) - NEW_C_HEAP_ARRAY(uintptr_t, mask_word_size()); + NEW_C_HEAP_ARRAY(uintptr_t, mask_word_size(), mtClass); } } @@ -356,7 +356,7 @@ if (mask_size() > small_mask_limit && _bit_mask[0] != 0) { assert(!Thread::current()->resource_area()->contains((void*)_bit_mask[0]), "This bit mask should not be in the resource area"); - FREE_C_HEAP_ARRAY(uintptr_t, _bit_mask[0]); + FREE_C_HEAP_ARRAY(uintptr_t, _bit_mask[0], mtClass); debug_only(_bit_mask[0] = 0;) } } @@ -506,7 +506,7 @@ OopMapCache::OopMapCache() : _mut(Mutex::leaf, "An OopMapCache lock", true) { - _array = NEW_C_HEAP_ARRAY(OopMapCacheEntry, _size); + _array = NEW_C_HEAP_ARRAY(OopMapCacheEntry, _size, mtClass); // Cannot call flush for initialization, since flush // will check if memory should be deallocated for(int i = 0; i < _size; i++) _array[i].initialize(); @@ -520,7 +520,7 @@ flush(); // Deallocate array NOT_PRODUCT(_total_memory_usage -= sizeof(OopMapCache) + (sizeof(OopMapCacheEntry) * _size);) - FREE_C_HEAP_ARRAY(OopMapCacheEntry, _array); + FREE_C_HEAP_ARRAY(OopMapCacheEntry, _array, mtClass); } OopMapCacheEntry* OopMapCache::entry_at(int i) const { @@ -639,9 +639,9 @@ void OopMapCache::compute_one_oop_map(methodHandle method, int bci, InterpreterOopMap* entry) { // Due to the invariants above it's tricky to allocate a temporary OopMapCacheEntry on the stack - OopMapCacheEntry* tmp = NEW_C_HEAP_ARRAY(OopMapCacheEntry, 1); + OopMapCacheEntry* tmp = NEW_C_HEAP_ARRAY(OopMapCacheEntry, 1, mtClass); tmp->initialize(); tmp->fill(method, bci); entry->resource_copy(tmp); - FREE_C_HEAP_ARRAY(OopMapCacheEntry, tmp); + FREE_C_HEAP_ARRAY(OopMapCacheEntry, tmp, mtInternal); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/interpreter/oopMapCache.hpp --- a/src/share/vm/interpreter/oopMapCache.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/interpreter/oopMapCache.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -156,7 +156,7 @@ #endif }; -class OopMapCache : public CHeapObj { +class OopMapCache : public CHeapObj { private: enum { _size = 32, // Use fixed size for now _probe_depth = 3 // probe depth in case of collisions diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/interpreter/templateInterpreter.cpp --- a/src/share/vm/interpreter/templateInterpreter.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/interpreter/templateInterpreter.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -370,6 +370,8 @@ method_entry(java_lang_math_sqrt ) method_entry(java_lang_math_log ) method_entry(java_lang_math_log10) + method_entry(java_lang_math_exp ) + method_entry(java_lang_math_pow ) method_entry(java_lang_ref_reference_get) // all native method kinds (must be one contiguous block) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/libadt/set.cpp --- a/src/share/vm/libadt/set.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/libadt/set.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -71,7 +71,7 @@ set.Sort(); // Sort elements for in-order retrieval uint len = 128; // Total string space - char *buf = NEW_C_HEAP_ARRAY(char,len);// Some initial string space + char *buf = NEW_C_HEAP_ARRAY(char,len, mtCompiler);// Some initial string space register char *s = buf; // Current working string pointer *s++ = '{'; @@ -86,7 +86,7 @@ if( buf+len-s < 25 ) { // Generous trailing space for upcoming numbers int offset = (int)(s-buf);// Not enuf space; compute offset into buffer len <<= 1; // Double string size - buf = REALLOC_C_HEAP_ARRAY(char,buf,len); // Reallocate doubled size + buf = REALLOC_C_HEAP_ARRAY(char,buf,len, mtCompiler); // Reallocate doubled size s = buf+offset; // Get working pointer into new bigger buffer } if( lo != (uint)-2 ) { // Startup? No! Then print previous range. @@ -101,7 +101,7 @@ if( buf+len-s < 25 ) { // Generous trailing space for upcoming numbers int offset = (int)(s-buf);// Not enuf space; compute offset into buffer len <<= 1; // Double string size - buf = (char*)ReallocateHeap(buf,len); // Reallocate doubled size + buf = (char*)ReallocateHeap(buf,len, mtCompiler); // Reallocate doubled size s = buf+offset; // Get working pointer into new bigger buffer } if( lo != hi ) sprintf(s,"%d-%d}",lo,hi); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/libadt/vectset.cpp --- a/src/share/vm/libadt/vectset.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/libadt/vectset.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -362,7 +362,7 @@ }; SetI_ *VectorSet::iterate(uint &elem) const { - return new(ResourceObj::C_HEAP) VSetI_(this, elem); + return new(ResourceObj::C_HEAP, mtInternal) VSetI_(this, elem); } //============================================================================= diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/allocation.cpp --- a/src/share/vm/memory/allocation.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/allocation.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -26,10 +26,13 @@ #include "memory/allocation.hpp" #include "memory/allocation.inline.hpp" #include "memory/resourceArea.hpp" +#include "runtime/atomic.hpp" #include "runtime/os.hpp" #include "runtime/task.hpp" #include "runtime/threadCritical.hpp" +#include "services/memTracker.hpp" #include "utilities/ostream.hpp" + #ifdef TARGET_OS_FAMILY_linux # include "os_linux.inline.hpp" #endif @@ -43,32 +46,16 @@ # include "os_bsd.inline.hpp" #endif -void* CHeapObj::operator new(size_t size){ - return (void *) AllocateHeap(size, "CHeapObj-new"); -} - -void* CHeapObj::operator new (size_t size, const std::nothrow_t& nothrow_constant) { - char* p = (char*) os::malloc(size); -#ifdef ASSERT - if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p); -#endif - return p; -} - -void CHeapObj::operator delete(void* p){ - FreeHeap(p); -} - void* StackObj::operator new(size_t size) { ShouldNotCallThis(); return 0; }; void StackObj::operator delete(void* p) { ShouldNotCallThis(); }; void* _ValueObj::operator new(size_t size) { ShouldNotCallThis(); return 0; }; void _ValueObj::operator delete(void* p) { ShouldNotCallThis(); }; -void* ResourceObj::operator new(size_t size, allocation_type type) { +void* ResourceObj::operator new(size_t size, allocation_type type, MEMFLAGS flags) { address res; switch (type) { case C_HEAP: - res = (address)AllocateHeap(size, "C_Heap: ResourceOBJ"); + res = (address)AllocateHeap(size, flags, CALLER_PC); DEBUG_ONLY(set_allocation_type(res, C_HEAP);) break; case RESOURCE_AREA: @@ -184,7 +171,7 @@ // MT-safe pool of chunks to reduce malloc/free thrashing // NB: not using Mutex because pools are used before Threads are initialized -class ChunkPool { +class ChunkPool: public CHeapObj { Chunk* _first; // first cached Chunk; its first word points to next chunk size_t _num_chunks; // number of unused chunks in pool size_t _num_used; // number of chunks currently checked out @@ -210,14 +197,16 @@ ChunkPool(size_t size) : _size(size) { _first = NULL; _num_chunks = _num_used = 0; } // Allocate a new chunk from the pool (might expand the pool) - void* allocate(size_t bytes) { + _NOINLINE_ void* allocate(size_t bytes) { assert(bytes == _size, "bad size"); void* p = NULL; + // No VM lock can be taken inside ThreadCritical lock, so os::malloc + // should be done outside ThreadCritical lock due to NMT { ThreadCritical tc; _num_used++; p = get_first(); - if (p == NULL) p = os::malloc(bytes); } + if (p == NULL) p = os::malloc(bytes, mtChunk, CURRENT_PC); if (p == NULL) vm_exit_out_of_memory(bytes, "ChunkPool::allocate"); @@ -238,28 +227,34 @@ // Prune the pool void free_all_but(size_t n) { + Chunk* cur = NULL; + Chunk* next; + { // if we have more than n chunks, free all of them ThreadCritical tc; if (_num_chunks > n) { // free chunks at end of queue, for better locality - Chunk* cur = _first; + cur = _first; for (size_t i = 0; i < (n - 1) && cur != NULL; i++) cur = cur->next(); if (cur != NULL) { - Chunk* next = cur->next(); + next = cur->next(); cur->set_next(NULL); cur = next; - // Free all remaining chunks + _num_chunks = n; + } + } + } + + // Free all remaining chunks, outside of ThreadCritical + // to avoid deadlock with NMT while(cur != NULL) { next = cur->next(); - os::free(cur); - _num_chunks--; + os::free(cur, mtChunk); cur = next; } } - } - } // Accessors to preallocated pool's static ChunkPool* large_pool() { assert(_large_pool != NULL, "must be initialized"); return _large_pool; } @@ -323,7 +318,7 @@ case Chunk::medium_size: return ChunkPool::medium_pool()->allocate(bytes); case Chunk::init_size: return ChunkPool::small_pool()->allocate(bytes); default: { - void *p = os::malloc(bytes); + void *p = os::malloc(bytes, mtChunk, CALLER_PC); if (p == NULL) vm_exit_out_of_memory(bytes, "Chunk::new"); return p; @@ -337,7 +332,7 @@ case Chunk::size: ChunkPool::large_pool()->free(c); break; case Chunk::medium_size: ChunkPool::medium_pool()->free(c); break; case Chunk::init_size: ChunkPool::small_pool()->free(c); break; - default: os::free(c); + default: os::free(c, mtChunk); } } @@ -374,6 +369,7 @@ } //------------------------------Arena------------------------------------------ +NOT_PRODUCT(volatile jint Arena::_instance_count = 0;) Arena::Arena(size_t init_size) { size_t round_size = (sizeof (char *)) - 1; @@ -382,6 +378,7 @@ _hwm = _chunk->bottom(); // Save the cached hwm, max _max = _chunk->top(); set_size_in_bytes(init_size); + NOT_PRODUCT(Atomic::inc(&_instance_count);) } Arena::Arena() { @@ -389,12 +386,15 @@ _hwm = _chunk->bottom(); // Save the cached hwm, max _max = _chunk->top(); set_size_in_bytes(Chunk::init_size); + NOT_PRODUCT(Atomic::inc(&_instance_count);) } Arena::Arena(Arena *a) : _chunk(a->_chunk), _hwm(a->_hwm), _max(a->_max), _first(a->_first) { set_size_in_bytes(a->size_in_bytes()); + NOT_PRODUCT(Atomic::inc(&_instance_count);) } + Arena *Arena::move_contents(Arena *copy) { copy->destruct_contents(); copy->_chunk = _chunk; @@ -409,6 +409,42 @@ Arena::~Arena() { destruct_contents(); + NOT_PRODUCT(Atomic::dec(&_instance_count);) +} + +void* Arena::operator new(size_t size) { + assert(false, "Use dynamic memory type binding"); + return NULL; +} + +void* Arena::operator new (size_t size, const std::nothrow_t& nothrow_constant) { + assert(false, "Use dynamic memory type binding"); + return NULL; +} + + // dynamic memory type binding +void* Arena::operator new(size_t size, MEMFLAGS flags) { +#ifdef ASSERT + void* p = (void*)AllocateHeap(size, flags|otArena, CALLER_PC); + if (PrintMallocFree) trace_heap_malloc(size, "Arena-new", p); + return p; +#else + return (void *) AllocateHeap(size, flags|otArena, CALLER_PC); +#endif +} + +void* Arena::operator new(size_t size, const std::nothrow_t& nothrow_constant, MEMFLAGS flags) { +#ifdef ASSERT + void* p = os::malloc(size, flags|otArena, CALLER_PC); + if (PrintMallocFree) trace_heap_malloc(size, "Arena-new", p); + return p; +#else + return os::malloc(size, flags|otArena, CALLER_PC); +#endif +} + +void Arena::operator delete(void* p) { + FreeHeap(p); } // Destroy this arenas contents and reset to empty @@ -421,6 +457,14 @@ reset(); } +// This is high traffic method, but many calls actually don't +// change the size +void Arena::set_size_in_bytes(size_t size) { + if (_size_in_bytes != size) { + _size_in_bytes = size; + MemTracker::record_arena_size((address)this, size); + } +} // Total of all Chunks in arena size_t Arena::used() const { @@ -448,7 +492,6 @@ if (_chunk == NULL) { signal_out_of_memory(len * Chunk::aligned_overhead_size(), "Arena::grow"); } - if (k) k->set_next(_chunk); // Append new chunk to end of linked list else _first = _chunk; _hwm = _chunk->bottom(); // Save the cached hwm, max @@ -538,7 +581,7 @@ assert(UseMallocOnly, "shouldn't call"); // use malloc, but save pointer in res. area for later freeing char** save = (char**)internal_malloc_4(sizeof(char*)); - return (*save = (char*)os::malloc(size)); + return (*save = (char*)os::malloc(size, mtChunk)); } // for debugging with UseMallocOnly diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/allocation.hpp --- a/src/share/vm/memory/allocation.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/allocation.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,6 +40,18 @@ #define ARENA_ALIGN_MASK (~((size_t)ARENA_ALIGN_M1)) #define ARENA_ALIGN(x) ((((size_t)(x)) + ARENA_ALIGN_M1) & ARENA_ALIGN_MASK) + +// noinline attribute +#ifdef _WINDOWS + #define _NOINLINE_ __declspec(noinline) +#else + #if __GNUC__ < 3 // gcc 2.x does not support noinline attribute + #define _NOINLINE_ + #else + #define _NOINLINE_ __attribute__ ((noinline)) + #endif +#endif + // All classes in the virtual machine must be subclassed // by one of the following allocation classes: // @@ -98,12 +110,72 @@ }; #endif -class CHeapObj ALLOCATION_SUPER_CLASS_SPEC { + +/* + * MemoryType bitmap layout: + * | 16 15 14 13 12 11 10 09 | 08 07 06 05 | 04 03 02 01 | + * | memory type | object | reserved | + * | | type | | + */ +enum MemoryType { + // Memory type by sub systems. It occupies lower byte. + mtNone = 0x0000, // undefined + mtClass = 0x0100, // memory class for Java classes + mtThread = 0x0200, // memory for thread objects + mtThreadStack = 0x0300, + mtCode = 0x0400, // memory for generated code + mtGC = 0x0500, // memory for GC + mtCompiler = 0x0600, // memory for compiler + mtInternal = 0x0700, // memory used by VM, but does not belong to + // any of above categories, and not used for + // native memory tracking + mtOther = 0x0800, // memory not used by VM + mtSymbol = 0x0900, // symbol + mtNMT = 0x0A00, // memory used by native memory tracking + mtChunk = 0x0B00, // chunk that holds content of arenas + mtJavaHeap = 0x0C00, // Java heap + mtDontTrack = 0x0D00, // memory we donot or cannot track + mt_number_of_types = 0x000C, // number of memory types + mt_masks = 0x7F00, + + // object type mask + otArena = 0x0010, // an arena object + otNMTRecorder = 0x0020, // memory recorder object + ot_masks = 0x00F0 +}; + +#define IS_MEMORY_TYPE(flags, type) ((flags & mt_masks) == type) +#define HAS_VALID_MEMORY_TYPE(flags)((flags & mt_masks) != mtNone) +#define FLAGS_TO_MEMORY_TYPE(flags) (flags & mt_masks) + +#define IS_ARENA_OBJ(flags) ((flags & ot_masks) == otArena) +#define IS_NMT_RECORDER(flags) ((flags & ot_masks) == otNMTRecorder) +#define NMT_CAN_TRACK(flags) (!IS_NMT_RECORDER(flags) && !(IS_MEMORY_TYPE(flags, mtDontTrack))) + +typedef unsigned short MEMFLAGS; + +extern bool NMT_track_callsite; + +// debug build does not inline +#if defined(_DEBUG_) + #define CURRENT_PC (NMT_track_callsite ? os::get_caller_pc(1) : 0) + #define CALLER_PC (NMT_track_callsite ? os::get_caller_pc(2) : 0) + #define CALLER_CALLER_PC (NMT_track_callsite ? os::get_caller_pc(3) : 0) +#else + #define CURRENT_PC (NMT_track_callsite? os::get_caller_pc(0) : 0) + #define CALLER_PC (NMT_track_callsite ? os::get_caller_pc(1) : 0) + #define CALLER_CALLER_PC (NMT_track_callsite ? os::get_caller_pc(2) : 0) +#endif + + + +template class CHeapObj ALLOCATION_SUPER_CLASS_SPEC { public: - void* operator new(size_t size); - void* operator new (size_t size, const std::nothrow_t& nothrow_constant); + _NOINLINE_ void* operator new(size_t size, address caller_pc = 0); + _NOINLINE_ void* operator new (size_t size, const std::nothrow_t& nothrow_constant, + address caller_pc = 0); + void operator delete(void* p); - void* new_array(size_t size); }; // Base class for objects allocated on the stack only. @@ -150,7 +222,7 @@ //------------------------------Chunk------------------------------------------ // Linked list of raw memory chunks -class Chunk: public CHeapObj { +class Chunk: CHeapObj { friend class VMStructs; protected: @@ -197,7 +269,7 @@ //------------------------------Arena------------------------------------------ // Fast allocation of memory -class Arena: public CHeapObj { +class Arena : public CHeapObj { protected: friend class ResourceMark; friend class HandleMark; @@ -208,7 +280,8 @@ Chunk *_chunk; // current chunk char *_hwm, *_max; // High water mark and max in current chunk void* grow(size_t x); // Get a new Chunk of at least size x - NOT_PRODUCT(size_t _size_in_bytes;) // Size of arena (used for memory usage tracing) + size_t _size_in_bytes; // Size of arena (used for native memory tracking) + NOT_PRODUCT(static julong _bytes_allocated;) // total #bytes allocated since start friend class AllocStats; debug_only(void* malloc(size_t size);) @@ -231,6 +304,15 @@ void destruct_contents(); char* hwm() const { return _hwm; } + // new operators + void* operator new (size_t size); + void* operator new (size_t size, const std::nothrow_t& nothrow_constant); + + // dynamic memory type tagging + void* operator new(size_t size, MEMFLAGS flags); + void* operator new(size_t size, const std::nothrow_t& nothrow_constant, MEMFLAGS flags); + void operator delete(void* p); + // Fast allocate in the arena. Common case is: pointer test + increment. void* Amalloc(size_t x) { assert(is_power_of_2(ARENA_AMALLOC_ALIGNMENT) , "should be a power of 2"); @@ -306,16 +388,20 @@ size_t used() const; // Total # of bytes used - size_t size_in_bytes() const NOT_PRODUCT({ return _size_in_bytes; }) PRODUCT_RETURN0; - void set_size_in_bytes(size_t size) NOT_PRODUCT({ _size_in_bytes = size; }) PRODUCT_RETURN; + size_t size_in_bytes() const { return _size_in_bytes; }; + void set_size_in_bytes(size_t size); + static void free_malloced_objects(Chunk* chunk, char* hwm, char* max, char* hwm2) PRODUCT_RETURN; static void free_all(char** start, char** end) PRODUCT_RETURN; + // how many arena instances + NOT_PRODUCT(static volatile jint _instance_count;) private: // Reset this Arena to empty, access will trigger grow if necessary void reset(void) { _first = _chunk = NULL; _hwm = _max = NULL; + set_size_in_bytes(0); } }; @@ -373,7 +459,7 @@ #endif // ASSERT public: - void* operator new(size_t size, allocation_type type); + void* operator new(size_t size, allocation_type type, MEMFLAGS flags); void* operator new(size_t size, Arena *arena) { address res = (address)arena->Amalloc(size); DEBUG_ONLY(set_allocation_type(res, ARENA);) @@ -409,17 +495,28 @@ #define NEW_RESOURCE_OBJ(type)\ NEW_RESOURCE_ARRAY(type, 1) -#define NEW_C_HEAP_ARRAY(type, size)\ - (type*) (AllocateHeap((size) * sizeof(type), XSTR(type) " in " __FILE__)) +#define NEW_C_HEAP_ARRAY(type, size, memflags)\ + (type*) (AllocateHeap((size) * sizeof(type), memflags)) -#define REALLOC_C_HEAP_ARRAY(type, old, size)\ - (type*) (ReallocateHeap((char*)old, (size) * sizeof(type), XSTR(type) " in " __FILE__)) +#define REALLOC_C_HEAP_ARRAY(type, old, size, memflags)\ + (type*) (ReallocateHeap((char*)old, (size) * sizeof(type), memflags)) + +#define FREE_C_HEAP_ARRAY(type,old,memflags) \ + FreeHeap((char*)(old), memflags) -#define FREE_C_HEAP_ARRAY(type,old) \ - FreeHeap((char*)(old)) +#define NEW_C_HEAP_OBJ(type, memflags)\ + NEW_C_HEAP_ARRAY(type, 1, memflags) + + +#define NEW_C_HEAP_ARRAY2(type, size, memflags, pc)\ + (type*) (AllocateHeap((size) * sizeof(type), memflags, pc)) -#define NEW_C_HEAP_OBJ(type)\ - NEW_C_HEAP_ARRAY(type, 1) +#define REALLOC_C_HEAP_ARRAY2(type, old, size, memflags, pc)\ + (type*) (ReallocateHeap((char*)old, (size) * sizeof(type), memflags, pc)) + +#define NEW_C_HEAP_OBJ2(type, memflags, pc)\ + NEW_C_HEAP_ARRAY2(type, 1, memflags, pc) + extern bool warn_new_operator; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/allocation.inline.hpp --- a/src/share/vm/memory/allocation.inline.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/allocation.inline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -48,33 +48,60 @@ #endif // allocate using malloc; will fail if no memory available -inline char* AllocateHeap(size_t size, const char* name = NULL) { - char* p = (char*) os::malloc(size); +inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0) { + if (pc == 0) { + pc = CURRENT_PC; + } + char* p = (char*) os::malloc(size, flags, pc); #ifdef ASSERT - if (PrintMallocFree) trace_heap_malloc(size, name, p); - #else - Unused_Variable(name); + if (PrintMallocFree) trace_heap_malloc(size, "AllocateHeap", p); #endif - if (p == NULL) vm_exit_out_of_memory(size, name); + if (p == NULL) vm_exit_out_of_memory(size, "AllocateHeap"); + return p; +} + +inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags) { + char* p = (char*) os::realloc(old, size, flags, CURRENT_PC); + #ifdef ASSERT + if (PrintMallocFree) trace_heap_malloc(size, "ReallocateHeap", p); + #endif + if (p == NULL) vm_exit_out_of_memory(size, "ReallocateHeap"); return p; } -inline char* ReallocateHeap(char *old, size_t size, const char* name = NULL) { - char* p = (char*) os::realloc(old,size); - #ifdef ASSERT - if (PrintMallocFree) trace_heap_malloc(size, name, p); - #else - Unused_Variable(name); - #endif - if (p == NULL) vm_exit_out_of_memory(size, name); - return p; -} - -inline void FreeHeap(void* p) { +inline void FreeHeap(void* p, MEMFLAGS memflags = mtInternal) { #ifdef ASSERT if (PrintMallocFree) trace_heap_free(p); #endif - os::free(p); + os::free(p, memflags); } + +template void* CHeapObj::operator new(size_t size, + address caller_pc){ +#ifdef ASSERT + void* p = (void*)AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC)); + if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p); + return p; +#else + return (void *) AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC)); +#endif + } + +template void* CHeapObj::operator new (size_t size, + const std::nothrow_t& nothrow_constant, address caller_pc) { +#ifdef ASSERT + void* p = os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC)); + if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p); + return p; +#else + return os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC)); +#endif +} + +template void CHeapObj::operator delete(void* p){ + FreeHeap(p, F); +} + + #endif // SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/barrierSet.hpp --- a/src/share/vm/memory/barrierSet.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/barrierSet.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -31,7 +31,7 @@ // This class provides the interface between a barrier implementation and // the rest of the system. -class BarrierSet: public CHeapObj { +class BarrierSet: public CHeapObj { friend class VMStructs; public: enum Name { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/binaryTreeDictionary.cpp --- a/src/share/vm/memory/binaryTreeDictionary.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/binaryTreeDictionary.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -230,7 +230,7 @@ link_tail(chunk); assert(!tail() || size() == tail()->size(), "Wrong sized chunk in list"); - FreeList::increment_count(); + increment_count(); debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); @@ -258,7 +258,7 @@ } head()->link_after(chunk); assert(!head() || size() == head()->size(), "Wrong sized chunk in list"); - FreeList::increment_count(); + increment_count(); debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); @@ -909,6 +909,7 @@ template class AscendTreeCensusClosure : public TreeCensusClosure { + using TreeCensusClosure::do_list; public: void do_tree(TreeList* tl) { if (tl != NULL) { @@ -921,6 +922,7 @@ template class DescendTreeCensusClosure : public TreeCensusClosure { + using TreeCensusClosure::do_list; public: void do_tree(TreeList* tl) { if (tl != NULL) { @@ -987,6 +989,7 @@ template class DescendTreeSearchClosure : public TreeSearchClosure { + using TreeSearchClosure::do_list; public: bool do_tree(TreeList* tl) { if (tl != NULL) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/binaryTreeDictionary.hpp --- a/src/share/vm/memory/binaryTreeDictionary.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/binaryTreeDictionary.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -60,13 +60,18 @@ TreeList* left() const { return _left; } TreeList* right() const { return _right; } - // Wrapper on call to base class, to get the template to compile. - Chunk* head() const { return FreeList::head(); } - Chunk* tail() const { return FreeList::tail(); } - void set_head(Chunk* head) { FreeList::set_head(head); } - void set_tail(Chunk* tail) { FreeList::set_tail(tail); } + // Explicitly import these names into our namespace to fix name lookup with templates + using FreeList::head; + using FreeList::set_head; - size_t size() const { return FreeList::size(); } + using FreeList::tail; + using FreeList::set_tail; + using FreeList::link_tail; + + using FreeList::increment_count; + NOT_PRODUCT(using FreeList::increment_returned_bytes_by;) + using FreeList::verify_chunk_in_free_list; + using FreeList::size; // Accessors for links in tree. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/blockOffsetTable.cpp --- a/src/share/vm/memory/blockOffsetTable.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/blockOffsetTable.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -30,6 +30,7 @@ #include "memory/universe.hpp" #include "oops/oop.inline.hpp" #include "runtime/java.hpp" +#include "services/memTracker.hpp" ////////////////////////////////////////////////////////////////////// // BlockOffsetSharedArray @@ -44,6 +45,9 @@ if (!rs.is_reserved()) { vm_exit_during_initialization("Could not reserve enough space for heap offset array"); } + + MemTracker::record_virtual_memory_type((address)rs.base(), mtGC); + if (!_vs.initialize(rs, 0)) { vm_exit_during_initialization("Could not reserve enough space for heap offset array"); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/blockOffsetTable.hpp --- a/src/share/vm/memory/blockOffsetTable.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/blockOffsetTable.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -100,7 +100,7 @@ ////////////////////////////////////////////////////////////////////////// // BlockOffsetSharedArray ////////////////////////////////////////////////////////////////////////// -class BlockOffsetSharedArray: public CHeapObj { +class BlockOffsetSharedArray: public CHeapObj { friend class BlockOffsetArray; friend class BlockOffsetArrayNonContigSpace; friend class BlockOffsetArrayContigSpace; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/cardTableModRefBS.cpp --- a/src/share/vm/memory/cardTableModRefBS.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/cardTableModRefBS.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -33,6 +33,7 @@ #include "runtime/java.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/virtualspace.hpp" +#include "services/memTracker.hpp" #ifdef COMPILER1 #include "c1/c1_LIR.hpp" #include "c1/c1_LIRGenerator.hpp" @@ -90,6 +91,9 @@ const size_t rs_align = _page_size == (size_t) os::vm_page_size() ? 0 : MAX2(_page_size, (size_t) os::vm_allocation_granularity()); ReservedSpace heap_rs(_byte_map_size, rs_align, false); + + MemTracker::record_virtual_memory_type((address)heap_rs.base(), mtGC); + os::trace_page_sizes("card table", _guard_index + 1, _guard_index + 1, _page_size, heap_rs.base(), heap_rs.size()); if (!heap_rs.is_reserved()) { @@ -113,16 +117,17 @@ // Do better than this for Merlin vm_exit_out_of_memory(_page_size, "card table last card"); } + *guard_card = last_card; _lowest_non_clean = - NEW_C_HEAP_ARRAY(CardArr, max_covered_regions); + NEW_C_HEAP_ARRAY(CardArr, max_covered_regions, mtGC); _lowest_non_clean_chunk_size = - NEW_C_HEAP_ARRAY(size_t, max_covered_regions); + NEW_C_HEAP_ARRAY(size_t, max_covered_regions, mtGC); _lowest_non_clean_base_chunk_index = - NEW_C_HEAP_ARRAY(uintptr_t, max_covered_regions); + NEW_C_HEAP_ARRAY(uintptr_t, max_covered_regions, mtGC); _last_LNC_resizing_collection = - NEW_C_HEAP_ARRAY(int, max_covered_regions); + NEW_C_HEAP_ARRAY(int, max_covered_regions, mtGC); if (_lowest_non_clean == NULL || _lowest_non_clean_chunk_size == NULL || _lowest_non_clean_base_chunk_index == NULL diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/collectorPolicy.hpp --- a/src/share/vm/memory/collectorPolicy.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/collectorPolicy.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -56,7 +56,7 @@ class PermanentGenerationSpec; class MarkSweepPolicy; -class CollectorPolicy : public CHeapObj { +class CollectorPolicy : public CHeapObj { protected: PermanentGenerationSpec *_permanent_generation; GCPolicyCounters* _gc_policy_counters; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/defNewGeneration.cpp --- a/src/share/vm/memory/defNewGeneration.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/defNewGeneration.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -548,7 +548,7 @@ init_assuming_no_promotion_failure(); - TraceTime t1("GC", PrintGC && !PrintGCDetails, true, gclog_or_tty); + TraceTime t1(GCCauseString("GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, gclog_or_tty); // Capture heap used before collection (for printing). size_t gch_prev_used = gch->used(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/defNewGeneration.hpp --- a/src/share/vm/memory/defNewGeneration.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/defNewGeneration.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -89,8 +89,8 @@ // Together, these keep pairs. // They should always contain the same number of elements. - Stack _objs_with_preserved_marks; - Stack _preserved_marks_of_objs; + Stack _objs_with_preserved_marks; + Stack _preserved_marks_of_objs; // Promotion failure handling OopClosure *_promo_failure_scan_stack_closure; @@ -98,7 +98,7 @@ _promo_failure_scan_stack_closure = scan_stack_closure; } - Stack _promo_failure_scan_stack; + Stack _promo_failure_scan_stack; void drain_promo_failure_scan_stack(void); bool _promo_failure_drain_in_progress; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/dump.cpp --- a/src/share/vm/memory/dump.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/dump.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -62,8 +62,8 @@ // written later, increasing the likelihood that the shared page contain // the hash can be shared. // -// NOTE THAT the algorithm in StringTable::hash_string() MUST MATCH the -// algorithm in java.lang.String.hashCode(). +// NOTE THAT we have to call java_lang_String::to_hash() to match the +// algorithm in java.lang.String.toHash(). class StringHashCodeClosure: public OopClosure { private: @@ -78,9 +78,9 @@ void do_oop(oop* p) { if (p != NULL) { oop obj = *p; - if (obj->klass() == SystemDictionary::String_klass()) { - - int hash = java_lang_String::hash_string(obj); + if (obj->klass() == SystemDictionary::String_klass() && + java_lang_String::has_hash_field()) { + int hash = java_lang_String::to_hash(obj); obj->int_field_put(hash_offset, hash); } } @@ -231,8 +231,6 @@ if (obj->is_constMethod()) { mark_object(obj); mark_object(constMethodOop(obj)->stackmap_data()); - // Exception tables are needed by ci code during compilation. - mark_object(constMethodOop(obj)->exception_table()); } // Mark objects referenced by klass objects which are read-only. @@ -513,7 +511,6 @@ for(i = 0; i < methods->length(); i++) { methodOop m = methodOop(methods->obj_at(i)); mark_and_move_for_policy(OP_favor_startup, m->constMethod(), _move_ro); - mark_and_move_for_policy(OP_favor_runtime, m->constMethod()->exception_table(), _move_ro); mark_and_move_for_policy(OP_favor_runtime, m->constMethod()->stackmap_data(), _move_ro); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/filemap.hpp --- a/src/share/vm/memory/filemap.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/filemap.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -44,7 +44,7 @@ -class FileMapInfo : public CHeapObj { +class FileMapInfo : public CHeapObj { private: enum { _invalid_version = -1, diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/freeBlockDictionary.hpp --- a/src/share/vm/memory/freeBlockDictionary.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/freeBlockDictionary.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,7 +34,7 @@ // A FreeBlockDictionary is an abstract superclass that will allow // a number of alternative implementations in the future. template -class FreeBlockDictionary: public CHeapObj { +class FreeBlockDictionary: public CHeapObj { public: enum Dither { atLeast, diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/genCollectedHeap.cpp --- a/src/share/vm/memory/genCollectedHeap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/genCollectedHeap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -480,26 +480,15 @@ const size_t perm_prev_used = perm_gen()->used(); print_heap_before_gc(); - if (Verbose) { - gclog_or_tty->print_cr("GC Cause: %s", GCCause::to_string(gc_cause())); - } { FlagSetting fl(_is_gc_active, true); bool complete = full && (max_level == (n_gens()-1)); - const char* gc_cause_str = "GC "; - if (complete) { - GCCause::Cause cause = gc_cause(); - if (cause == GCCause::_java_lang_system_gc) { - gc_cause_str = "Full GC (System) "; - } else { - gc_cause_str = "Full GC "; - } - } + const char* gc_cause_prefix = complete ? "Full GC" : "GC"; gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps); TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); - TraceTime t(gc_cause_str, PrintGCDetails, false, gclog_or_tty); + TraceTime t(GCCauseString(gc_cause_prefix, gc_cause()), PrintGCDetails, false, gclog_or_tty); gc_prologue(complete); increment_total_collections(complete); @@ -688,11 +677,6 @@ #ifdef TRACESPINNING ParallelTaskTerminator::print_termination_counts(); #endif - - if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) { - tty->print_cr("Stopping after GC #%d", ExitAfterGCNum); - vm_exit(-1); - } } HeapWord* GenCollectedHeap::satisfy_failed_allocation(size_t size, bool is_tlab) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/genMarkSweep.cpp --- a/src/share/vm/memory/genMarkSweep.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/genMarkSweep.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -76,7 +76,7 @@ _ref_processor = rp; rp->setup_policy(clear_all_softrefs); - TraceTime t1("Full GC", PrintGC && !PrintGCDetails, true, gclog_or_tty); + TraceTime t1(GCCauseString("Full GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, gclog_or_tty); // When collecting the permanent generation methodOops may be moving, // so we either have to flush all bcp data or convert it into bci. @@ -203,21 +203,21 @@ #ifdef VALIDATE_MARK_SWEEP if (ValidateMarkSweep) { - _root_refs_stack = new (ResourceObj::C_HEAP) GrowableArray(100, true); - _other_refs_stack = new (ResourceObj::C_HEAP) GrowableArray(100, true); - _adjusted_pointers = new (ResourceObj::C_HEAP) GrowableArray(100, true); - _live_oops = new (ResourceObj::C_HEAP) GrowableArray(100, true); - _live_oops_moved_to = new (ResourceObj::C_HEAP) GrowableArray(100, true); - _live_oops_size = new (ResourceObj::C_HEAP) GrowableArray(100, true); + _root_refs_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _other_refs_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _adjusted_pointers = new (ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _live_oops = new (ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _live_oops_moved_to = new (ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _live_oops_size = new (ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); } if (RecordMarkSweepCompaction) { if (_cur_gc_live_oops == NULL) { - _cur_gc_live_oops = new(ResourceObj::C_HEAP) GrowableArray(100, true); - _cur_gc_live_oops_moved_to = new(ResourceObj::C_HEAP) GrowableArray(100, true); - _cur_gc_live_oops_size = new(ResourceObj::C_HEAP) GrowableArray(100, true); - _last_gc_live_oops = new(ResourceObj::C_HEAP) GrowableArray(100, true); - _last_gc_live_oops_moved_to = new(ResourceObj::C_HEAP) GrowableArray(100, true); - _last_gc_live_oops_size = new(ResourceObj::C_HEAP) GrowableArray(100, true); + _cur_gc_live_oops = new(ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _cur_gc_live_oops_moved_to = new(ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _cur_gc_live_oops_size = new(ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _last_gc_live_oops = new(ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _last_gc_live_oops_moved_to = new(ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); + _last_gc_live_oops_size = new(ResourceObj::C_HEAP, mtGC) GrowableArray(100, true); } else { _cur_gc_live_oops->clear(); _cur_gc_live_oops_moved_to->clear(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/genOopClosures.hpp --- a/src/share/vm/memory/genOopClosures.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/genOopClosures.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -34,10 +34,10 @@ class CardTableModRefBS; class DefNewGeneration; -template class GenericTaskQueue; -typedef GenericTaskQueue OopTaskQueue; -template class GenericTaskQueueSet; -typedef GenericTaskQueueSet OopTaskQueueSet; +template class GenericTaskQueue; +typedef GenericTaskQueue OopTaskQueue; +template class GenericTaskQueueSet; +typedef GenericTaskQueueSet OopTaskQueueSet; // Closure for iterating roots from a particular generation // Note: all classes deriving from this MUST call this do_barrier diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/genRemSet.hpp --- a/src/share/vm/memory/genRemSet.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/genRemSet.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,7 +35,7 @@ class OopsInGenClosure; class CardTableRS; -class GenRemSet: public CHeapObj { +class GenRemSet: public CHeapObj { friend class Generation; BarrierSet* _bs; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/generation.hpp --- a/src/share/vm/memory/generation.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/generation.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -86,7 +86,7 @@ }; -class Generation: public CHeapObj { +class Generation: public CHeapObj { friend class VMStructs; private: jlong _time_of_last_gc; // time when last gc on this generation happened (ms) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/generationSpec.hpp --- a/src/share/vm/memory/generationSpec.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/generationSpec.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -32,7 +32,7 @@ // some generation-specific behavior. This is done here rather than as a // virtual function of Generation because these methods are needed in // initialization of the Generations. -class GenerationSpec : public CHeapObj { +class GenerationSpec : public CHeapObj { friend class VMStructs; private: Generation::Name _name; @@ -71,7 +71,7 @@ // The specification of a permanent generation. This class is very // similar to GenerationSpec in use. Due to PermGen's not being a // true Generation, we cannot combine the spec classes either. -class PermanentGenerationSpec : public CHeapObj { +class PermanentGenerationSpec : public CHeapObj { friend class VMStructs; private: PermGen::Name _name; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/heap.cpp --- a/src/share/vm/memory/heap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/heap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -26,7 +26,7 @@ #include "memory/heap.hpp" #include "oops/oop.inline.hpp" #include "runtime/os.hpp" - +#include "services/memTracker.hpp" size_t CodeHeap::header_size() { return sizeof(HeapBlock); @@ -130,6 +130,9 @@ if (!_segmap.initialize(align_to_page_size(_number_of_reserved_segments), align_to_page_size(_number_of_committed_segments))) { return false; } + + MemTracker::record_virtual_memory_type((address)_segmap.low_boundary(), mtCode); + assert(_segmap.committed_size() >= (size_t) _number_of_committed_segments, "could not commit enough space for segment map"); assert(_segmap.reserved_size() >= (size_t) _number_of_reserved_segments , "could not reserve enough space for segment map"); assert(_segmap.reserved_size() >= _segmap.committed_size() , "just checking"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/heap.hpp --- a/src/share/vm/memory/heap.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/heap.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -77,7 +77,7 @@ void set_link(FreeBlock* link) { _link = link; } }; -class CodeHeap : public CHeapObj { +class CodeHeap : public CHeapObj { friend class VMStructs; private: VirtualSpace _memory; // the memory holding the blocks diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/heapInspection.cpp --- a/src/share/vm/memory/heapInspection.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/heapInspection.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -116,7 +116,7 @@ KlassInfoTable::KlassInfoTable(int size, HeapWord* ref) { _size = 0; _ref = ref; - _buckets = NEW_C_HEAP_ARRAY(KlassInfoBucket, size); + _buckets = NEW_C_HEAP_ARRAY(KlassInfoBucket, size, mtInternal); if (_buckets != NULL) { _size = size; for (int index = 0; index < _size; index++) { @@ -130,7 +130,7 @@ for (int index = 0; index < _size; index++) { _buckets[index].empty(); } - FREE_C_HEAP_ARRAY(KlassInfoBucket, _buckets); + FREE_C_HEAP_ARRAY(KlassInfoBucket, _buckets, mtInternal); _size = 0; } } @@ -179,7 +179,7 @@ KlassInfoHisto::KlassInfoHisto(const char* title, int estimatedCount) : _title(title) { - _elements = new (ResourceObj::C_HEAP) GrowableArray(estimatedCount,true); + _elements = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(estimatedCount,true); } KlassInfoHisto::~KlassInfoHisto() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/heapInspection.hpp --- a/src/share/vm/memory/heapInspection.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/heapInspection.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -44,7 +44,7 @@ // to KlassInfoEntry's and is used to sort // the entries. -class KlassInfoEntry: public CHeapObj { +class KlassInfoEntry: public CHeapObj { private: KlassInfoEntry* _next; klassOop _klass; @@ -72,7 +72,7 @@ virtual void do_cinfo(KlassInfoEntry* cie) = 0; }; -class KlassInfoBucket: public CHeapObj { +class KlassInfoBucket: public CHeapObj { private: KlassInfoEntry* _list; KlassInfoEntry* list() { return _list; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/memRegion.hpp --- a/src/share/vm/memory/memRegion.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/memRegion.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -99,8 +99,8 @@ class MemRegionClosureRO: public MemRegionClosure { public: - void* operator new(size_t size, ResourceObj::allocation_type type) { - return ResourceObj::operator new(size, type); + void* operator new(size_t size, ResourceObj::allocation_type type, MEMFLAGS flags) { + return ResourceObj::operator new(size, type, flags); } void* operator new(size_t size, Arena *arena) { return ResourceObj::operator new(size, arena); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/oopFactory.cpp --- a/src/share/vm/memory/oopFactory.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/oopFactory.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -140,14 +140,15 @@ constMethodOop oopFactory::new_constMethod(int byte_code_size, int compressed_line_number_size, int localvariable_table_length, + int exception_table_length, int checked_exceptions_length, bool is_conc_safe, TRAPS) { klassOop cmkObj = Universe::constMethodKlassObj(); constMethodKlass* cmk = constMethodKlass::cast(cmkObj); return cmk->allocate(byte_code_size, compressed_line_number_size, - localvariable_table_length, checked_exceptions_length, - is_conc_safe, + localvariable_table_length, exception_table_length, + checked_exceptions_length, is_conc_safe, CHECK_NULL); } @@ -155,6 +156,7 @@ methodOop oopFactory::new_method(int byte_code_size, AccessFlags access_flags, int compressed_line_number_size, int localvariable_table_length, + int exception_table_length, int checked_exceptions_length, bool is_conc_safe, TRAPS) { @@ -164,6 +166,7 @@ constMethodOop cm = new_constMethod(byte_code_size, compressed_line_number_size, localvariable_table_length, + exception_table_length, checked_exceptions_length, is_conc_safe, CHECK_NULL); constMethodHandle rw(THREAD, cm); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/oopFactory.hpp --- a/src/share/vm/memory/oopFactory.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/oopFactory.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -86,6 +86,7 @@ static constMethodOop new_constMethod(int byte_code_size, int compressed_line_number_size, int localvariable_table_length, + int exception_table_length, int checked_exceptions_length, bool is_conc_safe, TRAPS); @@ -97,6 +98,7 @@ AccessFlags access_flags, int compressed_line_number_size, int localvariable_table_length, + int exception_table_length, int checked_exceptions_length, bool is_conc_safe, TRAPS); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/permGen.hpp --- a/src/share/vm/memory/permGen.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/permGen.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -42,7 +42,7 @@ // PermGen models the part of the heap used to allocate class meta-data. -class PermGen : public CHeapObj { +class PermGen : public CHeapObj { friend class VMStructs; protected: size_t _capacity_expansion_limit; // maximum expansion allowed without a diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/referencePolicy.hpp --- a/src/share/vm/memory/referencePolicy.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/referencePolicy.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,7 +29,7 @@ // should be cleared. -class ReferencePolicy : public CHeapObj { +class ReferencePolicy : public CHeapObj { public: virtual bool should_clear_reference(oop p, jlong timestamp_clock) { ShouldNotReachHere(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/referenceProcessor.cpp --- a/src/share/vm/memory/referenceProcessor.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/referenceProcessor.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -108,7 +108,8 @@ _num_q = MAX2(1U, mt_processing_degree); _max_num_q = MAX2(_num_q, mt_discovery_degree); _discovered_refs = NEW_C_HEAP_ARRAY(DiscoveredList, - _max_num_q * number_of_subclasses_of_ref()); + _max_num_q * number_of_subclasses_of_ref(), mtGC); + if (_discovered_refs == NULL) { vm_exit_during_initialization("Could not allocated RefProc Array"); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/referenceProcessor.hpp --- a/src/share/vm/memory/referenceProcessor.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/referenceProcessor.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -203,7 +203,7 @@ } }; -class ReferenceProcessor : public CHeapObj { +class ReferenceProcessor : public CHeapObj { protected: // Compatibility with pre-4965777 JDK's static bool _pending_list_uses_discovered_field; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/resourceArea.hpp --- a/src/share/vm/memory/resourceArea.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/resourceArea.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,7 +75,7 @@ if (UseMallocOnly) { // use malloc, but save pointer in res. area for later freeing char** save = (char**)internal_malloc_4(sizeof(char*)); - return (*save = (char*)os::malloc(size)); + return (*save = (char*)os::malloc(size, mtThread)); } #endif return (char*)Amalloc(size); @@ -93,18 +93,17 @@ ResourceArea *_area; // Resource area to stack allocate Chunk *_chunk; // saved arena chunk char *_hwm, *_max; - NOT_PRODUCT(size_t _size_in_bytes;) + size_t _size_in_bytes; void initialize(Thread *thread) { _area = thread->resource_area(); _chunk = _area->_chunk; _hwm = _area->_hwm; _max= _area->_max; - NOT_PRODUCT(_size_in_bytes = _area->size_in_bytes();) + _size_in_bytes = _area->size_in_bytes(); debug_only(_area->_nesting++;) assert( _area->_nesting > 0, "must stack allocate RMs" ); } - public: #ifndef ASSERT @@ -120,7 +119,7 @@ ResourceMark( ResourceArea *r ) : _area(r), _chunk(r->_chunk), _hwm(r->_hwm), _max(r->_max) { - NOT_PRODUCT(_size_in_bytes = _area->size_in_bytes();) + _size_in_bytes = r->_size_in_bytes; debug_only(_area->_nesting++;) assert( _area->_nesting > 0, "must stack allocate RMs" ); } @@ -148,7 +147,7 @@ private: void free_malloced_objects() PRODUCT_RETURN; - size_t size_in_bytes() NOT_PRODUCT({ return _size_in_bytes; }) PRODUCT_RETURN0; + size_t size_in_bytes() { return _size_in_bytes; } }; //------------------------------DeoptResourceMark----------------------------------- @@ -180,19 +179,19 @@ // and they would be stack allocated. This leaves open the possibilty of accidental // misuse so we simple duplicate the ResourceMark functionality here. -class DeoptResourceMark: public CHeapObj { +class DeoptResourceMark: public CHeapObj { protected: ResourceArea *_area; // Resource area to stack allocate Chunk *_chunk; // saved arena chunk char *_hwm, *_max; - NOT_PRODUCT(size_t _size_in_bytes;) + size_t _size_in_bytes; void initialize(Thread *thread) { _area = thread->resource_area(); _chunk = _area->_chunk; _hwm = _area->_hwm; _max= _area->_max; - NOT_PRODUCT(_size_in_bytes = _area->size_in_bytes();) + _size_in_bytes = _area->size_in_bytes(); debug_only(_area->_nesting++;) assert( _area->_nesting > 0, "must stack allocate RMs" ); } @@ -212,7 +211,7 @@ DeoptResourceMark( ResourceArea *r ) : _area(r), _chunk(r->_chunk), _hwm(r->_hwm), _max(r->_max) { - NOT_PRODUCT(_size_in_bytes = _area->size_in_bytes();) + _size_in_bytes = _area->size_in_bytes(); debug_only(_area->_nesting++;) assert( _area->_nesting > 0, "must stack allocate RMs" ); } @@ -240,7 +239,7 @@ private: void free_malloced_objects() PRODUCT_RETURN; - size_t size_in_bytes() NOT_PRODUCT({ return _size_in_bytes; }) PRODUCT_RETURN0; + size_t size_in_bytes() { return _size_in_bytes; }; }; #endif // SHARE_VM_MEMORY_RESOURCEAREA_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/restore.cpp --- a/src/share/vm/memory/restore.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/restore.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -132,7 +132,7 @@ buffer += sizeof(intptr_t); int number_of_entries = *(intptr_t*)buffer; buffer += sizeof(intptr_t); - SymbolTable::create_table((HashtableBucket*)buffer, symbolTableLen, + SymbolTable::create_table((HashtableBucket*)buffer, symbolTableLen, number_of_entries); buffer += symbolTableLen; @@ -144,7 +144,7 @@ buffer += sizeof(intptr_t); number_of_entries = *(intptr_t*)buffer; buffer += sizeof(intptr_t); - StringTable::create_table((HashtableBucket*)buffer, stringTableLen, + StringTable::create_table((HashtableBucket*)buffer, stringTableLen, number_of_entries); buffer += stringTableLen; @@ -157,7 +157,7 @@ buffer += sizeof(intptr_t); number_of_entries = *(intptr_t*)buffer; buffer += sizeof(intptr_t); - SystemDictionary::set_shared_dictionary((HashtableBucket*)buffer, + SystemDictionary::set_shared_dictionary((HashtableBucket*)buffer, sharedDictionaryLen, number_of_entries); buffer += sharedDictionaryLen; @@ -171,7 +171,7 @@ buffer += sizeof(intptr_t); number_of_entries = *(intptr_t*)buffer; buffer += sizeof(intptr_t); - ClassLoader::create_package_info_table((HashtableBucket*)buffer, pkgInfoLen, + ClassLoader::create_package_info_table((HashtableBucket*)buffer, pkgInfoLen, number_of_entries); buffer += pkgInfoLen; ClassLoader::verify(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/space.hpp --- a/src/share/vm/memory/space.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/space.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -105,7 +105,7 @@ // bottom() <= top() <= end() // top() is inclusive and end() is exclusive. -class Space: public CHeapObj { +class Space: public CHeapObj { friend class VMStructs; protected: HeapWord* _bottom; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/tenuredGeneration.cpp --- a/src/share/vm/memory/tenuredGeneration.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/tenuredGeneration.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -65,7 +65,7 @@ if (UseParNewGC && ParallelGCThreads > 0) { typedef ParGCAllocBufferWithBOT* ParGCAllocBufferWithBOTPtr; _alloc_buffers = NEW_C_HEAP_ARRAY(ParGCAllocBufferWithBOTPtr, - ParallelGCThreads); + ParallelGCThreads, mtGC); if (_alloc_buffers == NULL) vm_exit_during_initialization("Could not allocate alloc_buffers"); for (uint i = 0; i < ParallelGCThreads; i++) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/threadLocalAllocBuffer.hpp --- a/src/share/vm/memory/threadLocalAllocBuffer.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/threadLocalAllocBuffer.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -36,7 +36,7 @@ // It is thread-private at any time, but maybe multiplexed over // time across multiple threads. The park()/unpark() pair is // used to make it avaiable for such multiplexing. -class ThreadLocalAllocBuffer: public CHeapObj { +class ThreadLocalAllocBuffer: public CHeapObj { friend class VMStructs; private: HeapWord* _start; // address of TLAB @@ -172,7 +172,7 @@ void verify(); }; -class GlobalTLABStats: public CHeapObj { +class GlobalTLABStats: public CHeapObj { private: // Accumulate perfdata in private variables because diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/universe.cpp --- a/src/share/vm/memory/universe.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/universe.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -764,7 +764,7 @@ FileMapInfo* mapinfo = NULL; if (UseSharedSpaces) { - mapinfo = NEW_C_HEAP_OBJ(FileMapInfo); + mapinfo = NEW_C_HEAP_OBJ(FileMapInfo, mtInternal); memset(mapinfo, 0, sizeof(FileMapInfo)); // Open the shared archive file, read and validate the header. If @@ -1546,7 +1546,7 @@ // This is the first previous version so make some space. // Start with 2 elements under the assumption that the class // won't be redefined much. - _prev_methods = new (ResourceObj::C_HEAP) GrowableArray(2, true); + _prev_methods = new (ResourceObj::C_HEAP, mtClass) GrowableArray(2, true); } // RC_TRACE macro has an embedded ResourceMark diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/memory/universe.hpp --- a/src/share/vm/memory/universe.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/memory/universe.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -43,7 +43,7 @@ // Common parts of a methodOop cache. This cache safely interacts with // the RedefineClasses API. // -class CommonMethodOopCache : public CHeapObj { +class CommonMethodOopCache : public CHeapObj { // We save the klassOop and the idnum of methodOop in order to get // the current cached methodOop. private: @@ -273,7 +273,7 @@ } static klassOop typeArrayKlassObj(BasicType t) { - assert((uint)t < T_VOID+1, "range check"); + assert((uint)t < T_VOID+1, err_msg("range check for type: %s", type2name(t))); assert(_typeArrayKlassObjs[t] != NULL, "domain check"); return _typeArrayKlassObjs[t]; } @@ -455,7 +455,7 @@ static int base_vtable_size() { return _base_vtable_size; } }; -class DeferredObjAllocEvent : public CHeapObj { +class DeferredObjAllocEvent : public CHeapObj { private: oop _oop; size_t _bytesize; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/constMethodKlass.cpp --- a/src/share/vm/oops/constMethodKlass.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/constMethodKlass.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,6 +65,7 @@ constMethodOop constMethodKlass::allocate(int byte_code_size, int compressed_line_number_size, int localvariable_table_length, + int exception_table_length, int checked_exceptions_length, bool is_conc_safe, TRAPS) { @@ -72,6 +73,7 @@ int size = constMethodOopDesc::object_size(byte_code_size, compressed_line_number_size, localvariable_table_length, + exception_table_length, checked_exceptions_length); KlassHandle h_k(THREAD, as_klassOop()); constMethodOop cm = (constMethodOop) @@ -80,14 +82,14 @@ No_Safepoint_Verifier no_safepoint; cm->set_interpreter_kind(Interpreter::invalid); cm->init_fingerprint(); - cm->set_method(NULL); + cm->set_constants(NULL); cm->set_stackmap_data(NULL); - cm->set_exception_table(NULL); cm->set_code_size(byte_code_size); cm->set_constMethod_size(size); cm->set_inlined_tables_length(checked_exceptions_length, compressed_line_number_size, - localvariable_table_length); + localvariable_table_length, + exception_table_length); assert(cm->size() == size, "wrong size for object"); cm->set_is_conc_safe(is_conc_safe); cm->set_partially_loaded(); @@ -98,9 +100,8 @@ void constMethodKlass::oop_follow_contents(oop obj) { assert (obj->is_constMethod(), "object must be constMethod"); constMethodOop cm = constMethodOop(obj); - MarkSweep::mark_and_push(cm->adr_method()); + MarkSweep::mark_and_push(cm->adr_constants()); MarkSweep::mark_and_push(cm->adr_stackmap_data()); - MarkSweep::mark_and_push(cm->adr_exception_table()); // Performance tweak: We skip iterating over the klass pointer since we // know that Universe::constMethodKlassObj never moves. } @@ -110,9 +111,8 @@ oop obj) { assert (obj->is_constMethod(), "object must be constMethod"); constMethodOop cm_oop = constMethodOop(obj); - PSParallelCompact::mark_and_push(cm, cm_oop->adr_method()); + PSParallelCompact::mark_and_push(cm, cm_oop->adr_constants()); PSParallelCompact::mark_and_push(cm, cm_oop->adr_stackmap_data()); - PSParallelCompact::mark_and_push(cm, cm_oop->adr_exception_table()); // Performance tweak: We skip iterating over the klass pointer since we // know that Universe::constMethodKlassObj never moves. } @@ -121,9 +121,8 @@ int constMethodKlass::oop_oop_iterate(oop obj, OopClosure* blk) { assert (obj->is_constMethod(), "object must be constMethod"); constMethodOop cm = constMethodOop(obj); - blk->do_oop(cm->adr_method()); + blk->do_oop(cm->adr_constants()); blk->do_oop(cm->adr_stackmap_data()); - blk->do_oop(cm->adr_exception_table()); // Get size before changing pointers. // Don't call size() or oop_size() since that is a virtual call. int size = cm->object_size(); @@ -135,12 +134,10 @@ assert (obj->is_constMethod(), "object must be constMethod"); constMethodOop cm = constMethodOop(obj); oop* adr; - adr = cm->adr_method(); + adr = cm->adr_constants(); if (mr.contains(adr)) blk->do_oop(adr); adr = cm->adr_stackmap_data(); if (mr.contains(adr)) blk->do_oop(adr); - adr = cm->adr_exception_table(); - if (mr.contains(adr)) blk->do_oop(adr); // Get size before changing pointers. // Don't call size() or oop_size() since that is a virtual call. int size = cm->object_size(); @@ -153,9 +150,8 @@ int constMethodKlass::oop_adjust_pointers(oop obj) { assert(obj->is_constMethod(), "should be constMethod"); constMethodOop cm = constMethodOop(obj); - MarkSweep::adjust_pointer(cm->adr_method()); + MarkSweep::adjust_pointer(cm->adr_constants()); MarkSweep::adjust_pointer(cm->adr_stackmap_data()); - MarkSweep::adjust_pointer(cm->adr_exception_table()); // Get size before changing pointers. // Don't call size() or oop_size() since that is a virtual call. int size = cm->object_size(); @@ -188,9 +184,8 @@ assert(obj->is_constMethod(), "must be constMethod"); Klass::oop_print_on(obj, st); constMethodOop m = constMethodOop(obj); - st->print(" - method: " INTPTR_FORMAT " ", (address)m->method()); - m->method()->print_value_on(st); st->cr(); - st->print(" - exceptions: " INTPTR_FORMAT "\n", (address)m->exception_table()); + st->print(" - constants: " INTPTR_FORMAT " ", (address)m->constants()); + m->constants()->print_value_on(st); st->cr(); if (m->has_stackmap_table()) { st->print(" - stackmap data: "); m->stackmap_data()->print_value_on(st); @@ -223,13 +218,11 @@ // Verification can occur during oop construction before the method or // other fields have been initialized. if (!obj->partially_loaded()) { - guarantee(m->method()->is_perm(), "should be in permspace"); - guarantee(m->method()->is_method(), "should be method"); + guarantee(m->constants()->is_perm(), "should be in permspace"); + guarantee(m->constants()->is_constantPool(), "should be constant pool"); typeArrayOop stackmap_data = m->stackmap_data(); guarantee(stackmap_data == NULL || stackmap_data->is_perm(), "should be in permspace"); - guarantee(m->exception_table()->is_perm(), "should be in permspace"); - guarantee(m->exception_table()->is_typeArray(), "should be type array"); address m_end = (address)((oop*) m + m->size()); address compressed_table_start = m->code_end(); @@ -244,11 +237,15 @@ compressed_table_end += stream.position(); } guarantee(compressed_table_end <= m_end, "invalid method layout"); - // Verify checked exceptions and local variable tables + // Verify checked exceptions, exception table and local variable tables if (m->has_checked_exceptions()) { u2* addr = m->checked_exceptions_length_addr(); guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout"); } + if (m->has_exception_handler()) { + u2* addr = m->exception_table_length_addr(); + guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout"); + } if (m->has_localvariable_table()) { u2* addr = m->localvariable_table_length_addr(); guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout"); @@ -257,12 +254,12 @@ u2* uncompressed_table_start; if (m->has_localvariable_table()) { uncompressed_table_start = (u2*) m->localvariable_table_start(); - } else { - if (m->has_checked_exceptions()) { + } else if (m->has_exception_handler()) { + uncompressed_table_start = (u2*) m->exception_table_start(); + } else if (m->has_checked_exceptions()) { uncompressed_table_start = (u2*) m->checked_exceptions_start(); - } else { + } else { uncompressed_table_start = (u2*) m_end; - } } int gap = (intptr_t) uncompressed_table_start - (intptr_t) compressed_table_end; int max_gap = align_object_size(1)*BytesPerWord; @@ -273,8 +270,8 @@ bool constMethodKlass::oop_partially_loaded(oop obj) const { assert(obj->is_constMethod(), "object must be klass"); constMethodOop m = constMethodOop(obj); - // check whether exception_table points to self (flag for partially loaded) - return m->exception_table() == (typeArrayOop)obj; + // check whether stackmap_data points to self (flag for partially loaded) + return m->stackmap_data() == (typeArrayOop)obj; } @@ -282,6 +279,6 @@ void constMethodKlass::oop_set_partially_loaded(oop obj) { assert(obj->is_constMethod(), "object must be klass"); constMethodOop m = constMethodOop(obj); - // Temporarily set exception_table to point to self - m->set_exception_table((typeArrayOop)obj); + // Temporarily set stackmap_data to point to self + m->set_stackmap_data((typeArrayOop)obj); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/constMethodKlass.hpp --- a/src/share/vm/oops/constMethodKlass.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/constMethodKlass.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,6 +46,7 @@ DEFINE_ALLOCATE_PERMANENT(constMethodKlass); constMethodOop allocate(int byte_code_size, int compressed_line_number_size, int localvariable_table_length, + int exception_table_length, int checked_exceptions_length, bool is_conc_safe, TRAPS); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/constMethodOop.cpp --- a/src/share/vm/oops/constMethodOop.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/constMethodOop.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,7 @@ int constMethodOopDesc::object_size(int code_size, int compressed_line_number_size, int local_variable_table_length, + int exception_table_length, int checked_exceptions_length) { int extra_bytes = code_size; if (compressed_line_number_size > 0) { @@ -49,10 +50,18 @@ extra_bytes += local_variable_table_length * sizeof(LocalVariableTableElement); } + if (exception_table_length > 0) { + extra_bytes += sizeof(u2); + extra_bytes += exception_table_length * sizeof(ExceptionTableElement); + } int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord; return align_object_size(header_size() + extra_words); } +methodOop constMethodOopDesc::method() const { + return instanceKlass::cast(_constants->pool_holder())->method_with_idnum( + _method_idnum); + } // linenumber table - note that length is unknown until decompression, // see class CompressedLineNumberReadStream. @@ -69,23 +78,40 @@ return last_u2_element(); } -u2* constMethodOopDesc::localvariable_table_length_addr() const { - assert(has_localvariable_table(), "called only if table is present"); +u2* constMethodOopDesc::exception_table_length_addr() const { + assert(has_exception_handler(), "called only if table is present"); if (has_checked_exceptions()) { // If checked_exception present, locate immediately before them. return (u2*) checked_exceptions_start() - 1; } else { - // Else, the linenumber table is at the end of the constMethod. + // Else, the exception table is at the end of the constMethod. return last_u2_element(); } } +u2* constMethodOopDesc::localvariable_table_length_addr() const { + assert(has_localvariable_table(), "called only if table is present"); + if (has_exception_handler()) { + // If exception_table present, locate immediately before them. + return (u2*) exception_table_start() - 1; + } else { + if (has_checked_exceptions()) { + // If checked_exception present, locate immediately before them. + return (u2*) checked_exceptions_start() - 1; + } else { + // Else, the linenumber table is at the end of the constMethod. + return last_u2_element(); + } + } +} + // Update the flags to indicate the presence of these optional fields. void constMethodOopDesc::set_inlined_tables_length( int checked_exceptions_len, int compressed_line_number_size, - int localvariable_table_len) { + int localvariable_table_len, + int exception_table_len) { // Must be done in the order below, otherwise length_addr accessors // will not work. Only set bit in header if length is positive. assert(_flags == 0, "Error"); @@ -96,6 +122,10 @@ _flags |= _has_checked_exceptions; *(checked_exceptions_length_addr()) = checked_exceptions_len; } + if (exception_table_len > 0) { + _flags |= _has_exception_table; + *(exception_table_length_addr()) = exception_table_len; + } if (localvariable_table_len > 0) { _flags |= _has_localvariable_table; *(localvariable_table_length_addr()) = localvariable_table_len; @@ -129,3 +159,15 @@ addr -= length * sizeof(LocalVariableTableElement) / sizeof(u2); return (LocalVariableTableElement*) addr; } + +int constMethodOopDesc::exception_table_length() const { + return has_exception_handler() ? *(exception_table_length_addr()) : 0; +} + +ExceptionTableElement* constMethodOopDesc::exception_table_start() const { + u2* addr = exception_table_length_addr(); + u2 length = *addr; + assert(length > 0, "should only be called if table is present"); + addr -= length * sizeof(ExceptionTableElement) / sizeof(u2); + return (ExceptionTableElement*)addr; +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/constMethodOop.hpp --- a/src/share/vm/oops/constMethodOop.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/constMethodOop.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,9 +41,8 @@ // |------------------------------------------------------| // | fingerprint 1 | // | fingerprint 2 | -// | method (oop) | +// | constants (oop) | // | stackmap_data (oop) | -// | exception_table (oop) | // | constMethod_size | // | interp_kind | flags | code_size | // | name index | signature index | @@ -64,7 +63,13 @@ // | (length is u2, elements are 6-tuples of u2) | // | (see class LocalVariableTableElement) | // | (access flags bit tells whether table is present) | -// | (indexed from end of contMethodOop) | +// | (indexed from end of constMethodOop) | +// |------------------------------------------------------| +// | exception table + length (length last) | +// | (length is u2, elements are 4-tuples of u2) | +// | (see class ExceptionTableElement) | +// | (access flags bit tells whether table is present) | +// | (indexed from end of constMethodOop) | // |------------------------------------------------------| // | checked exceptions elements + length (length last) | // | (length is u2, elements are u2) | @@ -93,6 +98,15 @@ }; +// Utitily class describing elements in exception table +class ExceptionTableElement VALUE_OBJ_CLASS_SPEC { + public: + u2 start_pc; + u2 end_pc; + u2 handler_pc; + u2 catch_type_index; +}; + class constMethodOopDesc : public oopDesc { friend class constMethodKlass; friend class VMStructs; @@ -100,7 +114,8 @@ enum { _has_linenumber_table = 1, _has_checked_exceptions = 2, - _has_localvariable_table = 4 + _has_localvariable_table = 4, + _has_exception_table = 8 }; // Bit vector of signature @@ -113,25 +128,19 @@ volatile bool _is_conc_safe; // if true, safe for concurrent GC processing public: - oop* oop_block_beg() const { return adr_method(); } - oop* oop_block_end() const { return adr_exception_table() + 1; } + oop* oop_block_beg() const { return adr_constants(); } + oop* oop_block_end() const { return adr_stackmap_data() + 1; } private: // // The oop block. See comment in klass.hpp before making changes. // - // Backpointer to non-const methodOop (needed for some JVMTI operations) - methodOop _method; + constantPoolOop _constants; // Constant pool // Raw stackmap data for the method typeArrayOop _stackmap_data; - // The exception handler table. 4-tuples of ints [start_pc, end_pc, - // handler_pc, catch_type index] For methods with no exceptions the - // table is pointing to Universe::the_empty_int_array - typeArrayOop _exception_table; - // // End of the oop block. // @@ -153,7 +162,8 @@ // Inlined tables void set_inlined_tables_length(int checked_exceptions_len, int compressed_line_number_size, - int localvariable_table_len); + int localvariable_table_len, + int exception_table_len); bool has_linenumber_table() const { return (_flags & _has_linenumber_table) != 0; } @@ -164,13 +174,19 @@ bool has_localvariable_table() const { return (_flags & _has_localvariable_table) != 0; } + bool has_exception_handler() const + { return (_flags & _has_exception_table) != 0; } + void set_interpreter_kind(int kind) { _interpreter_kind = kind; } int interpreter_kind(void) const { return _interpreter_kind; } - // backpointer to non-const methodOop - methodOop method() const { return _method; } - void set_method(methodOop m) { oop_store_without_check((oop*)&_method, (oop) m); } + // constant pool + constantPoolOop constants() const { return _constants; } + void set_constants(constantPoolOop c) { + oop_store_without_check((oop*)&_constants, (oop)c); + } + methodOop method() const; // stackmap table data typeArrayOop stackmap_data() const { return _stackmap_data; } @@ -179,11 +195,6 @@ } bool has_stackmap_table() const { return _stackmap_data != NULL; } - // exception handler table - typeArrayOop exception_table() const { return _exception_table; } - void set_exception_table(typeArrayOop e) { oop_store_without_check((oop*) &_exception_table, (oop) e); } - bool has_exception_handler() const { return exception_table() != NULL && exception_table()->length() > 0; } - void init_fingerprint() { const uint64_t initval = CONST64(0x8000000000000000); _fingerprint = initval; @@ -233,6 +244,7 @@ // Object size needed static int object_size(int code_size, int compressed_line_number_size, int local_variable_table_length, + int exception_table_length, int checked_exceptions_length); int object_size() const { return _constMethod_size; } @@ -254,6 +266,7 @@ u_char* compressed_linenumber_table() const; // not preserved by gc u2* checked_exceptions_length_addr() const; u2* localvariable_table_length_addr() const; + u2* exception_table_length_addr() const; // checked exceptions int checked_exceptions_length() const; @@ -263,6 +276,10 @@ int localvariable_table_length() const; LocalVariableTableElement* localvariable_table_start() const; + // exception table + int exception_table_length() const; + ExceptionTableElement* exception_table_start() const; + // byte codes void set_code(address code) { if (code_size() > 0) { @@ -278,13 +295,12 @@ { return in_ByteSize(sizeof(constMethodOopDesc)); } // interpreter support - static ByteSize exception_table_offset() - { return byte_offset_of(constMethodOopDesc, _exception_table); } + static ByteSize constants_offset() + { return byte_offset_of(constMethodOopDesc, _constants); } // Garbage collection support - oop* adr_method() const { return (oop*)&_method; } + oop* adr_constants() const { return (oop*)&_constants; } oop* adr_stackmap_data() const { return (oop*)&_stackmap_data; } - oop* adr_exception_table() const { return (oop*)&_exception_table; } bool is_conc_safe() { return _is_conc_safe; } void set_is_conc_safe(bool v) { _is_conc_safe = v; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/constantPoolOop.hpp --- a/src/share/vm/oops/constantPoolOop.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/constantPoolOop.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -764,7 +764,7 @@ unsigned char *bytes); }; -class SymbolHashMapEntry : public CHeapObj { +class SymbolHashMapEntry : public CHeapObj { private: unsigned int _hash; // 32-bit hash for item SymbolHashMapEntry* _next; // Next element in the linked list for this bucket @@ -790,7 +790,7 @@ }; // End SymbolHashMapEntry class -class SymbolHashMapBucket : public CHeapObj { +class SymbolHashMapBucket : public CHeapObj { private: SymbolHashMapEntry* _entry; @@ -803,7 +803,7 @@ }; // End SymbolHashMapBucket class -class SymbolHashMap: public CHeapObj { +class SymbolHashMap: public CHeapObj { private: // Default number of entries in the table @@ -816,7 +816,7 @@ void initialize_table(int table_size) { _table_size = table_size; - _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size); + _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol); for (int index = 0; index < table_size; index++) { _buckets[index].clear(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/fieldInfo.hpp --- a/src/share/vm/oops/fieldInfo.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/fieldInfo.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -50,8 +50,7 @@ initval_index_offset = 3, low_offset = 4, high_offset = 5, - generic_signature_offset = 6, - field_slots = 7 + field_slots = 6 }; private: @@ -60,29 +59,28 @@ void set_name_index(u2 val) { _shorts[name_index_offset] = val; } void set_signature_index(u2 val) { _shorts[signature_index_offset] = val; } void set_initval_index(u2 val) { _shorts[initval_index_offset] = val; } - void set_generic_signature_index(u2 val) { _shorts[generic_signature_offset] = val; } u2 name_index() const { return _shorts[name_index_offset]; } u2 signature_index() const { return _shorts[signature_index_offset]; } u2 initval_index() const { return _shorts[initval_index_offset]; } - u2 generic_signature_index() const { return _shorts[generic_signature_offset]; } public: static FieldInfo* from_field_array(typeArrayOop fields, int index) { return ((FieldInfo*)fields->short_at_addr(index * field_slots)); } + static FieldInfo* from_field_array(u2* fields, int index) { + return ((FieldInfo*)(fields + index * field_slots)); + } void initialize(u2 access_flags, u2 name_index, u2 signature_index, u2 initval_index, - u2 generic_signature_index, u4 offset) { _shorts[access_flags_offset] = access_flags; _shorts[name_index_offset] = name_index; _shorts[signature_index_offset] = signature_index; _shorts[initval_index_offset] = initval_index; - _shorts[generic_signature_offset] = generic_signature_index; set_offset(offset); } @@ -105,14 +103,6 @@ return cp->symbol_at(index); } - Symbol* generic_signature(constantPoolHandle cp) const { - int index = generic_signature_index(); - if (index == 0) { - return NULL; - } - return cp->symbol_at(index); - } - void set_access_flags(u2 val) { _shorts[access_flags_offset] = val; } void set_offset(u4 val) { _shorts[low_offset] = extract_low_short_from_int(val); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/fieldStreams.hpp --- a/src/share/vm/oops/fieldStreams.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/fieldStreams.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -42,21 +42,57 @@ constantPoolHandle _constants; int _index; int _limit; + int _generic_signature_slot; FieldInfo* field() const { return FieldInfo::from_field_array(_fields(), _index); } + int init_generic_signature_start_slot() { + int length = _fields->length(); + int num_fields = 0; + int skipped_generic_signature_slots = 0; + FieldInfo* fi; + AccessFlags flags; + /* Scan from 0 to the current _index. Count the number of generic + signature slots for field[0] to field[_index - 1]. */ + for (int i = 0; i < _index; i++) { + fi = FieldInfo::from_field_array(_fields(), i); + flags.set_flags(fi->access_flags()); + if (flags.field_has_generic_signature()) { + length --; + skipped_generic_signature_slots ++; + } + } + /* Scan from the current _index. */ + for (int i = _index; i*FieldInfo::field_slots < length; i++) { + fi = FieldInfo::from_field_array(_fields(), i); + flags.set_flags(fi->access_flags()); + if (flags.field_has_generic_signature()) { + length --; + } + num_fields ++; + } + _generic_signature_slot = length + skipped_generic_signature_slots; + assert(_generic_signature_slot <= _fields->length(), ""); + return num_fields; + } + FieldStreamBase(typeArrayHandle fields, constantPoolHandle constants, int start, int limit) { _fields = fields; _constants = constants; _index = start; - _limit = limit; + int num_fields = init_generic_signature_start_slot(); + if (limit < start) { + _limit = num_fields; + } else { + _limit = limit; + } } FieldStreamBase(typeArrayHandle fields, constantPoolHandle constants) { _fields = fields; _constants = constants; _index = 0; - _limit = fields->length() / FieldInfo::field_slots; + _limit = init_generic_signature_start_slot(); } public: @@ -65,18 +101,26 @@ _constants = klass->constants(); _index = 0; _limit = klass->java_fields_count(); + init_generic_signature_start_slot(); } FieldStreamBase(instanceKlassHandle klass) { _fields = klass->fields(); _constants = klass->constants(); _index = 0; _limit = klass->java_fields_count(); + init_generic_signature_start_slot(); } // accessors int index() const { return _index; } - void next() { _index += 1; } + void next() { + if (access_flags().field_has_generic_signature()) { + _generic_signature_slot ++; + assert(_generic_signature_slot <= _fields->length(), ""); + } + _index += 1; + } bool done() const { return _index >= _limit; } // Accessors for current field @@ -103,7 +147,13 @@ } Symbol* generic_signature() const { - return field()->generic_signature(_constants); + if (access_flags().field_has_generic_signature()) { + assert(_generic_signature_slot < _fields->length(), "out of bounds"); + int index = _fields->short_at(_generic_signature_slot); + return _constants->symbol_at(index); + } else { + return NULL; + } } int offset() const { @@ -139,11 +189,19 @@ } int generic_signature_index() const { assert(!field()->is_internal(), "regular only"); - return field()->generic_signature_index(); + if (access_flags().field_has_generic_signature()) { + assert(_generic_signature_slot < _fields->length(), "out of bounds"); + return _fields->short_at(_generic_signature_slot); + } else { + return 0; + } } void set_generic_signature_index(int index) { assert(!field()->is_internal(), "regular only"); - field()->set_generic_signature_index(index); + if (access_flags().field_has_generic_signature()) { + assert(_generic_signature_slot < _fields->length(), "out of bounds"); + _fields->short_at_put(_generic_signature_slot, index); + } } int initval_index() const { assert(!field()->is_internal(), "regular only"); @@ -159,8 +217,8 @@ // Iterate over only the internal fields class InternalFieldStream : public FieldStreamBase { public: - InternalFieldStream(instanceKlass* k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), k->all_fields_count()) {} - InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), k->all_fields_count()) {} + InternalFieldStream(instanceKlass* k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {} + InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {} }; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/generateOopMap.cpp --- a/src/share/vm/oops/generateOopMap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/generateOopMap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -400,10 +400,9 @@ bool fellThrough = false; // False to get first BB marked. // First mark all exception handlers as start of a basic-block - typeArrayOop excps = method()->exception_table(); - for(int i = 0; i < excps->length(); i += 4) { - int handler_pc_idx = i+2; - bb_mark_fct(this, excps->int_at(handler_pc_idx), NULL); + ExceptionTable excps(method()); + for(int i = 0; i < excps.length(); i ++) { + bb_mark_fct(this, excps.handler_pc(i), NULL); } // Then iterate through the code @@ -450,10 +449,9 @@ // Mark entry basic block as alive and all exception handlers _basic_blocks[0].mark_as_alive(); - typeArrayOop excps = method()->exception_table(); - for(int i = 0; i < excps->length(); i += 4) { - int handler_pc_idx = i+2; - BasicBlock *bb = get_basic_block_at(excps->int_at(handler_pc_idx)); + ExceptionTable excps(method()); + for(int i = 0; i < excps.length(); i++) { + BasicBlock *bb = get_basic_block_at(excps.handler_pc(i)); // If block is not already alive (due to multiple exception handlers to same bb), then // make it alive if (bb->is_dead()) bb->mark_as_alive(); @@ -1181,12 +1179,12 @@ if (_has_exceptions) { int bci = itr->bci(); - typeArrayOop exct = method()->exception_table(); - for(int i = 0; i< exct->length(); i+=4) { - int start_pc = exct->int_at(i); - int end_pc = exct->int_at(i+1); - int handler_pc = exct->int_at(i+2); - int catch_type = exct->int_at(i+3); + ExceptionTable exct(method()); + for(int i = 0; i< exct.length(); i++) { + int start_pc = exct.start_pc(i); + int end_pc = exct.end_pc(i); + int handler_pc = exct.handler_pc(i); + int catch_type = exct.catch_type_index(i); if (start_pc <= bci && bci < end_pc) { BasicBlock *excBB = get_basic_block_at(handler_pc); @@ -2055,7 +2053,7 @@ _conflict = false; _max_locals = method()->max_locals(); _max_stack = method()->max_stack(); - _has_exceptions = (method()->exception_table()->length() > 0); + _has_exceptions = (method()->has_exception_handler()); _nof_refval_conflicts = 0; _init_vars = new GrowableArray(5); // There are seldom more than 5 init_vars _report_result = false; @@ -2070,9 +2068,10 @@ if (Verbose) { _method->print_codes(); tty->print_cr("Exception table:"); - typeArrayOop excps = method()->exception_table(); - for(int i = 0; i < excps->length(); i += 4) { - tty->print_cr("[%d - %d] -> %d", excps->int_at(i + 0), excps->int_at(i + 1), excps->int_at(i + 2)); + ExceptionTable excps(method()); + for(int i = 0; i < excps.length(); i ++) { + tty->print_cr("[%d - %d] -> %d", + excps.start_pc(i), excps.end_pc(i), excps.handler_pc(i)); } } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/instanceKlass.cpp --- a/src/share/vm/oops/instanceKlass.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/instanceKlass.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -847,7 +847,6 @@ Klass::shared_symbols_iterate(closure); closure->do_symbol(&_generic_signature); closure->do_symbol(&_source_file_name); - closure->do_symbol(&_source_debug_extension); for (JavaFieldStream fs(this); !fs.done(); fs.next()) { int name_index = fs.name_index(); @@ -989,7 +988,7 @@ fieldDescriptor fd; int length = java_fields_count(); // In DebugInfo nonstatic fields are sorted by offset. - int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1)); + int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1), mtClass); int j = 0; for (int i = 0; i < length; i += 1) { fd.initialize(as_klassOop(), i); @@ -1009,7 +1008,7 @@ cl->do_field(&fd); } } - FREE_C_HEAP_ARRAY(int, fields_sorted); + FREE_C_HEAP_ARRAY(int, fields_sorted, mtClass); } @@ -1236,7 +1235,7 @@ if (length <= idnum) { // allocate a new cache that might be used size_t size = MAX2(idnum+1, (size_t)ik_h->idnum_allocated_count()); - new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1); + new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1, mtClass); memset(new_jmeths, 0, (size+1)*sizeof(jmethodID)); // cache size is stored in element[0], other elements offset by one new_jmeths[0] = (jmethodID)size; @@ -1397,7 +1396,7 @@ // cache size is stored in element[0], other elements offset by one if (indices == NULL || (length = (size_t)indices[0]) <= idnum) { size_t size = MAX2(idnum+1, (size_t)idnum_allocated_count()); - int* new_indices = NEW_C_HEAP_ARRAY(int, size+1); + int* new_indices = NEW_C_HEAP_ARRAY(int, size+1, mtClass); new_indices[0] = (int)size; // copy any existing entries size_t i; @@ -1933,7 +1932,7 @@ // deallocate the cached class file if (_cached_class_file_bytes != NULL) { - os::free(_cached_class_file_bytes); + os::free(_cached_class_file_bytes, mtClass); _cached_class_file_bytes = NULL; _cached_class_file_len = 0; } @@ -1944,9 +1943,10 @@ // class can't be referenced anymore). if (_array_name != NULL) _array_name->decrement_refcount(); if (_source_file_name != NULL) _source_file_name->decrement_refcount(); - if (_source_debug_extension != NULL) _source_debug_extension->decrement_refcount(); // walk constant pool and decrement symbol reference counts _constants->unreference_symbols(); + + if (_source_debug_extension != NULL) FREE_C_HEAP_ARRAY(char, _source_debug_extension, mtClass); } void instanceKlass::set_source_file_name(Symbol* n) { @@ -1954,9 +1954,22 @@ if (_source_file_name != NULL) _source_file_name->increment_refcount(); } -void instanceKlass::set_source_debug_extension(Symbol* n) { - _source_debug_extension = n; - if (_source_debug_extension != NULL) _source_debug_extension->increment_refcount(); +void instanceKlass::set_source_debug_extension(char* array, int length) { + if (array == NULL) { + _source_debug_extension = NULL; + } else { + // Adding one to the attribute length in order to store a null terminator + // character could cause an overflow because the attribute length is + // already coded with an u4 in the classfile, but in practice, it's + // unlikely to happen. + assert((length+1) > length, "Overflow checking"); + char* sde = NEW_C_HEAP_ARRAY(char, (length + 1), mtClass); + for (int i = 0; i < length; i++) { + sde[i] = array[i]; + } + sde[length] = '\0'; + _source_debug_extension = sde; + } } address instanceKlass::static_field_addr(int offset) { @@ -2530,7 +2543,7 @@ // This is the first previous version so make some space. // Start with 2 elements under the assumption that the class // won't be redefined much. - _previous_versions = new (ResourceObj::C_HEAP) + _previous_versions = new (ResourceObj::C_HEAP, mtClass) GrowableArray(2, true); } @@ -2556,7 +2569,7 @@ ("add: all methods are obsolete; flushing any EMCP weak refs")); } else { int local_count = 0; - GrowableArray* method_refs = new (ResourceObj::C_HEAP) + GrowableArray* method_refs = new (ResourceObj::C_HEAP, mtClass) GrowableArray(emcp_method_count, true); for (int i = 0; i < old_methods->length(); i++) { if (emcp_methods->at(i)) { @@ -2948,7 +2961,7 @@ while (_current_index < length) { PreviousVersionNode * pv_node = _previous_versions->at(_current_index++); - PreviousVersionInfo * pv_info = new (ResourceObj::C_HEAP) + PreviousVersionInfo * pv_info = new (ResourceObj::C_HEAP, mtClass) PreviousVersionInfo(pv_node); constantPoolHandle cp_h = pv_info->prev_constant_pool_handle(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/instanceKlass.hpp --- a/src/share/vm/oops/instanceKlass.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/instanceKlass.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -168,8 +168,19 @@ objArrayOop _local_interfaces; // Interface (klassOops) this class implements transitively. objArrayOop _transitive_interfaces; - // Instance and static variable information, 5-tuples of shorts [access, name - // index, sig index, initval index, offset]. + // Instance and static variable information, starts with 6-tuples of shorts + // [access, name index, sig index, initval index, low_offset, high_offset] + // for all fields, followed by the generic signature data at the end of + // the array. Only fields with generic signature attributes have the generic + // signature data set in the array. The fields array looks like following: + // + // f1: [access, name index, sig index, initial value index, low_offset, high_offset] + // f2: [access, name index, sig index, initial value index, low_offset, high_offset] + // ... + // fn: [access, name index, sig index, initial value index, low_offset, high_offset] + // [generic signature index] + // [generic signature index] + // ... typeArrayOop _fields; // Constant pool for this class. constantPoolOop _constants; @@ -215,7 +226,9 @@ // Name of source file containing this klass, NULL if not specified. Symbol* _source_file_name; // the source debug extension for this klass, NULL if not specified. - Symbol* _source_debug_extension; + // Specified as UTF-8 string without terminating zero byte in the classfile, + // it is stored in the instanceklass as a NULL-terminated UTF-8 string + char* _source_debug_extension; // Generic signature, or null if none. Symbol* _generic_signature; // Array name derived from this class which needs unreferencing @@ -351,9 +364,6 @@ // Number of Java declared fields int java_fields_count() const { return (int)_java_fields_count; } - // Number of fields including any injected fields - int all_fields_count() const { return _fields->length() / FieldInfo::field_slots; } - typeArrayOop fields() const { return _fields; } void set_fields(typeArrayOop f, u2 java_fields_count) { @@ -534,8 +544,8 @@ void set_major_version(u2 major_version) { _major_version = major_version; } // source debug extension - Symbol* source_debug_extension() const { return _source_debug_extension; } - void set_source_debug_extension(Symbol* n); + char* source_debug_extension() const { return _source_debug_extension; } + void set_source_debug_extension(char* array, int length); // symbol unloading support (refcount already added) Symbol* array_name() { return _array_name; } @@ -1000,7 +1010,7 @@ /* JNIid class for jfieldIDs only */ -class JNIid: public CHeapObj { +class JNIid: public CHeapObj { friend class VMStructs; private: klassOop _holder; @@ -1051,7 +1061,7 @@ // reference must be used because a weak reference would be seen as // collectible. A GrowableArray of PreviousVersionNodes is attached // to the instanceKlass as needed. See PreviousVersionWalker below. -class PreviousVersionNode : public CHeapObj { +class PreviousVersionNode : public CHeapObj { private: // A shared ConstantPool is never collected so we'll always have // a reference to it so we can update items in the cache. We'll @@ -1146,7 +1156,7 @@ // noticed since an nmethod should be removed as many times are it's // added. // -class nmethodBucket: public CHeapObj { +class nmethodBucket: public CHeapObj { friend class VMStructs; private: nmethod* _nmethod; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/instanceKlassKlass.cpp --- a/src/share/vm/oops/instanceKlassKlass.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/instanceKlassKlass.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -421,8 +421,7 @@ ik->set_protection_domain(NULL); ik->set_signers(NULL); ik->set_source_file_name(NULL); - ik->set_source_debug_extension(NULL); - ik->set_source_debug_extension(NULL); + ik->set_source_debug_extension(NULL, 0); ik->set_array_name(NULL); ik->set_inner_classes(NULL); ik->set_static_oop_field_count(0); @@ -531,7 +530,7 @@ } if (ik->source_debug_extension() != NULL) { st->print(BULLET"source debug extension: "); - ik->source_debug_extension()->print_value_on(st); + st->print_cr("%s", ik->source_debug_extension()); st->cr(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/instanceRefKlass.cpp --- a/src/share/vm/oops/instanceRefKlass.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/instanceRefKlass.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -515,6 +515,12 @@ void instanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_lock) { // we may enter this with pending exception set PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument + + // Create a HandleMark in case we retry a GC multiple times. + // Each time we attempt the GC, we allocate the handle below + // to hold the pending list lock. We want to free this handle. + HandleMark hm; + Handle h_lock(THREAD, java_lang_ref_Reference::pending_list_lock()); ObjectSynchronizer::fast_enter(h_lock, pending_list_basic_lock, false, THREAD); assert(ObjectSynchronizer::current_thread_holds_lock( @@ -527,7 +533,12 @@ BasicLock *pending_list_basic_lock) { // we may enter this with pending exception set PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument - // + + // Create a HandleMark in case we retry a GC multiple times. + // Each time we attempt the GC, we allocate the handle below + // to hold the pending list lock. We want to free this handle. + HandleMark hm; + Handle h_lock(THREAD, java_lang_ref_Reference::pending_list_lock()); assert(ObjectSynchronizer::current_thread_holds_lock( JavaThread::current(), h_lock), diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/methodKlass.cpp --- a/src/share/vm/oops/methodKlass.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/methodKlass.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -112,11 +112,6 @@ assert(m->is_parsable(), "must be parsable here."); assert(m->size() == size, "wrong size for object"); - // We should not publish an uprasable object's reference - // into one that is parsable, since that presents problems - // for the concurrent parallel marking and precleaning phases - // of concurrent gc (CMS). - xconst->set_method(m); return m; } @@ -127,7 +122,6 @@ // Performance tweak: We skip iterating over the klass pointer since we // know that Universe::methodKlassObj never moves. MarkSweep::mark_and_push(m->adr_constMethod()); - MarkSweep::mark_and_push(m->adr_constants()); if (m->method_data() != NULL) { MarkSweep::mark_and_push(m->adr_method_data()); } @@ -141,7 +135,6 @@ // Performance tweak: We skip iterating over the klass pointer since we // know that Universe::methodKlassObj never moves. PSParallelCompact::mark_and_push(cm, m->adr_constMethod()); - PSParallelCompact::mark_and_push(cm, m->adr_constants()); #ifdef COMPILER2 if (m->method_data() != NULL) { PSParallelCompact::mark_and_push(cm, m->adr_method_data()); @@ -159,7 +152,6 @@ // Performance tweak: We skip iterating over the klass pointer since we // know that Universe::methodKlassObj never moves blk->do_oop(m->adr_constMethod()); - blk->do_oop(m->adr_constants()); if (m->method_data() != NULL) { blk->do_oop(m->adr_method_data()); } @@ -178,8 +170,6 @@ oop* adr; adr = m->adr_constMethod(); if (mr.contains(adr)) blk->do_oop(adr); - adr = m->adr_constants(); - if (mr.contains(adr)) blk->do_oop(adr); if (m->method_data() != NULL) { adr = m->adr_method_data(); if (mr.contains(adr)) blk->do_oop(adr); @@ -197,7 +187,6 @@ // Performance tweak: We skip iterating over the klass pointer since we // know that Universe::methodKlassObj never moves. MarkSweep::adjust_pointer(m->adr_constMethod()); - MarkSweep::adjust_pointer(m->adr_constants()); if (m->method_data() != NULL) { MarkSweep::adjust_pointer(m->adr_method_data()); } @@ -213,7 +202,6 @@ assert(obj->is_method(), "should be method"); methodOop m = methodOop(obj); PSParallelCompact::adjust_pointer(m->adr_constMethod()); - PSParallelCompact::adjust_pointer(m->adr_constants()); #ifdef COMPILER2 if (m->method_data() != NULL) { PSParallelCompact::adjust_pointer(m->adr_method_data()); @@ -339,8 +327,6 @@ if (!obj->partially_loaded()) { methodOop m = methodOop(obj); guarantee(m->is_perm(), "should be in permspace"); - guarantee(m->constants()->is_perm(), "should be in permspace"); - guarantee(m->constants()->is_constantPool(), "should be constant pool"); guarantee(m->constMethod()->is_constMethod(), "should be constMethodOop"); guarantee(m->constMethod()->is_perm(), "should be in permspace"); methodDataOop method_data = m->method_data(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/methodOop.cpp --- a/src/share/vm/oops/methodOop.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/methodOop.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -70,11 +70,11 @@ return _adapter->get_c2i_unverified_entry(); } -char* methodOopDesc::name_and_sig_as_C_string() { +char* methodOopDesc::name_and_sig_as_C_string() const { return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature()); } -char* methodOopDesc::name_and_sig_as_C_string(char* buf, int size) { +char* methodOopDesc::name_and_sig_as_C_string(char* buf, int size) const { return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature(), buf, size); } @@ -111,25 +111,21 @@ int methodOopDesc::fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS) { // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index) - const int beg_bci_offset = 0; - const int end_bci_offset = 1; - const int handler_bci_offset = 2; - const int klass_index_offset = 3; - const int entry_size = 4; // access exception table - typeArrayHandle table (THREAD, constMethod()->exception_table()); - int length = table->length(); - assert(length % entry_size == 0, "exception table format has changed"); + ExceptionTable table(this); + int length = table.length(); // iterate through all entries sequentially constantPoolHandle pool(THREAD, constants()); - for (int i = 0; i < length; i += entry_size) { - int beg_bci = table->int_at(i + beg_bci_offset); - int end_bci = table->int_at(i + end_bci_offset); + for (int i = 0; i < length; i ++) { + //reacquire the table in case a GC happened + ExceptionTable table(this); + int beg_bci = table.start_pc(i); + int end_bci = table.end_pc(i); assert(beg_bci <= end_bci, "inconsistent exception table"); if (beg_bci <= throw_bci && throw_bci < end_bci) { // exception handler bci range covers throw_bci => investigate further - int handler_bci = table->int_at(i + handler_bci_offset); - int klass_index = table->int_at(i + klass_index_offset); + int handler_bci = table.handler_pc(i); + int klass_index = table.catch_type_index(i); if (klass_index == 0) { return handler_bci; } else if (ex_klass.is_null()) { @@ -177,7 +173,8 @@ int methodOopDesc::bci_from(address bcp) const { - assert(is_native() && bcp == code_base() || contains(bcp) || is_error_reported(), "bcp doesn't belong to this method"); + assert(is_native() && bcp == code_base() || contains(bcp) || is_error_reported(), + err_msg("bcp doesn't belong to this method: bcp: " INTPTR_FORMAT ", method: %s", bcp, name_and_sig_as_C_string())); return bcp - code_base(); } @@ -531,9 +528,9 @@ bool methodOopDesc::is_klass_loaded_by_klass_index(int klass_index) const { - if( _constants->tag_at(klass_index).is_unresolved_klass() ) { + if( constants()->tag_at(klass_index).is_unresolved_klass() ) { Thread *thread = Thread::current(); - Symbol* klass_name = _constants->klass_name_at(klass_index); + Symbol* klass_name = constants()->klass_name_at(klass_index); Handle loader(thread, instanceKlass::cast(method_holder())->class_loader()); Handle prot (thread, Klass::cast(method_holder())->protection_domain()); return SystemDictionary::find(klass_name, loader, prot, thread) != NULL; @@ -544,7 +541,7 @@ bool methodOopDesc::is_klass_loaded(int refinfo_index, bool must_be_resolved) const { - int klass_index = _constants->klass_ref_index_at(refinfo_index); + int klass_index = constants()->klass_ref_index_at(refinfo_index); if (must_be_resolved) { // Make sure klass is resolved in constantpool. if (constants()->tag_at(klass_index).is_unresolved_klass()) return false; @@ -886,11 +883,13 @@ } jint* methodOopDesc::method_type_offsets_chain() { - static jint pchase[] = { -1, -1, -1 }; + static jint pchase[] = { -1, -1, -1, -1 }; if (pchase[0] == -1) { - jint step0 = in_bytes(constants_offset()); - jint step1 = (constantPoolOopDesc::header_size() + _imcp_method_type_value) * HeapWordSize; + jint step0 = in_bytes(const_offset()); + jint step1 = in_bytes(constMethodOopDesc::constants_offset()); + jint step2 = (constantPoolOopDesc::header_size() + _imcp_method_type_value) * HeapWordSize; // do this in reverse to avoid races: + OrderAccess::release_store(&pchase[2], step2); OrderAccess::release_store(&pchase[1], step1); OrderAccess::release_store(&pchase[0], step0); } @@ -977,7 +976,7 @@ { int flags_bits = (JVM_MH_INVOKE_BITS | JVM_ACC_PUBLIC | JVM_ACC_FINAL); methodOop m_oop = oopFactory::new_method(0, accessFlags_from(flags_bits), - 0, 0, 0, IsSafeConc, CHECK_(empty)); + 0, 0, 0, 0, IsSafeConc, CHECK_(empty)); m = methodHandle(THREAD, m_oop); } m->set_constants(cp()); @@ -991,7 +990,6 @@ m->set_result_index(rtf.type()); #endif m->compute_size_of_parameters(THREAD); - m->set_exception_table(Universe::the_empty_int_array()); m->init_intrinsic_id(); assert(m->intrinsic_id() == vmIntrinsics::_invokeExact || m->intrinsic_id() == vmIntrinsics::_invokeGeneric, "must be an invoker"); @@ -1035,6 +1033,7 @@ AccessFlags flags = m->access_flags(); int checked_exceptions_len = m->checked_exceptions_length(); int localvariable_len = m->localvariable_table_length(); + int exception_table_len = m->exception_table_length(); // Allocate newm_oop with the is_conc_safe parameter set // to IsUnsafeConc to indicate that newm_oop is not yet // safe for concurrent processing by a GC. @@ -1042,6 +1041,7 @@ flags, new_compressed_linenumber_size, localvariable_len, + exception_table_len, checked_exceptions_len, IsUnsafeConc, CHECK_(methodHandle())); @@ -1076,14 +1076,13 @@ assert(m->constMethod()->is_parsable(), "Should remain parsable"); // Reset correct method/const method, method size, and parameter info - newcm->set_method(newm()); newm->set_constMethod(newcm); - assert(newcm->method() == newm(), "check"); newm->constMethod()->set_code_size(new_code_length); newm->constMethod()->set_constMethod_size(new_const_method_size); newm->set_method_size(new_method_size); assert(newm->code_size() == new_code_length, "check"); assert(newm->checked_exceptions_length() == checked_exceptions_len, "check"); + assert(newm->exception_table_length() == exception_table_len, "check"); assert(newm->localvariable_table_length() == localvariable_len, "check"); // Copy new byte codes memcpy(newm->code_base(), new_code, new_code_length); @@ -1099,6 +1098,12 @@ m->checked_exceptions_start(), checked_exceptions_len * sizeof(CheckedExceptionElement)); } + // Copy exception table + if (exception_table_len > 0) { + memcpy(newm->exception_table_start(), + m->exception_table_start(), + exception_table_len * sizeof(ExceptionTableElement)); + } // Copy local variable number table if (localvariable_len > 0) { memcpy(newm->localvariable_table_start(), diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/methodOop.hpp --- a/src/share/vm/oops/methodOop.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/methodOop.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -64,7 +64,6 @@ // | klass | // |------------------------------------------------------| // | constMethodOop (oop) | -// | constants (oop) | // |------------------------------------------------------| // | methodData (oop) | // | interp_invocation_count | @@ -110,7 +109,6 @@ friend class VMStructs; private: constMethodOop _constMethod; // Method read-only data. - constantPoolOop _constants; // Constant pool methodDataOop _method_data; int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered) AccessFlags _access_flags; // Access flags @@ -124,8 +122,9 @@ u2 _max_locals; // Number of local variables used by this method u2 _size_of_parameters; // size of the parameter block (receiver + arguments) in words u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none) - u1 _jfr_towrite : 1, // Flags - : 7; + u1 _jfr_towrite : 1, // Flags + _force_inline : 1, + : 6; u2 _interpreter_throwout_count; // Count of times method was exited via exception while interpreting u2 _number_of_breakpoints; // fullspeed debugging support InvocationCounter _invocation_counter; // Incremented before each activation of the method - used to trigger frequency-based optimizations @@ -170,17 +169,17 @@ void set_access_flags(AccessFlags flags) { _access_flags = flags; } // name - Symbol* name() const { return _constants->symbol_at(name_index()); } + Symbol* name() const { return constants()->symbol_at(name_index()); } int name_index() const { return constMethod()->name_index(); } void set_name_index(int index) { constMethod()->set_name_index(index); } // signature - Symbol* signature() const { return _constants->symbol_at(signature_index()); } + Symbol* signature() const { return constants()->symbol_at(signature_index()); } int signature_index() const { return constMethod()->signature_index(); } void set_signature_index(int index) { constMethod()->set_signature_index(index); } // generics support - Symbol* generic_signature() const { int idx = generic_signature_index(); return ((idx != 0) ? _constants->symbol_at(idx) : (Symbol*)NULL); } + Symbol* generic_signature() const { int idx = generic_signature_index(); return ((idx != 0) ? constants()->symbol_at(idx) : (Symbol*)NULL); } int generic_signature_index() const { return constMethod()->generic_signature_index(); } void set_generic_signature_index(int index) { constMethod()->set_generic_signature_index(index); } @@ -198,8 +197,8 @@ // C string, for the purpose of providing more useful NoSuchMethodErrors // and fatal error handling. The string is allocated in resource // area if a buffer is not provided by the caller. - char* name_and_sig_as_C_string(); - char* name_and_sig_as_C_string(char* buf, int size); + char* name_and_sig_as_C_string() const; + char* name_and_sig_as_C_string(char* buf, int size) const; // Static routine in the situations we don't have a methodOop static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature); @@ -242,8 +241,8 @@ } // constant pool for klassOop holding this method - constantPoolOop constants() const { return _constants; } - void set_constants(constantPoolOop c) { oop_store_without_check((oop*)&_constants, c); } + constantPoolOop constants() const { return constMethod()->constants(); } + void set_constants(constantPoolOop c) { constMethod()->set_constants(c); } // max stack int max_stack() const { return _max_stack; } @@ -284,12 +283,12 @@ } // exception handler table - typeArrayOop exception_table() const - { return constMethod()->exception_table(); } - void set_exception_table(typeArrayOop e) - { constMethod()->set_exception_table(e); } bool has_exception_handler() const { return constMethod()->has_exception_handler(); } + int exception_table_length() const + { return constMethod()->exception_table_length(); } + ExceptionTableElement* exception_table_start() const + { return constMethod()->exception_table_start(); } // Finds the first entry point bci of an exception handler for an // exception of klass ex_klass thrown at throw_bci. A value of NULL @@ -453,7 +452,7 @@ { return constMethod()->compressed_linenumber_table(); } // method holder (the klassOop holding this method) - klassOop method_holder() const { return _constants->pool_holder(); } + klassOop method_holder() const { return constants()->pool_holder(); } void compute_size_of_parameters(Thread *thread); // word size of parameters (receiver if any + arguments) Symbol* klass_name() const; // returns the name of the method holder @@ -544,7 +543,6 @@ // interpreter support static ByteSize const_offset() { return byte_offset_of(methodOopDesc, _constMethod ); } - static ByteSize constants_offset() { return byte_offset_of(methodOopDesc, _constants ); } static ByteSize access_flags_offset() { return byte_offset_of(methodOopDesc, _access_flags ); } #ifdef CC_INTERP static ByteSize result_index_offset() { return byte_offset_of(methodOopDesc, _result_index ); } @@ -658,6 +656,9 @@ bool jfr_towrite() { return _jfr_towrite; } void set_jfr_towrite(bool towrite) { _jfr_towrite = towrite; } + bool force_inline() { return _force_inline; } + void set_force_inline(bool fi) { _force_inline = fi; } + // On-stack replacement support bool has_osr_nmethod(int level, bool match_level) { return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL; @@ -723,7 +724,6 @@ // Garbage collection support oop* adr_constMethod() const { return (oop*)&_constMethod; } - oop* adr_constants() const { return (oop*)&_constants; } oop* adr_method_data() const { return (oop*)&_method_data; } }; @@ -805,7 +805,7 @@ // breakpoints are written only at safepoints, and are read // concurrently only outside of safepoints. -class BreakpointInfo : public CHeapObj { +class BreakpointInfo : public CHeapObj { friend class VMStructs; private: Bytecodes::Code _orig_bytecode; @@ -839,4 +839,66 @@ void clear(methodOop method); }; +// Utility class for access exception handlers +class ExceptionTable : public StackObj { + private: + ExceptionTableElement* _table; + u2 _length; + + public: + ExceptionTable(methodOop m) { + if (m->has_exception_handler()) { + _table = m->exception_table_start(); + _length = m->exception_table_length(); + } else { + _table = NULL; + _length = 0; + } + } + + int length() const { + return _length; + } + + u2 start_pc(int idx) const { + assert(idx < _length, "out of bounds"); + return _table[idx].start_pc; + } + + void set_start_pc(int idx, u2 value) { + assert(idx < _length, "out of bounds"); + _table[idx].start_pc = value; + } + + u2 end_pc(int idx) const { + assert(idx < _length, "out of bounds"); + return _table[idx].end_pc; + } + + void set_end_pc(int idx, u2 value) { + assert(idx < _length, "out of bounds"); + _table[idx].end_pc = value; + } + + u2 handler_pc(int idx) const { + assert(idx < _length, "out of bounds"); + return _table[idx].handler_pc; + } + + void set_handler_pc(int idx, u2 value) { + assert(idx < _length, "out of bounds"); + _table[idx].handler_pc = value; + } + + u2 catch_type_index(int idx) const { + assert(idx < _length, "out of bounds"); + return _table[idx].catch_type_index; + } + + void set_catch_type_index(int idx, u2 value) { + assert(idx < _length, "out of bounds"); + _table[idx].catch_type_index = value; + } +}; + #endif // SHARE_VM_OOPS_METHODOOP_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/oops/symbol.cpp --- a/src/share/vm/oops/symbol.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/oops/symbol.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -38,7 +38,7 @@ void* Symbol::operator new(size_t sz, int len, TRAPS) { int alloc_size = object_size(len)*HeapWordSize; - address res = (address) AllocateHeap(alloc_size, "symbol"); + address res = (address) AllocateHeap(alloc_size, mtSymbol); DEBUG_ONLY(set_allocation_type(res, ResourceObj::C_HEAP);) return res; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/c2_globals.hpp --- a/src/share/vm/opto/c2_globals.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/c2_globals.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -81,6 +81,13 @@ product(intx, MaxLoopPad, (OptoLoopAlignment-1), \ "Align a loop if padding size in bytes is less or equal to this value") \ \ + product(intx, MaxVectorSize, 32, \ + "Max vector size in bytes, " \ + "actual size could be less depending on elements type") \ + \ + product(bool, AlignVector, false, \ + "Perform vector store/load alignment in loop") \ + \ product(intx, NumberOfLoopInstrToAlign, 4, \ "Number of first instructions in a loop to align") \ \ @@ -292,9 +299,12 @@ develop(bool, SuperWordRTDepCheck, false, \ "Enable runtime dependency checks.") \ \ - product(bool, TraceSuperWord, false, \ + notproduct(bool, TraceSuperWord, false, \ "Trace superword transforms") \ \ + notproduct(bool, TraceNewVectors, false, \ + "Trace creation of Vector nodes") \ + \ product_pd(bool, OptoBundling, \ "Generate nops to fill i-cache lines") \ \ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/callGenerator.cpp --- a/src/share/vm/opto/callGenerator.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/callGenerator.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -172,9 +172,11 @@ JVMState* DynamicCallGenerator::generate(JVMState* jvms) { GraphKit kit(jvms); + Compile* C = kit.C; + PhaseGVN& gvn = kit.gvn(); - if (kit.C->log() != NULL) { - kit.C->log()->elem("dynamic_call bci='%d'", jvms->bci()); + if (C->log() != NULL) { + C->log()->elem("dynamic_call bci='%d'", jvms->bci()); } // Get the constant pool cache from the caller class. @@ -190,18 +192,21 @@ size_t call_site_offset = cpcache->get_f1_offset(index); // Load the CallSite object from the constant pool cache. - const TypeOopPtr* cpcache_ptr = TypeOopPtr::make_from_constant(cpcache); - Node* cpcache_adr = kit.makecon(cpcache_ptr); - Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, cpcache_adr, call_site_offset); - Node* call_site = kit.make_load(kit.control(), call_site_adr, TypeInstPtr::BOTTOM, T_OBJECT, Compile::AliasIdxRaw); + const TypeOopPtr* cpcache_type = TypeOopPtr::make_from_constant(cpcache); // returns TypeAryPtr of type T_OBJECT + const TypeOopPtr* call_site_type = TypeOopPtr::make_from_klass(C->env()->CallSite_klass()); + Node* cpcache_adr = kit.makecon(cpcache_type); + Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, call_site_offset); + // The oops in the constant pool cache are not compressed; load then as raw pointers. + Node* call_site = kit.make_load(kit.control(), call_site_adr, call_site_type, T_ADDRESS, Compile::AliasIdxRaw); // Load the target MethodHandle from the CallSite object. - Node* target_mh_adr = kit.basic_plus_adr(call_site, call_site, java_lang_invoke_CallSite::target_offset_in_bytes()); - Node* target_mh = kit.make_load(kit.control(), target_mh_adr, TypeInstPtr::BOTTOM, T_OBJECT); + const TypeOopPtr* target_type = TypeOopPtr::make_from_klass(C->env()->MethodHandle_klass()); + Node* target_mh_adr = kit.basic_plus_adr(call_site, java_lang_invoke_CallSite::target_offset_in_bytes()); + Node* target_mh = kit.make_load(kit.control(), target_mh_adr, target_type, T_OBJECT); address resolve_stub = SharedRuntime::get_resolve_opt_virtual_call_stub(); - CallStaticJavaNode *call = new (kit.C, tf()->domain()->cnt()) CallStaticJavaNode(tf(), resolve_stub, method(), kit.bci()); + CallStaticJavaNode* call = new (C, tf()->domain()->cnt()) CallStaticJavaNode(tf(), resolve_stub, method(), kit.bci()); // invokedynamic is treated as an optimized invokevirtual. call->set_optimized_virtual(true); // Take extra care (in the presence of argument motion) not to trash the SP: @@ -785,9 +790,10 @@ JVMState* PredictedDynamicCallGenerator::generate(JVMState* jvms) { GraphKit kit(jvms); + Compile* C = kit.C; PhaseGVN& gvn = kit.gvn(); - CompileLog* log = kit.C->log(); + CompileLog* log = C->log(); if (log != NULL) { log->elem("predicted_dynamic_call bci='%d'", jvms->bci()); } @@ -803,8 +809,8 @@ Node* receiver = kit.argument(0); // Check if the MethodHandle is the expected one - Node* cmp = gvn.transform(new(kit.C, 3) CmpPNode(receiver, predicted_mh)); - bol = gvn.transform(new(kit.C, 2) BoolNode(cmp, BoolTest::eq) ); + Node* cmp = gvn.transform(new (C, 3) CmpPNode(receiver, predicted_mh)); + bol = gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::eq) ); } else { // Get the constant pool cache from the caller class. ciMethod* caller_method = jvms->method(); @@ -818,22 +824,25 @@ size_t call_site_offset = cpcache->get_f1_offset(index); // Load the CallSite object from the constant pool cache. - const TypeOopPtr* cpcache_ptr = TypeOopPtr::make_from_constant(cpcache); - Node* cpcache_adr = kit.makecon(cpcache_ptr); - Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, cpcache_adr, call_site_offset); - Node* call_site = kit.make_load(kit.control(), call_site_adr, TypeInstPtr::BOTTOM, T_OBJECT, Compile::AliasIdxRaw); + const TypeOopPtr* cpcache_type = TypeOopPtr::make_from_constant(cpcache); // returns TypeAryPtr of type T_OBJECT + const TypeOopPtr* call_site_type = TypeOopPtr::make_from_klass(C->env()->CallSite_klass()); + Node* cpcache_adr = kit.makecon(cpcache_type); + Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, call_site_offset); + // The oops in the constant pool cache are not compressed; load then as raw pointers. + Node* call_site = kit.make_load(kit.control(), call_site_adr, call_site_type, T_ADDRESS, Compile::AliasIdxRaw); // Load the target MethodHandle from the CallSite object. + const TypeOopPtr* target_type = TypeOopPtr::make_from_klass(C->env()->MethodHandle_klass()); Node* target_adr = kit.basic_plus_adr(call_site, call_site, java_lang_invoke_CallSite::target_offset_in_bytes()); - Node* target_mh = kit.make_load(kit.control(), target_adr, TypeInstPtr::BOTTOM, T_OBJECT); + Node* target_mh = kit.make_load(kit.control(), target_adr, target_type, T_OBJECT); // Check if the MethodHandle is still the same. - Node* cmp = gvn.transform(new(kit.C, 3) CmpPNode(target_mh, predicted_mh)); - bol = gvn.transform(new(kit.C, 2) BoolNode(cmp, BoolTest::eq) ); + Node* cmp = gvn.transform(new (C, 3) CmpPNode(target_mh, predicted_mh)); + bol = gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::eq) ); } IfNode* iff = kit.create_and_xform_if(kit.control(), bol, _hit_prob, COUNT_UNKNOWN); - kit.set_control( gvn.transform(new(kit.C, 1) IfTrueNode (iff))); - Node* slow_ctl = gvn.transform(new(kit.C, 1) IfFalseNode(iff)); + kit.set_control( gvn.transform(new (C, 1) IfTrueNode (iff))); + Node* slow_ctl = gvn.transform(new (C, 1) IfFalseNode(iff)); SafePointNode* slow_map = NULL; JVMState* slow_jvms; @@ -882,7 +891,7 @@ // Finish the diamond. kit.C->set_has_split_ifs(true); // Has chance for split-if optimization - RegionNode* region = new (kit.C, 3) RegionNode(3); + RegionNode* region = new (C, 3) RegionNode(3); region->init_req(1, kit.control()); region->init_req(2, slow_map->control()); kit.set_control(gvn.transform(region)); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/chaitin.cpp --- a/src/share/vm/opto/chaitin.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/chaitin.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -75,6 +75,7 @@ // Flags if( _is_oop ) tty->print("Oop "); if( _is_float ) tty->print("Float "); + if( _is_vector ) tty->print("Vector "); if( _was_spilled1 ) tty->print("Spilled "); if( _was_spilled2 ) tty->print("Spilled2 "); if( _direct_conflict ) tty->print("Direct_conflict "); @@ -479,16 +480,18 @@ // Move important info out of the live_arena to longer lasting storage. alloc_node_regs(_names.Size()); - for( uint i=0; i < _names.Size(); i++ ) { - if( _names[i] ) { // Live range associated with Node? - LRG &lrg = lrgs( _names[i] ); - if( lrg.num_regs() == 1 ) { - _node_regs[i].set1( lrg.reg() ); + for (uint i=0; i < _names.Size(); i++) { + if (_names[i]) { // Live range associated with Node? + LRG &lrg = lrgs(_names[i]); + if (!lrg.alive()) { + _node_regs[i].set_bad(); + } else if (lrg.num_regs() == 1) { + _node_regs[i].set1(lrg.reg()); } else { // Must be a register-pair - if( !lrg._fat_proj ) { // Must be aligned adjacent register pair + if (!lrg._fat_proj) { // Must be aligned adjacent register pair // Live ranges record the highest register in their mask. // We want the low register for the AD file writer's convenience. - _node_regs[i].set2( OptoReg::add(lrg.reg(),-1) ); + _node_regs[i].set2( OptoReg::add(lrg.reg(),(1-lrg.num_regs())) ); } else { // Misaligned; extract 2 bits OptoReg::Name hi = lrg.reg(); // Get hi register lrg.Remove(hi); // Yank from mask @@ -568,7 +571,7 @@ // Check for float-vs-int live range (used in register-pressure // calculations) const Type *n_type = n->bottom_type(); - if( n_type->is_floatingpoint() ) + if (n_type->is_floatingpoint()) lrg._is_float = 1; // Check for twice prior spilling. Once prior spilling might have @@ -599,18 +602,28 @@ // Limit result register mask to acceptable registers const RegMask &rm = n->out_RegMask(); lrg.AND( rm ); - // Check for bound register masks - const RegMask &lrgmask = lrg.mask(); - if( lrgmask.is_bound1() || lrgmask.is_bound2() ) - lrg._is_bound = 1; - - // Check for maximum frequency value - if( lrg._maxfreq < b->_freq ) - lrg._maxfreq = b->_freq; int ireg = n->ideal_reg(); assert( !n->bottom_type()->isa_oop_ptr() || ireg == Op_RegP, "oops must be in Op_RegP's" ); + + // Check for vector live range (only if vector register is used). + // On SPARC vector uses RegD which could be misaligned so it is not + // processes as vector in RA. + if (RegMask::is_vector(ireg)) + lrg._is_vector = 1; + assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD, + "vector must be in vector registers"); + + // Check for bound register masks + const RegMask &lrgmask = lrg.mask(); + if (lrgmask.is_bound(ireg)) + lrg._is_bound = 1; + + // Check for maximum frequency value + if (lrg._maxfreq < b->_freq) + lrg._maxfreq = b->_freq; + // Check for oop-iness, or long/double // Check for multi-kill projection switch( ireg ) { @@ -689,7 +702,7 @@ // AND changes how we count interferences. A mis-aligned // double can interfere with TWO aligned pairs, or effectively // FOUR registers! - if( rm.is_misaligned_Pair() ) { + if (rm.is_misaligned_pair()) { lrg._fat_proj = 1; lrg._is_bound = 1; } @@ -706,6 +719,33 @@ lrg.set_reg_pressure(1); #endif break; + case Op_VecS: + assert(Matcher::vector_size_supported(T_BYTE,4), "sanity"); + assert(RegMask::num_registers(Op_VecS) == RegMask::SlotsPerVecS, "sanity"); + lrg.set_num_regs(RegMask::SlotsPerVecS); + lrg.set_reg_pressure(1); + break; + case Op_VecD: + assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecD), "sanity"); + assert(RegMask::num_registers(Op_VecD) == RegMask::SlotsPerVecD, "sanity"); + assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecD), "vector should be aligned"); + lrg.set_num_regs(RegMask::SlotsPerVecD); + lrg.set_reg_pressure(1); + break; + case Op_VecX: + assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecX), "sanity"); + assert(RegMask::num_registers(Op_VecX) == RegMask::SlotsPerVecX, "sanity"); + assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecX), "vector should be aligned"); + lrg.set_num_regs(RegMask::SlotsPerVecX); + lrg.set_reg_pressure(1); + break; + case Op_VecY: + assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecY), "sanity"); + assert(RegMask::num_registers(Op_VecY) == RegMask::SlotsPerVecY, "sanity"); + assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecY), "vector should be aligned"); + lrg.set_num_regs(RegMask::SlotsPerVecY); + lrg.set_reg_pressure(1); + break; default: ShouldNotReachHere(); } @@ -763,24 +803,38 @@ } else { lrg.AND( rm ); } + // Check for bound register masks const RegMask &lrgmask = lrg.mask(); - if( lrgmask.is_bound1() || lrgmask.is_bound2() ) + int kreg = n->in(k)->ideal_reg(); + bool is_vect = RegMask::is_vector(kreg); + assert(n->in(k)->bottom_type()->isa_vect() == NULL || + is_vect || kreg == Op_RegD, + "vector must be in vector registers"); + if (lrgmask.is_bound(kreg)) lrg._is_bound = 1; + // If this use of a double forces a mis-aligned double, // flag as '_fat_proj' - really flag as allowing misalignment // AND changes how we count interferences. A mis-aligned // double can interfere with TWO aligned pairs, or effectively // FOUR registers! - if( lrg.num_regs() == 2 && !lrg._fat_proj && rm.is_misaligned_Pair() ) { +#ifdef ASSERT + if (is_vect) { + assert(lrgmask.is_aligned_sets(lrg.num_regs()), "vector should be aligned"); + assert(!lrg._fat_proj, "sanity"); + assert(RegMask::num_registers(kreg) == lrg.num_regs(), "sanity"); + } +#endif + if (!is_vect && lrg.num_regs() == 2 && !lrg._fat_proj && rm.is_misaligned_pair()) { lrg._fat_proj = 1; lrg._is_bound = 1; } // if the LRG is an unaligned pair, we will have to spill // so clear the LRG's register mask if it is not already spilled - if ( !n->is_SpillCopy() && - (lrg._def == NULL || lrg.is_multidef() || !lrg._def->is_SpillCopy()) && - lrgmask.is_misaligned_Pair()) { + if (!is_vect && !n->is_SpillCopy() && + (lrg._def == NULL || lrg.is_multidef() || !lrg._def->is_SpillCopy()) && + lrgmask.is_misaligned_pair()) { lrg.Clear(); } @@ -793,12 +847,14 @@ } // end for all blocks // Final per-liverange setup - for( uint i2=0; i2<_maxlrg; i2++ ) { + for (uint i2=0; i2<_maxlrg; i2++) { LRG &lrg = lrgs(i2); - if( lrg.num_regs() == 2 && !lrg._fat_proj ) - lrg.ClearToPairs(); + assert(!lrg._is_vector || !lrg._fat_proj, "sanity"); + if (lrg.num_regs() > 1 && !lrg._fat_proj) { + lrg.clear_to_sets(); + } lrg.compute_set_mask_size(); - if( lrg.not_free() ) { // Handle case where we lose from the start + if (lrg.not_free()) { // Handle case where we lose from the start lrg.set_reg(OptoReg::Name(LRG::SPILL_REG)); lrg._direct_conflict = 1; } @@ -1104,22 +1160,17 @@ // Choose a color which is legal for him RegMask tempmask = lrg.mask(); tempmask.AND(lrgs(copy_lrg).mask()); - OptoReg::Name reg; - if( lrg.num_regs() == 1 ) { - reg = tempmask.find_first_elem(); - } else { - tempmask.ClearToPairs(); - reg = tempmask.find_first_pair(); - } - if( OptoReg::is_valid(reg) ) + tempmask.clear_to_sets(lrg.num_regs()); + OptoReg::Name reg = tempmask.find_first_set(lrg.num_regs()); + if (OptoReg::is_valid(reg)) return reg; } } // If no bias info exists, just go with the register selection ordering - if( lrg.num_regs() == 2 ) { - // Find an aligned pair - return OptoReg::add(lrg.mask().find_first_pair(),chunk); + if (lrg._is_vector || lrg.num_regs() == 2) { + // Find an aligned set + return OptoReg::add(lrg.mask().find_first_set(lrg.num_regs()),chunk); } // CNC - Fun hack. Alternate 1st and 2nd selection. Enables post-allocate @@ -1149,6 +1200,7 @@ // Use a heuristic to "bias" the color choice return bias_color(lrg, chunk); + assert(!lrg._is_vector, "should be not vector here" ); assert( lrg.num_regs() >= 2, "dead live ranges do not color" ); // Fat-proj case or misaligned double argument. @@ -1238,14 +1290,16 @@ } //assert(is_allstack == lrg->mask().is_AllStack(), "nbrs must not change AllStackedness"); // Aligned pairs need aligned masks - if( lrg->num_regs() == 2 && !lrg->_fat_proj ) - lrg->ClearToPairs(); + assert(!lrg->_is_vector || !lrg->_fat_proj, "sanity"); + if (lrg->num_regs() > 1 && !lrg->_fat_proj) { + lrg->clear_to_sets(); + } // Check if a color is available and if so pick the color OptoReg::Name reg = choose_color( *lrg, chunk ); #ifdef SPARC debug_only(lrg->compute_set_mask_size()); - assert(lrg->num_regs() != 2 || lrg->is_bound() || is_even(reg-1), "allocate all doubles aligned"); + assert(lrg->num_regs() < 2 || lrg->is_bound() || is_even(reg-1), "allocate all doubles aligned"); #endif //--------------- @@ -1277,17 +1331,16 @@ // If the live range is not bound, then we actually had some choices // to make. In this case, the mask has more bits in it than the colors // chosen. Restrict the mask to just what was picked. - if( lrg->num_regs() == 1 ) { // Size 1 live range + int n_regs = lrg->num_regs(); + assert(!lrg->_is_vector || !lrg->_fat_proj, "sanity"); + if (n_regs == 1 || !lrg->_fat_proj) { + assert(!lrg->_is_vector || n_regs <= RegMask::SlotsPerVecY, "sanity"); lrg->Clear(); // Clear the mask lrg->Insert(reg); // Set regmask to match selected reg - lrg->set_mask_size(1); - } else if( !lrg->_fat_proj ) { - // For pairs, also insert the low bit of the pair - assert( lrg->num_regs() == 2, "unbound fatproj???" ); - lrg->Clear(); // Clear the mask - lrg->Insert(reg); // Set regmask to match selected reg - lrg->Insert(OptoReg::add(reg,-1)); - lrg->set_mask_size(2); + // For vectors and pairs, also insert the low bit of the pair + for (int i = 1; i < n_regs; i++) + lrg->Insert(OptoReg::add(reg,-i)); + lrg->set_mask_size(n_regs); } else { // Else fatproj // mask must be equal to fatproj bits, by definition } @@ -1483,7 +1536,7 @@ // Check for AddP-related opcodes if( !derived->is_Phi() ) { - assert( derived->as_Mach()->ideal_Opcode() == Op_AddP, "" ); + assert(derived->as_Mach()->ideal_Opcode() == Op_AddP, err_msg("but is: %s", derived->Name())); Node *base = derived->in(AddPNode::Base); derived_base_map[derived->_idx] = base; return base; @@ -1860,12 +1913,20 @@ sprintf(buf,"L%d",lidx); // No register binding yet } else if( !lidx ) { // Special, not allocated value strcpy(buf,"Special"); - } else if( (lrgs(lidx).num_regs() == 1) - ? !lrgs(lidx).mask().is_bound1() - : !lrgs(lidx).mask().is_bound2() ) { - sprintf(buf,"L%d",lidx); // No register binding yet - } else { // Hah! We have a bound machine register - print_reg( lrgs(lidx).reg(), this, buf ); + } else { + if (lrgs(lidx)._is_vector) { + if (lrgs(lidx).mask().is_bound_set(lrgs(lidx).num_regs())) + print_reg( lrgs(lidx).reg(), this, buf ); // a bound machine register + else + sprintf(buf,"L%d",lidx); // No register binding yet + } else if( (lrgs(lidx).num_regs() == 1) + ? lrgs(lidx).mask().is_bound1() + : lrgs(lidx).mask().is_bound_pair() ) { + // Hah! We have a bound machine register + print_reg( lrgs(lidx).reg(), this, buf ); + } else { + sprintf(buf,"L%d",lidx); // No register binding yet + } } } return buf+strlen(buf); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/chaitin.hpp --- a/src/share/vm/opto/chaitin.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/chaitin.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,8 +99,15 @@ void set_mask_size( int size ) { assert((size == 65535) || (size == (int)_mask.Size()), ""); _mask_size = size; - debug_only(_msize_valid=1;) - debug_only( if( _num_regs == 2 && !_fat_proj ) _mask.VerifyPairs(); ) +#ifdef ASSERT + _msize_valid=1; + if (_is_vector) { + assert(!_fat_proj, "sanity"); + _mask.verify_sets(_num_regs); + } else if (_num_regs == 2 && !_fat_proj) { + _mask.verify_pairs(); + } +#endif } void compute_set_mask_size() { set_mask_size(compute_mask_size()); } int mask_size() const { assert( _msize_valid, "mask size not valid" ); @@ -116,7 +123,8 @@ void Set_All() { _mask.Set_All(); debug_only(_msize_valid=1); _mask_size = RegMask::CHUNK_SIZE; } void Insert( OptoReg::Name reg ) { _mask.Insert(reg); debug_only(_msize_valid=0;) } void Remove( OptoReg::Name reg ) { _mask.Remove(reg); debug_only(_msize_valid=0;) } - void ClearToPairs() { _mask.ClearToPairs(); debug_only(_msize_valid=0;) } + void clear_to_pairs() { _mask.clear_to_pairs(); debug_only(_msize_valid=0;) } + void clear_to_sets() { _mask.clear_to_sets(_num_regs); debug_only(_msize_valid=0;) } // Number of registers this live range uses when it colors private: @@ -150,6 +158,7 @@ uint _is_oop:1, // Live-range holds an oop _is_float:1, // True if in float registers + _is_vector:1, // True if in vector registers _was_spilled1:1, // True if prior spilling on def _was_spilled2:1, // True if twice prior spilling on def _is_bound:1, // live range starts life with no diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/classes.hpp --- a/src/share/vm/opto/classes.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/classes.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -147,7 +147,6 @@ macro(LoadL) macro(LoadL_unaligned) macro(LoadPLocked) -macro(LoadLLocked) macro(LoadP) macro(LoadN) macro(LoadRange) @@ -246,14 +245,12 @@ macro(XorL) macro(Vector) macro(AddVB) -macro(AddVC) macro(AddVS) macro(AddVI) macro(AddVL) macro(AddVF) macro(AddVD) macro(SubVB) -macro(SubVC) macro(SubVS) macro(SubVI) macro(SubVL) @@ -264,74 +261,36 @@ macro(DivVF) macro(DivVD) macro(LShiftVB) -macro(LShiftVC) macro(LShiftVS) macro(LShiftVI) -macro(URShiftVB) -macro(URShiftVC) -macro(URShiftVS) -macro(URShiftVI) +macro(RShiftVB) +macro(RShiftVS) +macro(RShiftVI) macro(AndV) macro(OrV) macro(XorV) -macro(VectorLoad) -macro(Load16B) -macro(Load8B) -macro(Load4B) -macro(Load8C) -macro(Load4C) -macro(Load2C) -macro(Load8S) -macro(Load4S) -macro(Load2S) -macro(Load4I) -macro(Load2I) -macro(Load2L) -macro(Load4F) -macro(Load2F) -macro(Load2D) -macro(VectorStore) -macro(Store16B) -macro(Store8B) -macro(Store4B) -macro(Store8C) -macro(Store4C) -macro(Store2C) -macro(Store4I) -macro(Store2I) -macro(Store2L) -macro(Store4F) -macro(Store2F) -macro(Store2D) +macro(LoadVector) +macro(StoreVector) macro(Pack) macro(PackB) macro(PackS) -macro(PackC) macro(PackI) macro(PackL) macro(PackF) macro(PackD) -macro(Pack2x1B) -macro(Pack2x2B) -macro(Replicate16B) -macro(Replicate8B) -macro(Replicate4B) -macro(Replicate8S) -macro(Replicate4S) -macro(Replicate2S) -macro(Replicate8C) -macro(Replicate4C) -macro(Replicate2C) -macro(Replicate4I) -macro(Replicate2I) -macro(Replicate2L) -macro(Replicate4F) -macro(Replicate2F) -macro(Replicate2D) +macro(Pack2L) +macro(Pack2D) +macro(ReplicateB) +macro(ReplicateS) +macro(ReplicateI) +macro(ReplicateL) +macro(ReplicateF) +macro(ReplicateD) macro(Extract) macro(ExtractB) +macro(ExtractUB) +macro(ExtractC) macro(ExtractS) -macro(ExtractC) macro(ExtractI) macro(ExtractL) macro(ExtractF) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/compile.cpp --- a/src/share/vm/opto/compile.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/compile.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -2297,7 +2297,6 @@ case Op_LoadL: case Op_LoadL_unaligned: case Op_LoadPLocked: - case Op_LoadLLocked: case Op_LoadP: case Op_LoadN: case Op_LoadRange: @@ -2592,38 +2591,12 @@ } break; - case Op_Load16B: - case Op_Load8B: - case Op_Load4B: - case Op_Load8S: - case Op_Load4S: - case Op_Load2S: - case Op_Load8C: - case Op_Load4C: - case Op_Load2C: - case Op_Load4I: - case Op_Load2I: - case Op_Load2L: - case Op_Load4F: - case Op_Load2F: - case Op_Load2D: - case Op_Store16B: - case Op_Store8B: - case Op_Store4B: - case Op_Store8C: - case Op_Store4C: - case Op_Store2C: - case Op_Store4I: - case Op_Store2I: - case Op_Store2L: - case Op_Store4F: - case Op_Store2F: - case Op_Store2D: + case Op_LoadVector: + case Op_StoreVector: break; case Op_PackB: case Op_PackS: - case Op_PackC: case Op_PackI: case Op_PackF: case Op_PackL: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/divnode.cpp --- a/src/share/vm/opto/divnode.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/divnode.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -284,9 +284,14 @@ const int N = 64; + // Dummy node to keep intermediate nodes alive during construction + Node* hook = new (phase->C, 4) Node(4); + // u0 = u & 0xFFFFFFFF; u1 = u >> 32; Node* u0 = phase->transform(new (phase->C, 3) AndLNode(dividend, phase->longcon(0xFFFFFFFF))); Node* u1 = phase->transform(new (phase->C, 3) RShiftLNode(dividend, phase->intcon(N / 2))); + hook->init_req(0, u0); + hook->init_req(1, u1); // v0 = v & 0xFFFFFFFF; v1 = v >> 32; Node* v0 = phase->longcon(magic_const & 0xFFFFFFFF); @@ -299,19 +304,14 @@ Node* u1v0 = phase->transform(new (phase->C, 3) MulLNode(u1, v0)); Node* temp = phase->transform(new (phase->C, 3) URShiftLNode(w0, phase->intcon(N / 2))); Node* t = phase->transform(new (phase->C, 3) AddLNode(u1v0, temp)); + hook->init_req(2, t); // w1 = t & 0xFFFFFFFF; - Node* w1 = new (phase->C, 3) AndLNode(t, phase->longcon(0xFFFFFFFF)); + Node* w1 = phase->transform(new (phase->C, 3) AndLNode(t, phase->longcon(0xFFFFFFFF))); + hook->init_req(3, w1); // w2 = t >> 32; - Node* w2 = new (phase->C, 3) RShiftLNode(t, phase->intcon(N / 2)); - - // 6732154: Construct both w1 and w2 before transforming, so t - // doesn't go dead prematurely. - // 6837011: We need to transform w2 before w1 because the - // transformation of w1 could return t. - w2 = phase->transform(w2); - w1 = phase->transform(w1); + Node* w2 = phase->transform(new (phase->C, 3) RShiftLNode(t, phase->intcon(N / 2))); // w1 = u0*v1 + w1; Node* u0v1 = phase->transform(new (phase->C, 3) MulLNode(u0, v1)); @@ -322,6 +322,16 @@ Node* temp1 = phase->transform(new (phase->C, 3) AddLNode(u1v1, w2)); Node* temp2 = phase->transform(new (phase->C, 3) RShiftLNode(w1, phase->intcon(N / 2))); + // Remove the bogus extra edges used to keep things alive + PhaseIterGVN* igvn = phase->is_IterGVN(); + if (igvn != NULL) { + igvn->remove_dead_node(hook); + } else { + for (int i = 0; i < 4; i++) { + hook->set_req(i, NULL); + } + } + return new (phase->C, 3) AddLNode(temp1, temp2); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/doCall.cpp --- a/src/share/vm/opto/doCall.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/doCall.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -780,7 +780,7 @@ if( at_method_entry ) { // bump invocation counter if top method (for statistics) if (CountCompiledCalls && depth() == 1) { - const TypeInstPtr* addr_type = TypeInstPtr::make(method()); + const TypeOopPtr* addr_type = TypeOopPtr::make_from_constant(method()); Node* adr1 = makecon(addr_type); Node* adr2 = basic_plus_adr(adr1, adr1, in_bytes(methodOopDesc::compiled_invocation_counter_offset())); increment_counter(adr2); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/domgraph.cpp --- a/src/share/vm/opto/domgraph.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/domgraph.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -465,15 +465,11 @@ // Kill dead input path assert( !visited.test(whead->in(i)->_idx), "input with no loop must be dead" ); - _igvn.hash_delete(whead); - whead->del_req(i); - _igvn._worklist.push(whead); + _igvn.delete_input_of(whead, i); for (DUIterator_Fast jmax, j = whead->fast_outs(jmax); j < jmax; j++) { Node* p = whead->fast_out(j); if( p->is_Phi() ) { - _igvn.hash_delete(p); - p->del_req(i); - _igvn._worklist.push(p); + _igvn.delete_input_of(p, i); } } i--; // Rerun same iteration diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/graphKit.cpp --- a/src/share/vm/opto/graphKit.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/graphKit.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3748,3 +3748,81 @@ final_sync(ideal); } #undef __ + + + +Node* GraphKit::load_String_offset(Node* ctrl, Node* str) { + if (java_lang_String::has_offset_field()) { + int offset_offset = java_lang_String::offset_offset_in_bytes(); + const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), + false, NULL, 0); + const TypePtr* offset_field_type = string_type->add_offset(offset_offset); + int offset_field_idx = C->get_alias_index(offset_field_type); + return make_load(ctrl, + basic_plus_adr(str, str, offset_offset), + TypeInt::INT, T_INT, offset_field_idx); + } else { + return intcon(0); + } +} + +Node* GraphKit::load_String_length(Node* ctrl, Node* str) { + if (java_lang_String::has_count_field()) { + int count_offset = java_lang_String::count_offset_in_bytes(); + const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), + false, NULL, 0); + const TypePtr* count_field_type = string_type->add_offset(count_offset); + int count_field_idx = C->get_alias_index(count_field_type); + return make_load(ctrl, + basic_plus_adr(str, str, count_offset), + TypeInt::INT, T_INT, count_field_idx); + } else { + return load_array_length(load_String_value(ctrl, str)); + } +} + +Node* GraphKit::load_String_value(Node* ctrl, Node* str) { + int value_offset = java_lang_String::value_offset_in_bytes(); + const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), + false, NULL, 0); + const TypePtr* value_field_type = string_type->add_offset(value_offset); + const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull, + TypeAry::make(TypeInt::CHAR,TypeInt::POS), + ciTypeArrayKlass::make(T_CHAR), true, 0); + int value_field_idx = C->get_alias_index(value_field_type); + return make_load(ctrl, basic_plus_adr(str, str, value_offset), + value_type, T_OBJECT, value_field_idx); +} + +void GraphKit::store_String_offset(Node* ctrl, Node* str, Node* value) { + int offset_offset = java_lang_String::offset_offset_in_bytes(); + const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), + false, NULL, 0); + const TypePtr* offset_field_type = string_type->add_offset(offset_offset); + int offset_field_idx = C->get_alias_index(offset_field_type); + store_to_memory(ctrl, basic_plus_adr(str, offset_offset), + value, T_INT, offset_field_idx); +} + +void GraphKit::store_String_value(Node* ctrl, Node* str, Node* value) { + int value_offset = java_lang_String::value_offset_in_bytes(); + const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), + false, NULL, 0); + const TypePtr* value_field_type = string_type->add_offset(value_offset); + const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull, + TypeAry::make(TypeInt::CHAR,TypeInt::POS), + ciTypeArrayKlass::make(T_CHAR), true, 0); + int value_field_idx = C->get_alias_index(value_field_type); + store_to_memory(ctrl, basic_plus_adr(str, value_offset), + value, T_OBJECT, value_field_idx); +} + +void GraphKit::store_String_length(Node* ctrl, Node* str, Node* value) { + int count_offset = java_lang_String::count_offset_in_bytes(); + const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), + false, NULL, 0); + const TypePtr* count_field_type = string_type->add_offset(count_offset); + int count_field_idx = C->get_alias_index(count_field_type); + store_to_memory(ctrl, basic_plus_adr(str, count_offset), + value, T_INT, count_field_idx); +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/graphKit.hpp --- a/src/share/vm/opto/graphKit.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/graphKit.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -781,6 +781,14 @@ Node* new_array(Node* klass_node, Node* count_val, int nargs, Node* *return_size_val = NULL); + // java.lang.String helpers + Node* load_String_offset(Node* ctrl, Node* str); + Node* load_String_length(Node* ctrl, Node* str); + Node* load_String_value(Node* ctrl, Node* str); + void store_String_offset(Node* ctrl, Node* str, Node* value); + void store_String_length(Node* ctrl, Node* str, Node* value); + void store_String_value(Node* ctrl, Node* str, Node* value); + // Handy for making control flow IfNode* create_and_map_if(Node* ctrl, Node* tst, float prob, float cnt) { IfNode* iff = new (C, 2) IfNode(ctrl, tst, prob, cnt);// New IfNode's diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/idealGraphPrinter.cpp --- a/src/share/vm/opto/idealGraphPrinter.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/idealGraphPrinter.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -130,15 +130,15 @@ } else { st.print("%s%d", PrintIdealGraphFile, _file_count); } - fileStream *stream = new (ResourceObj::C_HEAP) fileStream(st.as_string()); + fileStream *stream = new (ResourceObj::C_HEAP, mtCompiler) fileStream(st.as_string()); _output = stream; } else { - fileStream *stream = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile); + fileStream *stream = new (ResourceObj::C_HEAP, mtCompiler) fileStream(PrintIdealGraphFile); _output = stream; } _file_count++; } else { - _stream = new (ResourceObj::C_HEAP) networkStream(); + _stream = new (ResourceObj::C_HEAP, mtCompiler) networkStream(); // Try to connect to visualizer if (_stream->connect(PrintIdealGraphAddress, PrintIdealGraphPort)) { @@ -160,7 +160,7 @@ } } - _xml = new (ResourceObj::C_HEAP) xmlStream(_output); + _xml = new (ResourceObj::C_HEAP, mtCompiler) xmlStream(_output); head(TOP_ELEMENT); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/ifg.cpp --- a/src/share/vm/opto/ifg.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/ifg.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -416,6 +416,7 @@ if( lrgs(lidx).mask().is_UP() && lrgs(lidx).mask_size() && !lrgs(lidx)._is_float && + !lrgs(lidx)._is_vector && lrgs(lidx).mask().overlap(*Matcher::idealreg2regmask[Op_RegI]) ) cnt += lrgs(lidx).reg_pressure(); } @@ -430,7 +431,7 @@ while ((lidx = elements.next()) != 0) { if( lrgs(lidx).mask().is_UP() && lrgs(lidx).mask_size() && - lrgs(lidx)._is_float ) + (lrgs(lidx)._is_float || lrgs(lidx)._is_vector)) cnt += lrgs(lidx).reg_pressure(); } return cnt; @@ -439,8 +440,8 @@ //------------------------------lower_pressure--------------------------------- // Adjust register pressure down by 1. Capture last hi-to-low transition, static void lower_pressure( LRG *lrg, uint where, Block *b, uint *pressure, uint *hrp_index ) { - if( lrg->mask().is_UP() && lrg->mask_size() ) { - if( lrg->_is_float ) { + if (lrg->mask().is_UP() && lrg->mask_size()) { + if (lrg->_is_float || lrg->_is_vector) { pressure[1] -= lrg->reg_pressure(); if( pressure[1] == (uint)FLOATPRESSURE ) { hrp_index[1] = where; @@ -522,8 +523,8 @@ LRG &lrg = lrgs(lidx); lrg._area += cost; // Compute initial register pressure - if( lrg.mask().is_UP() && lrg.mask_size() ) { - if( lrg._is_float ) { // Count float pressure + if (lrg.mask().is_UP() && lrg.mask_size()) { + if (lrg._is_float || lrg._is_vector) { // Count float pressure pressure[1] += lrg.reg_pressure(); #ifdef EXACT_PRESSURE if( pressure[1] > b->_freg_pressure ) @@ -681,13 +682,10 @@ // according to its bindings. const RegMask &rmask = lrgs(r).mask(); if( lrgs(r).is_bound() && !(n->rematerialize()) && rmask.is_NotEmpty() ) { - // Smear odd bits; leave only aligned pairs of bits. - RegMask r2mask = rmask; - r2mask.SmearToPairs(); // Check for common case int r_size = lrgs(r).num_regs(); OptoReg::Name r_reg = (r_size == 1) ? rmask.find_first_elem() : OptoReg::Physical; - + // Smear odd bits IndexSetIterator elements(&liveout); uint l; while ((l = elements.next()) != 0) { @@ -701,10 +699,15 @@ // Remove the bits from LRG 'r' from LRG 'l' so 'l' no // longer interferes with 'r'. If 'l' requires aligned // adjacent pairs, subtract out bit pairs. - if( lrg.num_regs() == 2 && !lrg._fat_proj ) { + assert(!lrg._is_vector || !lrg._fat_proj, "sanity"); + if (lrg.num_regs() > 1 && !lrg._fat_proj) { + RegMask r2mask = rmask; + // Leave only aligned set of bits. + r2mask.smear_to_sets(lrg.num_regs()); + // It includes vector case. lrg.SUBTRACT( r2mask ); lrg.compute_set_mask_size(); - } else if( r_size != 1 ) { + } else if( r_size != 1 ) { // fat proj lrg.SUBTRACT( rmask ); lrg.compute_set_mask_size(); } else { // Common case: size 1 bound removal @@ -763,8 +766,8 @@ // Newly live things assumed live from here to top of block lrg._area += cost; // Adjust register pressure - if( lrg.mask().is_UP() && lrg.mask_size() ) { - if( lrg._is_float ) { + if (lrg.mask().is_UP() && lrg.mask_size()) { + if (lrg._is_float || lrg._is_vector) { pressure[1] += lrg.reg_pressure(); #ifdef EXACT_PRESSURE if( pressure[1] > b->_freg_pressure ) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/ifnode.cpp --- a/src/share/vm/opto/ifnode.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/ifnode.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -338,8 +338,7 @@ Node *phi_f = NULL; // do not construct unless needed for (DUIterator_Last i2min, i2 = phi->last_outs(i2min); i2 >= i2min; --i2) { Node* v = phi->last_out(i2);// User of the phi - igvn->hash_delete(v); // Have to fixup other Phi users - igvn->_worklist.push(v); + igvn->rehash_node_delayed(v); // Have to fixup other Phi users uint vop = v->Opcode(); Node *proj = NULL; if( vop == Op_Phi ) { // Remote merge point @@ -552,9 +551,8 @@ if( new_cmp == cmp ) return; // Else, adjust existing check Node *new_bol = gvn->transform( new (gvn->C, 2) BoolNode( new_cmp, bol->as_Bool()->_test._test ) ); - igvn->hash_delete( iff ); + igvn->rehash_node_delayed( iff ); iff->set_req_X( 1, new_bol, igvn ); - igvn->_worklist.push( iff ); } //------------------------------up_one_dom------------------------------------- @@ -732,9 +730,7 @@ Node* adjusted = phase->transform(new (phase->C, 3) SubINode(n, phase->intcon(failtype->_lo))); Node* newcmp = phase->transform(new (phase->C, 3) CmpUNode(adjusted, phase->intcon(bound))); Node* newbool = phase->transform(new (phase->C, 2) BoolNode(newcmp, cond)); - phase->hash_delete(dom_iff); - dom_iff->set_req(1, phase->intcon(ctrl->as_Proj()->_con)); - phase->is_IterGVN()->_worklist.push(dom_iff); + phase->is_IterGVN()->replace_input_of(dom_iff, 1, phase->intcon(ctrl->as_Proj()->_con)); phase->hash_delete(this); set_req(1, newbool); return this; @@ -1042,17 +1038,15 @@ // Loop ends when projection has no more uses. for (DUIterator_Last jmin, j = ifp->last_outs(jmin); j >= jmin; --j) { Node* s = ifp->last_out(j); // Get child of IfTrue/IfFalse - igvn->hash_delete(s); // Yank from hash table before edge hacking if( !s->depends_only_on_test() ) { // Find the control input matching this def-use edge. // For Regions it may not be in slot 0. uint l; for( l = 0; s->in(l) != ifp; l++ ) { } - s->set_req(l, ctrl_target); + igvn->replace_input_of(s, l, ctrl_target); } else { // Else, for control producers, - s->set_req(0, data_target); // Move child to data-target + igvn->replace_input_of(s, 0, data_target); // Move child to data-target } - igvn->_worklist.push(s); // Revisit collapsed Phis } // End for each child of a projection igvn->remove_dead_node(ifp); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/lcm.cpp --- a/src/share/vm/opto/lcm.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/lcm.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -139,6 +139,7 @@ int iop = mach->ideal_Opcode(); switch( iop ) { case Op_LoadB: + case Op_LoadUB: case Op_LoadUS: case Op_LoadD: case Op_LoadF: @@ -445,6 +446,11 @@ if( e->is_MachNullCheck() && e->in(1) == n ) continue; + // Schedule IV increment last. + if (e->is_Mach() && e->as_Mach()->ideal_Opcode() == Op_CountedLoopEnd && + e->in(1)->in(1) == n && n->is_iteratively_computed()) + continue; + uint n_choice = 2; // See if this instruction is consumed by a branch. If so, then (as the diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/library_call.cpp --- a/src/share/vm/opto/library_call.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/library_call.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -147,7 +147,8 @@ return generate_method_call(method_id, true, false); } - Node* make_string_method_node(int opcode, Node* str1, Node* cnt1, Node* str2, Node* cnt2); + Node* make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2); + Node* make_string_method_node(int opcode, Node* str1, Node* str2); bool inline_string_compareTo(); bool inline_string_indexOf(); Node* string_indexOf(Node* string_object, ciTypeArray* target_array, jint offset, jint cache_i, jint md2_i); @@ -159,6 +160,7 @@ bool inline_trans(vmIntrinsics::ID id); bool inline_abs(vmIntrinsics::ID id); bool inline_sqrt(vmIntrinsics::ID id); + void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); bool inline_pow(vmIntrinsics::ID id); bool inline_exp(vmIntrinsics::ID id); bool inline_min_max(vmIntrinsics::ID id); @@ -191,8 +193,6 @@ void copy_to_clone(Node* obj, Node* alloc_obj, Node* obj_size, bool is_array, bool card_mark); bool inline_native_clone(bool is_virtual); bool inline_native_Reflection_getCallerClass(); - bool inline_native_AtomicLong_get(); - bool inline_native_AtomicLong_attemptUpdate(); bool is_method_invoke_or_aux_frame(JVMState* jvms); // Helper function for inlining native object hash method bool inline_native_hashcode(bool is_virtual, bool is_static); @@ -330,11 +330,6 @@ // We do not intrinsify this. The optimizer does fine with it. return NULL; - case vmIntrinsics::_get_AtomicLong: - case vmIntrinsics::_attemptUpdate: - if (!InlineAtomicLong) return NULL; - break; - case vmIntrinsics::_getCallerClass: if (!UseNewReflection) return NULL; if (!InlineReflectionGetCallerClass) return NULL; @@ -710,11 +705,6 @@ case vmIntrinsics::_reverseBytes_c: return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id()); - case vmIntrinsics::_get_AtomicLong: - return inline_native_AtomicLong_get(); - case vmIntrinsics::_attemptUpdate: - return inline_native_AtomicLong_attemptUpdate(); - case vmIntrinsics::_getCallerClass: return inline_native_Reflection_getCallerClass(); @@ -873,48 +863,76 @@ //------------------------------make_string_method_node------------------------ -// Helper method for String intrinsic finctions. -Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1, Node* cnt1, Node* str2, Node* cnt2) { - const int value_offset = java_lang_String::value_offset_in_bytes(); - const int count_offset = java_lang_String::count_offset_in_bytes(); - const int offset_offset = java_lang_String::offset_offset_in_bytes(); - +// Helper method for String intrinsic functions. This version is called +// with str1 and str2 pointing to String object nodes. +// +Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1, Node* str2) { Node* no_ctrl = NULL; - ciInstanceKlass* klass = env()->String_klass(); - const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); - - const TypeAryPtr* value_type = - TypeAryPtr::make(TypePtr::NotNull, - TypeAry::make(TypeInt::CHAR,TypeInt::POS), - ciTypeArrayKlass::make(T_CHAR), true, 0); - - // Get start addr of string and substring - Node* str1_valuea = basic_plus_adr(str1, str1, value_offset); - Node* str1_value = make_load(no_ctrl, str1_valuea, value_type, T_OBJECT, string_type->add_offset(value_offset)); - Node* str1_offseta = basic_plus_adr(str1, str1, offset_offset); - Node* str1_offset = make_load(no_ctrl, str1_offseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset)); + // Get start addr of string + Node* str1_value = load_String_value(no_ctrl, str1); + Node* str1_offset = load_String_offset(no_ctrl, str1); Node* str1_start = array_element_address(str1_value, str1_offset, T_CHAR); - Node* str2_valuea = basic_plus_adr(str2, str2, value_offset); - Node* str2_value = make_load(no_ctrl, str2_valuea, value_type, T_OBJECT, string_type->add_offset(value_offset)); - Node* str2_offseta = basic_plus_adr(str2, str2, offset_offset); - Node* str2_offset = make_load(no_ctrl, str2_offseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset)); + // Get length of string 1 + Node* str1_len = load_String_length(no_ctrl, str1); + + Node* str2_value = load_String_value(no_ctrl, str2); + Node* str2_offset = load_String_offset(no_ctrl, str2); Node* str2_start = array_element_address(str2_value, str2_offset, T_CHAR); + Node* str2_len = NULL; + Node* result = NULL; + + switch (opcode) { + case Op_StrIndexOf: + // Get length of string 2 + str2_len = load_String_length(no_ctrl, str2); + + result = new (C, 6) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), + str1_start, str1_len, str2_start, str2_len); + break; + case Op_StrComp: + // Get length of string 2 + str2_len = load_String_length(no_ctrl, str2); + + result = new (C, 6) StrCompNode(control(), memory(TypeAryPtr::CHARS), + str1_start, str1_len, str2_start, str2_len); + break; + case Op_StrEquals: + result = new (C, 5) StrEqualsNode(control(), memory(TypeAryPtr::CHARS), + str1_start, str2_start, str1_len); + break; + default: + ShouldNotReachHere(); + return NULL; + } + + // All these intrinsics have checks. + C->set_has_split_ifs(true); // Has chance for split-if optimization + + return _gvn.transform(result); +} + +// Helper method for String intrinsic functions. This version is called +// with str1 and str2 pointing to char[] nodes, with cnt1 and cnt2 pointing +// to Int nodes containing the lenghts of str1 and str2. +// +Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2) { + Node* result = NULL; switch (opcode) { case Op_StrIndexOf: result = new (C, 6) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), - str1_start, cnt1, str2_start, cnt2); + str1_start, cnt1, str2_start, cnt2); break; case Op_StrComp: result = new (C, 6) StrCompNode(control(), memory(TypeAryPtr::CHARS), - str1_start, cnt1, str2_start, cnt2); + str1_start, cnt1, str2_start, cnt2); break; case Op_StrEquals: result = new (C, 5) StrEqualsNode(control(), memory(TypeAryPtr::CHARS), - str1_start, str2_start, cnt1); + str1_start, str2_start, cnt1); break; default: ShouldNotReachHere(); @@ -932,10 +950,6 @@ if (!Matcher::has_match_rule(Op_StrComp)) return false; - const int value_offset = java_lang_String::value_offset_in_bytes(); - const int count_offset = java_lang_String::count_offset_in_bytes(); - const int offset_offset = java_lang_String::offset_offset_in_bytes(); - _sp += 2; Node *argument = pop(); // pop non-receiver first: it was pushed second Node *receiver = pop(); @@ -952,18 +966,7 @@ return true; } - ciInstanceKlass* klass = env()->String_klass(); - const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); - Node* no_ctrl = NULL; - - // Get counts for string and argument - Node* receiver_cnta = basic_plus_adr(receiver, receiver, count_offset); - Node* receiver_cnt = make_load(no_ctrl, receiver_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); - - Node* argument_cnta = basic_plus_adr(argument, argument, count_offset); - Node* argument_cnt = make_load(no_ctrl, argument_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); - - Node* compare = make_string_method_node(Op_StrComp, receiver, receiver_cnt, argument, argument_cnt); + Node* compare = make_string_method_node(Op_StrComp, receiver, argument); push(compare); return true; } @@ -973,10 +976,6 @@ if (!Matcher::has_match_rule(Op_StrEquals)) return false; - const int value_offset = java_lang_String::value_offset_in_bytes(); - const int count_offset = java_lang_String::count_offset_in_bytes(); - const int offset_offset = java_lang_String::offset_offset_in_bytes(); - int nargs = 2; _sp += nargs; Node* argument = pop(); // pop non-receiver first: it was pushed second @@ -1030,24 +1029,31 @@ } } - const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); - - Node* no_ctrl = NULL; - Node* receiver_cnt; - Node* argument_cnt; - if (!stopped()) { + const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); + // Properly cast the argument to String argument = _gvn.transform(new (C, 2) CheckCastPPNode(control(), argument, string_type)); // This path is taken only when argument's type is String:NotNull. argument = cast_not_null(argument, false); - // Get counts for string and argument - Node* receiver_cnta = basic_plus_adr(receiver, receiver, count_offset); - receiver_cnt = make_load(no_ctrl, receiver_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); - - Node* argument_cnta = basic_plus_adr(argument, argument, count_offset); - argument_cnt = make_load(no_ctrl, argument_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); + Node* no_ctrl = NULL; + + // Get start addr of receiver + Node* receiver_val = load_String_value(no_ctrl, receiver); + Node* receiver_offset = load_String_offset(no_ctrl, receiver); + Node* receiver_start = array_element_address(receiver_val, receiver_offset, T_CHAR); + + // Get length of receiver + Node* receiver_cnt = load_String_length(no_ctrl, receiver); + + // Get start addr of argument + Node* argument_val = load_String_value(no_ctrl, argument); + Node* argument_offset = load_String_offset(no_ctrl, argument); + Node* argument_start = array_element_address(argument_val, argument_offset, T_CHAR); + + // Get length of argument + Node* argument_cnt = load_String_length(no_ctrl, argument); // Check for receiver count != argument count Node* cmp = _gvn.transform( new(C, 3) CmpINode(receiver_cnt, argument_cnt) ); @@ -1057,14 +1063,14 @@ phi->init_req(4, intcon(0)); region->init_req(4, if_ne); } - } - - // Check for count == 0 is done by mach node StrEquals. - - if (!stopped()) { - Node* equals = make_string_method_node(Op_StrEquals, receiver, receiver_cnt, argument, argument_cnt); - phi->init_req(1, equals); - region->init_req(1, control()); + + // Check for count == 0 is done by assembler code for StrEquals. + + if (!stopped()) { + Node* equals = make_string_method_node(Op_StrEquals, receiver_start, receiver_cnt, argument_start, argument_cnt); + phi->init_req(1, equals); + region->init_req(1, control()); + } } // post merge @@ -1162,20 +1168,9 @@ const int nargs = 2; // number of arguments to push back for uncommon trap in predicate - const int value_offset = java_lang_String::value_offset_in_bytes(); - const int count_offset = java_lang_String::count_offset_in_bytes(); - const int offset_offset = java_lang_String::offset_offset_in_bytes(); - - ciInstanceKlass* klass = env()->String_klass(); - const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); - const TypeAryPtr* source_type = TypeAryPtr::make(TypePtr::NotNull, TypeAry::make(TypeInt::CHAR,TypeInt::POS), ciTypeArrayKlass::make(T_CHAR), true, 0); - - Node* sourceOffseta = basic_plus_adr(string_object, string_object, offset_offset); - Node* sourceOffset = make_load(no_ctrl, sourceOffseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset)); - Node* sourceCounta = basic_plus_adr(string_object, string_object, count_offset); - Node* sourceCount = make_load(no_ctrl, sourceCounta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); - Node* sourcea = basic_plus_adr(string_object, string_object, value_offset); - Node* source = make_load(no_ctrl, sourcea, source_type, T_OBJECT, string_type->add_offset(value_offset)); + Node* source = load_String_value(no_ctrl, string_object); + Node* sourceOffset = load_String_offset(no_ctrl, string_object); + Node* sourceCount = load_String_length(no_ctrl, string_object); Node* target = _gvn.transform( makecon(TypeOopPtr::make_from_constant(target_array, true)) ); jint target_length = target_array->length(); @@ -1243,10 +1238,6 @@ //------------------------------inline_string_indexOf------------------------ bool LibraryCallKit::inline_string_indexOf() { - const int value_offset = java_lang_String::value_offset_in_bytes(); - const int count_offset = java_lang_String::count_offset_in_bytes(); - const int offset_offset = java_lang_String::offset_offset_in_bytes(); - _sp += 2; Node *argument = pop(); // pop non-receiver first: it was pushed second Node *receiver = pop(); @@ -1280,12 +1271,21 @@ Node* result_phi = new (C, 4) PhiNode(result_rgn, TypeInt::INT); Node* no_ctrl = NULL; - // Get counts for string and substr - Node* source_cnta = basic_plus_adr(receiver, receiver, count_offset); - Node* source_cnt = make_load(no_ctrl, source_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); - - Node* substr_cnta = basic_plus_adr(argument, argument, count_offset); - Node* substr_cnt = make_load(no_ctrl, substr_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); + // Get start addr of source string + Node* source = load_String_value(no_ctrl, receiver); + Node* source_offset = load_String_offset(no_ctrl, receiver); + Node* source_start = array_element_address(source, source_offset, T_CHAR); + + // Get length of source string + Node* source_cnt = load_String_length(no_ctrl, receiver); + + // Get start addr of substring + Node* substr = load_String_value(no_ctrl, argument); + Node* substr_offset = load_String_offset(no_ctrl, argument); + Node* substr_start = array_element_address(substr, substr_offset, T_CHAR); + + // Get length of source string + Node* substr_cnt = load_String_length(no_ctrl, argument); // Check for substr count > string count Node* cmp = _gvn.transform( new(C, 3) CmpINode(substr_cnt, source_cnt) ); @@ -1308,7 +1308,7 @@ } if (!stopped()) { - result = make_string_method_node(Op_StrIndexOf, receiver, source_cnt, argument, substr_cnt); + result = make_string_method_node(Op_StrIndexOf, source_start, source_cnt, substr_start, substr_cnt); result_phi->init_req(1, result); result_rgn->init_req(1, control()); } @@ -1333,11 +1333,19 @@ ciInstance* str = str_const->as_instance(); assert(str != NULL, "must be instance"); - ciObject* v = str->field_value_by_offset(value_offset).as_object(); - int o = str->field_value_by_offset(offset_offset).as_int(); - int c = str->field_value_by_offset(count_offset).as_int(); + ciObject* v = str->field_value_by_offset(java_lang_String::value_offset_in_bytes()).as_object(); ciTypeArray* pat = v->as_type_array(); // pattern (argument) character array + int o; + int c; + if (java_lang_String::has_offset_field()) { + o = str->field_value_by_offset(java_lang_String::offset_offset_in_bytes()).as_int(); + c = str->field_value_by_offset(java_lang_String::count_offset_in_bytes()).as_int(); + } else { + o = 0; + c = pat->length(); + } + // constant strings have no offset and count == length which // simplifies the resulting code somewhat so lets optimize for that. if (o != 0 || c != pat->length()) { @@ -1528,43 +1536,79 @@ return true; } +void LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName) { + //------------------- + //result=(result.isNaN())? funcAddr():result; + // Check: If isNaN() by checking result!=result? then either trap + // or go to runtime + Node* cmpisnan = _gvn.transform(new (C, 3) CmpDNode(result,result)); + // Build the boolean node + Node* bolisnum = _gvn.transform( new (C, 2) BoolNode(cmpisnan, BoolTest::eq) ); + + if (!too_many_traps(Deoptimization::Reason_intrinsic)) { + { + BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT); + // End the current control-flow path + push_pair(x); + if (y != NULL) { + push_pair(y); + } + // The pow or exp intrinsic returned a NaN, which requires a call + // to the runtime. Recompile with the runtime call. + uncommon_trap(Deoptimization::Reason_intrinsic, + Deoptimization::Action_make_not_entrant); + } + push_pair(result); + } else { + // If this inlining ever returned NaN in the past, we compile a call + // to the runtime to properly handle corner cases + + IfNode* iff = create_and_xform_if(control(), bolisnum, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); + Node* if_slow = _gvn.transform( new (C, 1) IfFalseNode(iff) ); + Node* if_fast = _gvn.transform( new (C, 1) IfTrueNode(iff) ); + + if (!if_slow->is_top()) { + RegionNode* result_region = new(C, 3) RegionNode(3); + PhiNode* result_val = new (C, 3) PhiNode(result_region, Type::DOUBLE); + + result_region->init_req(1, if_fast); + result_val->init_req(1, result); + + set_control(if_slow); + + const TypePtr* no_memory_effects = NULL; + Node* rt = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName, + no_memory_effects, + x, top(), y, y ? top() : NULL); + Node* value = _gvn.transform(new (C, 1) ProjNode(rt, TypeFunc::Parms+0)); +#ifdef ASSERT + Node* value_top = _gvn.transform(new (C, 1) ProjNode(rt, TypeFunc::Parms+1)); + assert(value_top == top(), "second value must be top"); +#endif + + result_region->init_req(2, control()); + result_val->init_req(2, value); + push_result(result_region, result_val); + } else { + push_pair(result); + } + } +} + //------------------------------inline_exp------------------------------------- // Inline exp instructions, if possible. The Intel hardware only misses // really odd corner cases (+/- Infinity). Just uncommon-trap them. bool LibraryCallKit::inline_exp(vmIntrinsics::ID id) { assert(id == vmIntrinsics::_dexp, "Not exp"); - // If this inlining ever returned NaN in the past, we do not intrinsify it - // every again. NaN results requires StrictMath.exp handling. - if (too_many_traps(Deoptimization::Reason_intrinsic)) return false; - - // Do not intrinsify on older platforms which lack cmove. - if (ConditionalMoveLimit == 0) return false; - _sp += arg_size(); // restore stack pointer Node *x = pop_math_arg(); Node *result = _gvn.transform(new (C, 2) ExpDNode(0,x)); - //------------------- - //result=(result.isNaN())? StrictMath::exp():result; - // Check: If isNaN() by checking result!=result? then go to Strict Math - Node* cmpisnan = _gvn.transform(new (C, 3) CmpDNode(result,result)); - // Build the boolean node - Node* bolisnum = _gvn.transform( new (C, 2) BoolNode(cmpisnan, BoolTest::eq) ); - - { BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT); - // End the current control-flow path - push_pair(x); - // Math.exp intrinsic returned a NaN, which requires StrictMath.exp - // to handle. Recompile without intrinsifying Math.exp - uncommon_trap(Deoptimization::Reason_intrinsic, - Deoptimization::Action_make_not_entrant); - } + finish_pow_exp(result, x, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); C->set_has_split_ifs(true); // Has chance for split-if optimization - push_pair(result); - return true; } @@ -1573,17 +1617,12 @@ bool LibraryCallKit::inline_pow(vmIntrinsics::ID id) { assert(id == vmIntrinsics::_dpow, "Not pow"); - // If this inlining ever returned NaN in the past, we do not intrinsify it - // every again. NaN results requires StrictMath.pow handling. - if (too_many_traps(Deoptimization::Reason_intrinsic)) return false; - - // Do not intrinsify on older platforms which lack cmove. - if (ConditionalMoveLimit == 0) return false; - // Pseudocode for pow // if (x <= 0.0) { - // if ((double)((int)y)==y) { // if y is int - // result = ((1&(int)y)==0)?-DPow(abs(x), y):DPow(abs(x), y) + // long longy = (long)y; + // if ((double)longy == y) { // if y is long + // if (y + 1 == y) longy = 0; // huge number: even + // result = ((1&longy) == 0)?-DPow(abs(x), y):DPow(abs(x), y); // } else { // result = NaN; // } @@ -1591,7 +1630,7 @@ // result = DPow(x,y); // } // if (result != result)? { - // uncommon_trap(); + // result = uncommon_trap() or runtime_call(); // } // return result; @@ -1599,15 +1638,14 @@ Node* y = pop_math_arg(); Node* x = pop_math_arg(); - Node *fast_result = _gvn.transform( new (C, 3) PowDNode(0, x, y) ); - - // Short form: if not top-level (i.e., Math.pow but inlining Math.pow - // inside of something) then skip the fancy tests and just check for - // NaN result. - Node *result = NULL; - if( jvms()->depth() >= 1 ) { - result = fast_result; + Node* result = NULL; + + if (!too_many_traps(Deoptimization::Reason_intrinsic)) { + // Short form: skip the fancy tests and just check for NaN result. + result = _gvn.transform( new (C, 3) PowDNode(0, x, y) ); } else { + // If this inlining ever returned NaN in the past, include all + // checks + call to the runtime. // Set the merge point for If node with condition of (x <= 0.0) // There are four possible paths to region node and phi node @@ -1623,55 +1661,95 @@ Node *bol1 = _gvn.transform( new (C, 2) BoolNode( cmp, BoolTest::le ) ); // Branch either way IfNode *if1 = create_and_xform_if(control(),bol1, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN); - Node *opt_test = _gvn.transform(if1); - //assert( opt_test->is_If(), "Expect an IfNode"); - IfNode *opt_if1 = (IfNode*)opt_test; // Fast path taken; set region slot 3 - Node *fast_taken = _gvn.transform( new (C, 1) IfFalseNode(opt_if1) ); + Node *fast_taken = _gvn.transform( new (C, 1) IfFalseNode(if1) ); r->init_req(3,fast_taken); // Capture fast-control // Fast path not-taken, i.e. slow path - Node *complex_path = _gvn.transform( new (C, 1) IfTrueNode(opt_if1) ); + Node *complex_path = _gvn.transform( new (C, 1) IfTrueNode(if1) ); // Set fast path result - Node *fast_result = _gvn.transform( new (C, 3) PowDNode(0, y, x) ); + Node *fast_result = _gvn.transform( new (C, 3) PowDNode(0, x, y) ); phi->init_req(3, fast_result); // Complex path - // Build the second if node (if y is int) - // Node for (int)y - Node *inty = _gvn.transform( new (C, 2) ConvD2INode(y)); - // Node for (double)((int) y) - Node *doubleinty= _gvn.transform( new (C, 2) ConvI2DNode(inty)); - // Check (double)((int) y) : y - Node *cmpinty= _gvn.transform(new (C, 3) CmpDNode(doubleinty, y)); - // Check if (y isn't int) then go to slow path - - Node *bol2 = _gvn.transform( new (C, 2) BoolNode( cmpinty, BoolTest::ne ) ); + // Build the second if node (if y is long) + // Node for (long)y + Node *longy = _gvn.transform( new (C, 2) ConvD2LNode(y)); + // Node for (double)((long) y) + Node *doublelongy= _gvn.transform( new (C, 2) ConvL2DNode(longy)); + // Check (double)((long) y) : y + Node *cmplongy= _gvn.transform(new (C, 3) CmpDNode(doublelongy, y)); + // Check if (y isn't long) then go to slow path + + Node *bol2 = _gvn.transform( new (C, 2) BoolNode( cmplongy, BoolTest::ne ) ); // Branch either way IfNode *if2 = create_and_xform_if(complex_path,bol2, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN); - Node *slow_path = opt_iff(r,if2); // Set region path 2 - - // Calculate DPow(abs(x), y)*(1 & (int)y) + Node* ylong_path = _gvn.transform( new (C, 1) IfFalseNode(if2)); + + Node *slow_path = _gvn.transform( new (C, 1) IfTrueNode(if2) ); + + // Calculate DPow(abs(x), y)*(1 & (long)y) // Node for constant 1 - Node *conone = intcon(1); - // 1& (int)y - Node *signnode= _gvn.transform( new (C, 3) AndINode(conone, inty) ); + Node *conone = longcon(1); + // 1& (long)y + Node *signnode= _gvn.transform( new (C, 3) AndLNode(conone, longy) ); + + // A huge number is always even. Detect a huge number by checking + // if y + 1 == y and set integer to be tested for parity to 0. + // Required for corner case: + // (long)9.223372036854776E18 = max_jlong + // (double)(long)9.223372036854776E18 = 9.223372036854776E18 + // max_jlong is odd but 9.223372036854776E18 is even + Node* yplus1 = _gvn.transform( new (C, 3) AddDNode(y, makecon(TypeD::make(1)))); + Node *cmpyplus1= _gvn.transform(new (C, 3) CmpDNode(yplus1, y)); + Node *bolyplus1 = _gvn.transform( new (C, 2) BoolNode( cmpyplus1, BoolTest::eq ) ); + Node* correctedsign = NULL; + if (ConditionalMoveLimit != 0) { + correctedsign = _gvn.transform( CMoveNode::make(C, NULL, bolyplus1, signnode, longcon(0), TypeLong::LONG)); + } else { + IfNode *ifyplus1 = create_and_xform_if(ylong_path,bolyplus1, PROB_FAIR, COUNT_UNKNOWN); + RegionNode *r = new (C, 3) RegionNode(3); + Node *phi = new (C, 3) PhiNode(r, TypeLong::LONG); + r->init_req(1, _gvn.transform( new (C, 1) IfFalseNode(ifyplus1))); + r->init_req(2, _gvn.transform( new (C, 1) IfTrueNode(ifyplus1))); + phi->init_req(1, signnode); + phi->init_req(2, longcon(0)); + correctedsign = _gvn.transform(phi); + ylong_path = _gvn.transform(r); + record_for_igvn(r); + } + // zero node - Node *conzero = intcon(0); - // Check (1&(int)y)==0? - Node *cmpeq1 = _gvn.transform(new (C, 3) CmpINode(signnode, conzero)); - // Check if (1&(int)y)!=0?, if so the result is negative + Node *conzero = longcon(0); + // Check (1&(long)y)==0? + Node *cmpeq1 = _gvn.transform(new (C, 3) CmpLNode(correctedsign, conzero)); + // Check if (1&(long)y)!=0?, if so the result is negative Node *bol3 = _gvn.transform( new (C, 2) BoolNode( cmpeq1, BoolTest::ne ) ); // abs(x) Node *absx=_gvn.transform( new (C, 2) AbsDNode(x)); // abs(x)^y - Node *absxpowy = _gvn.transform( new (C, 3) PowDNode(0, y, absx) ); + Node *absxpowy = _gvn.transform( new (C, 3) PowDNode(0, absx, y) ); // -abs(x)^y Node *negabsxpowy = _gvn.transform(new (C, 2) NegDNode (absxpowy)); - // (1&(int)y)==1?-DPow(abs(x), y):DPow(abs(x), y) - Node *signresult = _gvn.transform( CMoveNode::make(C, NULL, bol3, absxpowy, negabsxpowy, Type::DOUBLE)); + // (1&(long)y)==1?-DPow(abs(x), y):DPow(abs(x), y) + Node *signresult = NULL; + if (ConditionalMoveLimit != 0) { + signresult = _gvn.transform( CMoveNode::make(C, NULL, bol3, absxpowy, negabsxpowy, Type::DOUBLE)); + } else { + IfNode *ifyeven = create_and_xform_if(ylong_path,bol3, PROB_FAIR, COUNT_UNKNOWN); + RegionNode *r = new (C, 3) RegionNode(3); + Node *phi = new (C, 3) PhiNode(r, Type::DOUBLE); + r->init_req(1, _gvn.transform( new (C, 1) IfFalseNode(ifyeven))); + r->init_req(2, _gvn.transform( new (C, 1) IfTrueNode(ifyeven))); + phi->init_req(1, absxpowy); + phi->init_req(2, negabsxpowy); + signresult = _gvn.transform(phi); + ylong_path = _gvn.transform(r); + record_for_igvn(r); + } // Set complex path fast result + r->init_req(2, ylong_path); phi->init_req(2, signresult); static const jlong nan_bits = CONST64(0x7ff8000000000000); @@ -1685,27 +1763,10 @@ result=_gvn.transform(phi); } - //------------------- - //result=(result.isNaN())? uncommon_trap():result; - // Check: If isNaN() by checking result!=result? then go to Strict Math - Node* cmpisnan = _gvn.transform(new (C, 3) CmpDNode(result,result)); - // Build the boolean node - Node* bolisnum = _gvn.transform( new (C, 2) BoolNode(cmpisnan, BoolTest::eq) ); - - { BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT); - // End the current control-flow path - push_pair(x); - push_pair(y); - // Math.pow intrinsic returned a NaN, which requires StrictMath.pow - // to handle. Recompile without intrinsifying Math.pow. - uncommon_trap(Deoptimization::Reason_intrinsic, - Deoptimization::Action_make_not_entrant); - } + finish_pow_exp(result, x, y, OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); C->set_has_split_ifs(true); // Has chance for split-if optimization - push_pair(result); - return true; } @@ -1783,15 +1844,11 @@ case vmIntrinsics::_dsqrt: return Matcher::has_match_rule(Op_SqrtD) ? inline_sqrt(id) : false; case vmIntrinsics::_dabs: return Matcher::has_match_rule(Op_AbsD) ? inline_abs(id) : false; - // These intrinsics don't work on X86. The ad implementation doesn't - // handle NaN's properly. Instead of returning infinity, the ad - // implementation returns a NaN on overflow. See bug: 6304089 - // Once the ad implementations are fixed, change the code below - // to match the intrinsics above - case vmIntrinsics::_dexp: return + Matcher::has_match_rule(Op_ExpD) ? inline_exp(id) : runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); case vmIntrinsics::_dpow: return + Matcher::has_match_rule(Op_PowD) ? inline_pow(id) : runtime_math(OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); // These intrinsics are not yet correctly implemented @@ -3592,8 +3649,10 @@ } // Bail out if length is negative. - // ...Not needed, since the new_array will throw the right exception. - //generate_negative_guard(length, bailout, &length); + // Without this the new_array would throw + // NegativeArraySizeException but IllegalArgumentException is what + // should be thrown + generate_negative_guard(length, bailout, &length); if (bailout->req() > 1) { PreserveJVMState pjvms(this); @@ -3617,7 +3676,9 @@ // Extreme case: Arrays.copyOf((Integer[])x, 10, String[].class). // This will fail a store-check if x contains any non-nulls. bool disjoint_bases = true; - bool length_never_negative = true; + // if start > orig_length then the length of the copy may be + // negative. + bool length_never_negative = !is_copyOfRange; generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT, original, start, newcopy, intcon(0), moved, disjoint_bases, length_never_negative); @@ -3994,113 +4055,6 @@ return false; } -static int value_field_offset = -1; // offset of the "value" field of AtomicLongCSImpl. This is needed by - // inline_native_AtomicLong_attemptUpdate() but it has no way of - // computing it since there is no lookup field by name function in the - // CI interface. This is computed and set by inline_native_AtomicLong_get(). - // Using a static variable here is safe even if we have multiple compilation - // threads because the offset is constant. At worst the same offset will be - // computed and stored multiple - -bool LibraryCallKit::inline_native_AtomicLong_get() { - // Restore the stack and pop off the argument - _sp+=1; - Node *obj = pop(); - - // get the offset of the "value" field. Since the CI interfaces - // does not provide a way to look up a field by name, we scan the bytecodes - // to get the field index. We expect the first 2 instructions of the method - // to be: - // 0 aload_0 - // 1 getfield "value" - ciMethod* method = callee(); - if (value_field_offset == -1) - { - ciField* value_field; - ciBytecodeStream iter(method); - Bytecodes::Code bc = iter.next(); - - if ((bc != Bytecodes::_aload_0) && - ((bc != Bytecodes::_aload) || (iter.get_index() != 0))) - return false; - bc = iter.next(); - if (bc != Bytecodes::_getfield) - return false; - bool ignore; - value_field = iter.get_field(ignore); - value_field_offset = value_field->offset_in_bytes(); - } - - // Null check without removing any arguments. - _sp++; - obj = do_null_check(obj, T_OBJECT); - _sp--; - // Check for locking null object - if (stopped()) return true; - - Node *adr = basic_plus_adr(obj, obj, value_field_offset); - const TypePtr *adr_type = _gvn.type(adr)->is_ptr(); - int alias_idx = C->get_alias_index(adr_type); - - Node *result = _gvn.transform(new (C, 3) LoadLLockedNode(control(), memory(alias_idx), adr)); - - push_pair(result); - - return true; -} - -bool LibraryCallKit::inline_native_AtomicLong_attemptUpdate() { - // Restore the stack and pop off the arguments - _sp+=5; - Node *newVal = pop_pair(); - Node *oldVal = pop_pair(); - Node *obj = pop(); - - // we need the offset of the "value" field which was computed when - // inlining the get() method. Give up if we don't have it. - if (value_field_offset == -1) - return false; - - // Null check without removing any arguments. - _sp+=5; - obj = do_null_check(obj, T_OBJECT); - _sp-=5; - // Check for locking null object - if (stopped()) return true; - - Node *adr = basic_plus_adr(obj, obj, value_field_offset); - const TypePtr *adr_type = _gvn.type(adr)->is_ptr(); - int alias_idx = C->get_alias_index(adr_type); - - Node *cas = _gvn.transform(new (C, 5) StoreLConditionalNode(control(), memory(alias_idx), adr, newVal, oldVal)); - Node *store_proj = _gvn.transform( new (C, 1) SCMemProjNode(cas)); - set_memory(store_proj, alias_idx); - Node *bol = _gvn.transform( new (C, 2) BoolNode( cas, BoolTest::eq ) ); - - Node *result; - // CMove node is not used to be able fold a possible check code - // after attemptUpdate() call. This code could be transformed - // into CMove node by loop optimizations. - { - RegionNode *r = new (C, 3) RegionNode(3); - result = new (C, 3) PhiNode(r, TypeInt::BOOL); - - Node *iff = create_and_xform_if(control(), bol, PROB_FAIR, COUNT_UNKNOWN); - Node *iftrue = opt_iff(r, iff); - r->init_req(1, iftrue); - result->init_req(1, intcon(1)); - result->init_req(2, intcon(0)); - - set_control(_gvn.transform(r)); - record_for_igvn(r); - - C->set_has_split_ifs(true); // Has chance for split-if optimization - } - - push(_gvn.transform(result)); - return true; -} - bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) { // restore the arguments _sp += arg_size(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/loopPredicate.cpp --- a/src/share/vm/opto/loopPredicate.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/loopPredicate.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -212,9 +212,8 @@ Node* use = rgn->fast_out(i); if (use->is_Phi() && use->outcnt() > 0) { assert(use->in(0) == rgn, ""); - _igvn.hash_delete(use); + _igvn.rehash_node_delayed(use); use->add_req(use->in(proj_index)); - _igvn._worklist.push(use); has_phi = true; } } @@ -284,9 +283,8 @@ for (DUIterator_Fast imax, i = rgn->fast_outs(imax); i < imax; i++) { Node* use = rgn->fast_out(i); if (use->is_Phi() && use->outcnt() > 0) { - hash_delete(use); + rehash_node_delayed(use); use->add_req(use->in(proj_index)); - _worklist.push(use); has_phi = true; } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/loopTransform.cpp --- a/src/share/vm/opto/loopTransform.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/loopTransform.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -961,9 +961,7 @@ set_loop(zer_iff, loop->_parent); // Plug in the false-path, taken if we need to skip post-loop - _igvn.hash_delete( main_exit ); - main_exit->set_req(0, zer_iff); - _igvn._worklist.push(main_exit); + _igvn.replace_input_of(main_exit, 0, zer_iff); set_idom(main_exit, zer_iff, dd_main_exit); set_idom(main_exit->unique_out(), zer_iff, dd_main_exit); // Make the true-path, must enter the post loop @@ -1956,9 +1954,7 @@ C->set_major_progress(); Node *kill_con = _igvn.intcon( 1-flip ); set_ctrl(kill_con, C->root()); - _igvn.hash_delete(iff); - iff->set_req(1, kill_con); - _igvn._worklist.push(iff); + _igvn.replace_input_of(iff, 1, kill_con); // Find surviving projection assert(iff->is_If(), ""); ProjNode* dp = ((IfNode*)iff)->proj_out(1-flip); @@ -1966,11 +1962,9 @@ for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) { Node* cd = dp->fast_out(i); // Control-dependent node if( cd->is_Load() ) { // Loads can now float around in the loop - _igvn.hash_delete(cd); // Allow the load to float around in the loop, or before it // but NOT before the pre-loop. - cd->set_req(0, ctrl); // ctrl, not NULL - _igvn._worklist.push(cd); + _igvn.replace_input_of(cd, 0, ctrl); // ctrl, not NULL --i; --imax; } @@ -2029,14 +2023,10 @@ main_bol->set_req(1,main_cmp); } // Hack the now-private loop bounds - _igvn.hash_delete(main_cmp); - main_cmp->set_req(2, main_limit); - _igvn._worklist.push(main_cmp); + _igvn.replace_input_of(main_cmp, 2, main_limit); // The OpaqueNode is unshared by design - _igvn.hash_delete(opqzm); assert( opqzm->outcnt() == 1, "cannot hack shared node" ); - opqzm->set_req(1,main_limit); - _igvn._worklist.push(opqzm); + _igvn.replace_input_of(opqzm, 1, main_limit); } //------------------------------DCE_loop_body---------------------------------- @@ -2178,9 +2168,7 @@ Node* cmp = cl->loopexit()->cmp_node(); assert(cl->limit() == cmp->in(2), "sanity"); phase->_igvn._worklist.push(cmp->in(2)); // put limit on worklist - phase->_igvn.hash_delete(cmp); - cmp->set_req(2, exact_limit); - phase->_igvn._worklist.push(cmp); // put cmp on worklist + phase->_igvn.replace_input_of(cmp, 2, exact_limit); // put cmp on worklist } // Note: the final value after increment should not overflow since // counted loop has limit check predicate. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/loopUnswitch.cpp --- a/src/share/vm/opto/loopUnswitch.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/loopUnswitch.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -174,27 +174,21 @@ Node* use = worklist.pop(); Node* nuse = use->clone(); nuse->set_req(0, invar_proj); - _igvn.hash_delete(use); - use->set_req(1, nuse); - _igvn._worklist.push(use); + _igvn.replace_input_of(use, 1, nuse); register_new_node(nuse, invar_proj); // Same for the clone Node* use_clone = old_new[use->_idx]; - _igvn.hash_delete(use_clone); - use_clone->set_req(1, nuse); - _igvn._worklist.push(use_clone); + _igvn.replace_input_of(use_clone, 1, nuse); } } // Hardwire the control paths in the loops into if(true) and if(false) - _igvn.hash_delete(unswitch_iff); + _igvn.rehash_node_delayed(unswitch_iff); short_circuit_if(unswitch_iff, proj_true); - _igvn._worklist.push(unswitch_iff); IfNode* unswitch_iff_clone = old_new[unswitch_iff->_idx]->as_If(); - _igvn.hash_delete(unswitch_iff_clone); + _igvn.rehash_node_delayed(unswitch_iff_clone); short_circuit_if(unswitch_iff_clone, proj_false); - _igvn._worklist.push(unswitch_iff_clone); // Reoptimize loops loop->record_for_igvn(); @@ -224,8 +218,7 @@ LoopNode* head = loop->_head->as_Loop(); bool counted_loop = head->is_CountedLoop(); Node* entry = head->in(LoopNode::EntryControl); - _igvn.hash_delete(entry); - _igvn._worklist.push(entry); + _igvn.rehash_node_delayed(entry); IdealLoopTree* outer_loop = loop->_parent; Node *cont = _igvn.intcon(1); @@ -249,18 +242,14 @@ // Fast (true) control Node* iffast_pred = clone_loop_predicates(entry, iffast, !counted_loop); - _igvn.hash_delete(head); - head->set_req(LoopNode::EntryControl, iffast_pred); + _igvn.replace_input_of(head, LoopNode::EntryControl, iffast_pred); set_idom(head, iffast_pred, dom_depth(head)); - _igvn._worklist.push(head); // Slow (false) control Node* ifslow_pred = clone_loop_predicates(entry, ifslow, !counted_loop); LoopNode* slow_head = old_new[head->_idx]->as_Loop(); - _igvn.hash_delete(slow_head); - slow_head->set_req(LoopNode::EntryControl, ifslow_pred); + _igvn.replace_input_of(slow_head, LoopNode::EntryControl, ifslow_pred); set_idom(slow_head, ifslow_pred, dom_depth(slow_head)); - _igvn._worklist.push(slow_head); recompute_dom_depth(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/loopnode.cpp --- a/src/share/vm/opto/loopnode.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/loopnode.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1129,8 +1129,7 @@ // I'm mid-iteration over the Region's uses. for (DUIterator_Last imin, i = old_phi->last_outs(imin); i >= imin; ) { Node* use = old_phi->last_out(i); - igvn.hash_delete(use); - igvn._worklist.push(use); + igvn.rehash_node_delayed(use); uint uses_found = 0; for (uint j = 0; j < use->len(); j++) { if (use->in(j) == old_phi) { @@ -1186,10 +1185,8 @@ phi->init_req(LoopNode::LoopBackControl, old_phi->in(outer_idx)); phi = igvn.register_new_node_with_optimizer(phi, old_phi); // Make old Phi point to new Phi on the fall-in path - igvn.hash_delete(old_phi); - old_phi->set_req(LoopNode::EntryControl, phi); + igvn.replace_input_of(old_phi, LoopNode::EntryControl, phi); old_phi->del_req(outer_idx); - igvn._worklist.push(old_phi); } } @@ -1992,9 +1989,7 @@ // we do it here. for( uint i = 1; i < C->root()->req(); i++ ) { if( !_nodes[C->root()->in(i)->_idx] ) { // Dead path into Root? - _igvn.hash_delete(C->root()); - C->root()->del_req(i); - _igvn._worklist.push(C->root()); + _igvn.delete_input_of(C->root(), i); i--; // Rerun same iteration on compressed edges } } @@ -2756,7 +2751,8 @@ // Do not count uncommon calls if( !n->is_CallStaticJava() || !n->as_CallStaticJava()->_name ) { Node *iff = n->in(0)->in(0); - if( !iff->is_If() || + // No any calls for vectorized loops. + if( UseSuperWord || !iff->is_If() || (n->in(0)->Opcode() == Op_IfFalse && (1.0 - iff->as_If()->_prob) >= 0.01) || (iff->as_If()->_prob >= 0.01) ) @@ -3221,7 +3217,8 @@ case Op_ModF: case Op_ModD: case Op_LoadB: // Same with Loads; they can sink - case Op_LoadUS: // during loop optimizations. + case Op_LoadUB: // during loop optimizations. + case Op_LoadUS: case Op_LoadD: case Op_LoadF: case Op_LoadI: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/loopopts.cpp --- a/src/share/vm/opto/loopopts.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/loopopts.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -216,9 +216,7 @@ Node *con = _igvn.makecon(pop == Op_IfTrue ? TypeInt::ONE : TypeInt::ZERO); set_ctrl(con, C->root()); // Constant gets a new use // Hack the dominated test - _igvn.hash_delete(iff); - iff->set_req(1, con); - _igvn._worklist.push(iff); + _igvn.replace_input_of(iff, 1, con); // If I dont have a reachable TRUE and FALSE path following the IfNode then // I can assume this path reaches an infinite loop. In this case it's not @@ -245,10 +243,8 @@ Node* cd = dp->fast_out(i); // Control-dependent node if (cd->depends_only_on_test()) { assert(cd->in(0) == dp, ""); - _igvn.hash_delete(cd); - cd->set_req(0, prevdom); + _igvn.replace_input_of(cd, 0, prevdom); set_early_ctrl(cd); - _igvn._worklist.push(cd); IdealLoopTree *new_loop = get_loop(get_ctrl(cd)); if (old_loop != new_loop) { if (!old_loop->_child) old_loop->_body.yank(cd); @@ -952,8 +948,7 @@ if (!n->is_Load() || late_load_ctrl != n_ctrl) { for (DUIterator_Last jmin, j = n->last_outs(jmin); j >= jmin; ) { Node *u = n->last_out(j); // Clone private computation per use - _igvn.hash_delete(u); - _igvn._worklist.push(u); + _igvn.rehash_node_delayed(u); Node *x = n->clone(); // Clone computation Node *x_ctrl = NULL; if( u->is_Phi() ) { @@ -1089,9 +1084,7 @@ for( i = 1; i < phi->req(); i++ ) { Node *b = phi->in(i); if( b->is_Phi() ) { - _igvn.hash_delete(phi); - _igvn._worklist.push(phi); - phi->set_req(i, clone_iff( b->as_Phi(), loop )); + _igvn.replace_input_of(phi, i, clone_iff( b->as_Phi(), loop )); } else { assert( b->is_Bool(), "" ); } @@ -1161,9 +1154,7 @@ for( i = 1; i < phi->req(); i++ ) { Node *b = phi->in(i); if( b->is_Phi() ) { - _igvn.hash_delete(phi); - _igvn._worklist.push(phi); - phi->set_req(i, clone_bool( b->as_Phi(), loop )); + _igvn.replace_input_of(phi, i, clone_bool( b->as_Phi(), loop )); } else { assert( b->is_Cmp() || b->is_top(), "inputs are all Cmp or TOP" ); } @@ -1347,8 +1338,7 @@ // The original user of 'use' uses 'r' instead. for (DUIterator_Last lmin, l = use->last_outs(lmin); l >= lmin;) { Node* useuse = use->last_out(l); - _igvn.hash_delete(useuse); - _igvn._worklist.push(useuse); + _igvn.rehash_node_delayed(useuse); uint uses_found = 0; if( useuse->in(0) == use ) { useuse->set_req(0, r); @@ -1435,9 +1425,7 @@ if( use->is_Phi() ) // Phi use is in prior block cfg = prev->in(idx); // NOT in block of Phi itself if (cfg->is_top()) { // Use is dead? - _igvn.hash_delete(use); - _igvn._worklist.push(use); - use->set_req(idx, C->top()); + _igvn.replace_input_of(use, idx, C->top()); continue; } @@ -1487,9 +1475,7 @@ set_ctrl(phi, prev); } // Make 'use' use the Phi instead of the old loop body exit value - _igvn.hash_delete(use); - _igvn._worklist.push(use); - use->set_req(idx, phi); + _igvn.replace_input_of(use, idx, phi); if( use->_idx >= new_counter ) { // If updating new phis // Not needed for correctness, but prevents a weak assert // in AddPNode from tripping (when we end up with different @@ -1517,9 +1503,7 @@ Node *iff = split_if_set->pop(); if( iff->in(1)->is_Phi() ) { BoolNode *b = clone_iff( iff->in(1)->as_Phi(), loop ); - _igvn.hash_delete(iff); - _igvn._worklist.push(iff); - iff->set_req(1, b); + _igvn.replace_input_of(iff, 1, b); } } } @@ -1529,9 +1513,7 @@ Node *phi = b->in(1); assert( phi->is_Phi(), "" ); CmpNode *cmp = clone_bool( (PhiNode*)phi, loop ); - _igvn.hash_delete(b); - _igvn._worklist.push(b); - b->set_req(1, cmp); + _igvn.replace_input_of(b, 1, cmp); } } if( split_cex_set ) { @@ -1686,10 +1668,8 @@ ProjNode *other_proj = iff->proj_out(!proj->is_IfTrue())->as_Proj(); int ddepth = dom_depth(proj); - _igvn.hash_delete(iff); - _igvn._worklist.push(iff); - _igvn.hash_delete(proj); - _igvn._worklist.push(proj); + _igvn.rehash_node_delayed(iff); + _igvn.rehash_node_delayed(proj); proj->set_req(0, NULL); // temporary disconnect ProjNode* proj2 = proj_clone(proj, iff); @@ -1745,10 +1725,8 @@ ProjNode *other_proj = iff->proj_out(!proj->is_IfTrue())->as_Proj(); int ddepth = dom_depth(proj); - _igvn.hash_delete(iff); - _igvn._worklist.push(iff); - _igvn.hash_delete(proj); - _igvn._worklist.push(proj); + _igvn.rehash_node_delayed(iff); + _igvn.rehash_node_delayed(proj); proj->set_req(0, NULL); // temporary disconnect ProjNode* proj2 = proj_clone(proj, iff); @@ -1970,9 +1948,7 @@ // clone "n" and insert it between the inputs of "n" and the use outside the loop Node* n_clone = n->clone(); - _igvn.hash_delete(use); - use->set_req(j, n_clone); - _igvn._worklist.push(use); + _igvn.replace_input_of(use, j, n_clone); Node* use_c; if (!use->is_Phi()) { use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0); @@ -2028,8 +2004,7 @@ #endif while( worklist.size() ) { Node *use = worklist.pop(); - _igvn.hash_delete(use); - _igvn._worklist.push(use); + _igvn.rehash_node_delayed(use); for (uint j = 1; j < use->req(); j++) { if (use->in(j) == n) { use->set_req(j, n_clone); @@ -2055,9 +2030,7 @@ _igvn.remove_dead_node(phi); phi = hit; } - _igvn.hash_delete(use); - _igvn._worklist.push(use); - use->set_req(idx, phi); + _igvn.replace_input_of(use, idx, phi); } #ifdef ASSERT @@ -2630,9 +2603,7 @@ // use is in loop if (old_new[use->_idx] != NULL) { // null for dead code Node* use_clone = old_new[use->_idx]; - _igvn.hash_delete(use); - use->set_req(j, C->top()); - _igvn._worklist.push(use); + _igvn.replace_input_of(use, j, C->top()); insert_phi_for_loop( use_clone, j, old_new[def->_idx], def, new_head_clone ); } } else { @@ -2667,46 +2638,35 @@ if (!n->is_CFG() && n->in(0) != NULL && not_peel.test(n->_idx) && peel.test(n->in(0)->_idx)) { Node* n_clone = old_new[n->_idx]; - _igvn.hash_delete(n_clone); - n_clone->set_req(0, new_head_clone); - _igvn._worklist.push(n_clone); + _igvn.replace_input_of(n_clone, 0, new_head_clone); } } // Backedge of the surviving new_head (the clone) is original last_peel - _igvn.hash_delete(new_head_clone); - new_head_clone->set_req(LoopNode::LoopBackControl, last_peel); - _igvn._worklist.push(new_head_clone); + _igvn.replace_input_of(new_head_clone, LoopNode::LoopBackControl, last_peel); // Cut first node in original not_peel set - _igvn.hash_delete(new_head); - new_head->set_req(LoopNode::EntryControl, C->top()); - new_head->set_req(LoopNode::LoopBackControl, C->top()); - _igvn._worklist.push(new_head); + _igvn.rehash_node_delayed(new_head); // Multiple edge updates: + new_head->set_req(LoopNode::EntryControl, C->top()); // use rehash_node_delayed / set_req instead of + new_head->set_req(LoopNode::LoopBackControl, C->top()); // multiple replace_input_of calls // Copy head_clone back-branch info to original head // and remove original head's loop entry and // clone head's back-branch - _igvn.hash_delete(head); - _igvn.hash_delete(head_clone); - head->set_req(LoopNode::EntryControl, head_clone->in(LoopNode::LoopBackControl)); + _igvn.rehash_node_delayed(head); // Multiple edge updates + head->set_req(LoopNode::EntryControl, head_clone->in(LoopNode::LoopBackControl)); head->set_req(LoopNode::LoopBackControl, C->top()); - head_clone->set_req(LoopNode::LoopBackControl, C->top()); - _igvn._worklist.push(head); - _igvn._worklist.push(head_clone); + _igvn.replace_input_of(head_clone, LoopNode::LoopBackControl, C->top()); // Similarly modify the phis for (DUIterator_Fast kmax, k = head->fast_outs(kmax); k < kmax; k++) { Node* use = head->fast_out(k); if (use->is_Phi() && use->outcnt() > 0) { Node* use_clone = old_new[use->_idx]; - _igvn.hash_delete(use); - _igvn.hash_delete(use_clone); - use->set_req(LoopNode::EntryControl, use_clone->in(LoopNode::LoopBackControl)); + _igvn.rehash_node_delayed(use); // Multiple edge updates + use->set_req(LoopNode::EntryControl, use_clone->in(LoopNode::LoopBackControl)); use->set_req(LoopNode::LoopBackControl, C->top()); - use_clone->set_req(LoopNode::LoopBackControl, C->top()); - _igvn._worklist.push(use); - _igvn._worklist.push(use_clone); + _igvn.replace_input_of(use_clone, LoopNode::LoopBackControl, C->top()); } } @@ -2792,8 +2752,7 @@ set_ctrl(neg_stride, C->root()); Node *post = new (C, 3) AddINode( opaq, neg_stride); register_new_node( post, u_ctrl ); - _igvn.hash_delete(use); - _igvn._worklist.push(use); + _igvn.rehash_node_delayed(use); for (uint j = 1; j < use->req(); j++) { if (use->in(j) == phi) use->set_req(j, post); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/machnode.cpp --- a/src/share/vm/opto/machnode.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/machnode.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -439,9 +439,9 @@ // Don't remateralize somebody with bound inputs - it stretches a // fixed register lifetime. uint idx = oper_input_base(); - if( req() > idx ) { + if (req() > idx) { const RegMask &rm = in_RegMask(idx); - if( rm.is_bound1() || rm.is_bound2() ) + if (rm.is_bound(ideal_reg())) return false; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/machnode.hpp --- a/src/share/vm/opto/machnode.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/machnode.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -319,6 +319,7 @@ class MachTypeNode : public MachNode { virtual uint size_of() const { return sizeof(*this); } // Size is bigger public: + MachTypeNode( ) {} const Type *_bottom_type; virtual const class Type *bottom_type() const { return _bottom_type; } @@ -370,12 +371,12 @@ //------------------------------MachConstantNode------------------------------- // Machine node that holds a constant which is stored in the constant table. -class MachConstantNode : public MachNode { +class MachConstantNode : public MachTypeNode { protected: Compile::Constant _constant; // This node's constant. public: - MachConstantNode() : MachNode() { + MachConstantNode() : MachTypeNode() { init_class_id(Class_MachConstant); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/macro.cpp --- a/src/share/vm/opto/macro.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/macro.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -409,7 +409,7 @@ Node *alloc_mem = alloc->in(TypeFunc::Memory); uint length = mem->req(); - GrowableArray values(length, length, NULL); + GrowableArray values(length, length, NULL, false); // create a new Phi for the value PhiNode *phi = new (C, length) PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset); @@ -1447,9 +1447,8 @@ if (!always_slow && _memproj_fallthrough != NULL) { for (DUIterator_Fast imax, i = _memproj_fallthrough->fast_outs(imax); i < imax; i++) { Node *use = _memproj_fallthrough->fast_out(i); - _igvn.hash_delete(use); + _igvn.rehash_node_delayed(use); imax -= replace_input(use, _memproj_fallthrough, result_phi_rawmem); - _igvn._worklist.push(use); // back up iterator --i; } @@ -1463,9 +1462,8 @@ } for (DUIterator_Fast imax, i = _memproj_catchall->fast_outs(imax); i < imax; i++) { Node *use = _memproj_catchall->fast_out(i); - _igvn.hash_delete(use); + _igvn.rehash_node_delayed(use); imax -= replace_input(use, _memproj_catchall, _memproj_fallthrough); - _igvn._worklist.push(use); // back up iterator --i; } @@ -1481,9 +1479,8 @@ if (_ioproj_fallthrough != NULL) { for (DUIterator_Fast imax, i = _ioproj_fallthrough->fast_outs(imax); i < imax; i++) { Node *use = _ioproj_fallthrough->fast_out(i); - _igvn.hash_delete(use); + _igvn.rehash_node_delayed(use); imax -= replace_input(use, _ioproj_fallthrough, result_phi_i_o); - _igvn._worklist.push(use); // back up iterator --i; } @@ -1497,9 +1494,8 @@ } for (DUIterator_Fast imax, i = _ioproj_catchall->fast_outs(imax); i < imax; i++) { Node *use = _ioproj_catchall->fast_out(i); - _igvn.hash_delete(use); + _igvn.rehash_node_delayed(use); imax -= replace_input(use, _ioproj_catchall, _ioproj_fallthrough); - _igvn._worklist.push(use); // back up iterator --i; } @@ -1857,18 +1853,16 @@ if (alock->box_node() == oldbox && alock->obj_node()->eqv_uncast(obj)) { // Replace Box and mark eliminated all related locks and unlocks. alock->set_non_esc_obj(); - _igvn.hash_delete(alock); + _igvn.rehash_node_delayed(alock); alock->set_box_node(newbox); - _igvn._worklist.push(alock); next_edge = false; } } if (u->is_FastLock() && u->as_FastLock()->obj_node()->eqv_uncast(obj)) { FastLockNode* flock = u->as_FastLock(); assert(flock->box_node() == oldbox, "sanity"); - _igvn.hash_delete(flock); + _igvn.rehash_node_delayed(flock); flock->set_box_node(newbox); - _igvn._worklist.push(flock); next_edge = false; } @@ -1886,9 +1880,7 @@ Node* box_node = sfn->monitor_box(jvms, idx); if (box_node == oldbox && obj_node->eqv_uncast(obj)) { int j = jvms->monitor_box_offset(idx); - _igvn.hash_delete(u); - u->set_req(j, newbox); - _igvn._worklist.push(u); + _igvn.replace_input_of(u, j, newbox); next_edge = false; } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/matcher.cpp --- a/src/share/vm/opto/matcher.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/matcher.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,7 @@ #include "opto/rootnode.hpp" #include "opto/runtime.hpp" #include "opto/type.hpp" +#include "opto/vectornode.hpp" #include "runtime/atomic.hpp" #include "runtime/os.hpp" #ifdef TARGET_ARCH_MODEL_x86_32 @@ -58,18 +59,6 @@ OptoReg::Name OptoReg::c_frame_pointer; - - -const int Matcher::base2reg[Type::lastype] = { - Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN, - Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */ - Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */ - 0, 0/*abio*/, - Op_RegP /* Return address */, 0, /* the memories */ - Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD, - 0 /*bottom*/ -}; - const RegMask *Matcher::idealreg2regmask[_last_machine_leaf]; RegMask Matcher::mreg2regmask[_last_Mach_Reg]; RegMask Matcher::STACK_ONLY_mask; @@ -107,6 +96,10 @@ idealreg2spillmask [Op_RegF] = NULL; idealreg2spillmask [Op_RegD] = NULL; idealreg2spillmask [Op_RegP] = NULL; + idealreg2spillmask [Op_VecS] = NULL; + idealreg2spillmask [Op_VecD] = NULL; + idealreg2spillmask [Op_VecX] = NULL; + idealreg2spillmask [Op_VecY] = NULL; idealreg2debugmask [Op_RegI] = NULL; idealreg2debugmask [Op_RegN] = NULL; @@ -114,6 +107,10 @@ idealreg2debugmask [Op_RegF] = NULL; idealreg2debugmask [Op_RegD] = NULL; idealreg2debugmask [Op_RegP] = NULL; + idealreg2debugmask [Op_VecS] = NULL; + idealreg2debugmask [Op_VecD] = NULL; + idealreg2debugmask [Op_VecX] = NULL; + idealreg2debugmask [Op_VecY] = NULL; idealreg2mhdebugmask[Op_RegI] = NULL; idealreg2mhdebugmask[Op_RegN] = NULL; @@ -121,6 +118,10 @@ idealreg2mhdebugmask[Op_RegF] = NULL; idealreg2mhdebugmask[Op_RegD] = NULL; idealreg2mhdebugmask[Op_RegP] = NULL; + idealreg2mhdebugmask[Op_VecS] = NULL; + idealreg2mhdebugmask[Op_VecD] = NULL; + idealreg2mhdebugmask[Op_VecX] = NULL; + idealreg2mhdebugmask[Op_VecY] = NULL; debug_only(_mem_node = NULL;) // Ideal memory node consumed by mach node } @@ -134,7 +135,7 @@ warped = OptoReg::add(warped, C->out_preserve_stack_slots()); if( warped >= _in_arg_limit ) _in_arg_limit = OptoReg::add(warped, 1); // Bump max stack slot seen - if (!RegMask::can_represent(warped)) { + if (!RegMask::can_represent_arg(warped)) { // the compiler cannot represent this method's calling sequence C->record_method_not_compilable_all_tiers("unsupported incoming calling sequence"); return OptoReg::Bad; @@ -302,7 +303,7 @@ _out_arg_limit = OptoReg::add(_new_SP, C->out_preserve_stack_slots()); assert( is_even(_out_arg_limit), "out_preserve must be even" ); - if (!RegMask::can_represent(OptoReg::add(_out_arg_limit,-1))) { + if (!RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1))) { // the compiler cannot represent this method's calling sequence C->record_method_not_compilable("must be able to represent all call arguments in reg mask"); } @@ -428,7 +429,7 @@ void Matcher::init_first_stack_mask() { // Allocate storage for spill masks as masks for the appropriate load type. - RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * 3*6); + RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * (3*6+4)); idealreg2spillmask [Op_RegN] = &rms[0]; idealreg2spillmask [Op_RegI] = &rms[1]; @@ -451,6 +452,11 @@ idealreg2mhdebugmask[Op_RegD] = &rms[16]; idealreg2mhdebugmask[Op_RegP] = &rms[17]; + idealreg2spillmask [Op_VecS] = &rms[18]; + idealreg2spillmask [Op_VecD] = &rms[19]; + idealreg2spillmask [Op_VecX] = &rms[20]; + idealreg2spillmask [Op_VecY] = &rms[21]; + OptoReg::Name i; // At first, start with the empty mask @@ -462,7 +468,7 @@ C->FIRST_STACK_mask().Insert(i); // Add in all bits past the outgoing argument area - guarantee(RegMask::can_represent(OptoReg::add(_out_arg_limit,-1)), + guarantee(RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1)), "must be able to represent all call arguments in reg mask"); init = _out_arg_limit; for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1)) @@ -472,21 +478,48 @@ C->FIRST_STACK_mask().set_AllStack(); // Make spill masks. Registers for their class, plus FIRST_STACK_mask. + RegMask aligned_stack_mask = C->FIRST_STACK_mask(); + // Keep spill masks aligned. + aligned_stack_mask.clear_to_pairs(); + assert(aligned_stack_mask.is_AllStack(), "should be infinite stack"); + + *idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP]; #ifdef _LP64 *idealreg2spillmask[Op_RegN] = *idealreg2regmask[Op_RegN]; idealreg2spillmask[Op_RegN]->OR(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegP]->OR(aligned_stack_mask); +#else + idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask()); #endif *idealreg2spillmask[Op_RegI] = *idealreg2regmask[Op_RegI]; idealreg2spillmask[Op_RegI]->OR(C->FIRST_STACK_mask()); *idealreg2spillmask[Op_RegL] = *idealreg2regmask[Op_RegL]; - idealreg2spillmask[Op_RegL]->OR(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegL]->OR(aligned_stack_mask); *idealreg2spillmask[Op_RegF] = *idealreg2regmask[Op_RegF]; idealreg2spillmask[Op_RegF]->OR(C->FIRST_STACK_mask()); *idealreg2spillmask[Op_RegD] = *idealreg2regmask[Op_RegD]; - idealreg2spillmask[Op_RegD]->OR(C->FIRST_STACK_mask()); - *idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP]; - idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegD]->OR(aligned_stack_mask); + if (Matcher::vector_size_supported(T_BYTE,4)) { + *idealreg2spillmask[Op_VecS] = *idealreg2regmask[Op_VecS]; + idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask()); + } + if (Matcher::vector_size_supported(T_FLOAT,2)) { + *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD]; + idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask); + } + if (Matcher::vector_size_supported(T_FLOAT,4)) { + aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX); + assert(aligned_stack_mask.is_AllStack(), "should be infinite stack"); + *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX]; + idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask); + } + if (Matcher::vector_size_supported(T_FLOAT,8)) { + aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY); + assert(aligned_stack_mask.is_AllStack(), "should be infinite stack"); + *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY]; + idealreg2spillmask[Op_VecY]->OR(aligned_stack_mask); + } if (UseFPUForSpilling) { // This mask logic assumes that the spill operations are // symmetric and that the registers involved are the same size. @@ -807,6 +840,25 @@ idealreg2regmask[Op_RegF] = &spillF->out_RegMask(); idealreg2regmask[Op_RegD] = &spillD->out_RegMask(); idealreg2regmask[Op_RegP] = &spillP->out_RegMask(); + + // Vector regmasks. + if (Matcher::vector_size_supported(T_BYTE,4)) { + TypeVect::VECTS = TypeVect::make(T_BYTE, 4); + MachNode *spillVectS = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS)); + idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask(); + } + if (Matcher::vector_size_supported(T_FLOAT,2)) { + MachNode *spillVectD = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD)); + idealreg2regmask[Op_VecD] = &spillVectD->out_RegMask(); + } + if (Matcher::vector_size_supported(T_FLOAT,4)) { + MachNode *spillVectX = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX)); + idealreg2regmask[Op_VecX] = &spillVectX->out_RegMask(); + } + if (Matcher::vector_size_supported(T_FLOAT,8)) { + MachNode *spillVectY = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY)); + idealreg2regmask[Op_VecY] = &spillVectY->out_RegMask(); + } } #ifdef ASSERT @@ -1063,7 +1115,7 @@ // that is killed by the call. if( warped >= out_arg_limit_per_call ) out_arg_limit_per_call = OptoReg::add(warped,1); - if (!RegMask::can_represent(warped)) { + if (!RegMask::can_represent_arg(warped)) { C->record_method_not_compilable_all_tiers("unsupported calling sequence"); return OptoReg::Bad; } @@ -1251,7 +1303,7 @@ // this killed area. uint r_cnt = mcall->tf()->range()->cnt(); MachProjNode *proj = new (C, 1) MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj ); - if (!RegMask::can_represent(OptoReg::Name(out_arg_limit_per_call-1))) { + if (!RegMask::can_represent_arg(OptoReg::Name(out_arg_limit_per_call-1))) { C->record_method_not_compilable_all_tiers("unsupported outgoing calling sequence"); } else { for (int i = begin_out_arg_area; i < out_arg_limit_per_call; i++) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/matcher.hpp --- a/src/share/vm/opto/matcher.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/matcher.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -250,10 +250,21 @@ static const bool convL2FSupported(void); // Vector width in bytes - static const uint vector_width_in_bytes(void); + static const int vector_width_in_bytes(BasicType bt); + + // Limits on vector size (number of elements). + static const int max_vector_size(const BasicType bt); + static const int min_vector_size(const BasicType bt); + static const bool vector_size_supported(const BasicType bt, int size) { + return (Matcher::max_vector_size(bt) >= size && + Matcher::min_vector_size(bt) <= size); + } // Vector ideal reg - static const uint vector_ideal_reg(void); + static const int vector_ideal_reg(int len); + + // CPU supports misaligned vectors store/load. + static const bool misaligned_vectors_ok(); // Used to determine a "low complexity" 64-bit constant. (Zero is simple.) // The standard of comparison is one (StoreL ConL) vs. two (StoreI ConI). diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/memnode.cpp --- a/src/share/vm/opto/memnode.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/memnode.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -717,6 +717,22 @@ adr = adr->in(1); continue; + case Op_EncodeP: + // EncodeP node's control edge could be set by this method + // when EncodeP node depends on CastPP node. + // + // Use its control edge for memory op because EncodeP may go away + // later when it is folded with following or preceding DecodeN node. + if (adr->in(0) == NULL) { + // Keep looking for cast nodes. + adr = adr->in(1); + continue; + } + ccp->hash_delete(n); + n->set_req(MemNode::Control, adr->in(0)); + ccp->hash_insert(n); + return n; + case Op_CastPP: // If the CastPP is useless, just peek on through it. if( ccp->type(adr) == ccp->type(adr->in(1)) ) { @@ -1527,6 +1543,7 @@ // had an original form like p1:(AddP x x (LShiftL quux 3)), where the // expression (LShiftL quux 3) independently optimized to the constant 8. if ((t->isa_int() == NULL) && (t->isa_long() == NULL) + && (_type->isa_vect() == NULL) && Opcode() != Op_LoadKlass && Opcode() != Op_LoadNKlass) { // t might actually be lower than _type, if _type is a unique // concrete subclass of abstract class t. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/memnode.hpp --- a/src/share/vm/opto/memnode.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/memnode.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -636,17 +636,6 @@ virtual bool depends_only_on_test() const { return true; } }; -//------------------------------LoadLLockedNode--------------------------------- -// Load-locked a pointer from memory (either object or array). -// On Sparc & Intel this is implemented as a normal long load. -class LoadLLockedNode : public LoadLNode { -public: - LoadLLockedNode( Node *c, Node *mem, Node *adr ) - : LoadLNode(c,mem,adr,TypeRawPtr::BOTTOM, TypeLong::LONG) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_StoreLConditional; } -}; - //------------------------------SCMemProjNode--------------------------------------- // This class defines a projection of the memory state of a store conditional node. // These nodes return a value, but also update memory. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/mulnode.hpp --- a/src/share/vm/opto/mulnode.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/mulnode.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,9 @@ class MulNode : public Node { virtual uint hash() const; public: - MulNode( Node *in1, Node *in2 ): Node(0,in1,in2) {} + MulNode( Node *in1, Node *in2 ): Node(0,in1,in2) { + init_class_id(Class_Mul); + } // Handle algebraic identities here. If we have an identity, return the Node // we are equivalent to. We look for "add of zero" as an identity. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/node.cpp --- a/src/share/vm/opto/node.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/node.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1576,6 +1576,9 @@ } else { tty->print("no type"); } + } else if (t->isa_vect() && this->is_MachSpillCopy()) { + // Dump MachSpillcopy vector type. + t->dump(); } if (is_new) { debug_only(dump_orig(debug_orig())); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/node.hpp --- a/src/share/vm/opto/node.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/node.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -100,6 +100,7 @@ class MemBarStoreStoreNode; class MemNode; class MergeMemNode; +class MulNode; class MultiNode; class MultiBranchNode; class NeverBranchNode; @@ -133,8 +134,8 @@ class TypeNode; class UnlockNode; class VectorNode; -class VectorLoadNode; -class VectorStoreNode; +class LoadVectorNode; +class StoreVectorNode; class VectorSet; typedef void (*NFunc)(Node&,void*); extern "C" { @@ -609,9 +610,9 @@ DEFINE_CLASS_ID(Mem, Node, 4) DEFINE_CLASS_ID(Load, Mem, 0) - DEFINE_CLASS_ID(VectorLoad, Load, 0) + DEFINE_CLASS_ID(LoadVector, Load, 0) DEFINE_CLASS_ID(Store, Mem, 1) - DEFINE_CLASS_ID(VectorStore, Store, 0) + DEFINE_CLASS_ID(StoreVector, Store, 0) DEFINE_CLASS_ID(LoadStore, Mem, 2) DEFINE_CLASS_ID(Region, Node, 5) @@ -629,8 +630,9 @@ DEFINE_CLASS_ID(AddP, Node, 9) DEFINE_CLASS_ID(BoxLock, Node, 10) DEFINE_CLASS_ID(Add, Node, 11) - DEFINE_CLASS_ID(Vector, Node, 12) - DEFINE_CLASS_ID(ClearArray, Node, 13) + DEFINE_CLASS_ID(Mul, Node, 12) + DEFINE_CLASS_ID(Vector, Node, 13) + DEFINE_CLASS_ID(ClearArray, Node, 14) _max_classes = ClassMask_ClearArray }; @@ -752,6 +754,7 @@ DEFINE_CLASS_QUERY(MemBar) DEFINE_CLASS_QUERY(MemBarStoreStore) DEFINE_CLASS_QUERY(MergeMem) + DEFINE_CLASS_QUERY(Mul) DEFINE_CLASS_QUERY(Multi) DEFINE_CLASS_QUERY(MultiBranch) DEFINE_CLASS_QUERY(Parm) @@ -767,8 +770,8 @@ DEFINE_CLASS_QUERY(Sub) DEFINE_CLASS_QUERY(Type) DEFINE_CLASS_QUERY(Vector) - DEFINE_CLASS_QUERY(VectorLoad) - DEFINE_CLASS_QUERY(VectorStore) + DEFINE_CLASS_QUERY(LoadVector) + DEFINE_CLASS_QUERY(StoreVector) DEFINE_CLASS_QUERY(Unlock) #undef DEFINE_CLASS_QUERY diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/opcodes.cpp --- a/src/share/vm/opto/opcodes.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/opcodes.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,10 @@ "RegD", "RegL", "RegFlags", + "VecS", + "VecD", + "VecX", + "VecY", "_last_machine_leaf", #include "classes.hpp" "_last_class_name", diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/opcodes.hpp --- a/src/share/vm/opto/opcodes.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/opcodes.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,10 @@ macro(RegF) // Machine float register macro(RegD) // Machine double register macro(RegL) // Machine long register + macro(VecS) // Machine vectors register + macro(VecD) // Machine vectord register + macro(VecX) // Machine vectorx register + macro(VecY) // Machine vectory register macro(RegFlags) // Machine flags register _last_machine_leaf, // Split between regular opcodes and machine #include "classes.hpp" diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/parse.hpp --- a/src/share/vm/opto/parse.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/parse.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -527,6 +527,9 @@ int repush_if_args(); void adjust_map_after_if(BoolTest::mask btest, Node* c, float prob, Block* path, Block* other_path); + void sharpen_type_after_if(BoolTest::mask btest, + Node* con, const Type* tcon, + Node* val, const Type* tval); IfNode* jump_if_fork_int(Node* a, Node* b, BoolTest::mask mask); Node* jump_if_join(Node* iffalse, Node* iftrue); void jump_if_true_fork(IfNode *ifNode, int dest_bci_if_true, int prof_table_index); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/parse2.cpp --- a/src/share/vm/opto/parse2.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/parse2.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1233,6 +1233,71 @@ if (!have_con) // remaining adjustments need a con return; + sharpen_type_after_if(btest, con, tcon, val, tval); +} + + +static Node* extract_obj_from_klass_load(PhaseGVN* gvn, Node* n) { + Node* ldk; + if (n->is_DecodeN()) { + if (n->in(1)->Opcode() != Op_LoadNKlass) { + return NULL; + } else { + ldk = n->in(1); + } + } else if (n->Opcode() != Op_LoadKlass) { + return NULL; + } else { + ldk = n; + } + assert(ldk != NULL && ldk->is_Load(), "should have found a LoadKlass or LoadNKlass node"); + + Node* adr = ldk->in(MemNode::Address); + intptr_t off = 0; + Node* obj = AddPNode::Ideal_base_and_offset(adr, gvn, off); + if (obj == NULL || off != oopDesc::klass_offset_in_bytes()) // loading oopDesc::_klass? + return NULL; + const TypePtr* tp = gvn->type(obj)->is_ptr(); + if (tp == NULL || !(tp->isa_instptr() || tp->isa_aryptr())) // is obj a Java object ptr? + return NULL; + + return obj; +} + +void Parse::sharpen_type_after_if(BoolTest::mask btest, + Node* con, const Type* tcon, + Node* val, const Type* tval) { + // Look for opportunities to sharpen the type of a node + // whose klass is compared with a constant klass. + if (btest == BoolTest::eq && tcon->isa_klassptr()) { + Node* obj = extract_obj_from_klass_load(&_gvn, val); + const TypeOopPtr* con_type = tcon->isa_klassptr()->as_instance_type(); + if (obj != NULL && (con_type->isa_instptr() || con_type->isa_aryptr())) { + // Found: + // Bool(CmpP(LoadKlass(obj._klass), ConP(Foo.klass)), [eq]) + // or the narrowOop equivalent. + const Type* obj_type = _gvn.type(obj); + const TypeOopPtr* tboth = obj_type->join(con_type)->isa_oopptr(); + if (tboth != NULL && tboth->klass_is_exact() && tboth != obj_type && + tboth->higher_equal(obj_type)) { + // obj has to be of the exact type Foo if the CmpP succeeds. + int obj_in_map = map()->find_edge(obj); + JVMState* jvms = this->jvms(); + if (obj_in_map >= 0 && + (jvms->is_loc(obj_in_map) || jvms->is_stk(obj_in_map))) { + TypeNode* ccast = new (C, 2) CheckCastPPNode(control(), obj, tboth); + const Type* tcc = ccast->as_Type()->type(); + assert(tcc != obj_type && tcc->higher_equal(obj_type), "must improve"); + // Delay transform() call to allow recovery of pre-cast value + // at the control merge. + _gvn.set_type_bottom(ccast); + record_for_igvn(ccast); + // Here's the payoff. + replace_in_map(obj, ccast); + } + } + } + } int val_in_map = map()->find_edge(val); if (val_in_map < 0) return; // replace_in_map would be useless @@ -1265,6 +1330,7 @@ // Exclude tests vs float/double 0 as these could be // either +0 or -0. Just because you are equal to +0 // doesn't mean you ARE +0! + // Note, following code also replaces Long and Oop values. if ((!tf || tf->_f != 0.0) && (!td || td->_d != 0.0)) cast = con; // Replace non-constant val by con. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/phaseX.cpp --- a/src/share/vm/opto/phaseX.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/phaseX.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -757,6 +757,7 @@ //------------------------------PhaseIterGVN----------------------------------- // Initialize hash table to fresh and clean for +VerifyOpto PhaseIterGVN::PhaseIterGVN( PhaseIterGVN *igvn, const char *dummy ) : PhaseGVN(igvn,dummy), _worklist( ), + _stack(C->unique() >> 1), _delay_transform(false) { } @@ -764,6 +765,7 @@ // Initialize with previous PhaseIterGVN info; used by PhaseCCP PhaseIterGVN::PhaseIterGVN( PhaseIterGVN *igvn ) : PhaseGVN(igvn), _worklist( igvn->_worklist ), + _stack( igvn->_stack ), _delay_transform(igvn->_delay_transform) { } @@ -772,6 +774,7 @@ // Initialize with previous PhaseGVN info from Parser PhaseIterGVN::PhaseIterGVN( PhaseGVN *gvn ) : PhaseGVN(gvn), _worklist(*C->for_igvn()), + _stack(C->unique() >> 1), _delay_transform(false) { uint max; @@ -1138,51 +1141,77 @@ // Kill a globally dead Node. All uses are also globally dead and are // aggressively trimmed. void PhaseIterGVN::remove_globally_dead_node( Node *dead ) { - assert(dead != C->root(), "killing root, eh?"); - if (dead->is_top()) return; - NOT_PRODUCT( set_progress(); ) - // Remove from iterative worklist - _worklist.remove(dead); - if (!dead->is_Con()) { // Don't kill cons but uses - // Remove from hash table - _table.hash_delete( dead ); - // Smash all inputs to 'dead', isolating him completely - for( uint i = 0; i < dead->req(); i++ ) { - Node *in = dead->in(i); - if( in ) { // Points to something? - dead->set_req(i,NULL); // Kill the edge - if (in->outcnt() == 0 && in != C->top()) {// Made input go dead? - remove_dead_node(in); // Recursively remove - } else if (in->outcnt() == 1 && - in->has_special_unique_user()) { - _worklist.push(in->unique_out()); - } else if (in->outcnt() <= 2 && dead->is_Phi()) { - if( in->Opcode() == Op_Region ) - _worklist.push(in); - else if( in->is_Store() ) { - DUIterator_Fast imax, i = in->fast_outs(imax); - _worklist.push(in->fast_out(i)); - i++; - if(in->outcnt() == 2) { - _worklist.push(in->fast_out(i)); - i++; + enum DeleteProgress { + PROCESS_INPUTS, + PROCESS_OUTPUTS + }; + assert(_stack.is_empty(), "not empty"); + _stack.push(dead, PROCESS_INPUTS); + + while (_stack.is_nonempty()) { + dead = _stack.node(); + uint progress_state = _stack.index(); + assert(dead != C->root(), "killing root, eh?"); + assert(!dead->is_top(), "add check for top when pushing"); + NOT_PRODUCT( set_progress(); ) + if (progress_state == PROCESS_INPUTS) { + // After following inputs, continue to outputs + _stack.set_index(PROCESS_OUTPUTS); + // Remove from iterative worklist + _worklist.remove(dead); + if (!dead->is_Con()) { // Don't kill cons but uses + bool recurse = false; + // Remove from hash table + _table.hash_delete( dead ); + // Smash all inputs to 'dead', isolating him completely + for( uint i = 0; i < dead->req(); i++ ) { + Node *in = dead->in(i); + if( in ) { // Points to something? + dead->set_req(i,NULL); // Kill the edge + if (in->outcnt() == 0 && in != C->top()) {// Made input go dead? + _stack.push(in, PROCESS_INPUTS); // Recursively remove + recurse = true; + } else if (in->outcnt() == 1 && + in->has_special_unique_user()) { + _worklist.push(in->unique_out()); + } else if (in->outcnt() <= 2 && dead->is_Phi()) { + if( in->Opcode() == Op_Region ) + _worklist.push(in); + else if( in->is_Store() ) { + DUIterator_Fast imax, i = in->fast_outs(imax); + _worklist.push(in->fast_out(i)); + i++; + if(in->outcnt() == 2) { + _worklist.push(in->fast_out(i)); + i++; + } + assert(!(i < imax), "sanity"); + } } - assert(!(i < imax), "sanity"); } } + + if (dead->is_macro()) { + C->remove_macro_node(dead); + } + + if (recurse) { + continue; + } } } - if (dead->is_macro()) { - C->remove_macro_node(dead); + // Aggressively kill globally dead uses + // (Rather than pushing all the outs at once, we push one at a time, + // plus the parent to resume later, because of the indefinite number + // of edge deletions per loop trip.) + if (dead->outcnt() > 0) { + // Recursively remove + _stack.push(dead->raw_out(0), PROCESS_INPUTS); + } else { + _stack.pop(); } } - // Aggressively kill globally dead uses - // (Cannot use DUIterator_Last because of the indefinite number - // of edge deletions per loop trip.) - while (dead->outcnt() > 0) { - remove_globally_dead_node(dead->raw_out(0)); - } } //------------------------------subsume_node----------------------------------- diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/phaseX.hpp --- a/src/share/vm/opto/phaseX.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/phaseX.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -403,6 +403,8 @@ // Subsume users of node 'old' into node 'nn' void subsume_node( Node *old, Node *nn ); + Node_Stack _stack; // Stack used to avoid recursion + protected: // Idealize new Node 'n' with respect to its inputs and its value @@ -438,8 +440,8 @@ // It is significant only for debugging and profiling. Node* register_new_node_with_optimizer(Node* n, Node* orig = NULL); - // Kill a globally dead Node. It is allowed to have uses which are - // assumed dead and left 'in limbo'. + // Kill a globally dead Node. All uses are also globally dead and are + // aggressively trimmed. void remove_globally_dead_node( Node *dead ); // Kill all inputs to a dead node, recursively making more dead nodes. @@ -460,6 +462,25 @@ subsume_node(old, nn); } + // Delayed node rehash: remove a node from the hash table and rehash it during + // next optimizing pass + void rehash_node_delayed(Node* n) { + hash_delete(n); + _worklist.push(n); + } + + // Replace ith edge of "n" with "in" + void replace_input_of(Node* n, int i, Node* in) { + rehash_node_delayed(n); + n->set_req(i, in); + } + + // Delete ith edge of "n" + void delete_input_of(Node* n, int i) { + rehash_node_delayed(n); + n->del_req(i); + } + bool delay_transform() const { return _delay_transform; } void set_delay_transform(bool delay) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/postaloc.cpp --- a/src/share/vm/opto/postaloc.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/postaloc.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,13 +27,15 @@ #include "opto/chaitin.hpp" #include "opto/machnode.hpp" -// see if this register kind does not requires two registers -static bool is_single_register(uint x) { -#ifdef _LP64 - return (x != Op_RegD && x != Op_RegL && x != Op_RegP); -#else - return (x != Op_RegD && x != Op_RegL); -#endif +// See if this register (or pairs, or vector) already contains the value. +static bool register_contains_value(Node* val, OptoReg::Name reg, int n_regs, + Node_List& value) { + for (int i = 0; i < n_regs; i++) { + OptoReg::Name nreg = OptoReg::add(reg,-i); + if (value[nreg] != val) + return false; + } + return true; } //---------------------------may_be_copy_of_callee----------------------------- @@ -167,9 +169,11 @@ const RegMask &use_mask = n->in_RegMask(idx); bool can_use = ( RegMask::can_represent(def_reg) ? (use_mask.Member(def_reg) != 0) : (use_mask.is_AllStack() != 0)); - // Check for a copy to or from a misaligned pair. - can_use = can_use && !use_mask.is_misaligned_Pair() && !def_lrg.mask().is_misaligned_Pair(); - + if (!RegMask::is_vector(def->ideal_reg())) { + // Check for a copy to or from a misaligned pair. + // It is workaround for a sparc with misaligned pairs. + can_use = can_use && !use_mask.is_misaligned_pair() && !def_lrg.mask().is_misaligned_pair(); + } if (!can_use) return 0; @@ -263,18 +267,16 @@ val = skip_copies(n->in(k)); } - if( val == x ) return blk_adjust; // No progress? + if (val == x) return blk_adjust; // No progress? - bool single = is_single_register(val->ideal_reg()); + int n_regs = RegMask::num_registers(val->ideal_reg()); uint val_idx = n2lidx(val); OptoReg::Name val_reg = lrgs(val_idx).reg(); // See if it happens to already be in the correct register! // (either Phi's direct register, or the common case of the name // never-clobbered original-def register) - if( value[val_reg] == val && - // Doubles check both halves - ( single || value[val_reg-1] == val ) ) { + if (register_contains_value(val, val_reg, n_regs, value)) { blk_adjust += use_prior_register(n,k,regnd[val_reg],current_block,value,regnd); if( n->in(k) == regnd[val_reg] ) // Success! Quit trying return blk_adjust; @@ -306,9 +308,10 @@ } Node *vv = value[reg]; - if( !single ) { // Doubles check for aligned-adjacent pair - if( (reg&1)==0 ) continue; // Wrong half of a pair - if( vv != value[reg-1] ) continue; // Not a complete pair + if (n_regs > 1) { // Doubles and vectors check for aligned-adjacent set + uint last = (n_regs-1); // Looking for the last part of a set + if ((reg&last) != last) continue; // Wrong part of a set + if (!register_contains_value(vv, reg, n_regs, value)) continue; // Different value } if( vv == val || // Got a direct hit? (t && vv && vv->bottom_type() == t && vv->is_Mach() && @@ -526,8 +529,9 @@ if( pidx ) { value.map(preg,phi); regnd.map(preg,phi); - OptoReg::Name preg_lo = OptoReg::add(preg,-1); - if( !is_single_register(phi->ideal_reg()) ) { + int n_regs = RegMask::num_registers(phi->ideal_reg()); + for (int l = 1; l < n_regs; l++) { + OptoReg::Name preg_lo = OptoReg::add(preg,-l); value.map(preg_lo,phi); regnd.map(preg_lo,phi); } @@ -568,13 +572,16 @@ value.map(ureg,valdef); // record improved reaching-def info regnd.map(ureg, def); // Record other half of doubles - OptoReg::Name ureg_lo = OptoReg::add(ureg,-1); - if( !is_single_register(def->ideal_reg()) && - ( !RegMask::can_represent(ureg_lo) || - lrgs(useidx).mask().Member(ureg_lo) ) && // Nearly always adjacent - !value[ureg_lo] ) { - value.map(ureg_lo,valdef); // record improved reaching-def info - regnd.map(ureg_lo, def); + uint def_ideal_reg = def->ideal_reg(); + int n_regs = RegMask::num_registers(def_ideal_reg); + for (int l = 1; l < n_regs; l++) { + OptoReg::Name ureg_lo = OptoReg::add(ureg,-l); + if (!value[ureg_lo] && + (!RegMask::can_represent(ureg_lo) || + lrgs(useidx).mask().Member(ureg_lo))) { // Nearly always adjacent + value.map(ureg_lo,valdef); // record improved reaching-def info + regnd.map(ureg_lo, def); + } } } } @@ -607,7 +614,8 @@ } uint n_ideal_reg = n->ideal_reg(); - if( is_single_register(n_ideal_reg) ) { + int n_regs = RegMask::num_registers(n_ideal_reg); + if (n_regs == 1) { // If Node 'n' does not change the value mapped by the register, // then 'n' is a useless copy. Do not update the register->node // mapping so 'n' will go dead. @@ -625,6 +633,25 @@ assert( n->is_Copy(), "" ); j -= replace_and_yank_if_dead(n, nreg, b, value, regnd); } + } else if (RegMask::is_vector(n_ideal_reg)) { + // If Node 'n' does not change the value mapped by the register, + // then 'n' is a useless copy. Do not update the register->node + // mapping so 'n' will go dead. + if (!register_contains_value(val, nreg, n_regs, value)) { + // Update the mapping: record new Node defined by the register + regnd.map(nreg,n); + // Update mapping for defined *value*, which is the defined + // Node after skipping all copies. + value.map(nreg,val); + for (int l = 1; l < n_regs; l++) { + OptoReg::Name nreg_lo = OptoReg::add(nreg,-l); + regnd.map(nreg_lo, n ); + value.map(nreg_lo,val); + } + } else if (n->is_Copy()) { + // Note: vector can't be constant and can't be copy of calee. + j -= replace_and_yank_if_dead(n, nreg, b, value, regnd); + } } else { // If the value occupies a register pair, record same info // in both registers. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/reg_split.cpp --- a/src/share/vm/opto/reg_split.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/reg_split.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,12 +74,13 @@ const RegMask *w_i_mask = w_mask->overlap( *i_mask ) ? w_mask : i_mask; const RegMask *w_o_mask; + int num_regs = RegMask::num_registers(ireg); + bool is_vect = RegMask::is_vector(ireg); if( w_mask->overlap( *o_mask ) && // Overlap AND - ((ireg != Op_RegL && ireg != Op_RegD // Single use or aligned -#ifdef _LP64 - && ireg != Op_RegP -#endif - ) || o_mask->is_aligned_Pairs()) ) { + ((num_regs == 1) // Single use or aligned + || is_vect // or vector + || !is_vect && o_mask->is_aligned_pairs()) ) { + assert(!is_vect || o_mask->is_aligned_sets(num_regs), "vectors are aligned"); // Don't come here for mis-aligned doubles w_o_mask = w_mask; } else { // wide ideal mask does not overlap with o_mask @@ -400,15 +401,17 @@ // CNC - Turned off 7/8/99, causes too much spilling // if( lrg->_is_bound ) return false; + // Use float pressure numbers for vectors. + bool is_float_or_vector = lrg->_is_float || lrg->_is_vector; // Not yet reached the high-pressure cutoff point, so low pressure - uint hrp_idx = lrg->_is_float ? b->_fhrp_index : b->_ihrp_index; + uint hrp_idx = is_float_or_vector ? b->_fhrp_index : b->_ihrp_index; if( insidx < hrp_idx ) return false; // Register pressure for the block as a whole depends on reg class - int block_pres = lrg->_is_float ? b->_freg_pressure : b->_reg_pressure; + int block_pres = is_float_or_vector ? b->_freg_pressure : b->_reg_pressure; // Bound live ranges will split at the binding points first; // Intermediate splits should assume the live range's register set // got "freed up" and that num_regs will become INT_PRESSURE. - int bound_pres = lrg->_is_float ? FLOATPRESSURE : INTPRESSURE; + int bound_pres = is_float_or_vector ? FLOATPRESSURE : INTPRESSURE; // Effective register pressure limit. int lrg_pres = (lrg->get_invalid_mask_size() > lrg->num_regs()) ? (lrg->get_invalid_mask_size() >> (lrg->num_regs()-1)) : bound_pres; @@ -794,12 +797,15 @@ if( i < n->req() ) break; insert_point--; } + uint orig_eidx = b->end_idx(); maxlrg = split_DEF( n1, b, insert_point, maxlrg, Reachblock, debug_defs, splits, slidx); // If it wasn't split bail if (!maxlrg) { return 0; } - insidx++; + // Spill of NULL check mem op goes into the following block. + if (b->end_idx() > orig_eidx) + insidx++; } // This is a new DEF, so update UP UPblock[slidx] = false; @@ -960,7 +966,7 @@ // Grab register mask info const RegMask &dmask = def->out_RegMask(); const RegMask &umask = n->in_RegMask(inpidx); - + bool is_vect = RegMask::is_vector(def->ideal_reg()); assert(inpidx < oopoff, "cannot use-split oop map info"); bool dup = UPblock[slidx]; @@ -972,7 +978,7 @@ if( !umask.is_AllStack() && (int)umask.Size() <= lrgs(useidx).num_regs() && (!def->rematerialize() || - umask.is_misaligned_Pair())) { + !is_vect && umask.is_misaligned_pair())) { // These need a Split regardless of overlap or pressure // SPLIT - NO DEF - NO CISC SPILL maxlrg = split_USE(def,b,n,inpidx,maxlrg,dup,false, splits,slidx); @@ -1123,10 +1129,12 @@ // Grab UP info for DEF const RegMask &dmask = n->out_RegMask(); bool defup = dmask.is_UP(); + int ireg = n->ideal_reg(); + bool is_vect = RegMask::is_vector(ireg); // Only split at Def if this is a HRP block or bound (and spilled once) if( !n->rematerialize() && - (((dmask.is_bound1() || dmask.is_bound2() || dmask.is_misaligned_Pair()) && - (deflrg._direct_conflict || deflrg._must_spill)) || + (((dmask.is_bound(ireg) || !is_vect && dmask.is_misaligned_pair()) && + (deflrg._direct_conflict || deflrg._must_spill)) || // Check for LRG being up in a register and we are inside a high // pressure area. Spill it down immediately. (defup && is_high_pressure(b,&deflrg,insidx))) ) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/regmask.cpp --- a/src/share/vm/opto/regmask.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/regmask.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -129,11 +129,34 @@ 0 ); +//============================================================================= +bool RegMask::is_vector(uint ireg) { + return (ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY); +} + +int RegMask::num_registers(uint ireg) { + switch(ireg) { + case Op_VecY: + return 8; + case Op_VecX: + return 4; + case Op_VecD: + case Op_RegD: + case Op_RegL: +#ifdef _LP64 + case Op_RegP: +#endif + return 2; + } + // Op_VecS and the rest ideal registers. + return 1; +} + //------------------------------find_first_pair-------------------------------- // Find the lowest-numbered register pair in the mask. Return the // HIGHEST register number in the pair, or BAD if no pairs. OptoReg::Name RegMask::find_first_pair() const { - VerifyPairs(); + verify_pairs(); for( int i = 0; i < RM_SIZE; i++ ) { if( _A[i] ) { // Found some bits int bit = _A[i] & -_A[i]; // Extract low bit @@ -146,30 +169,30 @@ //------------------------------ClearToPairs----------------------------------- // Clear out partial bits; leave only bit pairs -void RegMask::ClearToPairs() { +void RegMask::clear_to_pairs() { for( int i = 0; i < RM_SIZE; i++ ) { int bits = _A[i]; bits &= ((bits & 0x55555555)<<1); // 1 hi-bit set for each pair bits |= (bits>>1); // Smear 1 hi-bit into a pair _A[i] = bits; } - VerifyPairs(); + verify_pairs(); } //------------------------------SmearToPairs----------------------------------- // Smear out partial bits; leave only bit pairs -void RegMask::SmearToPairs() { +void RegMask::smear_to_pairs() { for( int i = 0; i < RM_SIZE; i++ ) { int bits = _A[i]; bits |= ((bits & 0x55555555)<<1); // Smear lo bit hi per pair bits |= ((bits & 0xAAAAAAAA)>>1); // Smear hi bit lo per pair _A[i] = bits; } - VerifyPairs(); + verify_pairs(); } //------------------------------is_aligned_pairs------------------------------- -bool RegMask::is_aligned_Pairs() const { +bool RegMask::is_aligned_pairs() const { // Assert that the register mask contains only bit pairs. for( int i = 0; i < RM_SIZE; i++ ) { int bits = _A[i]; @@ -204,7 +227,7 @@ //------------------------------is_bound2-------------------------------------- // Return TRUE if the mask contains an adjacent pair of bits and no other bits. -int RegMask::is_bound2() const { +int RegMask::is_bound_pair() const { if( is_AllStack() ) return false; int bit = -1; // Set to hold the one bit allowed @@ -226,6 +249,132 @@ return true; } +static int low_bits[3] = { 0x55555555, 0x11111111, 0x01010101 }; +//------------------------------find_first_set--------------------------------- +// Find the lowest-numbered register set in the mask. Return the +// HIGHEST register number in the set, or BAD if no sets. +// Works also for size 1. +OptoReg::Name RegMask::find_first_set(int size) const { + verify_sets(size); + for (int i = 0; i < RM_SIZE; i++) { + if (_A[i]) { // Found some bits + int bit = _A[i] & -_A[i]; // Extract low bit + // Convert to bit number, return hi bit in pair + return OptoReg::Name((i<<_LogWordBits)+find_lowest_bit(bit)+(size-1)); + } + } + return OptoReg::Bad; +} + +//------------------------------clear_to_sets---------------------------------- +// Clear out partial bits; leave only aligned adjacent bit pairs +void RegMask::clear_to_sets(int size) { + if (size == 1) return; + assert(2 <= size && size <= 8, "update low bits table"); + assert(is_power_of_2(size), "sanity"); + int low_bits_mask = low_bits[size>>2]; + for (int i = 0; i < RM_SIZE; i++) { + int bits = _A[i]; + int sets = (bits & low_bits_mask); + for (int j = 1; j < size; j++) { + sets = (bits & (sets<<1)); // filter bits which produce whole sets + } + sets |= (sets>>1); // Smear 1 hi-bit into a set + if (size > 2) { + sets |= (sets>>2); // Smear 2 hi-bits into a set + if (size > 4) { + sets |= (sets>>4); // Smear 4 hi-bits into a set + } + } + _A[i] = sets; + } + verify_sets(size); +} + +//------------------------------smear_to_sets---------------------------------- +// Smear out partial bits to aligned adjacent bit sets +void RegMask::smear_to_sets(int size) { + if (size == 1) return; + assert(2 <= size && size <= 8, "update low bits table"); + assert(is_power_of_2(size), "sanity"); + int low_bits_mask = low_bits[size>>2]; + for (int i = 0; i < RM_SIZE; i++) { + int bits = _A[i]; + int sets = 0; + for (int j = 0; j < size; j++) { + sets |= (bits & low_bits_mask); // collect partial bits + bits = bits>>1; + } + sets |= (sets<<1); // Smear 1 lo-bit into a set + if (size > 2) { + sets |= (sets<<2); // Smear 2 lo-bits into a set + if (size > 4) { + sets |= (sets<<4); // Smear 4 lo-bits into a set + } + } + _A[i] = sets; + } + verify_sets(size); +} + +//------------------------------is_aligned_set-------------------------------- +bool RegMask::is_aligned_sets(int size) const { + if (size == 1) return true; + assert(2 <= size && size <= 8, "update low bits table"); + assert(is_power_of_2(size), "sanity"); + int low_bits_mask = low_bits[size>>2]; + // Assert that the register mask contains only bit sets. + for (int i = 0; i < RM_SIZE; i++) { + int bits = _A[i]; + while (bits) { // Check bits for pairing + int bit = bits & -bits; // Extract low bit + // Low bit is not odd means its mis-aligned. + if ((bit & low_bits_mask) == 0) return false; + // Do extra work since (bit << size) may overflow. + int hi_bit = bit << (size-1); // high bit + int set = hi_bit + ((hi_bit-1) & ~(bit-1)); + // Check for aligned adjacent bits in this set + if ((bits & set) != set) return false; + bits -= set; // Remove this set + } + } + return true; +} + +//------------------------------is_bound_set----------------------------------- +// Return TRUE if the mask contains one adjacent set of bits and no other bits. +// Works also for size 1. +int RegMask::is_bound_set(int size) const { + if( is_AllStack() ) return false; + assert(1 <= size && size <= 8, "update low bits table"); + int bit = -1; // Set to hold the one bit allowed + for (int i = 0; i < RM_SIZE; i++) { + if (_A[i] ) { // Found some bits + if (bit != -1) + return false; // Already had bits, so fail + bit = _A[i] & -_A[i]; // Extract 1 bit from mask + int hi_bit = bit << (size-1); // high bit + if (hi_bit != 0) { // Bit set stays in same word? + int set = hi_bit + ((hi_bit-1) & ~(bit-1)); + if (set != _A[i]) + return false; // Require adjacent bit set and no more bits + } else { // Else its a split-set case + if (((-1) & ~(bit-1)) != _A[i]) + return false; // Found many bits, so fail + i++; // Skip iteration forward and check high part + assert(size <= 8, "update next code"); + // The lower 24 bits should be 0 since it is split case and size <= 8. + int set = bit>>24; + set = set & -set; // Remove sign extension. + set = (((set << size) - 1) >> 8); + if (_A[i] != set) return false; // Require 1 lo bit in next word + } + } + } + // True for both the empty mask and for a bit set + return true; +} + //------------------------------is_UP------------------------------------------ // UP means register only, Register plus stack, or stack only is DOWN bool RegMask::is_UP() const { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/regmask.hpp --- a/src/share/vm/opto/regmask.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/regmask.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -113,7 +113,11 @@ // the controlling alignment constraint. Note that this alignment // requirement is internal to the allocator, and independent of any // particular platform. - enum { SlotsPerLong = 2 }; + enum { SlotsPerLong = 2, + SlotsPerVecS = 1, + SlotsPerVecD = 2, + SlotsPerVecX = 4, + SlotsPerVecY = 8 }; // A constructor only used by the ADLC output. All mask fields are filled // in directly. Calls to this look something like RM(1,2,3,4); @@ -193,20 +197,53 @@ OptoReg::Name find_first_pair() const; // Clear out partial bits; leave only aligned adjacent bit pairs. - void ClearToPairs(); + void clear_to_pairs(); // Smear out partial bits; leave only aligned adjacent bit pairs. - void SmearToPairs(); + void smear_to_pairs(); // Verify that the mask contains only aligned adjacent bit pairs - void VerifyPairs() const { assert( is_aligned_Pairs(), "mask is not aligned, adjacent pairs" ); } + void verify_pairs() const { assert( is_aligned_pairs(), "mask is not aligned, adjacent pairs" ); } // Test that the mask contains only aligned adjacent bit pairs - bool is_aligned_Pairs() const; + bool is_aligned_pairs() const; // mask is a pair of misaligned registers - bool is_misaligned_Pair() const { return Size()==2 && !is_aligned_Pairs();} + bool is_misaligned_pair() const { return Size()==2 && !is_aligned_pairs(); } // Test for single register int is_bound1() const; // Test for a single adjacent pair - int is_bound2() const; + int is_bound_pair() const; + // Test for a single adjacent set of ideal register's size. + int is_bound(uint ireg) const { + if (is_vector(ireg)) { + if (is_bound_set(num_registers(ireg))) + return true; + } else if (is_bound1() || is_bound_pair()) { + return true; + } + return false; + } + + // Find the lowest-numbered register set in the mask. Return the + // HIGHEST register number in the set, or BAD if no sets. + // Assert that the mask contains only bit sets. + OptoReg::Name find_first_set(int size) const; + + // Clear out partial bits; leave only aligned adjacent bit sets of size. + void clear_to_sets(int size); + // Smear out partial bits to aligned adjacent bit sets. + void smear_to_sets(int size); + // Verify that the mask contains only aligned adjacent bit sets + void verify_sets(int size) const { assert(is_aligned_sets(size), "mask is not aligned, adjacent sets"); } + // Test that the mask contains only aligned adjacent bit sets + bool is_aligned_sets(int size) const; + + // mask is a set of misaligned registers + bool is_misaligned_set(int size) const { return (int)Size()==size && !is_aligned_sets(size);} + + // Test for a single adjacent set + int is_bound_set(int size) const; + + static bool is_vector(uint ireg); + static int num_registers(uint ireg); // Fast overlap test. Non-zero if any registers in common. int overlap( const RegMask &rm ) const { @@ -280,9 +317,15 @@ static bool can_represent(OptoReg::Name reg) { // NOTE: -1 in computation reflects the usage of the last - // bit of the regmask as an infinite stack flag. + // bit of the regmask as an infinite stack flag and + // -7 is to keep mask aligned for largest value (VecY). return (int)reg < (int)(CHUNK_SIZE-1); } + static bool can_represent_arg(OptoReg::Name reg) { + // NOTE: -SlotsPerVecY in computation reflects the need + // to keep mask aligned for largest value (VecY). + return (int)reg < (int)(CHUNK_SIZE-SlotsPerVecY); + } }; // Do not use this constant directly in client code! diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/runtime.hpp --- a/src/share/vm/opto/runtime.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/runtime.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -55,7 +55,7 @@ // code in various ways. Currently they are used by the lock coarsening code // -class NamedCounter : public CHeapObj { +class NamedCounter : public CHeapObj { public: enum CounterTag { NoTag, diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/split_if.cpp --- a/src/share/vm/opto/split_if.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/split_if.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -137,9 +137,7 @@ Node *iff_ctrl = iff->is_If() ? iff->in(0) : get_ctrl(iff); Node *x = bol->clone(); register_new_node(x, iff_ctrl); - _igvn.hash_delete(iff); - iff->set_req(1, x); - _igvn._worklist.push(iff); + _igvn.replace_input_of(iff, 1, x); } _igvn.remove_dead_node( bol ); --i; @@ -151,9 +149,7 @@ assert( bol->in(1) == n, "" ); Node *x = n->clone(); register_new_node(x, get_ctrl(bol)); - _igvn.hash_delete(bol); - bol->set_req(1, x); - _igvn._worklist.push(bol); + _igvn.replace_input_of(bol, 1, x); } _igvn.remove_dead_node( n ); @@ -387,9 +383,7 @@ if( use->in(i) == def ) break; assert( i < use->req(), "def should be among use's inputs" ); - _igvn.hash_delete(use); - use->set_req(i, new_def); - _igvn._worklist.push(use); + _igvn.replace_input_of(use, i, new_def); } //------------------------------do_split_if------------------------------------ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/stringopts.cpp --- a/src/share/vm/opto/stringopts.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/stringopts.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -112,6 +112,7 @@ _arguments->ins_req(0, value); _mode.insert_before(0, mode); } + void push_string(Node* value) { push(value, StringMode); } @@ -125,9 +126,56 @@ push(value, CharMode); } + static bool is_SB_toString(Node* call) { + if (call->is_CallStaticJava()) { + CallStaticJavaNode* csj = call->as_CallStaticJava(); + ciMethod* m = csj->method(); + if (m != NULL && + (m->intrinsic_id() == vmIntrinsics::_StringBuilder_toString || + m->intrinsic_id() == vmIntrinsics::_StringBuffer_toString)) { + return true; + } + } + return false; + } + + static Node* skip_string_null_check(Node* value) { + // Look for a diamond shaped Null check of toString() result + // (could be code from String.valueOf()): + // (Proj == NULL) ? "null":"CastPP(Proj)#NotNULL + if (value->is_Phi()) { + int true_path = value->as_Phi()->is_diamond_phi(); + if (true_path != 0) { + // phi->region->if_proj->ifnode->bool + BoolNode* b = value->in(0)->in(1)->in(0)->in(1)->as_Bool(); + Node* cmp = b->in(1); + Node* v1 = cmp->in(1); + Node* v2 = cmp->in(2); + // Null check of the return of toString which can simply be skipped. + if (b->_test._test == BoolTest::ne && + v2->bottom_type() == TypePtr::NULL_PTR && + value->in(true_path)->Opcode() == Op_CastPP && + value->in(true_path)->in(1) == v1 && + v1->is_Proj() && is_SB_toString(v1->in(0))) { + return v1; + } + } + } + return value; + } + Node* argument(int i) { return _arguments->in(i); } + Node* argument_uncast(int i) { + Node* arg = argument(i); + int amode = mode(i); + if (amode == StringConcat::StringMode || + amode == StringConcat::StringNullCheckMode) { + arg = skip_string_null_check(arg); + } + return arg; + } void set_argument(int i, Node* value) { _arguments->set_req(i, value); } @@ -206,9 +254,11 @@ void StringConcat::eliminate_unneeded_control() { - eliminate_initialize(begin()->initialization()); for (uint i = 0; i < _control.size(); i++) { Node* n = _control.at(i); + if (n->is_Allocate()) { + eliminate_initialize(n->as_Allocate()->initialization()); + } if (n->is_Call()) { if (n != _end) { eliminate_call(n->as_Call()); @@ -239,14 +289,15 @@ assert(result->_control.contains(other->_end), "what?"); assert(result->_control.contains(_begin), "what?"); for (int x = 0; x < num_arguments(); x++) { - if (argument(x) == arg) { + Node* argx = argument_uncast(x); + if (argx == arg) { // replace the toString result with the all the arguments that // made up the other StringConcat for (int y = 0; y < other->num_arguments(); y++) { result->append(other->argument(y), other->mode(y)); } } else { - result->append(argument(x), mode(x)); + result->append(argx, mode(x)); } } result->set_allocation(other->_begin); @@ -327,14 +378,9 @@ while (worklist.size() > 0) { Node* ctrl = worklist.pop(); - if (ctrl->is_CallStaticJava()) { + if (StringConcat::is_SB_toString(ctrl)) { CallStaticJavaNode* csj = ctrl->as_CallStaticJava(); - ciMethod* m = csj->method(); - if (m != NULL && - (m->intrinsic_id() == vmIntrinsics::_StringBuffer_toString || - m->intrinsic_id() == vmIntrinsics::_StringBuilder_toString)) { - string_calls.push(csj); - } + string_calls.push(csj); } if (ctrl->in(0) != NULL && !_visited.test_set(ctrl->in(0)->_idx)) { worklist.push(ctrl->in(0)); @@ -487,7 +533,17 @@ if (arg->is_Proj() && arg->in(0)->is_CallStaticJava()) { CallStaticJavaNode* csj = arg->in(0)->as_CallStaticJava(); if (csj->method() != NULL && - csj->method()->intrinsic_id() == vmIntrinsics::_Integer_toString) { + csj->method()->intrinsic_id() == vmIntrinsics::_Integer_toString && + arg->outcnt() == 1) { + // _control is the list of StringBuilder calls nodes which + // will be replaced by new String code after this optimization. + // Integer::toString() call is not part of StringBuilder calls + // chain. It could be eliminated only if its result is used + // only by this SB calls chain. + // Another limitation: it should be used only once because + // it is unknown that it is used only by this SB calls chain + // until all related SB calls nodes are collected. + assert(arg->unique_out() == cnode, "sanity"); sc->add_control(csj); sc->push_int(csj->in(TypeFunc::Parms)); continue; @@ -528,16 +584,6 @@ } // Collect the types needed to talk about the various slices of memory - const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), - false, NULL, 0); - - const TypePtr* value_field_type = string_type->add_offset(java_lang_String::value_offset_in_bytes()); - const TypePtr* offset_field_type = string_type->add_offset(java_lang_String::offset_offset_in_bytes()); - const TypePtr* count_field_type = string_type->add_offset(java_lang_String::count_offset_in_bytes()); - - value_field_idx = C->get_alias_index(value_field_type); - count_field_idx = C->get_alias_index(count_field_type); - offset_field_idx = C->get_alias_index(offset_field_type); char_adr_idx = C->get_alias_index(TypeAryPtr::CHARS); // For each locally allocated StringBuffer see if the usages can be @@ -560,44 +606,40 @@ for (int c = 0; c < concats.length(); c++) { StringConcat* sc = concats.at(c); for (int i = 0; i < sc->num_arguments(); i++) { - Node* arg = sc->argument(i); - if (arg->is_Proj() && arg->in(0)->is_CallStaticJava()) { + Node* arg = sc->argument_uncast(i); + if (arg->is_Proj() && StringConcat::is_SB_toString(arg->in(0))) { CallStaticJavaNode* csj = arg->in(0)->as_CallStaticJava(); - if (csj->method() != NULL && - (csj->method()->intrinsic_id() == vmIntrinsics::_StringBuilder_toString || - csj->method()->intrinsic_id() == vmIntrinsics::_StringBuffer_toString)) { - for (int o = 0; o < concats.length(); o++) { - if (c == o) continue; - StringConcat* other = concats.at(o); - if (other->end() == csj) { + for (int o = 0; o < concats.length(); o++) { + if (c == o) continue; + StringConcat* other = concats.at(o); + if (other->end() == csj) { #ifndef PRODUCT - if (PrintOptimizeStringConcat) { - tty->print_cr("considering stacked concats"); - } + if (PrintOptimizeStringConcat) { + tty->print_cr("considering stacked concats"); + } #endif - StringConcat* merged = sc->merge(other, arg); - if (merged->validate_control_flow()) { + StringConcat* merged = sc->merge(other, arg); + if (merged->validate_control_flow()) { #ifndef PRODUCT - if (PrintOptimizeStringConcat) { - tty->print_cr("stacking would succeed"); - } + if (PrintOptimizeStringConcat) { + tty->print_cr("stacking would succeed"); + } #endif - if (c < o) { - concats.remove_at(o); - concats.at_put(c, merged); - } else { - concats.remove_at(c); - concats.at_put(o, merged); - } - goto restart; + if (c < o) { + concats.remove_at(o); + concats.at_put(c, merged); } else { + concats.remove_at(c); + concats.at_put(o, merged); + } + goto restart; + } else { #ifndef PRODUCT - if (PrintOptimizeStringConcat) { - tty->print_cr("stacking would fail"); - } + if (PrintOptimizeStringConcat) { + tty->print_cr("stacking would fail"); + } #endif - } } } } @@ -1174,18 +1216,9 @@ Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* char_array, Node* start) { Node* string = str; - Node* offset = kit.make_load(kit.control(), - kit.basic_plus_adr(string, string, java_lang_String::offset_offset_in_bytes()), - TypeInt::INT, T_INT, offset_field_idx); - Node* count = kit.make_load(kit.control(), - kit.basic_plus_adr(string, string, java_lang_String::count_offset_in_bytes()), - TypeInt::INT, T_INT, count_field_idx); - const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull, - TypeAry::make(TypeInt::CHAR,TypeInt::POS), - ciTypeArrayKlass::make(T_CHAR), true, 0); - Node* value = kit.make_load(kit.control(), - kit.basic_plus_adr(string, string, java_lang_String::value_offset_in_bytes()), - value_type, T_OBJECT, value_field_idx); + Node* offset = kit.load_String_offset(kit.control(), string); + Node* count = kit.load_String_length(kit.control(), string); + Node* value = kit.load_String_value (kit.control(), string); // copy the contents if (offset->is_Con() && count->is_Con() && value->is_Con() && count->get_int() < unroll_string_copy_length) { @@ -1342,10 +1375,9 @@ arg = phi; sc->set_argument(argi, arg); } - // Node* offset = kit.make_load(NULL, kit.basic_plus_adr(arg, arg, offset_offset), - // TypeInt::INT, T_INT, offset_field_idx); - Node* count = kit.make_load(kit.control(), kit.basic_plus_adr(arg, arg, java_lang_String::count_offset_in_bytes()), - TypeInt::INT, T_INT, count_field_idx); + + Node* count = kit.load_String_length(kit.control(), arg); + length = __ AddI(length, count); string_sizes->init_req(argi, NULL); break; @@ -1436,12 +1468,11 @@ } // Intialize the string - kit.store_to_memory(kit.control(), kit.basic_plus_adr(result, java_lang_String::offset_offset_in_bytes()), - __ intcon(0), T_INT, offset_field_idx); - kit.store_to_memory(kit.control(), kit.basic_plus_adr(result, java_lang_String::count_offset_in_bytes()), - length, T_INT, count_field_idx); - kit.store_to_memory(kit.control(), kit.basic_plus_adr(result, java_lang_String::value_offset_in_bytes()), - char_array, T_OBJECT, value_field_idx); + if (java_lang_String::has_offset_field()) { + kit.store_String_offset(kit.control(), result, __ intcon(0)); + kit.store_String_length(kit.control(), result, length); + } + kit.store_String_value(kit.control(), result, char_array); // hook up the outgoing control and result kit.replace_call(sc->end(), result); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/stringopts.hpp --- a/src/share/vm/opto/stringopts.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/stringopts.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,9 +41,6 @@ // Memory slices needed for code gen int char_adr_idx; - int value_field_idx; - int count_field_idx; - int offset_field_idx; // Integer.sizeTable - used for int to String conversion ciField* size_table_field; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/subnode.cpp --- a/src/share/vm/opto/subnode.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/subnode.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -554,9 +554,7 @@ return TypeInt::CC_GE; } else if (hi0 <= lo1) { // Check for special case in Hashtable::get. (See below.) - if ((jint)lo0 >= 0 && (jint)lo1 >= 0 && - in(1)->Opcode() == Op_ModI && - in(1)->in(2) == in(2) ) + if ((jint)lo0 >= 0 && (jint)lo1 >= 0 && is_index_range_check()) return TypeInt::CC_LT; return TypeInt::CC_LE; } @@ -567,13 +565,17 @@ // to be positive. // (This is a gross hack, since the sub method never // looks at the structure of the node in any other case.) - if ((jint)lo0 >= 0 && (jint)lo1 >= 0 && - in(1)->Opcode() == Op_ModI && - in(1)->in(2)->uncast() == in(2)->uncast()) + if ((jint)lo0 >= 0 && (jint)lo1 >= 0 && is_index_range_check()) return TypeInt::CC_LT; return TypeInt::CC; // else use worst case results } +bool CmpUNode::is_index_range_check() const { + // Check for the "(X ModI Y) CmpU Y" shape + return (in(1)->Opcode() == Op_ModI && + in(1)->in(2)->eqv_uncast(in(2))); +} + //------------------------------Idealize--------------------------------------- Node *CmpINode::Ideal( PhaseGVN *phase, bool can_reshape ) { if (phase->type(in(2))->higher_equal(TypeInt::ZERO)) { @@ -702,12 +704,84 @@ return TypeInt::CC; } +static inline Node* isa_java_mirror_load(PhaseGVN* phase, Node* n) { + // Return the klass node for + // LoadP(AddP(foo:Klass, #java_mirror)) + // or NULL if not matching. + if (n->Opcode() != Op_LoadP) return NULL; + + const TypeInstPtr* tp = phase->type(n)->isa_instptr(); + if (!tp || tp->klass() != phase->C->env()->Class_klass()) return NULL; + + Node* adr = n->in(MemNode::Address); + intptr_t off = 0; + Node* k = AddPNode::Ideal_base_and_offset(adr, phase, off); + if (k == NULL) return NULL; + const TypeKlassPtr* tkp = phase->type(k)->isa_klassptr(); + if (!tkp || off != in_bytes(Klass::java_mirror_offset())) return NULL; + + // We've found the klass node of a Java mirror load. + return k; +} + +static inline Node* isa_const_java_mirror(PhaseGVN* phase, Node* n) { + // for ConP(Foo.class) return ConP(Foo.klass) + // otherwise return NULL + if (!n->is_Con()) return NULL; + + const TypeInstPtr* tp = phase->type(n)->isa_instptr(); + if (!tp) return NULL; + + ciType* mirror_type = tp->java_mirror_type(); + // TypeInstPtr::java_mirror_type() returns non-NULL for compile- + // time Class constants only. + if (!mirror_type) return NULL; + + // x.getClass() == int.class can never be true (for all primitive types) + // Return a ConP(NULL) node for this case. + if (mirror_type->is_classless()) { + return phase->makecon(TypePtr::NULL_PTR); + } + + // return the ConP(Foo.klass) + assert(mirror_type->is_klass(), "mirror_type should represent a klassOop"); + return phase->makecon(TypeKlassPtr::make(mirror_type->as_klass())); +} + //------------------------------Ideal------------------------------------------ -// Check for the case of comparing an unknown klass loaded from the primary +// Normalize comparisons between Java mirror loads to compare the klass instead. +// +// Also check for the case of comparing an unknown klass loaded from the primary // super-type array vs a known klass with no subtypes. This amounts to // checking to see an unknown klass subtypes a known klass with no subtypes; // this only happens on an exact match. We can shorten this test by 1 load. Node *CmpPNode::Ideal( PhaseGVN *phase, bool can_reshape ) { + // Normalize comparisons between Java mirrors into comparisons of the low- + // level klass, where a dependent load could be shortened. + // + // The new pattern has a nice effect of matching the same pattern used in the + // fast path of instanceof/checkcast/Class.isInstance(), which allows + // redundant exact type check be optimized away by GVN. + // For example, in + // if (x.getClass() == Foo.class) { + // Foo foo = (Foo) x; + // // ... use a ... + // } + // a CmpPNode could be shared between if_acmpne and checkcast + { + Node* k1 = isa_java_mirror_load(phase, in(1)); + Node* k2 = isa_java_mirror_load(phase, in(2)); + Node* conk2 = isa_const_java_mirror(phase, in(2)); + + if (k1 && (k2 || conk2)) { + Node* lhs = k1; + Node* rhs = (k2 != NULL) ? k2 : conk2; + this->set_req(1, lhs); + this->set_req(2, rhs); + return this; + } + } + // Constant pointer on right? const TypeKlassPtr* t2 = phase->type(in(2))->isa_klassptr(); if (t2 == NULL || !t2->klass_is_exact()) @@ -1314,7 +1388,5 @@ if( t2->base() != Type::DoubleCon ) return Type::DOUBLE; double d1 = t1->getd(); double d2 = t2->getd(); - if( d1 < 0.0 ) return Type::DOUBLE; - if( d2 < 0.0 ) return Type::DOUBLE; return TypeD::make( StubRoutines::intrinsic_pow( d1, d2 ) ); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/subnode.hpp --- a/src/share/vm/opto/subnode.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/subnode.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -158,6 +158,7 @@ CmpUNode( Node *in1, Node *in2 ) : CmpNode(in1,in2) {} virtual int Opcode() const; virtual const Type *sub( const Type *, const Type * ) const; + bool is_index_range_check() const; }; //------------------------------CmpPNode--------------------------------------- diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/superword.cpp --- a/src/share/vm/opto/superword.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/superword.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,6 +67,10 @@ //------------------------------transform_loop--------------------------- void SuperWord::transform_loop(IdealLoopTree* lpt) { + assert(UseSuperWord, "should be"); + // Do vectors exist on this architecture? + if (Matcher::vector_width_in_bytes(T_BYTE) < 2) return; + assert(lpt->_head->is_CountedLoop(), "must be"); CountedLoopNode *cl = lpt->_head->as_CountedLoop(); @@ -89,15 +93,12 @@ Node *pre_opaq1 = pre_end->limit(); if (pre_opaq1->Opcode() != Op_Opaque1) return; - // Do vectors exist on this architecture? - if (vector_width_in_bytes() == 0) return; - init(); // initialize data structures set_lpt(lpt); set_lp(cl); - // For now, define one block which is the entire loop body + // For now, define one block which is the entire loop body set_bb(cl); assert(_packset.length() == 0, "packset must be empty"); @@ -177,7 +178,7 @@ Node_List memops; for (int i = 0; i < _block.length(); i++) { Node* n = _block.at(i); - if (n->is_Mem() && in_bb(n) && + if (n->is_Mem() && !n->is_LoadStore() && in_bb(n) && is_java_primitive(n->as_Mem()->memory_type())) { int align = memory_alignment(n->as_Mem(), 0); if (align != bottom_align) { @@ -185,54 +186,141 @@ } } } - if (memops.size() == 0) return; - // Find a memory reference to align to. The pre-loop trip count - // is modified to align this reference to a vector-aligned address - find_align_to_ref(memops); - if (align_to_ref() == NULL) return; + Node_List align_to_refs; + int best_iv_adjustment = 0; + MemNode* best_align_to_mem_ref = NULL; - SWPointer align_to_ref_p(align_to_ref(), this); - int offset = align_to_ref_p.offset_in_bytes(); - int scale = align_to_ref_p.scale_in_bytes(); - int vw = vector_width_in_bytes(); - int stride_sign = (scale * iv_stride()) > 0 ? 1 : -1; - int iv_adjustment = (stride_sign * vw - (offset % vw)) % vw; - -#ifndef PRODUCT - if (TraceSuperWord) - tty->print_cr("\noffset = %d iv_adjustment = %d elt_align = %d scale = %d iv_stride = %d", - offset, iv_adjustment, align_to_ref_p.memory_size(), align_to_ref_p.scale_in_bytes(), iv_stride()); -#endif + while (memops.size() != 0) { + // Find a memory reference to align to. + MemNode* mem_ref = find_align_to_ref(memops); + if (mem_ref == NULL) break; + align_to_refs.push(mem_ref); + int iv_adjustment = get_iv_adjustment(mem_ref); - // Set alignment relative to "align_to_ref" - for (int i = memops.size() - 1; i >= 0; i--) { - MemNode* s = memops.at(i)->as_Mem(); - SWPointer p2(s, this); - if (p2.comparable(align_to_ref_p)) { - int align = memory_alignment(s, iv_adjustment); - set_alignment(s, align); - } else { - memops.remove(i); + if (best_align_to_mem_ref == NULL) { + // Set memory reference which is the best from all memory operations + // to be used for alignment. The pre-loop trip count is modified to align + // this reference to a vector-aligned address. + best_align_to_mem_ref = mem_ref; + best_iv_adjustment = iv_adjustment; } - } - // Create initial pack pairs of memory operations - for (uint i = 0; i < memops.size(); i++) { - Node* s1 = memops.at(i); - for (uint j = 0; j < memops.size(); j++) { - Node* s2 = memops.at(j); - if (s1 != s2 && are_adjacent_refs(s1, s2)) { - int align = alignment(s1); - if (stmts_can_pack(s1, s2, align)) { - Node_List* pair = new Node_List(); - pair->push(s1); - pair->push(s2); - _packset.append(pair); + SWPointer align_to_ref_p(mem_ref, this); + // Set alignment relative to "align_to_ref" for all related memory operations. + for (int i = memops.size() - 1; i >= 0; i--) { + MemNode* s = memops.at(i)->as_Mem(); + if (isomorphic(s, mem_ref)) { + SWPointer p2(s, this); + if (p2.comparable(align_to_ref_p)) { + int align = memory_alignment(s, iv_adjustment); + set_alignment(s, align); } } } - } + + // Create initial pack pairs of memory operations for which + // alignment is set and vectors will be aligned. + bool create_pack = true; + if (memory_alignment(mem_ref, best_iv_adjustment) == 0) { + if (!Matcher::misaligned_vectors_ok()) { + int vw = vector_width(mem_ref); + int vw_best = vector_width(best_align_to_mem_ref); + if (vw > vw_best) { + // Do not vectorize a memory access with more elements per vector + // if unaligned memory access is not allowed because number of + // iterations in pre-loop will be not enough to align it. + create_pack = false; + } + } + } else { + if (same_velt_type(mem_ref, best_align_to_mem_ref)) { + // Can't allow vectorization of unaligned memory accesses with the + // same type since it could be overlapped accesses to the same array. + create_pack = false; + } else { + // Allow independent (different type) unaligned memory operations + // if HW supports them. + if (!Matcher::misaligned_vectors_ok()) { + create_pack = false; + } else { + // Check if packs of the same memory type but + // with a different alignment were created before. + for (uint i = 0; i < align_to_refs.size(); i++) { + MemNode* mr = align_to_refs.at(i)->as_Mem(); + if (same_velt_type(mr, mem_ref) && + memory_alignment(mr, iv_adjustment) != 0) + create_pack = false; + } + } + } + } + if (create_pack) { + for (uint i = 0; i < memops.size(); i++) { + Node* s1 = memops.at(i); + int align = alignment(s1); + if (align == top_align) continue; + for (uint j = 0; j < memops.size(); j++) { + Node* s2 = memops.at(j); + if (alignment(s2) == top_align) continue; + if (s1 != s2 && are_adjacent_refs(s1, s2)) { + if (stmts_can_pack(s1, s2, align)) { + Node_List* pair = new Node_List(); + pair->push(s1); + pair->push(s2); + _packset.append(pair); + } + } + } + } + } else { // Don't create unaligned pack + // First, remove remaining memory ops of the same type from the list. + for (int i = memops.size() - 1; i >= 0; i--) { + MemNode* s = memops.at(i)->as_Mem(); + if (same_velt_type(s, mem_ref)) { + memops.remove(i); + } + } + + // Second, remove already constructed packs of the same type. + for (int i = _packset.length() - 1; i >= 0; i--) { + Node_List* p = _packset.at(i); + MemNode* s = p->at(0)->as_Mem(); + if (same_velt_type(s, mem_ref)) { + remove_pack_at(i); + } + } + + // If needed find the best memory reference for loop alignment again. + if (same_velt_type(mem_ref, best_align_to_mem_ref)) { + // Put memory ops from remaining packs back on memops list for + // the best alignment search. + uint orig_msize = memops.size(); + for (int i = 0; i < _packset.length(); i++) { + Node_List* p = _packset.at(i); + MemNode* s = p->at(0)->as_Mem(); + assert(!same_velt_type(s, mem_ref), "sanity"); + memops.push(s); + } + MemNode* best_align_to_mem_ref = find_align_to_ref(memops); + if (best_align_to_mem_ref == NULL) break; + best_iv_adjustment = get_iv_adjustment(best_align_to_mem_ref); + // Restore list. + while (memops.size() > orig_msize) + (void)memops.pop(); + } + } // unaligned memory accesses + + // Remove used mem nodes. + for (int i = memops.size() - 1; i >= 0; i--) { + MemNode* m = memops.at(i)->as_Mem(); + if (alignment(m) != top_align) { + memops.remove(i); + } + } + + } // while (memops.size() != 0 + set_align_to_ref(best_align_to_mem_ref); #ifndef PRODUCT if (TraceSuperWord) { @@ -246,7 +334,7 @@ // Find a memory reference to align the loop induction variable to. // Looks first at stores then at loads, looking for a memory reference // with the largest number of references similar to it. -void SuperWord::find_align_to_ref(Node_List &memops) { +MemNode* SuperWord::find_align_to_ref(Node_List &memops) { GrowableArray cmp_ct(arena(), memops.size(), memops.size(), 0); // Count number of comparable memory ops @@ -270,20 +358,28 @@ } } - // Find Store (or Load) with the greatest number of "comparable" references + // Find Store (or Load) with the greatest number of "comparable" references, + // biggest vector size, smallest data size and smallest iv offset. int max_ct = 0; + int max_vw = 0; int max_idx = -1; int min_size = max_jint; int min_iv_offset = max_jint; for (uint j = 0; j < memops.size(); j++) { MemNode* s = memops.at(j)->as_Mem(); if (s->is_Store()) { + int vw = vector_width_in_bytes(s); + assert(vw > 1, "sanity"); SWPointer p(s, this); - if (cmp_ct.at(j) > max_ct || - cmp_ct.at(j) == max_ct && (data_size(s) < min_size || - data_size(s) == min_size && - p.offset_in_bytes() < min_iv_offset)) { + if (cmp_ct.at(j) > max_ct || + cmp_ct.at(j) == max_ct && + (vw > max_vw || + vw == max_vw && + (data_size(s) < min_size || + data_size(s) == min_size && + (p.offset_in_bytes() < min_iv_offset)))) { max_ct = cmp_ct.at(j); + max_vw = vw; max_idx = j; min_size = data_size(s); min_iv_offset = p.offset_in_bytes(); @@ -295,12 +391,18 @@ for (uint j = 0; j < memops.size(); j++) { MemNode* s = memops.at(j)->as_Mem(); if (s->is_Load()) { + int vw = vector_width_in_bytes(s); + assert(vw > 1, "sanity"); SWPointer p(s, this); - if (cmp_ct.at(j) > max_ct || - cmp_ct.at(j) == max_ct && (data_size(s) < min_size || - data_size(s) == min_size && - p.offset_in_bytes() < min_iv_offset)) { + if (cmp_ct.at(j) > max_ct || + cmp_ct.at(j) == max_ct && + (vw > max_vw || + vw == max_vw && + (data_size(s) < min_size || + data_size(s) == min_size && + (p.offset_in_bytes() < min_iv_offset)))) { max_ct = cmp_ct.at(j); + max_vw = vw; max_idx = j; min_size = data_size(s); min_iv_offset = p.offset_in_bytes(); @@ -309,10 +411,7 @@ } } - if (max_ct > 0) - set_align_to_ref(memops.at(max_idx)->as_Mem()); - -#ifndef PRODUCT +#ifdef ASSERT if (TraceSuperWord && Verbose) { tty->print_cr("\nVector memops after find_align_to_refs"); for (uint i = 0; i < memops.size(); i++) { @@ -321,6 +420,17 @@ } } #endif + + if (max_ct > 0) { +#ifdef ASSERT + if (TraceSuperWord) { + tty->print("\nVector align to node: "); + memops.at(max_idx)->as_Mem()->dump(); + } +#endif + return memops.at(max_idx)->as_Mem(); + } + return NULL; } //------------------------------ref_is_alignable--------------------------- @@ -341,7 +451,8 @@ // If initial offset from start of object is computable, // compute alignment within the vector. - int vw = vector_width_in_bytes(); + int vw = vector_width_in_bytes(p.mem()); + assert(vw > 1, "sanity"); if (vw % span == 0) { Node* init_nd = pre_end->init_trip(); if (init_nd->is_Con() && p.invar() == NULL) { @@ -361,6 +472,25 @@ return false; } +//---------------------------get_iv_adjustment--------------------------- +// Calculate loop's iv adjustment for this memory ops. +int SuperWord::get_iv_adjustment(MemNode* mem_ref) { + SWPointer align_to_ref_p(mem_ref, this); + int offset = align_to_ref_p.offset_in_bytes(); + int scale = align_to_ref_p.scale_in_bytes(); + int vw = vector_width_in_bytes(mem_ref); + assert(vw > 1, "sanity"); + int stride_sign = (scale * iv_stride()) > 0 ? 1 : -1; + int iv_adjustment = (stride_sign * vw - (offset % vw)) % vw; + +#ifndef PRODUCT + if (TraceSuperWord) + tty->print_cr("\noffset = %d iv_adjust = %d elt_size = %d scale = %d iv_stride = %d vect_size %d", + offset, iv_adjustment, align_to_ref_p.memory_size(), scale, iv_stride(), vw); +#endif + return iv_adjustment; +} + //---------------------------dependence_graph--------------------------- // Construct dependency graph. // Add dependence edges to load/store nodes for memory dependence @@ -488,9 +618,13 @@ bool SuperWord::stmts_can_pack(Node* s1, Node* s2, int align) { // Do not use superword for non-primitives - if((s1->is_Mem() && !is_java_primitive(s1->as_Mem()->memory_type())) || - (s2->is_Mem() && !is_java_primitive(s2->as_Mem()->memory_type()))) + BasicType bt1 = velt_basic_type(s1); + BasicType bt2 = velt_basic_type(s2); + if(!is_java_primitive(bt1) || !is_java_primitive(bt2)) return false; + if (Matcher::max_vector_size(bt1) < 2) { + return false; // No vectors for this type + } if (isomorphic(s1, s2)) { if (independent(s1, s2)) { @@ -552,7 +686,7 @@ if (s1->Opcode() != s2->Opcode()) return false; if (s1->req() != s2->req()) return false; if (s1->in(0) != s2->in(0)) return false; - if (velt_type(s1) != velt_type(s2)) return false; + if (!same_velt_type(s1, s2)) return false; return true; } @@ -595,14 +729,16 @@ //------------------------------set_alignment--------------------------- void SuperWord::set_alignment(Node* s1, Node* s2, int align) { set_alignment(s1, align); - set_alignment(s2, align + data_size(s1)); + if (align == top_align || align == bottom_align) { + set_alignment(s2, align); + } else { + set_alignment(s2, align + data_size(s1)); + } } //------------------------------data_size--------------------------- int SuperWord::data_size(Node* s) { - const Type* t = velt_type(s); - BasicType bt = t->array_element_basic_type(); - int bsize = type2aelembytes(bt); + int bsize = type2aelembytes(velt_basic_type(s)); assert(bsize != 0, "valid size"); return bsize; } @@ -631,9 +767,9 @@ //------------------------------follow_use_defs--------------------------- // Extend the packset by visiting operand definitions of nodes in pack p bool SuperWord::follow_use_defs(Node_List* p) { + assert(p->size() == 2, "just checking"); Node* s1 = p->at(0); Node* s2 = p->at(1); - assert(p->size() == 2, "just checking"); assert(s1->req() == s2->req(), "just checking"); assert(alignment(s1) + data_size(s1) == alignment(s2), "just checking"); @@ -718,7 +854,12 @@ for (i1++; i1 < ct; i1++) if (u1->in(i1) == d1) break; for (i2++; i2 < ct; i2++) if (u2->in(i2) == d2) break; if (i1 != i2) { - return false; + if ((i1 == (3-i2)) && (u2->is_Add() || u2->is_Mul())) { + // Further analysis relies on operands position matching. + u2->swap_edges(i1, i2); + } else { + return false; + } } } while (i1 < ct); return true; @@ -727,7 +868,7 @@ //------------------------------est_savings--------------------------- // Estimate the savings from executing s1 and s2 as a pack int SuperWord::est_savings(Node* s1, Node* s2) { - int save = 2 - 1; // 2 operations per instruction in packed form + int save_in = 2 - 1; // 2 operations per instruction in packed form // inputs for (uint i = 1; i < s1->req(); i++) { @@ -735,17 +876,18 @@ Node* x2 = s2->in(i); if (x1 != x2) { if (are_adjacent_refs(x1, x2)) { - save += adjacent_profit(x1, x2); + save_in += adjacent_profit(x1, x2); } else if (!in_packset(x1, x2)) { - save -= pack_cost(2); + save_in -= pack_cost(2); } else { - save += unpack_cost(2); + save_in += unpack_cost(2); } } } // uses of result uint ct = 0; + int save_use = 0; for (DUIterator_Fast imax, i = s1->fast_outs(imax); i < imax; i++) { Node* s1_use = s1->fast_out(i); for (int j = 0; j < _packset.length(); j++) { @@ -756,7 +898,7 @@ if (p->at(p->size()-1) == s2_use) { ct++; if (are_adjacent_refs(s1_use, s2_use)) { - save += adjacent_profit(s1_use, s2_use); + save_use += adjacent_profit(s1_use, s2_use); } } } @@ -764,10 +906,10 @@ } } - if (ct < s1->outcnt()) save += unpack_cost(1); - if (ct < s2->outcnt()) save += unpack_cost(1); + if (ct < s1->outcnt()) save_use += unpack_cost(1); + if (ct < s2->outcnt()) save_use += unpack_cost(1); - return save; + return MAX2(save_in, save_use); } //------------------------------costs--------------------------- @@ -778,8 +920,9 @@ //------------------------------combine_packs--------------------------- // Combine packs A and B with A.last == B.first into A.first..,A.last,B.second,..B.last void SuperWord::combine_packs() { - bool changed; - do { + bool changed = true; + // Combine packs regardless max vector size. + while (changed) { changed = false; for (int i = 0; i < _packset.length(); i++) { Node_List* p1 = _packset.at(i); @@ -787,6 +930,7 @@ for (int j = 0; j < _packset.length(); j++) { Node_List* p2 = _packset.at(j); if (p2 == NULL) continue; + if (i == j) continue; if (p1->at(p1->size()-1) == p2->at(0)) { for (uint k = 1; k < p2->size(); k++) { p1->push(p2->at(k)); @@ -796,8 +940,39 @@ } } } - } while (changed); + } + // Split packs which have size greater then max vector size. + for (int i = 0; i < _packset.length(); i++) { + Node_List* p1 = _packset.at(i); + if (p1 != NULL) { + BasicType bt = velt_basic_type(p1->at(0)); + uint max_vlen = Matcher::max_vector_size(bt); // Max elements in vector + assert(is_power_of_2(max_vlen), "sanity"); + uint psize = p1->size(); + if (!is_power_of_2(psize)) { + // Skip pack which can't be vector. + // case1: for(...) { a[i] = i; } elements values are different (i+x) + // case2: for(...) { a[i] = b[i+1]; } can't align both, load and store + _packset.at_put(i, NULL); + continue; + } + if (psize > max_vlen) { + Node_List* pack = new Node_List(); + for (uint j = 0; j < psize; j++) { + pack->push(p1->at(j)); + if (pack->size() >= max_vlen) { + assert(is_power_of_2(pack->size()), "sanity"); + _packset.append(pack); + pack = new Node_List(); + } + } + _packset.at_put(i, NULL); + } + } + } + + // Compress list. for (int i = _packset.length() - 1; i >= 0; i--) { Node_List* p1 = _packset.at(i); if (p1 == NULL) { @@ -880,8 +1055,7 @@ // Can code be generated for pack p? bool SuperWord::implemented(Node_List* p) { Node* p0 = p->at(0); - int vopc = VectorNode::opcode(p0->Opcode(), p->size(), velt_type(p0)); - return vopc > 0 && Matcher::has_match_rule(vopc); + return VectorNode::implemented(p0->Opcode(), p->size(), velt_basic_type(p0)); } //------------------------------profitable--------------------------- @@ -939,62 +1113,56 @@ } //-------------------------------remove_and_insert------------------- -//remove "current" from its current position in the memory graph and insert -//it after the appropriate insertion point (lip or uip) +// Remove "current" from its current position in the memory graph and insert +// it after the appropriate insertion point (lip or uip). void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip, Node *uip, Unique_Node_List &sched_before) { Node* my_mem = current->in(MemNode::Memory); - _igvn.hash_delete(current); - _igvn.hash_delete(my_mem); + bool sched_up = sched_before.member(current); - //remove current_store from its current position in the memmory graph + // remove current_store from its current position in the memmory graph for (DUIterator i = current->outs(); current->has_out(i); i++) { Node* use = current->out(i); if (use->is_Mem()) { assert(use->in(MemNode::Memory) == current, "must be"); - _igvn.hash_delete(use); if (use == prev) { // connect prev to my_mem - use->set_req(MemNode::Memory, my_mem); + _igvn.replace_input_of(use, MemNode::Memory, my_mem); + --i; //deleted this edge; rescan position } else if (sched_before.member(use)) { - _igvn.hash_delete(uip); - use->set_req(MemNode::Memory, uip); + if (!sched_up) { // Will be moved together with current + _igvn.replace_input_of(use, MemNode::Memory, uip); + --i; //deleted this edge; rescan position + } } else { - _igvn.hash_delete(lip); - use->set_req(MemNode::Memory, lip); + if (sched_up) { // Will be moved together with current + _igvn.replace_input_of(use, MemNode::Memory, lip); + --i; //deleted this edge; rescan position + } } - _igvn._worklist.push(use); - --i; //deleted this edge; rescan position } } - bool sched_up = sched_before.member(current); Node *insert_pt = sched_up ? uip : lip; - _igvn.hash_delete(insert_pt); // all uses of insert_pt's memory state should use current's instead for (DUIterator i = insert_pt->outs(); insert_pt->has_out(i); i++) { Node* use = insert_pt->out(i); if (use->is_Mem()) { assert(use->in(MemNode::Memory) == insert_pt, "must be"); - _igvn.hash_delete(use); - use->set_req(MemNode::Memory, current); - _igvn._worklist.push(use); + _igvn.replace_input_of(use, MemNode::Memory, current); --i; //deleted this edge; rescan position } else if (!sched_up && use->is_Phi() && use->bottom_type() == Type::MEMORY) { uint pos; //lip (lower insert point) must be the last one in the memory slice - _igvn.hash_delete(use); for (pos=1; pos < use->req(); pos++) { if (use->in(pos) == insert_pt) break; } - use->set_req(pos, current); - _igvn._worklist.push(use); + _igvn.replace_input_of(use, pos, current); --i; } } //connect current to insert_pt - current->set_req(MemNode::Memory, insert_pt); - _igvn._worklist.push(current); + _igvn.replace_input_of(current, MemNode::Memory, insert_pt); } //------------------------------co_locate_pack---------------------------------- @@ -1031,7 +1199,7 @@ if (use->is_Mem() && use != previous) memops.push(use); } - if(current == first) break; + if (current == first) break; previous = current; current = current->in(MemNode::Memory)->as_Mem(); } @@ -1044,27 +1212,37 @@ Node *s2 = memops.at(j); if (!independent(s1, s2)) { if (in_pack(s2, pk) || schedule_before_pack.member(s2)) { - schedule_before_pack.push(s1); //s1 must be scheduled before + schedule_before_pack.push(s1); // s1 must be scheduled before Node_List* mem_pk = my_pack(s1); if (mem_pk != NULL) { for (uint ii = 0; ii < mem_pk->size(); ii++) { - Node* s = mem_pk->at(ii); // follow partner + Node* s = mem_pk->at(ii); // follow partner if (memops.member(s) && !schedule_before_pack.member(s)) schedule_before_pack.push(s); } } + break; } } } } } + Node* upper_insert_pt = first->in(MemNode::Memory); + // Following code moves loads connected to upper_insert_pt below aliased stores. + // Collect such loads here and reconnect them back to upper_insert_pt later. + memops.clear(); + for (DUIterator i = upper_insert_pt->outs(); upper_insert_pt->has_out(i); i++) { + Node* use = upper_insert_pt->out(i); + if (!use->is_Store()) + memops.push(use); + } + MemNode* lower_insert_pt = last; - Node* upper_insert_pt = first->in(MemNode::Memory); previous = last; //previous store in pk current = last->in(MemNode::Memory)->as_Mem(); - //start scheduling from "last" to "first" + // start scheduling from "last" to "first" while (true) { assert(in_bb(current), "stay in block"); assert(in_pack(previous, pk), "previous stays in pack"); @@ -1072,20 +1250,15 @@ if (in_pack(current, pk)) { // Forward users of my memory state (except "previous) to my input memory state - _igvn.hash_delete(current); for (DUIterator i = current->outs(); current->has_out(i); i++) { Node* use = current->out(i); if (use->is_Mem() && use != previous) { assert(use->in(MemNode::Memory) == current, "must be"); - _igvn.hash_delete(use); if (schedule_before_pack.member(use)) { - _igvn.hash_delete(upper_insert_pt); - use->set_req(MemNode::Memory, upper_insert_pt); + _igvn.replace_input_of(use, MemNode::Memory, upper_insert_pt); } else { - _igvn.hash_delete(lower_insert_pt); - use->set_req(MemNode::Memory, lower_insert_pt); + _igvn.replace_input_of(use, MemNode::Memory, lower_insert_pt); } - _igvn._worklist.push(use); --i; // deleted this edge; rescan position } } @@ -1097,6 +1270,14 @@ if (current == first) break; current = my_mem->as_Mem(); } // end while + + // Reconnect loads back to upper_insert_pt. + for (uint i = 0; i < memops.size(); i++) { + Node *ld = memops.at(i); + if (ld->in(MemNode::Memory) != upper_insert_pt) { + _igvn.replace_input_of(ld, MemNode::Memory, upper_insert_pt); + } + } } else if (pk->at(0)->is_Load()) { //load // all loads in the pack should have the same memory state. By default, // we use the memory state of the last load. However, if any load could @@ -1122,9 +1303,7 @@ // Give each load the same memory state for (uint i = 0; i < pk->size(); i++) { LoadNode* ld = pk->at(i)->as_Load(); - _igvn.hash_delete(ld); - ld->set_req(MemNode::Memory, mem_input); - _igvn._worklist.push(ld); + _igvn.replace_input_of(ld, MemNode::Memory, mem_input); } } } @@ -1159,35 +1338,30 @@ Node* vn = NULL; Node* low_adr = p->at(0); Node* first = executed_first(p); + int opc = n->Opcode(); if (n->is_Load()) { - int opc = n->Opcode(); Node* ctl = n->in(MemNode::Control); Node* mem = first->in(MemNode::Memory); Node* adr = low_adr->in(MemNode::Address); const TypePtr* atyp = n->adr_type(); - vn = VectorLoadNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen); - + vn = LoadVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n)); } else if (n->is_Store()) { // Promote value to be stored to vector Node* val = vector_opd(p, MemNode::ValueIn); - - int opc = n->Opcode(); Node* ctl = n->in(MemNode::Control); Node* mem = first->in(MemNode::Memory); Node* adr = low_adr->in(MemNode::Address); const TypePtr* atyp = n->adr_type(); - vn = VectorStoreNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen); - + vn = StoreVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen); } else if (n->req() == 3) { // Promote operands to vector Node* in1 = vector_opd(p, 1); Node* in2 = vector_opd(p, 2); - vn = VectorNode::make(_phase->C, n->Opcode(), in1, in2, vlen, velt_type(n)); - + vn = VectorNode::make(_phase->C, opc, in1, in2, vlen, velt_basic_type(n)); } else { ShouldNotReachHere(); } - + assert(vn != NULL, "sanity"); _phase->_igvn.register_new_node_with_optimizer(vn); _phase->set_ctrl(vn, _phase->get_ctrl(p->at(0))); for (uint j = 0; j < p->size(); j++) { @@ -1195,6 +1369,12 @@ _igvn.replace_node(pm, vn); } _igvn._worklist.push(vn); +#ifdef ASSERT + if (TraceNewVectors) { + tty->print("new Vector node: "); + vn->dump(); + } +#endif } } } @@ -1217,10 +1397,10 @@ } if (same_opd) { - if (opd->is_Vector() || opd->is_VectorLoad()) { + if (opd->is_Vector() || opd->is_LoadVector()) { return opd; // input is matching vector } - assert(!opd->is_VectorStore(), "such vector is not expected here"); + assert(!opd->is_StoreVector(), "such vector is not expected here"); // Convert scalar input to vector with the same number of elements as // p0's vector. Use p0's type because size of operand's container in // vector should match p0's size regardless operand's size. @@ -1229,12 +1409,18 @@ _phase->_igvn.register_new_node_with_optimizer(vn); _phase->set_ctrl(vn, _phase->get_ctrl(opd)); +#ifdef ASSERT + if (TraceNewVectors) { + tty->print("new Vector node: "); + vn->dump(); + } +#endif return vn; } // Insert pack operation - const Type* p0_t = velt_type(p0); - PackNode* pk = PackNode::make(_phase->C, opd, p0_t); + BasicType bt = velt_basic_type(p0); + PackNode* pk = PackNode::make(_phase->C, opd, vlen, bt); DEBUG_ONLY( const BasicType opd_bt = opd->bottom_type()->basic_type(); ) for (uint i = 1; i < vlen; i++) { @@ -1242,10 +1428,16 @@ Node* in = pi->in(opd_idx); assert(my_pack(in) == NULL, "Should already have been unpacked"); assert(opd_bt == in->bottom_type()->basic_type(), "all same type"); - pk->add_opd(in); + pk->add_opd(i, in); } _phase->_igvn.register_new_node_with_optimizer(pk); _phase->set_ctrl(pk, _phase->get_ctrl(opd)); +#ifdef ASSERT + if (TraceNewVectors) { + tty->print("new Vector node: "); + pk->dump(); + } +#endif return pk; } @@ -1282,19 +1474,16 @@ // Insert extract operation _igvn.hash_delete(def); - _igvn.hash_delete(use); int def_pos = alignment(def) / data_size(def); - const Type* def_t = velt_type(def); - Node* ex = ExtractNode::make(_phase->C, def, def_pos, def_t); + Node* ex = ExtractNode::make(_phase->C, def, def_pos, velt_basic_type(def)); _phase->_igvn.register_new_node_with_optimizer(ex); _phase->set_ctrl(ex, _phase->get_ctrl(def)); - use->set_req(idx, ex); + _igvn.replace_input_of(use, idx, ex); _igvn._worklist.push(def); - _igvn._worklist.push(use); bb_insert_after(ex, bb_idx(def)); - set_velt_type(ex, def_t); + set_velt_type(ex, velt_type(def)); } } @@ -1521,10 +1710,7 @@ // Initial type for (int i = 0; i < _block.length(); i++) { Node* n = _block.at(i); - const Type* t = n->is_Mem() ? Type::get_const_basic_type(n->as_Mem()->memory_type()) - : _igvn.type(n); - const Type* vt = container_type(t); - set_velt_type(n, vt); + set_velt_type(n, container_type(n)); } // Propagate narrowed type backwards through operations @@ -1555,7 +1741,7 @@ bool same_type = true; for (DUIterator_Fast kmax, k = in->fast_outs(kmax); k < kmax; k++) { Node *use = in->fast_out(k); - if (!in_bb(use) || velt_type(use) != vt) { + if (!in_bb(use) || !same_velt_type(use, n)) { same_type = false; break; } @@ -1587,20 +1773,24 @@ if (!p.valid()) { return bottom_align; } + int vw = vector_width_in_bytes(s); + if (vw < 2) { + return bottom_align; // No vectors for this type + } int offset = p.offset_in_bytes(); offset += iv_adjust_in_bytes; - int off_rem = offset % vector_width_in_bytes(); - int off_mod = off_rem >= 0 ? off_rem : off_rem + vector_width_in_bytes(); + int off_rem = offset % vw; + int off_mod = off_rem >= 0 ? off_rem : off_rem + vw; return off_mod; } //---------------------------container_type--------------------------- // Smallest type containing range of values -const Type* SuperWord::container_type(const Type* t) { - const Type* tp = t->make_ptr(); - if (tp && tp->isa_aryptr()) { - t = tp->is_aryptr()->elem(); +const Type* SuperWord::container_type(Node* n) { + if (n->is_Mem()) { + return Type::get_const_basic_type(n->as_Mem()->memory_type()); } + const Type* t = _igvn.type(n); if (t->basic_type() == T_INT) { if (t->higher_equal(TypeInt::BOOL)) return TypeInt::BOOL; if (t->higher_equal(TypeInt::BYTE)) return TypeInt::BYTE; @@ -1611,11 +1801,22 @@ return t; } +bool SuperWord::same_velt_type(Node* n1, Node* n2) { + const Type* vt1 = velt_type(n1); + const Type* vt2 = velt_type(n1); + if (vt1->basic_type() == T_INT && vt2->basic_type() == T_INT) { + // Compare vectors element sizes for integer types. + return data_size(n1) == data_size(n2); + } + return vt1 == vt2; +} + //-------------------------vector_opd_range----------------------- // (Start, end] half-open range defining which operands are vector void SuperWord::vector_opd_range(Node* n, uint* start, uint* end) { switch (n->Opcode()) { - case Op_LoadB: case Op_LoadUS: + case Op_LoadB: case Op_LoadUB: + case Op_LoadS: case Op_LoadUS: case Op_LoadI: case Op_LoadL: case Op_LoadF: case Op_LoadD: case Op_LoadP: @@ -1733,6 +1934,7 @@ assert(orig_limit != NULL && _igvn.type(orig_limit) != Type::TOP, ""); SWPointer align_to_ref_p(align_to_ref, this); + assert(align_to_ref_p.valid(), "sanity"); // Given: // lim0 == original pre loop limit @@ -1785,10 +1987,12 @@ // N = (V - (e - lim0)) % V // lim = lim0 - (V - (e - lim0)) % V + int vw = vector_width_in_bytes(align_to_ref); int stride = iv_stride(); int scale = align_to_ref_p.scale_in_bytes(); int elt_size = align_to_ref_p.memory_size(); - int v_align = vector_width_in_bytes() / elt_size; + int v_align = vw / elt_size; + assert(v_align > 1, "sanity"); int k = align_to_ref_p.offset_in_bytes() / elt_size; Node *kn = _igvn.intcon(k); @@ -1808,6 +2012,25 @@ _phase->_igvn.register_new_node_with_optimizer(e); _phase->set_ctrl(e, pre_ctrl); } + if (vw > ObjectAlignmentInBytes) { + // incorporate base e +/- base && Mask >>> log2(elt) + Node* mask = _igvn.MakeConX(~(-1 << exact_log2(vw))); + Node* xbase = new(_phase->C, 2) CastP2XNode(NULL, align_to_ref_p.base()); + _phase->_igvn.register_new_node_with_optimizer(xbase); + Node* masked_xbase = new (_phase->C, 3) AndXNode(xbase, mask); + _phase->_igvn.register_new_node_with_optimizer(masked_xbase); +#ifdef _LP64 + masked_xbase = new (_phase->C, 2) ConvL2INode(masked_xbase); + _phase->_igvn.register_new_node_with_optimizer(masked_xbase); +#endif + Node* log2_elt = _igvn.intcon(exact_log2(elt_size)); + Node* bref = new (_phase->C, 3) URShiftINode(masked_xbase, log2_elt); + _phase->_igvn.register_new_node_with_optimizer(bref); + _phase->set_ctrl(bref, pre_ctrl); + e = new (_phase->C, 3) AddINode(e, bref); + _phase->_igvn.register_new_node_with_optimizer(e); + _phase->set_ctrl(e, pre_ctrl); + } // compute e +/- lim0 if (scale < 0) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/superword.hpp --- a/src/share/vm/opto/superword.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/superword.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -264,8 +264,14 @@ _iv = lp->as_CountedLoop()->phi()->as_Phi(); } int iv_stride() { return lp()->as_CountedLoop()->stride_con(); } - int vector_width_in_bytes() { return Matcher::vector_width_in_bytes(); } - + int vector_width(Node* n) { + BasicType bt = velt_basic_type(n); + return MIN2(ABS(iv_stride()), Matcher::max_vector_size(bt)); + } + int vector_width_in_bytes(Node* n) { + BasicType bt = velt_basic_type(n); + return vector_width(n)*type2aelembytes(bt); + } MemNode* align_to_ref() { return _align_to_ref; } void set_align_to_ref(MemNode* m) { _align_to_ref = m; } @@ -298,7 +304,9 @@ // vector element type const Type* velt_type(Node* n) { return _node_info.adr_at(bb_idx(n))->_velt_type; } + BasicType velt_basic_type(Node* n) { return velt_type(n)->array_element_basic_type(); } void set_velt_type(Node* n, const Type* t) { int i = bb_idx(n); grow_node_info(i); _node_info.adr_at(i)->_velt_type = t; } + bool same_velt_type(Node* n1, Node* n2); // my_pack Node_List* my_pack(Node* n) { return !in_bb(n) ? NULL : _node_info.adr_at(bb_idx(n))->_my_pack; } @@ -311,7 +319,9 @@ // Find the adjacent memory references and create pack pairs for them. void find_adjacent_refs(); // Find a memory reference to align the loop induction variable to. - void find_align_to_ref(Node_List &memops); + MemNode* find_align_to_ref(Node_List &memops); + // Calculate loop's iv adjustment for this memory ops. + int get_iv_adjustment(MemNode* mem); // Can the preloop align the reference to position zero in the vector? bool ref_is_alignable(SWPointer& p); // Construct dependency graph. @@ -394,7 +404,7 @@ // (Start, end] half-open range defining which operands are vector void vector_opd_range(Node* n, uint* start, uint* end); // Smallest type containing range of values - static const Type* container_type(const Type* t); + const Type* container_type(Node* n); // Adjust pre-loop limit so that in main loop, a load/store reference // to align_to_ref will be a position zero in the vector. void align_initial_loop_index(MemNode* align_to_ref); @@ -462,6 +472,7 @@ Node* base() { return _base; } Node* adr() { return _adr; } + MemNode* mem() { return _mem; } int scale_in_bytes() { return _scale; } Node* invar() { return _invar; } bool negate_invar() { return _negate_invar; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/type.cpp --- a/src/share/vm/opto/type.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/type.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,6 +60,10 @@ T_ILLEGAL, // Tuple T_ARRAY, // Array + T_ILLEGAL, // VectorS + T_ILLEGAL, // VectorD + T_ILLEGAL, // VectorX + T_ILLEGAL, // VectorY T_ADDRESS, // AnyPtr // shows up in factory methods for NULL_PTR T_ADDRESS, // RawPtr @@ -208,7 +212,7 @@ // locking. Arena* save = current->type_arena(); - Arena* shared_type_arena = new Arena(); + Arena* shared_type_arena = new (mtCompiler)Arena(); current->set_type_arena(shared_type_arena); _shared_type_dict = @@ -414,6 +418,24 @@ // get_zero_type() should not happen for T_CONFLICT _zero_type[T_CONFLICT]= NULL; + // Vector predefined types, it needs initialized _const_basic_type[]. + if (Matcher::vector_size_supported(T_BYTE,4)) { + TypeVect::VECTS = TypeVect::make(T_BYTE,4); + } + if (Matcher::vector_size_supported(T_FLOAT,2)) { + TypeVect::VECTD = TypeVect::make(T_FLOAT,2); + } + if (Matcher::vector_size_supported(T_FLOAT,4)) { + TypeVect::VECTX = TypeVect::make(T_FLOAT,4); + } + if (Matcher::vector_size_supported(T_FLOAT,8)) { + TypeVect::VECTY = TypeVect::make(T_FLOAT,8); + } + mreg2type[Op_VecS] = TypeVect::VECTS; + mreg2type[Op_VecD] = TypeVect::VECTD; + mreg2type[Op_VecX] = TypeVect::VECTX; + mreg2type[Op_VecY] = TypeVect::VECTY; + // Restore working type arena. current->set_type_arena(save); current->set_type_dict(NULL); @@ -668,6 +690,10 @@ Bad, // Tuple - handled in v-call Bad, // Array - handled in v-call + Bad, // VectorS - handled in v-call + Bad, // VectorD - handled in v-call + Bad, // VectorX - handled in v-call + Bad, // VectorY - handled in v-call Bad, // AnyPtr - handled in v-call Bad, // RawPtr - handled in v-call @@ -728,8 +754,8 @@ //------------------------------data------------------------------------------- const char * const Type::msg[Type::lastype] = { "bad","control","top","int:","long:","half", "narrowoop:", - "tuple:", "aryptr", - "anyptr:", "rawptr:", "java:", "inst:", "ary:", "klass:", + "tuple:", "array:", "vectors:", "vectord:", "vectorx:", "vectory:", + "anyptr:", "rawptr:", "java:", "inst:", "aryptr:", "klass:", "func", "abIO", "return_address", "memory", "float_top", "ftcon:", "float", "double_top", "dblcon:", "double", @@ -790,7 +816,7 @@ //------------------------------isa_oop_ptr------------------------------------ // Return true if type is an oop pointer type. False for raw pointers. static char isa_oop_ptr_tbl[Type::lastype] = { - 0,0,0,0,0,0,0/*narrowoop*/,0/*tuple*/, 0/*ary*/, + 0,0,0,0,0,0,0/*narrowoop*/,0/*tuple*/, 0/*array*/, 0, 0, 0, 0/*vector*/, 0/*anyptr*/,0/*rawptr*/,1/*OopPtr*/,1/*InstPtr*/,1/*AryPtr*/,1/*KlassPtr*/, 0/*func*/,0,0/*return_address*/,0, /*floats*/0,0,0, /*doubles*/0,0,0, @@ -1926,6 +1952,121 @@ return false; } +//==============================TypeVect======================================= +// Convenience common pre-built types. +const TypeVect *TypeVect::VECTS = NULL; // 32-bit vectors +const TypeVect *TypeVect::VECTD = NULL; // 64-bit vectors +const TypeVect *TypeVect::VECTX = NULL; // 128-bit vectors +const TypeVect *TypeVect::VECTY = NULL; // 256-bit vectors + +//------------------------------make------------------------------------------- +const TypeVect* TypeVect::make(const Type *elem, uint length) { + BasicType elem_bt = elem->array_element_basic_type(); + assert(is_java_primitive(elem_bt), "only primitive types in vector"); + assert(length > 1 && is_power_of_2(length), "vector length is power of 2"); + assert(Matcher::vector_size_supported(elem_bt, length), "length in range"); + int size = length * type2aelembytes(elem_bt); + switch (Matcher::vector_ideal_reg(size)) { + case Op_VecS: + return (TypeVect*)(new TypeVectS(elem, length))->hashcons(); + case Op_VecD: + case Op_RegD: + return (TypeVect*)(new TypeVectD(elem, length))->hashcons(); + case Op_VecX: + return (TypeVect*)(new TypeVectX(elem, length))->hashcons(); + case Op_VecY: + return (TypeVect*)(new TypeVectY(elem, length))->hashcons(); + } + ShouldNotReachHere(); + return NULL; +} + +//------------------------------meet------------------------------------------- +// Compute the MEET of two types. It returns a new Type object. +const Type *TypeVect::xmeet( const Type *t ) const { + // Perform a fast test for common case; meeting the same types together. + if( this == t ) return this; // Meeting same type-rep? + + // Current "this->_base" is Vector + switch (t->base()) { // switch on original type + + case Bottom: // Ye Olde Default + return t; + + default: // All else is a mistake + typerr(t); + + case VectorS: + case VectorD: + case VectorX: + case VectorY: { // Meeting 2 vectors? + const TypeVect* v = t->is_vect(); + assert( base() == v->base(), ""); + assert(length() == v->length(), ""); + assert(element_basic_type() == v->element_basic_type(), ""); + return TypeVect::make(_elem->xmeet(v->_elem), _length); + } + case Top: + break; + } + return this; +} + +//------------------------------xdual------------------------------------------ +// Dual: compute field-by-field dual +const Type *TypeVect::xdual() const { + return new TypeVect(base(), _elem->dual(), _length); +} + +//------------------------------eq--------------------------------------------- +// Structural equality check for Type representations +bool TypeVect::eq(const Type *t) const { + const TypeVect *v = t->is_vect(); + return (_elem == v->_elem) && (_length == v->_length); +} + +//------------------------------hash------------------------------------------- +// Type-specific hashing function. +int TypeVect::hash(void) const { + return (intptr_t)_elem + (intptr_t)_length; +} + +//------------------------------singleton-------------------------------------- +// TRUE if Type is a singleton type, FALSE otherwise. Singletons are simple +// constants (Ldi nodes). Vector is singleton if all elements are the same +// constant value (when vector is created with Replicate code). +bool TypeVect::singleton(void) const { +// There is no Con node for vectors yet. +// return _elem->singleton(); + return false; +} + +bool TypeVect::empty(void) const { + return _elem->empty(); +} + +//------------------------------dump2------------------------------------------ +#ifndef PRODUCT +void TypeVect::dump2(Dict &d, uint depth, outputStream *st) const { + switch (base()) { + case VectorS: + st->print("vectors["); break; + case VectorD: + st->print("vectord["); break; + case VectorX: + st->print("vectorx["); break; + case VectorY: + st->print("vectory["); break; + default: + ShouldNotReachHere(); + } + st->print("%d]:{", _length); + _elem->dump2(d, depth, st); + st->print("}"); +} +#endif + + //============================================================================= // Convenience common pre-built types. const TypePtr *TypePtr::NULL_PTR; @@ -2472,18 +2613,26 @@ //------------------------------make_from_constant----------------------------- // Make a java pointer from an oop constant const TypeOopPtr* TypeOopPtr::make_from_constant(ciObject* o, bool require_constant) { - if (o->is_method_data() || o->is_method() || o->is_cpcache()) { + if (o->is_method_data() || o->is_method()) { // Treat much like a typeArray of bytes, like below, but fake the type... - const Type* etype = (Type*)get_const_basic_type(T_BYTE); + const BasicType bt = T_BYTE; + const Type* etype = get_const_basic_type(bt); const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS); - ciKlass *klass = ciTypeArrayKlass::make((BasicType) T_BYTE); - assert(o->can_be_constant(), "method data oops should be tenured"); - const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0); - return arr; + ciKlass* klass = ciArrayKlass::make(ciType::make(bt)); + assert(o->can_be_constant(), "should be tenured"); + return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0); + } else if (o->is_cpcache()) { + // Treat much like a objArray, like below, but fake the type... + const BasicType bt = T_OBJECT; + const Type* etype = get_const_basic_type(bt); + const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS); + ciKlass* klass = ciArrayKlass::make(ciType::make(bt)); + assert(o->can_be_constant(), "should be tenured"); + return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0); } else { assert(o->is_java_object(), "must be java language object"); assert(!o->is_null_object(), "null object not yet handled here."); - ciKlass *klass = o->klass(); + ciKlass* klass = o->klass(); if (klass->is_instance_klass()) { // Element is an instance if (require_constant) { @@ -2494,8 +2643,7 @@ return TypeInstPtr::make(o); } else if (klass->is_obj_array_klass()) { // Element is an object array. Recursively call ourself. - const Type *etype = - TypeOopPtr::make_from_klass_raw(klass->as_obj_array_klass()->element_klass()); + const Type *etype = make_from_klass_raw(klass->as_obj_array_klass()->element_klass()); const TypeAry* arr0 = TypeAry::make(etype, TypeInt::make(o->as_array()->length())); // We used to pass NotNull in here, asserting that the sub-arrays // are all not-null. This is not true in generally, as code can @@ -2505,12 +2653,10 @@ } else if (!o->should_be_constant()) { return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0); } - const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0); - return arr; + return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0); } else if (klass->is_type_array_klass()) { // Element is an typeArray - const Type* etype = - (Type*)get_const_basic_type(klass->as_type_array_klass()->element_type()); + const Type* etype = get_const_basic_type(klass->as_type_array_klass()->element_type()); const TypeAry* arr0 = TypeAry::make(etype, TypeInt::make(o->as_array()->length())); // We used to pass NotNull in here, asserting that the array pointer // is not-null. That was not true in general. @@ -2519,12 +2665,11 @@ } else if (!o->should_be_constant()) { return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0); } - const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0); - return arr; + return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0); } } - ShouldNotReachHere(); + fatal("unhandled object type"); return NULL; } @@ -4140,7 +4285,7 @@ // Print a 'flattened' signature static const char * const flat_type_msg[Type::lastype] = { "bad","control","top","int","long","_", "narrowoop", - "tuple:", "array:", + "tuple:", "array:", "vectors:", "vectord:", "vectorx:", "vectory:", "ptr", "rawptr", "ptr", "ptr", "ptr", "ptr", "func", "abIO", "return_address", "mem", "float_top", "ftcon:", "flt", diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/type.hpp --- a/src/share/vm/opto/type.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/type.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,6 +51,11 @@ class TypeNarrowOop; class TypeAry; class TypeTuple; +class TypeVect; +class TypeVectS; +class TypeVectD; +class TypeVectX; +class TypeVectY; class TypePtr; class TypeRawPtr; class TypeOopPtr; @@ -78,6 +83,10 @@ Tuple, // Method signature or object layout Array, // Array types + VectorS, // 32bit Vector types + VectorD, // 64bit Vector types + VectorX, // 128bit Vector types + VectorY, // 256bit Vector types AnyPtr, // Any old raw, klass, inst, or array pointer RawPtr, // Raw (non-oop) pointers @@ -222,6 +231,8 @@ const TypeF *isa_float_constant() const; // Returns NULL if not a FloatCon const TypeTuple *is_tuple() const; // Collection of fields, NOT a pointer const TypeAry *is_ary() const; // Array, NOT array pointer + const TypeVect *is_vect() const; // Vector + const TypeVect *isa_vect() const; // Returns NULL if not a Vector const TypePtr *is_ptr() const; // Asserts it is a ptr type const TypePtr *isa_ptr() const; // Returns NULL if not ptr type const TypeRawPtr *isa_rawptr() const; // NOT Java oop @@ -574,6 +585,69 @@ #endif }; +//------------------------------TypeVect--------------------------------------- +// Class of Vector Types +class TypeVect : public Type { + const Type* _elem; // Vector's element type + const uint _length; // Elements in vector (power of 2) + +protected: + TypeVect(TYPES t, const Type* elem, uint length) : Type(t), + _elem(elem), _length(length) {} + +public: + const Type* element_type() const { return _elem; } + BasicType element_basic_type() const { return _elem->array_element_basic_type(); } + uint length() const { return _length; } + uint length_in_bytes() const { + return _length * type2aelembytes(element_basic_type()); + } + + virtual bool eq(const Type *t) const; + virtual int hash() const; // Type specific hashing + virtual bool singleton(void) const; // TRUE if type is a singleton + virtual bool empty(void) const; // TRUE if type is vacuous + + static const TypeVect *make(const BasicType elem_bt, uint length) { + // Use bottom primitive type. + return make(get_const_basic_type(elem_bt), length); + } + // Used directly by Replicate nodes to construct singleton vector. + static const TypeVect *make(const Type* elem, uint length); + + virtual const Type *xmeet( const Type *t) const; + virtual const Type *xdual() const; // Compute dual right now. + + static const TypeVect *VECTS; + static const TypeVect *VECTD; + static const TypeVect *VECTX; + static const TypeVect *VECTY; + +#ifndef PRODUCT + virtual void dump2(Dict &d, uint, outputStream *st) const; // Specialized per-Type dumping +#endif +}; + +class TypeVectS : public TypeVect { + friend class TypeVect; + TypeVectS(const Type* elem, uint length) : TypeVect(VectorS, elem, length) {} +}; + +class TypeVectD : public TypeVect { + friend class TypeVect; + TypeVectD(const Type* elem, uint length) : TypeVect(VectorD, elem, length) {} +}; + +class TypeVectX : public TypeVect { + friend class TypeVect; + TypeVectX(const Type* elem, uint length) : TypeVect(VectorX, elem, length) {} +}; + +class TypeVectY : public TypeVect { + friend class TypeVect; + TypeVectY(const Type* elem, uint length) : TypeVect(VectorY, elem, length) {} +}; + //------------------------------TypePtr---------------------------------------- // Class of machine Pointer Types: raw data, instances or arrays. // If the _base enum is AnyPtr, then this refers to all of the above. @@ -1113,6 +1187,15 @@ return (TypeAry*)this; } +inline const TypeVect *Type::is_vect() const { + assert( _base >= VectorS && _base <= VectorY, "Not a Vector" ); + return (TypeVect*)this; +} + +inline const TypeVect *Type::isa_vect() const { + return (_base >= VectorS && _base <= VectorY) ? (TypeVect*)this : NULL; +} + inline const TypePtr *Type::is_ptr() const { // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between. assert(_base >= AnyPtr && _base <= KlassPtr, "Not a pointer"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/vectornode.cpp --- a/src/share/vm/opto/vectornode.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/vectornode.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,147 +28,16 @@ //------------------------------VectorNode-------------------------------------- -// Return vector type for an element type and vector length. -const Type* VectorNode::vect_type(BasicType elt_bt, uint len) { - assert(len <= VectorNode::max_vlen(elt_bt), "len in range"); - switch(elt_bt) { - case T_BOOLEAN: - case T_BYTE: - switch(len) { - case 2: return TypeInt::CHAR; - case 4: return TypeInt::INT; - case 8: return TypeLong::LONG; - } - break; - case T_CHAR: - case T_SHORT: - switch(len) { - case 2: return TypeInt::INT; - case 4: return TypeLong::LONG; - } - break; - case T_INT: - switch(len) { - case 2: return TypeLong::LONG; - } - break; - case T_LONG: - break; - case T_FLOAT: - switch(len) { - case 2: return Type::DOUBLE; - } - break; - case T_DOUBLE: - break; - } - ShouldNotReachHere(); - return NULL; -} - -// Scalar promotion -VectorNode* VectorNode::scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t) { - BasicType bt = opd_t->array_element_basic_type(); - assert(vlen <= VectorNode::max_vlen(bt), "vlen in range"); - switch (bt) { - case T_BOOLEAN: - case T_BYTE: - if (vlen == 16) return new (C, 2) Replicate16BNode(s); - if (vlen == 8) return new (C, 2) Replicate8BNode(s); - if (vlen == 4) return new (C, 2) Replicate4BNode(s); - break; - case T_CHAR: - if (vlen == 8) return new (C, 2) Replicate8CNode(s); - if (vlen == 4) return new (C, 2) Replicate4CNode(s); - if (vlen == 2) return new (C, 2) Replicate2CNode(s); - break; - case T_SHORT: - if (vlen == 8) return new (C, 2) Replicate8SNode(s); - if (vlen == 4) return new (C, 2) Replicate4SNode(s); - if (vlen == 2) return new (C, 2) Replicate2SNode(s); - break; - case T_INT: - if (vlen == 4) return new (C, 2) Replicate4INode(s); - if (vlen == 2) return new (C, 2) Replicate2INode(s); - break; - case T_LONG: - if (vlen == 2) return new (C, 2) Replicate2LNode(s); - break; - case T_FLOAT: - if (vlen == 4) return new (C, 2) Replicate4FNode(s); - if (vlen == 2) return new (C, 2) Replicate2FNode(s); - break; - case T_DOUBLE: - if (vlen == 2) return new (C, 2) Replicate2DNode(s); - break; - } - ShouldNotReachHere(); - return NULL; -} - -// Return initial Pack node. Additional operands added with add_opd() calls. -PackNode* PackNode::make(Compile* C, Node* s, const Type* opd_t) { - BasicType bt = opd_t->array_element_basic_type(); - switch (bt) { - case T_BOOLEAN: - case T_BYTE: - return new (C, 2) PackBNode(s); - case T_CHAR: - return new (C, 2) PackCNode(s); - case T_SHORT: - return new (C, 2) PackSNode(s); - case T_INT: - return new (C, 2) PackINode(s); - case T_LONG: - return new (C, 2) PackLNode(s); - case T_FLOAT: - return new (C, 2) PackFNode(s); - case T_DOUBLE: - return new (C, 2) PackDNode(s); - } - ShouldNotReachHere(); - return NULL; -} - -// Create a binary tree form for Packs. [lo, hi) (half-open) range -Node* PackNode::binaryTreePack(Compile* C, int lo, int hi) { - int ct = hi - lo; - assert(is_power_of_2(ct), "power of 2"); - int mid = lo + ct/2; - Node* n1 = ct == 2 ? in(lo) : binaryTreePack(C, lo, mid); - Node* n2 = ct == 2 ? in(lo+1) : binaryTreePack(C, mid, hi ); - int rslt_bsize = ct * type2aelembytes(elt_basic_type()); - if (bottom_type()->is_floatingpoint()) { - switch (rslt_bsize) { - case 8: return new (C, 3) PackFNode(n1, n2); - case 16: return new (C, 3) PackDNode(n1, n2); - } - } else { - assert(bottom_type()->isa_int() || bottom_type()->isa_long(), "int or long"); - switch (rslt_bsize) { - case 2: return new (C, 3) Pack2x1BNode(n1, n2); - case 4: return new (C, 3) Pack2x2BNode(n1, n2); - case 8: return new (C, 3) PackINode(n1, n2); - case 16: return new (C, 3) PackLNode(n1, n2); - } - } - ShouldNotReachHere(); - return NULL; -} - // Return the vector operator for the specified scalar operation -// and vector length. One use is to check if the code generator +// and vector length. Also used to check if the code generator // supports the vector operation. -int VectorNode::opcode(int sopc, uint vlen, const Type* opd_t) { - BasicType bt = opd_t->array_element_basic_type(); - if (!(is_power_of_2(vlen) && vlen <= max_vlen(bt))) - return 0; // unimplemented +int VectorNode::opcode(int sopc, uint vlen, BasicType bt) { switch (sopc) { case Op_AddI: switch (bt) { case T_BOOLEAN: case T_BYTE: return Op_AddVB; - case T_CHAR: return Op_AddVC; + case T_CHAR: case T_SHORT: return Op_AddVS; case T_INT: return Op_AddVI; } @@ -186,7 +55,7 @@ switch (bt) { case T_BOOLEAN: case T_BYTE: return Op_SubVB; - case T_CHAR: return Op_SubVC; + case T_CHAR: case T_SHORT: return Op_SubVS; case T_INT: return Op_SubVI; } @@ -216,18 +85,18 @@ switch (bt) { case T_BOOLEAN: case T_BYTE: return Op_LShiftVB; - case T_CHAR: return Op_LShiftVC; + case T_CHAR: case T_SHORT: return Op_LShiftVS; case T_INT: return Op_LShiftVI; } ShouldNotReachHere(); - case Op_URShiftI: + case Op_RShiftI: switch (bt) { case T_BOOLEAN: - case T_BYTE: return Op_URShiftVB; - case T_CHAR: return Op_URShiftVC; - case T_SHORT: return Op_URShiftVS; - case T_INT: return Op_URShiftVI; + case T_BYTE: return Op_RShiftVB; + case T_CHAR: + case T_SHORT: return Op_RShiftVS; + case T_INT: return Op_RShiftVI; } ShouldNotReachHere(); case Op_AndI: @@ -241,13 +110,14 @@ return Op_XorV; case Op_LoadB: + case Op_LoadUB: case Op_LoadUS: case Op_LoadS: case Op_LoadI: case Op_LoadL: case Op_LoadF: case Op_LoadD: - return VectorLoadNode::opcode(sopc, vlen); + return Op_LoadVector; case Op_StoreB: case Op_StoreC: @@ -255,211 +125,170 @@ case Op_StoreL: case Op_StoreF: case Op_StoreD: - return VectorStoreNode::opcode(sopc, vlen); - } - return 0; // Unimplemented -} - -// Helper for above. -int VectorLoadNode::opcode(int sopc, uint vlen) { - switch (sopc) { - case Op_LoadB: - switch (vlen) { - case 2: return 0; // Unimplemented - case 4: return Op_Load4B; - case 8: return Op_Load8B; - case 16: return Op_Load16B; - } - break; - case Op_LoadUS: - switch (vlen) { - case 2: return Op_Load2C; - case 4: return Op_Load4C; - case 8: return Op_Load8C; - } - break; - case Op_LoadS: - switch (vlen) { - case 2: return Op_Load2S; - case 4: return Op_Load4S; - case 8: return Op_Load8S; - } - break; - case Op_LoadI: - switch (vlen) { - case 2: return Op_Load2I; - case 4: return Op_Load4I; - } - break; - case Op_LoadL: - if (vlen == 2) return Op_Load2L; - break; - case Op_LoadF: - switch (vlen) { - case 2: return Op_Load2F; - case 4: return Op_Load4F; - } - break; - case Op_LoadD: - if (vlen == 2) return Op_Load2D; - break; + return Op_StoreVector; } return 0; // Unimplemented } -// Helper for above -int VectorStoreNode::opcode(int sopc, uint vlen) { - switch (sopc) { - case Op_StoreB: - switch (vlen) { - case 2: return 0; // Unimplemented - case 4: return Op_Store4B; - case 8: return Op_Store8B; - case 16: return Op_Store16B; - } - break; - case Op_StoreC: - switch (vlen) { - case 2: return Op_Store2C; - case 4: return Op_Store4C; - case 8: return Op_Store8C; - } - break; - case Op_StoreI: - switch (vlen) { - case 2: return Op_Store2I; - case 4: return Op_Store4I; - } - break; - case Op_StoreL: - if (vlen == 2) return Op_Store2L; - break; - case Op_StoreF: - switch (vlen) { - case 2: return Op_Store2F; - case 4: return Op_Store4F; - } - break; - case Op_StoreD: - if (vlen == 2) return Op_Store2D; - break; +bool VectorNode::implemented(int opc, uint vlen, BasicType bt) { + if (is_java_primitive(bt) && + (vlen > 1) && is_power_of_2(vlen) && + Matcher::vector_size_supported(bt, vlen)) { + int vopc = VectorNode::opcode(opc, vlen, bt); + return vopc > 0 && Matcher::has_match_rule(vopc); } - return 0; // Unimplemented + return false; } // Return the vector version of a scalar operation node. -VectorNode* VectorNode::make(Compile* C, int sopc, Node* n1, Node* n2, uint vlen, const Type* opd_t) { - int vopc = opcode(sopc, vlen, opd_t); +VectorNode* VectorNode::make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt) { + const TypeVect* vt = TypeVect::make(bt, vlen); + int vopc = VectorNode::opcode(opc, vlen, bt); switch (vopc) { - case Op_AddVB: return new (C, 3) AddVBNode(n1, n2, vlen); - case Op_AddVC: return new (C, 3) AddVCNode(n1, n2, vlen); - case Op_AddVS: return new (C, 3) AddVSNode(n1, n2, vlen); - case Op_AddVI: return new (C, 3) AddVINode(n1, n2, vlen); - case Op_AddVL: return new (C, 3) AddVLNode(n1, n2, vlen); - case Op_AddVF: return new (C, 3) AddVFNode(n1, n2, vlen); - case Op_AddVD: return new (C, 3) AddVDNode(n1, n2, vlen); + case Op_AddVB: return new (C, 3) AddVBNode(n1, n2, vt); + case Op_AddVS: return new (C, 3) AddVSNode(n1, n2, vt); + case Op_AddVI: return new (C, 3) AddVINode(n1, n2, vt); + case Op_AddVL: return new (C, 3) AddVLNode(n1, n2, vt); + case Op_AddVF: return new (C, 3) AddVFNode(n1, n2, vt); + case Op_AddVD: return new (C, 3) AddVDNode(n1, n2, vt); + + case Op_SubVB: return new (C, 3) SubVBNode(n1, n2, vt); + case Op_SubVS: return new (C, 3) SubVSNode(n1, n2, vt); + case Op_SubVI: return new (C, 3) SubVINode(n1, n2, vt); + case Op_SubVL: return new (C, 3) SubVLNode(n1, n2, vt); + case Op_SubVF: return new (C, 3) SubVFNode(n1, n2, vt); + case Op_SubVD: return new (C, 3) SubVDNode(n1, n2, vt); - case Op_SubVB: return new (C, 3) SubVBNode(n1, n2, vlen); - case Op_SubVC: return new (C, 3) SubVCNode(n1, n2, vlen); - case Op_SubVS: return new (C, 3) SubVSNode(n1, n2, vlen); - case Op_SubVI: return new (C, 3) SubVINode(n1, n2, vlen); - case Op_SubVL: return new (C, 3) SubVLNode(n1, n2, vlen); - case Op_SubVF: return new (C, 3) SubVFNode(n1, n2, vlen); - case Op_SubVD: return new (C, 3) SubVDNode(n1, n2, vlen); + case Op_MulVF: return new (C, 3) MulVFNode(n1, n2, vt); + case Op_MulVD: return new (C, 3) MulVDNode(n1, n2, vt); + + case Op_DivVF: return new (C, 3) DivVFNode(n1, n2, vt); + case Op_DivVD: return new (C, 3) DivVDNode(n1, n2, vt); + + case Op_LShiftVB: return new (C, 3) LShiftVBNode(n1, n2, vt); + case Op_LShiftVS: return new (C, 3) LShiftVSNode(n1, n2, vt); + case Op_LShiftVI: return new (C, 3) LShiftVINode(n1, n2, vt); + + case Op_RShiftVB: return new (C, 3) RShiftVBNode(n1, n2, vt); + case Op_RShiftVS: return new (C, 3) RShiftVSNode(n1, n2, vt); + case Op_RShiftVI: return new (C, 3) RShiftVINode(n1, n2, vt); - case Op_MulVF: return new (C, 3) MulVFNode(n1, n2, vlen); - case Op_MulVD: return new (C, 3) MulVDNode(n1, n2, vlen); + case Op_AndV: return new (C, 3) AndVNode(n1, n2, vt); + case Op_OrV: return new (C, 3) OrVNode (n1, n2, vt); + case Op_XorV: return new (C, 3) XorVNode(n1, n2, vt); + } + ShouldNotReachHere(); + return NULL; - case Op_DivVF: return new (C, 3) DivVFNode(n1, n2, vlen); - case Op_DivVD: return new (C, 3) DivVDNode(n1, n2, vlen); +} - case Op_LShiftVB: return new (C, 3) LShiftVBNode(n1, n2, vlen); - case Op_LShiftVC: return new (C, 3) LShiftVCNode(n1, n2, vlen); - case Op_LShiftVS: return new (C, 3) LShiftVSNode(n1, n2, vlen); - case Op_LShiftVI: return new (C, 3) LShiftVINode(n1, n2, vlen); - - case Op_URShiftVB: return new (C, 3) URShiftVBNode(n1, n2, vlen); - case Op_URShiftVC: return new (C, 3) URShiftVCNode(n1, n2, vlen); - case Op_URShiftVS: return new (C, 3) URShiftVSNode(n1, n2, vlen); - case Op_URShiftVI: return new (C, 3) URShiftVINode(n1, n2, vlen); - - case Op_AndV: return new (C, 3) AndVNode(n1, n2, vlen, opd_t->array_element_basic_type()); - case Op_OrV: return new (C, 3) OrVNode (n1, n2, vlen, opd_t->array_element_basic_type()); - case Op_XorV: return new (C, 3) XorVNode(n1, n2, vlen, opd_t->array_element_basic_type()); +// Scalar promotion +VectorNode* VectorNode::scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t) { + BasicType bt = opd_t->array_element_basic_type(); + const TypeVect* vt = opd_t->singleton() ? TypeVect::make(opd_t, vlen) + : TypeVect::make(bt, vlen); + switch (bt) { + case T_BOOLEAN: + case T_BYTE: + return new (C, 2) ReplicateBNode(s, vt); + case T_CHAR: + case T_SHORT: + return new (C, 2) ReplicateSNode(s, vt); + case T_INT: + return new (C, 2) ReplicateINode(s, vt); + case T_LONG: + return new (C, 2) ReplicateLNode(s, vt); + case T_FLOAT: + return new (C, 2) ReplicateFNode(s, vt); + case T_DOUBLE: + return new (C, 2) ReplicateDNode(s, vt); } ShouldNotReachHere(); return NULL; } -// Return the vector version of a scalar load node. -VectorLoadNode* VectorLoadNode::make(Compile* C, int opc, Node* ctl, Node* mem, - Node* adr, const TypePtr* atyp, uint vlen) { - int vopc = opcode(opc, vlen); - - switch(vopc) { - case Op_Load16B: return new (C, 3) Load16BNode(ctl, mem, adr, atyp); - case Op_Load8B: return new (C, 3) Load8BNode(ctl, mem, adr, atyp); - case Op_Load4B: return new (C, 3) Load4BNode(ctl, mem, adr, atyp); - - case Op_Load8C: return new (C, 3) Load8CNode(ctl, mem, adr, atyp); - case Op_Load4C: return new (C, 3) Load4CNode(ctl, mem, adr, atyp); - case Op_Load2C: return new (C, 3) Load2CNode(ctl, mem, adr, atyp); - - case Op_Load8S: return new (C, 3) Load8SNode(ctl, mem, adr, atyp); - case Op_Load4S: return new (C, 3) Load4SNode(ctl, mem, adr, atyp); - case Op_Load2S: return new (C, 3) Load2SNode(ctl, mem, adr, atyp); - - case Op_Load4I: return new (C, 3) Load4INode(ctl, mem, adr, atyp); - case Op_Load2I: return new (C, 3) Load2INode(ctl, mem, adr, atyp); - - case Op_Load2L: return new (C, 3) Load2LNode(ctl, mem, adr, atyp); - - case Op_Load4F: return new (C, 3) Load4FNode(ctl, mem, adr, atyp); - case Op_Load2F: return new (C, 3) Load2FNode(ctl, mem, adr, atyp); - - case Op_Load2D: return new (C, 3) Load2DNode(ctl, mem, adr, atyp); +// Return initial Pack node. Additional operands added with add_opd() calls. +PackNode* PackNode::make(Compile* C, Node* s, uint vlen, BasicType bt) { + const TypeVect* vt = TypeVect::make(bt, vlen); + switch (bt) { + case T_BOOLEAN: + case T_BYTE: + return new (C, vlen+1) PackBNode(s, vt); + case T_CHAR: + case T_SHORT: + return new (C, vlen+1) PackSNode(s, vt); + case T_INT: + return new (C, vlen+1) PackINode(s, vt); + case T_LONG: + return new (C, vlen+1) PackLNode(s, vt); + case T_FLOAT: + return new (C, vlen+1) PackFNode(s, vt); + case T_DOUBLE: + return new (C, vlen+1) PackDNode(s, vt); } ShouldNotReachHere(); return NULL; } -// Return the vector version of a scalar store node. -VectorStoreNode* VectorStoreNode::make(Compile* C, int opc, Node* ctl, Node* mem, - Node* adr, const TypePtr* atyp, Node* val, - uint vlen) { - int vopc = opcode(opc, vlen); +// Create a binary tree form for Packs. [lo, hi) (half-open) range +Node* PackNode::binaryTreePack(Compile* C, int lo, int hi) { + int ct = hi - lo; + assert(is_power_of_2(ct), "power of 2"); + if (ct == 2) { + PackNode* pk = PackNode::make(C, in(lo), 2, vect_type()->element_basic_type()); + pk->add_opd(1, in(lo+1)); + return pk; - switch(vopc) { - case Op_Store16B: return new (C, 4) Store16BNode(ctl, mem, adr, atyp, val); - case Op_Store8B: return new (C, 4) Store8BNode(ctl, mem, adr, atyp, val); - case Op_Store4B: return new (C, 4) Store4BNode(ctl, mem, adr, atyp, val); + } else { + int mid = lo + ct/2; + Node* n1 = binaryTreePack(C, lo, mid); + Node* n2 = binaryTreePack(C, mid, hi ); - case Op_Store8C: return new (C, 4) Store8CNode(ctl, mem, adr, atyp, val); - case Op_Store4C: return new (C, 4) Store4CNode(ctl, mem, adr, atyp, val); - case Op_Store2C: return new (C, 4) Store2CNode(ctl, mem, adr, atyp, val); - - case Op_Store4I: return new (C, 4) Store4INode(ctl, mem, adr, atyp, val); - case Op_Store2I: return new (C, 4) Store2INode(ctl, mem, adr, atyp, val); - - case Op_Store2L: return new (C, 4) Store2LNode(ctl, mem, adr, atyp, val); - - case Op_Store4F: return new (C, 4) Store4FNode(ctl, mem, adr, atyp, val); - case Op_Store2F: return new (C, 4) Store2FNode(ctl, mem, adr, atyp, val); - - case Op_Store2D: return new (C, 4) Store2DNode(ctl, mem, adr, atyp, val); + BasicType bt = vect_type()->element_basic_type(); + switch (bt) { + case T_BOOLEAN: + case T_BYTE: + return new (C, 3) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2)); + case T_CHAR: + case T_SHORT: + return new (C, 3) PackINode(n1, n2, TypeVect::make(T_INT, 2)); + case T_INT: + return new (C, 3) PackLNode(n1, n2, TypeVect::make(T_LONG, 2)); + case T_LONG: + return new (C, 3) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2)); + case T_FLOAT: + return new (C, 3) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); + case T_DOUBLE: + return new (C, 3) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); + } + ShouldNotReachHere(); } - ShouldNotReachHere(); return NULL; } +// Return the vector version of a scalar load node. +LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem, + Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) { + const TypeVect* vt = TypeVect::make(bt, vlen); + return new (C, 3) LoadVectorNode(ctl, mem, adr, atyp, vt); + return NULL; +} + +// Return the vector version of a scalar store node. +StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem, + Node* adr, const TypePtr* atyp, Node* val, + uint vlen) { + return new (C, 4) StoreVectorNode(ctl, mem, adr, atyp, val); +} + // Extract a scalar element of vector. -Node* ExtractNode::make(Compile* C, Node* v, uint position, const Type* opd_t) { - BasicType bt = opd_t->array_element_basic_type(); - assert(position < VectorNode::max_vlen(bt), "pos in range"); +Node* ExtractNode::make(Compile* C, Node* v, uint position, BasicType bt) { + assert((int)position < Matcher::max_vector_size(bt), "pos in range"); ConINode* pos = ConINode::make(C, (int)position); switch (bt) { case T_BOOLEAN: + return new (C, 3) ExtractUBNode(v, pos); case T_BYTE: return new (C, 3) ExtractBNode(v, pos); case T_CHAR: @@ -478,3 +307,4 @@ ShouldNotReachHere(); return NULL; } + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/opto/vectornode.hpp --- a/src/share/vm/opto/vectornode.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/opto/vectornode.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,48 +31,32 @@ //------------------------------VectorNode-------------------------------------- // Vector Operation -class VectorNode : public Node { - virtual uint size_of() const { return sizeof(*this); } - protected: - uint _length; // vector length - virtual BasicType elt_basic_type() const = 0; // Vector element basic type +class VectorNode : public TypeNode { + public: - static const Type* vect_type(BasicType elt_bt, uint len); - static const Type* vect_type(const Type* elt_type, uint len) { - return vect_type(elt_type->array_element_basic_type(), len); + VectorNode(Node* n1, const TypeVect* vt) : TypeNode(vt, 2) { + init_class_id(Class_Vector); + init_req(1, n1); + } + VectorNode(Node* n1, Node* n2, const TypeVect* vt) : TypeNode(vt, 3) { + init_class_id(Class_Vector); + init_req(1, n1); + init_req(2, n2); } - public: - friend class VectorLoadNode; // For vect_type - friend class VectorStoreNode; // ditto. + const TypeVect* vect_type() const { return type()->is_vect(); } + uint length() const { return vect_type()->length(); } // Vector length - VectorNode(Node* n1, uint vlen) : Node(NULL, n1), _length(vlen) { - init_class_id(Class_Vector); - } - VectorNode(Node* n1, Node* n2, uint vlen) : Node(NULL, n1, n2), _length(vlen) { - init_class_id(Class_Vector); - } virtual int Opcode() const; - uint length() const { return _length; } // Vector length - - static uint max_vlen(BasicType bt) { // max vector length - return (uint)(Matcher::vector_width_in_bytes() / type2aelembytes(bt)); - } - - // Element and vector type - const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); } - const Type* vect_type() const { return vect_type(elt_basic_type(), length()); } - - virtual const Type *bottom_type() const { return vect_type(); } - virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); } - - // Vector opcode from scalar opcode - static int opcode(int sopc, uint vlen, const Type* opd_t); + virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); } static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t); - static VectorNode* make(Compile* C, int sopc, Node* n1, Node* n2, uint vlen, const Type* elt_t); + static VectorNode* make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt); + + static int opcode(int opc, uint vlen, BasicType bt); + static bool implemented(int opc, uint vlen, BasicType bt); }; @@ -81,981 +65,393 @@ //------------------------------AddVBNode--------------------------------------- // Vector add byte class AddVBNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } public: - AddVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} - virtual int Opcode() const; -}; - -//------------------------------AddVCNode--------------------------------------- -// Vector add char -class AddVCNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - AddVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------AddVSNode--------------------------------------- -// Vector add short +// Vector add char/short class AddVSNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } public: - AddVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------AddVINode--------------------------------------- // Vector add int class AddVINode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } public: - AddVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + AddVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------AddVLNode--------------------------------------- // Vector add long class AddVLNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_LONG; } public: - AddVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + AddVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------AddVFNode--------------------------------------- // Vector add float class AddVFNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } public: - AddVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + AddVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------AddVDNode--------------------------------------- // Vector add double class AddVDNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_DOUBLE; } public: - AddVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + AddVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------SubVBNode--------------------------------------- // Vector subtract byte class SubVBNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } public: - SubVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} - virtual int Opcode() const; -}; - -//------------------------------SubVCNode--------------------------------------- -// Vector subtract char -class SubVCNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - SubVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + SubVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------SubVSNode--------------------------------------- // Vector subtract short class SubVSNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } public: - SubVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + SubVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------SubVINode--------------------------------------- // Vector subtract int class SubVINode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } public: - SubVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + SubVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------SubVLNode--------------------------------------- // Vector subtract long class SubVLNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_LONG; } public: - SubVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + SubVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------SubVFNode--------------------------------------- // Vector subtract float class SubVFNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } public: - SubVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + SubVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------SubVDNode--------------------------------------- // Vector subtract double class SubVDNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_DOUBLE; } public: - SubVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + SubVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------MulVFNode--------------------------------------- // Vector multiply float class MulVFNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } public: - MulVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + MulVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------MulVDNode--------------------------------------- // Vector multiply double class MulVDNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_DOUBLE; } public: - MulVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------DivVFNode--------------------------------------- // Vector divide float class DivVFNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } public: - DivVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + DivVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------DivVDNode--------------------------------------- // Vector Divide double class DivVDNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_DOUBLE; } public: - DivVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + DivVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------LShiftVBNode--------------------------------------- // Vector lshift byte class LShiftVBNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } public: - LShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} - virtual int Opcode() const; -}; - -//------------------------------LShiftVCNode--------------------------------------- -// Vector lshift chars -class LShiftVCNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - LShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + LShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------LShiftVSNode--------------------------------------- // Vector lshift shorts class LShiftVSNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } public: - LShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + LShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------LShiftVINode--------------------------------------- // Vector lshift ints class LShiftVINode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } public: - LShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + LShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------URShiftVBNode--------------------------------------- // Vector urshift bytes -class URShiftVBNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } +class RShiftVBNode : public VectorNode { public: - URShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} - virtual int Opcode() const; -}; - -//------------------------------URShiftVCNode--------------------------------------- -// Vector urshift char -class URShiftVCNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } - public: - URShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + RShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------URShiftVSNode--------------------------------------- // Vector urshift shorts -class URShiftVSNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } +class RShiftVSNode : public VectorNode { public: - URShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + RShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------URShiftVINode--------------------------------------- // Vector urshift ints -class URShiftVINode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } +class RShiftVINode : public VectorNode { public: - URShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} + RShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------AndVNode--------------------------------------- // Vector and class AndVNode : public VectorNode { - protected: - BasicType _bt; - virtual BasicType elt_basic_type() const { return _bt; } public: - AndVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {} + AndVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------OrVNode--------------------------------------- // Vector or class OrVNode : public VectorNode { - protected: - BasicType _bt; - virtual BasicType elt_basic_type() const { return _bt; } public: - OrVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {} + OrVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; //------------------------------XorVNode--------------------------------------- // Vector xor class XorVNode : public VectorNode { - protected: - BasicType _bt; - virtual BasicType elt_basic_type() const { return _bt; } public: - XorVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {} + XorVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} virtual int Opcode() const; }; -//================================= M E M O R Y ================================== - +//================================= M E M O R Y =============================== -//------------------------------VectorLoadNode-------------------------------------- -// Vector Load from memory -class VectorLoadNode : public LoadNode { - virtual uint size_of() const { return sizeof(*this); } - - protected: - virtual BasicType elt_basic_type() const = 0; // Vector element basic type - // For use in constructor - static const Type* vect_type(const Type* elt_type, uint len) { - return VectorNode::vect_type(elt_type, len); +//------------------------------LoadVectorNode--------------------------------- +// Load Vector from memory +class LoadVectorNode : public LoadNode { + public: + LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt) + : LoadNode(c, mem, adr, at, vt) { + init_class_id(Class_LoadVector); } - public: - VectorLoadNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *rt) - : LoadNode(c,mem,adr,at,rt) { - init_class_id(Class_VectorLoad); - } + const TypeVect* vect_type() const { return type()->is_vect(); } + uint length() const { return vect_type()->length(); } // Vector length + virtual int Opcode() const; - virtual uint length() const = 0; // Vector length - - // Element and vector type - const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); } - const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); } - - virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); } + virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(memory_size()); } virtual BasicType memory_type() const { return T_VOID; } - virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); } - - // Vector opcode from scalar opcode - static int opcode(int sopc, uint vlen); - - static VectorLoadNode* make(Compile* C, int opc, Node* ctl, Node* mem, - Node* adr, const TypePtr* atyp, uint vlen); -}; - -//------------------------------Load16BNode-------------------------------------- -// Vector load of 16 bytes (8bits signed) from memory -class Load16BNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } - public: - Load16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,16)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store16B; } - virtual uint length() const { return 16; } -}; - -//------------------------------Load8BNode-------------------------------------- -// Vector load of 8 bytes (8bits signed) from memory -class Load8BNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } - public: - Load8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store8B; } - virtual uint length() const { return 8; } -}; + virtual int memory_size() const { return vect_type()->length_in_bytes(); } -//------------------------------Load4BNode-------------------------------------- -// Vector load of 4 bytes (8bits signed) from memory -class Load4BNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } - public: - Load4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store4B; } - virtual uint length() const { return 4; } -}; - -//------------------------------Load8CNode-------------------------------------- -// Vector load of 8 chars (16bits unsigned) from memory -class Load8CNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Load8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store8C; } - virtual uint length() const { return 8; } -}; + virtual int store_Opcode() const { return Op_StoreVector; } -//------------------------------Load4CNode-------------------------------------- -// Vector load of 4 chars (16bits unsigned) from memory -class Load4CNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Load4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store4C; } - virtual uint length() const { return 4; } -}; - -//------------------------------Load2CNode-------------------------------------- -// Vector load of 2 chars (16bits unsigned) from memory -class Load2CNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Load2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store2C; } - virtual uint length() const { return 2; } -}; - -//------------------------------Load8SNode-------------------------------------- -// Vector load of 8 shorts (16bits signed) from memory -class Load8SNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } - public: - Load8SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store8C; } - virtual uint length() const { return 8; } + static LoadVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem, + Node* adr, const TypePtr* atyp, uint vlen, BasicType bt); }; -//------------------------------Load4SNode-------------------------------------- -// Vector load of 4 shorts (16bits signed) from memory -class Load4SNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } - public: - Load4SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store4C; } - virtual uint length() const { return 4; } -}; - -//------------------------------Load2SNode-------------------------------------- -// Vector load of 2 shorts (16bits signed) from memory -class Load2SNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } - public: - Load2SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store2C; } - virtual uint length() const { return 2; } -}; - -//------------------------------Load4INode-------------------------------------- -// Vector load of 4 integers (32bits signed) from memory -class Load4INode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } - public: - Load4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store4I; } - virtual uint length() const { return 4; } -}; - -//------------------------------Load2INode-------------------------------------- -// Vector load of 2 integers (32bits signed) from memory -class Load2INode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } - public: - Load2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT) - : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store2I; } - virtual uint length() const { return 2; } -}; - -//------------------------------Load2LNode-------------------------------------- -// Vector load of 2 longs (64bits signed) from memory -class Load2LNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_LONG; } +//------------------------------StoreVectorNode-------------------------------- +// Store Vector to memory +class StoreVectorNode : public StoreNode { public: - Load2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong *tl = TypeLong::LONG) - : VectorLoadNode(c,mem,adr,at,vect_type(tl,2)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store2L; } - virtual uint length() const { return 2; } -}; - -//------------------------------Load4FNode-------------------------------------- -// Vector load of 4 floats (32bits) from memory -class Load4FNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } - public: - Load4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT) - : VectorLoadNode(c,mem,adr,at,vect_type(t,4)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store4F; } - virtual uint length() const { return 4; } -}; + StoreVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) + : StoreNode(c, mem, adr, at, val) { + assert(val->is_Vector() || val->is_LoadVector(), "sanity"); + init_class_id(Class_StoreVector); + } -//------------------------------Load2FNode-------------------------------------- -// Vector load of 2 floats (32bits) from memory -class Load2FNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } - public: - Load2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT) - : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store2F; } - virtual uint length() const { return 2; } -}; + const TypeVect* vect_type() const { return in(MemNode::ValueIn)->bottom_type()->is_vect(); } + uint length() const { return vect_type()->length(); } // Vector length -//------------------------------Load2DNode-------------------------------------- -// Vector load of 2 doubles (64bits) from memory -class Load2DNode : public VectorLoadNode { - protected: - virtual BasicType elt_basic_type() const { return T_DOUBLE; } - public: - Load2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::DOUBLE) - : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {} - virtual int Opcode() const; - virtual int store_Opcode() const { return Op_Store2D; } - virtual uint length() const { return 2; } -}; - - -//------------------------------VectorStoreNode-------------------------------------- -// Vector Store to memory -class VectorStoreNode : public StoreNode { - virtual uint size_of() const { return sizeof(*this); } - - protected: - virtual BasicType elt_basic_type() const = 0; // Vector element basic type - - public: - VectorStoreNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : StoreNode(c,mem,adr,at,val) { - init_class_id(Class_VectorStore); - } virtual int Opcode() const; - virtual uint length() const = 0; // Vector length - - // Element and vector type - const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); } - const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); } + virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(memory_size()); } + virtual BasicType memory_type() const { return T_VOID; } + virtual int memory_size() const { return vect_type()->length_in_bytes(); } - virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); } - virtual BasicType memory_type() const { return T_VOID; } - virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); } - - // Vector opcode from scalar opcode - static int opcode(int sopc, uint vlen); - - static VectorStoreNode* make(Compile* C, int opc, Node* ctl, Node* mem, + static StoreVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem, Node* adr, const TypePtr* atyp, Node* val, uint vlen); }; -//------------------------------Store16BNode-------------------------------------- -// Vector store of 16 bytes (8bits signed) to memory -class Store16BNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } - public: - Store16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 16; } -}; + +//=========================Promote_Scalar_to_Vector============================ -//------------------------------Store8BNode-------------------------------------- -// Vector store of 8 bytes (8bits signed) to memory -class Store8BNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } +//------------------------------ReplicateBNode--------------------------------- +// Replicate byte scalar to be vector +class ReplicateBNode : public VectorNode { public: - Store8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 8; } -}; - -//------------------------------Store4BNode-------------------------------------- -// Vector store of 4 bytes (8bits signed) to memory -class Store4BNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } - public: - Store4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} + ReplicateBNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} virtual int Opcode() const; - virtual uint length() const { return 4; } -}; - -//------------------------------Store8CNode-------------------------------------- -// Vector store of 8 chars (16bits signed/unsigned) to memory -class Store8CNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Store8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 8; } -}; - -//------------------------------Store4CNode-------------------------------------- -// Vector store of 4 chars (16bits signed/unsigned) to memory -class Store4CNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Store4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 4; } -}; - -//------------------------------Store2CNode-------------------------------------- -// Vector store of 2 chars (16bits signed/unsigned) to memory -class Store2CNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Store2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 2; } }; -//------------------------------Store4INode-------------------------------------- -// Vector store of 4 integers (32bits signed) to memory -class Store4INode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } - public: - Store4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 4; } -}; - -//------------------------------Store2INode-------------------------------------- -// Vector store of 2 integers (32bits signed) to memory -class Store2INode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } - public: - Store2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 2; } -}; - -//------------------------------Store2LNode-------------------------------------- -// Vector store of 2 longs (64bits signed) to memory -class Store2LNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_LONG; } +//------------------------------ReplicateSNode--------------------------------- +// Replicate short scalar to be vector +class ReplicateSNode : public VectorNode { public: - Store2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 2; } -}; - -//------------------------------Store4FNode-------------------------------------- -// Vector store of 4 floats (32bits) to memory -class Store4FNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } - public: - Store4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 4; } -}; - -//------------------------------Store2FNode-------------------------------------- -// Vector store of 2 floats (32bits) to memory -class Store2FNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } - public: - Store2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 2; } -}; - -//------------------------------Store2DNode-------------------------------------- -// Vector store of 2 doubles (64bits) to memory -class Store2DNode : public VectorStoreNode { - protected: - virtual BasicType elt_basic_type() const { return T_DOUBLE; } - public: - Store2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) - : VectorStoreNode(c,mem,adr,at,val) {} - virtual int Opcode() const; - virtual uint length() const { return 2; } -}; - -//=========================Promote_Scalar_to_Vector==================================== - -//------------------------------Replicate16BNode--------------------------------------- -// Replicate byte scalar to be vector of 16 bytes -class Replicate16BNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } - public: - Replicate16BNode(Node* in1) : VectorNode(in1, 16) {} + ReplicateSNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} virtual int Opcode() const; }; -//------------------------------Replicate8BNode--------------------------------------- -// Replicate byte scalar to be vector of 8 bytes -class Replicate8BNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } +//------------------------------ReplicateINode--------------------------------- +// Replicate int scalar to be vector +class ReplicateINode : public VectorNode { public: - Replicate8BNode(Node* in1) : VectorNode(in1, 8) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate4BNode--------------------------------------- -// Replicate byte scalar to be vector of 4 bytes -class Replicate4BNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } - public: - Replicate4BNode(Node* in1) : VectorNode(in1, 4) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate8CNode--------------------------------------- -// Replicate char scalar to be vector of 8 chars -class Replicate8CNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Replicate8CNode(Node* in1) : VectorNode(in1, 8) {} + ReplicateINode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} virtual int Opcode() const; }; -//------------------------------Replicate4CNode--------------------------------------- -// Replicate char scalar to be vector of 4 chars -class Replicate4CNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Replicate4CNode(Node* in1) : VectorNode(in1, 4) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate2CNode--------------------------------------- -// Replicate char scalar to be vector of 2 chars -class Replicate2CNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } +//------------------------------ReplicateLNode--------------------------------- +// Replicate long scalar to be vector +class ReplicateLNode : public VectorNode { public: - Replicate2CNode(Node* in1) : VectorNode(in1, 2) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate8SNode--------------------------------------- -// Replicate short scalar to be vector of 8 shorts -class Replicate8SNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } - public: - Replicate8SNode(Node* in1) : VectorNode(in1, 8) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate4SNode--------------------------------------- -// Replicate short scalar to be vector of 4 shorts -class Replicate4SNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } - public: - Replicate4SNode(Node* in1) : VectorNode(in1, 4) {} + ReplicateLNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} virtual int Opcode() const; }; -//------------------------------Replicate2SNode--------------------------------------- -// Replicate short scalar to be vector of 2 shorts -class Replicate2SNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } +//------------------------------ReplicateFNode--------------------------------- +// Replicate float scalar to be vector +class ReplicateFNode : public VectorNode { public: - Replicate2SNode(Node* in1) : VectorNode(in1, 2) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate4INode--------------------------------------- -// Replicate int scalar to be vector of 4 ints -class Replicate4INode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } - public: - Replicate4INode(Node* in1) : VectorNode(in1, 4) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate2INode--------------------------------------- -// Replicate int scalar to be vector of 2 ints -class Replicate2INode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } - public: - Replicate2INode(Node* in1) : VectorNode(in1, 2) {} + ReplicateFNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} virtual int Opcode() const; }; -//------------------------------Replicate2LNode--------------------------------------- -// Replicate long scalar to be vector of 2 longs -class Replicate2LNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_LONG; } +//------------------------------ReplicateDNode--------------------------------- +// Replicate double scalar to be vector +class ReplicateDNode : public VectorNode { public: - Replicate2LNode(Node* in1) : VectorNode(in1, 2) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate4FNode--------------------------------------- -// Replicate float scalar to be vector of 4 floats -class Replicate4FNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } - public: - Replicate4FNode(Node* in1) : VectorNode(in1, 4) {} + ReplicateDNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} virtual int Opcode() const; }; -//------------------------------Replicate2FNode--------------------------------------- -// Replicate float scalar to be vector of 2 floats -class Replicate2FNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } - public: - Replicate2FNode(Node* in1) : VectorNode(in1, 2) {} - virtual int Opcode() const; -}; - -//------------------------------Replicate2DNode--------------------------------------- -// Replicate double scalar to be vector of 2 doubles -class Replicate2DNode : public VectorNode { - protected: - virtual BasicType elt_basic_type() const { return T_DOUBLE; } - public: - Replicate2DNode(Node* in1) : VectorNode(in1, 2) {} - virtual int Opcode() const; -}; - -//========================Pack_Scalars_into_a_Vector============================== +//========================Pack_Scalars_into_a_Vector=========================== //------------------------------PackNode--------------------------------------- // Pack parent class (not for code generation). class PackNode : public VectorNode { public: - PackNode(Node* in1) : VectorNode(in1, 1) {} - PackNode(Node* in1, Node* n2) : VectorNode(in1, n2, 2) {} + PackNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} + PackNode(Node* in1, Node* n2, const TypeVect* vt) : VectorNode(in1, n2, vt) {} virtual int Opcode() const; - void add_opd(Node* n) { - add_req(n); - _length++; - assert(_length == req() - 1, "vector length matches edge count"); + void add_opd(uint i, Node* n) { + init_req(i+1, n); } // Create a binary tree form for Packs. [lo, hi) (half-open) range Node* binaryTreePack(Compile* C, int lo, int hi); - static PackNode* make(Compile* C, Node* s, const Type* elt_t); + static PackNode* make(Compile* C, Node* s, uint vlen, BasicType bt); }; //------------------------------PackBNode--------------------------------------- // Pack byte scalars into vector class PackBNode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } public: - PackBNode(Node* in1) : PackNode(in1) {} - virtual int Opcode() const; -}; - -//------------------------------PackCNode--------------------------------------- -// Pack char scalars into vector -class PackCNode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - PackCNode(Node* in1) : PackNode(in1) {} + PackBNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} virtual int Opcode() const; }; //------------------------------PackSNode--------------------------------------- // Pack short scalars into a vector class PackSNode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_SHORT; } public: - PackSNode(Node* in1) : PackNode(in1) {} + PackSNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} + PackSNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} virtual int Opcode() const; }; //------------------------------PackINode--------------------------------------- // Pack integer scalars into a vector class PackINode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_INT; } public: - PackINode(Node* in1) : PackNode(in1) {} - PackINode(Node* in1, Node* in2) : PackNode(in1, in2) {} + PackINode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} + PackINode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} virtual int Opcode() const; }; //------------------------------PackLNode--------------------------------------- // Pack long scalars into a vector class PackLNode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_LONG; } public: - PackLNode(Node* in1) : PackNode(in1) {} - PackLNode(Node* in1, Node* in2) : PackNode(in1, in2) {} + PackLNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} + PackLNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} + virtual int Opcode() const; +}; + +//------------------------------Pack2LNode-------------------------------------- +// Pack 2 long scalars into a vector +class Pack2LNode : public PackNode { + public: + Pack2LNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} virtual int Opcode() const; }; //------------------------------PackFNode--------------------------------------- // Pack float scalars into vector class PackFNode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_FLOAT; } public: - PackFNode(Node* in1) : PackNode(in1) {} - PackFNode(Node* in1, Node* in2) : PackNode(in1, in2) {} + PackFNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} + PackFNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} virtual int Opcode() const; }; //------------------------------PackDNode--------------------------------------- // Pack double scalars into a vector class PackDNode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_DOUBLE; } public: - PackDNode(Node* in1) : PackNode(in1) {} - PackDNode(Node* in1, Node* in2) : PackNode(in1, in2) {} + PackDNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} + PackDNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} virtual int Opcode() const; }; -// The Pack2xN nodes assist code generation. They are created from -// Pack4C, etc. nodes in final_graph_reshape in the form of a -// balanced, binary tree. - -//------------------------------Pack2x1BNode----------------------------------------- -// Pack 2 1-byte integers into vector of 2 bytes -class Pack2x1BNode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_BYTE; } +//------------------------------Pack2DNode-------------------------------------- +// Pack 2 double scalars into a vector +class Pack2DNode : public PackNode { public: - Pack2x1BNode(Node *in1, Node* in2) : PackNode(in1, in2) {} + Pack2DNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} virtual int Opcode() const; - virtual uint ideal_reg() const { return Op_RegI; } }; -//------------------------------Pack2x2BNode--------------------------------------- -// Pack 2 2-byte integers into vector of 4 bytes -class Pack2x2BNode : public PackNode { - protected: - virtual BasicType elt_basic_type() const { return T_CHAR; } - public: - Pack2x2BNode(Node *in1, Node* in2) : PackNode(in1, in2) {} - virtual int Opcode() const; - virtual uint ideal_reg() const { return Op_RegI; } -}; //========================Extract_Scalar_from_Vector=============================== @@ -1069,7 +465,7 @@ virtual int Opcode() const; uint pos() const { return in(2)->get_int(); } - static Node* make(Compile* C, Node* v, uint position, const Type* opd_t); + static Node* make(Compile* C, Node* v, uint position, BasicType bt); }; //------------------------------ExtractBNode--------------------------------------- @@ -1082,6 +478,16 @@ virtual uint ideal_reg() const { return Op_RegI; } }; +//------------------------------ExtractUBNode-------------------------------------- +// Extract a boolean from a vector at position "pos" +class ExtractUBNode : public ExtractNode { + public: + ExtractUBNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {} + virtual int Opcode() const; + virtual const Type *bottom_type() const { return TypeInt::INT; } + virtual uint ideal_reg() const { return Op_RegI; } +}; + //------------------------------ExtractCNode--------------------------------------- // Extract a char from a vector at position "pos" class ExtractCNode : public ExtractNode { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jni.cpp --- a/src/share/vm/prims/jni.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jni.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/altHashing.hpp" #include "classfile/classLoader.hpp" #include "classfile/javaClasses.hpp" #include "classfile/symbolTable.hpp" @@ -32,6 +33,7 @@ #ifndef SERIALGC #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" #endif // SERIALGC +#include "memory/allocation.hpp" #include "memory/allocation.inline.hpp" #include "memory/gcLocker.inline.hpp" #include "memory/oopFactory.hpp" @@ -378,6 +380,7 @@ jclass cls = NULL; DT_RETURN_MARK(DefineClass, jclass, (const jclass&)cls); + TempNewSymbol class_name = NULL; // Since exceptions can be thrown, class initialization can take place // if name is NULL no check for class name in .class stream has to be made. if (name != NULL) { @@ -387,9 +390,8 @@ // into the constant pool. THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); } + class_name = SymbolTable::new_symbol(name, CHECK_NULL); } - TempNewSymbol class_name = SymbolTable::new_symbol(name, THREAD); - ResourceMark rm(THREAD); ClassFileStream st((u1*) buf, bufLen, NULL); Handle class_loader (THREAD, JNIHandles::resolve(loaderRef)); @@ -3269,7 +3271,7 @@ int s_len = java_lang_String::length(s); typeArrayOop s_value = java_lang_String::value(s); int s_offset = java_lang_String::offset(s); - jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len + 1); // add one for zero termination + jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len + 1, mtInternal); // add one for zero termination if (s_len > 0) { memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len); } @@ -3362,7 +3364,7 @@ #endif /* USDT2 */ oop java_string = JNIHandles::resolve_non_null(string); size_t length = java_lang_String::utf8_length(java_string); - char* result = AllocateHeap(length + 1, "GetStringUTFChars"); + char* result = AllocateHeap(length + 1, mtInternal); java_lang_String::as_utf8_string(java_string, result, (int) length + 1); if (isCopy != NULL) *isCopy = JNI_TRUE; #ifndef USDT2 @@ -3618,7 +3620,7 @@ * Avoid asserts in typeArrayOop. */ \ result = (ElementType*)get_bad_address(); \ } else { \ - result = NEW_C_HEAP_ARRAY(ElementType, len); \ + result = NEW_C_HEAP_ARRAY(ElementType, len, mtInternal); \ /* copy the array to the c chunk */ \ memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \ } \ @@ -3655,7 +3657,7 @@ * Avoid asserts in typeArrayOop. */ \ result = (ElementType*)get_bad_address(); \ } else { \ - result = NEW_C_HEAP_ARRAY(ElementType, len); \ + result = NEW_C_HEAP_ARRAY(ElementType, len, mtInternal); \ /* copy the array to the c chunk */ \ memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \ } \ @@ -5053,6 +5055,7 @@ run_unit_test(arrayOopDesc::test_max_array_length()); run_unit_test(CollectedHeap::test_is_in()); run_unit_test(QuickSort::test_quick_sort()); + run_unit_test(AltHashing::test_alt_hash()); tty->print_cr("All internal VM tests passed"); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jniCheck.cpp --- a/src/share/vm/prims/jniCheck.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jniCheck.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1308,7 +1308,7 @@ assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected"); size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination - jint* tagLocation = (jint*) AllocateHeap(len * sizeof(jchar) + sizeof(jint), "checked_jni_GetStringChars"); + jint* tagLocation = (jint*) AllocateHeap(len * sizeof(jchar) + sizeof(jint), mtInternal); *tagLocation = STRING_TAG; jchar* newResult = (jchar*) (tagLocation + 1); memcpy(newResult, result, len * sizeof(jchar)); @@ -1378,13 +1378,13 @@ assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected"); size_t len = strlen(result) + 1; // + 1 for NULL termination - jint* tagLocation = (jint*) AllocateHeap(len + sizeof(jint), "checked_jni_GetStringUTFChars"); + jint* tagLocation = (jint*) AllocateHeap(len + sizeof(jint), mtInternal); *tagLocation = STRING_UTF_TAG; char* newResult = (char*) (tagLocation + 1); strcpy(newResult, result); // Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes // Note that the dtrace arguments for the allocated memory will not match up with this solution. - FreeHeap((char*)result); + FreeHeap((char*)result, mtInternal); functionExit(env); return newResult; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvm.cpp --- a/src/share/vm/prims/jvm.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvm.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,6 +35,7 @@ #include "oops/fieldStreams.hpp" #include "oops/instanceKlass.hpp" #include "oops/objArrayKlass.hpp" +#include "oops/methodOop.hpp" #include "prims/jvm.h" #include "prims/jvm_misc.hpp" #include "prims/jvmtiExport.hpp" @@ -345,9 +346,13 @@ // Do this after setting user properties to prevent people // from setting the value with a -D option, as requested. { - char as_chars[256]; - jio_snprintf(as_chars, sizeof(as_chars), INTX_FORMAT, MaxDirectMemorySize); - PUTPROP(props, "sun.nio.MaxDirectMemorySize", as_chars); + if (FLAG_IS_DEFAULT(MaxDirectMemorySize)) { + PUTPROP(props, "sun.nio.MaxDirectMemorySize", "-1"); + } else { + char as_chars[256]; + jio_snprintf(as_chars, sizeof(as_chars), UINTX_FORMAT, MaxDirectMemorySize); + PUTPROP(props, "sun.nio.MaxDirectMemorySize", as_chars); + } } // JVM monitoring and management support @@ -2179,11 +2184,11 @@ klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); oop method = instanceKlass::cast(k)->methods()->obj_at(method_index); - typeArrayOop extable = methodOop(method)->exception_table(); - entry->start_pc = extable->int_at(entry_index * 4); - entry->end_pc = extable->int_at(entry_index * 4 + 1); - entry->handler_pc = extable->int_at(entry_index * 4 + 2); - entry->catchType = extable->int_at(entry_index * 4 + 3); + ExceptionTable extable((methodOop(method))); + entry->start_pc = extable.start_pc(entry_index); + entry->end_pc = extable.end_pc(entry_index); + entry->handler_pc = extable.handler_pc(entry_index); + entry->catchType = extable.catch_type_index(entry_index); JVM_END @@ -2192,7 +2197,7 @@ klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); oop method = instanceKlass::cast(k)->methods()->obj_at(method_index); - return methodOop(method)->exception_table()->length() / 4; + return methodOop(method)->exception_table_length(); JVM_END diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvm.h --- a/src/share/vm/prims/jvm.h Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvm.h Thu Aug 02 14:29:12 2012 -0700 @@ -634,7 +634,7 @@ JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused); /* - * sun.misc.AtomicLong + * java.util.concurrent.atomic.AtomicLong */ JNIEXPORT jboolean JNICALL JVM_SupportsCX8(void); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiClassFileReconstituter.cpp --- a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -191,15 +191,14 @@ } } - typeArrayHandle exception_table(thread(), const_method->exception_table()); - int exception_table_length = exception_table->length(); - int exception_table_entries = exception_table_length / 4; + ExceptionTable exception_table(method()); + int exception_table_length = exception_table.length(); int code_size = const_method->code_size(); int size = 2+2+4 + // max_stack, max_locals, code_length code_size + // code 2 + // exception_table_length - (2+2+2+2) * exception_table_entries + // exception_table + (2+2+2+2) * exception_table_length + // exception_table 2 + // attributes_count attr_size; // attributes @@ -209,12 +208,12 @@ write_u2(method->max_locals()); write_u4(code_size); copy_bytecodes(method, (unsigned char*)writeable_address(code_size)); - write_u2(exception_table_entries); - for (int index = 0; index < exception_table_length; ) { - write_u2(exception_table->int_at(index++)); - write_u2(exception_table->int_at(index++)); - write_u2(exception_table->int_at(index++)); - write_u2(exception_table->int_at(index++)); + write_u2(exception_table_length); + for (int index = 0; index < exception_table_length; index++) { + write_u2(exception_table.start_pc(index)); + write_u2(exception_table.end_pc(index)); + write_u2(exception_table.handler_pc(index)); + write_u2(exception_table.catch_type_index(index)); } write_u2(attr_count); if (line_num_cnt != 0) { @@ -268,14 +267,18 @@ // JSR45| SourceDebugExtension_attribute { // JSR45| u2 attribute_name_index; // JSR45| u4 attribute_length; -// JSR45| u2 sourcefile_index; +// JSR45| u1 debug_extension[attribute_length]; // JSR45| } void JvmtiClassFileReconstituter::write_source_debug_extension_attribute() { assert(ikh()->source_debug_extension() != NULL, "caller must check"); write_attribute_name_index("SourceDebugExtension"); - write_u4(2); // always length 2 - write_u2(symbol_to_cpool_index(ikh()->source_debug_extension())); + int len = (int)strlen(ikh()->source_debug_extension()); + write_u4(len); + u1* ext = (u1*)ikh()->source_debug_extension(); + for (int i=0; i(50,true); + _global_code_blobs = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(50,true); // iterate over the stub code descriptors and put them in the list first. int index = 0; @@ -247,7 +247,7 @@ int pcds_in_method; pcds_in_method = (nm->scopes_pcs_end() - nm->scopes_pcs_begin()); - map = NEW_C_HEAP_ARRAY(jvmtiAddrLocationMap, pcds_in_method); + map = NEW_C_HEAP_ARRAY(jvmtiAddrLocationMap, pcds_in_method, mtInternal); address scopes_data = nm->scopes_data_begin(); for( pcd = nm->scopes_pcs_begin(); pcd < nm->scopes_pcs_end(); ++pcd ) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiEnv.cpp --- a/src/share/vm/prims/jvmtiEnv.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiEnv.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1012,7 +1012,7 @@ // growable array of jvmti monitors info on the C-heap GrowableArray *owned_monitors_list = - new (ResourceObj::C_HEAP) GrowableArray(1, true); + new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1, true); uint32_t debug_bits = 0; if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { @@ -1057,7 +1057,7 @@ // growable array of jvmti monitors info on the C-heap GrowableArray *owned_monitors_list = - new (ResourceObj::C_HEAP) GrowableArray(1, true); + new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1, true); uint32_t debug_bits = 0; if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { @@ -2541,15 +2541,12 @@ if (!Klass::cast(k)->oop_is_instance()) { return JVMTI_ERROR_ABSENT_INFORMATION; } - Symbol* sdeOop = instanceKlass::cast(k)->source_debug_extension(); - NULL_CHECK(sdeOop, JVMTI_ERROR_ABSENT_INFORMATION); + char* sde = instanceKlass::cast(k)->source_debug_extension(); + NULL_CHECK(sde, JVMTI_ERROR_ABSENT_INFORMATION); { - JavaThread* current_thread = JavaThread::current(); - ResourceMark rm(current_thread); - const char* sdecp = (const char*) sdeOop->as_C_string(); - *source_debug_extension_ptr = (char *) jvmtiMalloc(strlen(sdecp)+1); - strcpy(*source_debug_extension_ptr, sdecp); + *source_debug_extension_ptr = (char *) jvmtiMalloc(strlen(sde)+1); + strcpy(*source_debug_extension_ptr, sde); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiEnvBase.cpp --- a/src/share/vm/prims/jvmtiEnvBase.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiEnvBase.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -381,7 +381,7 @@ _native_method_prefixes = NULL; } else { // there are prefixes, allocate an array to hold them, and fill it - char** new_prefixes = (char**)os::malloc((prefix_count) * sizeof(char*)); + char** new_prefixes = (char**)os::malloc((prefix_count) * sizeof(char*), mtInternal); if (new_prefixes == NULL) { return JVMTI_ERROR_OUT_OF_MEMORY; } @@ -1150,7 +1150,7 @@ ResourceTracker::ResourceTracker(JvmtiEnv* env) { _env = env; - _allocations = new (ResourceObj::C_HEAP) GrowableArray(20, true); + _allocations = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(20, true); _failed = false; } ResourceTracker::~ResourceTracker() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiEnvBase.hpp --- a/src/share/vm/prims/jvmtiEnvBase.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiEnvBase.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -52,7 +52,7 @@ // done via JNI GetEnv() call. Multiple attachments are // allowed in jvmti. -class JvmtiEnvBase : public CHeapObj { +class JvmtiEnvBase : public CHeapObj { private: @@ -175,7 +175,7 @@ if (size == 0) { *mem_ptr = NULL; } else { - *mem_ptr = (unsigned char *)os::malloc((size_t)size); + *mem_ptr = (unsigned char *)os::malloc((size_t)size, mtInternal); if (*mem_ptr == NULL) { return JVMTI_ERROR_OUT_OF_MEMORY; } @@ -185,7 +185,7 @@ jvmtiError deallocate(unsigned char* mem) { if (mem != NULL) { - os::free(mem); + os::free(mem, mtInternal); } return JVMTI_ERROR_NONE; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiEnvThreadState.cpp --- a/src/share/vm/prims/jvmtiEnvThreadState.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiEnvThreadState.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -95,7 +95,7 @@ // JvmtiFramePops::JvmtiFramePops() { - _pops = new (ResourceObj::C_HEAP) GrowableArray (2, true); + _pops = new (ResourceObj::C_HEAP, mtInternal) GrowableArray (2, true); } JvmtiFramePops::~JvmtiFramePops() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiEnvThreadState.hpp --- a/src/share/vm/prims/jvmtiEnvThreadState.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiEnvThreadState.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -76,7 +76,7 @@ // It records what frames on a threads stack should post frame_pop events when they're exited. // -class JvmtiFramePops : public CHeapObj { +class JvmtiFramePops : public CHeapObj { private: GrowableArray* _pops; @@ -107,7 +107,7 @@ // 3: Location of last executed instruction, used to filter out duplicate // events due to instruction rewriting. -class JvmtiEnvThreadState : public CHeapObj { +class JvmtiEnvThreadState : public CHeapObj { private: friend class JvmtiEnv; JavaThread *_thread; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiExport.cpp --- a/src/share/vm/prims/jvmtiExport.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiExport.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -617,7 +617,7 @@ if (caching_needed && *_cached_data_ptr == NULL) { // data has been changed by the new retransformable agent // and it hasn't already been cached, cache it - *_cached_data_ptr = (unsigned char *)os::malloc(_curr_len); + *_cached_data_ptr = (unsigned char *)os::malloc(_curr_len, mtInternal); memcpy(*_cached_data_ptr, _curr_data, _curr_len); *_cached_length_ptr = _curr_len; } @@ -720,7 +720,7 @@ JvmtiCodeBlobEvents::build_jvmti_addr_location_map(nm, &_map, &_map_length); } ~JvmtiCompiledMethodLoadEventMark() { - FREE_C_HEAP_ARRAY(jvmtiAddrLocationMap, _map); + FREE_C_HEAP_ARRAY(jvmtiAddrLocationMap, _map, mtInternal); } jint code_size() { return _code_size; } @@ -2323,7 +2323,7 @@ // register a stub void JvmtiDynamicCodeEventCollector::register_stub(const char* name, address start, address end) { if (_code_blobs == NULL) { - _code_blobs = new (ResourceObj::C_HEAP) GrowableArray(1,true); + _code_blobs = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1,true); } _code_blobs->append(new JvmtiCodeBlobDesc(name, start, end)); } @@ -2357,7 +2357,7 @@ void JvmtiVMObjectAllocEventCollector::record_allocation(oop obj) { assert(is_enabled(), "VM object alloc event collector is not enabled"); if (_allocated == NULL) { - _allocated = new (ResourceObj::C_HEAP) GrowableArray(1, true); + _allocated = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1, true); } _allocated->push(obj); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiExport.hpp --- a/src/share/vm/prims/jvmtiExport.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiExport.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -350,7 +350,7 @@ // Support class used by JvmtiDynamicCodeEventCollector and others. It // describes a single code blob by name and address range. -class JvmtiCodeBlobDesc : public CHeapObj { +class JvmtiCodeBlobDesc : public CHeapObj { private: char _name[64]; address _code_begin; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiExtensions.cpp --- a/src/share/vm/prims/jvmtiExtensions.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiExtensions.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -49,8 +49,8 @@ // event. The function and the event are registered here. // void JvmtiExtensions::register_extensions() { - _ext_functions = new (ResourceObj::C_HEAP) GrowableArray(1,true); - _ext_events = new (ResourceObj::C_HEAP) GrowableArray(1,true); + _ext_functions = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1,true); + _ext_events = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1,true); // register our extension function static jvmtiParamInfo func_params[] = { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiGetLoadedClasses.cpp --- a/src/share/vm/prims/jvmtiGetLoadedClasses.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiGetLoadedClasses.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -152,7 +152,7 @@ // Public methods that get called within the scope of the closure void allocate() { - _list = NEW_C_HEAP_ARRAY(Handle, _count); + _list = NEW_C_HEAP_ARRAY(Handle, _count, mtInternal); assert(_list != NULL, "Out of memory"); if (_list == NULL) { _count = 0; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiImpl.cpp --- a/src/share/vm/prims/jvmtiImpl.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiImpl.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -98,8 +98,8 @@ void GrowableCache::recache() { int len = _elements->length(); - FREE_C_HEAP_ARRAY(address, _cache); - _cache = NEW_C_HEAP_ARRAY(address,len+1); + FREE_C_HEAP_ARRAY(address, _cache, mtInternal); + _cache = NEW_C_HEAP_ARRAY(address,len+1, mtInternal); for (int i=0; iat(i)->getCacheValue(); @@ -142,13 +142,13 @@ GrowableCache::~GrowableCache() { clear(); delete _elements; - FREE_C_HEAP_ARRAY(address, _cache); + FREE_C_HEAP_ARRAY(address, _cache, mtInternal); } void GrowableCache::initialize(void *this_obj, void listener_fun(void *, address*) ) { _this_obj = this_obj; _listener_fun = listener_fun; - _elements = new (ResourceObj::C_HEAP) GrowableArray(5,true); + _elements = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(5,true); recache(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiImpl.hpp --- a/src/share/vm/prims/jvmtiImpl.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiImpl.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -64,7 +64,7 @@ // to update its pointer to the address cache. // -class GrowableElement : public CHeapObj { +class GrowableElement : public CHeapObj { public: virtual address getCacheValue() =0; virtual bool equals(GrowableElement* e) =0; @@ -130,7 +130,7 @@ // Note : typesafe wrapper for GrowableCache of JvmtiBreakpoint // -class JvmtiBreakpointCache : public CHeapObj { +class JvmtiBreakpointCache : public CHeapObj { private: GrowableCache _cache; @@ -258,7 +258,7 @@ // CHeap allocated to emphasize its similarity to JvmtiFramePops. // -class JvmtiBreakpoints : public CHeapObj { +class JvmtiBreakpoints : public CHeapObj { private: JvmtiBreakpointCache _bps; @@ -496,7 +496,7 @@ class JvmtiDeferredEventQueue : AllStatic { friend class JvmtiDeferredEvent; private: - class QueueNode : public CHeapObj { + class QueueNode : public CHeapObj { private: JvmtiDeferredEvent _event; QueueNode* _next; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiRawMonitor.cpp --- a/src/share/vm/prims/jvmtiRawMonitor.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiRawMonitor.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -27,7 +27,7 @@ #include "runtime/interfaceSupport.hpp" #include "runtime/thread.hpp" -GrowableArray *JvmtiPendingMonitors::_monitors = new (ResourceObj::C_HEAP) GrowableArray(1,true); +GrowableArray *JvmtiPendingMonitors::_monitors = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1,true); void JvmtiPendingMonitors::transition_raw_monitors() { assert((Threads::number_of_threads()==1), @@ -53,7 +53,7 @@ JvmtiRawMonitor::JvmtiRawMonitor(const char *name) { #ifdef ASSERT - _name = strcpy(NEW_C_HEAP_ARRAY(char, strlen(name) + 1), name); + _name = strcpy(NEW_C_HEAP_ARRAY(char, strlen(name) + 1, mtInternal), name); #else _name = NULL; #endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiRedefineClasses.cpp --- a/src/share/vm/prims/jvmtiRedefineClasses.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -831,7 +831,7 @@ jvmtiError VM_RedefineClasses::load_new_class_versions(TRAPS) { // For consistency allocate memory using os::malloc wrapper. _scratch_classes = (instanceKlassHandle *) - os::malloc(sizeof(instanceKlassHandle) * _class_count); + os::malloc(sizeof(instanceKlassHandle) * _class_count, mtInternal); if (_scratch_classes == NULL) { return JVMTI_ERROR_OUT_OF_MEMORY; } @@ -2478,23 +2478,17 @@ // to use new constant pool indices as needed. The exception table // holds quadruple entries of the form: // (beg_bci, end_bci, handler_bci, klass_index) - const int beg_bci_offset = 0; - const int end_bci_offset = 1; - const int handler_bci_offset = 2; - const int klass_index_offset = 3; - const int entry_size = 4; - - typeArrayHandle ex_table (THREAD, method->exception_table()); - int ext_length = ex_table->length(); - assert(ext_length % entry_size == 0, "exception table format has changed"); - - for (int j = 0; j < ext_length; j += entry_size) { - int cur_index = ex_table->int_at(j + klass_index_offset); + + ExceptionTable ex_table(method()); + int ext_length = ex_table.length(); + + for (int j = 0; j < ext_length; j ++) { + int cur_index = ex_table.catch_type_index(j); int new_index = find_new_index(cur_index); if (new_index != 0) { RC_TRACE_WITH_THREAD(0x00080000, THREAD, ("ext-klass_index change: %d to %d", cur_index, new_index)); - ex_table->int_at_put(j + klass_index_offset, new_index); + ex_table.set_catch_type_index(j, new_index); } } // end for each exception table entry @@ -3236,7 +3230,9 @@ // Copy the "source debug extension" attribute from new class version the_class->set_source_debug_extension( - scratch_class->source_debug_extension()); + scratch_class->source_debug_extension(), + scratch_class->source_debug_extension() == NULL ? 0 : + (int)strlen(scratch_class->source_debug_extension())); // Use of javac -g could be different in the old and the new if (scratch_class->access_flags().has_localvariable_table() != diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiTagMap.cpp --- a/src/share/vm/prims/jvmtiTagMap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiTagMap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -55,7 +55,7 @@ // and the tag value. In addition an entry includes a next pointer which // is used to chain entries together. -class JvmtiTagHashmapEntry : public CHeapObj { +class JvmtiTagHashmapEntry : public CHeapObj { private: friend class JvmtiTagMap; @@ -106,7 +106,7 @@ // entries. It also provides a function to iterate over all entries // in the hashmap. -class JvmtiTagHashmap : public CHeapObj { +class JvmtiTagHashmap : public CHeapObj { private: friend class JvmtiTagMap; @@ -150,7 +150,7 @@ _resize_threshold = (int)(_load_factor * _size); _resizing_enabled = true; size_t s = initial_size * sizeof(JvmtiTagHashmapEntry*); - _table = (JvmtiTagHashmapEntry**)os::malloc(s); + _table = (JvmtiTagHashmapEntry**)os::malloc(s, mtInternal); if (_table == NULL) { vm_exit_out_of_memory(s, "unable to allocate initial hashtable for jvmti object tags"); } @@ -188,7 +188,7 @@ // allocate new table size_t s = new_size * sizeof(JvmtiTagHashmapEntry*); - JvmtiTagHashmapEntry** new_table = (JvmtiTagHashmapEntry**)os::malloc(s); + JvmtiTagHashmapEntry** new_table = (JvmtiTagHashmapEntry**)os::malloc(s, mtInternal); if (new_table == NULL) { warning("unable to allocate larger hashtable for jvmti object tags"); set_resizing_enabled(false); @@ -585,7 +585,7 @@ _o = klassOop_if_java_lang_Class(o); // object size - _obj_size = _o->size() * wordSize; + _obj_size = (jlong)_o->size() * wordSize; // record the context _tag_map = tag_map; @@ -776,7 +776,7 @@ // For each field it holds the field index (as defined by the JVMTI specification), // the field type, and the offset. -class ClassFieldDescriptor: public CHeapObj { +class ClassFieldDescriptor: public CHeapObj { private: int _field_index; int _field_offset; @@ -790,7 +790,7 @@ int field_offset() const { return _field_offset; } }; -class ClassFieldMap: public CHeapObj { +class ClassFieldMap: public CHeapObj { private: enum { initial_field_count = 5 @@ -821,7 +821,8 @@ }; ClassFieldMap::ClassFieldMap() { - _fields = new (ResourceObj::C_HEAP) GrowableArray(initial_field_count, true); + _fields = new (ResourceObj::C_HEAP, mtInternal) + GrowableArray(initial_field_count, true); } ClassFieldMap::~ClassFieldMap() { @@ -892,7 +893,7 @@ // heap iteration and avoid creating a field map for each object in the heap // (only need to create the map when the first instance of a class is encountered). // -class JvmtiCachedClassFieldMap : public CHeapObj { +class JvmtiCachedClassFieldMap : public CHeapObj { private: enum { initial_class_count = 200 @@ -957,7 +958,8 @@ // record that the given instanceKlass is caching a field map void JvmtiCachedClassFieldMap::add_to_class_list(instanceKlass* ik) { if (_class_list == NULL) { - _class_list = new (ResourceObj::C_HEAP) GrowableArray(initial_class_count, true); + _class_list = new (ResourceObj::C_HEAP, mtInternal) + GrowableArray(initial_class_count, true); } _class_list->push(ik); } @@ -1526,8 +1528,8 @@ _env = env; _tags = (jlong*)tags; _tag_count = tag_count; - _object_results = new (ResourceObj::C_HEAP) GrowableArray(1,true); - _tag_results = new (ResourceObj::C_HEAP) GrowableArray(1,true); + _object_results = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1,true); + _tag_results = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1,true); } ~TagObjectCollector() { @@ -1672,8 +1674,8 @@ Universe::heap()->ensure_parsability(false); // no need to retire TLABs // create stacks for interesting headers - _saved_mark_stack = new (ResourceObj::C_HEAP) GrowableArray(4000, true); - _saved_oop_stack = new (ResourceObj::C_HEAP) GrowableArray(4000, true); + _saved_mark_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(4000, true); + _saved_oop_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(4000, true); if (UseBiasedLocking) { BiasedLocking::preserve_marks(); @@ -2712,7 +2714,7 @@ bool _reporting_string_values; GrowableArray* create_visit_stack() { - return new (ResourceObj::C_HEAP) GrowableArray(initial_visit_stack_size, true); + return new (ResourceObj::C_HEAP, mtInternal) GrowableArray(initial_visit_stack_size, true); } // accessors diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiTagMap.hpp --- a/src/share/vm/prims/jvmtiTagMap.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiTagMap.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -41,7 +41,7 @@ class JvmtiTagHashmapEntry; class JvmtiTagHashmapEntryClosure; -class JvmtiTagMap : public CHeapObj { +class JvmtiTagMap : public CHeapObj { private: enum{ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiThreadState.hpp --- a/src/share/vm/prims/jvmtiThreadState.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiThreadState.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -72,7 +72,7 @@ // // The Jvmti state for each thread (across all JvmtiEnv): // 1. Local table of enabled events. -class JvmtiThreadState : public CHeapObj { +class JvmtiThreadState : public CHeapObj { private: friend class JvmtiEnv; JavaThread *_thread; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/jvmtiUtil.cpp --- a/src/share/vm/prims/jvmtiUtil.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/jvmtiUtil.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,7 +40,7 @@ if (_single_threaded_resource_area == NULL) { // lazily create the single threaded resource area // pick a size which is not a standard since the pools don't exist yet - _single_threaded_resource_area = new ResourceArea(Chunk::non_pool_size); + _single_threaded_resource_area = new (mtInternal) ResourceArea(Chunk::non_pool_size); } return _single_threaded_resource_area; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/methodHandleWalk.cpp --- a/src/share/vm/prims/methodHandleWalk.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/methodHandleWalk.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1796,7 +1796,7 @@ { methodOop m_oop = oopFactory::new_method(bytecode_length(), accessFlags_from(flags_bits), - 0, 0, 0, oopDesc::IsSafeConc, CHECK_(empty)); + 0, 0, 0, 0, oopDesc::IsSafeConc, CHECK_(empty)); m = methodHandle(THREAD, m_oop); } @@ -1812,9 +1812,6 @@ m->set_max_locals(max_locals()); m->set_size_of_parameters(_num_params); - typeArrayHandle exception_handlers(THREAD, Universe::the_empty_int_array()); - m->set_exception_table(exception_handlers()); - // Rewrite the method and set up the constant pool cache. objArrayOop m_array = oopFactory::new_system_objArray(1, CHECK_(empty)); objArrayHandle methods(THREAD, m_array); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/methodHandles.cpp --- a/src/share/vm/prims/methodHandles.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/methodHandles.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -3180,17 +3180,15 @@ jclass MH_class = env->FindClass(MH_name); status = env->RegisterNatives(MH_class, invoke_methods, sizeof(invoke_methods)/sizeof(JNINativeMethod)); } + if (!env->ExceptionOccurred()) { + status = env->RegisterNatives(MHN_class, call_site_methods, sizeof(call_site_methods)/sizeof(JNINativeMethod)); + } if (env->ExceptionOccurred()) { warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); enable_MH = false; env->ExceptionClear(); } - status = env->RegisterNatives(MHN_class, call_site_methods, sizeof(call_site_methods)/sizeof(JNINativeMethod)); - if (env->ExceptionOccurred()) { - // Exception is okay until 7087357 - env->ExceptionClear(); - } } if (enable_MH) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/unsafe.cpp --- a/src/share/vm/prims/unsafe.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/unsafe.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -178,17 +178,6 @@ v = *(oop*)index_oop_from_field_offset_long(p, offset); \ } -#define GET_OOP_FIELD_VOLATILE(obj, offset, v) \ - oop p = JNIHandles::resolve(obj); \ - volatile oop v; \ - if (UseCompressedOops) { \ - volatile narrowOop n = *(volatile narrowOop*)index_oop_from_field_offset_long(p, offset); \ - v = oopDesc::decode_heap_oop(n); \ - } else { \ - v = *(volatile oop*)index_oop_from_field_offset_long(p, offset); \ - } \ - OrderAccess::acquire(); - // Get/SetObject must be special-cased, since it works with handles. @@ -296,28 +285,21 @@ UNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) UnsafeWrapper("Unsafe_GetObjectVolatile"); - GET_OOP_FIELD_VOLATILE(obj, offset, v) + oop p = JNIHandles::resolve(obj); + void* addr = index_oop_from_field_offset_long(p, offset); + volatile oop v; + if (UseCompressedOops) { + volatile narrowOop n = *(volatile narrowOop*) addr; + v = oopDesc::decode_heap_oop(n); + } else { + v = *(volatile oop*) addr; + } + OrderAccess::acquire(); return JNIHandles::make_local(env, v); UNSAFE_END UNSAFE_ENTRY(void, Unsafe_SetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) UnsafeWrapper("Unsafe_SetObjectVolatile"); - { - // Catch VolatileCallSite.target stores (via - // CallSite.setTargetVolatile) and check call site dependencies. - oop p = JNIHandles::resolve(obj); - if ((offset == java_lang_invoke_CallSite::target_offset_in_bytes()) && p->is_a(SystemDictionary::CallSite_klass())) { - Handle call_site (THREAD, p); - Handle method_handle(THREAD, JNIHandles::resolve(x_h)); - assert(call_site ->is_a(SystemDictionary::CallSite_klass()), "must be"); - assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "must be"); - { - // Walk all nmethods depending on this call site. - MutexLocker mu(Compile_lock, thread); - Universe::flush_dependents_on(call_site(), method_handle()); - } - } - } oop x = JNIHandles::resolve(x_h); oop p = JNIHandles::resolve(obj); void* addr = index_oop_from_field_offset_long(p, offset); @@ -596,7 +578,7 @@ return 0; } sz = round_to(sz, HeapWordSize); - void* x = os::malloc(sz); + void* x = os::malloc(sz, mtInternal); if (x == NULL) { THROW_0(vmSymbols::java_lang_OutOfMemoryError()); } @@ -616,7 +598,7 @@ return 0; } sz = round_to(sz, HeapWordSize); - void* x = (p == NULL) ? os::malloc(sz) : os::realloc(p, sz); + void* x = (p == NULL) ? os::malloc(sz, mtInternal) : os::realloc(p, sz, mtInternal); if (x == NULL) { THROW_0(vmSymbols::java_lang_OutOfMemoryError()); } @@ -877,7 +859,7 @@ return 0; } - body = NEW_C_HEAP_ARRAY(jbyte, length); + body = NEW_C_HEAP_ARRAY(jbyte, length, mtInternal); if (body == 0) { throw_new(env, "OutOfMemoryError"); @@ -893,7 +875,7 @@ uint len = env->GetStringUTFLength(name); int unicode_len = env->GetStringLength(name); if (len >= sizeof(buf)) { - utfName = NEW_C_HEAP_ARRAY(char, len + 1); + utfName = NEW_C_HEAP_ARRAY(char, len + 1, mtInternal); if (utfName == NULL) { throw_new(env, "OutOfMemoryError"); goto free_body; @@ -913,10 +895,10 @@ result = JVM_DefineClass(env, utfName, loader, body, length, pd); if (utfName && utfName != buf) - FREE_C_HEAP_ARRAY(char, utfName); + FREE_C_HEAP_ARRAY(char, utfName, mtInternal); free_body: - FREE_C_HEAP_ARRAY(jbyte, body); + FREE_C_HEAP_ARRAY(jbyte, body, mtInternal); return result; } } @@ -1011,7 +993,7 @@ jint length = typeArrayOop(JNIHandles::resolve_non_null(data))->length(); jint word_length = (length + sizeof(HeapWord)-1) / sizeof(HeapWord); - HeapWord* body = NEW_C_HEAP_ARRAY(HeapWord, word_length); + HeapWord* body = NEW_C_HEAP_ARRAY(HeapWord, word_length, mtInternal); if (body == NULL) { THROW_0(vmSymbols::java_lang_OutOfMemoryError()); } @@ -1095,7 +1077,7 @@ // try/finally clause: if (temp_alloc != NULL) { - FREE_C_HEAP_ARRAY(HeapWord, temp_alloc); + FREE_C_HEAP_ARRAY(HeapWord, temp_alloc, mtInternal); } return (jclass) res_jh; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/prims/whitebox.cpp --- a/src/share/vm/prims/whitebox.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/prims/whitebox.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -113,6 +113,9 @@ int offset = offset_for_field(field_name, object, vmSymbols::string_signature()); oop string = object->obj_field(offset); + if (string == NULL) { + return NULL; + } const char* ret = java_lang_String::as_utf8_string(string); return ret; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/arguments.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,6 +35,7 @@ #include "runtime/globals_extension.hpp" #include "runtime/java.hpp" #include "services/management.hpp" +#include "services/memTracker.hpp" #include "utilities/defaultStream.hpp" #include "utilities/taskqueue.hpp" #ifdef TARGET_OS_FAMILY_linux @@ -368,7 +369,7 @@ inline void SysClassPath::reset_item_at(int index) { assert(index < _scp_nitems && index != _scp_base, "just checking"); if (_items[index] != NULL) { - FREE_C_HEAP_ARRAY(char, _items[index]); + FREE_C_HEAP_ARRAY(char, _items[index], mtInternal); _items[index] = NULL; } } @@ -400,11 +401,11 @@ expanded_path = add_jars_to_path(expanded_path, path); path = end; } else { - char* dirpath = NEW_C_HEAP_ARRAY(char, tmp_end - path + 1); + char* dirpath = NEW_C_HEAP_ARRAY(char, tmp_end - path + 1, mtInternal); memcpy(dirpath, path, tmp_end - path); dirpath[tmp_end - path] = '\0'; expanded_path = add_jars_to_path(expanded_path, dirpath); - FREE_C_HEAP_ARRAY(char, dirpath); + FREE_C_HEAP_ARRAY(char, dirpath, mtInternal); path = tmp_end + 1; } } @@ -435,7 +436,7 @@ assert(total_len > 0, "empty sysclasspath not allowed"); // Copy the _items to a single string. - char* cp = NEW_C_HEAP_ARRAY(char, total_len); + char* cp = NEW_C_HEAP_ARRAY(char, total_len, mtInternal); char* cp_tmp = cp; for (i = 0; i < _scp_nitems; ++i) { if (_items[i] != NULL) { @@ -456,7 +457,7 @@ assert(str != NULL, "just checking"); if (path == NULL) { size_t len = strlen(str) + 1; - cp = NEW_C_HEAP_ARRAY(char, len); + cp = NEW_C_HEAP_ARRAY(char, len, mtInternal); memcpy(cp, str, len); // copy the trailing null } else { const char separator = *os::path_separator(); @@ -465,15 +466,15 @@ size_t len = old_len + str_len + 2; if (prepend) { - cp = NEW_C_HEAP_ARRAY(char, len); + cp = NEW_C_HEAP_ARRAY(char, len, mtInternal); char* cp_tmp = cp; memcpy(cp_tmp, str, str_len); cp_tmp += str_len; *cp_tmp = separator; memcpy(++cp_tmp, path, old_len + 1); // copy the trailing null - FREE_C_HEAP_ARRAY(char, path); + FREE_C_HEAP_ARRAY(char, path, mtInternal); } else { - cp = REALLOC_C_HEAP_ARRAY(char, path, len); + cp = REALLOC_C_HEAP_ARRAY(char, path, len, mtInternal); char* cp_tmp = cp + old_len; *cp_tmp = separator; memcpy(++cp_tmp, str, str_len + 1); // copy the trailing null @@ -495,7 +496,7 @@ /* Scan the directory for jars/zips, appending them to path. */ struct dirent *entry; - char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory)); + char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory), mtInternal); while ((entry = os::readdir(dir, (dirent *) dbuf)) != NULL) { const char* name = entry->d_name; const char* ext = name + strlen(name) - 4; @@ -503,13 +504,13 @@ (os::file_name_strcmp(ext, ".jar") == 0 || os::file_name_strcmp(ext, ".zip") == 0); if (isJarOrZip) { - char* jarpath = NEW_C_HEAP_ARRAY(char, directory_len + 2 + strlen(name)); + char* jarpath = NEW_C_HEAP_ARRAY(char, directory_len + 2 + strlen(name), mtInternal); sprintf(jarpath, "%s%s%s", directory, dir_sep, name); path = add_to_path(path, jarpath, false); - FREE_C_HEAP_ARRAY(char, jarpath); + FREE_C_HEAP_ARRAY(char, jarpath, mtInternal); } } - FREE_C_HEAP_ARRAY(char, dbuf); + FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); os::closedir(dir); return path; } @@ -631,7 +632,7 @@ static bool set_string_flag(char* name, const char* value, FlagValueOrigin origin) { if (!CommandLineFlags::ccstrAtPut(name, &value, origin)) return false; // Contract: CommandLineFlags always returns a pointer that needs freeing. - FREE_C_HEAP_ARRAY(char, value); + FREE_C_HEAP_ARRAY(char, value, mtInternal); return true; } @@ -647,7 +648,7 @@ } else if (new_len == 0) { value = old_value; } else { - char* buf = NEW_C_HEAP_ARRAY(char, old_len + 1 + new_len + 1); + char* buf = NEW_C_HEAP_ARRAY(char, old_len + 1 + new_len + 1, mtInternal); // each new setting adds another LINE to the switch: sprintf(buf, "%s\n%s", old_value, new_value); value = buf; @@ -655,10 +656,10 @@ } (void) CommandLineFlags::ccstrAtPut(name, &value, origin); // CommandLineFlags always returns a pointer that needs freeing. - FREE_C_HEAP_ARRAY(char, value); + FREE_C_HEAP_ARRAY(char, value, mtInternal); if (free_this_too != NULL) { // CommandLineFlags made its own copy, so I must delete my own temp. buffer. - FREE_C_HEAP_ARRAY(char, free_this_too); + FREE_C_HEAP_ARRAY(char, free_this_too, mtInternal); } return true; } @@ -735,9 +736,9 @@ // expand the array and add arg to the last element (*count)++; if (*bldarray == NULL) { - *bldarray = NEW_C_HEAP_ARRAY(char*, *count); + *bldarray = NEW_C_HEAP_ARRAY(char*, *count, mtInternal); } else { - *bldarray = REALLOC_C_HEAP_ARRAY(char*, *bldarray, *count); + *bldarray = REALLOC_C_HEAP_ARRAY(char*, *bldarray, *count, mtInternal); } (*bldarray)[index] = strdup(arg); } @@ -917,13 +918,13 @@ char* value = (char *)ns; size_t key_len = (eq == NULL) ? strlen(prop) : (eq - prop); - key = AllocateHeap(key_len + 1, "add_property"); + key = AllocateHeap(key_len + 1, mtInternal); strncpy(key, prop, key_len); key[key_len] = '\0'; if (eq != NULL) { size_t value_len = strlen(prop) - key_len - 1; - value = AllocateHeap(value_len + 1, "add_property"); + value = AllocateHeap(value_len + 1, mtInternal); strncpy(value, &prop[key_len + 1], value_len + 1); } @@ -2058,12 +2059,12 @@ const char* altclasses_jar = "alt-rt.jar"; size_t altclasses_path_len = strlen(get_meta_index_dir()) + 1 + strlen(altclasses_jar); - char* altclasses_path = NEW_C_HEAP_ARRAY(char, altclasses_path_len); + char* altclasses_path = NEW_C_HEAP_ARRAY(char, altclasses_path_len, mtInternal); strcpy(altclasses_path, get_meta_index_dir()); strcat(altclasses_path, altclasses_jar); scp.add_suffix_to_prefix(altclasses_path); scp_assembly_required = true; - FREE_C_HEAP_ARRAY(char, altclasses_path); + FREE_C_HEAP_ARRAY(char, altclasses_path, mtInternal); } if (WhiteBoxAPI) { @@ -2071,12 +2072,12 @@ const char* wb_jar = "wb.jar"; size_t wb_path_len = strlen(get_meta_index_dir()) + 1 + strlen(wb_jar); - char* wb_path = NEW_C_HEAP_ARRAY(char, wb_path_len); + char* wb_path = NEW_C_HEAP_ARRAY(char, wb_path_len, mtInternal); strcpy(wb_path, get_meta_index_dir()); strcat(wb_path, wb_jar); scp.add_suffix(wb_path); scp_assembly_required = true; - FREE_C_HEAP_ARRAY(char, wb_path); + FREE_C_HEAP_ARRAY(char, wb_path, mtInternal); } // Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM) @@ -2161,13 +2162,13 @@ if (tail != NULL) { const char* pos = strchr(tail, ':'); size_t len = (pos == NULL) ? strlen(tail) : pos - tail; - char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len); + char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1, mtInternal), tail, len); name[len] = '\0'; char *options = NULL; if(pos != NULL) { size_t len2 = strlen(pos+1) + 1; // options start after ':'. Final zero must be copied. - options = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len2), pos+1, len2); + options = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len2, mtInternal), pos+1, len2); } #ifdef JVMTI_KERNEL if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) { @@ -2182,12 +2183,12 @@ if(tail != NULL) { const char* pos = strchr(tail, '='); size_t len = (pos == NULL) ? strlen(tail) : pos - tail; - char* name = strncpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len); + char* name = strncpy(NEW_C_HEAP_ARRAY(char, len + 1, mtInternal), tail, len); name[len] = '\0'; char *options = NULL; if(pos != NULL) { - options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(pos + 1) + 1), pos + 1); + options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(pos + 1) + 1, mtInternal), pos + 1); } #ifdef JVMTI_KERNEL if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) { @@ -2200,7 +2201,7 @@ // -javaagent } else if (match_option(option, "-javaagent:", &tail)) { if(tail != NULL) { - char *options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(tail) + 1), tail); + char *options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(tail) + 1, mtInternal), tail); add_init_agent("instrument", options, false); } // -Xnoclassgc @@ -2708,6 +2709,17 @@ return JNI_EINVAL; } FLAG_SET_CMDLINE(uintx, ConcGCThreads, conc_threads); + } else if (match_option(option, "-XX:MaxDirectMemorySize=", &tail)) { + julong max_direct_memory_size = 0; + ArgsRange errcode = parse_memory_size(tail, &max_direct_memory_size, 0); + if (errcode != arg_in_range) { + jio_fprintf(defaultStream::error_stream(), + "Invalid maximum direct memory size: %s\n", + option->optionString); + describe_range_error(errcode); + return JNI_EINVAL; + } + FLAG_SET_CMDLINE(uintx, MaxDirectMemorySize, max_direct_memory_size); } else if (match_option(option, "-XX:", &tail)) { // -XX:xxxx // Skip -XX:Flags= since that case has already been handled if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) { @@ -2958,7 +2970,7 @@ char *end = strrchr(jvm_path, *os::file_separator()); if (end != NULL) *end = '\0'; char *shared_archive_path = NEW_C_HEAP_ARRAY(char, strlen(jvm_path) + - strlen(os::file_separator()) + 20); + strlen(os::file_separator()) + 20, mtInternal); if (shared_archive_path == NULL) return JNI_ENOMEM; strcpy(shared_archive_path, jvm_path); strcat(shared_archive_path, os::file_separator()); @@ -2971,7 +2983,10 @@ const char* tail; // If flag "-XX:Flags=flags-file" is used it will be the first option to be processed. + const char* hotspotrc = ".hotspotrc"; bool settings_file_specified = false; + bool needs_hotspotrc_warning = false; + const char* flags_file; int index; for (index = 0; index < args->nOptions; index++) { @@ -2996,6 +3011,10 @@ CommandLineFlags::printFlags(tty, false); vm_exit(0); } + if (match_option(option, "-XX:NativeMemoryTracking", &tail)) { + MemTracker::init_tracking_options(tail); + } + #ifndef PRODUCT if (match_option(option, "-XX:+PrintFlagsWithComments", &tail)) { @@ -3015,16 +3034,19 @@ if (!process_settings_file(flags_file, true, args->ignoreUnrecognized)) { return JNI_EINVAL; } - } - + } else { #ifdef ASSERT - // Parse default .hotspotrc settings file - if (!settings_file_specified) { + // Parse default .hotspotrc settings file if (!process_settings_file(".hotspotrc", false, args->ignoreUnrecognized)) { return JNI_EINVAL; } +#else + struct stat buf; + if (os::stat(hotspotrc, &buf) == 0) { + needs_hotspotrc_warning = true; + } +#endif } -#endif if (PrintVMOptions) { for (index = 0; index < args->nOptions; index++) { @@ -3041,7 +3063,15 @@ return result; } -#ifdef JAVASE_EMBEDDED + // Delay warning until here so that we've had a chance to process + // the -XX:-PrintWarnings flag + if (needs_hotspotrc_warning) { + warning("%s file is present but has been ignored. " + "Run with -XX:Flags=%s to load the file.", + hotspotrc, hotspotrc); + } + +#if (defined JAVASE_EMBEDDED || defined ARM) UNSUPPORTED_OPTION(UseG1GC, "G1 GC"); #endif @@ -3094,6 +3124,14 @@ PrintGC = true; } + if (!JDK_Version::is_gte_jdk18x_version()) { + // To avoid changing the log format for 7 updates this flag is only + // true by default in JDK8 and above. + if (FLAG_IS_DEFAULT(PrintGCCause)) { + FLAG_SET_DEFAULT(PrintGCCause, false); + } + } + // Set object alignment values. set_object_alignment(); @@ -3325,7 +3363,7 @@ } } // Add one for null terminator. - char *props = AllocateHeap(length + 1, "get_kernel_properties"); + char *props = AllocateHeap(length + 1, mtInternal); if (length != 0) { int pos = 0; for (prop = _system_properties; prop != NULL; prop = prop->next()) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/arguments.hpp --- a/src/share/vm/runtime/arguments.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/arguments.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -44,7 +44,7 @@ // Element describing System and User (-Dkey=value flags) defined property. -class SystemProperty: public CHeapObj { +class SystemProperty: public CHeapObj { private: char* _key; char* _value; @@ -63,7 +63,7 @@ if (_value != NULL) { FreeHeap(_value); } - _value = AllocateHeap(strlen(value)+1); + _value = AllocateHeap(strlen(value)+1, mtInternal); if (_value != NULL) { strcpy(_value, value); } @@ -80,7 +80,7 @@ if (_value != NULL) { len += strlen(_value); } - sp = AllocateHeap(len+2); + sp = AllocateHeap(len+2, mtInternal); if (sp != NULL) { if (_value != NULL) { strcpy(sp, _value); @@ -100,13 +100,13 @@ if (key == NULL) { _key = NULL; } else { - _key = AllocateHeap(strlen(key)+1); + _key = AllocateHeap(strlen(key)+1, mtInternal); strcpy(_key, key); } if (value == NULL) { _value = NULL; } else { - _value = AllocateHeap(strlen(value)+1); + _value = AllocateHeap(strlen(value)+1, mtInternal); strcpy(_value, value); } _next = NULL; @@ -116,7 +116,7 @@ // For use by -agentlib, -agentpath and -Xrun -class AgentLibrary : public CHeapObj { +class AgentLibrary : public CHeapObj { friend class AgentLibraryList; private: char* _name; @@ -136,12 +136,12 @@ // Constructor AgentLibrary(const char* name, const char* options, bool is_absolute_path, void* os_lib) { - _name = AllocateHeap(strlen(name)+1); + _name = AllocateHeap(strlen(name)+1, mtInternal); strcpy(_name, name); if (options == NULL) { _options = NULL; } else { - _options = AllocateHeap(strlen(options)+1); + _options = AllocateHeap(strlen(options)+1, mtInternal); strcpy(_options, options); } _is_absolute_path = is_absolute_path; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/biasedLocking.cpp --- a/src/share/vm/runtime/biasedLocking.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/biasedLocking.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -687,8 +687,8 @@ // monitors in a prepass and, if they are biased, preserve their // mark words here. This should be a relatively small set of objects // especially compared to the number of objects in the heap. - _preserved_mark_stack = new (ResourceObj::C_HEAP) GrowableArray(10, true); - _preserved_oop_stack = new (ResourceObj::C_HEAP) GrowableArray(10, true); + _preserved_mark_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(10, true); + _preserved_oop_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(10, true); ResourceMark rm; Thread* cur = Thread::current(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/compilationPolicy.hpp --- a/src/share/vm/runtime/compilationPolicy.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/compilationPolicy.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -37,7 +37,7 @@ class CompileTask; class CompileQueue; -class CompilationPolicy : public CHeapObj { +class CompilationPolicy : public CHeapObj { static CompilationPolicy* _policy; // Accumulated time static elapsedTimer _accumulated_time; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/deoptimization.cpp --- a/src/share/vm/runtime/deoptimization.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/deoptimization.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -101,7 +101,7 @@ _number_of_frames = number_of_frames; _frame_sizes = frame_sizes; _frame_pcs = frame_pcs; - _register_block = NEW_C_HEAP_ARRAY(intptr_t, RegisterMap::reg_count * 2); + _register_block = NEW_C_HEAP_ARRAY(intptr_t, RegisterMap::reg_count * 2, mtCompiler); _return_type = return_type; _initial_info = 0; // PD (x86 only) @@ -114,9 +114,9 @@ Deoptimization::UnrollBlock::~UnrollBlock() { - FREE_C_HEAP_ARRAY(intptr_t, _frame_sizes); - FREE_C_HEAP_ARRAY(intptr_t, _frame_pcs); - FREE_C_HEAP_ARRAY(intptr_t, _register_block); + FREE_C_HEAP_ARRAY(intptr_t, _frame_sizes, mtCompiler); + FREE_C_HEAP_ARRAY(intptr_t, _frame_pcs, mtCompiler); + FREE_C_HEAP_ARRAY(intptr_t, _register_block, mtCompiler); } @@ -358,9 +358,9 @@ // Compute the vframes' sizes. Note that frame_sizes[] entries are ordered from outermost to innermost // virtual activation, which is the reverse of the elements in the vframes array. - intptr_t* frame_sizes = NEW_C_HEAP_ARRAY(intptr_t, number_of_frames); + intptr_t* frame_sizes = NEW_C_HEAP_ARRAY(intptr_t, number_of_frames, mtCompiler); // +1 because we always have an interpreter return address for the final slot. - address* frame_pcs = NEW_C_HEAP_ARRAY(address, number_of_frames + 1); + address* frame_pcs = NEW_C_HEAP_ARRAY(address, number_of_frames + 1, mtCompiler); int popframe_extra_args = 0; // Create an interpreter return address for the stub to use as its return // address so the skeletal frames are perfectly walkable diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/deoptimization.hpp --- a/src/share/vm/runtime/deoptimization.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/deoptimization.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -129,7 +129,7 @@ // UnrollBlock is returned by fetch_unroll_info() to the deoptimization handler (blob). // This is only a CheapObj to ease debugging after a deopt failure - class UnrollBlock : public CHeapObj { + class UnrollBlock : public CHeapObj { private: int _size_of_deoptimized_frame; // Size, in bytes, of current deoptimized frame int _caller_adjustment; // Adjustment, in bytes, to caller's SP by initial interpreted frame diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/dtraceJSDT.hpp --- a/src/share/vm/runtime/dtraceJSDT.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/dtraceJSDT.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -63,7 +63,7 @@ static jboolean is_supported(); }; -class RegisteredProbes : public CHeapObj { +class RegisteredProbes : public CHeapObj { private: nmethod** _nmethods; // all the probe methods size_t _count; // number of probe methods @@ -72,7 +72,7 @@ public: RegisteredProbes(size_t count) { _count = count; - _nmethods = NEW_C_HEAP_ARRAY(nmethod*, count); + _nmethods = NEW_C_HEAP_ARRAY(nmethod*, count, mtInternal); } ~RegisteredProbes() { @@ -81,7 +81,7 @@ _nmethods[i]->make_not_entrant(); _nmethods[i]->method()->clear_code(); } - FREE_C_HEAP_ARRAY(nmethod*, _nmethods); + FREE_C_HEAP_ARRAY(nmethod*, _nmethods, mtInternal); _nmethods = NULL; _count = 0; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/fieldDescriptor.cpp --- a/src/share/vm/runtime/fieldDescriptor.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/fieldDescriptor.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -28,6 +28,7 @@ #include "memory/resourceArea.hpp" #include "memory/universe.inline.hpp" #include "oops/instanceKlass.hpp" +#include "oops/fieldStreams.hpp" #include "runtime/fieldDescriptor.hpp" #include "runtime/handles.inline.hpp" #include "runtime/signature.hpp" @@ -37,6 +38,24 @@ return instanceKlass::cast(_cp->pool_holder())->class_loader(); } +Symbol* fieldDescriptor::generic_signature() const { + if (!has_generic_signature()) { + return NULL; + } + + int idx = 0; + instanceKlass* ik = instanceKlass::cast(field_holder()); + for (AllFieldStream fs(ik); !fs.done(); fs.next()) { + if (idx == _index) { + return fs.generic_signature(); + } else { + idx ++; + } + } + assert(false, "should never happen"); + return NULL; +} + typeArrayOop fieldDescriptor::annotations() const { instanceKlass* ik = instanceKlass::cast(field_holder()); objArrayOop md = ik->fields_annotations(); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/fieldDescriptor.hpp --- a/src/share/vm/runtime/fieldDescriptor.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/fieldDescriptor.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -67,7 +67,7 @@ oop loader() const; // Offset (in words) of field from start of instanceOop / klassOop int offset() const { return field()->offset(); } - Symbol* generic_signature() const { return field()->generic_signature(_cp); } + Symbol* generic_signature() const; int index() const { return _index; } typeArrayOop annotations() const; @@ -100,6 +100,7 @@ bool is_field_access_watched() const { return access_flags().is_field_access_watched(); } bool is_field_modification_watched() const { return access_flags().is_field_modification_watched(); } + bool has_generic_signature() const { return access_flags().field_has_generic_signature(); } void set_is_field_access_watched(const bool value) { _access_flags.set_is_field_access_watched(value); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/fprofiler.cpp --- a/src/share/vm/runtime/fprofiler.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/fprofiler.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -70,12 +70,12 @@ ThreadProfiler::ThreadProfiler() { // Space for the ProfilerNodes const int area_size = 1 * ProfilerNodeSize * 1024; - area_bottom = AllocateHeap(area_size, "fprofiler"); + area_bottom = AllocateHeap(area_size, mtInternal); area_top = area_bottom; area_limit = area_bottom + area_size; // ProfilerNode pointer table - table = NEW_C_HEAP_ARRAY(ProfilerNode*, table_size); + table = NEW_C_HEAP_ARRAY(ProfilerNode*, table_size, mtInternal); initialize(); engaged = false; } @@ -157,7 +157,7 @@ void PCRecorder::init() { MutexLockerEx lm(CodeCache_lock, Mutex::_no_safepoint_check_flag); int s = size(); - counters = NEW_C_HEAP_ARRAY(int, s); + counters = NEW_C_HEAP_ARRAY(int, s, mtInternal); for (int index = 0; index < s; index++) { counters[index] = 0; } @@ -850,7 +850,7 @@ if (Threads_lock->try_lock()) { { // Threads_lock scope maxthreads = Threads::number_of_threads(); - threadsList = NEW_C_HEAP_ARRAY(JavaThread *, maxthreads); + threadsList = NEW_C_HEAP_ARRAY(JavaThread *, maxthreads, mtInternal); suspendedthreadcount = 0; for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) { if (tp->is_Compiler_thread()) { @@ -1195,8 +1195,8 @@ void FlatProfiler::allocate_table() { { // Bytecode table - bytecode_ticks = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes); - bytecode_ticks_stub = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes); + bytecode_ticks = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes, mtInternal); + bytecode_ticks_stub = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes, mtInternal); for(int index = 0; index < Bytecodes::number_of_codes; index++) { bytecode_ticks[index] = 0; bytecode_ticks_stub[index] = 0; @@ -1205,7 +1205,7 @@ if (ProfilerRecordPC) PCRecorder::init(); - interval_data = NEW_C_HEAP_ARRAY(IntervalData, interval_print_size); + interval_data = NEW_C_HEAP_ARRAY(IntervalData, interval_print_size, mtInternal); FlatProfiler::interval_reset(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/fprofiler.hpp --- a/src/share/vm/runtime/fprofiler.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/fprofiler.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -121,7 +121,7 @@ }; #endif // FPROF_KERNEL -class ThreadProfiler: public CHeapObj { +class ThreadProfiler: public CHeapObj { public: ThreadProfiler() KERNEL_RETURN; ~ThreadProfiler() KERNEL_RETURN; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/globals.cpp --- a/src/share/vm/runtime/globals.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/globals.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -465,13 +465,13 @@ ccstr old_value = result->get_ccstr(); char* new_value = NULL; if (*value != NULL) { - new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1); + new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1, mtInternal); strcpy(new_value, *value); } result->set_ccstr(new_value); if (result->origin == DEFAULT && old_value != NULL) { // Prior value is NOT heap allocated, but was a literal constant. - char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1); + char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1, mtInternal); strcpy(old_value_to_free, old_value); old_value = old_value_to_free; } @@ -485,12 +485,12 @@ Flag* faddr = address_of_flag(flag); guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type"); ccstr old_value = faddr->get_ccstr(); - char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1); + char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1, mtInternal); strcpy(new_value, value); faddr->set_ccstr(new_value); if (faddr->origin != DEFAULT && old_value != NULL) { // Prior value is heap allocated so free it. - FREE_C_HEAP_ARRAY(char, old_value); + FREE_C_HEAP_ARRAY(char, old_value, mtInternal); } faddr->origin = origin; } @@ -511,7 +511,7 @@ while (flagTable[length].name != NULL) length++; // Sort - Flag** array = NEW_C_HEAP_ARRAY(Flag*, length); + Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal); for (int index = 0; index < length; index++) { array[index] = &flagTable[index]; } @@ -525,7 +525,7 @@ } } out->cr(); - FREE_C_HEAP_ARRAY(Flag*, array); + FREE_C_HEAP_ARRAY(Flag*, array, mtInternal); } #ifndef PRODUCT @@ -547,7 +547,7 @@ while (flagTable[length].name != NULL) length++; // Sort - Flag** array = NEW_C_HEAP_ARRAY(Flag*, length); + Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal); for (int index = 0; index < length; index++) { array[index] = &flagTable[index]; } @@ -560,5 +560,5 @@ array[i]->print_on(out, withComments); } } - FREE_C_HEAP_ARRAY(Flag*, array); + FREE_C_HEAP_ARRAY(Flag*, array, mtInternal); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/globals.hpp --- a/src/share/vm/runtime/globals.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/globals.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -190,7 +190,6 @@ #endif // no compilers - // string type aliases used only in this file typedef const char* ccstr; typedef const char* ccstrlist; // represents string arguments which accumulate @@ -631,9 +630,6 @@ develop(bool, InlineClassNatives, true, \ "inline Class.isInstance, etc") \ \ - develop(bool, InlineAtomicLong, true, \ - "inline sun.misc.AtomicLong") \ - \ develop(bool, InlineThreadNatives, true, \ "inline Thread.currentThread, etc") \ \ @@ -899,6 +895,9 @@ develop(bool, UseFakeTimers, false, \ "Tells whether the VM should use system time or a fake timer") \ \ + product(ccstr, NativeMemoryTracking, "off", \ + "Native memory tracking options") \ + \ diagnostic(bool, LogCompilation, false, \ "Log compilation activity in detail to hotspot.log or LogFile") \ \ @@ -2662,6 +2661,9 @@ product(bool, UseHeavyMonitors, false, \ "use heavyweight instead of lightweight Java monitors") \ \ + product(bool, PrintStringTableStatistics, false, \ + "print statistics about the StringTable and SymbolTable") \ + \ notproduct(bool, PrintSymbolTableSizeHistogram, false, \ "print histogram of the symbol table") \ \ @@ -3285,9 +3287,6 @@ diagnostic(intx, VerifyGCLevel, 0, \ "Generation level at which to start +VerifyBefore/AfterGC") \ \ - develop(uintx, ExitAfterGCNum, 0, \ - "If non-zero, exit after this GC.") \ - \ product(intx, MaxTenuringThreshold, 15, \ "Maximum value for tenuring threshold") \ \ @@ -3706,7 +3705,7 @@ \ /* Properties for Java libraries */ \ \ - product(intx, MaxDirectMemorySize, -1, \ + product(uintx, MaxDirectMemorySize, 0, \ "Maximum total size of NIO direct-buffer allocations") \ \ /* temporary developer defined flags */ \ @@ -3902,7 +3901,10 @@ " of this flag is true for JDK 6 and earlier") \ \ diagnostic(bool, WhiteBoxAPI, false, \ - "Enable internal testing APIs") + "Enable internal testing APIs") \ + \ + product(bool, PrintGCCause, true, \ + "Include GC cause in GC logging") /* * Macros for factoring of globals diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/handles.cpp --- a/src/share/vm/runtime/handles.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/handles.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -111,7 +111,7 @@ _chunk = _area->_chunk; _hwm = _area->_hwm; _max = _area->_max; - NOT_PRODUCT(_size_in_bytes = _area->_size_in_bytes;) + _size_in_bytes = _area->_size_in_bytes; debug_only(_area->_handle_mark_nesting++); assert(_area->_handle_mark_nesting > 0, "must stack allocate HandleMarks"); debug_only(Atomic::inc(&_nof_handlemarks);) @@ -159,7 +159,7 @@ area->_chunk = _chunk; area->_hwm = _hwm; area->_max = _max; - NOT_PRODUCT(area->set_size_in_bytes(_size_in_bytes);) + area->set_size_in_bytes(_size_in_bytes); #ifdef ASSERT // clear out first chunk (to detect allocation bugs) if (ZapVMHandleArea) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/handles.hpp --- a/src/share/vm/runtime/handles.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/handles.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -238,7 +238,6 @@ //------------------------------------------------------------------------------------------------------------------------ // Thread local handle area - class HandleArea: public Arena { friend class HandleMark; friend class NoHandleMark; @@ -312,7 +311,7 @@ HandleArea *_area; // saved handle area Chunk *_chunk; // saved arena chunk char *_hwm, *_max; // saved arena info - NOT_PRODUCT(size_t _size_in_bytes;) // size of handle area + size_t _size_in_bytes; // size of handle area // Link to previous active HandleMark in thread HandleMark* _previous_handle_mark; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/handles.inline.hpp --- a/src/share/vm/runtime/handles.inline.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/handles.inline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -85,7 +85,7 @@ area->_chunk = _chunk; area->_hwm = _hwm; area->_max = _max; - NOT_PRODUCT(area->set_size_in_bytes(_size_in_bytes);) + area->set_size_in_bytes(_size_in_bytes); debug_only(area->_handle_mark_nesting--); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/init.cpp --- a/src/share/vm/runtime/init.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/init.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/symbolTable.hpp" #include "code/icBuffer.hpp" #include "gc_interface/collectedHeap.hpp" #include "interpreter/bytecodes.hpp" @@ -157,6 +158,10 @@ // Print the collected safepoint statistics. SafepointSynchronize::print_stat_on_exit(); } + if (PrintStringTableStatistics) { + SymbolTable::dump(tty); + StringTable::dump(tty); + } ostream_exit(); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/java.cpp --- a/src/share/vm/runtime/java.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/java.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -384,7 +384,7 @@ typedef void (*__exit_proc)(void); } -class ExitProc : public CHeapObj { +class ExitProc : public CHeapObj { private: __exit_proc _proc; // void (*_proc)(void); @@ -660,6 +660,7 @@ } JDK_Version JDK_Version::_current; +const char* JDK_Version::_runtime_name; void JDK_Version::initialize() { jdk_version_info info; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/java.hpp --- a/src/share/vm/runtime/java.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/java.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -74,6 +74,7 @@ private: static JDK_Version _current; + static const char* _runtime_name; // In this class, we promote the minor version of release to be the // major version for releases >= 5 in anticipation of the JDK doing the @@ -181,6 +182,13 @@ void to_string(char* buffer, size_t buflen) const; + static const char* runtime_name() { + return _runtime_name; + } + static void set_runtime_name(const char* name) { + _runtime_name = name; + } + // Convenience methods for queries on the current major/minor version static bool is_jdk12x_version() { return current().compare_major(2) == 0; @@ -206,6 +214,10 @@ return current().compare_major(7) == 0; } + static bool is_jdk18x_version() { + return current().compare_major(8) == 0; + } + static bool is_gte_jdk13x_version() { return current().compare_major(3) >= 0; } @@ -225,6 +237,10 @@ static bool is_gte_jdk17x_version() { return current().compare_major(7) >= 0; } + + static bool is_gte_jdk18x_version() { + return current().compare_major(8) >= 0; + } }; #endif // SHARE_VM_RUNTIME_JAVA_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/jniHandles.hpp --- a/src/share/vm/runtime/jniHandles.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/jniHandles.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -109,7 +109,7 @@ // JNI handle blocks holding local/global JNI handles -class JNIHandleBlock : public CHeapObj { +class JNIHandleBlock : public CHeapObj { friend class VMStructs; friend class CppInterpreter; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/monitorChunk.cpp --- a/src/share/vm/runtime/monitorChunk.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/monitorChunk.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,7 +29,7 @@ MonitorChunk::MonitorChunk(int number_on_monitors) { _number_of_monitors = number_on_monitors; - _monitors = NEW_C_HEAP_ARRAY(BasicObjectLock, number_on_monitors); + _monitors = NEW_C_HEAP_ARRAY(BasicObjectLock, number_on_monitors, mtInternal); _next = NULL; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/monitorChunk.hpp --- a/src/share/vm/runtime/monitorChunk.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/monitorChunk.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -30,7 +30,7 @@ // Data structure for holding monitors for one activation during // deoptimization. -class MonitorChunk: public CHeapObj { +class MonitorChunk: public CHeapObj { private: int _number_of_monitors; BasicObjectLock* _monitors; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/mutex.hpp --- a/src/share/vm/runtime/mutex.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/mutex.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -84,7 +84,7 @@ // The default length of monitor name is chosen to be 64 to avoid false sharing. static const int MONITOR_NAME_LEN = 64; -class Monitor : public CHeapObj { +class Monitor : public CHeapObj { public: // A special lock: Is a lock where you are guaranteed not to block while you are diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/os.cpp --- a/src/share/vm/runtime/os.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/os.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -45,6 +45,7 @@ #include "runtime/os.hpp" #include "runtime/stubRoutines.hpp" #include "services/attachListener.hpp" +#include "services/memTracker.hpp" #include "services/threadService.hpp" #include "utilities/defaultStream.hpp" #include "utilities/events.hpp" @@ -433,9 +434,9 @@ // --------------------- heap allocation utilities --------------------- -char *os::strdup(const char *str) { +char *os::strdup(const char *str, MEMFLAGS flags) { size_t size = strlen(str); - char *dup_str = (char *)malloc(size + 1); + char *dup_str = (char *)malloc(size + 1, flags); if (dup_str == NULL) return NULL; strcpy(dup_str, str); return dup_str; @@ -559,7 +560,7 @@ } #endif -void* os::malloc(size_t size) { +void* os::malloc(size_t size, MEMFLAGS memflags, address caller) { NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1)); NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size)); @@ -571,6 +572,7 @@ NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap()); u_char* ptr = (u_char*)::malloc(size + space_before + space_after); + #ifdef ASSERT if (ptr == NULL) return NULL; if (MallocCushion) { @@ -589,18 +591,29 @@ } debug_only(if (paranoid) verify_block(memblock)); if (PrintMalloc && tty != NULL) tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, memblock); + + // we do not track MallocCushion memory + if (MemTracker::is_on()) { + MemTracker::record_malloc((address)memblock, size, memflags, caller == 0 ? CALLER_PC : caller); + } + return memblock; } -void* os::realloc(void *memblock, size_t size) { +void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller) { #ifndef ASSERT NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1)); NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size)); - return ::realloc(memblock, size); + void* ptr = ::realloc(memblock, size); + if (ptr != NULL && MemTracker::is_on()) { + MemTracker::record_realloc((address)memblock, (address)ptr, size, memflags, + caller == 0 ? CALLER_PC : caller); + } + return ptr; #else if (memblock == NULL) { - return malloc(size); + return malloc(size, memflags, (caller == 0 ? CALLER_PC : caller)); } if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) { tty->print_cr("os::realloc caught " PTR_FORMAT, memblock); @@ -610,7 +623,7 @@ NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap()); if (size == 0) return NULL; // always move the block - void* ptr = malloc(size); + void* ptr = malloc(size, memflags, caller == 0 ? CALLER_PC : caller); if (PrintMalloc) tty->print_cr("os::remalloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, memblock, ptr); // Copy to new memory if malloc didn't fail if ( ptr != NULL ) { @@ -627,7 +640,7 @@ } -void os::free(void *memblock) { +void os::free(void *memblock, MEMFLAGS memflags) { NOT_PRODUCT(inc_stat_counter(&num_frees, 1)); #ifdef ASSERT if (memblock == NULL) return; @@ -660,6 +673,8 @@ fprintf(stderr, "os::free " PTR_FORMAT "\n", (uintptr_t)memblock); } #endif + MemTracker::record_free((address)memblock, memflags); + ::free((char*)memblock - space_before); } @@ -1048,7 +1063,7 @@ ++formatted_path_len; } - char* formatted_path = NEW_C_HEAP_ARRAY(char, formatted_path_len + 1); + char* formatted_path = NEW_C_HEAP_ARRAY(char, formatted_path_len + 1, mtInternal); if (formatted_path == NULL) { return NULL; } @@ -1127,7 +1142,7 @@ return NULL; } const char psepchar = *os::path_separator(); - char* inpath = (char*)NEW_C_HEAP_ARRAY(char, strlen(path) + 1); + char* inpath = (char*)NEW_C_HEAP_ARRAY(char, strlen(path) + 1, mtInternal); if (inpath == NULL) { return NULL; } @@ -1140,7 +1155,7 @@ p++; p = strchr(p, psepchar); } - char** opath = (char**) NEW_C_HEAP_ARRAY(char*, count); + char** opath = (char**) NEW_C_HEAP_ARRAY(char*, count, mtInternal); if (opath == NULL) { return NULL; } @@ -1153,7 +1168,7 @@ return NULL; } // allocate the string and add terminator storage - char* s = (char*)NEW_C_HEAP_ARRAY(char, len + 1); + char* s = (char*)NEW_C_HEAP_ARRAY(char, len + 1, mtInternal); if (s == NULL) { return NULL; } @@ -1162,7 +1177,7 @@ opath[i] = s; p += len + 1; } - FREE_C_HEAP_ARRAY(char, inpath); + FREE_C_HEAP_ARRAY(char, inpath, mtInternal); *n = count; return opath; } @@ -1366,3 +1381,97 @@ return (int) i; } + +bool os::create_stack_guard_pages(char* addr, size_t bytes) { + return os::pd_create_stack_guard_pages(addr, bytes); +} + + +char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { + char* result = pd_reserve_memory(bytes, addr, alignment_hint); + if (result != NULL && MemTracker::is_on()) { + MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); + } + + return result; +} +char* os::attempt_reserve_memory_at(size_t bytes, char* addr) { + char* result = pd_attempt_reserve_memory_at(bytes, addr); + if (result != NULL && MemTracker::is_on()) { + MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); + } + return result; +} + +void os::split_reserved_memory(char *base, size_t size, + size_t split, bool realloc) { + pd_split_reserved_memory(base, size, split, realloc); +} + +bool os::commit_memory(char* addr, size_t bytes, bool executable) { + bool res = pd_commit_memory(addr, bytes, executable); + if (res && MemTracker::is_on()) { + MemTracker::record_virtual_memory_commit((address)addr, bytes, CALLER_PC); + } + return res; +} + +bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, + bool executable) { + bool res = os::pd_commit_memory(addr, size, alignment_hint, executable); + if (res && MemTracker::is_on()) { + MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC); + } + return res; +} + +bool os::uncommit_memory(char* addr, size_t bytes) { + bool res = pd_uncommit_memory(addr, bytes); + if (res) { + MemTracker::record_virtual_memory_uncommit((address)addr, bytes); + } + return res; +} + +bool os::release_memory(char* addr, size_t bytes) { + bool res = pd_release_memory(addr, bytes); + if (res) { + MemTracker::record_virtual_memory_release((address)addr, bytes); + } + return res; +} + + +char* os::map_memory(int fd, const char* file_name, size_t file_offset, + char *addr, size_t bytes, bool read_only, + bool allow_exec) { + char* result = pd_map_memory(fd, file_name, file_offset, addr, bytes, read_only, allow_exec); + if (result != NULL && MemTracker::is_on()) { + MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); + } + return result; +} + +char* os::remap_memory(int fd, const char* file_name, size_t file_offset, + char *addr, size_t bytes, bool read_only, + bool allow_exec) { + return pd_remap_memory(fd, file_name, file_offset, addr, bytes, + read_only, allow_exec); +} + +bool os::unmap_memory(char *addr, size_t bytes) { + bool result = pd_unmap_memory(addr, bytes); + if (result) { + MemTracker::record_virtual_memory_release((address)addr, bytes); + } + return result; +} + +void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) { + pd_free_memory(addr, bytes, alignment_hint); +} + +void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { + pd_realign_memory(addr, bytes, alignment_hint); +} + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/os.hpp --- a/src/share/vm/runtime/os.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/os.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -99,6 +99,28 @@ _page_sizes[1] = 0; // sentinel } + static char* pd_reserve_memory(size_t bytes, char* addr = 0, + size_t alignment_hint = 0); + static char* pd_attempt_reserve_memory_at(size_t bytes, char* addr); + static void pd_split_reserved_memory(char *base, size_t size, + size_t split, bool realloc); + static bool pd_commit_memory(char* addr, size_t bytes, bool executable = false); + static bool pd_commit_memory(char* addr, size_t size, size_t alignment_hint, + bool executable = false); + static bool pd_uncommit_memory(char* addr, size_t bytes); + static bool pd_release_memory(char* addr, size_t bytes); + + static char* pd_map_memory(int fd, const char* file_name, size_t file_offset, + char *addr, size_t bytes, bool read_only = false, + bool allow_exec = false); + static char* pd_remap_memory(int fd, const char* file_name, size_t file_offset, + char *addr, size_t bytes, bool read_only, + bool allow_exec); + static bool pd_unmap_memory(char *addr, size_t bytes); + static void pd_free_memory(char *addr, size_t bytes, size_t alignment_hint); + static void pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint); + + public: static void init(void); // Called before command line parsing static jint init_2(void); // Called after command line parsing @@ -236,8 +258,7 @@ static char* attempt_reserve_memory_at(size_t bytes, char* addr); static void split_reserved_memory(char *base, size_t size, size_t split, bool realloc); - static bool commit_memory(char* addr, size_t bytes, - bool executable = false); + static bool commit_memory(char* addr, size_t bytes, bool executable = false); static bool commit_memory(char* addr, size_t size, size_t alignment_hint, bool executable = false); static bool uncommit_memory(char* addr, size_t bytes); @@ -250,6 +271,7 @@ static bool guard_memory(char* addr, size_t bytes); static bool unguard_memory(char* addr, size_t bytes); static bool create_stack_guard_pages(char* addr, size_t bytes); + static bool pd_create_stack_guard_pages(char* addr, size_t bytes); static bool remove_stack_guard_pages(char* addr, size_t bytes); static char* map_memory(int fd, const char* file_name, size_t file_offset, @@ -492,6 +514,7 @@ // Print out system information; they are called by fatal error handler. // Output format may be different on different platforms. static void print_os_info(outputStream* st); + static void print_os_info_brief(outputStream* st); static void print_cpu_info(outputStream* st); static void pd_print_cpu_info(outputStream* st); static void print_memory_info(outputStream* st); @@ -572,12 +595,15 @@ static void* thread_local_storage_at(int index); static void free_thread_local_storage(int index); + // Stack walk + static address get_caller_pc(int n = 0); + // General allocation (must be MT-safe) - static void* malloc (size_t size); - static void* realloc (void *memblock, size_t size); - static void free (void *memblock); + static void* malloc (size_t size, MEMFLAGS flags, address caller_pc = 0); + static void* realloc (void *memblock, size_t size, MEMFLAGS flags, address caller_pc = 0); + static void free (void *memblock, MEMFLAGS flags = mtNone); static bool check_heap(bool force = false); // verify C heap integrity - static char* strdup(const char *); // Like strdup + static char* strdup(const char *, MEMFLAGS flags = mtInternal); // Like strdup #ifndef PRODUCT static julong num_mallocs; // # of calls to malloc/realloc @@ -639,6 +665,10 @@ // On Windows this will create an actual minidump, on Linux/Solaris it will simply check core dump limits static void check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize); + // Get the default path to the core file + // Returns the length of the string + static int get_core_path(char* buffer, size_t bufferSize); + // JVMTI & JVM monitoring and management support // The thread_cpu_time() and current_thread_cpu_time() are only // supported if is_thread_cpu_time_supported() returns true. @@ -685,14 +715,17 @@ // Platform dependent stuff #ifdef TARGET_OS_FAMILY_linux # include "os_linux.hpp" +# include "os_posix.hpp" #endif #ifdef TARGET_OS_FAMILY_solaris # include "os_solaris.hpp" +# include "os_posix.hpp" #endif #ifdef TARGET_OS_FAMILY_windows # include "os_windows.hpp" #endif #ifdef TARGET_OS_FAMILY_bsd +# include "os_posix.hpp" # include "os_bsd.hpp" #endif #ifdef TARGET_OS_ARCH_linux_x86 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/osThread.hpp --- a/src/share/vm/runtime/osThread.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/osThread.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -58,10 +58,9 @@ // the main thread into its own Thread at will. -class OSThread: public CHeapObj { +class OSThread: public CHeapObj { friend class VMStructs; private: - //void* _start_proc; // Thread start routine OSThreadStartFunc _start_proc; // Thread start routine void* _start_parm; // Thread start routine parameter volatile ThreadState _state; // Thread state *hint* @@ -77,10 +76,7 @@ void set_state(ThreadState state) { _state = state; } ThreadState get_state() { return _state; } - // Constructor OSThread(OSThreadStartFunc start_proc, void* start_parm); - - // Destructor ~OSThread(); // Accessors @@ -98,7 +94,6 @@ // For java intrinsics: static ByteSize interrupted_offset() { return byte_offset_of(OSThread, _interrupted); } - static ByteSize thread_id_offset() { return byte_offset_of(OSThread, _thread_id); } // Platform dependent stuff #ifdef TARGET_OS_FAMILY_linux @@ -114,6 +109,19 @@ # include "osThread_bsd.hpp" #endif + public: + static ByteSize thread_id_offset() { return byte_offset_of(OSThread, _thread_id); } + static size_t thread_id_size() { return sizeof(thread_id_t); } + + thread_id_t thread_id() const { return _thread_id; } + + void set_thread_id(thread_id_t id) { _thread_id = id; } + + private: + // _thread_id is kernel thread id (similar to LWP id on Solaris). Each + // thread has a unique thread_id (BsdThreads or NPTL). It can be used + // to access /proc. + thread_id_t _thread_id; }; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/park.cpp --- a/src/share/vm/runtime/park.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/park.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -141,7 +141,7 @@ // although Niagara's hash function should help. void * ParkEvent::operator new (size_t sz) { - return (void *) ((intptr_t (CHeapObj::operator new (sz + 256)) + 256) & -256) ; + return (void *) ((intptr_t (AllocateHeap(sz + 256, mtInternal, CALLER_PC)) + 256) & -256) ; } void ParkEvent::operator delete (void * a) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/perfData.cpp --- a/src/share/vm/runtime/perfData.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/perfData.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -81,7 +81,7 @@ const char* prefix = PerfDataManager::ns_to_string(ns); - _name = NEW_C_HEAP_ARRAY(char, strlen(name) + strlen(prefix) + 2); + _name = NEW_C_HEAP_ARRAY(char, strlen(name) + strlen(prefix) + 2, mtInternal); assert(_name != NULL && strlen(name) != 0, "invalid name"); if (ns == NULL_NS) { @@ -111,10 +111,10 @@ PerfData::~PerfData() { if (_name != NULL) { - FREE_C_HEAP_ARRAY(char, _name); + FREE_C_HEAP_ARRAY(char, _name, mtInternal); } if (is_on_c_heap()) { - FREE_C_HEAP_ARRAY(PerfDataEntry, _pdep); + FREE_C_HEAP_ARRAY(PerfDataEntry, _pdep, mtInternal); } } @@ -137,7 +137,7 @@ if (psmp == NULL) { // out of PerfMemory memory resources. allocate on the C heap // to avoid vm termination. - psmp = NEW_C_HEAP_ARRAY(char, size); + psmp = NEW_C_HEAP_ARRAY(char, size, mtInternal); _on_c_heap = true; } @@ -559,12 +559,12 @@ PerfDataList::PerfDataList(int length) { - _set = new(ResourceObj::C_HEAP) PerfDataArray(length, true); + _set = new(ResourceObj::C_HEAP, mtInternal) PerfDataArray(length, true); } PerfDataList::PerfDataList(PerfDataList* p) { - _set = new(ResourceObj::C_HEAP) PerfDataArray(p->length(), true); + _set = new(ResourceObj::C_HEAP, mtInternal) PerfDataArray(p->length(), true); _set->appendAll(p->get_impl()); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/perfData.hpp --- a/src/share/vm/runtime/perfData.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/perfData.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -240,7 +240,7 @@ * be removed from the product in the future. * */ -class PerfData : public CHeapObj { +class PerfData : public CHeapObj { friend class StatSampler; // for access to protected void sample() friend class PerfDataManager; // for access to protected destructor @@ -342,7 +342,7 @@ * invoke the take_sample() method and write the value returned to its * appropriate location in the PerfData memory region. */ -class PerfLongSampleHelper : public CHeapObj { +class PerfLongSampleHelper : public CHeapObj { public: virtual jlong take_sample() = 0; }; @@ -591,7 +591,7 @@ * some other implementation, as long as that implementation provides * a mechanism to iterate over the container by index. */ -class PerfDataList : public CHeapObj { +class PerfDataList : public CHeapObj { private: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/perfMemory.cpp --- a/src/share/vm/runtime/perfMemory.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/perfMemory.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -112,7 +112,7 @@ warning("Could not create PerfData Memory region, reverting to malloc"); } - _prologue = NEW_C_HEAP_OBJ(PerfDataPrologue); + _prologue = NEW_C_HEAP_OBJ(PerfDataPrologue, mtInternal); } else { @@ -244,10 +244,10 @@ if (PerfDataSaveFile != NULL) { // dest_file_name stores the validated file name if file_name // contains %p which will be replaced by pid. - dest_file = NEW_C_HEAP_ARRAY(char, JVM_MAXPATHLEN); + dest_file = NEW_C_HEAP_ARRAY(char, JVM_MAXPATHLEN, mtInternal); if(!Arguments::copy_expand_pid(PerfDataSaveFile, strlen(PerfDataSaveFile), dest_file, JVM_MAXPATHLEN)) { - FREE_C_HEAP_ARRAY(char, dest_file); + FREE_C_HEAP_ARRAY(char, dest_file, mtInternal); if (PrintMiscellaneous && Verbose) { warning("Invalid performance data file path name specified, "\ "fall back to a default name"); @@ -257,7 +257,7 @@ } } // create the name of the file for retaining the instrumentation memory. - dest_file = NEW_C_HEAP_ARRAY(char, PERFDATA_FILENAME_LEN); + dest_file = NEW_C_HEAP_ARRAY(char, PERFDATA_FILENAME_LEN, mtInternal); jio_snprintf(dest_file, PERFDATA_FILENAME_LEN, "%s_%d", PERFDATA_NAME, os::current_process_id()); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/reflection.cpp --- a/src/share/vm/runtime/reflection.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/reflection.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -829,7 +829,7 @@ java_lang_reflect_Field::set_modifiers(rh(), fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS); java_lang_reflect_Field::set_override(rh(), false); if (java_lang_reflect_Field::has_signature_field() && - fd->generic_signature() != NULL) { + fd->has_generic_signature()) { Symbol* gs = fd->generic_signature(); Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL); java_lang_reflect_Field::set_signature(rh(), sig()); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/reflectionUtils.cpp --- a/src/share/vm/runtime/reflectionUtils.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/reflectionUtils.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -59,7 +59,7 @@ GrowableArray *FilteredFieldsMap::_filtered_fields = - new (ResourceObj::C_HEAP) GrowableArray(3,true); + new (ResourceObj::C_HEAP, mtInternal) GrowableArray(3,true); void FilteredFieldsMap::initialize() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/relocator.cpp --- a/src/share/vm/runtime/relocator.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/relocator.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -392,16 +392,16 @@ // The width of instruction at "pc" is changing by "delta". Adjust the // exception table, if any, of "rc->mb". void Relocator::adjust_exception_table(int bci, int delta) { - typeArrayOop table = method()->exception_table(); - for (int index = 0; index < table->length(); index +=4) { - if (table->int_at(index) > bci) { - table->int_at_put(index+0, table->int_at(index+0) + delta); - table->int_at_put(index+1, table->int_at(index+1) + delta); - } else if (bci < table->int_at(index+1)) { - table->int_at_put(index+1, table->int_at(index+1) + delta); + ExceptionTable table(_method()); + for (int index = 0; index < table.length(); index ++) { + if (table.start_pc(index) > bci) { + table.set_start_pc(index, table.start_pc(index) + delta); + table.set_end_pc(index, table.end_pc(index) + delta); + } else if (bci < table.end_pc(index)) { + table.set_end_pc(index, table.end_pc(index) + delta); } - if (table->int_at(index+2) > bci) - table->int_at_put(index+2, table->int_at(index+2) + delta); + if (table.handler_pc(index) > bci) + table.set_handler_pc(index, table.handler_pc(index) + delta); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/safepoint.cpp --- a/src/share/vm/runtime/safepoint.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/safepoint.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/symbolTable.hpp" #include "classfile/systemDictionary.hpp" #include "code/codeCache.hpp" #include "code/icBuffer.hpp" @@ -47,6 +48,7 @@ #include "runtime/stubRoutines.hpp" #include "runtime/sweeper.hpp" #include "runtime/synchronizer.hpp" +#include "services/memTracker.hpp" #include "services/runtimeService.hpp" #include "utilities/events.hpp" #ifdef TARGET_ARCH_x86 @@ -526,13 +528,29 @@ CompilationPolicy::policy()->do_safepoint_work(); } - TraceTime t4("sweeping nmethods", TraceSafepointCleanupTime); - NMethodSweeper::scan_stacks(); + { + TraceTime t4("sweeping nmethods", TraceSafepointCleanupTime); + NMethodSweeper::scan_stacks(); + } + + if (SymbolTable::needs_rehashing()) { + TraceTime t5("rehashing symbol table", TraceSafepointCleanupTime); + SymbolTable::rehash_table(); + } + + if (StringTable::needs_rehashing()) { + TraceTime t6("rehashing string table", TraceSafepointCleanupTime); + StringTable::rehash_table(); + } // rotate log files? if (UseGCLogFileRotation) { gclog_or_tty->rotate_log(); } + + if (MemTracker::is_on()) { + MemTracker::sync(); + } } @@ -1144,7 +1162,7 @@ stats_array_size = PrintSafepointStatisticsCount; } _safepoint_stats = (SafepointStats*)os::malloc(stats_array_size - * sizeof(SafepointStats)); + * sizeof(SafepointStats), mtInternal); guarantee(_safepoint_stats != NULL, "not enough memory for safepoint instrumentation data"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/safepoint.hpp --- a/src/share/vm/runtime/safepoint.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/safepoint.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -190,7 +190,7 @@ }; // State class for a thread suspended at a safepoint -class ThreadSafepointState: public CHeapObj { +class ThreadSafepointState: public CHeapObj { public: // These states are maintained by VM thread while threads are being brought // to a safepoint. After SafepointSynchronize::end(), they are reset to diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/sharedRuntime.cpp --- a/src/share/vm/runtime/sharedRuntime.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/sharedRuntime.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -2117,7 +2117,7 @@ // A simple wrapper class around the calling convention information // that allows sharing of adapters for the same calling convention. -class AdapterFingerPrint : public CHeapObj { +class AdapterFingerPrint : public CHeapObj { private: union { int _compact[3]; @@ -2174,7 +2174,7 @@ ptr = _value._compact; } else { _length = len; - _value._fingerprint = NEW_C_HEAP_ARRAY(int, _length); + _value._fingerprint = NEW_C_HEAP_ARRAY(int, _length, mtCode); ptr = _value._fingerprint; } @@ -2193,7 +2193,7 @@ ~AdapterFingerPrint() { if (_length > 0) { - FREE_C_HEAP_ARRAY(int, _value._fingerprint); + FREE_C_HEAP_ARRAY(int, _value._fingerprint, mtCode); } } @@ -2251,7 +2251,7 @@ // A hashtable mapping from AdapterFingerPrints to AdapterHandlerEntries -class AdapterHandlerTable : public BasicHashtable { +class AdapterHandlerTable : public BasicHashtable { friend class AdapterHandlerTableIterator; private: @@ -2265,16 +2265,16 @@ #endif AdapterHandlerEntry* bucket(int i) { - return (AdapterHandlerEntry*)BasicHashtable::bucket(i); + return (AdapterHandlerEntry*)BasicHashtable::bucket(i); } public: AdapterHandlerTable() - : BasicHashtable(293, sizeof(AdapterHandlerEntry)) { } + : BasicHashtable(293, sizeof(AdapterHandlerEntry)) { } // Create a new entry suitable for insertion in the table AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint, address i2c_entry, address c2i_entry, address c2i_unverified_entry) { - AdapterHandlerEntry* entry = (AdapterHandlerEntry*)BasicHashtable::new_entry(fingerprint->compute_hash()); + AdapterHandlerEntry* entry = (AdapterHandlerEntry*)BasicHashtable::new_entry(fingerprint->compute_hash()); entry->init(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry); return entry; } @@ -2287,7 +2287,7 @@ void free_entry(AdapterHandlerEntry* entry) { entry->deallocate(); - BasicHashtable::free_entry(entry); + BasicHashtable::free_entry(entry); } // Find a entry with the same fingerprint if it exists @@ -2572,8 +2572,8 @@ void AdapterHandlerEntry::deallocate() { delete _fingerprint; #ifdef ASSERT - if (_saved_code) FREE_C_HEAP_ARRAY(unsigned char, _saved_code); - if (_saved_sig) FREE_C_HEAP_ARRAY(Basictype, _saved_sig); + if (_saved_code) FREE_C_HEAP_ARRAY(unsigned char, _saved_code, mtCode); + if (_saved_sig) FREE_C_HEAP_ARRAY(Basictype, _saved_sig, mtCode); #endif } @@ -2583,11 +2583,11 @@ // against other versions. If the code is captured after relocation // then relative instructions won't be equivalent. void AdapterHandlerEntry::save_code(unsigned char* buffer, int length, int total_args_passed, BasicType* sig_bt) { - _saved_code = NEW_C_HEAP_ARRAY(unsigned char, length); + _saved_code = NEW_C_HEAP_ARRAY(unsigned char, length, mtCode); _code_length = length; memcpy(_saved_code, buffer, length); _total_args_passed = total_args_passed; - _saved_sig = NEW_C_HEAP_ARRAY(BasicType, _total_args_passed); + _saved_sig = NEW_C_HEAP_ARRAY(BasicType, _total_args_passed, mtCode); memcpy(_saved_sig, sig_bt, _total_args_passed * sizeof(BasicType)); } @@ -2893,7 +2893,7 @@ int max_locals = moop->max_locals(); // Allocate temp buffer, 1 word per local & 2 per active monitor int buf_size_words = max_locals + active_monitor_count*2; - intptr_t *buf = NEW_C_HEAP_ARRAY(intptr_t,buf_size_words); + intptr_t *buf = NEW_C_HEAP_ARRAY(intptr_t,buf_size_words, mtCode); // Copy the locals. Order is preserved so that loading of longs works. // Since there's no GC I can copy the oops blindly. @@ -2923,7 +2923,7 @@ JRT_END JRT_LEAF(void, SharedRuntime::OSR_migration_end( intptr_t* buf) ) - FREE_C_HEAP_ARRAY(intptr_t,buf); + FREE_C_HEAP_ARRAY(intptr_t,buf, mtCode); JRT_END bool AdapterHandlerLibrary::contains(CodeBlob* b) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/sharedRuntime.hpp --- a/src/share/vm/runtime/sharedRuntime.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/sharedRuntime.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -610,7 +610,7 @@ // used by the adapters. The code generation happens here because it's very // similar to what the adapters have to do. -class AdapterHandlerEntry : public BasicHashtableEntry { +class AdapterHandlerEntry : public BasicHashtableEntry { friend class AdapterHandlerTable; private: @@ -656,7 +656,7 @@ AdapterFingerPrint* fingerprint() { return _fingerprint; } AdapterHandlerEntry* next() { - return (AdapterHandlerEntry*)BasicHashtableEntry::next(); + return (AdapterHandlerEntry*)BasicHashtableEntry::next(); } #ifdef ASSERT diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/stubCodeGenerator.hpp --- a/src/share/vm/runtime/stubCodeGenerator.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/stubCodeGenerator.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -36,7 +36,7 @@ // Currently, code descriptors are simply chained in a linked list, // this may have to change if searching becomes too slow. -class StubCodeDesc: public CHeapObj { +class StubCodeDesc: public CHeapObj { protected: static StubCodeDesc* _list; // the list of all descriptors static int _count; // length of list diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/sweeper.cpp --- a/src/share/vm/runtime/sweeper.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/sweeper.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -228,7 +228,7 @@ #ifdef ASSERT if (LogSweeper && _records == NULL) { // Create the ring buffer for the logging code - _records = NEW_C_HEAP_ARRAY(SweeperRecord, SweeperLogEntries); + _records = NEW_C_HEAP_ARRAY(SweeperRecord, SweeperLogEntries, mtGC); memset(_records, 0, sizeof(SweeperRecord) * SweeperLogEntries); } #endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/task.hpp --- a/src/share/vm/runtime/task.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/task.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,7 +35,7 @@ // ... // pf.disenroll(); -class PeriodicTask: public CHeapObj { +class PeriodicTask: public CHeapObj { public: // Useful constants. // The interval constants are used to ensure the declared interval diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/thread.cpp --- a/src/share/vm/runtime/thread.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/thread.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -73,6 +73,7 @@ #include "runtime/vm_operations.hpp" #include "services/attachListener.hpp" #include "services/management.hpp" +#include "services/memTracker.hpp" #include "services/threadService.hpp" #include "trace/traceEventTypes.hpp" #include "utilities/defaultStream.hpp" @@ -159,6 +160,7 @@ #endif // ndef DTRACE_ENABLED + // Class hierarchy // - Thread // - VMThread @@ -168,13 +170,13 @@ // - CompilerThread // ======= Thread ======== - // Support for forcing alignment of thread objects for biased locking -void* Thread::operator new(size_t size) { +void* Thread::allocate(size_t size, bool throw_excpt, MEMFLAGS flags) { if (UseBiasedLocking) { const int alignment = markOopDesc::biased_lock_alignment; size_t aligned_size = size + (alignment - sizeof(intptr_t)); - void* real_malloc_addr = CHeapObj::operator new(aligned_size); + void* real_malloc_addr = throw_excpt? AllocateHeap(aligned_size, flags, CURRENT_PC) + : os::malloc(aligned_size, flags, CURRENT_PC); void* aligned_addr = (void*) align_size_up((intptr_t) real_malloc_addr, alignment); assert(((uintptr_t) aligned_addr + (uintptr_t) size) <= ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size), @@ -187,16 +189,17 @@ ((Thread*) aligned_addr)->_real_malloc_address = real_malloc_addr; return aligned_addr; } else { - return CHeapObj::operator new(size); + return throw_excpt? AllocateHeap(size, flags, CURRENT_PC) + : os::malloc(size, flags, CURRENT_PC); } } void Thread::operator delete(void* p) { if (UseBiasedLocking) { void* real_malloc_addr = ((Thread*) p)->_real_malloc_address; - CHeapObj::operator delete(real_malloc_addr); + FreeHeap(real_malloc_addr, mtThread); } else { - CHeapObj::operator delete(p); + FreeHeap(p, mtThread); } } @@ -214,8 +217,8 @@ // allocated data structures set_osthread(NULL); - set_resource_area(new ResourceArea()); - set_handle_area(new HandleArea(NULL)); + set_resource_area(new (mtThread)ResourceArea()); + set_handle_area(new (mtThread) HandleArea(NULL)); set_active_handles(NULL); set_free_handle_block(NULL); set_last_handle_mark(NULL); @@ -306,12 +309,17 @@ // set up any platform-specific state. os::initialize_thread(); - } void Thread::record_stack_base_and_size() { set_stack_base(os::current_stack_base()); set_stack_size(os::current_stack_size()); + + // record thread's native stack, stack grows downward + address vm_base = _stack_base - _stack_size; + MemTracker::record_virtual_memory_reserve(vm_base, _stack_size, + CURRENT_PC, this); + MemTracker::record_virtual_memory_type(vm_base, mtThreadStack); } @@ -319,6 +327,9 @@ // Reclaim the objectmonitors from the omFreeList of the moribund thread. ObjectSynchronizer::omFlush (this) ; + MemTracker::record_virtual_memory_release((_stack_base - _stack_size), + _stack_size, this); + // deallocate data structures delete resource_area(); // since the handle marks are using the handle area, we have to deallocated the root @@ -996,6 +1007,29 @@ vmSymbols::void_method_signature(), CHECK); } +char java_runtime_name[128] = ""; + +// extract the JRE name from sun.misc.Version.java_runtime_name +static const char* get_java_runtime_name(TRAPS) { + klassOop k = SystemDictionary::find(vmSymbols::sun_misc_Version(), + Handle(), Handle(), CHECK_AND_CLEAR_NULL); + fieldDescriptor fd; + bool found = k != NULL && + instanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_name_name(), + vmSymbols::string_signature(), &fd); + if (found) { + oop name_oop = k->java_mirror()->obj_field(fd.offset()); + if (name_oop == NULL) + return NULL; + const char* name = java_lang_String::as_utf8_string(name_oop, + java_runtime_name, + sizeof(java_runtime_name)); + return name; + } else { + return NULL; + } +} + // General purpose hook into Java code, run once when the VM is initialized. // The Java library method itself may be changed independently from the VM. static void call_postVMInitHook(TRAPS) { @@ -1105,14 +1139,14 @@ NamedThread::~NamedThread() { if (_name != NULL) { - FREE_C_HEAP_ARRAY(char, _name); + FREE_C_HEAP_ARRAY(char, _name, mtThread); _name = NULL; } } void NamedThread::set_name(const char* format, ...) { guarantee(_name == NULL, "Only get to set name once."); - _name = NEW_C_HEAP_ARRAY(char, max_name_len); + _name = NEW_C_HEAP_ARRAY(char, max_name_len, mtThread); guarantee(_name != NULL, "alloc failure"); va_list ap; va_start(ap, format); @@ -1295,6 +1329,7 @@ set_monitor_chunks(NULL); set_next(NULL); set_thread_state(_thread_new); + set_recorder(NULL); _terminated = _not_terminated; _privileged_stack_top = NULL; _array_for_gc = NULL; @@ -1370,6 +1405,7 @@ _jni_attach_state = _not_attaching_via_jni; } assert(_deferred_card_mark.is_empty(), "Default MemRegion ctor"); + _safepoint_visible = false; } bool JavaThread::reguard_stack(address cur_sp) { @@ -1432,7 +1468,7 @@ thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread : os::java_thread; os::create_thread(this, thr_type, stack_sz); - + _safepoint_visible = false; // The _osthread may be NULL here because we ran out of memory (too many threads active). // We need to throw and OutOfMemoryError - however we cannot do this here because the caller // may hold a lock and all locks must be unlocked before throwing the exception (throwing @@ -1450,6 +1486,11 @@ tty->print_cr("terminate thread %p", this); } + // Info NMT that this JavaThread is exiting, its memory + // recorder should be collected + assert(!is_safepoint_visible(), "wrong state"); + MemTracker::thread_exiting(this); + // JSR166 -- return the parker to the free list Parker::Release(_parker); _parker = NULL ; @@ -2892,7 +2933,7 @@ void JavaThread::popframe_preserve_args(ByteSize size_in_bytes, void* start) { assert(_popframe_preserved_args == NULL, "should not wipe out old PopFrame preserved arguments"); if (in_bytes(size_in_bytes) != 0) { - _popframe_preserved_args = NEW_C_HEAP_ARRAY(char, in_bytes(size_in_bytes)); + _popframe_preserved_args = NEW_C_HEAP_ARRAY(char, in_bytes(size_in_bytes), mtThread); _popframe_preserved_args_size = in_bytes(size_in_bytes); Copy::conjoint_jbytes(start, _popframe_preserved_args, _popframe_preserved_args_size); } @@ -2914,7 +2955,7 @@ void JavaThread::popframe_free_preserved_args() { assert(_popframe_preserved_args != NULL, "should not free PopFrame preserved arguments twice"); - FREE_C_HEAP_ARRAY(char, (char*) _popframe_preserved_args); + FREE_C_HEAP_ARRAY(char, (char*) _popframe_preserved_args, mtThread); _popframe_preserved_args = NULL; _popframe_preserved_args_size = 0; } @@ -3163,6 +3204,14 @@ jint os_init_2_result = os::init_2(); if (os_init_2_result != JNI_OK) return os_init_2_result; + // intialize TLS + ThreadLocalStorage::init(); + + // Bootstrap native memory tracking, so it can start recording memory + // activities before worker thread is started. This is the first phase + // of bootstrapping, VM is currently running in single-thread mode. + MemTracker::bootstrap_single_thread(); + // Initialize output stream logging ostream_init_log(); @@ -3182,9 +3231,6 @@ _number_of_threads = 0; _number_of_non_daemon_threads = 0; - // Initialize TLS - ThreadLocalStorage::init(); - // Initialize global data structures and create system classes in heap vm_init_globals(); @@ -3216,6 +3262,9 @@ // Initialize Java-Level synchronization subsystem ObjectMonitor::Initialize() ; + // Second phase of bootstrapping, VM is about entering multi-thread mode + MemTracker::bootstrap_multi_thread(); + // Initialize global modules jint status = init_globals(); if (status != JNI_OK) { @@ -3243,6 +3292,9 @@ Universe::verify(); // make sure we're starting with a clean slate } + // Fully start NMT + MemTracker::start(); + // Create the VMThread { TraceTime timer("Start VMThread", TraceStartupTime); VMThread::create(); @@ -3352,6 +3404,9 @@ // The VM creates & returns objects of this class. Make sure it's initialized. initialize_class(vmSymbols::java_lang_Class(), CHECK_0); call_initializeSystemClass(CHECK_0); + + // get the Java runtime name after java.lang.System is initialized + JDK_Version::set_runtime_name(get_java_runtime_name(THREAD)); } else { warning("java.lang.System not initialized"); } @@ -3544,11 +3599,11 @@ if (library == NULL) { const char *sub_msg = " in absolute path, with error: "; size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1; - char *buf = NEW_C_HEAP_ARRAY(char, len); + char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread); jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf); // If we can't find the agent, exit. vm_exit_during_initialization(buf, NULL); - FREE_C_HEAP_ARRAY(char, buf); + FREE_C_HEAP_ARRAY(char, buf, mtThread); } } else { // Try to load the agent from the standard dll directory @@ -3562,7 +3617,7 @@ const char *fmt = "%s/bin/java %s -Dkernel.background.download=false" " sun.jkernel.DownloadManager -download client_jvm"; size_t length = strlen(props) + strlen(home) + strlen(fmt) + 1; - char *cmd = NEW_C_HEAP_ARRAY(char, length); + char *cmd = NEW_C_HEAP_ARRAY(char, length, mtThread); jio_snprintf(cmd, length, fmt, home, props); int status = os::fork_and_exec(cmd); FreeHeap(props); @@ -3571,7 +3626,7 @@ vm_exit_during_initialization("fork_and_exec failed: %s", strerror(errno)); } - FREE_C_HEAP_ARRAY(char, cmd); + FREE_C_HEAP_ARRAY(char, cmd, mtThread); // when this comes back the instrument.dll should be where it belongs. library = os::dll_load(buffer, ebuf, sizeof ebuf); } @@ -3583,11 +3638,11 @@ if (library == NULL) { const char *sub_msg = " on the library path, with error: "; size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1; - char *buf = NEW_C_HEAP_ARRAY(char, len); + char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread); jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf); // If we can't find the agent, exit. vm_exit_during_initialization(buf, NULL); - FREE_C_HEAP_ARRAY(char, buf); + FREE_C_HEAP_ARRAY(char, buf, mtThread); } } } @@ -3756,6 +3811,7 @@ // and VM_Exit op at VM level. // // Shutdown sequence: +// + Shutdown native memory tracking if it is on // + Wait until we are the last non-daemon thread to execute // <-- every thing is still working at this moment --> // + Call java.lang.Shutdown.shutdown(), which will invoke Java level @@ -3801,6 +3857,10 @@ Mutex::_as_suspend_equivalent_flag); } + // Shutdown NMT before exit. Otherwise, + // it will run into trouble when system destroys static variables. + MemTracker::shutdown(MemTracker::NMT_normal); + // Hang forever on exit if we are reporting an error. if (ShowMessageBoxOnError && is_error_reported()) { os::infinite_sleep(); @@ -3907,6 +3967,8 @@ daemon = false; } + p->set_safepoint_visible(true); + ThreadService::add_thread(p, daemon); // Possible GC point. @@ -3952,6 +4014,10 @@ // to do callbacks into the safepoint code. However, the safepoint code is not aware // of this thread since it is removed from the queue. p->set_terminated_value(); + + // Now, this thread is not visible to safepoint + p->set_safepoint_visible(false); + } // unlock Threads_lock // Since Events::log uses a lock, we grab it outside the Threads_lock diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/thread.hpp --- a/src/share/vm/runtime/thread.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/thread.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -41,6 +41,7 @@ #include "runtime/stubRoutines.hpp" #include "runtime/threadLocalStorage.hpp" #include "runtime/unhandledOops.hpp" +#include "services/memRecorder.hpp" #include "trace/tracing.hpp" #include "utilities/exceptions.hpp" #include "utilities/top.hpp" @@ -100,12 +101,16 @@ //oop _pending_exception; // pending exception for current thread // const char* _exception_file; // file information for exception (debugging only) // int _exception_line; // line information for exception (debugging only) - + protected: // Support for forcing alignment of thread objects for biased locking void* _real_malloc_address; public: - void* operator new(size_t size); + void* operator new(size_t size) { return allocate(size, true); } + void* operator new(size_t size, std::nothrow_t& nothrow_constant) { return allocate(size, false); } void operator delete(void* p); + + protected: + static void* allocate(size_t size, bool throw_excpt, MEMFLAGS flags = mtThread); private: // *************************************************************** @@ -548,7 +553,6 @@ virtual void print_on_error(outputStream* st, char* buf, int buflen) const; // Debug-only code - #ifdef ASSERT private: // Deadlock detection support for Mutex locks. List of locks own by thread. @@ -1027,9 +1031,15 @@ bool do_not_unlock_if_synchronized() { return _do_not_unlock_if_synchronized; } void set_do_not_unlock_if_synchronized(bool val) { _do_not_unlock_if_synchronized = val; } + // native memory tracking + inline MemRecorder* get_recorder() const { return (MemRecorder*)_recorder; } + inline void set_recorder(MemRecorder* rc) { _recorder = (volatile MemRecorder*)rc; } + + private: + // per-thread memory recorder + volatile MemRecorder* _recorder; // Suspend/resume support for JavaThread - private: void set_ext_suspended() { set_suspend_flag (_ext_suspended); } void clear_ext_suspended() { clear_suspend_flag(_ext_suspended); } @@ -1453,6 +1463,18 @@ return result; } + // NMT (Native memory tracking) support. + // This flag helps NMT to determine if this JavaThread will be blocked + // at safepoint. If not, ThreadCritical is needed for writing memory records. + // JavaThread is only safepoint visible when it is in Threads' thread list, + // it is not visible until it is added to the list and becomes invisible + // once it is removed from the list. + public: + bool is_safepoint_visible() const { return _safepoint_visible; } + void set_safepoint_visible(bool visible) { _safepoint_visible = visible; } + private: + bool _safepoint_visible; + // Static operations public: // Returns the running thread as a JavaThread diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/unhandledOops.cpp --- a/src/share/vm/runtime/unhandledOops.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/unhandledOops.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -37,7 +37,7 @@ UnhandledOops::UnhandledOops(Thread* thread) { _thread = thread; - _oop_list = new (ResourceObj::C_HEAP) + _oop_list = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(free_list_size, true); _level = 0; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/vframeArray.cpp --- a/src/share/vm/runtime/vframeArray.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/vframeArray.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -443,7 +443,7 @@ // Allocate the vframeArray vframeArray * result = (vframeArray*) AllocateHeap(sizeof(vframeArray) + // fixed part sizeof(vframeArrayElement) * (chunk->length() - 1), // variable part - "vframeArray::allocate"); + mtCompiler); result->_frames = chunk->length(); result->_owner_thread = thread; result->_sender = sender; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/vframeArray.hpp --- a/src/share/vm/runtime/vframeArray.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/vframeArray.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -108,7 +108,7 @@ // but it does make debugging easier even if we can't look // at the data in each vframeElement -class vframeArray: public CHeapObj { +class vframeArray: public CHeapObj { friend class VMStructs; private: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/vframe_hp.cpp --- a/src/share/vm/runtime/vframe_hp.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/vframe_hp.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -154,7 +154,7 @@ } else { // No deferred updates pending for this thread. // allocate in C heap - deferred = new(ResourceObj::C_HEAP) GrowableArray (1, true); + deferred = new(ResourceObj::C_HEAP, mtCompiler) GrowableArray (1, true); thread()->set_deferred_locals(deferred); } deferred->push(new jvmtiDeferredLocalVariableSet(method(), bci(), fr().id())); @@ -323,7 +323,7 @@ _bci = bci; _id = id; // Alway will need at least one, must be on C heap - _locals = new(ResourceObj::C_HEAP) GrowableArray (1, true); + _locals = new(ResourceObj::C_HEAP, mtCompiler) GrowableArray (1, true); } jvmtiDeferredLocalVariableSet::~jvmtiDeferredLocalVariableSet() { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/vframe_hp.hpp --- a/src/share/vm/runtime/vframe_hp.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/vframe_hp.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -89,7 +89,7 @@ // any updated locals. class jvmtiDeferredLocalVariable; -class jvmtiDeferredLocalVariableSet : public CHeapObj { +class jvmtiDeferredLocalVariableSet : public CHeapObj { private: methodOop _method; // must be GC'd @@ -119,7 +119,7 @@ }; -class jvmtiDeferredLocalVariable : public CHeapObj { +class jvmtiDeferredLocalVariable : public CHeapObj { public: jvmtiDeferredLocalVariable(int index, BasicType type, jvalue value); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/virtualspace.cpp --- a/src/share/vm/runtime/virtualspace.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/virtualspace.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -26,6 +26,7 @@ #include "oops/markOop.hpp" #include "oops/oop.inline.hpp" #include "runtime/virtualspace.hpp" +#include "services/memTracker.hpp" #ifdef TARGET_OS_FAMILY_linux # include "os_linux.inline.hpp" #endif @@ -489,6 +490,10 @@ (UseCompressedOops && (Universe::narrow_oop_base() != NULL) && Universe::narrow_oop_use_implicit_null_checks()) ? lcm(os::vm_page_size(), alignment) : 0) { + if (base() > 0) { + MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); + } + // Only reserved space for the java heap should have a noaccess_prefix // if using compressed oops. protect_noaccess_prefix(size); @@ -504,6 +509,10 @@ (UseCompressedOops && (Universe::narrow_oop_base() != NULL) && Universe::narrow_oop_use_implicit_null_checks()) ? lcm(os::vm_page_size(), prefix_align) : 0) { + if (base() > 0) { + MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); + } + protect_noaccess_prefix(prefix_size+suffix_size); } @@ -513,6 +522,7 @@ size_t rs_align, bool large) : ReservedSpace(r_size, rs_align, large, /*executable*/ true) { + MemTracker::record_virtual_memory_type((address)base(), mtCode); } // VirtualSpace diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/vmStructs.cpp --- a/src/share/vm/runtime/vmStructs.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/vmStructs.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -235,7 +235,6 @@ #ifndef REG_COUNT #define REG_COUNT 0 #endif - // whole purpose of this function is to work around bug c++/27724 in gcc 4.1.1 // with optimization turned on it doesn't affect produced code static inline uint64_t cast_uint64_t(size_t x) @@ -244,6 +243,16 @@ } +typedef HashtableEntry IntptrHashtableEntry; +typedef Hashtable IntptrHashtable; +typedef Hashtable SymbolHashtable; +typedef HashtableEntry SymbolHashtableEntry; +typedef Hashtable StringHashtable; +typedef TwoOopHashtable klassOopTwoOopHashtable; +typedef Hashtable klassOopHashtable; +typedef HashtableEntry klassHashtableEntry; +typedef TwoOopHashtable SymbolTwoOopHashtable; + //-------------------------------------------------------------------------------- // VM_STRUCTS // @@ -299,7 +308,7 @@ nonstatic_field(instanceKlass, _protection_domain, oop) \ nonstatic_field(instanceKlass, _signers, objArrayOop) \ nonstatic_field(instanceKlass, _source_file_name, Symbol*) \ - nonstatic_field(instanceKlass, _source_debug_extension, Symbol*) \ + nonstatic_field(instanceKlass, _source_debug_extension, char*) \ nonstatic_field(instanceKlass, _inner_classes, typeArrayOop) \ nonstatic_field(instanceKlass, _nonstatic_field_size, int) \ nonstatic_field(instanceKlass, _static_field_size, int) \ @@ -358,7 +367,6 @@ nonstatic_field(methodDataOopDesc, _arg_stack, intx) \ nonstatic_field(methodDataOopDesc, _arg_returned, intx) \ nonstatic_field(methodOopDesc, _constMethod, constMethodOop) \ - nonstatic_field(methodOopDesc, _constants, constantPoolOop) \ nonstatic_field(methodOopDesc, _method_data, methodDataOop) \ nonstatic_field(methodOopDesc, _interpreter_invocation_count, int) \ nonstatic_field(methodOopDesc, _access_flags, AccessFlags) \ @@ -378,9 +386,8 @@ volatile_nonstatic_field(methodOopDesc, _from_compiled_entry, address) \ volatile_nonstatic_field(methodOopDesc, _from_interpreted_entry, address) \ volatile_nonstatic_field(constMethodOopDesc, _fingerprint, uint64_t) \ - nonstatic_field(constMethodOopDesc, _method, methodOop) \ + nonstatic_field(constMethodOopDesc, _constants, constantPoolOop) \ nonstatic_field(constMethodOopDesc, _stackmap_data, typeArrayOop) \ - nonstatic_field(constMethodOopDesc, _exception_table, typeArrayOop) \ nonstatic_field(constMethodOopDesc, _constMethod_size, int) \ nonstatic_field(constMethodOopDesc, _interpreter_kind, jbyte) \ nonstatic_field(constMethodOopDesc, _flags, jbyte) \ @@ -417,6 +424,10 @@ nonstatic_field(LocalVariableTableElement, descriptor_cp_index, u2) \ nonstatic_field(LocalVariableTableElement, signature_cp_index, u2) \ nonstatic_field(LocalVariableTableElement, slot, u2) \ + nonstatic_field(ExceptionTableElement, start_pc, u2) \ + nonstatic_field(ExceptionTableElement, end_pc, u2) \ + nonstatic_field(ExceptionTableElement, handler_pc, u2) \ + nonstatic_field(ExceptionTableElement, catch_type_index, u2) \ nonstatic_field(BreakpointInfo, _orig_bytecode, Bytecodes::Code) \ nonstatic_field(BreakpointInfo, _bci, int) \ nonstatic_field(BreakpointInfo, _name_index, u2) \ @@ -712,26 +723,26 @@ /* HashtableBucket */ \ /*******************/ \ \ - nonstatic_field(HashtableBucket, _entry, BasicHashtableEntry*) \ + nonstatic_field(HashtableBucket, _entry, BasicHashtableEntry*) \ \ /******************/ \ /* HashtableEntry */ \ /******************/ \ \ - nonstatic_field(BasicHashtableEntry, _next, BasicHashtableEntry*) \ - nonstatic_field(BasicHashtableEntry, _hash, unsigned int) \ - nonstatic_field(HashtableEntry, _literal, intptr_t) \ + nonstatic_field(BasicHashtableEntry, _next, BasicHashtableEntry*) \ + nonstatic_field(BasicHashtableEntry, _hash, unsigned int) \ + nonstatic_field(IntptrHashtableEntry, _literal, intptr_t) \ \ /*************/ \ /* Hashtable */ \ /*************/ \ \ - nonstatic_field(BasicHashtable, _table_size, int) \ - nonstatic_field(BasicHashtable, _buckets, HashtableBucket*) \ - nonstatic_field(BasicHashtable, _free_list, BasicHashtableEntry*) \ - nonstatic_field(BasicHashtable, _first_free_entry, char*) \ - nonstatic_field(BasicHashtable, _end_block, char*) \ - nonstatic_field(BasicHashtable, _entry_size, int) \ + nonstatic_field(BasicHashtable, _table_size, int) \ + nonstatic_field(BasicHashtable, _buckets, HashtableBucket*) \ + nonstatic_field(BasicHashtable, _free_list, BasicHashtableEntry*) \ + nonstatic_field(BasicHashtable, _first_free_entry, char*) \ + nonstatic_field(BasicHashtable, _end_block, char*) \ + nonstatic_field(BasicHashtable, _entry_size, int) \ \ /*******************/ \ /* DictionaryEntry */ \ @@ -1452,6 +1463,7 @@ \ declare_toplevel_type(CheckedExceptionElement) \ declare_toplevel_type(LocalVariableTableElement) \ + declare_toplevel_type(ExceptionTableElement) \ \ /******************************************/ \ /* Generation and space hierarchies */ \ @@ -1539,20 +1551,20 @@ /* SymbolTable, SystemDictionary */ \ /*********************************/ \ \ - declare_toplevel_type(BasicHashtable) \ - declare_type(Hashtable, BasicHashtable) \ - declare_type(SymbolTable, Hashtable) \ - declare_type(StringTable, Hashtable) \ - declare_type(LoaderConstraintTable, Hashtable) \ - declare_type(TwoOopHashtable, Hashtable) \ - declare_type(Dictionary, TwoOopHashtable) \ - declare_type(PlaceholderTable, TwoOopHashtable) \ - declare_toplevel_type(BasicHashtableEntry) \ - declare_type(HashtableEntry, BasicHashtableEntry) \ - declare_type(DictionaryEntry, HashtableEntry) \ - declare_type(PlaceholderEntry, HashtableEntry) \ - declare_type(LoaderConstraintEntry, HashtableEntry) \ - declare_toplevel_type(HashtableBucket) \ + declare_toplevel_type(BasicHashtable) \ + declare_type(IntptrHashtable, BasicHashtable) \ + declare_type(SymbolTable, SymbolHashtable) \ + declare_type(StringTable, StringHashtable) \ + declare_type(LoaderConstraintTable, klassOopHashtable) \ + declare_type(klassOopTwoOopHashtable, klassOopHashtable) \ + declare_type(Dictionary, klassOopTwoOopHashtable) \ + declare_type(PlaceholderTable, SymbolTwoOopHashtable) \ + declare_toplevel_type(BasicHashtableEntry) \ + declare_type(IntptrHashtableEntry, BasicHashtableEntry) \ + declare_type(DictionaryEntry, klassHashtableEntry) \ + declare_type(PlaceholderEntry, SymbolHashtableEntry) \ + declare_type(LoaderConstraintEntry, klassHashtableEntry) \ + declare_toplevel_type(HashtableBucket) \ declare_toplevel_type(SystemDictionary) \ declare_toplevel_type(vmSymbols) \ declare_toplevel_type(ProtectionDomainEntry) \ @@ -1876,7 +1888,6 @@ declare_c2_type(StoreNNode, StoreNode) \ declare_c2_type(StoreCMNode, StoreNode) \ declare_c2_type(LoadPLockedNode, LoadPNode) \ - declare_c2_type(LoadLLockedNode, LoadLNode) \ declare_c2_type(SCMemProjNode, ProjNode) \ declare_c2_type(LoadStoreNode, Node) \ declare_c2_type(StorePConditionalNode, LoadStoreNode) \ @@ -1946,14 +1957,12 @@ declare_c2_type(ReverseBytesLNode, Node) \ declare_c2_type(VectorNode, Node) \ declare_c2_type(AddVBNode, VectorNode) \ - declare_c2_type(AddVCNode, VectorNode) \ declare_c2_type(AddVSNode, VectorNode) \ declare_c2_type(AddVINode, VectorNode) \ declare_c2_type(AddVLNode, VectorNode) \ declare_c2_type(AddVFNode, VectorNode) \ declare_c2_type(AddVDNode, VectorNode) \ declare_c2_type(SubVBNode, VectorNode) \ - declare_c2_type(SubVCNode, VectorNode) \ declare_c2_type(SubVSNode, VectorNode) \ declare_c2_type(SubVINode, VectorNode) \ declare_c2_type(SubVLNode, VectorNode) \ @@ -1964,73 +1973,33 @@ declare_c2_type(DivVFNode, VectorNode) \ declare_c2_type(DivVDNode, VectorNode) \ declare_c2_type(LShiftVBNode, VectorNode) \ - declare_c2_type(LShiftVCNode, VectorNode) \ declare_c2_type(LShiftVSNode, VectorNode) \ declare_c2_type(LShiftVINode, VectorNode) \ - declare_c2_type(URShiftVBNode, VectorNode) \ - declare_c2_type(URShiftVCNode, VectorNode) \ - declare_c2_type(URShiftVSNode, VectorNode) \ - declare_c2_type(URShiftVINode, VectorNode) \ + declare_c2_type(RShiftVBNode, VectorNode) \ + declare_c2_type(RShiftVSNode, VectorNode) \ + declare_c2_type(RShiftVINode, VectorNode) \ declare_c2_type(AndVNode, VectorNode) \ declare_c2_type(OrVNode, VectorNode) \ declare_c2_type(XorVNode, VectorNode) \ - declare_c2_type(VectorLoadNode, LoadNode) \ - declare_c2_type(Load16BNode, VectorLoadNode) \ - declare_c2_type(Load8BNode, VectorLoadNode) \ - declare_c2_type(Load4BNode, VectorLoadNode) \ - declare_c2_type(Load8CNode, VectorLoadNode) \ - declare_c2_type(Load4CNode, VectorLoadNode) \ - declare_c2_type(Load2CNode, VectorLoadNode) \ - declare_c2_type(Load8SNode, VectorLoadNode) \ - declare_c2_type(Load4SNode, VectorLoadNode) \ - declare_c2_type(Load2SNode, VectorLoadNode) \ - declare_c2_type(Load4INode, VectorLoadNode) \ - declare_c2_type(Load2INode, VectorLoadNode) \ - declare_c2_type(Load2LNode, VectorLoadNode) \ - declare_c2_type(Load4FNode, VectorLoadNode) \ - declare_c2_type(Load2FNode, VectorLoadNode) \ - declare_c2_type(Load2DNode, VectorLoadNode) \ - declare_c2_type(VectorStoreNode, StoreNode) \ - declare_c2_type(Store16BNode, VectorStoreNode) \ - declare_c2_type(Store8BNode, VectorStoreNode) \ - declare_c2_type(Store4BNode, VectorStoreNode) \ - declare_c2_type(Store8CNode, VectorStoreNode) \ - declare_c2_type(Store4CNode, VectorStoreNode) \ - declare_c2_type(Store2CNode, VectorStoreNode) \ - declare_c2_type(Store4INode, VectorStoreNode) \ - declare_c2_type(Store2INode, VectorStoreNode) \ - declare_c2_type(Store2LNode, VectorStoreNode) \ - declare_c2_type(Store4FNode, VectorStoreNode) \ - declare_c2_type(Store2FNode, VectorStoreNode) \ - declare_c2_type(Store2DNode, VectorStoreNode) \ - declare_c2_type(Replicate16BNode, VectorNode) \ - declare_c2_type(Replicate8BNode, VectorNode) \ - declare_c2_type(Replicate4BNode, VectorNode) \ - declare_c2_type(Replicate8CNode, VectorNode) \ - declare_c2_type(Replicate4CNode, VectorNode) \ - declare_c2_type(Replicate2CNode, VectorNode) \ - declare_c2_type(Replicate8SNode, VectorNode) \ - declare_c2_type(Replicate4SNode, VectorNode) \ - declare_c2_type(Replicate2SNode, VectorNode) \ - declare_c2_type(Replicate4INode, VectorNode) \ - declare_c2_type(Replicate2INode, VectorNode) \ - declare_c2_type(Replicate2LNode, VectorNode) \ - declare_c2_type(Replicate4FNode, VectorNode) \ - declare_c2_type(Replicate2FNode, VectorNode) \ - declare_c2_type(Replicate2DNode, VectorNode) \ + declare_c2_type(LoadVectorNode, LoadNode) \ + declare_c2_type(StoreVectorNode, StoreNode) \ + declare_c2_type(ReplicateBNode, VectorNode) \ + declare_c2_type(ReplicateSNode, VectorNode) \ + declare_c2_type(ReplicateINode, VectorNode) \ + declare_c2_type(ReplicateLNode, VectorNode) \ + declare_c2_type(ReplicateFNode, VectorNode) \ + declare_c2_type(ReplicateDNode, VectorNode) \ declare_c2_type(PackNode, VectorNode) \ declare_c2_type(PackBNode, PackNode) \ - declare_c2_type(PackCNode, PackNode) \ declare_c2_type(PackSNode, PackNode) \ declare_c2_type(PackINode, PackNode) \ declare_c2_type(PackLNode, PackNode) \ declare_c2_type(PackFNode, PackNode) \ declare_c2_type(PackDNode, PackNode) \ - declare_c2_type(Pack2x1BNode, PackNode) \ - declare_c2_type(Pack2x2BNode, PackNode) \ + declare_c2_type(Pack2LNode, PackNode) \ + declare_c2_type(Pack2DNode, PackNode) \ declare_c2_type(ExtractNode, Node) \ declare_c2_type(ExtractBNode, ExtractNode) \ - declare_c2_type(ExtractCNode, ExtractNode) \ declare_c2_type(ExtractSNode, ExtractNode) \ declare_c2_type(ExtractINode, ExtractNode) \ declare_c2_type(ExtractLNode, ExtractNode) \ @@ -2336,6 +2305,7 @@ declare_constant(constMethodOopDesc::_has_linenumber_table) \ declare_constant(constMethodOopDesc::_has_checked_exceptions) \ declare_constant(constMethodOopDesc::_has_localvariable_table) \ + declare_constant(constMethodOopDesc::_has_exception_table) \ \ /*************************************/ \ /* instanceKlass enum */ \ @@ -2352,7 +2322,6 @@ declare_constant(FieldInfo::initval_index_offset) \ declare_constant(FieldInfo::low_offset) \ declare_constant(FieldInfo::high_offset) \ - declare_constant(FieldInfo::generic_signature_offset) \ declare_constant(FieldInfo::field_slots) \ \ /************************************************/ \ diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/vmThread.hpp --- a/src/share/vm/runtime/vmThread.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/vmThread.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -46,7 +46,7 @@ // Encapsulates both queue management and // and priority policy // -class VMOperationQueue : public CHeapObj { +class VMOperationQueue : public CHeapObj { private: enum Priorities { SafepointPriority, // Highest priority (operation executed at a safepoint) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/runtime/vm_operations.hpp --- a/src/share/vm/runtime/vm_operations.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/runtime/vm_operations.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -96,7 +96,7 @@ template(JFRCheckpoint) \ template(Exit) \ -class VM_Operation: public CHeapObj { +class VM_Operation: public CHeapObj { public: enum Mode { _safepoint, // blocking, safepoint, vm_op C-heap allocated diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/attachListener.cpp --- a/src/share/vm/services/attachListener.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/attachListener.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -320,7 +320,7 @@ } bool res = CommandLineFlags::ccstrAtPut((char*)name, &value, ATTACH_ON_DEMAND); if (res) { - FREE_C_HEAP_ARRAY(char, value); + FREE_C_HEAP_ARRAY(char, value, mtInternal); } else { out->print_cr("setting flag %s failed", name); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/attachListener.hpp --- a/src/share/vm/services/attachListener.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/attachListener.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -98,7 +98,7 @@ }; #ifndef SERVICES_KERNEL -class AttachOperation: public CHeapObj { +class AttachOperation: public CHeapObj { public: enum { name_length_max = 16, // maximum length of name diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/diagnosticArgument.cpp --- a/src/share/vm/services/diagnosticArgument.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/diagnosticArgument.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -140,7 +140,7 @@ if (str == NULL) { _value = NULL; } else { - _value = NEW_C_HEAP_ARRAY(char, len+1); + _value = NEW_C_HEAP_ARRAY(char, len+1, mtInternal); strncpy(_value, str, len); _value[len] = 0; } @@ -159,7 +159,7 @@ template <> void DCmdArgument::destroy_value() { if (_value != NULL) { - FREE_C_HEAP_ARRAY(char, _value); + FREE_C_HEAP_ARRAY(char, _value, mtInternal); set_value(NULL); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/diagnosticArgument.hpp --- a/src/share/vm/services/diagnosticArgument.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/diagnosticArgument.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -31,17 +31,17 @@ #include "runtime/thread.hpp" #include "utilities/exceptions.hpp" -class StringArrayArgument : public CHeapObj { +class StringArrayArgument : public CHeapObj { private: GrowableArray* _array; public: StringArrayArgument() { - _array = new(ResourceObj::C_HEAP)GrowableArray(32, true); + _array = new(ResourceObj::C_HEAP, mtInternal)GrowableArray(32, true); assert(_array != NULL, "Sanity check"); } void add(const char* str, size_t len) { if (str != NULL) { - char* ptr = NEW_C_HEAP_ARRAY(char, len+1); + char* ptr = NEW_C_HEAP_ARRAY(char, len+1, mtInternal); strncpy(ptr, str, len); ptr[len] = 0; _array->append(ptr); @@ -53,7 +53,7 @@ ~StringArrayArgument() { for (int i=0; i<_array->length(); i++) { if(_array->at(i) != NULL) { // Safety check - FREE_C_HEAP_ARRAY(char, _array->at(i)); + FREE_C_HEAP_ARRAY(char, _array->at(i), mtInternal); } } delete _array; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/diagnosticCommand.hpp --- a/src/share/vm/services/diagnosticCommand.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/diagnosticCommand.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -48,7 +48,7 @@ "With no argument this will show a list of available commands. " "'help all' will show help for all commands."; } - static const char* impact() { return "Low: "; } + static const char* impact() { return "Low"; } static int num_arguments(); virtual void execute(TRAPS); }; @@ -60,7 +60,7 @@ static const char* description() { return "Print JVM version information."; } - static const char* impact() { return "Low: "; } + static const char* impact() { return "Low"; } static int num_arguments() { return 0; } virtual void execute(TRAPS); }; @@ -72,7 +72,7 @@ static const char* description() { return "Print the command line used to start this VM instance."; } - static const char* impact() { return "Low: "; } + static const char* impact() { return "Low"; } static int num_arguments() { return 0; } virtual void execute(TRAPS) { Arguments::print_on(_output); @@ -88,7 +88,7 @@ return "Print system properties."; } static const char* impact() { - return "Low: "; + return "Low"; } static int num_arguments() { return 0; } virtual void execute(TRAPS); @@ -105,7 +105,7 @@ return "Print VM flag options and their current values."; } static const char* impact() { - return "Low: "; + return "Low"; } static int num_arguments(); virtual void execute(TRAPS); @@ -121,7 +121,7 @@ return "Print VM uptime."; } static const char* impact() { - return "Low: "; + return "Low"; } static int num_arguments(); virtual void execute(TRAPS); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/diagnosticFramework.cpp --- a/src/share/vm/services/diagnosticFramework.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/diagnosticFramework.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -75,11 +75,13 @@ } // extracting first item, argument or option name _key_addr = &_buffer[_cursor]; + bool arg_had_quotes = false; while (_cursor <= _len - 1 && _buffer[_cursor] != '=' && _buffer[_cursor] != _delim) { // argument can be surrounded by single or double quotes if (_buffer[_cursor] == '\"' || _buffer[_cursor] == '\'') { _key_addr++; char quote = _buffer[_cursor]; + arg_had_quotes = true; while (_cursor < _len - 1) { _cursor++; if (_buffer[_cursor] == quote && _buffer[_cursor - 1] != '\\') { @@ -95,16 +97,22 @@ _cursor++; } _key_len = &_buffer[_cursor] - _key_addr; + if (arg_had_quotes) { + // if the argument was quoted, we need to step past the last quote here + _cursor++; + } // check if the argument has the = format if (_cursor <= _len -1 && _buffer[_cursor] == '=') { _cursor++; _value_addr = &_buffer[_cursor]; + bool value_had_quotes = false; // extract the value while (_cursor <= _len - 1 && _buffer[_cursor] != _delim) { // value can be surrounded by simple or double quotes if (_buffer[_cursor] == '\"' || _buffer[_cursor] == '\'') { _value_addr++; char quote = _buffer[_cursor]; + value_had_quotes = true; while (_cursor < _len - 1) { _cursor++; if (_buffer[_cursor] == quote && _buffer[_cursor - 1] != '\\') { @@ -120,6 +128,10 @@ _cursor++; } _value_len = &_buffer[_cursor] - _value_addr; + if (value_had_quotes) { + // if the value was quoted, we need to step past the last quote here + _cursor++; + } } else { _value_addr = NULL; _value_len = 0; @@ -185,8 +197,17 @@ arg->read_value(iter.key_addr(), iter.key_length(), CHECK); next_argument = next_argument->next(); } else { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), - "Unknown argument in diagnostic command"); + const size_t buflen = 120; + const size_t argbuflen = 30; + char buf[buflen]; + char argbuf[argbuflen]; + size_t len = MIN2(iter.key_length(), argbuflen - 1); + + strncpy(argbuf, iter.key_addr(), len); + argbuf[len] = '\0'; + jio_snprintf(buf, buflen - 1, "Unknown argument '%s' in diagnostic command.", argbuf); + + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf); } } cont = iter.next(CHECK); @@ -207,19 +228,21 @@ } void DCmdParser::check(TRAPS) { + const size_t buflen = 256; + char buf[buflen]; GenDCmdArgument* arg = _arguments_list; while (arg != NULL) { if (arg->is_mandatory() && !arg->has_value()) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), - "Missing argument for diagnostic command"); + jio_snprintf(buf, buflen - 1, "The argument '%s' is mandatory.", arg->name()); + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf); } arg = arg->next(); } arg = _options; while (arg != NULL) { if (arg->is_mandatory() && !arg->has_value()) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), - "Missing option for diagnostic command"); + jio_snprintf(buf, buflen - 1, "The option '%s' is mandatory.", arg->name()); + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf); } arg = arg->next(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/diagnosticFramework.hpp --- a/src/share/vm/services/diagnosticFramework.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/diagnosticFramework.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -238,6 +238,16 @@ static const char* name() { return "No Name";} static const char* description() { return "No Help";} static const char* disabled_message() { return "Diagnostic command currently disabled"; } + // The impact() method returns a description of the intrusiveness of the diagnostic + // command on the Java Virtual Machine behavior. The rational for this method is that some + // diagnostic commands can seriously disrupt the behavior of the Java Virtual Machine + // (for instance a Thread Dump for an application with several tens of thousands of threads, + // or a Head Dump with a 40GB+ heap size) and other diagnostic commands have no serious + // impact on the JVM (for instance, getting the command line arguments or the JVM version). + // The recommended format for the description is : [longer description], + // where the impact level is selected among this list: {Low, Medium, High}. The optional + // longer description can provide more specific details like the fact that Thread Dump + // impact depends on the heap size. static const char* impact() { return "Low: No impact"; } static int num_arguments() { return 0; } outputStream* output() { return _output; } @@ -250,7 +260,7 @@ bool has_arg = iter.next(CHECK); if (has_arg) { THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), - "Unknown argument in diagnostic command"); + "The argument list of this diagnostic command should be empty."); } } virtual void execute(TRAPS) { } @@ -310,7 +320,7 @@ // manages the status of the diagnostic command (hidden, enabled). A DCmdFactory // has to be registered to make the diagnostic command available (see // management.cpp) -class DCmdFactory: public CHeapObj { +class DCmdFactory: public CHeapObj { private: static Mutex* _dcmdFactory_lock; // Pointer to the next factory in the singly-linked list of registered @@ -368,7 +378,7 @@ DCmdFactory(DCmdClass::num_arguments(), enabled, hidden) { } // Returns a C-heap allocated instance virtual DCmd* create_Cheap_instance(outputStream* output) { - return new (ResourceObj::C_HEAP) DCmdClass(output, true); + return new (ResourceObj::C_HEAP, mtInternal) DCmdClass(output, true); } // Returns a resourceArea allocated instance virtual DCmd* create_resource_instance(outputStream* output) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/gcNotifier.cpp --- a/src/share/vm/services/gcNotifier.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/gcNotifier.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -45,7 +45,7 @@ // GC may occur between now and the creation of the notification int num_pools = MemoryService::num_memory_pools(); // stat is deallocated inside GCNotificationRequest - GCStatInfo* stat = new(ResourceObj::C_HEAP) GCStatInfo(num_pools); + GCStatInfo* stat = new(ResourceObj::C_HEAP, mtGC) GCStatInfo(num_pools); mgr->get_last_gc_stat(stat); GCNotificationRequest *request = new GCNotificationRequest(os::javaTimeMillis(),mgr,action,cause,stat); addRequest(request); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/gcNotifier.hpp --- a/src/share/vm/services/gcNotifier.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/gcNotifier.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -30,7 +30,7 @@ #include "services/memoryService.hpp" #include "services/memoryManager.hpp" -class GCNotificationRequest : public CHeapObj { +class GCNotificationRequest : public CHeapObj { friend class GCNotifier; GCNotificationRequest *next; jlong timestamp; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/heapDumper.cpp --- a/src/share/vm/services/heapDumper.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/heapDumper.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -436,7 +436,7 @@ // sufficient memory then reduce size until we can allocate something. _size = io_buffer_size; do { - _buffer = (char*)os::malloc(_size); + _buffer = (char*)os::malloc(_size, mtInternal); if (_buffer == NULL) { _size = _size >> 1; } @@ -1405,7 +1405,7 @@ _gc_before_heap_dump = gc_before_heap_dump; _is_segmented_dump = false; _dump_start = (jlong)-1; - _klass_map = new (ResourceObj::C_HEAP) GrowableArray(INITIAL_CLASS_COUNT, true); + _klass_map = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(INITIAL_CLASS_COUNT, true); _stack_traces = NULL; _num_threads = 0; if (oome) { @@ -1426,7 +1426,7 @@ for (int i=0; i < _num_threads; i++) { delete _stack_traces[i]; } - FREE_C_HEAP_ARRAY(ThreadStackTrace*, _stack_traces); + FREE_C_HEAP_ARRAY(ThreadStackTrace*, _stack_traces, mtInternal); } delete _klass_map; } @@ -1806,7 +1806,7 @@ writer()->write_u4(0); // thread number writer()->write_u4(0); // frame count - _stack_traces = NEW_C_HEAP_ARRAY(ThreadStackTrace*, Threads::number_of_threads()); + _stack_traces = NEW_C_HEAP_ARRAY(ThreadStackTrace*, Threads::number_of_threads(), mtInternal); int frame_serial_num = 0; for (JavaThread* thread = Threads::first(); thread != NULL ; thread = thread->next()) { oop threadObj = thread->threadObj(); @@ -2005,7 +2005,7 @@ dump_file_name, os::current_process_id(), dump_file_ext); } const size_t len = strlen(base_path) + 1; - my_path = (char*)os::malloc(len); + my_path = (char*)os::malloc(len, mtInternal); if (my_path == NULL) { warning("Cannot create heap dump file. Out of system memory."); return; @@ -2014,7 +2014,7 @@ } else { // Append a sequence number id for dumps following the first const size_t len = strlen(base_path) + max_digit_chars + 2; // for '.' and \0 - my_path = (char*)os::malloc(len); + my_path = (char*)os::malloc(len, mtInternal); if (my_path == NULL) { warning("Cannot create heap dump file. Out of system memory."); return; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/lowMemoryDetector.hpp --- a/src/share/vm/services/lowMemoryDetector.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/lowMemoryDetector.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -63,7 +63,7 @@ class OopClosure; class MemoryPool; -class ThresholdSupport : public CHeapObj { +class ThresholdSupport : public CHeapObj { private: bool _support_high_threshold; bool _support_low_threshold; @@ -112,7 +112,7 @@ } }; -class SensorInfo : public CHeapObj { +class SensorInfo : public CHeapObj { private: instanceOop _sensor_obj; bool _sensor_on; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/management.cpp --- a/src/share/vm/services/management.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/management.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -47,6 +47,7 @@ #include "services/jmm.h" #include "services/lowMemoryDetector.hpp" #include "services/gcNotifier.hpp" +#include "services/nmtDCmd.hpp" #include "services/management.hpp" #include "services/memoryManager.hpp" #include "services/memoryPool.hpp" @@ -121,6 +122,7 @@ // Registration of the diagnostic commands DCmdRegistrant::register_dcmds(); DCmdRegistrant::register_dcmds_ext(); + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(true, false)); } void Management::initialize(TRAPS) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memBaseline.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memBaseline.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,387 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#include "precompiled.hpp" +#include "classfile/systemDictionary.hpp" +#include "memory/allocation.hpp" +#include "services/memBaseline.hpp" +#include "services/memTracker.hpp" + +MemType2Name MemBaseline::MemType2NameMap[NUMBER_OF_MEMORY_TYPE] = { + {mtJavaHeap, "Java Heap"}, + {mtClass, "Class"}, + {mtThreadStack,"Thread Stack"}, + {mtThread, "Thread"}, + {mtCode, "Code"}, + {mtGC, "GC"}, + {mtCompiler, "Compiler"}, + {mtInternal, "Internal"}, + {mtOther, "Other"}, + {mtSymbol, "Symbol"}, + {mtNMT, "Memory Tracking"}, + {mtChunk, "Pooled Free Chunks"}, + {mtNone, "Unknown"} // It can happen when type tagging records are lagging + // behind +}; + +MemBaseline::MemBaseline() { + _baselined = false; + + for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) { + _malloc_data[index].set_type(MemType2NameMap[index]._flag); + _vm_data[index].set_type(MemType2NameMap[index]._flag); + _arena_data[index].set_type(MemType2NameMap[index]._flag); + } + + _malloc_cs = NULL; + _vm_cs = NULL; + + _number_of_classes = 0; + _number_of_threads = 0; +} + + +void MemBaseline::clear() { + if (_malloc_cs != NULL) { + delete _malloc_cs; + _malloc_cs = NULL; + } + + if (_vm_cs != NULL) { + delete _vm_cs; + _vm_cs = NULL; + } + + reset(); +} + + +void MemBaseline::reset() { + _baselined = false; + _total_vm_reserved = 0; + _total_vm_committed = 0; + _total_malloced = 0; + _number_of_classes = 0; + + if (_malloc_cs != NULL) _malloc_cs->clear(); + if (_vm_cs != NULL) _vm_cs->clear(); + + for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) { + _malloc_data[index].clear(); + _vm_data[index].clear(); + _arena_data[index].clear(); + } +} + +MemBaseline::~MemBaseline() { + if (_malloc_cs != NULL) { + delete _malloc_cs; + } + + if (_vm_cs != NULL) { + delete _vm_cs; + } +} + +// baseline malloc'd memory records, generate overall summary and summaries by +// memory types +bool MemBaseline::baseline_malloc_summary(const MemPointerArray* malloc_records) { + MemPointerArrayIteratorImpl mItr((MemPointerArray*)malloc_records); + MemPointerRecord* mptr = (MemPointerRecord*)mItr.current(); + size_t used_arena_size = 0; + int index; + while (mptr != NULL) { + index = flag2index(FLAGS_TO_MEMORY_TYPE(mptr->flags())); + size_t size = mptr->size(); + _total_malloced += size; + _malloc_data[index].inc(size); + if (MemPointerRecord::is_arena_record(mptr->flags())) { + // see if arena size record present + MemPointerRecord* next_p = (MemPointerRecordEx*)mItr.peek_next(); + if (MemPointerRecord::is_arena_size_record(next_p->flags())) { + assert(next_p->is_size_record_of_arena(mptr), "arena records do not match"); + size = next_p->size(); + _arena_data[index].inc(size); + used_arena_size += size; + mItr.next(); + } + } + mptr = (MemPointerRecordEx*)mItr.next(); + } + + // substract used arena size to get size of arena chunk in free list + index = flag2index(mtChunk); + _malloc_data[index].reduce(used_arena_size); + // we really don't know how many chunks in free list, so just set to + // 0 + _malloc_data[index].overwrite_counter(0); + + return true; +} + +// baseline mmap'd memory records, generate overall summary and summaries by +// memory types +bool MemBaseline::baseline_vm_summary(const MemPointerArray* vm_records) { + MemPointerArrayIteratorImpl vItr((MemPointerArray*)vm_records); + VMMemRegion* vptr = (VMMemRegion*)vItr.current(); + int index; + while (vptr != NULL) { + index = flag2index(FLAGS_TO_MEMORY_TYPE(vptr->flags())); + + // we use the number of thread stack to count threads + if (IS_MEMORY_TYPE(vptr->flags(), mtThreadStack)) { + _number_of_threads ++; + } + _total_vm_reserved += vptr->reserved_size(); + _total_vm_committed += vptr->committed_size(); + _vm_data[index].inc(vptr->reserved_size(), vptr->committed_size()); + vptr = (VMMemRegion*)vItr.next(); + } + return true; +} + +// baseline malloc'd memory by callsites, but only the callsites with memory allocation +// over 1KB are stored. +bool MemBaseline::baseline_malloc_details(const MemPointerArray* malloc_records) { + assert(MemTracker::track_callsite(), "detail tracking is off"); + + MemPointerArrayIteratorImpl mItr((MemPointerArray*)malloc_records); + MemPointerRecordEx* mptr = (MemPointerRecordEx*)mItr.current(); + MallocCallsitePointer mp; + + if (_malloc_cs == NULL) { + _malloc_cs = new (std::nothrow) MemPointerArrayImpl(64); + // out of native memory + if (_malloc_cs == NULL) { + return false; + } + } else { + _malloc_cs->clear(); + } + + // baseline memory that is totaled over 1 KB + while (mptr != NULL) { + if (!MemPointerRecord::is_arena_size_record(mptr->flags())) { + // skip thread stacks + if (!IS_MEMORY_TYPE(mptr->flags(), mtThreadStack)) { + if (mp.addr() != mptr->pc()) { + if ((mp.amount()/K) > 0) { + if (!_malloc_cs->append(&mp)) { + return false; + } + } + mp = MallocCallsitePointer(mptr->pc()); + } + mp.inc(mptr->size()); + } + } + mptr = (MemPointerRecordEx*)mItr.next(); + } + + if (mp.addr() != 0 && (mp.amount()/K) > 0) { + if (!_malloc_cs->append(&mp)) { + return false; + } + } + return true; +} + +// baseline mmap'd memory by callsites +bool MemBaseline::baseline_vm_details(const MemPointerArray* vm_records) { + assert(MemTracker::track_callsite(), "detail tracking is off"); + + VMCallsitePointer vp; + MemPointerArrayIteratorImpl vItr((MemPointerArray*)vm_records); + VMMemRegionEx* vptr = (VMMemRegionEx*)vItr.current(); + + if (_vm_cs == NULL) { + _vm_cs = new (std::nothrow) MemPointerArrayImpl(64); + if (_vm_cs == NULL) { + return false; + } + } else { + _vm_cs->clear(); + } + + while (vptr != NULL) { + if (vp.addr() != vptr->pc()) { + if (!_vm_cs->append(&vp)) { + return false; + } + vp = VMCallsitePointer(vptr->pc()); + } + vp.inc(vptr->size(), vptr->committed_size()); + vptr = (VMMemRegionEx*)vItr.next(); + } + if (vp.addr() != 0) { + if (!_vm_cs->append(&vp)) { + return false; + } + } + return true; +} + +// baseline a snapshot. If summary_only = false, memory usages aggregated by +// callsites are also baselined. +bool MemBaseline::baseline(MemSnapshot& snapshot, bool summary_only) { + MutexLockerEx snapshot_locker(snapshot._lock, true); + reset(); + _baselined = baseline_malloc_summary(snapshot._alloc_ptrs) && + baseline_vm_summary(snapshot._vm_ptrs); + _number_of_classes = SystemDictionary::number_of_classes(); + + if (!summary_only && MemTracker::track_callsite() && _baselined) { + ((MemPointerArray*)snapshot._alloc_ptrs)->sort((FN_SORT)malloc_sort_by_pc); + ((MemPointerArray*)snapshot._vm_ptrs)->sort((FN_SORT)vm_sort_by_pc); + _baselined = baseline_malloc_details(snapshot._alloc_ptrs) && + baseline_vm_details(snapshot._vm_ptrs); + ((MemPointerArray*)snapshot._alloc_ptrs)->sort((FN_SORT)malloc_sort_by_addr); + ((MemPointerArray*)snapshot._vm_ptrs)->sort((FN_SORT)vm_sort_by_addr); + } + return _baselined; +} + + +int MemBaseline::flag2index(MEMFLAGS flag) const { + for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) { + if (MemType2NameMap[index]._flag == flag) { + return index; + } + } + assert(false, "no type"); + return -1; +} + +const char* MemBaseline::type2name(MEMFLAGS type) { + for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) { + if (MemType2NameMap[index]._flag == type) { + return MemType2NameMap[index]._name; + } + } + assert(false, "no type"); + return NULL; +} + + +MemBaseline& MemBaseline::operator=(const MemBaseline& other) { + _total_malloced = other._total_malloced; + _total_vm_reserved = other._total_vm_reserved; + _total_vm_committed = other._total_vm_committed; + + _baselined = other._baselined; + _number_of_classes = other._number_of_classes; + + for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) { + _malloc_data[index] = other._malloc_data[index]; + _vm_data[index] = other._vm_data[index]; + _arena_data[index] = other._arena_data[index]; + } + + if (MemTracker::track_callsite()) { + assert(_malloc_cs != NULL && _vm_cs != NULL, "out of memory"); + assert(other._malloc_cs != NULL && other._vm_cs != NULL, + "not properly baselined"); + _malloc_cs->clear(); + _vm_cs->clear(); + int index; + for (index = 0; index < other._malloc_cs->length(); index ++) { + _malloc_cs->append(other._malloc_cs->at(index)); + } + + for (index = 0; index < other._vm_cs->length(); index ++) { + _vm_cs->append(other._vm_cs->at(index)); + } + } + return *this; +} + +/* compare functions for sorting */ + +// sort snapshot malloc'd records in callsite pc order +int MemBaseline::malloc_sort_by_pc(const void* p1, const void* p2) { + assert(MemTracker::track_callsite(),"Just check"); + const MemPointerRecordEx* mp1 = (const MemPointerRecordEx*)p1; + const MemPointerRecordEx* mp2 = (const MemPointerRecordEx*)p2; + return UNSIGNED_COMPARE(mp1->pc(), mp2->pc()); +} + +// sort baselined malloc'd records in size order +int MemBaseline::bl_malloc_sort_by_size(const void* p1, const void* p2) { + assert(MemTracker::is_on(), "Just check"); + const MallocCallsitePointer* mp1 = (const MallocCallsitePointer*)p1; + const MallocCallsitePointer* mp2 = (const MallocCallsitePointer*)p2; + return UNSIGNED_COMPARE(mp2->amount(), mp1->amount()); +} + +// sort baselined malloc'd records in callsite pc order +int MemBaseline::bl_malloc_sort_by_pc(const void* p1, const void* p2) { + assert(MemTracker::is_on(), "Just check"); + const MallocCallsitePointer* mp1 = (const MallocCallsitePointer*)p1; + const MallocCallsitePointer* mp2 = (const MallocCallsitePointer*)p2; + return UNSIGNED_COMPARE(mp1->addr(), mp2->addr()); +} + +// sort snapshot mmap'd records in callsite pc order +int MemBaseline::vm_sort_by_pc(const void* p1, const void* p2) { + assert(MemTracker::track_callsite(),"Just check"); + const VMMemRegionEx* mp1 = (const VMMemRegionEx*)p1; + const VMMemRegionEx* mp2 = (const VMMemRegionEx*)p2; + return UNSIGNED_COMPARE(mp1->pc(), mp2->pc()); +} + +// sort baselined mmap'd records in size (reserved size) order +int MemBaseline::bl_vm_sort_by_size(const void* p1, const void* p2) { + assert(MemTracker::is_on(), "Just check"); + const VMCallsitePointer* mp1 = (const VMCallsitePointer*)p1; + const VMCallsitePointer* mp2 = (const VMCallsitePointer*)p2; + return UNSIGNED_COMPARE(mp2->reserved_amount(), mp1->reserved_amount()); +} + +// sort baselined mmap'd records in callsite pc order +int MemBaseline::bl_vm_sort_by_pc(const void* p1, const void* p2) { + assert(MemTracker::is_on(), "Just check"); + const VMCallsitePointer* mp1 = (const VMCallsitePointer*)p1; + const VMCallsitePointer* mp2 = (const VMCallsitePointer*)p2; + return UNSIGNED_COMPARE(mp1->addr(), mp2->addr()); +} + + +// sort snapshot malloc'd records in memory block address order +int MemBaseline::malloc_sort_by_addr(const void* p1, const void* p2) { + assert(MemTracker::is_on(), "Just check"); + const MemPointerRecord* mp1 = (const MemPointerRecord*)p1; + const MemPointerRecord* mp2 = (const MemPointerRecord*)p2; + int delta = UNSIGNED_COMPARE(mp1->addr(), mp2->addr()); + assert(delta != 0, "dup pointer"); + return delta; +} + +// sort snapshot mmap'd records in memory block address order +int MemBaseline::vm_sort_by_addr(const void* p1, const void* p2) { + assert(MemTracker::is_on(), "Just check"); + const VMMemRegion* mp1 = (const VMMemRegion*)p1; + const VMMemRegion* mp2 = (const VMMemRegion*)p2; + int delta = UNSIGNED_COMPARE(mp1->addr(), mp2->addr()); + assert(delta != 0, "dup pointer"); + return delta; +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memBaseline.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memBaseline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,447 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_SERVICES_MEM_BASELINE_HPP +#define SHARE_VM_SERVICES_MEM_BASELINE_HPP + +#include "memory/allocation.hpp" +#include "runtime/mutex.hpp" +#include "services/memPtr.hpp" +#include "services/memSnapshot.hpp" + +// compare unsigned number +#define UNSIGNED_COMPARE(a, b) ((a > b) ? 1 : ((a == b) ? 0 : -1)) + +/* + * MallocCallsitePointer and VMCallsitePointer are used + * to baseline memory blocks with their callsite information. + * They are only available when detail tracking is turned + * on. + */ + +/* baselined malloc record aggregated by callsite */ +class MallocCallsitePointer : public MemPointer { + private: + size_t _count; // number of malloc invocation from this callsite + size_t _amount; // total amount of memory malloc-ed from this callsite + + public: + MallocCallsitePointer() { + _count = 0; + _amount = 0; + } + + MallocCallsitePointer(address pc) : MemPointer(pc) { + _count = 0; + _amount = 0; + } + + MallocCallsitePointer& operator=(const MallocCallsitePointer& p) { + MemPointer::operator=(p); + _count = p.count(); + _amount = p.amount(); + return *this; + } + + inline void inc(size_t size) { + _count ++; + _amount += size; + }; + + inline size_t count() const { + return _count; + } + + inline size_t amount() const { + return _amount; + } +}; + +// baselined virtual memory record aggregated by callsite +class VMCallsitePointer : public MemPointer { + private: + size_t _count; // number of invocation from this callsite + size_t _reserved_amount; // total reserved amount + size_t _committed_amount; // total committed amount + + public: + VMCallsitePointer() { + _count = 0; + _reserved_amount = 0; + _committed_amount = 0; + } + + VMCallsitePointer(address pc) : MemPointer(pc) { + _count = 0; + _reserved_amount = 0; + _committed_amount = 0; + } + + VMCallsitePointer& operator=(const VMCallsitePointer& p) { + MemPointer::operator=(p); + _count = p.count(); + _reserved_amount = p.reserved_amount(); + _committed_amount = p.committed_amount(); + return *this; + } + + inline void inc(size_t reserved, size_t committed) { + _count ++; + _reserved_amount += reserved; + _committed_amount += committed; + } + + inline size_t count() const { + return _count; + } + + inline size_t reserved_amount() const { + return _reserved_amount; + } + + inline size_t committed_amount() const { + return _committed_amount; + } +}; + +// maps a memory type flag to readable name +typedef struct _memType2Name { + MEMFLAGS _flag; + const char* _name; +} MemType2Name; + + +// This class aggregates malloc'd records by memory type +class MallocMem : public _ValueObj { + private: + MEMFLAGS _type; + + size_t _count; + size_t _amount; + + public: + MallocMem() { + _type = mtNone; + _count = 0; + _amount = 0; + } + + MallocMem(MEMFLAGS flags) { + assert(HAS_VALID_MEMORY_TYPE(flags), "no type"); + _type = FLAGS_TO_MEMORY_TYPE(flags); + _count = 0; + _amount = 0; + } + + inline void set_type(MEMFLAGS flag) { + _type = flag; + } + + inline void clear() { + _count = 0; + _amount = 0; + _type = mtNone; + } + + MallocMem& operator=(const MallocMem& m) { + assert(_type == m.type(), "different type"); + _count = m.count(); + _amount = m.amount(); + return *this; + } + + inline void inc(size_t amt) { + _amount += amt; + _count ++; + } + + inline void reduce(size_t amt) { + assert(_amount >= amt, "Just check"); + _amount -= amt; + } + + inline void overwrite_counter(size_t count) { + _count = count; + } + + inline MEMFLAGS type() const { + return _type; + } + + inline bool is_type(MEMFLAGS flags) const { + return FLAGS_TO_MEMORY_TYPE(flags) == _type; + } + + inline size_t count() const { + return _count; + } + + inline size_t amount() const { + return _amount; + } +}; + +// This class records live arena's memory usage +class ArenaMem : public MallocMem { + public: + ArenaMem(MEMFLAGS typeflag): MallocMem(typeflag) { + } + ArenaMem() { } +}; + +// This class aggregates virtual memory by its memory type +class VMMem : public _ValueObj { + private: + MEMFLAGS _type; + + size_t _count; + size_t _reserved_amount; + size_t _committed_amount; + + public: + VMMem() { + _type = mtNone; + _count = 0; + _reserved_amount = 0; + _committed_amount = 0; + } + + VMMem(MEMFLAGS flags) { + assert(HAS_VALID_MEMORY_TYPE(flags), "no type"); + _type = FLAGS_TO_MEMORY_TYPE(flags); + _count = 0; + _reserved_amount = 0; + _committed_amount = 0; + } + + inline void clear() { + _type = mtNone; + _count = 0; + _reserved_amount = 0; + _committed_amount = 0; + } + + inline void set_type(MEMFLAGS flags) { + _type = FLAGS_TO_MEMORY_TYPE(flags); + } + + VMMem& operator=(const VMMem& m) { + assert(_type == m.type(), "different type"); + + _count = m.count(); + _reserved_amount = m.reserved_amount(); + _committed_amount = m.committed_amount(); + return *this; + } + + + inline MEMFLAGS type() const { + return _type; + } + + inline bool is_type(MEMFLAGS flags) const { + return FLAGS_TO_MEMORY_TYPE(flags) == _type; + } + + inline void inc(size_t reserved_amt, size_t committed_amt) { + _reserved_amount += reserved_amt; + _committed_amount += committed_amt; + _count ++; + } + + inline size_t count() const { + return _count; + } + + inline size_t reserved_amount() const { + return _reserved_amount; + } + + inline size_t committed_amount() const { + return _committed_amount; + } +}; + + + +#define NUMBER_OF_MEMORY_TYPE (mt_number_of_types + 1) + +class BaselineReporter; +class BaselineComparisonReporter; + +/* + * This class baselines current memory snapshot. + * A memory baseline summarizes memory usage by memory type, + * aggregates memory usage by callsites when detail tracking + * is on. + */ +class MemBaseline : public _ValueObj { + friend class BaselineReporter; + friend class BaselineComparisonReporter; + + private: + // overall summaries + size_t _total_malloced; + size_t _total_vm_reserved; + size_t _total_vm_committed; + size_t _number_of_classes; + size_t _number_of_threads; + + // if it has properly baselined + bool _baselined; + + // we categorize memory into three categories within the memory type + MallocMem _malloc_data[NUMBER_OF_MEMORY_TYPE]; + VMMem _vm_data[NUMBER_OF_MEMORY_TYPE]; + ArenaMem _arena_data[NUMBER_OF_MEMORY_TYPE]; + + // memory records that aggregate memory usage by callsites. + // only available when detail tracking is on. + MemPointerArray* _malloc_cs; + MemPointerArray* _vm_cs; + + private: + static MemType2Name MemType2NameMap[NUMBER_OF_MEMORY_TYPE]; + + private: + // should not use copy constructor + MemBaseline(MemBaseline& copy) { ShouldNotReachHere(); } + + public: + // create a memory baseline + MemBaseline(); + + virtual ~MemBaseline(); + + inline bool baselined() const { + return _baselined; + } + + MemBaseline& operator=(const MemBaseline& other); + + // reset the baseline for reuse + void clear(); + + // baseline the snapshot + bool baseline(MemSnapshot& snapshot, bool summary_only = true); + + bool baseline(const MemPointerArray* malloc_records, + const MemPointerArray* vm_records, + bool summary_only = true); + + // total malloc'd memory of specified memory type + inline size_t malloc_amount(MEMFLAGS flag) const { + return _malloc_data[flag2index(flag)].amount(); + } + // number of malloc'd memory blocks of specified memory type + inline size_t malloc_count(MEMFLAGS flag) const { + return _malloc_data[flag2index(flag)].count(); + } + // total memory used by arenas of specified memory type + inline size_t arena_amount(MEMFLAGS flag) const { + return _arena_data[flag2index(flag)].amount(); + } + // number of arenas of specified memory type + inline size_t arena_count(MEMFLAGS flag) const { + return _arena_data[flag2index(flag)].count(); + } + // total reserved memory of specified memory type + inline size_t reserved_amount(MEMFLAGS flag) const { + return _vm_data[flag2index(flag)].reserved_amount(); + } + // total committed memory of specified memory type + inline size_t committed_amount(MEMFLAGS flag) const { + return _vm_data[flag2index(flag)].committed_amount(); + } + // total memory (malloc'd + mmap'd + arena) of specified + // memory type + inline size_t total_amount(MEMFLAGS flag) const { + int index = flag2index(flag); + return _malloc_data[index].amount() + + _vm_data[index].reserved_amount() + + _arena_data[index].amount(); + } + + /* overall summaries */ + + // total malloc'd memory in snapshot + inline size_t total_malloc_amount() const { + return _total_malloced; + } + // total mmap'd memory in snapshot + inline size_t total_reserved_amount() const { + return _total_vm_reserved; + } + // total committed memory in snapshot + inline size_t total_committed_amount() const { + return _total_vm_committed; + } + // number of loaded classes + inline size_t number_of_classes() const { + return _number_of_classes; + } + // number of running threads + inline size_t number_of_threads() const { + return _number_of_threads; + } + // lookup human readable name of a memory type + static const char* type2name(MEMFLAGS type); + + private: + // convert memory flag to the index to mapping table + int flag2index(MEMFLAGS flag) const; + + // reset baseline values + void reset(); + + // summarize the records in global snapshot + bool baseline_malloc_summary(const MemPointerArray* malloc_records); + bool baseline_vm_summary(const MemPointerArray* vm_records); + bool baseline_malloc_details(const MemPointerArray* malloc_records); + bool baseline_vm_details(const MemPointerArray* vm_records); + + // print a line of malloc'd memory aggregated by callsite + void print_malloc_callsite(outputStream* st, address pc, size_t size, + size_t count, int diff_amt, int diff_count) const; + // print a line of mmap'd memory aggregated by callsite + void print_vm_callsite(outputStream* st, address pc, size_t rsz, + size_t csz, int diff_rsz, int diff_csz) const; + + // sorting functions for raw records + static int malloc_sort_by_pc(const void* p1, const void* p2); + static int malloc_sort_by_addr(const void* p1, const void* p2); + + static int vm_sort_by_pc(const void* p1, const void* p2); + static int vm_sort_by_addr(const void* p1, const void* p2); + + private: + // sorting functions for baselined records + static int bl_malloc_sort_by_size(const void* p1, const void* p2); + static int bl_vm_sort_by_size(const void* p1, const void* p2); + static int bl_malloc_sort_by_pc(const void* p1, const void* p2); + static int bl_vm_sort_by_pc(const void* p1, const void* p2); +}; + + +#endif // SHARE_VM_SERVICES_MEM_BASELINE_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memPtr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memPtr.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "services/memPtr.hpp" +#include "services/memTracker.hpp" + +volatile jint SequenceGenerator::_seq_number = 1; +DEBUG_ONLY(jint SequenceGenerator::_max_seq_number = 1;) +DEBUG_ONLY(volatile unsigned long SequenceGenerator::_generation = 0;) + +jint SequenceGenerator::next() { + jint seq = Atomic::add(1, &_seq_number); + if (seq < 0) { + MemTracker::shutdown(MemTracker::NMT_sequence_overflow); + } + assert(seq > 0, "counter overflow"); + DEBUG_ONLY(_max_seq_number = (seq > _max_seq_number) ? seq : _max_seq_number;) + return seq; +} + + + +bool VMMemRegion::contains(const VMMemRegion* mr) const { + assert(base() != 0, "no base address"); + assert(size() != 0 || committed_size() != 0, + "no range"); + address base_addr = base(); + address end_addr = base_addr + + (is_reserve_record()? reserved_size(): committed_size()); + if (mr->is_reserve_record()) { + if (mr->base() == base_addr && mr->size() == size()) { + // the same range + return true; + } + return false; + } else if (mr->is_commit_record() || mr->is_uncommit_record()) { + assert(mr->base() != 0 && mr->committed_size() > 0, + "bad record"); + return (mr->base() >= base_addr && + (mr->base() + mr->committed_size()) <= end_addr); + } else if (mr->is_type_tagging_record()) { + assert(mr->base() != 0, "no base"); + return mr->base() == base_addr; + } else if (mr->is_release_record()) { + assert(mr->base() != 0 && mr->size() > 0, + "bad record"); + return (mr->base() == base_addr && mr->size() == size()); + } else { + assert(false, "what happened?"); + return false; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memPtr.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memPtr.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_SERVICES_MEM_PTR_HPP +#define SHARE_VM_SERVICES_MEM_PTR_HPP + +#include "memory/allocation.hpp" +#include "runtime/atomic.hpp" +#include "runtime/os.hpp" +#include "runtime/safepoint.hpp" + +/* + * global sequence generator that generates sequence numbers to serialize + * memory records. + */ +class SequenceGenerator : AllStatic { + public: + static jint next(); + + // peek last sequence number + static jint peek() { + return _seq_number; + } + + // reset sequence number + static void reset() { + assert(SafepointSynchronize::is_at_safepoint(), "Safepoint required"); + _seq_number = 1; + DEBUG_ONLY(_generation ++;) + }; + + DEBUG_ONLY(static unsigned long current_generation() { return (unsigned long)_generation; }) + DEBUG_ONLY(static jint max_seq_num() { return _max_seq_number; }) + + private: + static volatile jint _seq_number; + DEBUG_ONLY(static jint _max_seq_number; ) + DEBUG_ONLY(static volatile unsigned long _generation; ) +}; + +/* + * followings are the classes that are used to hold memory activity records in different stages. + * MemPointer + * |--------MemPointerRecord + * | + * |----MemPointerRecordEx + * | | + * | |-------SeqMemPointerRecordEx + * | + * |----SeqMemPointerRecord + * | + * |----VMMemRegion + * | + * |-----VMMemRegionEx + * + * + * prefix 'Seq' - sequenced, the record contains a sequence number + * surfix 'Ex' - extension, the record contains a caller's pc + * + * per-thread recorder : SeqMemPointerRecord(Ex) + * snapshot staging : SeqMemPointerRecord(Ex) + * snapshot : MemPointerRecord(Ex) and VMMemRegion(Ex) + * + */ + +/* + * class that wraps an address to a memory block, + * the memory pointer either points to a malloc'd + * memory block, or a mmap'd memory block + */ +class MemPointer : public _ValueObj { + public: + MemPointer(): _addr(0) { } + MemPointer(address addr): _addr(addr) { } + + MemPointer(const MemPointer& copy_from) { + _addr = copy_from.addr(); + } + + inline address addr() const { + return _addr; + } + + inline operator address() const { + return addr(); + } + + inline bool operator == (const MemPointer& other) const { + return addr() == other.addr(); + } + + inline MemPointer& operator = (const MemPointer& other) { + _addr = other.addr(); + return *this; + } + + protected: + inline void set_addr(address addr) { _addr = addr; } + + protected: + // memory address + address _addr; +}; + +/* MemPointerRecord records an activityand associated + * attributes on a memory block. + */ +class MemPointerRecord : public MemPointer { + private: + MEMFLAGS _flags; + size_t _size; + +public: + /* extension of MemoryType enum + * see share/vm/memory/allocation.hpp for details. + * + * The tag values are associated to sorting orders, so be + * careful if changes are needed. + * The allocation records should be sorted ahead of tagging + * records, which in turn ahead of deallocation records + */ + enum MemPointerTags { + tag_alloc = 0x0001, // malloc or reserve record + tag_commit = 0x0002, // commit record + tag_type = 0x0003, // tag virtual memory to a memory type + tag_uncommit = 0x0004, // uncommit record + tag_release = 0x0005, // free or release record + tag_size = 0x0006, // arena size + tag_masks = 0x0007, // all tag bits + vmBit = 0x0008 + }; + + /* helper functions to interpret the tagging flags */ + + inline static bool is_allocation_record(MEMFLAGS flags) { + return (flags & tag_masks) == tag_alloc; + } + + inline static bool is_deallocation_record(MEMFLAGS flags) { + return (flags & tag_masks) == tag_release; + } + + inline static bool is_arena_record(MEMFLAGS flags) { + return (flags & (otArena | tag_size)) == otArena; + } + + inline static bool is_arena_size_record(MEMFLAGS flags) { + return (flags & (otArena | tag_size)) == (otArena | tag_size); + } + + inline static bool is_virtual_memory_record(MEMFLAGS flags) { + return (flags & vmBit) != 0; + } + + inline static bool is_virtual_memory_reserve_record(MEMFLAGS flags) { + return (flags & 0x0F) == (tag_alloc | vmBit); + } + + inline static bool is_virtual_memory_commit_record(MEMFLAGS flags) { + return (flags & 0x0F) == (tag_commit | vmBit); + } + + inline static bool is_virtual_memory_uncommit_record(MEMFLAGS flags) { + return (flags & 0x0F) == (tag_uncommit | vmBit); + } + + inline static bool is_virtual_memory_release_record(MEMFLAGS flags) { + return (flags & 0x0F) == (tag_release | vmBit); + } + + inline static bool is_virtual_memory_type_record(MEMFLAGS flags) { + return (flags & 0x0F) == (tag_type | vmBit); + } + + /* tagging flags */ + inline static MEMFLAGS malloc_tag() { return tag_alloc; } + inline static MEMFLAGS free_tag() { return tag_release; } + inline static MEMFLAGS arena_size_tag() { return tag_size | otArena; } + inline static MEMFLAGS virtual_memory_tag() { return vmBit; } + inline static MEMFLAGS virtual_memory_reserve_tag() { return (tag_alloc | vmBit); } + inline static MEMFLAGS virtual_memory_commit_tag() { return (tag_commit | vmBit); } + inline static MEMFLAGS virtual_memory_uncommit_tag(){ return (tag_uncommit | vmBit); } + inline static MEMFLAGS virtual_memory_release_tag() { return (tag_release | vmBit); } + inline static MEMFLAGS virtual_memory_type_tag() { return (tag_type | vmBit); } + + public: + MemPointerRecord(): _size(0), _flags(mtNone) { } + + MemPointerRecord(address addr, MEMFLAGS memflags, size_t size = 0): + MemPointer(addr), _flags(memflags), _size(size) { } + + MemPointerRecord(const MemPointerRecord& copy_from): + MemPointer(copy_from), _flags(copy_from.flags()), + _size(copy_from.size()) { + } + + /* MemPointerRecord is not sequenced, it always return + * 0 to indicate non-sequenced + */ + virtual jint seq() const { return 0; } + + inline size_t size() const { return _size; } + inline void set_size(size_t size) { _size = size; } + + inline MEMFLAGS flags() const { return _flags; } + inline void set_flags(MEMFLAGS flags) { _flags = flags; } + + MemPointerRecord& operator= (const MemPointerRecord& ptr) { + MemPointer::operator=(ptr); + _flags = ptr.flags(); +#ifdef ASSERT + if (IS_ARENA_OBJ(_flags)) { + assert(!is_vm_pointer(), "wrong flags"); + assert((_flags & ot_masks) == otArena, "wrong flags"); + } +#endif + _size = ptr.size(); + return *this; + } + + // if the pointer represents a malloc-ed memory address + inline bool is_malloced_pointer() const { + return !is_vm_pointer(); + } + + // if the pointer represents a virtual memory address + inline bool is_vm_pointer() const { + return is_virtual_memory_record(_flags); + } + + // if this record records a 'malloc' or virtual memory + // 'reserve' call + inline bool is_allocation_record() const { + return is_allocation_record(_flags); + } + + // if this record records a size information of an arena + inline bool is_arena_size_record() const { + return is_arena_size_record(_flags); + } + + // if this pointer represents an address to an arena object + inline bool is_arena_record() const { + return is_arena_record(_flags); + } + + // if this record represents a size information of specific arena + inline bool is_size_record_of_arena(const MemPointerRecord* arena_rc) { + assert(is_arena_size_record(), "not size record"); + assert(arena_rc->is_arena_record(), "not arena record"); + return (arena_rc->addr() + sizeof(void*)) == addr(); + } + + // if this record records a 'free' or virtual memory 'free' call + inline bool is_deallocation_record() const { + return is_deallocation_record(_flags); + } + + // if this record records a virtual memory 'commit' call + inline bool is_commit_record() const { + return is_virtual_memory_commit_record(_flags); + } + + // if this record records a virtual memory 'uncommit' call + inline bool is_uncommit_record() const { + return is_virtual_memory_uncommit_record(_flags); + } + + // if this record is a tagging record of a virtual memory block + inline bool is_type_tagging_record() const { + return is_virtual_memory_type_record(_flags); + } +}; + +// MemPointerRecordEx also records callsite pc, from where +// the memory block is allocated +class MemPointerRecordEx : public MemPointerRecord { + private: + address _pc; // callsite pc + + public: + MemPointerRecordEx(): _pc(0) { } + + MemPointerRecordEx(address addr, MEMFLAGS memflags, size_t size = 0, address pc = 0): + MemPointerRecord(addr, memflags, size), _pc(pc) {} + + MemPointerRecordEx(const MemPointerRecordEx& copy_from): + MemPointerRecord(copy_from), _pc(copy_from.pc()) {} + + inline address pc() const { return _pc; } + + void init(const MemPointerRecordEx* mpe) { + MemPointerRecord::operator=(*mpe); + _pc = mpe->pc(); + } + + void init(const MemPointerRecord* mp) { + MemPointerRecord::operator=(*mp); + _pc = 0; + } +}; + +// a virtual memory region +class VMMemRegion : public MemPointerRecord { + private: + // committed size + size_t _committed_size; + +public: + VMMemRegion(): _committed_size(0) { } + + void init(const MemPointerRecord* mp) { + assert(mp->is_vm_pointer(), "not virtual memory pointer"); + _addr = mp->addr(); + if (mp->is_commit_record() || mp->is_uncommit_record()) { + _committed_size = mp->size(); + set_size(_committed_size); + } else { + set_size(mp->size()); + _committed_size = 0; + } + set_flags(mp->flags()); + } + + VMMemRegion& operator=(const VMMemRegion& other) { + MemPointerRecord::operator=(other); + _committed_size = other.committed_size(); + return *this; + } + + inline bool is_reserve_record() const { + return is_virtual_memory_reserve_record(flags()); + } + + inline bool is_release_record() const { + return is_virtual_memory_release_record(flags()); + } + + // resize reserved VM range + inline void set_reserved_size(size_t new_size) { + assert(new_size >= committed_size(), "resize"); + set_size(new_size); + } + + inline void commit(size_t size) { + _committed_size += size; + } + + inline void uncommit(size_t size) { + if (_committed_size >= size) { + _committed_size -= size; + } else { + _committed_size = 0; + } + } + + /* + * if this virtual memory range covers whole range of + * the other VMMemRegion + */ + bool contains(const VMMemRegion* mr) const; + + /* base address of this virtual memory range */ + inline address base() const { + return addr(); + } + + /* tag this virtual memory range to the specified memory type */ + inline void tag(MEMFLAGS f) { + set_flags(flags() | (f & mt_masks)); + } + + // release part of memory range + inline void partial_release(address add, size_t sz) { + assert(add >= addr() && add < addr() + size(), "not valid address"); + // for now, it can partially release from the both ends, + // but not in the middle + assert(add == addr() || (add + sz) == (addr() + size()), + "release in the middle"); + if (add == addr()) { + set_addr(add + sz); + set_size(size() - sz); + } else { + set_size(size() - sz); + } + } + + // the committed size of the virtual memory block + inline size_t committed_size() const { + return _committed_size; + } + + // the reserved size of the virtual memory block + inline size_t reserved_size() const { + return size(); + } +}; + +class VMMemRegionEx : public VMMemRegion { + private: + jint _seq; // sequence number + + public: + VMMemRegionEx(): _pc(0) { } + + void init(const MemPointerRecordEx* mpe) { + VMMemRegion::init(mpe); + _pc = mpe->pc(); + } + + void init(const MemPointerRecord* mpe) { + VMMemRegion::init(mpe); + _pc = 0; + } + + VMMemRegionEx& operator=(const VMMemRegionEx& other) { + VMMemRegion::operator=(other); + _pc = other.pc(); + return *this; + } + + inline address pc() const { return _pc; } + private: + address _pc; +}; + +/* + * Sequenced memory record + */ +class SeqMemPointerRecord : public MemPointerRecord { + private: + jint _seq; // sequence number + + public: + SeqMemPointerRecord(): _seq(0){ } + + SeqMemPointerRecord(address addr, MEMFLAGS flags, size_t size) + : MemPointerRecord(addr, flags, size) { + _seq = SequenceGenerator::next(); + } + + SeqMemPointerRecord(const SeqMemPointerRecord& copy_from) + : MemPointerRecord(copy_from) { + _seq = copy_from.seq(); + } + + SeqMemPointerRecord& operator= (const SeqMemPointerRecord& ptr) { + MemPointerRecord::operator=(ptr); + _seq = ptr.seq(); + return *this; + } + + inline jint seq() const { + return _seq; + } +}; + + + +class SeqMemPointerRecordEx : public MemPointerRecordEx { + private: + jint _seq; // sequence number + + public: + SeqMemPointerRecordEx(): _seq(0) { } + + SeqMemPointerRecordEx(address addr, MEMFLAGS flags, size_t size, + address pc): MemPointerRecordEx(addr, flags, size, pc) { + _seq = SequenceGenerator::next(); + } + + SeqMemPointerRecordEx(const SeqMemPointerRecordEx& copy_from) + : MemPointerRecordEx(copy_from) { + _seq = copy_from.seq(); + } + + SeqMemPointerRecordEx& operator= (const SeqMemPointerRecordEx& ptr) { + MemPointerRecordEx::operator=(ptr); + _seq = ptr.seq(); + return *this; + } + + inline jint seq() const { + return _seq; + } +}; + +#endif // SHARE_VM_SERVICES_MEM_PTR_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memPtrArray.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memPtrArray.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#ifndef SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP +#define SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP + +#include "memory/allocation.hpp" +#include "services/memPtr.hpp" + +class MemPtr; +class MemRecorder; +class ArenaInfo; +class MemSnapshot; + +extern "C" { + typedef int (*FN_SORT)(const void *, const void *); +} + + +// Memory pointer array interface. This array is used by NMT to hold +// various memory block information. +// The memory pointer arrays are usually walked with their iterators. + +class MemPointerArray : public CHeapObj { + public: + virtual ~MemPointerArray() { } + + // return true if it can not allocate storage for the data + virtual bool out_of_memory() const = 0; + virtual bool is_empty() const = 0; + virtual bool is_full() = 0; + virtual int length() const = 0; + virtual void clear() = 0; + virtual bool append(MemPointer* ptr) = 0; + virtual bool insert_at(MemPointer* ptr, int pos) = 0; + virtual bool remove_at(int pos) = 0; + virtual MemPointer* at(int index) const = 0; + virtual void sort(FN_SORT fn) = 0; + virtual size_t instance_size() const = 0; + virtual bool shrink() = 0; + + debug_only(virtual int capacity() const = 0;) +}; + +// Iterator interface +class MemPointerArrayIterator VALUE_OBJ_CLASS_SPEC { + public: + // return the pointer at current position + virtual MemPointer* current() const = 0; + // return the next pointer and advance current position + virtual MemPointer* next() = 0; + // return next pointer without advancing current position + virtual MemPointer* peek_next() const = 0; + // return previous pointer without changing current position + virtual MemPointer* peek_prev() const = 0; + // remove the pointer at current position + virtual void remove() = 0; + // insert the pointer at current position + virtual bool insert(MemPointer* ptr) = 0; + // insert specified element after current position and + // move current position to newly inserted position + virtual bool insert_after(MemPointer* ptr) = 0; +}; + +// implementation class +class MemPointerArrayIteratorImpl : public MemPointerArrayIterator { +#ifdef ASSERT + protected: +#else + private: +#endif + MemPointerArray* _array; + int _pos; + + public: + MemPointerArrayIteratorImpl(MemPointerArray* arr) { + assert(arr != NULL, "Parameter check"); + _array = arr; + _pos = 0; + } + + virtual MemPointer* current() const { + if (_pos < _array->length()) { + return _array->at(_pos); + } + return NULL; + } + + virtual MemPointer* next() { + if (_pos + 1 < _array->length()) { + return _array->at(++_pos); + } + _pos = _array->length(); + return NULL; + } + + virtual MemPointer* peek_next() const { + if (_pos + 1 < _array->length()) { + return _array->at(_pos + 1); + } + return NULL; + } + + virtual MemPointer* peek_prev() const { + if (_pos > 0) { + return _array->at(_pos - 1); + } + return NULL; + } + + virtual void remove() { + if (_pos < _array->length()) { + _array->remove_at(_pos); + } + } + + virtual bool insert(MemPointer* ptr) { + return _array->insert_at(ptr, _pos); + } + + virtual bool insert_after(MemPointer* ptr) { + if (_array->insert_at(ptr, _pos + 1)) { + _pos ++; + return true; + } + return false; + } +}; + + + +// Memory pointer array implementation. +// This implementation implements expandable array +#define DEFAULT_PTR_ARRAY_SIZE 1024 + +template class MemPointerArrayImpl : public MemPointerArray { + private: + int _max_size; + int _size; + bool _init_elements; + E* _data; + + public: + MemPointerArrayImpl(int initial_size = DEFAULT_PTR_ARRAY_SIZE, bool init_elements = true): + _max_size(initial_size), _size(0), _init_elements(init_elements) { + _data = (E*)raw_allocate(sizeof(E), initial_size); + if (_init_elements) { + for (int index = 0; index < _max_size; index ++) { + ::new ((void*)&_data[index]) E(); + } + } + } + + virtual ~MemPointerArrayImpl() { + if (_data != NULL) { + raw_free(_data); + } + } + + public: + bool out_of_memory() const { + return (_data == NULL); + } + + size_t instance_size() const { + return sizeof(MemPointerArrayImpl) + _max_size * sizeof(E); + } + + bool is_empty() const { + assert(_data != NULL, "Just check"); + return _size == 0; + } + + bool is_full() { + assert(_data != NULL, "Just check"); + if (_size < _max_size) { + return false; + } else { + return !expand_array(); + } + } + + int length() const { + assert(_data != NULL, "Just check"); + return _size; + } + + debug_only(int capacity() const { return _max_size; }) + + void clear() { + assert(_data != NULL, "Just check"); + _size = 0; + } + + bool append(MemPointer* ptr) { + assert(_data != NULL, "Just check"); + if (is_full()) { + return false; + } + _data[_size ++] = *(E*)ptr; + return true; + } + + bool insert_at(MemPointer* ptr, int pos) { + assert(_data != NULL, "Just check"); + if (is_full()) { + return false; + } + for (int index = _size; index > pos; index --) { + _data[index] = _data[index - 1]; + } + _data[pos] = *(E*)ptr; + _size ++; + return true; + } + + bool remove_at(int pos) { + assert(_data != NULL, "Just check"); + if (_size <= pos && pos >= 0) { + return false; + } + -- _size; + + for (int index = pos; index < _size; index ++) { + _data[index] = _data[index + 1]; + } + return true; + } + + MemPointer* at(int index) const { + assert(_data != NULL, "Just check"); + assert(index >= 0 && index < _size, "illegal index"); + return &_data[index]; + } + + bool shrink() { + float used = ((float)_size) / ((float)_max_size); + if (used < 0.40) { + E* old_ptr = _data; + int new_size = ((_max_size) / (2 * DEFAULT_PTR_ARRAY_SIZE) + 1) * DEFAULT_PTR_ARRAY_SIZE; + _data = (E*)raw_reallocate(_data, sizeof(E), new_size); + if (_data == NULL) { + _data = old_ptr; + return false; + } else { + _max_size = new_size; + return true; + } + } + return false; + } + + void sort(FN_SORT fn) { + assert(_data != NULL, "Just check"); + qsort((void*)_data, _size, sizeof(E), fn); + } + + private: + bool expand_array() { + assert(_data != NULL, "Not yet allocated"); + E* old_ptr = _data; + if ((_data = (E*)raw_reallocate((void*)_data, sizeof(E), + _max_size + DEFAULT_PTR_ARRAY_SIZE)) == NULL) { + _data = old_ptr; + return false; + } else { + _max_size += DEFAULT_PTR_ARRAY_SIZE; + if (_init_elements) { + for (int index = _size; index < _max_size; index ++) { + ::new ((void*)&_data[index]) E(); + } + } + return true; + } + } + + void* raw_allocate(size_t elementSize, int items) { + return os::malloc(elementSize * items, mtNMT); + } + + void* raw_reallocate(void* ptr, size_t elementSize, int items) { + return os::realloc(ptr, elementSize * items, mtNMT); + } + + void raw_free(void* ptr) { + os::free(ptr, mtNMT); + } +}; + +#endif // SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memRecorder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memRecorder.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" + +#include "runtime/atomic.hpp" +#include "services/memBaseline.hpp" +#include "services/memRecorder.hpp" +#include "services/memPtr.hpp" +#include "services/memTracker.hpp" + +MemPointer* SequencedRecordIterator::next_record() { + MemPointer* itr_cur = _itr.current(); + if (itr_cur == NULL) return NULL; + MemPointer* itr_next = _itr.next(); + + while (itr_next != NULL && + same_kind((MemPointerRecord*)itr_cur, (MemPointerRecord*)itr_next)) { + itr_cur = itr_next; + itr_next = _itr.next(); + } + + return itr_cur; +} + + +volatile jint MemRecorder::_instance_count = 0; + +MemRecorder::MemRecorder() { + assert(MemTracker::is_on(), "Native memory tracking is off"); + Atomic::inc(&_instance_count); + debug_only(set_generation();) + + if (MemTracker::track_callsite()) { + _pointer_records = new (std::nothrow)FixedSizeMemPointerArray(); + } else { + _pointer_records = new (std::nothrow)FixedSizeMemPointerArray(); + } + _next = NULL; + + + if (_pointer_records != NULL) { + // recode itself + record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder), + sizeof(MemRecorder), CALLER_PC); + record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder), + _pointer_records->instance_size(),CURRENT_PC); + } +} + +MemRecorder::~MemRecorder() { + if (_pointer_records != NULL) { + if (MemTracker::is_on()) { + MemTracker::record_free((address)_pointer_records, mtNMT); + MemTracker::record_free((address)this, mtNMT); + } + delete _pointer_records; + } + if (_next != NULL) { + delete _next; + } + + Atomic::dec(&_instance_count); +} + +// Sorting order: +// 1. memory block address +// 2. mem pointer record tags +// 3. sequence number +int MemRecorder::sort_record_fn(const void* e1, const void* e2) { + const MemPointerRecord* p1 = (const MemPointerRecord*)e1; + const MemPointerRecord* p2 = (const MemPointerRecord*)e2; + int delta = UNSIGNED_COMPARE(p1->addr(), p2->addr()); + if (delta == 0) { + int df = UNSIGNED_COMPARE((p1->flags() & MemPointerRecord::tag_masks), + (p2->flags() & MemPointerRecord::tag_masks)); + if (df == 0) { + assert(p1->seq() != p2->seq(), "dup seq"); + return p1->seq() - p2->seq(); + } else { + return df; + } + } else { + return delta; + } +} + +bool MemRecorder::record(address p, MEMFLAGS flags, size_t size, address pc) { +#ifdef ASSERT + if (MemPointerRecord::is_virtual_memory_record(flags)) { + assert((flags & MemPointerRecord::tag_masks) != 0, "bad virtual memory record"); + } else { + assert((flags & MemPointerRecord::tag_masks) == MemPointerRecord::malloc_tag() || + (flags & MemPointerRecord::tag_masks) == MemPointerRecord::free_tag() || + IS_ARENA_OBJ(flags), + "bad malloc record"); + } + // a recorder should only hold records within the same generation + unsigned long cur_generation = SequenceGenerator::current_generation(); + assert(cur_generation == _generation, + "this thread did not enter sync point"); +#endif + + if (MemTracker::track_callsite()) { + SeqMemPointerRecordEx ap(p, flags, size, pc); + debug_only(check_dup_seq(ap.seq());) + return _pointer_records->append(&ap); + } else { + SeqMemPointerRecord ap(p, flags, size); + debug_only(check_dup_seq(ap.seq());) + return _pointer_records->append(&ap); + } +} + + // iterator for alloc pointers +SequencedRecordIterator MemRecorder::pointer_itr() { + assert(_pointer_records != NULL, "just check"); + _pointer_records->sort((FN_SORT)sort_record_fn); + return SequencedRecordIterator(_pointer_records); +} + + +#ifdef ASSERT +void MemRecorder::set_generation() { + _generation = SequenceGenerator::current_generation(); +} + +void MemRecorder::check_dup_seq(jint seq) const { + MemPointerArrayIteratorImpl itr(_pointer_records); + MemPointerRecord* rc = (MemPointerRecord*)itr.current(); + while (rc != NULL) { + assert(rc->seq() != seq, "dup seq"); + rc = (MemPointerRecord*)itr.next(); + } +} + +#endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memRecorder.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memRecorder.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_SERVICES_MEM_RECORDER_HPP +#define SHARE_VM_SERVICES_MEM_RECORDER_HPP + +#include "memory/allocation.hpp" +#include "runtime/os.hpp" +#include "services/memPtrArray.hpp" + +class MemSnapshot; +class MemTracker; +class MemTrackWorker; + +// Fixed size memory pointer array implementation +template class FixedSizeMemPointerArray : + public MemPointerArray { + // This implementation is for memory recorder only + friend class MemRecorder; + + private: + E _data[SIZE]; + int _size; + + protected: + FixedSizeMemPointerArray(bool init_elements = false): + _size(0){ + if (init_elements) { + for (int index = 0; index < SIZE; index ++) { + ::new ((void*)&_data[index]) E(); + } + } + } + + void* operator new(size_t size, const std::nothrow_t& nothrow_constant) { + // the instance is part of memRecorder, needs to be tagged with 'otNMTRecorder' + // to avoid recursion + return os::malloc(size, (mtNMT | otNMTRecorder)); + } + + void* operator new(size_t size) { + assert(false, "use nothrow version"); + return NULL; + } + + void operator delete(void* p) { + os::free(p, (mtNMT | otNMTRecorder)); + } + + // instance size + inline size_t instance_size() const { + return sizeof(FixedSizeMemPointerArray); + } + + debug_only(int capacity() const { return SIZE; }) + + public: + // implementation of public interface + bool out_of_memory() const { return false; } + bool is_empty() const { return _size == 0; } + bool is_full() { return length() >= SIZE; } + int length() const { return _size; } + + void clear() { + _size = 0; + } + + bool append(MemPointer* ptr) { + if (is_full()) return false; + _data[_size ++] = *(E*)ptr; + return true; + } + + virtual bool insert_at(MemPointer* p, int pos) { + assert(false, "append only"); + return false; + } + + virtual bool remove_at(int pos) { + assert(false, "not supported"); + return false; + } + + MemPointer* at(int index) const { + assert(index >= 0 && index < length(), + "parameter check"); + return ((E*)&_data[index]); + } + + void sort(FN_SORT fn) { + qsort((void*)_data, _size, sizeof(E), fn); + } + + bool shrink() { + return false; + } +}; + + +// This iterator requires pre-sorted MemPointerArray, which is sorted by: +// 1. address +// 2. allocation type +// 3. sequence number +// During the array walking, iterator collapses pointers with the same +// address and allocation type, and only returns the one with highest +// sequence number. +// +// This is read-only iterator, update methods are asserted. +class SequencedRecordIterator : public MemPointerArrayIterator { + private: + MemPointerArrayIteratorImpl _itr; + MemPointer* _cur; + + public: + SequencedRecordIterator(const MemPointerArray* arr): + _itr(const_cast(arr)) { + _cur = next_record(); + } + + SequencedRecordIterator(const SequencedRecordIterator& itr): + _itr(itr._itr) { + _cur = next_record(); + } + + // return the pointer at current position + virtual MemPointer* current() const { + return _cur; + }; + + // return the next pointer and advance current position + virtual MemPointer* next() { + _cur = next_record(); + return _cur; + } + + // return the next pointer without advancing current position + virtual MemPointer* peek_next() const { + assert(false, "not implemented"); + return NULL; + + } + // return the previous pointer without changing current position + virtual MemPointer* peek_prev() const { + assert(false, "not implemented"); + return NULL; + } + + // remove the pointer at current position + virtual void remove() { + assert(false, "read-only iterator"); + }; + // insert the pointer at current position + virtual bool insert(MemPointer* ptr) { + assert(false, "read-only iterator"); + return false; + } + + virtual bool insert_after(MemPointer* ptr) { + assert(false, "read-only iterator"); + return false; + } + private: + // collapse the 'same kind' of records, and return this 'kind' of + // record with highest sequence number + MemPointer* next_record(); + + // Test if the two records are the same kind: the same memory block and allocation + // type. + inline bool same_kind(const MemPointerRecord* p1, const MemPointerRecord* p2) const { + return (p1->addr() == p2->addr() && + (p1->flags() &MemPointerRecord::tag_masks) == + (p2->flags() & MemPointerRecord::tag_masks)); + } +}; + + + +#define DEFAULT_RECORDER_PTR_ARRAY_SIZE 512 + +class MemRecorder : public CHeapObj { + friend class MemSnapshot; + friend class MemTracker; + friend class MemTrackWorker; + + protected: + // the array that holds memory records + MemPointerArray* _pointer_records; + + private: + // used for linked list + MemRecorder* _next; + // active recorder can only record a certain generation data + debug_only(unsigned long _generation;) + + protected: + _NOINLINE_ MemRecorder(); + ~MemRecorder(); + + // record a memory operation + bool record(address addr, MEMFLAGS flags, size_t size, address caller_pc = 0); + + // linked list support + inline void set_next(MemRecorder* rec) { + _next = rec; + } + + inline MemRecorder* next() const { + return _next; + } + + // if the recorder is full + inline bool is_full() const { + assert(_pointer_records != NULL, "just check"); + return _pointer_records->is_full(); + } + + // if running out of memory when initializing recorder's internal + // data + inline bool out_of_memory() const { + return (_pointer_records == NULL || + _pointer_records->out_of_memory()); + } + + inline void clear() { + assert(_pointer_records != NULL, "Just check"); + _pointer_records->clear(); + } + + SequencedRecordIterator pointer_itr(); + + protected: + // number of MemRecorder instance + static volatile jint _instance_count; + + private: + // sorting function, sort records into following order + // 1. memory address + // 2. allocation type + // 3. sequence number + static int sort_record_fn(const void* e1, const void* e2); + + debug_only(void check_dup_seq(jint seq) const;) + debug_only(void set_generation();) +}; + +#endif // SHARE_VM_SERVICES_MEM_RECORDER_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memReporter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memReporter.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,560 @@ +/* + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#include "precompiled.hpp" +#include "classfile/systemDictionary.hpp" +#include "runtime/os.hpp" +#include "services/memReporter.hpp" +#include "services/memPtrArray.hpp" +#include "services/memTracker.hpp" + +const char* BaselineOutputer::memory_unit(size_t scale) { + switch(scale) { + case K: return "KB"; + case M: return "MB"; + case G: return "GB"; + } + ShouldNotReachHere(); + return NULL; +} + + +void BaselineReporter::report_baseline(const MemBaseline& baseline, bool summary_only) { + assert(MemTracker::is_on(), "Native memory tracking is off"); + _outputer.start(scale()); + _outputer.total_usage( + amount_in_current_scale(baseline.total_malloc_amount() + baseline.total_reserved_amount()), + amount_in_current_scale(baseline.total_malloc_amount() + baseline.total_committed_amount())); + + _outputer.num_of_classes(baseline.number_of_classes()); + _outputer.num_of_threads(baseline.number_of_threads()); + + report_summaries(baseline); + if (!summary_only && MemTracker::track_callsite()) { + report_callsites(baseline); + } + _outputer.done(); +} + +void BaselineReporter::report_summaries(const MemBaseline& baseline) { + _outputer.start_category_summary(); + MEMFLAGS type; + + for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) { + type = MemBaseline::MemType2NameMap[index]._flag; + _outputer.category_summary(type, + amount_in_current_scale(baseline.reserved_amount(type)), + amount_in_current_scale(baseline.committed_amount(type)), + amount_in_current_scale(baseline.malloc_amount(type)), + baseline.malloc_count(type), + amount_in_current_scale(baseline.arena_amount(type)), + baseline.arena_count(type)); + } + + _outputer.done_category_summary(); +} + +void BaselineReporter::report_callsites(const MemBaseline& baseline) { + _outputer.start_callsite(); + MemBaseline* pBL = const_cast(&baseline); + + pBL->_malloc_cs->sort((FN_SORT)MemBaseline::bl_malloc_sort_by_size); + pBL->_vm_cs->sort((FN_SORT)MemBaseline::bl_vm_sort_by_size); + + // walk malloc callsites + MemPointerArrayIteratorImpl malloc_itr(pBL->_malloc_cs); + MallocCallsitePointer* malloc_callsite = + (MallocCallsitePointer*)malloc_itr.current(); + while (malloc_callsite != NULL) { + _outputer.malloc_callsite(malloc_callsite->addr(), + amount_in_current_scale(malloc_callsite->amount()), malloc_callsite->count()); + malloc_callsite = (MallocCallsitePointer*)malloc_itr.next(); + } + + // walk virtual memory callsite + MemPointerArrayIteratorImpl vm_itr(pBL->_vm_cs); + VMCallsitePointer* vm_callsite = (VMCallsitePointer*)vm_itr.current(); + while (vm_callsite != NULL) { + _outputer.virtual_memory_callsite(vm_callsite->addr(), + amount_in_current_scale(vm_callsite->reserved_amount()), + amount_in_current_scale(vm_callsite->committed_amount())); + vm_callsite = (VMCallsitePointer*)vm_itr.next(); + } + pBL->_malloc_cs->sort((FN_SORT)MemBaseline::bl_malloc_sort_by_pc); + pBL->_vm_cs->sort((FN_SORT)MemBaseline::bl_vm_sort_by_pc); + _outputer.done_callsite(); +} + +void BaselineReporter::diff_baselines(const MemBaseline& cur, const MemBaseline& prev, + bool summary_only) { + assert(MemTracker::is_on(), "Native memory tracking is off"); + _outputer.start(scale()); + size_t total_reserved = cur.total_malloc_amount() + cur.total_reserved_amount(); + size_t total_committed = cur.total_malloc_amount() + cur.total_committed_amount(); + + _outputer.diff_total_usage( + amount_in_current_scale(total_reserved), amount_in_current_scale(total_committed), + diff_in_current_scale(total_reserved, (prev.total_malloc_amount() + prev.total_reserved_amount())), + diff_in_current_scale(total_committed, (prev.total_committed_amount() + prev.total_malloc_amount()))); + + _outputer.diff_num_of_classes(cur.number_of_classes(), + diff(cur.number_of_classes(), prev.number_of_classes())); + _outputer.diff_num_of_threads(cur.number_of_threads(), + diff(cur.number_of_threads(), prev.number_of_threads())); + + diff_summaries(cur, prev); + if (!summary_only && MemTracker::track_callsite()) { + diff_callsites(cur, prev); + } + _outputer.done(); +} + +void BaselineReporter::diff_summaries(const MemBaseline& cur, const MemBaseline& prev) { + _outputer.start_category_summary(); + MEMFLAGS type; + + for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) { + type = MemBaseline::MemType2NameMap[index]._flag; + _outputer.diff_category_summary(type, + amount_in_current_scale(cur.reserved_amount(type)), + amount_in_current_scale(cur.committed_amount(type)), + amount_in_current_scale(cur.malloc_amount(type)), + cur.malloc_count(type), + amount_in_current_scale(cur.arena_amount(type)), + cur.arena_count(type), + diff_in_current_scale(cur.reserved_amount(type), prev.reserved_amount(type)), + diff_in_current_scale(cur.committed_amount(type), prev.committed_amount(type)), + diff_in_current_scale(cur.malloc_amount(type), prev.malloc_amount(type)), + diff(cur.malloc_count(type), prev.malloc_count(type)), + diff_in_current_scale(cur.arena_amount(type), prev.arena_amount(type)), + diff(cur.arena_count(type), prev.arena_count(type))); + } + + _outputer.done_category_summary(); +} + +void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline& prev) { + _outputer.start_callsite(); + MemBaseline* pBL_cur = const_cast(&cur); + MemBaseline* pBL_prev = const_cast(&prev); + + // walk malloc callsites + MemPointerArrayIteratorImpl cur_malloc_itr(pBL_cur->_malloc_cs); + MemPointerArrayIteratorImpl prev_malloc_itr(pBL_prev->_malloc_cs); + + MallocCallsitePointer* cur_malloc_callsite = + (MallocCallsitePointer*)cur_malloc_itr.current(); + MallocCallsitePointer* prev_malloc_callsite = + (MallocCallsitePointer*)prev_malloc_itr.current(); + + while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) { + if (prev_malloc_callsite == NULL || + cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { + _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), + amount_in_current_scale(cur_malloc_callsite->amount()), + cur_malloc_callsite->count(), + diff_in_current_scale(cur_malloc_callsite->amount(), 0), + diff(cur_malloc_callsite->count(), 0)); + cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); + } else if (prev_malloc_callsite == NULL || + cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { + _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), + amount_in_current_scale(prev_malloc_callsite->amount()), + prev_malloc_callsite->count(), + diff_in_current_scale(0, prev_malloc_callsite->amount()), + diff(0, prev_malloc_callsite->count())); + prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); + } else { // the same callsite + _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), + amount_in_current_scale(cur_malloc_callsite->amount()), + cur_malloc_callsite->count(), + diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()), + diff(cur_malloc_callsite->count(), prev_malloc_callsite->count())); + cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); + prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); + } + } + + // walk virtual memory callsite + MemPointerArrayIteratorImpl cur_vm_itr(pBL_cur->_vm_cs); + MemPointerArrayIteratorImpl prev_vm_itr(pBL_prev->_vm_cs); + VMCallsitePointer* cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.current(); + VMCallsitePointer* prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.current(); + while (cur_vm_callsite != NULL || prev_vm_callsite != NULL) { + if (prev_vm_callsite == NULL || cur_vm_callsite->addr() < prev_vm_callsite->addr()) { + _outputer.diff_virtual_memory_callsite(cur_vm_callsite->addr(), + amount_in_current_scale(cur_vm_callsite->reserved_amount()), + amount_in_current_scale(cur_vm_callsite->committed_amount()), + diff_in_current_scale(cur_vm_callsite->reserved_amount(), 0), + diff_in_current_scale(cur_vm_callsite->committed_amount(), 0)); + cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.next(); + } else if (cur_vm_callsite == NULL || cur_vm_callsite->addr() > prev_vm_callsite->addr()) { + _outputer.diff_virtual_memory_callsite(prev_vm_callsite->addr(), + amount_in_current_scale(prev_vm_callsite->reserved_amount()), + amount_in_current_scale(prev_vm_callsite->committed_amount()), + diff_in_current_scale(0, prev_vm_callsite->reserved_amount()), + diff_in_current_scale(0, prev_vm_callsite->committed_amount())); + prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.next(); + } else { // the same callsite + _outputer.diff_virtual_memory_callsite(cur_vm_callsite->addr(), + amount_in_current_scale(cur_vm_callsite->reserved_amount()), + amount_in_current_scale(cur_vm_callsite->committed_amount()), + diff_in_current_scale(cur_vm_callsite->reserved_amount(), prev_vm_callsite->reserved_amount()), + diff_in_current_scale(cur_vm_callsite->committed_amount(), prev_vm_callsite->committed_amount())); + cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.next(); + prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.next(); + } + } + + _outputer.done_callsite(); +} + +size_t BaselineReporter::amount_in_current_scale(size_t amt) const { + return (size_t)(((float)amt/(float)_scale) + 0.5); +} + +int BaselineReporter::diff_in_current_scale(size_t value1, size_t value2) const { + return (int)(((float)value1 - (float)value2)/((float)_scale) + 0.5); +} + +int BaselineReporter::diff(size_t value1, size_t value2) const { + return ((int)value1 - (int)value2); +} + +void BaselineTTYOutputer::start(size_t scale, bool report_diff) { + _scale = scale; + _output->print_cr(" "); + _output->print_cr("Native Memory Tracking:"); + _output->print_cr(" "); +} + +void BaselineTTYOutputer::done() { + +} + +void BaselineTTYOutputer::total_usage(size_t total_reserved, size_t total_committed) { + const char* unit = memory_unit(_scale); + _output->print_cr("Total: reserved=%d%s, committed=%d%s", + total_reserved, unit, total_committed, unit); +} + +void BaselineTTYOutputer::start_category_summary() { + _output->print_cr(" "); +} + +/** + * report a summary of memory type + */ +void BaselineTTYOutputer::category_summary(MEMFLAGS type, + size_t reserved_amt, size_t committed_amt, size_t malloc_amt, + size_t malloc_count, size_t arena_amt, size_t arena_count) { + + // we report mtThreadStack under mtThread category + if (type == mtThreadStack) { + assert(malloc_amt == 0 && malloc_count == 0 && arena_amt == 0, + "Just check"); + _thread_stack_reserved = reserved_amt; + _thread_stack_committed = committed_amt; + } else { + const char* unit = memory_unit(_scale); + size_t total_reserved = (reserved_amt + malloc_amt + arena_amt); + size_t total_committed = (committed_amt + malloc_amt + arena_amt); + if (type == mtThread) { + total_reserved += _thread_stack_reserved; + total_committed += _thread_stack_committed; + } + + if (total_reserved > 0) { + _output->print_cr("-%26s (reserved=%d%s, committed=%d%s)", + MemBaseline::type2name(type), total_reserved, unit, + total_committed, unit); + + if (type == mtClass) { + _output->print_cr("%27s (classes #%d)", " ", _num_of_classes); + } else if (type == mtThread) { + _output->print_cr("%27s (thread #%d)", " ", _num_of_threads); + _output->print_cr("%27s (stack: reserved=%d%s, committed=%d%s)", " ", + _thread_stack_reserved, unit, _thread_stack_committed, unit); + } + + if (malloc_amt > 0) { + if (type != mtChunk) { + _output->print_cr("%27s (malloc=%d%s, #%d)", " ", malloc_amt, unit, + malloc_count); + } else { + _output->print_cr("%27s (malloc=%d%s)", " ", malloc_amt, unit); + } + } + + if (reserved_amt > 0) { + _output->print_cr("%27s (mmap: reserved=%d%s, committed=%d%s)", + " ", reserved_amt, unit, committed_amt, unit); + } + + if (arena_amt > 0) { + _output->print_cr("%27s (arena=%d%s, #%d)", " ", arena_amt, unit, arena_count); + } + + _output->print_cr(" "); + } + } +} + +void BaselineTTYOutputer::done_category_summary() { + _output->print_cr(" "); +} + +void BaselineTTYOutputer::start_callsite() { + _output->print_cr("Details:"); + _output->print_cr(" "); +} + +void BaselineTTYOutputer::done_callsite() { + _output->print_cr(" "); +} + +void BaselineTTYOutputer::malloc_callsite(address pc, size_t malloc_amt, + size_t malloc_count) { + if (malloc_amt > 0) { + const char* unit = memory_unit(_scale); + char buf[64]; + int offset; + if (pc == 0) { + _output->print("[BOOTSTRAP]%18s", " "); + } else if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) { + _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset); + _output->print("%28s", " "); + } else { + _output->print("[" PTR_FORMAT "]%18s", pc, " "); + } + + _output->print_cr("(malloc=%d%s #%d)", malloc_amt, unit, malloc_count); + _output->print_cr(" "); + } +} + +void BaselineTTYOutputer::virtual_memory_callsite(address pc, size_t reserved_amt, + size_t committed_amt) { + if (reserved_amt > 0) { + const char* unit = memory_unit(_scale); + char buf[64]; + int offset; + if (pc == 0) { + _output->print("[BOOTSTRAP]%18s", " "); + } else if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) { + _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset); + _output->print("%28s", " "); + } else { + _output->print("[" PTR_FORMAT "]%18s", " "); + } + + _output->print_cr("(mmap: reserved=%d%s, committed=%d%s)", + reserved_amt, unit, committed_amt, unit); + _output->print_cr(" "); + } +} + +void BaselineTTYOutputer::diff_total_usage(size_t total_reserved, + size_t total_committed, int reserved_diff, int committed_diff) { + const char* unit = memory_unit(_scale); + _output->print_cr("Total: reserved=%d%s %+d%s, committed=%d%s %+d%s", + total_reserved, unit, reserved_diff, unit, total_committed, unit, + committed_diff, unit); +} + +void BaselineTTYOutputer::diff_category_summary(MEMFLAGS type, + size_t cur_reserved_amt, size_t cur_committed_amt, + size_t cur_malloc_amt, size_t cur_malloc_count, + size_t cur_arena_amt, size_t cur_arena_count, + int reserved_diff, int committed_diff, int malloc_diff, + int malloc_count_diff, int arena_diff, int arena_count_diff) { + + if (type == mtThreadStack) { + assert(cur_malloc_amt == 0 && cur_malloc_count == 0 && + cur_arena_amt == 0, "Just check"); + _thread_stack_reserved = cur_reserved_amt; + _thread_stack_committed = cur_committed_amt; + _thread_stack_reserved_diff = reserved_diff; + _thread_stack_committed_diff = committed_diff; + } else { + const char* unit = memory_unit(_scale); + size_t total_reserved = (cur_reserved_amt + cur_malloc_amt + cur_arena_amt); + // nothing to report in this category + if (total_reserved == 0) { + return; + } + int diff_reserved = (reserved_diff + malloc_diff + arena_diff); + + // category summary + _output->print("-%26s (reserved=%d%s", MemBaseline::type2name(type), + total_reserved, unit); + + if (diff_reserved != 0) { + _output->print(" %+d%s", diff_reserved, unit); + } + + size_t total_committed = cur_committed_amt + cur_malloc_amt + cur_arena_amt; + _output->print(", committed=%d%s", total_committed, unit); + + int total_committed_diff = committed_diff + malloc_diff + arena_diff; + if (total_committed_diff != 0) { + _output->print(" %+d%s", total_committed_diff, unit); + } + + _output->print_cr(")"); + + // special cases + if (type == mtClass) { + _output->print("%27s (classes #%d", " ", _num_of_classes); + if (_num_of_classes_diff != 0) { + _output->print(" %+d", _num_of_classes_diff); + } + _output->print_cr(")"); + } else if (type == mtThread) { + // thread count + _output->print("%27s (thread #%d", " ", _num_of_threads); + if (_num_of_threads_diff != 0) { + _output->print_cr(" %+d)", _num_of_threads_diff); + } else { + _output->print_cr(")"); + } + _output->print("%27s (stack: reserved=%d%s", " ", _thread_stack_reserved, unit); + if (_thread_stack_reserved_diff != 0) { + _output->print(" %+d%s", _thread_stack_reserved_diff, unit); + } + + _output->print(", committed=%d%s", _thread_stack_committed, unit); + if (_thread_stack_committed_diff != 0) { + _output->print(" %+d%s",_thread_stack_committed_diff, unit); + } + + _output->print_cr(")"); + } + + // malloc'd memory + if (cur_malloc_amt > 0) { + _output->print("%27s (malloc=%d%s", " ", cur_malloc_amt, unit); + if (malloc_diff != 0) { + _output->print(" %+d%s", malloc_diff, unit); + } + if (type != mtChunk) { + _output->print(", #%d", cur_malloc_count); + if (malloc_count_diff) { + _output->print(" %+d", malloc_count_diff); + } + } + _output->print_cr(")"); + } + + // mmap'd memory + if (cur_reserved_amt > 0) { + _output->print("%27s (mmap: reserved=%d%s", " ", cur_reserved_amt, unit); + if (reserved_diff != 0) { + _output->print(" %+d%s", reserved_diff, unit); + } + + _output->print(", committed=%d%s", cur_committed_amt, unit); + if (committed_diff != 0) { + _output->print(" %+d%s", committed_diff, unit); + } + _output->print_cr(")"); + } + + // arena memory + if (cur_arena_amt > 0) { + _output->print("%27s (arena=%d%s", " ", cur_arena_amt, unit); + if (arena_diff != 0) { + _output->print(" %+d%s", arena_diff, unit); + } + _output->print(", #%d", cur_arena_count); + if (arena_count_diff != 0) { + _output->print(" %+d", arena_count_diff); + } + _output->print_cr(")"); + } + + _output->print_cr(" "); + } +} + +void BaselineTTYOutputer::diff_malloc_callsite(address pc, + size_t cur_malloc_amt, size_t cur_malloc_count, + int malloc_diff, int malloc_count_diff) { + if (malloc_diff != 0) { + const char* unit = memory_unit(_scale); + char buf[64]; + int offset; + if (pc == 0) { + _output->print_cr("[BOOTSTRAP]%18s", " "); + } else { + if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) { + _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset); + _output->print("%28s", " "); + } else { + _output->print("[" PTR_FORMAT "]%18s", pc, " "); + } + } + + _output->print("(malloc=%d%s", cur_malloc_amt, unit); + if (malloc_diff != 0) { + _output->print(" %+d%s", malloc_diff, unit); + } + _output->print(", #%d", cur_malloc_count); + if (malloc_count_diff != 0) { + _output->print(" %+d", malloc_count_diff); + } + _output->print_cr(")"); + _output->print_cr(" "); + } +} + +void BaselineTTYOutputer::diff_virtual_memory_callsite(address pc, + size_t cur_reserved_amt, size_t cur_committed_amt, + int reserved_diff, int committed_diff) { + if (reserved_diff != 0 || committed_diff != 0) { + const char* unit = memory_unit(_scale); + char buf[64]; + int offset; + if (pc == 0) { + _output->print_cr("[BOOSTRAP]%18s", " "); + } else { + if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) { + _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset); + _output->print("%28s", " "); + } else { + _output->print("[" PTR_FORMAT "]%18s", " "); + } + } + + _output->print("(mmap: reserved=%d%s", cur_reserved_amt, unit); + if (reserved_diff != 0) { + _output->print(" %+d%s", reserved_diff, unit); + } + _output->print(", committed=%d%s", cur_committed_amt, unit); + if (committed_diff != 0) { + _output->print(" %+d%s", committed_diff, unit); + } + _output->print_cr(")"); + _output->print_cr(" "); + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memReporter.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memReporter.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_SERVICES_MEM_REPORTER_HPP +#define SHARE_VM_SERVICES_MEM_REPORTER_HPP + +#include "runtime/mutexLocker.hpp" +#include "services/memBaseline.hpp" +#include "services/memTracker.hpp" +#include "utilities/ostream.hpp" + +/* + * MemBaselineReporter reports data to this outputer class, + * ReportOutputer is responsible for format, store and redirect + * the data to the final destination. + */ +class BaselineOutputer : public StackObj { + public: + // start to report memory usage in specified scale. + // if report_diff = true, the reporter reports baseline comparison + // information. + + virtual void start(size_t scale, bool report_diff = false) = 0; + // Done reporting + virtual void done() = 0; + + /* report baseline summary information */ + virtual void total_usage(size_t total_reserved, + size_t total_committed) = 0; + virtual void num_of_classes(size_t classes) = 0; + virtual void num_of_threads(size_t threads) = 0; + + virtual void thread_info(size_t stack_reserved_amt, size_t stack_committed_amt) = 0; + + /* report baseline summary comparison */ + virtual void diff_total_usage(size_t total_reserved, + size_t total_committed, + int reserved_diff, + int committed_diff) = 0; + virtual void diff_num_of_classes(size_t classes, int diff) = 0; + virtual void diff_num_of_threads(size_t threads, int diff) = 0; + + virtual void diff_thread_info(size_t stack_reserved, size_t stack_committed, + int stack_reserved_diff, int stack_committed_diff) = 0; + + + /* + * memory summary by memory types. + * for each memory type, following summaries are reported: + * - reserved amount, committed amount + * - malloc'd amount, malloc count + * - arena amount, arena count + */ + + // start reporting memory summary by memory type + virtual void start_category_summary() = 0; + + virtual void category_summary(MEMFLAGS type, size_t reserved_amt, + size_t committed_amt, + size_t malloc_amt, size_t malloc_count, + size_t arena_amt, size_t arena_count) = 0; + + virtual void diff_category_summary(MEMFLAGS type, size_t cur_reserved_amt, + size_t cur_committed_amt, + size_t cur_malloc_amt, size_t cur_malloc_count, + size_t cur_arena_amt, size_t cur_arena_count, + int reserved_diff, int committed_diff, int malloc_diff, + int malloc_count_diff, int arena_diff, + int arena_count_diff) = 0; + + virtual void done_category_summary() = 0; + + /* + * Report callsite information + */ + virtual void start_callsite() = 0; + virtual void malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count) = 0; + virtual void virtual_memory_callsite(address pc, size_t reserved_amt, size_t committed_amt) = 0; + + virtual void diff_malloc_callsite(address pc, size_t cur_malloc_amt, size_t cur_malloc_count, + int malloc_diff, int malloc_count_diff) = 0; + virtual void diff_virtual_memory_callsite(address pc, size_t cur_reserved_amt, size_t cur_committed_amt, + int reserved_diff, int committed_diff) = 0; + + virtual void done_callsite() = 0; + + // return current scale in "KB", "MB" or "GB" + static const char* memory_unit(size_t scale); +}; + +/* + * This class reports processed data from a baseline or + * the changes between the two baseline. + */ +class BaselineReporter : public StackObj { + private: + BaselineOutputer& _outputer; + size_t _scale; + + public: + // construct a reporter that reports memory usage + // in specified scale + BaselineReporter(BaselineOutputer& outputer, size_t scale = K): + _outputer(outputer) { + _scale = scale; + } + virtual void report_baseline(const MemBaseline& baseline, bool summary_only = false); + virtual void diff_baselines(const MemBaseline& cur, const MemBaseline& prev, + bool summary_only = false); + + void set_scale(size_t scale); + size_t scale() const { return _scale; } + + private: + void report_summaries(const MemBaseline& baseline); + void report_callsites(const MemBaseline& baseline); + + void diff_summaries(const MemBaseline& cur, const MemBaseline& prev); + void diff_callsites(const MemBaseline& cur, const MemBaseline& prev); + + // calculate memory size in current memory scale + size_t amount_in_current_scale(size_t amt) const; + // diff two unsigned values in current memory scale + int diff_in_current_scale(size_t value1, size_t value2) const; + // diff two unsigned value + int diff(size_t value1, size_t value2) const; +}; + +/* + * tty output implementation. Native memory tracking + * DCmd uses this outputer. + */ +class BaselineTTYOutputer : public BaselineOutputer { + private: + size_t _scale; + + size_t _num_of_classes; + size_t _num_of_threads; + size_t _thread_stack_reserved; + size_t _thread_stack_committed; + + int _num_of_classes_diff; + int _num_of_threads_diff; + int _thread_stack_reserved_diff; + int _thread_stack_committed_diff; + + outputStream* _output; + + public: + BaselineTTYOutputer(outputStream* st) { + _scale = K; + _num_of_classes = 0; + _num_of_threads = 0; + _thread_stack_reserved = 0; + _thread_stack_committed = 0; + _num_of_classes_diff = 0; + _num_of_threads_diff = 0; + _thread_stack_reserved_diff = 0; + _thread_stack_committed_diff = 0; + _output = st; + } + + // begin reporting memory usage in specified scale + void start(size_t scale, bool report_diff = false); + // done reporting + void done(); + + // total memory usage + void total_usage(size_t total_reserved, + size_t total_committed); + // report total loaded classes + void num_of_classes(size_t classes) { + _num_of_classes = classes; + } + + void num_of_threads(size_t threads) { + _num_of_threads = threads; + } + + void thread_info(size_t stack_reserved_amt, size_t stack_committed_amt) { + _thread_stack_reserved = stack_reserved_amt; + _thread_stack_committed = stack_committed_amt; + } + + void diff_total_usage(size_t total_reserved, + size_t total_committed, + int reserved_diff, + int committed_diff); + + void diff_num_of_classes(size_t classes, int diff) { + _num_of_classes = classes; + _num_of_classes_diff = diff; + } + + void diff_num_of_threads(size_t threads, int diff) { + _num_of_threads = threads; + _num_of_threads_diff = diff; + } + + void diff_thread_info(size_t stack_reserved_amt, size_t stack_committed_amt, + int stack_reserved_diff, int stack_committed_diff) { + _thread_stack_reserved = stack_reserved_amt; + _thread_stack_committed = stack_committed_amt; + _thread_stack_reserved_diff = stack_reserved_diff; + _thread_stack_committed_diff = stack_committed_diff; + } + + /* + * Report memory summary categoriuzed by memory types. + * For each memory type, following summaries are reported: + * - reserved amount, committed amount + * - malloc-ed amount, malloc count + * - arena amount, arena count + */ + // start reporting memory summary by memory type + void start_category_summary(); + void category_summary(MEMFLAGS type, size_t reserved_amt, size_t committed_amt, + size_t malloc_amt, size_t malloc_count, + size_t arena_amt, size_t arena_count); + + void diff_category_summary(MEMFLAGS type, size_t cur_reserved_amt, + size_t cur_committed_amt, + size_t cur_malloc_amt, size_t cur_malloc_count, + size_t cur_arena_amt, size_t cur_arena_count, + int reserved_diff, int committed_diff, int malloc_diff, + int malloc_count_diff, int arena_diff, + int arena_count_diff); + + void done_category_summary(); + + /* + * Report callsite information + */ + void start_callsite(); + void malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count); + void virtual_memory_callsite(address pc, size_t reserved_amt, size_t committed_amt); + + void diff_malloc_callsite(address pc, size_t cur_malloc_amt, size_t cur_malloc_count, + int malloc_diff, int malloc_count_diff); + void diff_virtual_memory_callsite(address pc, size_t cur_reserved_amt, size_t cur_committed_amt, + int reserved_diff, int committed_diff); + + void done_callsite(); +}; + + +#endif // SHARE_VM_SERVICES_MEM_REPORTER_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memSnapshot.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memSnapshot.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,463 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "runtime/mutexLocker.hpp" +#include "utilities/decoder.hpp" +#include "services/memBaseline.hpp" +#include "services/memPtr.hpp" +#include "services/memPtrArray.hpp" +#include "services/memSnapshot.hpp" +#include "services/memTracker.hpp" + + +// stagging data groups the data of a VM memory range, so we can consolidate +// them into one record during the walk +bool StagingWalker::consolidate_vm_records(VMMemRegionEx* vm_rec) { + MemPointerRecord* cur = (MemPointerRecord*)_itr.current(); + assert(cur != NULL && cur->is_vm_pointer(), "not a virtual memory pointer"); + + jint cur_seq; + jint next_seq; + + bool trackCallsite = MemTracker::track_callsite(); + + if (trackCallsite) { + vm_rec->init((MemPointerRecordEx*)cur); + cur_seq = ((SeqMemPointerRecordEx*)cur)->seq(); + } else { + vm_rec->init((MemPointerRecord*)cur); + cur_seq = ((SeqMemPointerRecord*)cur)->seq(); + } + + // only can consolidate when we have allocation record, + // which contains virtual memory range + if (!cur->is_allocation_record()) { + _itr.next(); + return true; + } + + // allocation range + address base = cur->addr(); + address end = base + cur->size(); + + MemPointerRecord* next = (MemPointerRecord*)_itr.peek_next(); + // if the memory range is alive + bool live_vm_rec = true; + while (next != NULL && next->is_vm_pointer()) { + if (next->is_allocation_record()) { + assert(next->addr() >= base, "sorting order or overlapping"); + break; + } + + if (trackCallsite) { + next_seq = ((SeqMemPointerRecordEx*)next)->seq(); + } else { + next_seq = ((SeqMemPointerRecord*)next)->seq(); + } + + if (next_seq < cur_seq) { + _itr.next(); + next = (MemPointerRecord*)_itr.peek_next(); + continue; + } + + if (next->is_deallocation_record()) { + if (next->addr() == base && next->size() == cur->size()) { + // the virtual memory range has been released + _itr.next(); + live_vm_rec = false; + break; + } else if (next->addr() < end) { // partial release + vm_rec->partial_release(next->addr(), next->size()); + _itr.next(); + } else { + break; + } + } else if (next->is_commit_record()) { + if (next->addr() >= base && next->addr() + next->size() <= end) { + vm_rec->commit(next->size()); + _itr.next(); + } else { + assert(next->addr() >= base, "sorting order or overlapping"); + break; + } + } else if (next->is_uncommit_record()) { + if (next->addr() >= base && next->addr() + next->size() <= end) { + vm_rec->uncommit(next->size()); + _itr.next(); + } else { + assert(next->addr() >= end, "sorting order or overlapping"); + break; + } + } else if (next->is_type_tagging_record()) { + if (next->addr() >= base && next->addr() < end ) { + vm_rec->tag(next->flags()); + _itr.next(); + } else { + break; + } + } else { + assert(false, "unknown record type"); + } + next = (MemPointerRecord*)_itr.peek_next(); + } + _itr.next(); + return live_vm_rec; +} + +MemPointer* StagingWalker::next() { + MemPointerRecord* cur_p = (MemPointerRecord*)_itr.current(); + if (cur_p == NULL) { + _end_of_array = true; + return NULL; + } + + MemPointerRecord* next_p; + if (cur_p->is_vm_pointer()) { + _is_vm_record = true; + if (!consolidate_vm_records(&_vm_record)) { + return next(); + } + } else { // malloc-ed pointer + _is_vm_record = false; + next_p = (MemPointerRecord*)_itr.peek_next(); + if (next_p != NULL && next_p->addr() == cur_p->addr()) { + assert(cur_p->is_allocation_record(), "sorting order"); + assert(!next_p->is_allocation_record(), "sorting order"); + _itr.next(); + if (cur_p->seq() < next_p->seq()) { + cur_p = next_p; + } + } + if (MemTracker::track_callsite()) { + _malloc_record.init((MemPointerRecordEx*)cur_p); + } else { + _malloc_record.init((MemPointerRecord*)cur_p); + } + + _itr.next(); + } + return current(); +} + +MemSnapshot::MemSnapshot() { + if (MemTracker::track_callsite()) { + _alloc_ptrs = new (std::nothrow) MemPointerArrayImpl(); + _vm_ptrs = new (std::nothrow)MemPointerArrayImpl(64, true); + _staging_area = new (std::nothrow)MemPointerArrayImpl(); + } else { + _alloc_ptrs = new (std::nothrow) MemPointerArrayImpl(); + _vm_ptrs = new (std::nothrow)MemPointerArrayImpl(64, true); + _staging_area = new (std::nothrow)MemPointerArrayImpl(); + } + + _lock = new (std::nothrow) Mutex(Monitor::max_nonleaf - 1, "memSnapshotLock"); + NOT_PRODUCT(_untracked_count = 0;) +} + +MemSnapshot::~MemSnapshot() { + assert(MemTracker::shutdown_in_progress(), "native memory tracking still on"); + { + MutexLockerEx locker(_lock); + if (_staging_area != NULL) { + delete _staging_area; + _staging_area = NULL; + } + + if (_alloc_ptrs != NULL) { + delete _alloc_ptrs; + _alloc_ptrs = NULL; + } + + if (_vm_ptrs != NULL) { + delete _vm_ptrs; + _vm_ptrs = NULL; + } + } + + if (_lock != NULL) { + delete _lock; + _lock = NULL; + } +} + +void MemSnapshot::copy_pointer(MemPointerRecord* dest, const MemPointerRecord* src) { + assert(dest != NULL && src != NULL, "Just check"); + assert(dest->addr() == src->addr(), "Just check"); + + MEMFLAGS flags = dest->flags(); + + if (MemTracker::track_callsite()) { + *(MemPointerRecordEx*)dest = *(MemPointerRecordEx*)src; + } else { + *dest = *src; + } +} + + +// merge a per-thread memory recorder to the staging area +bool MemSnapshot::merge(MemRecorder* rec) { + assert(rec != NULL && !rec->out_of_memory(), "Just check"); + + // out of memory + if (_staging_area == NULL || _staging_area->out_of_memory()) { + return false; + } + + SequencedRecordIterator itr(rec->pointer_itr()); + + MutexLockerEx lock(_lock, true); + MemPointerIterator staging_itr(_staging_area); + MemPointerRecord *p1, *p2; + p1 = (MemPointerRecord*) itr.current(); + while (p1 != NULL) { + p2 = (MemPointerRecord*)staging_itr.locate(p1->addr()); + // we have not seen this memory block, so just add to staging area + if (p2 == NULL) { + if (!staging_itr.insert(p1)) { + return false; + } + } else if (p1->addr() == p2->addr()) { + MemPointerRecord* staging_next = (MemPointerRecord*)staging_itr.peek_next(); + // a memory block can have many tagging records, find right one to replace or + // right position to insert + while (staging_next != NULL && staging_next->addr() == p1->addr()) { + if ((staging_next->flags() & MemPointerRecord::tag_masks) <= + (p1->flags() & MemPointerRecord::tag_masks)) { + p2 = (MemPointerRecord*)staging_itr.next(); + staging_next = (MemPointerRecord*)staging_itr.peek_next(); + } else { + break; + } + } + int df = (p1->flags() & MemPointerRecord::tag_masks) - + (p2->flags() & MemPointerRecord::tag_masks); + if (df == 0) { + assert(p1->seq() > 0, "not sequenced"); + assert(p2->seq() > 0, "not sequenced"); + if (p1->seq() > p2->seq()) { + copy_pointer(p2, p1); + } + } else if (df < 0) { + if (!staging_itr.insert(p1)) { + return false; + } + } else { + if (!staging_itr.insert_after(p1)) { + return false; + } + } + } else if (p1->addr() < p2->addr()) { + if (!staging_itr.insert(p1)) { + return false; + } + } else { + if (!staging_itr.insert_after(p1)) { + return false; + } + } + p1 = (MemPointerRecord*)itr.next(); + } + NOT_PRODUCT(void check_staging_data();) + return true; +} + + + +// promote data to next generation +void MemSnapshot::promote() { + assert(_alloc_ptrs != NULL && _staging_area != NULL && _vm_ptrs != NULL, + "Just check"); + MutexLockerEx lock(_lock, true); + StagingWalker walker(_staging_area); + MemPointerIterator malloc_itr(_alloc_ptrs); + VMMemPointerIterator vm_itr(_vm_ptrs); + MemPointer* cur = walker.current(); + while (cur != NULL) { + if (walker.is_vm_record()) { + VMMemRegion* cur_vm = (VMMemRegion*)cur; + VMMemRegion* p = (VMMemRegion*)vm_itr.locate(cur_vm->addr()); + cur_vm = (VMMemRegion*)cur; + if (p != NULL && (p->contains(cur_vm) || p->base() == cur_vm->base())) { + assert(p->is_reserve_record() || + p->is_commit_record(), "wrong vm record type"); + // resize existing reserved range + if (cur_vm->is_reserve_record() && p->base() == cur_vm->base()) { + assert(cur_vm->size() >= p->committed_size(), "incorrect resizing"); + p->set_reserved_size(cur_vm->size()); + } else if (cur_vm->is_commit_record()) { + p->commit(cur_vm->committed_size()); + } else if (cur_vm->is_uncommit_record()) { + p->uncommit(cur_vm->committed_size()); + if (!p->is_reserve_record() && p->committed_size() == 0) { + vm_itr.remove(); + } + } else if (cur_vm->is_type_tagging_record()) { + p->tag(cur_vm->flags()); + } else if (cur_vm->is_release_record()) { + if (cur_vm->base() == p->base() && cur_vm->size() == p->size()) { + // release the whole range + vm_itr.remove(); + } else { + // partial release + p->partial_release(cur_vm->base(), cur_vm->size()); + } + } else { + // we do see multiple reserver on the same vm range + assert((cur_vm->is_commit_record() || cur_vm->is_reserve_record()) && + cur_vm->base() == p->base() && cur_vm->size() == p->size(), "bad record"); + p->tag(cur_vm->flags()); + } + } else { + if(cur_vm->is_reserve_record()) { + if (p == NULL || p->base() > cur_vm->base()) { + vm_itr.insert(cur_vm); + } else { + vm_itr.insert_after(cur_vm); + } + } else { +#ifdef ASSERT + // In theory, we should assert without conditions. However, in case of native + // thread stack, NMT explicitly releases the thread stack in Thread's destructor, + // due to platform dependent behaviors. On some platforms, we see uncommit/release + // native thread stack, but some, we don't. + if (!cur_vm->is_uncommit_record() && !cur_vm->is_deallocation_record()) { + ShouldNotReachHere(); + } +#endif + } + } + } else { + MemPointerRecord* cur_p = (MemPointerRecord*)cur; + MemPointerRecord* p = (MemPointerRecord*)malloc_itr.locate(cur->addr()); + if (p != NULL && cur_p->addr() == p->addr()) { + assert(p->is_allocation_record() || p->is_arena_size_record(), "untracked"); + if (cur_p->is_allocation_record() || cur_p->is_arena_size_record()) { + copy_pointer(p, cur_p); + } else { // deallocation record + assert(cur_p->is_deallocation_record(), "wrong record type"); + + // we are removing an arena record, we also need to remove its 'size' + // record behind it + if (p->is_arena_record()) { + MemPointerRecord* next_p = (MemPointerRecord*)malloc_itr.peek_next(); + if (next_p->is_arena_size_record()) { + assert(next_p->is_size_record_of_arena(p), "arena records dont match"); + malloc_itr.remove(); + } + } + malloc_itr.remove(); + } + } else { + if (cur_p->is_arena_size_record()) { + MemPointerRecord* prev_p = (MemPointerRecord*)malloc_itr.peek_prev(); + if (prev_p != NULL && + (!prev_p->is_arena_record() || !cur_p->is_size_record_of_arena(prev_p))) { + // arena already deallocated + cur_p = NULL; + } + } + if (cur_p != NULL) { + if (cur_p->is_allocation_record() || cur_p->is_arena_size_record()) { + if (p != NULL && cur_p->addr() > p->addr()) { + malloc_itr.insert_after(cur); + } else { + malloc_itr.insert(cur); + } + } +#ifndef PRODUCT + else if (!has_allocation_record(cur_p->addr())){ + // NMT can not track some startup memory, which allocated before NMT + // is enabled + _untracked_count ++; + } +#endif + } + } + } + + cur = walker.next(); + } + NOT_PRODUCT(check_malloc_pointers();) + _staging_area->shrink(); + _staging_area->clear(); +} + + +#ifdef ASSERT +void MemSnapshot::print_snapshot_stats(outputStream* st) { + st->print_cr("Snapshot:"); + st->print_cr("\tMalloced: %d/%d [%5.2f%%] %dKB", _alloc_ptrs->length(), _alloc_ptrs->capacity(), + (100.0 * (float)_alloc_ptrs->length()) / (float)_alloc_ptrs->capacity(), _alloc_ptrs->instance_size()/K); + + st->print_cr("\tVM: %d/%d [%5.2f%%] %dKB", _vm_ptrs->length(), _vm_ptrs->capacity(), + (100.0 * (float)_vm_ptrs->length()) / (float)_vm_ptrs->capacity(), _vm_ptrs->instance_size()/K); + + st->print_cr("\tStaging: %d/%d [%5.2f%%] %dKB", _staging_area->length(), _staging_area->capacity(), + (100.0 * (float)_staging_area->length()) / (float)_staging_area->capacity(), _staging_area->instance_size()/K); + + st->print_cr("\tUntracked allocation: %d", _untracked_count); +} + +void MemSnapshot::check_malloc_pointers() { + MemPointerArrayIteratorImpl mItr(_alloc_ptrs); + MemPointerRecord* p = (MemPointerRecord*)mItr.current(); + MemPointerRecord* prev = NULL; + while (p != NULL) { + if (prev != NULL) { + assert(p->addr() >= prev->addr(), "sorting order"); + } + prev = p; + p = (MemPointerRecord*)mItr.next(); + } +} + +void MemSnapshot::check_staging_data() { + MemPointerArrayIteratorImpl itr(_staging_area); + MemPointerRecord* cur = (MemPointerRecord*)itr.current(); + MemPointerRecord* next = (MemPointerRecord*)itr.next(); + while (next != NULL) { + assert((next->addr() > cur->addr()) || + ((next->flags() & MemPointerRecord::tag_masks) > + (cur->flags() & MemPointerRecord::tag_masks)), + "sorting order"); + cur = next; + next = (MemPointerRecord*)itr.next(); + } +} + +bool MemSnapshot::has_allocation_record(address addr) { + MemPointerArrayIteratorImpl itr(_staging_area); + MemPointerRecord* cur = (MemPointerRecord*)itr.current(); + while (cur != NULL) { + if (cur->addr() == addr && cur->is_allocation_record()) { + return true; + } + cur = (MemPointerRecord*)itr.next(); + } + return false; +} + +#endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memSnapshot.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memSnapshot.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_SERVICES_MEM_SNAPSHOT_HPP +#define SHARE_VM_SERVICES_MEM_SNAPSHOT_HPP + +#include "memory/allocation.hpp" +#include "runtime/mutex.hpp" +#include "runtime/mutexLocker.hpp" +#include "services/memBaseline.hpp" +#include "services/memPtrArray.hpp" + + +// Snapshot pointer array iterator + +// The pointer array contains malloc-ed pointers +class MemPointerIterator : public MemPointerArrayIteratorImpl { + public: + MemPointerIterator(MemPointerArray* arr): + MemPointerArrayIteratorImpl(arr) { + assert(arr != NULL, "null array"); + } + +#ifdef ASSERT + virtual bool is_dup_pointer(const MemPointer* ptr1, + const MemPointer* ptr2) const { + MemPointerRecord* p1 = (MemPointerRecord*)ptr1; + MemPointerRecord* p2 = (MemPointerRecord*)ptr2; + + if (p1->addr() != p2->addr()) return false; + if ((p1->flags() & MemPointerRecord::tag_masks) != + (p2->flags() & MemPointerRecord::tag_masks)) { + return false; + } + // we do see multiple commit/uncommit on the same memory, it is ok + return (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_alloc || + (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_release; + } + + virtual bool insert(MemPointer* ptr) { + if (_pos > 0) { + MemPointer* p1 = (MemPointer*)ptr; + MemPointer* p2 = (MemPointer*)_array->at(_pos - 1); + assert(!is_dup_pointer(p1, p2), + "dup pointer"); + } + if (_pos < _array->length() -1) { + MemPointer* p1 = (MemPointer*)ptr; + MemPointer* p2 = (MemPointer*)_array->at(_pos + 1); + assert(!is_dup_pointer(p1, p2), + "dup pointer"); + } + return _array->insert_at(ptr, _pos); + } + + virtual bool insert_after(MemPointer* ptr) { + if (_pos > 0) { + MemPointer* p1 = (MemPointer*)ptr; + MemPointer* p2 = (MemPointer*)_array->at(_pos - 1); + assert(!is_dup_pointer(p1, p2), + "dup pointer"); + } + if (_pos < _array->length() - 1) { + MemPointer* p1 = (MemPointer*)ptr; + MemPointer* p2 = (MemPointer*)_array->at(_pos + 1); + + assert(!is_dup_pointer(p1, p2), + "dup pointer"); + } + if (_array->insert_at(ptr, _pos + 1)) { + _pos ++; + return true; + } + return false; + } +#endif + + virtual MemPointer* locate(address addr) { + MemPointer* cur = current(); + while (cur != NULL && cur->addr() < addr) { + cur = next(); + } + return cur; + } +}; + +class VMMemPointerIterator : public MemPointerIterator { + public: + VMMemPointerIterator(MemPointerArray* arr): + MemPointerIterator(arr) { + } + + // locate an exiting record that contains specified address, or + // the record, where the record with specified address, should + // be inserted + virtual MemPointer* locate(address addr) { + VMMemRegion* cur = (VMMemRegion*)current(); + VMMemRegion* next_p; + + while (cur != NULL) { + if (cur->base() > addr) { + return cur; + } else { + // find nearest existing range that has base address <= addr + next_p = (VMMemRegion*)peek_next(); + if (next_p != NULL && next_p->base() <= addr) { + cur = (VMMemRegion*)next(); + continue; + } + } + + if (cur->is_reserve_record() && + cur->base() <= addr && + (cur->base() + cur->size() > addr)) { + return cur; + } else if (cur->is_commit_record() && + cur->base() <= addr && + (cur->base() + cur->committed_size() > addr)) { + return cur; + } + cur = (VMMemRegion*)next(); + } + return NULL; + } + +#ifdef ASSERT + virtual bool is_dup_pointer(const MemPointer* ptr1, + const MemPointer* ptr2) const { + VMMemRegion* p1 = (VMMemRegion*)ptr1; + VMMemRegion* p2 = (VMMemRegion*)ptr2; + + if (p1->addr() != p2->addr()) return false; + if ((p1->flags() & MemPointerRecord::tag_masks) != + (p2->flags() & MemPointerRecord::tag_masks)) { + return false; + } + // we do see multiple commit/uncommit on the same memory, it is ok + return (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_alloc || + (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_release; + } +#endif +}; + +class StagingWalker : public MemPointerArrayIterator { + private: + MemPointerArrayIteratorImpl _itr; + bool _is_vm_record; + bool _end_of_array; + VMMemRegionEx _vm_record; + MemPointerRecordEx _malloc_record; + + public: + StagingWalker(MemPointerArray* arr): _itr(arr) { + _end_of_array = false; + next(); + } + + // return the pointer at current position + MemPointer* current() const { + if (_end_of_array) { + return NULL; + } + if (is_vm_record()) { + return (MemPointer*)&_vm_record; + } else { + return (MemPointer*)&_malloc_record; + } + } + + // return the next pointer and advance current position + MemPointer* next(); + + // type of 'current' record + bool is_vm_record() const { + return _is_vm_record; + } + + // return the next poinger without advancing current position + MemPointer* peek_next() const { + assert(false, "not supported"); + return NULL; + } + + MemPointer* peek_prev() const { + assert(false, "not supported"); + return NULL; + } + // remove the pointer at current position + void remove() { + assert(false, "not supported"); + } + + // insert the pointer at current position + bool insert(MemPointer* ptr) { + assert(false, "not supported"); + return false; + } + + bool insert_after(MemPointer* ptr) { + assert(false, "not supported"); + return false; + } + + private: + // consolidate all records referring to this vm region + bool consolidate_vm_records(VMMemRegionEx* vm_rec); +}; + +class MemBaseline; + +class MemSnapshot : public CHeapObj { + private: + // the following two arrays contain records of all known lived memory blocks + // live malloc-ed memory pointers + MemPointerArray* _alloc_ptrs; + // live virtual memory pointers + MemPointerArray* _vm_ptrs; + + // stagging a generation's data, before + // it can be prompted to snapshot + MemPointerArray* _staging_area; + + // the lock to protect this snapshot + Monitor* _lock; + + NOT_PRODUCT(size_t _untracked_count;) + friend class MemBaseline; + + public: + MemSnapshot(); + virtual ~MemSnapshot(); + + // if we are running out of native memory + bool out_of_memory() const { + return (_alloc_ptrs == NULL || _staging_area == NULL || + _vm_ptrs == NULL || _lock == NULL || + _alloc_ptrs->out_of_memory() || + _staging_area->out_of_memory() || + _vm_ptrs->out_of_memory()); + } + + // merge a per-thread memory recorder into staging area + bool merge(MemRecorder* rec); + // promote staged data to snapshot + void promote(); + + + void wait(long timeout) { + assert(_lock != NULL, "Just check"); + MonitorLockerEx locker(_lock); + locker.wait(true, timeout); + } + + NOT_PRODUCT(void print_snapshot_stats(outputStream* st);) + NOT_PRODUCT(void check_staging_data();) + NOT_PRODUCT(void check_malloc_pointers();) + NOT_PRODUCT(bool has_allocation_record(address addr);) + + private: + // copy pointer data from src to dest + void copy_pointer(MemPointerRecord* dest, const MemPointerRecord* src); +}; + + +#endif // SHARE_VM_SERVICES_MEM_SNAPSHOT_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memTrackWorker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memTrackWorker.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "runtime/threadCritical.hpp" +#include "services/memTracker.hpp" +#include "services/memTrackWorker.hpp" +#include "utilities/decoder.hpp" +#include "utilities/vmError.hpp" + +MemTrackWorker::MemTrackWorker() { + // create thread uses cgc thread type for now. We should revisit + // the option, or create new thread type. + _has_error = !os::create_thread(this, os::cgc_thread); + set_name("MemTrackWorker", 0); + + // initial generation circuit buffer + if (!has_error()) { + _head = _tail = 0; + for(int index = 0; index < MAX_GENERATIONS; index ++) { + _gen[index] = NULL; + } + } + NOT_PRODUCT(_sync_point_count = 0;) + NOT_PRODUCT(_merge_count = 0;) + NOT_PRODUCT(_last_gen_in_use = 0;) +} + +MemTrackWorker::~MemTrackWorker() { + for (int index = 0; index < MAX_GENERATIONS; index ++) { + MemRecorder* rc = _gen[index]; + if (rc != NULL) { + delete rc; + } + } +} + +void* MemTrackWorker::operator new(size_t size) { + assert(false, "use nothrow version"); + return NULL; +} + +void* MemTrackWorker::operator new(size_t size, const std::nothrow_t& nothrow_constant) { + return allocate(size, false, mtNMT); +} + +void MemTrackWorker::start() { + os::start_thread(this); +} + +/* + * Native memory tracking worker thread loop: + * 1. merge one generation of memory recorders to staging area + * 2. promote staging data to memory snapshot + * + * This thread can run through safepoint. + */ + +void MemTrackWorker::run() { + assert(MemTracker::is_on(), "native memory tracking is off"); + this->initialize_thread_local_storage(); + this->record_stack_base_and_size(); + MemSnapshot* snapshot = MemTracker::get_snapshot(); + assert(snapshot != NULL, "Worker should not be started"); + MemRecorder* rec; + + while (!MemTracker::shutdown_in_progress()) { + NOT_PRODUCT(_last_gen_in_use = generations_in_use();) + { + // take a recorder from earliest generation in buffer + ThreadCritical tc; + rec = _gen[_head]; + if (rec != NULL) { + _gen[_head] = rec->next(); + } + assert(count_recorder(_gen[_head]) <= MemRecorder::_instance_count, + "infinite loop after dequeue"); + } + if (rec != NULL) { + // merge the recorder into staging area + bool result = snapshot->merge(rec); + assert(result, "merge failed"); + debug_only(_merge_count ++;) + MemTracker::release_thread_recorder(rec); + } else { + // no more recorder to merge, promote staging area + // to snapshot + if (_head != _tail) { + { + ThreadCritical tc; + if (_gen[_head] != NULL || _head == _tail) { + continue; + } + // done with this generation, increment _head pointer + _head = (_head + 1) % MAX_GENERATIONS; + } + // promote this generation data to snapshot + snapshot->promote(); + } else { + snapshot->wait(1000); + ThreadCritical tc; + // check if more data arrived + if (_gen[_head] == NULL) { + _gen[_head] = MemTracker::get_pending_recorders(); + } + } + } + } + assert(MemTracker::shutdown_in_progress(), "just check"); + + // transites to final shutdown + MemTracker::final_shutdown(); +} + +// at synchronization point, where 'safepoint visible' Java threads are blocked +// at a safepoint, and the rest of threads are blocked on ThreadCritical lock. +// The caller MemTracker::sync() already takes ThreadCritical before calling this +// method. +// +// Following tasks are performed: +// 1. add all recorders in pending queue to current generation +// 2. increase generation + +void MemTrackWorker::at_sync_point(MemRecorder* rec) { + NOT_PRODUCT(_sync_point_count ++;) + assert(count_recorder(rec) <= MemRecorder::_instance_count, + "pending queue has infinite loop"); + + bool out_of_generation_buffer = false; + // check shutdown state inside ThreadCritical + if (MemTracker::shutdown_in_progress()) return; + // append the recorders to the end of the generation + if( rec != NULL) { + MemRecorder* cur_head = _gen[_tail]; + if (cur_head == NULL) { + _gen[_tail] = rec; + } else { + while (cur_head->next() != NULL) { + cur_head = cur_head->next(); + } + cur_head->set_next(rec); + } + } + assert(count_recorder(rec) <= MemRecorder::_instance_count, + "after add to current generation has infinite loop"); + // we have collected all recorders for this generation. If there is data, + // we need to increment _tail to start a new generation. + if (_gen[_tail] != NULL || _head == _tail) { + _tail = (_tail + 1) % MAX_GENERATIONS; + out_of_generation_buffer = (_tail == _head); + } + + if (out_of_generation_buffer) { + MemTracker::shutdown(MemTracker::NMT_out_of_generation); + } +} + +#ifndef PRODUCT +int MemTrackWorker::count_recorder(const MemRecorder* head) { + int count = 0; + while(head != NULL) { + count ++; + head = head->next(); + } + return count; +} + +int MemTrackWorker::count_pending_recorders() const { + int count = 0; + for (int index = 0; index < MAX_GENERATIONS; index ++) { + MemRecorder* head = _gen[index]; + if (head != NULL) { + count += count_recorder(head); + } + } + return count; +} +#endif diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memTrackWorker.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memTrackWorker.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_SERVICES_MEM_TRACK_WORKER_HPP +#define SHARE_VM_SERVICES_MEM_TRACK_WORKER_HPP + +#include "memory/allocation.hpp" +#include "runtime/thread.hpp" +#include "services/memRecorder.hpp" + +// Maximum MAX_GENERATIONS generation data can be tracked. +#define MAX_GENERATIONS 512 + + +class MemTrackWorker : public NamedThread { + private: + // circular buffer. This buffer contains recorders to be merged into global + // snaphsot. + // Each slot holds a linked list of memory recorders, that contains one + // generation of memory data. + MemRecorder* _gen[MAX_GENERATIONS]; + int _head, _tail; // head and tail pointers to above circular buffer + + bool _has_error; + + public: + MemTrackWorker(); + ~MemTrackWorker(); + _NOINLINE_ void* operator new(size_t size); + _NOINLINE_ void* operator new(size_t size, const std::nothrow_t& nothrow_constant); + + void start(); + void run(); + + inline bool has_error() const { return _has_error; } + + // task at synchronization point + void at_sync_point(MemRecorder* pending_recorders); + + // for debugging purpose, they are not thread safe. + NOT_PRODUCT(static int count_recorder(const MemRecorder* head);) + NOT_PRODUCT(int count_pending_recorders() const;) + + NOT_PRODUCT(int _sync_point_count;) + NOT_PRODUCT(int _merge_count;) + NOT_PRODUCT(int _last_gen_in_use;) + + inline int generations_in_use() const { + return (_tail >= _head ? (_tail - _head + 1) : (MAX_GENERATIONS - (_head - _tail) + 1)); + } +}; + +#endif // SHARE_VM_SERVICES_MEM_TRACK_WORKER_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memTracker.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,625 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#include "precompiled.hpp" + +#include "runtime/atomic.hpp" +#include "runtime/interfaceSupport.hpp" +#include "runtime/mutexLocker.hpp" +#include "runtime/safepoint.hpp" +#include "runtime/threadCritical.hpp" +#include "services/memPtr.hpp" +#include "services/memReporter.hpp" +#include "services/memTracker.hpp" +#include "utilities/decoder.hpp" +#include "utilities/globalDefinitions.hpp" + +bool NMT_track_callsite = false; + +// walk all 'known' threads at NMT sync point, and collect their recorders +void SyncThreadRecorderClosure::do_thread(Thread* thread) { + assert(SafepointSynchronize::is_at_safepoint(), "Safepoint required"); + if (thread->is_Java_thread()) { + JavaThread* javaThread = (JavaThread*)thread; + MemRecorder* recorder = javaThread->get_recorder(); + if (recorder != NULL) { + MemTracker::enqueue_pending_recorder(recorder); + javaThread->set_recorder(NULL); + } + } + _thread_count ++; +} + + +MemRecorder* MemTracker::_global_recorder = NULL; +MemSnapshot* MemTracker::_snapshot = NULL; +MemBaseline MemTracker::_baseline; +Mutex* MemTracker::_query_lock = NULL; +volatile MemRecorder* MemTracker::_merge_pending_queue = NULL; +volatile MemRecorder* MemTracker::_pooled_recorders = NULL; +MemTrackWorker* MemTracker::_worker_thread = NULL; +int MemTracker::_sync_point_skip_count = 0; +MemTracker::NMTLevel MemTracker::_tracking_level = MemTracker::NMT_off; +volatile MemTracker::NMTStates MemTracker::_state = NMT_uninited; +MemTracker::ShutdownReason MemTracker::_reason = NMT_shutdown_none; +int MemTracker::_thread_count = 255; +volatile jint MemTracker::_pooled_recorder_count = 0; +debug_only(intx MemTracker::_main_thread_tid = 0;) +debug_only(volatile jint MemTracker::_pending_recorder_count = 0;) + +void MemTracker::init_tracking_options(const char* option_line) { + _tracking_level = NMT_off; + if (strncmp(option_line, "=summary", 8) == 0) { + _tracking_level = NMT_summary; + } else if (strncmp(option_line, "=detail", 8) == 0) { + _tracking_level = NMT_detail; + } +} + +// first phase of bootstrapping, when VM is still in single-threaded mode. +void MemTracker::bootstrap_single_thread() { + if (_tracking_level > NMT_off) { + assert(_state == NMT_uninited, "wrong state"); + + // NMT is not supported with UseMallocOnly is on. NMT can NOT + // handle the amount of malloc data without significantly impacting + // runtime performance when this flag is on. + if (UseMallocOnly) { + shutdown(NMT_use_malloc_only); + return; + } + + _query_lock = new (std::nothrow) Mutex(Monitor::max_nonleaf, "NMT_queryLock"); + if (_query_lock == NULL) { + shutdown(NMT_out_of_memory); + return; + } + + debug_only(_main_thread_tid = os::current_thread_id();) + _state = NMT_bootstrapping_single_thread; + NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack()); + } +} + +// second phase of bootstrapping, when VM is about to or already entered multi-theaded mode. +void MemTracker::bootstrap_multi_thread() { + if (_tracking_level > NMT_off && _state == NMT_bootstrapping_single_thread) { + // create nmt lock for multi-thread execution + assert(_main_thread_tid == os::current_thread_id(), "wrong thread"); + _state = NMT_bootstrapping_multi_thread; + NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack()); + } +} + +// fully start nmt +void MemTracker::start() { + // Native memory tracking is off from command line option + if (_tracking_level == NMT_off || shutdown_in_progress()) return; + + assert(_main_thread_tid == os::current_thread_id(), "wrong thread"); + assert(_state == NMT_bootstrapping_multi_thread, "wrong state"); + + _snapshot = new (std::nothrow)MemSnapshot(); + if (_snapshot != NULL && !_snapshot->out_of_memory()) { + if (start_worker()) { + _state = NMT_started; + NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack()); + return; + } + } + + // fail to start native memory tracking, shut it down + shutdown(NMT_initialization); +} + +/** + * Shutting down native memory tracking. + * We can not shutdown native memory tracking immediately, so we just + * setup shutdown pending flag, every native memory tracking component + * should orderly shut itself down. + * + * The shutdown sequences: + * 1. MemTracker::shutdown() sets MemTracker to shutdown pending state + * 2. Worker thread calls MemTracker::final_shutdown(), which transites + * MemTracker to final shutdown state. + * 3. At sync point, MemTracker does final cleanup, before sets memory + * tracking level to off to complete shutdown. + */ +void MemTracker::shutdown(ShutdownReason reason) { + if (_tracking_level == NMT_off) return; + + if (_state <= NMT_bootstrapping_single_thread) { + // we still in single thread mode, there is not contention + _state = NMT_shutdown_pending; + _reason = reason; + } else { + // we want to know who initialized shutdown + if ((jint)NMT_started == Atomic::cmpxchg((jint)NMT_shutdown_pending, + (jint*)&_state, (jint)NMT_started)) { + _reason = reason; + } + } +} + +// final phase of shutdown +void MemTracker::final_shutdown() { + // delete all pending recorders and pooled recorders + delete_all_pending_recorders(); + delete_all_pooled_recorders(); + + { + // shared baseline and snapshot are the only objects needed to + // create query results + MutexLockerEx locker(_query_lock, true); + // cleanup baseline data and snapshot + _baseline.clear(); + delete _snapshot; + _snapshot = NULL; + } + + // shutdown shared decoder instance, since it is only + // used by native memory tracking so far. + Decoder::shutdown(); + + MemTrackWorker* worker = NULL; + { + ThreadCritical tc; + // can not delete worker inside the thread critical + if (_worker_thread != NULL && Thread::current() == _worker_thread) { + worker = _worker_thread; + _worker_thread = NULL; + } + } + if (worker != NULL) { + delete worker; + } + _state = NMT_final_shutdown; +} + +// delete all pooled recorders +void MemTracker::delete_all_pooled_recorders() { + // free all pooled recorders + volatile MemRecorder* cur_head = _pooled_recorders; + if (cur_head != NULL) { + MemRecorder* null_ptr = NULL; + while (cur_head != NULL && (void*)cur_head != Atomic::cmpxchg_ptr((void*)null_ptr, + (void*)&_pooled_recorders, (void*)cur_head)) { + cur_head = _pooled_recorders; + } + if (cur_head != NULL) { + delete cur_head; + _pooled_recorder_count = 0; + } + } +} + +// delete all recorders in pending queue +void MemTracker::delete_all_pending_recorders() { + // free all pending recorders + MemRecorder* pending_head = get_pending_recorders(); + if (pending_head != NULL) { + delete pending_head; + } +} + +/* + * retrieve per-thread recorder of specified thread. + * if thread == NULL, it means global recorder + */ +MemRecorder* MemTracker::get_thread_recorder(JavaThread* thread) { + if (shutdown_in_progress()) return NULL; + + MemRecorder* rc; + if (thread == NULL) { + rc = _global_recorder; + } else { + rc = thread->get_recorder(); + } + + if (rc != NULL && rc->is_full()) { + enqueue_pending_recorder(rc); + rc = NULL; + } + + if (rc == NULL) { + rc = get_new_or_pooled_instance(); + if (thread == NULL) { + _global_recorder = rc; + } else { + thread->set_recorder(rc); + } + } + return rc; +} + +/* + * get a per-thread recorder from pool, or create a new one if + * there is not one available. + */ +MemRecorder* MemTracker::get_new_or_pooled_instance() { + MemRecorder* cur_head = const_cast (_pooled_recorders); + if (cur_head == NULL) { + MemRecorder* rec = new (std::nothrow)MemRecorder(); + if (rec == NULL || rec->out_of_memory()) { + shutdown(NMT_out_of_memory); + if (rec != NULL) { + delete rec; + rec = NULL; + } + } + return rec; + } else { + MemRecorder* next_head = cur_head->next(); + if ((void*)cur_head != Atomic::cmpxchg_ptr((void*)next_head, (void*)&_pooled_recorders, + (void*)cur_head)) { + return get_new_or_pooled_instance(); + } + cur_head->set_next(NULL); + Atomic::dec(&_pooled_recorder_count); + debug_only(cur_head->set_generation();) + return cur_head; + } +} + +/* + * retrieve all recorders in pending queue, and empty the queue + */ +MemRecorder* MemTracker::get_pending_recorders() { + MemRecorder* cur_head = const_cast(_merge_pending_queue); + MemRecorder* null_ptr = NULL; + while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)null_ptr, (void*)&_merge_pending_queue, + (void*)cur_head)) { + cur_head = const_cast(_merge_pending_queue); + } + debug_only(Atomic::store(0, &_pending_recorder_count)); + return cur_head; +} + +/* + * release a recorder to recorder pool. + */ +void MemTracker::release_thread_recorder(MemRecorder* rec) { + assert(rec != NULL, "null recorder"); + // we don't want to pool too many recorders + rec->set_next(NULL); + if (shutdown_in_progress() || _pooled_recorder_count > _thread_count * 2) { + delete rec; + return; + } + + rec->clear(); + MemRecorder* cur_head = const_cast(_pooled_recorders); + rec->set_next(cur_head); + while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)rec, (void*)&_pooled_recorders, + (void*)cur_head)) { + cur_head = const_cast(_pooled_recorders); + rec->set_next(cur_head); + } + Atomic::inc(&_pooled_recorder_count); +} + +/* + * This is the most important method in whole nmt implementation. + * + * Create a memory record. + * 1. When nmt is in single-threaded bootstrapping mode, no lock is needed as VM + * still in single thread mode. + * 2. For all threads other than JavaThread, ThreadCritical is needed + * to write to recorders to global recorder. + * 3. For JavaThreads that are not longer visible by safepoint, also + * need to take ThreadCritical and records are written to global + * recorders, since these threads are NOT walked by Threads.do_thread(). + * 4. JavaThreads that are running in native state, have to transition + * to VM state before writing to per-thread recorders. + * 5. JavaThreads that are running in VM state do not need any lock and + * records are written to per-thread recorders. + * 6. For a thread has yet to attach VM 'Thread', they need to take + * ThreadCritical to write to global recorder. + * + * Important note: + * NO LOCK should be taken inside ThreadCritical lock !!! + */ +void MemTracker::create_memory_record(address addr, MEMFLAGS flags, + size_t size, address pc, Thread* thread) { + if (!shutdown_in_progress()) { + // single thread, we just write records direct to global recorder,' + // with any lock + if (_state == NMT_bootstrapping_single_thread) { + assert(_main_thread_tid == os::current_thread_id(), "wrong thread"); + thread = NULL; + } else { + if (thread == NULL) { + // don't use Thread::current(), since it is possible that + // the calling thread has yet to attach to VM 'Thread', + // which will result assertion failure + thread = ThreadLocalStorage::thread(); + } + } + + if (thread != NULL) { + if (thread->is_Java_thread() && ((JavaThread*)thread)->is_safepoint_visible()) { + JavaThread* java_thread = static_cast(thread); + JavaThreadState state = java_thread->thread_state(); + if (SafepointSynchronize::safepoint_safe(java_thread, state)) { + // JavaThreads that are safepoint safe, can run through safepoint, + // so ThreadCritical is needed to ensure no threads at safepoint create + // new records while the records are being gathered and the sequence number is changing + ThreadCritical tc; + create_record_in_recorder(addr, flags, size, pc, java_thread); + } else { + create_record_in_recorder(addr, flags, size, pc, java_thread); + } + } else { + // other threads, such as worker and watcher threads, etc. need to + // take ThreadCritical to write to global recorder + ThreadCritical tc; + create_record_in_recorder(addr, flags, size, pc, NULL); + } + } else { + if (_state == NMT_bootstrapping_single_thread) { + // single thread, no lock needed + create_record_in_recorder(addr, flags, size, pc, NULL); + } else { + // for thread has yet to attach VM 'Thread', we can not use VM mutex. + // use native thread critical instead + ThreadCritical tc; + create_record_in_recorder(addr, flags, size, pc, NULL); + } + } + } +} + +// write a record to proper recorder. No lock can be taken from this method +// down. +void MemTracker::create_record_in_recorder(address addr, MEMFLAGS flags, + size_t size, address pc, JavaThread* thread) { + + MemRecorder* rc = get_thread_recorder(thread); + if (rc != NULL) { + rc->record(addr, flags, size, pc); + } +} + +/** + * enqueue a recorder to pending queue + */ +void MemTracker::enqueue_pending_recorder(MemRecorder* rec) { + assert(rec != NULL, "null recorder"); + + // we are shutting down, so just delete it + if (shutdown_in_progress()) { + rec->set_next(NULL); + delete rec; + return; + } + + MemRecorder* cur_head = const_cast(_merge_pending_queue); + rec->set_next(cur_head); + while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)rec, (void*)&_merge_pending_queue, + (void*)cur_head)) { + cur_head = const_cast(_merge_pending_queue); + rec->set_next(cur_head); + } + debug_only(Atomic::inc(&_pending_recorder_count);) +} + +/* + * The method is called at global safepoint + * during it synchronization process. + * 1. enqueue all JavaThreads' per-thread recorders + * 2. enqueue global recorder + * 3. retrieve all pending recorders + * 4. reset global sequence number generator + * 5. call worker's sync + */ +#define MAX_SAFEPOINTS_TO_SKIP 128 +#define SAFE_SEQUENCE_THRESHOLD 30 +#define HIGH_GENERATION_THRESHOLD 60 + +void MemTracker::sync() { + assert(_tracking_level > NMT_off, "NMT is not enabled"); + assert(SafepointSynchronize::is_at_safepoint(), "Safepoint required"); + + // Some GC tests hit large number of safepoints in short period of time + // without meaningful activities. We should prevent going to + // sync point in these cases, which can potentially exhaust generation buffer. + // Here is the factots to determine if we should go into sync point: + // 1. not to overflow sequence number + // 2. if we are in danger to overflow generation buffer + // 3. how many safepoints we already skipped sync point + if (_state == NMT_started) { + // worker thread is not ready, no one can manage generation + // buffer, so skip this safepoint + if (_worker_thread == NULL) return; + + if (_sync_point_skip_count < MAX_SAFEPOINTS_TO_SKIP) { + int per_seq_in_use = SequenceGenerator::peek() * 100 / max_jint; + int per_gen_in_use = _worker_thread->generations_in_use() * 100 / MAX_GENERATIONS; + if (per_seq_in_use < SAFE_SEQUENCE_THRESHOLD && per_gen_in_use >= HIGH_GENERATION_THRESHOLD) { + _sync_point_skip_count ++; + return; + } + } + _sync_point_skip_count = 0; + { + // This method is running at safepoint, with ThreadCritical lock, + // it should guarantee that NMT is fully sync-ed. + ThreadCritical tc; + + // walk all JavaThreads to collect recorders + SyncThreadRecorderClosure stc; + Threads::threads_do(&stc); + + _thread_count = stc.get_thread_count(); + MemRecorder* pending_recorders = get_pending_recorders(); + + if (_global_recorder != NULL) { + _global_recorder->set_next(pending_recorders); + pending_recorders = _global_recorder; + _global_recorder = NULL; + } + SequenceGenerator::reset(); + // check _worker_thread with lock to avoid racing condition + if (_worker_thread != NULL) { + _worker_thread->at_sync_point(pending_recorders); + } + } + } + + // now, it is the time to shut whole things off + if (_state == NMT_final_shutdown) { + // walk all JavaThreads to delete all recorders + SyncThreadRecorderClosure stc; + Threads::threads_do(&stc); + // delete global recorder + { + ThreadCritical tc; + if (_global_recorder != NULL) { + delete _global_recorder; + _global_recorder = NULL; + } + } + MemRecorder* pending_recorders = get_pending_recorders(); + if (pending_recorders != NULL) { + delete pending_recorders; + } + // try at a later sync point to ensure MemRecorder instance drops to zero to + // completely shutdown NMT + if (MemRecorder::_instance_count == 0) { + _state = NMT_shutdown; + _tracking_level = NMT_off; + } + } +} + +/* + * Start worker thread. + */ +bool MemTracker::start_worker() { + assert(_worker_thread == NULL, "Just Check"); + _worker_thread = new (std::nothrow) MemTrackWorker(); + if (_worker_thread == NULL || _worker_thread->has_error()) { + shutdown(NMT_initialization); + return false; + } + _worker_thread->start(); + return true; +} + +/* + * We need to collect a JavaThread's per-thread recorder + * before it exits. + */ +void MemTracker::thread_exiting(JavaThread* thread) { + if (is_on()) { + MemRecorder* rec = thread->get_recorder(); + if (rec != NULL) { + enqueue_pending_recorder(rec); + thread->set_recorder(NULL); + } + } +} + +// baseline current memory snapshot +bool MemTracker::baseline() { + MutexLockerEx lock(_query_lock, true); + MemSnapshot* snapshot = get_snapshot(); + if (snapshot != NULL) { + return _baseline.baseline(*snapshot, false); + } + return false; +} + +// print memory usage from current snapshot +bool MemTracker::print_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) { + MemBaseline baseline; + MutexLockerEx lock(_query_lock, true); + MemSnapshot* snapshot = get_snapshot(); + if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) { + BaselineReporter reporter(out, unit); + reporter.report_baseline(baseline, summary_only); + return true; + } + return false; +} + +// compare memory usage between current snapshot and baseline +bool MemTracker::compare_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) { + MutexLockerEx lock(_query_lock, true); + if (_baseline.baselined()) { + MemBaseline baseline; + MemSnapshot* snapshot = get_snapshot(); + if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) { + BaselineReporter reporter(out, unit); + reporter.diff_baselines(baseline, _baseline, summary_only); + return true; + } + } + return false; +} + +#ifndef PRODUCT +void MemTracker::walk_stack(int toSkip, char* buf, int len) { + int cur_len = 0; + char tmp[1024]; + address pc; + + while (cur_len < len) { + pc = os::get_caller_pc(toSkip + 1); + if (pc != NULL && os::dll_address_to_function_name(pc, tmp, sizeof(tmp), NULL)) { + jio_snprintf(&buf[cur_len], (len - cur_len), "%s\n", tmp); + cur_len = (int)strlen(buf); + } else { + buf[cur_len] = '\0'; + break; + } + toSkip ++; + } +} + +void MemTracker::print_tracker_stats(outputStream* st) { + st->print_cr("\nMemory Tracker Stats:"); + st->print_cr("\tMax sequence number = %d", SequenceGenerator::max_seq_num()); + st->print_cr("\tthead count = %d", _thread_count); + st->print_cr("\tArena instance = %d", Arena::_instance_count); + st->print_cr("\tpooled recorder count = %d", _pooled_recorder_count); + st->print_cr("\tqueued recorder count = %d", _pending_recorder_count); + st->print_cr("\tmemory recorder instance count = %d", MemRecorder::_instance_count); + if (_worker_thread != NULL) { + st->print_cr("\tWorker thread:"); + st->print_cr("\t\tSync point count = %d", _worker_thread->_sync_point_count); + st->print_cr("\t\tpending recorder count = %d", _worker_thread->count_pending_recorders()); + st->print_cr("\t\tmerge count = %d", _worker_thread->_merge_count); + } else { + st->print_cr("\tWorker thread is not started"); + } + st->print_cr(" "); + + if (_snapshot != NULL) { + _snapshot->print_snapshot_stats(st); + } else { + st->print_cr("No snapshot"); + } +} +#endif + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memTracker.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/memTracker.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,386 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_SERVICES_MEM_TRACKER_HPP +#define SHARE_VM_SERVICES_MEM_TRACKER_HPP + +#include "memory/allocation.hpp" +#include "runtime/globals.hpp" +#include "runtime/mutex.hpp" +#include "runtime/os.hpp" +#include "runtime/thread.hpp" +#include "services/memPtr.hpp" +#include "services/memRecorder.hpp" +#include "services/memSnapshot.hpp" +#include "services/memTrackWorker.hpp" + +#ifdef SOLARIS +#include "thread_solaris.inline.hpp" +#endif + +#ifdef _DEBUG_ + #define DEBUG_CALLER_PC os::get_caller_pc(3) +#else + #define DEBUG_CALLER_PC 0 +#endif + +// The thread closure walks threads to collect per-thread +// memory recorders at NMT sync point +class SyncThreadRecorderClosure : public ThreadClosure { + private: + int _thread_count; + + public: + SyncThreadRecorderClosure() { + _thread_count =0; + } + + void do_thread(Thread* thread); + int get_thread_count() const { + return _thread_count; + } +}; + +class BaselineOutputer; +class MemSnapshot; +class MemTrackWorker; +class Thread; +/* + * MemTracker is the 'gate' class to native memory tracking runtime. + */ +class MemTracker : AllStatic { + friend class MemTrackWorker; + friend class MemSnapshot; + friend class SyncThreadRecorderClosure; + + // NMT state + enum NMTStates { + NMT_uninited, // not yet initialized + NMT_bootstrapping_single_thread, // bootstrapping, VM is in single thread mode + NMT_bootstrapping_multi_thread, // bootstrapping, VM is about to enter multi-thread mode + NMT_started, // NMT fully started + NMT_shutdown_pending, // shutdown pending + NMT_final_shutdown, // in final phase of shutdown + NMT_shutdown // shutdown + }; + + + // native memory tracking level + enum NMTLevel { + NMT_off, // native memory tracking is off + NMT_summary, // don't track callsite + NMT_detail // track callsite also + }; + + public: + enum ShutdownReason { + NMT_shutdown_none, // no shutdown requested + NMT_shutdown_user, // user requested shutdown + NMT_normal, // normal shutdown, process exit + NMT_out_of_memory, // shutdown due to out of memory + NMT_initialization, // shutdown due to initialization failure + NMT_use_malloc_only, // can not combine NMT with UseMallocOnly flag + NMT_error_reporting, // shutdown by vmError::report_and_die() + NMT_out_of_generation, // running out of generation queue + NMT_sequence_overflow // overflow the sequence number + }; + + public: + // initialize NMT tracking level from command line options, called + // from VM command line parsing code + static void init_tracking_options(const char* option_line); + + // if NMT is enabled to record memory activities + static inline bool is_on() { + return (_tracking_level >= NMT_summary && + _state >= NMT_bootstrapping_single_thread); + } + + // user readable reason for shutting down NMT + static const char* reason() { + switch(_reason) { + case NMT_shutdown_none: + return "Native memory tracking is not enabled"; + case NMT_shutdown_user: + return "Native memory tracking has been shutdown by user"; + case NMT_normal: + return "Native memory tracking has been shutdown due to process exiting"; + case NMT_out_of_memory: + return "Native memory tracking has been shutdown due to out of native memory"; + case NMT_initialization: + return "Native memory tracking failed to initialize"; + case NMT_error_reporting: + return "Native memory tracking has been shutdown due to error reporting"; + case NMT_out_of_generation: + return "Native memory tracking has been shutdown due to running out of generation buffer"; + case NMT_sequence_overflow: + return "Native memory tracking has been shutdown due to overflow the sequence number"; + case NMT_use_malloc_only: + return "Native memory tracking is not supported when UseMallocOnly is on"; + default: + ShouldNotReachHere(); + return NULL; + } + } + + // test if we can walk native stack + static bool can_walk_stack() { + // native stack is not walkable during bootstrapping on sparc +#if defined(SPARC) + return (_state == NMT_started); +#else + return (_state >= NMT_bootstrapping_single_thread && _state <= NMT_started); +#endif + } + + // if native memory tracking tracks callsite + static inline bool track_callsite() { return _tracking_level == NMT_detail; } + + // shutdown native memory tracking capability. Native memory tracking + // can be shutdown by VM when it encounters low memory scenarios. + // Memory tracker should gracefully shutdown itself, and preserve the + // latest memory statistics for post morten diagnosis. + static void shutdown(ShutdownReason reason); + + // if there is shutdown requested + static inline bool shutdown_in_progress() { + return (_state >= NMT_shutdown_pending); + } + + // bootstrap native memory tracking, so it can start to collect raw data + // before worker thread can start + + // the first phase of bootstrapping, when VM still in single-threaded mode + static void bootstrap_single_thread(); + // the second phase of bootstrapping, VM is about or already in multi-threaded mode + static void bootstrap_multi_thread(); + + + // start() has to be called when VM still in single thread mode, but after + // command line option parsing is done. + static void start(); + + // record a 'malloc' call + static inline void record_malloc(address addr, size_t size, MEMFLAGS flags, + address pc = 0, Thread* thread = NULL) { + assert(is_on(), "check by caller"); + if (NMT_CAN_TRACK(flags)) { + create_memory_record(addr, (flags|MemPointerRecord::malloc_tag()), size, pc, thread); + } + } + // record a 'free' call + static inline void record_free(address addr, MEMFLAGS flags, Thread* thread = NULL) { + if (is_on() && NMT_CAN_TRACK(flags)) { + create_memory_record(addr, MemPointerRecord::free_tag(), 0, 0, thread); + } + } + // record a 'realloc' call + static inline void record_realloc(address old_addr, address new_addr, size_t size, + MEMFLAGS flags, address pc = 0, Thread* thread = NULL) { + if (is_on()) { + record_free(old_addr, flags, thread); + record_malloc(new_addr, size, flags, pc, thread); + } + } + + // record arena size + static inline void record_arena_size(address addr, size_t size) { + // we add a positive offset to arena address, so we can have arena size record + // sorted after arena record + if (is_on() && !UseMallocOnly) { + create_memory_record((addr + sizeof(void*)), MemPointerRecord::arena_size_tag(), size, + 0, NULL); + } + } + + // record a virtual memory 'reserve' call + static inline void record_virtual_memory_reserve(address addr, size_t size, + address pc = 0, Thread* thread = NULL) { + if (is_on()) { + assert(size > 0, "reserve szero size"); + create_memory_record(addr, MemPointerRecord::virtual_memory_reserve_tag(), + size, pc, thread); + } + } + + // record a virtual memory 'commit' call + static inline void record_virtual_memory_commit(address addr, size_t size, + address pc = 0, Thread* thread = NULL) { + if (is_on()) { + create_memory_record(addr, MemPointerRecord::virtual_memory_commit_tag(), + size, pc, thread); + } + } + + // record a virtual memory 'uncommit' call + static inline void record_virtual_memory_uncommit(address addr, size_t size, + Thread* thread = NULL) { + if (is_on()) { + create_memory_record(addr, MemPointerRecord::virtual_memory_uncommit_tag(), + size, 0, thread); + } + } + + // record a virtual memory 'release' call + static inline void record_virtual_memory_release(address addr, size_t size, + Thread* thread = NULL) { + if (is_on()) { + create_memory_record(addr, MemPointerRecord::virtual_memory_release_tag(), + size, 0, thread); + } + } + + // record memory type on virtual memory base address + static inline void record_virtual_memory_type(address base, MEMFLAGS flags, + Thread* thread = NULL) { + if (is_on()) { + assert(base > 0, "wrong base address"); + assert((flags & (~mt_masks)) == 0, "memory type only"); + create_memory_record(base, (flags | MemPointerRecord::virtual_memory_type_tag()), + 0, 0, thread); + } + } + + + // create memory baseline of current memory snapshot + static bool baseline(); + // is there a memory baseline + static bool has_baseline() { + return _baseline.baselined(); + } + + // print memory usage from current snapshot + static bool print_memory_usage(BaselineOutputer& out, size_t unit, + bool summary_only = true); + // compare memory usage between current snapshot and baseline + static bool compare_memory_usage(BaselineOutputer& out, size_t unit, + bool summary_only = true); + + // sync is called within global safepoint to synchronize nmt data + static void sync(); + + // called when a thread is about to exit + static void thread_exiting(JavaThread* thread); + + // retrieve global snapshot + static MemSnapshot* get_snapshot() { + assert(is_on(), "native memory tracking is off"); + if (shutdown_in_progress()) { + return NULL; + } + return _snapshot; + } + + // print tracker stats + NOT_PRODUCT(static void print_tracker_stats(outputStream* st);) + NOT_PRODUCT(static void walk_stack(int toSkip, char* buf, int len);) + + private: + // start native memory tracking worker thread + static bool start_worker(); + + // called by worker thread to complete shutdown process + static void final_shutdown(); + + protected: + // retrieve per-thread recorder of the specified thread. + // if the recorder is full, it will be enqueued to overflow + // queue, a new recorder is acquired from recorder pool or a + // new instance is created. + // when thread == NULL, it means global recorder + static MemRecorder* get_thread_recorder(JavaThread* thread); + + // per-thread recorder pool + static void release_thread_recorder(MemRecorder* rec); + static void delete_all_pooled_recorders(); + + // pending recorder queue. Recorders are queued to pending queue + // when they are overflowed or collected at nmt sync point. + static void enqueue_pending_recorder(MemRecorder* rec); + static MemRecorder* get_pending_recorders(); + static void delete_all_pending_recorders(); + + private: + // retrieve a pooled memory record or create new one if there is not + // one available + static MemRecorder* get_new_or_pooled_instance(); + static void create_memory_record(address addr, MEMFLAGS type, + size_t size, address pc, Thread* thread); + static void create_record_in_recorder(address addr, MEMFLAGS type, + size_t size, address pc, JavaThread* thread); + + private: + // global memory snapshot + static MemSnapshot* _snapshot; + + // a memory baseline of snapshot + static MemBaseline _baseline; + + // query lock + static Mutex* _query_lock; + + // a thread can start to allocate memory before it is attached + // to VM 'Thread', those memory activities are recorded here. + // ThreadCritical is required to guard this global recorder. + static MemRecorder* _global_recorder; + + // main thread id + debug_only(static intx _main_thread_tid;) + + // pending recorders to be merged + static volatile MemRecorder* _merge_pending_queue; + + NOT_PRODUCT(static volatile jint _pending_recorder_count;) + + // pooled memory recorders + static volatile MemRecorder* _pooled_recorders; + + // memory recorder pool management, uses following + // counter to determine if a released memory recorder + // should be pooled + + // latest thread count + static int _thread_count; + // pooled recorder count + static volatile jint _pooled_recorder_count; + + + // worker thread to merge pending recorders into snapshot + static MemTrackWorker* _worker_thread; + + // how many safepoints we skipped without entering sync point + static int _sync_point_skip_count; + + // if the tracker is properly intialized + static bool _is_tracker_ready; + // tracking level (off, summary and detail) + static enum NMTLevel _tracking_level; + + // current nmt state + static volatile enum NMTStates _state; + // the reason for shutting down nmt + static enum ShutdownReason _reason; +}; + +#endif // SHARE_VM_SERVICES_MEM_TRACKER_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memoryManager.cpp --- a/src/share/vm/services/memoryManager.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/memoryManager.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -166,15 +166,15 @@ GCStatInfo::GCStatInfo(int num_pools) { // initialize the arrays for memory usage - _before_gc_usage_array = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools); - _after_gc_usage_array = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools); + _before_gc_usage_array = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools, mtInternal); + _after_gc_usage_array = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools, mtInternal); _usage_array_size = num_pools; clear(); } GCStatInfo::~GCStatInfo() { - FREE_C_HEAP_ARRAY(MemoryUsage*, _before_gc_usage_array); - FREE_C_HEAP_ARRAY(MemoryUsage*, _after_gc_usage_array); + FREE_C_HEAP_ARRAY(MemoryUsage*, _before_gc_usage_array, mtInternal); + FREE_C_HEAP_ARRAY(MemoryUsage*, _after_gc_usage_array, mtInternal); } void GCStatInfo::set_gc_usage(int pool_index, MemoryUsage usage, bool before_gc) { @@ -214,8 +214,8 @@ void GCMemoryManager::initialize_gc_stat_info() { assert(MemoryService::num_memory_pools() > 0, "should have one or more memory pools"); - _last_gc_stat = new(ResourceObj::C_HEAP) GCStatInfo(MemoryService::num_memory_pools()); - _current_gc_stat = new(ResourceObj::C_HEAP) GCStatInfo(MemoryService::num_memory_pools()); + _last_gc_stat = new(ResourceObj::C_HEAP, mtGC) GCStatInfo(MemoryService::num_memory_pools()); + _current_gc_stat = new(ResourceObj::C_HEAP, mtGC) GCStatInfo(MemoryService::num_memory_pools()); // tracking concurrent collections we need two objects: one to update, and one to // hold the publicly available "last (completed) gc" information. } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memoryManager.hpp --- a/src/share/vm/services/memoryManager.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/memoryManager.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,7 +40,7 @@ class GCMemoryManager; class OopClosure; -class MemoryManager : public CHeapObj { +class MemoryManager : public CHeapObj { private: enum { max_num_pools = 10 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memoryPool.hpp --- a/src/share/vm/services/memoryPool.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/memoryPool.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -50,7 +50,7 @@ class PermGen; class ThresholdSupport; -class MemoryPool : public CHeapObj { +class MemoryPool : public CHeapObj { friend class MemoryManager; public: enum PoolType { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/memoryService.cpp --- a/src/share/vm/services/memoryService.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/memoryService.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -58,9 +58,9 @@ #endif GrowableArray* MemoryService::_pools_list = - new (ResourceObj::C_HEAP) GrowableArray(init_pools_list_size, true); + new (ResourceObj::C_HEAP, mtInternal) GrowableArray(init_pools_list_size, true); GrowableArray* MemoryService::_managers_list = - new (ResourceObj::C_HEAP) GrowableArray(init_managers_list_size, true); + new (ResourceObj::C_HEAP, mtInternal) GrowableArray(init_managers_list_size, true); GCMemoryManager* MemoryService::_minor_gc_manager = NULL; GCMemoryManager* MemoryService::_major_gc_manager = NULL; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/nmtDCmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/nmtDCmd.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#include "precompiled.hpp" +#include "services/nmtDCmd.hpp" +#include "services/memReporter.hpp" +#include "services/memTracker.hpp" +#include "utilities/globalDefinitions.hpp" + +NMTDCmd::NMTDCmd(outputStream* output, + bool heap): DCmdWithParser(output, heap), + _summary("summary", "request runtime to report current memory summary, " \ + "which includes total reserved and committed memory, along " \ + "with memory usage summary by each subsytem.", + "BOOLEAN", false, "false"), + _detail("detail", "request runtime to report memory allocation >= " + "1K by each callsite.", + "BOOLEAN", false, "false"), + _baseline("baseline", "request runtime to baseline current memory usage, " \ + "so it can be compared against in later time.", + "BOOLEAN", false, "false"), + _summary_diff("summary.diff", "request runtime to report memory summary " \ + "comparison against previous baseline.", + "BOOLEAN", false, "false"), + _detail_diff("detail.diff", "request runtime to report memory detail " \ + "comparison against previous baseline, which shows the memory " \ + "allocation activities at different callsites.", + "BOOLEAN", false, "false"), + _shutdown("shutdown", "request runtime to shutdown itself and free the " \ + "memory used by runtime.", + "BOOLEAN", false, "false"), +#ifndef PRODUCT + _debug("debug", "print tracker statistics. Debug only, not thread safe", \ + "BOOLEAN", false, "false"), +#endif + _scale("scale", "Memory usage in which scale, KB, MB or GB", + "STRING", false, "KB") { + _dcmdparser.add_dcmd_option(&_summary); + _dcmdparser.add_dcmd_option(&_detail); + _dcmdparser.add_dcmd_option(&_baseline); + _dcmdparser.add_dcmd_option(&_summary_diff); + _dcmdparser.add_dcmd_option(&_detail_diff); + _dcmdparser.add_dcmd_option(&_shutdown); +#ifndef PRODUCT + _dcmdparser.add_dcmd_option(&_debug); +#endif + _dcmdparser.add_dcmd_option(&_scale); +} + +void NMTDCmd::execute(TRAPS) { + const char* scale_value = _scale.value(); + size_t scale_unit; + if (strcmp(scale_value, "KB") == 0 || strcmp(scale_value, "kb") == 0) { + scale_unit = K; + } else if (strcmp(scale_value, "MB") == 0 || + strcmp(scale_value, "mb") == 0) { + scale_unit = M; + } else if (strcmp(scale_value, "GB") == 0 || + strcmp(scale_value, "gb") == 0) { + scale_unit = G; + } else { + output()->print_cr("Incorrect scale value: %s", scale_value); + return; + } + + int nopt = 0; + if(_summary.is_set()) { ++nopt; } + if(_detail.is_set()) { ++nopt; } + if(_baseline.is_set()) { ++nopt; } + if(_summary_diff.is_set()) { ++nopt; } + if(_detail_diff.is_set()) { ++nopt; } + if(_shutdown.is_set()) { ++nopt; } +#ifndef PRODUCT + if(_debug.is_set()) { ++nopt; } +#endif + + if(nopt > 1) { + output()->print_cr("At most one of the following option can be specified: " \ + "summary, detail, baseline, summary.diff, detail.diff, shutdown" +#ifndef PRODUCT + " ,debug" +#endif + ); + return; + } + + if(nopt == 0) { + _summary.set_value(true); + } + +#ifndef PRODUCT + if (_debug.value()) { + output()->print_cr("debug command is NOT thread-safe, may cause crash"); + MemTracker::print_tracker_stats(output()); + return; + } +#endif + + // native memory tracking has to be on + if (!MemTracker::is_on() || MemTracker::shutdown_in_progress()) { + // if it is not on, what's the reason? + output()->print_cr(MemTracker::reason()); + return; + } + + if (_summary.value()) { + BaselineTTYOutputer outputer(output()); + MemTracker::print_memory_usage(outputer, scale_unit, true); + } else if (_detail.value()) { + BaselineTTYOutputer outputer(output()); + MemTracker::print_memory_usage(outputer, scale_unit, false); + } else if (_baseline.value()) { + if (MemTracker::baseline()) { + output()->print_cr("Successfully baselined."); + } else { + output()->print_cr("Baseline failed."); + } + } else if (_summary_diff.value()) { + if (MemTracker::has_baseline()) { + BaselineTTYOutputer outputer(output()); + MemTracker::compare_memory_usage(outputer, scale_unit, true); + } else { + output()->print_cr("No baseline to compare, run 'baseline' command first"); + } + } else if (_detail_diff.value()) { + if (MemTracker::has_baseline()) { + BaselineTTYOutputer outputer(output()); + MemTracker::compare_memory_usage(outputer, scale_unit, false); + } else { + output()->print_cr("No baseline to compare to, run 'baseline' command first"); + } + } else if (_shutdown.value()) { + MemTracker::shutdown(MemTracker::NMT_shutdown_user); + output()->print_cr("Shutdown is in progress, it will take a few moments to " \ + "completely shutdown"); + } else { + ShouldNotReachHere(); + output()->print_cr("Unknown command"); + } +} + +int NMTDCmd::num_arguments() { + ResourceMark rm; + NMTDCmd* dcmd = new NMTDCmd(NULL, false); + if (dcmd != NULL) { + DCmdMark mark(dcmd); + return dcmd->_dcmdparser.num_arguments(); + } else { + return 0; + } +} + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/nmtDCmd.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/services/nmtDCmd.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_SERVICES_NMT_DCMD_HPP +#define SHARE_VM_SERVICES_NMT_DCMD_HPP + +#include "services/diagnosticArgument.hpp" +#include "services/diagnosticFramework.hpp" + +/** + * Native memory tracking DCmd implementation + */ +class NMTDCmd: public DCmdWithParser { + protected: + DCmdArgument _summary; + DCmdArgument _detail; + DCmdArgument _baseline; + DCmdArgument _summary_diff; + DCmdArgument _detail_diff; + DCmdArgument _shutdown; +#ifndef PRODUCT + DCmdArgument _debug; +#endif + DCmdArgument _scale; + + public: + NMTDCmd(outputStream* output, bool heap); + static const char* name() { return "VM.native_memory"; } + static const char* description() { + return "Print native memory usage"; + } + static const char* impact() { + return "Medium:"; + } + static int num_arguments(); + virtual void execute(TRAPS); +}; + +#endif // SHARE_VM_SERVICES_NMT_DCMD_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/threadService.cpp --- a/src/share/vm/services/threadService.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/threadService.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -437,7 +437,7 @@ GrowableArray* list = jvf->locked_monitors(); int length = list->length(); if (length > 0) { - _locked_monitors = new (ResourceObj::C_HEAP) GrowableArray(length, true); + _locked_monitors = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(length, true); for (int i = 0; i < length; i++) { MonitorInfo* monitor = list->at(i); assert(monitor->owner(), "This monitor must have an owning object"); @@ -491,11 +491,11 @@ ThreadStackTrace::ThreadStackTrace(JavaThread* t, bool with_locked_monitors) { _thread = t; - _frames = new (ResourceObj::C_HEAP) GrowableArray(INITIAL_ARRAY_SIZE, true); + _frames = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(INITIAL_ARRAY_SIZE, true); _depth = 0; _with_locked_monitors = with_locked_monitors; if (_with_locked_monitors) { - _jni_locked_monitors = new (ResourceObj::C_HEAP) GrowableArray(INITIAL_ARRAY_SIZE, true); + _jni_locked_monitors = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(INITIAL_ARRAY_SIZE, true); } else { _jni_locked_monitors = NULL; } @@ -689,7 +689,7 @@ ThreadConcurrentLocks::ThreadConcurrentLocks(JavaThread* thread) { _thread = thread; - _owned_locks = new (ResourceObj::C_HEAP) GrowableArray(INITIAL_ARRAY_SIZE, true); + _owned_locks = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(INITIAL_ARRAY_SIZE, true); _next = NULL; } @@ -803,7 +803,7 @@ DeadlockCycle::DeadlockCycle() { _is_deadlock = false; - _threads = new (ResourceObj::C_HEAP) GrowableArray(INITIAL_ARRAY_SIZE, true); + _threads = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(INITIAL_ARRAY_SIZE, true); _next = NULL; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/services/threadService.hpp --- a/src/share/vm/services/threadService.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/services/threadService.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -116,7 +116,7 @@ }; // Per-thread Statistics for synchronization -class ThreadStatistics : public CHeapObj { +class ThreadStatistics : public CHeapObj { private: // The following contention statistics are only updated by // the thread owning these statistics when contention occurs. @@ -186,7 +186,7 @@ }; // Thread snapshot to represent the thread state and statistics -class ThreadSnapshot : public CHeapObj { +class ThreadSnapshot : public CHeapObj { private: JavaThread* _thread; oop _threadObj; @@ -244,7 +244,7 @@ void oops_do(OopClosure* f); }; -class ThreadStackTrace : public CHeapObj { +class ThreadStackTrace : public CHeapObj { private: JavaThread* _thread; int _depth; // number of stack frames added @@ -275,7 +275,7 @@ // StackFrameInfo for keeping methodOop and bci during // stack walking for later construction of StackTraceElement[] // Java instances -class StackFrameInfo : public CHeapObj { +class StackFrameInfo : public CHeapObj { private: methodOop _method; int _bci; @@ -299,7 +299,7 @@ void print_on(outputStream* st) const; }; -class ThreadConcurrentLocks : public CHeapObj { +class ThreadConcurrentLocks : public CHeapObj { private: GrowableArray* _owned_locks; ThreadConcurrentLocks* _next; @@ -356,7 +356,7 @@ void oops_do(OopClosure* f); }; -class DeadlockCycle : public CHeapObj { +class DeadlockCycle : public CHeapObj { private: bool _is_deadlock; GrowableArray* _threads; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/accessFlags.hpp --- a/src/share/vm/utilities/accessFlags.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/accessFlags.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -80,10 +80,12 @@ JVM_ACC_FIELD_ACCESS_WATCHED = 0x00002000, // field access is watched by JVMTI JVM_ACC_FIELD_MODIFICATION_WATCHED = 0x00008000, // field modification is watched by JVMTI JVM_ACC_FIELD_INTERNAL = 0x00000400, // internal field, same as JVM_ACC_ABSTRACT + JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE = 0x00000800, // field has generic signature JVM_ACC_FIELD_INTERNAL_FLAGS = JVM_ACC_FIELD_ACCESS_WATCHED | JVM_ACC_FIELD_MODIFICATION_WATCHED | - JVM_ACC_FIELD_INTERNAL, + JVM_ACC_FIELD_INTERNAL | + JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE, // flags accepted by set_field_flags() JVM_ACC_FIELD_FLAGS = JVM_RECOGNIZED_FIELD_MODIFIERS | JVM_ACC_FIELD_INTERNAL_FLAGS @@ -156,6 +158,8 @@ bool is_field_modification_watched() const { return (_flags & JVM_ACC_FIELD_MODIFICATION_WATCHED) != 0; } bool is_internal() const { return (_flags & JVM_ACC_FIELD_INTERNAL) != 0; } + bool field_has_generic_signature() const + { return (_flags & JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE) != 0; } // get .class file flags jint get_flags () const { return (_flags & JVM_ACC_WRITTEN_FLAGS); } @@ -225,6 +229,10 @@ atomic_clear_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED); } } + void set_field_has_generic_signature() + { + atomic_set_bits(JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE); + } // Conversion jshort as_short() const { return (jshort)_flags; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/array.cpp --- a/src/share/vm/utilities/array.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/array.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -49,7 +49,7 @@ void ResourceArray::sort(size_t esize, ftype f) { if (!is_empty()) qsort(_data, length(), esize, f); } -void CHeapArray::sort(size_t esize, ftype f) { +template void CHeapArray::sort(size_t esize, ftype f) { if (!is_empty()) qsort(_data, length(), esize, f); } @@ -70,14 +70,14 @@ } -void CHeapArray::expand(size_t esize, int i, int& size) { +template void CHeapArray::expand(size_t esize, int i, int& size) { // determine new size if (size == 0) size = 4; // prevent endless loop while (i >= size) size *= 2; // allocate and initialize new data section - void* data = NEW_C_HEAP_ARRAY(char*, esize * size); + void* data = NEW_C_HEAP_ARRAY(char*, esize * size, F); memcpy(data, _data, esize * length()); - FREE_C_HEAP_ARRAY(char*, _data); + FREE_C_HEAP_ARRAY(char*, _data, F); _data = data; } @@ -91,7 +91,7 @@ memmove(dst, src, cnt); } -void CHeapArray::remove_at(size_t esize, int i) { +template void CHeapArray::remove_at(size_t esize, int i) { assert(0 <= i && i < length(), "index out of bounds"); _length--; void* dst = (char*)_data + i*esize; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/array.hpp --- a/src/share/vm/utilities/array.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/array.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -79,7 +79,7 @@ }; -class CHeapArray: public CHeapObj { +template class CHeapArray: public CHeapObj { protected: int _length; // the number of array elements void* _data; // the array memory @@ -94,7 +94,7 @@ CHeapArray(size_t esize, int length) { assert(length >= 0, "illegal length"); _length = length; - _data = (void*) NEW_C_HEAP_ARRAY(char *, esize * length); + _data = (void*) NEW_C_HEAP_ARRAY(char *, esize * length, F); } #ifdef ASSERT diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/bitMap.cpp --- a/src/share/vm/utilities/bitMap.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/bitMap.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -65,8 +65,8 @@ if (in_resource_area) { _map = NEW_RESOURCE_ARRAY(bm_word_t, new_size_in_words); } else { - if (old_map != NULL) FREE_C_HEAP_ARRAY(bm_word_t, _map); - _map = NEW_C_HEAP_ARRAY(bm_word_t, new_size_in_words); + if (old_map != NULL) FREE_C_HEAP_ARRAY(bm_word_t, _map, mtInternal); + _map = NEW_C_HEAP_ARRAY(bm_word_t, new_size_in_words, mtInternal); } Copy::disjoint_words((HeapWord*)old_map, (HeapWord*) _map, MIN2(old_size_in_words, new_size_in_words)); @@ -469,7 +469,7 @@ void BitMap::init_pop_count_table() { if (_pop_count_table == NULL) { - BitMap::idx_t *table = NEW_C_HEAP_ARRAY(idx_t, 256); + BitMap::idx_t *table = NEW_C_HEAP_ARRAY(idx_t, 256, mtInternal); for (uint i = 0; i < 256; i++) { table[i] = num_set_bits(i); } @@ -479,7 +479,7 @@ (intptr_t) NULL_WORD); if (res != NULL_WORD) { guarantee( _pop_count_table == (void*) res, "invariant" ); - FREE_C_HEAP_ARRAY(bm_word_t, table); + FREE_C_HEAP_ARRAY(bm_word_t, table, mtInternal); } } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/decoder.hpp --- a/src/share/vm/utilities/decoder.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/decoder.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -29,7 +29,7 @@ #include "memory/allocation.hpp" #include "runtime/mutex.hpp" -class AbstractDecoder : public CHeapObj { +class AbstractDecoder : public CHeapObj { public: // status code for decoding native C frame enum decoder_status { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/elfFile.cpp --- a/src/share/vm/utilities/elfFile.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/elfFile.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -47,7 +47,7 @@ m_status = NullDecoder::no_error; int len = strlen(filepath) + 1; - m_filepath = (const char*)os::malloc(len * sizeof(char)); + m_filepath = (const char*)os::malloc(len * sizeof(char), mtInternal); if (m_filepath != NULL) { strcpy((char*)m_filepath, filepath); m_file = fopen(filepath, "r"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/elfFile.hpp --- a/src/share/vm/utilities/elfFile.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/elfFile.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -82,7 +82,7 @@ // in "error" state, so there are scenarios, lookup will fail. We want this // part of code to be very defensive, and bait out if anything went wrong. -class ElfFile: public CHeapObj { +class ElfFile: public CHeapObj { friend class ElfDecoder; public: ElfFile(const char* filepath); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/elfStringTable.cpp --- a/src/share/vm/utilities/elfStringTable.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/elfStringTable.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -42,7 +42,7 @@ // try to load the string table long cur_offset = ftell(file); - m_table = (char*)os::malloc(sizeof(char) * shdr.sh_size); + m_table = (char*)os::malloc(sizeof(char) * shdr.sh_size, mtInternal); if (m_table != NULL) { // if there is an error, mark the error if (fseek(file, shdr.sh_offset, SEEK_SET) || diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/elfStringTable.hpp --- a/src/share/vm/utilities/elfStringTable.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/elfStringTable.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -35,7 +35,7 @@ // The string table represents a string table section in an elf file. // Whenever there is enough memory, it will load whole string table as // one blob. Otherwise, it will load string from file when requested. -class ElfStringTable: CHeapObj { +class ElfStringTable: CHeapObj { friend class ElfFile; public: ElfStringTable(FILE* file, Elf_Shdr shdr, int index); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/elfSymbolTable.cpp --- a/src/share/vm/utilities/elfSymbolTable.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/elfSymbolTable.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,7 +40,7 @@ long cur_offset = ftell(file); if (cur_offset != -1) { // call malloc so we can back up if memory allocation fails. - m_symbols = (Elf_Sym*)os::malloc(shdr.sh_size); + m_symbols = (Elf_Sym*)os::malloc(shdr.sh_size, mtInternal); if (m_symbols) { if (fseek(file, shdr.sh_offset, SEEK_SET) || fread((void*)m_symbols, shdr.sh_size, 1, file) != 1 || diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/elfSymbolTable.hpp --- a/src/share/vm/utilities/elfSymbolTable.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/elfSymbolTable.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -38,7 +38,7 @@ * of the elf file into memory. Otherwise, it will walk the section in file * to look up the symbol that nearest the given address. */ -class ElfSymbolTable: public CHeapObj { +class ElfSymbolTable: public CHeapObj { friend class ElfFile; public: ElfSymbolTable(FILE* file, Elf_Shdr shdr); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/events.hpp --- a/src/share/vm/utilities/events.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/events.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -46,7 +46,7 @@ // crash time. This is a very generic interface that is mainly here // for completeness. Normally the templated EventLogBase would be // subclassed to provide different log types. -class EventLog : public CHeapObj { +class EventLog : public CHeapObj { friend class Events; private: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/exceptions.hpp --- a/src/share/vm/utilities/exceptions.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/exceptions.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -57,7 +57,7 @@ // field of the Thread class w/o having access to the Thread's interface (for // include hierachy reasons). -class ThreadShadow: public CHeapObj { +class ThreadShadow: public CHeapObj { friend class VMStructs; protected: diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/globalDefinitions.hpp --- a/src/share/vm/utilities/globalDefinitions.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/globalDefinitions.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -161,10 +161,6 @@ const size_t G = M*K; const size_t HWperKB = K / sizeof(HeapWord); -const size_t LOG_K = 10; -const size_t LOG_M = 2 * LOG_K; -const size_t LOG_G = 2 * LOG_M; - const jint min_jint = (jint)1 << (sizeof(jint)*BitsPerByte-1); // 0x80000000 == smallest jint const jint max_jint = (juint)min_jint - 1; // 0x7FFFFFFF == largest jint @@ -179,6 +175,11 @@ const jint NANOSECS_PER_MILLISEC = 1000000; inline const char* proper_unit_for_byte_size(size_t s) { +#ifdef _LP64 + if (s >= 10*G) { + return "G"; + } +#endif if (s >= 10*M) { return "M"; } else if (s >= 10*K) { @@ -188,17 +189,22 @@ } } -inline size_t byte_size_in_proper_unit(size_t s) { +template +inline T byte_size_in_proper_unit(T s) { +#ifdef _LP64 + if (s >= 10*G) { + return (T)(s/G); + } +#endif if (s >= 10*M) { - return s/M; + return (T)(s/M); } else if (s >= 10*K) { - return s/K; + return (T)(s/K); } else { return s; } } - //---------------------------------------------------------------------------------------------------- // VM type definitions diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/globalDefinitions_visCPP.hpp --- a/src/share/vm/utilities/globalDefinitions_visCPP.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/globalDefinitions_visCPP.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -220,9 +220,15 @@ #define PRIu64 "I64u" #define PRIx64 "I64x" +#ifdef _LP64 +#define PRIdPTR "I64d" +#define PRIuPTR "I64u" +#define PRIxPTR "I64x" +#else #define PRIdPTR "d" #define PRIuPTR "u" #define PRIxPTR "x" +#endif #define offset_of(klass,field) offsetof(klass,field) diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/growableArray.cpp --- a/src/share/vm/utilities/growableArray.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/growableArray.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -61,7 +61,7 @@ if (on_stack()) { return (void*)resource_allocate_bytes(byte_size); } else if (on_C_heap()) { - return (void*)AllocateHeap(byte_size, "GrET in " __FILE__); + return (void*)AllocateHeap(byte_size, _memflags); } else { return _arena->Amalloc(byte_size); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/growableArray.hpp --- a/src/share/vm/utilities/growableArray.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/growableArray.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -86,6 +86,9 @@ // 0 means default ResourceArea // 1 means on C heap // otherwise, allocate in _arena + + MEMFLAGS _memflags; // memory type if allocation in C heap + #ifdef ASSERT int _nesting; // resource area nesting at creation void set_nesting(); @@ -102,9 +105,14 @@ // This GA will use the resource stack for storage if c_heap==false, // Else it will use the C heap. Use clear_and_deallocate to avoid leaks. - GenericGrowableArray(int initial_size, int initial_len, bool c_heap) { + GenericGrowableArray(int initial_size, int initial_len, bool c_heap, MEMFLAGS flags = mtNone) { _len = initial_len; _max = initial_size; + _memflags = flags; + + // memory type has to be specified for C heap allocation + assert(!(c_heap && flags == mtNone), "memory type not specified for C heap object"); + assert(_len >= 0 && _len <= _max, "initial_len too big"); _arena = (c_heap ? (Arena*)1 : NULL); set_nesting(); @@ -121,6 +129,8 @@ _max = initial_size; assert(_len >= 0 && _len <= _max, "initial_len too big"); _arena = arena; + _memflags = mtNone; + assert(on_arena(), "arena has taken on reserved value 0 or 1"); // Relax next assert to allow object allocation on resource area, // on stack or embedded into an other object. @@ -152,12 +162,14 @@ for (int i = 0; i < _max; i++) ::new ((void*)&_data[i]) E(); } - GrowableArray(int initial_size, bool C_heap = false) : GenericGrowableArray(initial_size, 0, C_heap) { + GrowableArray(int initial_size, bool C_heap = false, MEMFLAGS F = mtInternal) + : GenericGrowableArray(initial_size, 0, C_heap, F) { _data = (E*)raw_allocate(sizeof(E)); for (int i = 0; i < _max; i++) ::new ((void*)&_data[i]) E(); } - GrowableArray(int initial_size, int initial_len, const E& filler, bool C_heap = false) : GenericGrowableArray(initial_size, initial_len, C_heap) { + GrowableArray(int initial_size, int initial_len, const E& filler, bool C_heap = false, MEMFLAGS memflags = mtInternal) + : GenericGrowableArray(initial_size, initial_len, C_heap, memflags) { _data = (E*)raw_allocate(sizeof(E)); int i = 0; for (; i < _len; i++) ::new ((void*)&_data[i]) E(filler); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/hashtable.cpp --- a/src/share/vm/utilities/hashtable.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/hashtable.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,10 @@ */ #include "precompiled.hpp" +#include "classfile/altHashing.hpp" +#include "classfile/javaClasses.hpp" #include "memory/allocation.inline.hpp" +#include "memory/filemap.hpp" #include "memory/resourceArea.hpp" #include "oops/oop.inline.hpp" #include "runtime/safepoint.hpp" @@ -32,11 +35,6 @@ #include "utilities/hashtable.inline.hpp" -#ifndef USDT2 -HS_DTRACE_PROBE_DECL4(hs_private, hashtable__new_entry, - void*, unsigned int, void*, void*); -#endif /* !USDT2 */ - // This is a generic hashtable, designed to be used for the symbol // and string tables. // @@ -45,8 +43,8 @@ // %note: // - HashtableEntrys are allocated in blocks to reduce the space overhead. -BasicHashtableEntry* BasicHashtable::new_entry(unsigned int hashValue) { - BasicHashtableEntry* entry; +template BasicHashtableEntry* BasicHashtable::new_entry(unsigned int hashValue) { + BasicHashtableEntry* entry; if (_free_list) { entry = _free_list; @@ -57,10 +55,10 @@ int len = _entry_size * block_size; len = 1 << log2_intptr(len); // round down to power of 2 assert(len >= _entry_size, ""); - _first_free_entry = NEW_C_HEAP_ARRAY(char, len); + _first_free_entry = NEW_C_HEAP_ARRAY2(char, len, F, CURRENT_PC); _end_block = _first_free_entry + len; } - entry = (BasicHashtableEntry*)_first_free_entry; + entry = (BasicHashtableEntry*)_first_free_entry; _first_free_entry += _entry_size; } @@ -70,31 +68,114 @@ } -template HashtableEntry* Hashtable::new_entry(unsigned int hashValue, T obj) { - HashtableEntry* entry; +template HashtableEntry* Hashtable::new_entry(unsigned int hashValue, T obj) { + HashtableEntry* entry; - entry = (HashtableEntry*)BasicHashtable::new_entry(hashValue); + entry = (HashtableEntry*)BasicHashtable::new_entry(hashValue); entry->set_literal(obj); -#ifndef USDT2 - HS_DTRACE_PROBE4(hs_private, hashtable__new_entry, - this, hashValue, obj, entry); -#else /* USDT2 */ - HS_PRIVATE_HASHTABLE_NEW_ENTRY( - this, hashValue, (uintptr_t) obj, entry); -#endif /* USDT2 */ return entry; } +// Check to see if the hashtable is unbalanced. The caller set a flag to +// rehash at the next safepoint. If this bucket is 60 times greater than the +// expected average bucket length, it's an unbalanced hashtable. +// This is somewhat an arbitrary heuristic but if one bucket gets to +// rehash_count which is currently 100, there's probably something wrong. + +template bool BasicHashtable::check_rehash_table(int count) { + assert(table_size() != 0, "underflow"); + if (count > (((double)number_of_entries()/(double)table_size())*rehash_multiple)) { + // Set a flag for the next safepoint, which should be at some guaranteed + // safepoint interval. + return true; + } + return false; +} + +template jint Hashtable::_seed = 0; + +template unsigned int Hashtable::new_hash(Symbol* sym) { + ResourceMark rm; + // Use alternate hashing algorithm on this symbol. + return AltHashing::murmur3_32(seed(), (const jbyte*)sym->as_C_string(), sym->utf8_length()); +} + +template unsigned int Hashtable::new_hash(oop string) { + ResourceMark rm; + int length; + jchar* chars = java_lang_String::as_unicode_string(string, length); + // Use alternate hashing algorithm on the string + return AltHashing::murmur3_32(seed(), chars, length); +} + +// Create a new table and using alternate hash code, populate the new table +// with the existing elements. This can be used to change the hash code +// and could in the future change the size of the table. + +template void Hashtable::move_to(Hashtable* new_table) { + + // Initialize the global seed for hashing. + _seed = AltHashing::compute_seed(); + assert(seed() != 0, "shouldn't be zero"); + + int saved_entry_count = this->number_of_entries(); + + // Iterate through the table and create a new entry for the new table + for (int i = 0; i < new_table->table_size(); ++i) { + for (HashtableEntry* p = bucket(i); p != NULL; ) { + HashtableEntry* next = p->next(); + T string = p->literal(); + // Use alternate hashing algorithm on the symbol in the first table + unsigned int hashValue = new_hash(string); + // Get a new index relative to the new table (can also change size) + int index = new_table->hash_to_index(hashValue); + p->set_hash(hashValue); + // Keep the shared bit in the Hashtable entry to indicate that this entry + // can't be deleted. The shared bit is the LSB in the _next field so + // walking the hashtable past these entries requires + // BasicHashtableEntry::make_ptr() call. + bool keep_shared = p->is_shared(); + unlink_entry(p); + new_table->add_entry(index, p); + if (keep_shared) { + p->set_shared(); + } + p = next; + } + } + // give the new table the free list as well + new_table->copy_freelist(this); + assert(new_table->number_of_entries() == saved_entry_count, "lost entry on dictionary copy?"); + + // Destroy memory used by the buckets in the hashtable. The memory + // for the elements has been used in a new table and is not + // destroyed. The memory reuse will benefit resizing the SystemDictionary + // to avoid a memory allocation spike at safepoint. + BasicHashtable::free_buckets(); +} + +template void BasicHashtable::free_buckets() { + if (NULL != _buckets) { + // Don't delete the buckets in the shared space. They aren't + // allocated by os::malloc + if (!UseSharedSpaces || + !FileMapInfo::current_info()->is_in_shared_space(_buckets)) { + FREE_C_HEAP_ARRAY(HashtableBucket, _buckets, F); + } + _buckets = NULL; + } +} + // Reverse the order of elements in the hash buckets. -void BasicHashtable::reverse() { +template void BasicHashtable::reverse() { for (int i = 0; i < _table_size; ++i) { - BasicHashtableEntry* new_list = NULL; - BasicHashtableEntry* p = bucket(i); + BasicHashtableEntry* new_list = NULL; + BasicHashtableEntry* p = bucket(i); while (p != NULL) { - BasicHashtableEntry* next = p->next(); + BasicHashtableEntry* next = p->next(); p->set_next(new_list); new_list = p; p = next; @@ -106,7 +187,7 @@ // Copy the table to the shared space. -void BasicHashtable::copy_table(char** top, char* end) { +template void BasicHashtable::copy_table(char** top, char* end) { // Dump the hash table entries. @@ -115,13 +196,13 @@ int i; for (i = 0; i < _table_size; ++i) { - for (BasicHashtableEntry** p = _buckets[i].entry_addr(); + for (BasicHashtableEntry** p = _buckets[i].entry_addr(); *p != NULL; p = (*p)->next_addr()) { if (*top + entry_size() > end) { report_out_of_shared_space(SharedMiscData); } - *p = (BasicHashtableEntry*)memcpy(*top, *p, entry_size()); + *p = (BasicHashtableEntry*)memcpy(*top, *p, entry_size()); *top += entry_size(); } } @@ -130,7 +211,7 @@ // Set the shared bit. for (i = 0; i < _table_size; ++i) { - for (BasicHashtableEntry* p = bucket(i); p != NULL; p = p->next()) { + for (BasicHashtableEntry* p = bucket(i); p != NULL; p = p->next()) { p->set_shared(); } } @@ -140,15 +221,15 @@ // Reverse the order of elements in the hash buckets. -template void Hashtable::reverse(void* boundary) { +template void Hashtable::reverse(void* boundary) { - for (int i = 0; i < table_size(); ++i) { - HashtableEntry* high_list = NULL; - HashtableEntry* low_list = NULL; - HashtableEntry* last_low_entry = NULL; - HashtableEntry* p = bucket(i); + for (int i = 0; i < this->table_size(); ++i) { + HashtableEntry* high_list = NULL; + HashtableEntry* low_list = NULL; + HashtableEntry* last_low_entry = NULL; + HashtableEntry* p = bucket(i); while (p != NULL) { - HashtableEntry* next = p->next(); + HashtableEntry* next = p->next(); if ((void*)p->literal() >= boundary) { p->set_next(high_list); high_list = p; @@ -173,8 +254,8 @@ // Dump the hash table buckets. -void BasicHashtable::copy_buckets(char** top, char* end) { - intptr_t len = _table_size * sizeof(HashtableBucket); +template void BasicHashtable::copy_buckets(char** top, char* end) { + intptr_t len = _table_size * sizeof(HashtableBucket); *(intptr_t*)(*top) = len; *top += sizeof(intptr_t); @@ -184,18 +265,18 @@ if (*top + len > end) { report_out_of_shared_space(SharedMiscData); } - _buckets = (HashtableBucket*)memcpy(*top, _buckets, len); + _buckets = (HashtableBucket*)memcpy(*top, _buckets, len); *top += len; } #ifndef PRODUCT -template void Hashtable::print() { +template void Hashtable::print() { ResourceMark rm; - for (int i = 0; i < table_size(); i++) { - HashtableEntry* entry = bucket(i); + for (int i = 0; i < BasicHashtable::table_size(); i++) { + HashtableEntry* entry = bucket(i); while(entry != NULL) { tty->print("%d : ", i); entry->literal()->print(); @@ -206,10 +287,10 @@ } -void BasicHashtable::verify() { +template void BasicHashtable::verify() { int count = 0; for (int i = 0; i < table_size(); i++) { - for (BasicHashtableEntry* p = bucket(i); p != NULL; p = p->next()) { + for (BasicHashtableEntry* p = bucket(i); p != NULL; p = p->next()) { ++count; } } @@ -222,7 +303,7 @@ #ifdef ASSERT -void BasicHashtable::verify_lookup_length(double load) { +template void BasicHashtable::verify_lookup_length(double load) { if ((double)_lookup_length / (double)_lookup_count > load * 2.0) { warning("Performance bug: SystemDictionary lookup_count=%d " "lookup_length=%d average=%lf load=%f", @@ -232,10 +313,22 @@ } #endif - // Explicitly instantiate these types -template class Hashtable; -template class Hashtable; -template class Hashtable; -template class Hashtable; - +template class Hashtable; +template class Hashtable; +template class Hashtable; +template class Hashtable; +#ifdef SOLARIS +template class Hashtable; +#endif +template class Hashtable; +template class Hashtable; +template class HashtableEntry; +template class HashtableEntry; +template class HashtableEntry; +template class BasicHashtableEntry; +template class BasicHashtableEntry; +template class BasicHashtable; +template class BasicHashtable; +template class BasicHashtable; +template class BasicHashtable; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/hashtable.hpp --- a/src/share/vm/utilities/hashtable.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/hashtable.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -40,7 +40,7 @@ -class BasicHashtableEntry : public CHeapObj { +template class BasicHashtableEntry : public CHeapObj { friend class VMStructs; private: unsigned int _hash; // 32-bit hash for item @@ -52,7 +52,7 @@ // shared entries will not change. New entries will always be // unshared and since pointers are align, bit 0 will always remain 0 // with no extra effort. - BasicHashtableEntry* _next; + BasicHashtableEntry* _next; // Windows IA64 compiler requires subclasses to be able to access these protected: @@ -69,19 +69,19 @@ void set_hash(unsigned int hash) { _hash = hash; } unsigned int* hash_addr() { return &_hash; } - static BasicHashtableEntry* make_ptr(BasicHashtableEntry* p) { + static BasicHashtableEntry* make_ptr(BasicHashtableEntry* p) { return (BasicHashtableEntry*)((intptr_t)p & -2); } - BasicHashtableEntry* next() const { + BasicHashtableEntry* next() const { return make_ptr(_next); } - void set_next(BasicHashtableEntry* next) { + void set_next(BasicHashtableEntry* next) { _next = next; } - BasicHashtableEntry** next_addr() { + BasicHashtableEntry** next_addr() { return &_next; } @@ -90,13 +90,13 @@ } void set_shared() { - _next = (BasicHashtableEntry*)((intptr_t)_next | 1); + _next = (BasicHashtableEntry*)((intptr_t)_next | 1); } }; -template class HashtableEntry : public BasicHashtableEntry { +template class HashtableEntry : public BasicHashtableEntry { friend class VMStructs; private: T _literal; // ref to item in table. @@ -108,20 +108,20 @@ void set_literal(T s) { _literal = s; } HashtableEntry* next() const { - return (HashtableEntry*)BasicHashtableEntry::next(); + return (HashtableEntry*)BasicHashtableEntry::next(); } HashtableEntry** next_addr() { - return (HashtableEntry**)BasicHashtableEntry::next_addr(); + return (HashtableEntry**)BasicHashtableEntry::next_addr(); } }; -class HashtableBucket : public CHeapObj { +template class HashtableBucket : public CHeapObj { friend class VMStructs; private: // Instance variable - BasicHashtableEntry* _entry; + BasicHashtableEntry* _entry; public: // Accessing @@ -129,21 +129,21 @@ // The following methods use order access methods to avoid race // conditions in multiprocessor systems. - BasicHashtableEntry* get_entry() const; - void set_entry(BasicHashtableEntry* l); + BasicHashtableEntry* get_entry() const; + void set_entry(BasicHashtableEntry* l); // The following method is not MT-safe and must be done under lock. - BasicHashtableEntry** entry_addr() { return &_entry; } + BasicHashtableEntry** entry_addr() { return &_entry; } }; -class BasicHashtable : public CHeapObj { +template class BasicHashtable : public CHeapObj { friend class VMStructs; public: BasicHashtable(int table_size, int entry_size); BasicHashtable(int table_size, int entry_size, - HashtableBucket* buckets, int number_of_entries); + HashtableBucket* buckets, int number_of_entries); // Sharing support. void copy_buckets(char** top, char* end); @@ -159,13 +159,11 @@ // Reverse the order of elements in each of the buckets. void reverse(); - static unsigned int hash_symbol(const char* s, int len); - private: // Instance variables int _table_size; - HashtableBucket* _buckets; - BasicHashtableEntry* _free_list; + HashtableBucket* _buckets; + BasicHashtableEntry* _free_list; char* _first_free_entry; char* _end_block; int _entry_size; @@ -179,27 +177,55 @@ void verify_lookup_length(double load); #endif + enum { + rehash_count = 100, + rehash_multiple = 60 + }; + void initialize(int table_size, int entry_size, int number_of_entries); // Accessor int entry_size() const { return _entry_size; } // The following method is MT-safe and may be used with caution. - BasicHashtableEntry* bucket(int i); + BasicHashtableEntry* bucket(int i); // The following method is not MT-safe and must be done under lock. - BasicHashtableEntry** bucket_addr(int i) { return _buckets[i].entry_addr(); } + BasicHashtableEntry** bucket_addr(int i) { return _buckets[i].entry_addr(); } // Table entry management - BasicHashtableEntry* new_entry(unsigned int hashValue); + BasicHashtableEntry* new_entry(unsigned int hashValue); + + // Check that the table is unbalanced + bool check_rehash_table(int count); + + // Used when moving the entry to another table + // Clean up links, but do not add to free_list + void unlink_entry(BasicHashtableEntry* entry) { + entry->set_next(NULL); + --_number_of_entries; + } + + // Move over freelist and free block for allocation + void copy_freelist(BasicHashtable* src) { + _free_list = src->_free_list; + src->_free_list = NULL; + _first_free_entry = src->_first_free_entry; + src->_first_free_entry = NULL; + _end_block = src->_end_block; + src->_end_block = NULL; + } + + // Free the buckets in this hashtable + void free_buckets(); public: int table_size() { return _table_size; } - void set_entry(int index, BasicHashtableEntry* entry); + void set_entry(int index, BasicHashtableEntry* entry); - void add_entry(int index, BasicHashtableEntry* entry); + void add_entry(int index, BasicHashtableEntry* entry); - void free_entry(BasicHashtableEntry* entry); + void free_entry(BasicHashtableEntry* entry); int number_of_entries() { return _number_of_entries; } @@ -207,16 +233,16 @@ }; -template class Hashtable : public BasicHashtable { +template class Hashtable : public BasicHashtable { friend class VMStructs; public: Hashtable(int table_size, int entry_size) - : BasicHashtable(table_size, entry_size) { } + : BasicHashtable(table_size, entry_size) { } Hashtable(int table_size, int entry_size, - HashtableBucket* buckets, int number_of_entries) - : BasicHashtable(table_size, entry_size, buckets, number_of_entries) { } + HashtableBucket* buckets, int number_of_entries) + : BasicHashtable(table_size, entry_size, buckets, number_of_entries) { } // Debugging void print() PRODUCT_RETURN; @@ -238,31 +264,42 @@ } // Table entry management - HashtableEntry* new_entry(unsigned int hashValue, T obj); + HashtableEntry* new_entry(unsigned int hashValue, T obj); // The following method is MT-safe and may be used with caution. - HashtableEntry* bucket(int i) { - return (HashtableEntry*)BasicHashtable::bucket(i); + HashtableEntry* bucket(int i) { + return (HashtableEntry*)BasicHashtable::bucket(i); } // The following method is not MT-safe and must be done under lock. - HashtableEntry** bucket_addr(int i) { - return (HashtableEntry**)BasicHashtable::bucket_addr(i); + HashtableEntry** bucket_addr(int i) { + return (HashtableEntry**)BasicHashtable::bucket_addr(i); } + + // Function to move these elements into the new table. + void move_to(Hashtable* new_table); + static bool use_alternate_hashcode() { return _seed != 0; } + static jint seed() { return _seed; } + + private: + static jint _seed; + + unsigned int new_hash(Symbol* s); + unsigned int new_hash(oop string); }; // Verions of hashtable where two handles are used to compute the index. -template class TwoOopHashtable : public Hashtable { +template class TwoOopHashtable : public Hashtable { friend class VMStructs; protected: TwoOopHashtable(int table_size, int entry_size) - : Hashtable(table_size, entry_size) {} + : Hashtable(table_size, entry_size) {} - TwoOopHashtable(int table_size, int entry_size, HashtableBucket* t, + TwoOopHashtable(int table_size, int entry_size, HashtableBucket* t, int number_of_entries) - : Hashtable(table_size, entry_size, t, number_of_entries) {} + : Hashtable(table_size, entry_size, t, number_of_entries) {} public: unsigned int compute_hash(Symbol* name, Handle loader) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/hashtable.inline.hpp --- a/src/share/vm/utilities/hashtable.inline.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/hashtable.inline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,46 +27,26 @@ #include "memory/allocation.inline.hpp" #include "utilities/hashtable.hpp" +#include "utilities/dtrace.hpp" // Inline function definitions for hashtable.hpp. - -// -------------------------------------------------------------------------- -// Hash function - -// We originally used hashpjw, but hash P(31) gives just as good results -// and is slighly faster. We would like a hash function that looks at every -// character, since package names have large common prefixes, and also because -// hash_or_fail does error checking while iterating. - -// hash P(31) from Kernighan & Ritchie - -inline unsigned int BasicHashtable::hash_symbol(const char* s, int len) { - unsigned int h = 0; - while (len-- > 0) { - h = 31*h + (unsigned) *s; - s++; - } - return h; -} - - // -------------------------------------------------------------------------- // Initialize a table. -inline BasicHashtable::BasicHashtable(int table_size, int entry_size) { +template inline BasicHashtable::BasicHashtable(int table_size, int entry_size) { // Called on startup, no locking needed initialize(table_size, entry_size, 0); - _buckets = NEW_C_HEAP_ARRAY(HashtableBucket, table_size); + _buckets = NEW_C_HEAP_ARRAY2(HashtableBucket, table_size, F, CURRENT_PC); for (int index = 0; index < _table_size; index++) { _buckets[index].clear(); } } -inline BasicHashtable::BasicHashtable(int table_size, int entry_size, - HashtableBucket* buckets, +template inline BasicHashtable::BasicHashtable(int table_size, int entry_size, + HashtableBucket* buckets, int number_of_entries) { // Called on startup, no locking needed initialize(table_size, entry_size, number_of_entries); @@ -74,7 +54,7 @@ } -inline void BasicHashtable::initialize(int table_size, int entry_size, +template inline void BasicHashtable::initialize(int table_size, int entry_size, int number_of_entries) { // Called on startup, no locking needed _table_size = table_size; @@ -91,12 +71,12 @@ // The following method is MT-safe and may be used with caution. -inline BasicHashtableEntry* BasicHashtable::bucket(int i) { +template inline BasicHashtableEntry* BasicHashtable::bucket(int i) { return _buckets[i].get_entry(); } -inline void HashtableBucket::set_entry(BasicHashtableEntry* l) { +template inline void HashtableBucket::set_entry(BasicHashtableEntry* l) { // Warning: Preserve store ordering. The SystemDictionary is read // without locks. The new SystemDictionaryEntry must be // complete before other threads can be allowed to see it @@ -105,27 +85,27 @@ } -inline BasicHashtableEntry* HashtableBucket::get_entry() const { +template inline BasicHashtableEntry* HashtableBucket::get_entry() const { // Warning: Preserve load ordering. The SystemDictionary is read // without locks. The new SystemDictionaryEntry must be // complete before other threads can be allowed to see it // via a store to _buckets[index]. - return (BasicHashtableEntry*) OrderAccess::load_ptr_acquire(&_entry); + return (BasicHashtableEntry*) OrderAccess::load_ptr_acquire(&_entry); } -inline void BasicHashtable::set_entry(int index, BasicHashtableEntry* entry) { +template inline void BasicHashtable::set_entry(int index, BasicHashtableEntry* entry) { _buckets[index].set_entry(entry); } -inline void BasicHashtable::add_entry(int index, BasicHashtableEntry* entry) { +template inline void BasicHashtable::add_entry(int index, BasicHashtableEntry* entry) { entry->set_next(bucket(index)); _buckets[index].set_entry(entry); ++_number_of_entries; } -inline void BasicHashtable::free_entry(BasicHashtableEntry* entry) { +template inline void BasicHashtable::free_entry(BasicHashtableEntry* entry) { entry->set_next(_free_list); _free_list = entry; --_number_of_entries; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/histogram.cpp --- a/src/share/vm/utilities/histogram.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/histogram.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -69,7 +69,7 @@ Histogram::Histogram(const char* title,int estimatedCount) { _title = title; - _elements = new (ResourceObj::C_HEAP) GrowableArray(estimatedCount,true); + _elements = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(estimatedCount,true); } void Histogram::add_element(HistogramElement* element) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/histogram.hpp --- a/src/share/vm/utilities/histogram.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/histogram.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -77,7 +77,7 @@ #ifdef ASSERT -class HistogramElement : public CHeapObj { +class HistogramElement : public CHeapObj { protected: jint _count; const char* _name; @@ -91,7 +91,7 @@ virtual int compare(HistogramElement* e1,HistogramElement* e2); }; -class Histogram : public CHeapObj { +class Histogram : public CHeapObj { protected: GrowableArray* _elements; GrowableArray* elements() { return _elements; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/intHisto.cpp --- a/src/share/vm/utilities/intHisto.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/intHisto.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -27,7 +27,7 @@ IntHistogram::IntHistogram(int est, int max) : _max(max), _tot(0) { assert(0 <= est && est <= max, "Preconditions"); - _elements = new (ResourceObj::C_HEAP) GrowableArray(est, true); + _elements = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(est, true); guarantee(_elements != NULL, "alloc failure"); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/intHisto.hpp --- a/src/share/vm/utilities/intHisto.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/intHisto.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -47,7 +47,7 @@ // relation) to a count. -class IntHistogram : public CHeapObj { +class IntHistogram : public CHeapObj { protected: int _max; int _tot; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/numberSeq.cpp --- a/src/share/vm/utilities/numberSeq.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/numberSeq.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -115,24 +115,6 @@ return true; } -NumberSeq::NumberSeq(NumberSeq *total, int n, NumberSeq **parts) { - guarantee(check_nums(total, n, parts), "all seq lengths should match"); - double sum = total->sum(); - for (int i = 0; i < n; ++i) { - if (parts[i] != NULL) - sum -= parts[i]->sum(); - } - - _num = total->num(); - _sum = sum; - - // we do not calculate these... - _sum_of_squares = -1.0; - _maximum = -1.0; - _davg = -1.0; - _dvariance = -1.0; -} - void NumberSeq::add(double val) { AbsSeq::add(val); @@ -151,13 +133,13 @@ TruncatedSeq::TruncatedSeq(int length, double alpha): AbsSeq(alpha), _length(length), _next(0) { - _sequence = NEW_C_HEAP_ARRAY(double, _length); + _sequence = NEW_C_HEAP_ARRAY(double, _length, mtInternal); for (int i = 0; i < _length; ++i) _sequence[i] = 0.0; } TruncatedSeq::~TruncatedSeq() { - FREE_C_HEAP_ARRAY(double, _sequence); + FREE_C_HEAP_ARRAY(double, _sequence, mtGC); } void TruncatedSeq::add(double val) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/numberSeq.hpp --- a/src/share/vm/utilities/numberSeq.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/numberSeq.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -25,6 +25,8 @@ #ifndef SHARE_VM_UTILITIES_NUMBERSEQ_HPP #define SHARE_VM_UTILITIES_NUMBERSEQ_HPP +#include "memory/allocation.hpp" + /** ** This file contains a few classes that represent number sequence, ** x1, x2, x3, ..., xN, and can calculate their avg, max, and sd. @@ -40,7 +42,7 @@ #define DEFAULT_ALPHA_VALUE 0.7 -class AbsSeq { +class AbsSeq: public CHeapObj { private: void init(double alpha); @@ -93,7 +95,6 @@ public: NumberSeq(double alpha = DEFAULT_ALPHA_VALUE); - NumberSeq(NumberSeq* total, int n_parts, NumberSeq** parts); virtual void add(double val); virtual double maximum() const { return _maximum; } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/ostream.cpp --- a/src/share/vm/utilities/ostream.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/ostream.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -384,7 +384,7 @@ if (_file != NULL) { if (_need_close) fclose(_file); _file = NULL; - FREE_C_HEAP_ARRAY(char, _file_name); + FREE_C_HEAP_ARRAY(char, _file_name, mtInternal); _file_name = NULL; } } @@ -392,7 +392,7 @@ rotatingFileStream::rotatingFileStream(const char* file_name) { _cur_file_num = 0; _bytes_writen = 0L; - _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10); + _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal); jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num); _file = fopen(_file_name, "w"); _need_close = true; @@ -401,7 +401,7 @@ rotatingFileStream::rotatingFileStream(const char* file_name, const char* opentype) { _cur_file_num = 0; _bytes_writen = 0L; - _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10); + _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal); jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num); _file = fopen(_file_name, opentype); _need_close = true; @@ -524,7 +524,7 @@ } // Create big enough buffer. - char *buf = NEW_C_HEAP_ARRAY(char, buffer_length); + char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal); strcpy(buf, ""); if (force_directory != NULL) { @@ -549,7 +549,7 @@ // %%% Need a MutexLocker? const char* log_name = LogFile != NULL ? LogFile : "hotspot.log"; const char* try_name = make_log_name(log_name, NULL); - fileStream* file = new(ResourceObj::C_HEAP) fileStream(try_name); + fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name); if (!file->is_open()) { // Try again to open the file. char warnbuf[O_BUFLEN*2]; @@ -557,18 +557,18 @@ "Warning: Cannot open log file: %s\n", try_name); // Note: This feature is for maintainer use only. No need for L10N. jio_print(warnbuf); - FREE_C_HEAP_ARRAY(char, try_name); + FREE_C_HEAP_ARRAY(char, try_name, mtInternal); try_name = make_log_name("hs_pid%p.log", os::get_temp_directory()); jio_snprintf(warnbuf, sizeof(warnbuf), "Warning: Forcing option -XX:LogFile=%s\n", try_name); jio_print(warnbuf); delete file; - file = new(ResourceObj::C_HEAP) fileStream(try_name); - FREE_C_HEAP_ARRAY(char, try_name); + file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name); + FREE_C_HEAP_ARRAY(char, try_name, mtInternal); } if (file->is_open()) { _log_file = file; - xmlStream* xs = new(ResourceObj::C_HEAP) xmlStream(file); + xmlStream* xs = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file); _outer_xmlStream = xs; if (this == tty) xtty = xs; // Write XML header. @@ -815,7 +815,7 @@ void ostream_init() { if (defaultStream::instance == NULL) { - defaultStream::instance = new(ResourceObj::C_HEAP) defaultStream(); + defaultStream::instance = new(ResourceObj::C_HEAP, mtInternal) defaultStream(); tty = defaultStream::instance; // We want to ensure that time stamps in GC logs consider time 0 @@ -833,9 +833,9 @@ gclog_or_tty = tty; // default to tty if (Arguments::gc_log_filename() != NULL) { fileStream * gclog = UseGCLogFileRotation ? - new(ResourceObj::C_HEAP) + new(ResourceObj::C_HEAP, mtInternal) rotatingFileStream(Arguments::gc_log_filename()) : - new(ResourceObj::C_HEAP) + new(ResourceObj::C_HEAP, mtInternal) fileStream(Arguments::gc_log_filename()); if (gclog->is_open()) { // now we update the time stamp of the GC log to be synced up @@ -940,7 +940,7 @@ bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() { buffer_length = initial_size; - buffer = NEW_C_HEAP_ARRAY(char, buffer_length); + buffer = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal); buffer_pos = 0; buffer_fixed = false; buffer_max = bufmax; @@ -971,7 +971,7 @@ if (end < buffer_length * 2) { end = buffer_length * 2; } - buffer = REALLOC_C_HEAP_ARRAY(char, buffer, end); + buffer = REALLOC_C_HEAP_ARRAY(char, buffer, end, mtInternal); buffer_length = end; } } @@ -989,7 +989,7 @@ bufferedStream::~bufferedStream() { if (!buffer_fixed) { - FREE_C_HEAP_ARRAY(char, buffer); + FREE_C_HEAP_ARRAY(char, buffer, mtInternal); } } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/stack.hpp --- a/src/share/vm/utilities/stack.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/stack.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -25,6 +25,7 @@ #ifndef SHARE_VM_UTILITIES_STACK_HPP #define SHARE_VM_UTILITIES_STACK_HPP +#include "memory/allocation.hpp" #include "memory/allocation.inline.hpp" // Class Stack (below) grows and shrinks by linking together "segments" which @@ -51,11 +52,11 @@ // implementation in class Stack assumes that alloc() will terminate the process // if the allocation fails. -template class StackIterator; +template class StackIterator; // StackBase holds common data/methods that don't depend on the element type, // factored out to reduce template code duplication. -class StackBase +template class StackBase { public: size_t segment_size() const { return _seg_size; } // Elements per segment. @@ -89,11 +90,11 @@ #define inline #endif // __GNUC__ -template -class Stack: public StackBase +template +class Stack: public StackBase { public: - friend class StackIterator; + friend class StackIterator; // segment_size: number of items per segment // max_cache_size: maxmium number of *segments* to cache @@ -103,15 +104,15 @@ size_t max_cache_size = 4, size_t max_size = 0); inline ~Stack() { clear(true); } - inline bool is_empty() const { return _cur_seg == NULL; } - inline bool is_full() const { return _full_seg_size >= max_size(); } + inline bool is_empty() const { return this->_cur_seg == NULL; } + inline bool is_full() const { return this->_full_seg_size >= this->max_size(); } // Performance sensitive code should use is_empty() instead of size() == 0 and // is_full() instead of size() == max_size(). Using a conditional here allows // just one var to be updated when pushing/popping elements instead of two; // _full_seg_size is updated only when pushing/popping segments. inline size_t size() const { - return is_empty() ? 0 : _full_seg_size + _cur_seg_size; + return is_empty() ? 0 : this->_full_seg_size + this->_cur_seg_size; } inline void push(E elem); @@ -161,18 +162,18 @@ E* _cache; // Segment cache to avoid ping-ponging. }; -template class ResourceStack: public Stack, public ResourceObj +template class ResourceStack: public Stack, public ResourceObj { public: // If this class becomes widely used, it may make sense to save the Thread // and use it when allocating segments. - ResourceStack(size_t segment_size = Stack::default_segment_size()): - Stack(segment_size, max_uintx) +// ResourceStack(size_t segment_size = Stack::default_segment_size()): + ResourceStack(size_t segment_size): Stack(segment_size, max_uintx) { } // Set the segment pointers to NULL so the parent dtor does not free them; // that must be done by the ResourceMark code. - ~ResourceStack() { Stack::reset(true); } + ~ResourceStack() { Stack::reset(true); } protected: virtual E* alloc(size_t bytes); @@ -182,13 +183,13 @@ void clear(bool clear_cache = false); }; -template +template class StackIterator: public StackObj { public: - StackIterator(Stack& stack): _stack(stack) { sync(); } + StackIterator(Stack& stack): _stack(stack) { sync(); } - Stack& stack() const { return _stack; } + Stack& stack() const { return _stack; } bool is_empty() const { return _cur_seg == NULL; } @@ -198,7 +199,7 @@ void sync(); // Sync the iterator's state to the stack's current state. private: - Stack& _stack; + Stack& _stack; size_t _cur_seg_size; E* _cur_seg; size_t _full_seg_size; diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/stack.inline.hpp --- a/src/share/vm/utilities/stack.inline.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/stack.inline.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -27,7 +27,7 @@ #include "utilities/stack.hpp" -StackBase::StackBase(size_t segment_size, size_t max_cache_size, +template StackBase::StackBase(size_t segment_size, size_t max_cache_size, size_t max_size): _seg_size(segment_size), _max_cache_size(max_cache_size), @@ -36,7 +36,7 @@ assert(_max_size % _seg_size == 0, "not a multiple"); } -size_t StackBase::adjust_max_size(size_t max_size, size_t seg_size) +template size_t StackBase::adjust_max_size(size_t max_size, size_t seg_size) { assert(seg_size > 0, "cannot be 0"); assert(max_size >= seg_size || max_size == 0, "max_size too small"); @@ -47,54 +47,54 @@ return (max_size + seg_size - 1) / seg_size * seg_size; } -template -Stack::Stack(size_t segment_size, size_t max_cache_size, size_t max_size): - StackBase(adjust_segment_size(segment_size), max_cache_size, max_size) +template +Stack::Stack(size_t segment_size, size_t max_cache_size, size_t max_size): + StackBase(adjust_segment_size(segment_size), max_cache_size, max_size) { reset(true); } -template -void Stack::push(E item) +template +void Stack::push(E item) { assert(!is_full(), "pushing onto a full stack"); - if (_cur_seg_size == _seg_size) { + if (this->_cur_seg_size == this->_seg_size) { push_segment(); } - _cur_seg[_cur_seg_size] = item; - ++_cur_seg_size; + this->_cur_seg[this->_cur_seg_size] = item; + ++this->_cur_seg_size; } -template -E Stack::pop() +template +E Stack::pop() { assert(!is_empty(), "popping from an empty stack"); - if (_cur_seg_size == 1) { - E tmp = _cur_seg[--_cur_seg_size]; + if (this->_cur_seg_size == 1) { + E tmp = _cur_seg[--this->_cur_seg_size]; pop_segment(); return tmp; } - return _cur_seg[--_cur_seg_size]; + return this->_cur_seg[--this->_cur_seg_size]; } -template -void Stack::clear(bool clear_cache) +template +void Stack::clear(bool clear_cache) { free_segments(_cur_seg); if (clear_cache) free_segments(_cache); reset(clear_cache); } -template -size_t Stack::default_segment_size() +template +size_t Stack::default_segment_size() { // Number of elements that fit in 4K bytes minus the size of two pointers // (link field and malloc header). return (4096 - 2 * sizeof(E*)) / sizeof(E); } -template -size_t Stack::adjust_segment_size(size_t seg_size) +template +size_t Stack::adjust_segment_size(size_t seg_size) { const size_t elem_sz = sizeof(E); const size_t ptr_sz = sizeof(E*); @@ -105,93 +105,93 @@ return seg_size; } -template -size_t Stack::link_offset() const +template +size_t Stack::link_offset() const { - return align_size_up(_seg_size * sizeof(E), sizeof(E*)); + return align_size_up(this->_seg_size * sizeof(E), sizeof(E*)); } -template -size_t Stack::segment_bytes() const +template +size_t Stack::segment_bytes() const { return link_offset() + sizeof(E*); } -template -E** Stack::link_addr(E* seg) const +template +E** Stack::link_addr(E* seg) const { return (E**) ((char*)seg + link_offset()); } -template -E* Stack::get_link(E* seg) const +template +E* Stack::get_link(E* seg) const { return *link_addr(seg); } -template -E* Stack::set_link(E* new_seg, E* old_seg) +template +E* Stack::set_link(E* new_seg, E* old_seg) { *link_addr(new_seg) = old_seg; return new_seg; } -template -E* Stack::alloc(size_t bytes) +template +E* Stack::alloc(size_t bytes) { - return (E*) NEW_C_HEAP_ARRAY(char, bytes); + return (E*) NEW_C_HEAP_ARRAY(char, bytes, F); } -template -void Stack::free(E* addr, size_t bytes) +template +void Stack::free(E* addr, size_t bytes) { - FREE_C_HEAP_ARRAY(char, (char*) addr); + FREE_C_HEAP_ARRAY(char, (char*) addr, F); } -template -void Stack::push_segment() +template +void Stack::push_segment() { - assert(_cur_seg_size == _seg_size, "current segment is not full"); + assert(this->_cur_seg_size == this->_seg_size, "current segment is not full"); E* next; - if (_cache_size > 0) { + if (this->_cache_size > 0) { // Use a cached segment. next = _cache; _cache = get_link(_cache); - --_cache_size; + --this->_cache_size; } else { next = alloc(segment_bytes()); DEBUG_ONLY(zap_segment(next, true);) } const bool at_empty_transition = is_empty(); - _cur_seg = set_link(next, _cur_seg); - _cur_seg_size = 0; - _full_seg_size += at_empty_transition ? 0 : _seg_size; + this->_cur_seg = set_link(next, _cur_seg); + this->_cur_seg_size = 0; + this->_full_seg_size += at_empty_transition ? 0 : this->_seg_size; DEBUG_ONLY(verify(at_empty_transition);) } -template -void Stack::pop_segment() +template +void Stack::pop_segment() { - assert(_cur_seg_size == 0, "current segment is not empty"); + assert(this->_cur_seg_size == 0, "current segment is not empty"); E* const prev = get_link(_cur_seg); - if (_cache_size < _max_cache_size) { + if (this->_cache_size < this->_max_cache_size) { // Add the current segment to the cache. DEBUG_ONLY(zap_segment(_cur_seg, false);) _cache = set_link(_cur_seg, _cache); - ++_cache_size; + ++this->_cache_size; } else { DEBUG_ONLY(zap_segment(_cur_seg, true);) free(_cur_seg, segment_bytes()); } const bool at_empty_transition = prev == NULL; - _cur_seg = prev; - _cur_seg_size = _seg_size; - _full_seg_size -= at_empty_transition ? 0 : _seg_size; + this->_cur_seg = prev; + this->_cur_seg_size = this->_seg_size; + this->_full_seg_size -= at_empty_transition ? 0 : this->_seg_size; DEBUG_ONLY(verify(at_empty_transition);) } -template -void Stack::free_segments(E* seg) +template +void Stack::free_segments(E* seg) { const size_t bytes = segment_bytes(); while (seg != NULL) { @@ -201,37 +201,37 @@ } } -template -void Stack::reset(bool reset_cache) +template +void Stack::reset(bool reset_cache) { - _cur_seg_size = _seg_size; // So push() will alloc a new segment. - _full_seg_size = 0; + this->_cur_seg_size = this->_seg_size; // So push() will alloc a new segment. + this->_full_seg_size = 0; _cur_seg = NULL; if (reset_cache) { - _cache_size = 0; + this->_cache_size = 0; _cache = NULL; } } #ifdef ASSERT -template -void Stack::verify(bool at_empty_transition) const +template +void Stack::verify(bool at_empty_transition) const { - assert(size() <= max_size(), "stack exceeded bounds"); - assert(cache_size() <= max_cache_size(), "cache exceeded bounds"); - assert(_cur_seg_size <= segment_size(), "segment index exceeded bounds"); + assert(size() <= this->max_size(), "stack exceeded bounds"); + assert(this->cache_size() <= this->max_cache_size(), "cache exceeded bounds"); + assert(this->_cur_seg_size <= this->segment_size(), "segment index exceeded bounds"); - assert(_full_seg_size % _seg_size == 0, "not a multiple"); + assert(this->_full_seg_size % this->_seg_size == 0, "not a multiple"); assert(at_empty_transition || is_empty() == (size() == 0), "mismatch"); - assert((_cache == NULL) == (cache_size() == 0), "mismatch"); + assert((_cache == NULL) == (this->cache_size() == 0), "mismatch"); if (is_empty()) { - assert(_cur_seg_size == segment_size(), "sanity"); + assert(this->_cur_seg_size == this->segment_size(), "sanity"); } } -template -void Stack::zap_segment(E* seg, bool zap_link_field) const +template +void Stack::zap_segment(E* seg, bool zap_link_field) const { if (!ZapStackSegments) return; const size_t zap_bytes = segment_bytes() - (zap_link_field ? 0 : sizeof(E*)); @@ -243,28 +243,28 @@ } #endif -template -E* ResourceStack::alloc(size_t bytes) +template +E* ResourceStack::alloc(size_t bytes) { return (E*) resource_allocate_bytes(bytes); } -template -void ResourceStack::free(E* addr, size_t bytes) +template +void ResourceStack::free(E* addr, size_t bytes) { resource_free_bytes((char*) addr, bytes); } -template -void StackIterator::sync() +template +void StackIterator::sync() { _full_seg_size = _stack._full_seg_size; _cur_seg_size = _stack._cur_seg_size; _cur_seg = _stack._cur_seg; } -template -E* StackIterator::next_addr() +template +E* StackIterator::next_addr() { assert(!is_empty(), "no items left"); if (_cur_seg_size == 1) { diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/taskqueue.hpp --- a/src/share/vm/utilities/taskqueue.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/taskqueue.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -132,8 +132,8 @@ } #endif // TASKQUEUE_STATS -template -class TaskQueueSuper: public CHeapObj { +template +class TaskQueueSuper: public CHeapObj { protected: // Internal type for indexing the queue; also used for the tag. typedef NOT_LP64(uint16_t) LP64_ONLY(uint32_t) idx_t; @@ -249,22 +249,27 @@ TASKQUEUE_STATS_ONLY(TaskQueueStats stats;) }; -template -class GenericTaskQueue: public TaskQueueSuper { -protected: - typedef typename TaskQueueSuper::Age Age; - typedef typename TaskQueueSuper::idx_t idx_t; + - using TaskQueueSuper::_bottom; - using TaskQueueSuper::_age; - using TaskQueueSuper::increment_index; - using TaskQueueSuper::decrement_index; - using TaskQueueSuper::dirty_size; +template +class GenericTaskQueue: public TaskQueueSuper { +protected: + typedef typename TaskQueueSuper::Age Age; + typedef typename TaskQueueSuper::idx_t idx_t; + + using TaskQueueSuper::_bottom; + using TaskQueueSuper::_age; + using TaskQueueSuper::increment_index; + using TaskQueueSuper::decrement_index; + using TaskQueueSuper::dirty_size; public: - using TaskQueueSuper::max_elems; - using TaskQueueSuper::size; - TASKQUEUE_STATS_ONLY(using TaskQueueSuper::stats;) + using TaskQueueSuper::max_elems; + using TaskQueueSuper::size; + +#if TASKQUEUE_STATS + using TaskQueueSuper::stats; +#endif private: // Slow paths for push, pop_local. (pop_global has no fast path.) @@ -302,18 +307,18 @@ volatile E* _elems; }; -template -GenericTaskQueue::GenericTaskQueue() { +template +GenericTaskQueue::GenericTaskQueue() { assert(sizeof(Age) == sizeof(size_t), "Depends on this."); } -template -void GenericTaskQueue::initialize() { - _elems = NEW_C_HEAP_ARRAY(E, N); +template +void GenericTaskQueue::initialize() { + _elems = NEW_C_HEAP_ARRAY(E, N, F); } -template -void GenericTaskQueue::oops_do(OopClosure* f) { +template +void GenericTaskQueue::oops_do(OopClosure* f) { // tty->print_cr("START OopTaskQueue::oops_do"); uint iters = size(); uint index = _bottom; @@ -329,8 +334,8 @@ // tty->print_cr("END OopTaskQueue::oops_do"); } -template -bool GenericTaskQueue::push_slow(E t, uint dirty_n_elems) { +template +bool GenericTaskQueue::push_slow(E t, uint dirty_n_elems) { if (dirty_n_elems == N - 1) { // Actually means 0, so do the push. uint localBot = _bottom; @@ -349,8 +354,8 @@ // whenever the queue goes empty which it will do here if this thread // gets the last task or in pop_global() if the queue wraps (top == 0 // and pop_global() succeeds, see pop_global()). -template -bool GenericTaskQueue::pop_local_slow(uint localBot, Age oldAge) { +template +bool GenericTaskQueue::pop_local_slow(uint localBot, Age oldAge) { // This queue was observed to contain exactly one element; either this // thread will claim it, or a competing "pop_global". In either case, // the queue will be logically empty afterwards. Create a new Age value @@ -382,8 +387,8 @@ return false; } -template -bool GenericTaskQueue::pop_global(E& t) { +template +bool GenericTaskQueue::pop_global(E& t) { Age oldAge = _age.get(); uint localBot = _bottom; uint n_elems = size(localBot, oldAge.top()); @@ -402,9 +407,9 @@ return resAge == oldAge; } -template -GenericTaskQueue::~GenericTaskQueue() { - FREE_C_HEAP_ARRAY(E, _elems); +template +GenericTaskQueue::~GenericTaskQueue() { + FREE_C_HEAP_ARRAY(E, _elems, F); } // OverflowTaskQueue is a TaskQueue that also includes an overflow stack for @@ -418,12 +423,12 @@ // Note that size() is not hidden--it returns the number of elements in the // TaskQueue, and does not include the size of the overflow stack. This // simplifies replacement of GenericTaskQueues with OverflowTaskQueues. -template -class OverflowTaskQueue: public GenericTaskQueue +template +class OverflowTaskQueue: public GenericTaskQueue { public: - typedef Stack overflow_t; - typedef GenericTaskQueue taskqueue_t; + typedef Stack overflow_t; + typedef GenericTaskQueue taskqueue_t; TASKQUEUE_STATS_ONLY(using taskqueue_t::stats;) @@ -445,8 +450,8 @@ overflow_t _overflow_stack; }; -template -bool OverflowTaskQueue::push(E t) +template +bool OverflowTaskQueue::push(E t) { if (!taskqueue_t::push(t)) { overflow_stack()->push(t); @@ -455,15 +460,15 @@ return true; } -template -bool OverflowTaskQueue::pop_overflow(E& t) +template +bool OverflowTaskQueue::pop_overflow(E& t) { if (overflow_empty()) return false; t = overflow_stack()->pop(); return true; } -class TaskQueueSetSuper: public CHeapObj { +class TaskQueueSetSuper { protected: static int randomParkAndMiller(int* seed0); public: @@ -471,8 +476,11 @@ virtual bool peek() = 0; }; -template -class GenericTaskQueueSet: public TaskQueueSetSuper { +template class TaskQueueSetSuperImpl: public CHeapObj, public TaskQueueSetSuper { +}; + +template +class GenericTaskQueueSet: public TaskQueueSetSuperImpl { private: uint _n; T** _queues; @@ -482,7 +490,7 @@ GenericTaskQueueSet(int n) : _n(n) { typedef T* GenericTaskQueuePtr; - _queues = NEW_C_HEAP_ARRAY(GenericTaskQueuePtr, n); + _queues = NEW_C_HEAP_ARRAY(GenericTaskQueuePtr, n, F); for (int i = 0; i < n; i++) { _queues[i] = NULL; } @@ -506,19 +514,19 @@ bool peek(); }; -template void -GenericTaskQueueSet::register_queue(uint i, T* q) { +template void +GenericTaskQueueSet::register_queue(uint i, T* q) { assert(i < _n, "index out of range."); _queues[i] = q; } -template T* -GenericTaskQueueSet::queue(uint i) { +template T* +GenericTaskQueueSet::queue(uint i) { return _queues[i]; } -template bool -GenericTaskQueueSet::steal(uint queue_num, int* seed, E& t) { +template bool +GenericTaskQueueSet::steal(uint queue_num, int* seed, E& t) { for (uint i = 0; i < 2 * _n; i++) { if (steal_best_of_2(queue_num, seed, t)) { TASKQUEUE_STATS_ONLY(queue(queue_num)->stats.record_steal(true)); @@ -529,8 +537,8 @@ return false; } -template bool -GenericTaskQueueSet::steal_best_of_all(uint queue_num, int* seed, E& t) { +template bool +GenericTaskQueueSet::steal_best_of_all(uint queue_num, int* seed, E& t) { if (_n > 2) { int best_k; uint best_sz = 0; @@ -553,11 +561,11 @@ } } -template bool -GenericTaskQueueSet::steal_1_random(uint queue_num, int* seed, E& t) { +template bool +GenericTaskQueueSet::steal_1_random(uint queue_num, int* seed, E& t) { if (_n > 2) { uint k = queue_num; - while (k == queue_num) k = randomParkAndMiller(seed) % _n; + while (k == queue_num) k = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; return _queues[2]->pop_global(t); } else if (_n == 2) { // Just try the other one. @@ -569,13 +577,13 @@ } } -template bool -GenericTaskQueueSet::steal_best_of_2(uint queue_num, int* seed, E& t) { +template bool +GenericTaskQueueSet::steal_best_of_2(uint queue_num, int* seed, E& t) { if (_n > 2) { uint k1 = queue_num; - while (k1 == queue_num) k1 = randomParkAndMiller(seed) % _n; + while (k1 == queue_num) k1 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; uint k2 = queue_num; - while (k2 == queue_num || k2 == k1) k2 = randomParkAndMiller(seed) % _n; + while (k2 == queue_num || k2 == k1) k2 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; // Sample both and try the larger. uint sz1 = _queues[k1]->size(); uint sz2 = _queues[k2]->size(); @@ -591,8 +599,8 @@ } } -template -bool GenericTaskQueueSet::peek() { +template +bool GenericTaskQueueSet::peek() { // Try all the queues. for (uint j = 0; j < _n; j++) { if (_queues[j]->peek()) @@ -602,7 +610,7 @@ } // When to terminate from the termination protocol. -class TerminatorTerminator: public CHeapObj { +class TerminatorTerminator: public CHeapObj { public: virtual bool should_exit_termination() = 0; }; @@ -665,8 +673,8 @@ #endif }; -template inline bool -GenericTaskQueue::push(E t) { +template inline bool +GenericTaskQueue::push(E t) { uint localBot = _bottom; assert((localBot >= 0) && (localBot < N), "_bottom out of range."); idx_t top = _age.top(); @@ -683,8 +691,8 @@ } } -template inline bool -GenericTaskQueue::pop_local(E& t) { +template inline bool +GenericTaskQueue::pop_local(E& t) { uint localBot = _bottom; // This value cannot be N-1. That can only occur as a result of // the assignment to bottom in this method. If it does, this method @@ -715,8 +723,8 @@ } } -typedef GenericTaskQueue OopTaskQueue; -typedef GenericTaskQueueSet OopTaskQueueSet; +typedef GenericTaskQueue OopTaskQueue; +typedef GenericTaskQueueSet OopTaskQueueSet; #ifdef _MSC_VER #pragma warning(push) @@ -796,11 +804,11 @@ #pragma warning(pop) #endif -typedef OverflowTaskQueue OopStarTaskQueue; -typedef GenericTaskQueueSet OopStarTaskQueueSet; +typedef OverflowTaskQueue OopStarTaskQueue; +typedef GenericTaskQueueSet OopStarTaskQueueSet; -typedef OverflowTaskQueue RegionTaskQueue; -typedef GenericTaskQueueSet RegionTaskQueueSet; +typedef OverflowTaskQueue RegionTaskQueue; +typedef GenericTaskQueueSet RegionTaskQueueSet; #endif // SHARE_VM_UTILITIES_TASKQUEUE_HPP diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/vmError.cpp --- a/src/share/vm/utilities/vmError.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/vmError.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -33,6 +33,7 @@ #include "runtime/thread.hpp" #include "runtime/vmThread.hpp" #include "runtime/vm_operations.hpp" +#include "services/memTracker.hpp" #include "utilities/debug.hpp" #include "utilities/decoder.hpp" #include "utilities/defaultStream.hpp" @@ -450,7 +451,9 @@ // VM version st->print_cr("#"); JDK_Version::current().to_string(buf, sizeof(buf)); - st->print_cr("# JRE version: %s", buf); + const char* runtime_name = JDK_Version::runtime_name() != NULL ? + JDK_Version::runtime_name() : ""; + st->print_cr("# JRE version: %s (%s)", runtime_name, buf); st->print_cr("# Java VM: %s (%s %s %s %s)", Abstract_VM_Version::vm_name(), Abstract_VM_Version::vm_release(), @@ -818,6 +821,9 @@ static bool transmit_report_done = false; // done error reporting static fdStream log; // error log + // disble NMT to avoid further exception + MemTracker::shutdown(MemTracker::NMT_error_reporting); + if (SuppressFatalErrorMessage) { os::abort(); } diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/workgroup.cpp --- a/src/share/vm/utilities/workgroup.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/workgroup.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -77,7 +77,7 @@ name(), total_workers()); } - _gang_workers = NEW_C_HEAP_ARRAY(GangWorker*, total_workers()); + _gang_workers = NEW_C_HEAP_ARRAY(GangWorker*, total_workers(), mtInternal); if (gang_workers() == NULL) { vm_exit_out_of_memory(0, "Cannot create GangWorker array."); return false; @@ -241,6 +241,7 @@ void GangWorker::initialize() { this->initialize_thread_local_storage(); + this->record_stack_base_and_size(); assert(_gang != NULL, "No gang to run in"); os::set_priority(this, NearMaxPriority); if (TraceWorkGang) { @@ -421,7 +422,7 @@ SubTasksDone::SubTasksDone(uint n) : _n_tasks(n), _n_threads(1), _tasks(NULL) { - _tasks = NEW_C_HEAP_ARRAY(uint, n); + _tasks = NEW_C_HEAP_ARRAY(uint, n, mtInternal); guarantee(_tasks != NULL, "alloc failure"); clear(); } @@ -476,7 +477,7 @@ SubTasksDone::~SubTasksDone() { - if (_tasks != NULL) FREE_C_HEAP_ARRAY(jint, _tasks); + if (_tasks != NULL) FREE_C_HEAP_ARRAY(jint, _tasks, mtInternal); } // *** SequentialSubTasksDone diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/workgroup.hpp --- a/src/share/vm/utilities/workgroup.hpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/workgroup.hpp Thu Aug 02 14:29:12 2012 -0700 @@ -123,7 +123,7 @@ // Class AbstractWorkGang: // An abstract class representing a gang of workers. // You subclass this to supply an implementation of run_task(). -class AbstractWorkGang: public CHeapObj { +class AbstractWorkGang: public CHeapObj { // Here's the public interface to this class. public: // Constructor and destructor. @@ -402,7 +402,7 @@ // subtasks will be identified by integer indices, usually elements of an // enumeration type. -class SubTasksDone : public CHeapObj { +class SubTasksDone: public CHeapObj { uint* _tasks; uint _n_tasks; // _n_threads is used to determine when a sub task is done. diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e src/share/vm/utilities/xmlstream.cpp --- a/src/share/vm/utilities/xmlstream.cpp Fri Jun 08 12:49:12 2012 -0400 +++ b/src/share/vm/utilities/xmlstream.cpp Thu Aug 02 14:29:12 2012 -0700 @@ -43,7 +43,7 @@ #ifdef ASSERT _element_depth = 0; int init_len = 100; - char* init_buf = NEW_C_HEAP_ARRAY(char, init_len); + char* init_buf = NEW_C_HEAP_ARRAY(char, init_len, mtInternal); _element_close_stack_low = init_buf; _element_close_stack_high = init_buf + init_len; _element_close_stack_ptr = init_buf + init_len - 1; @@ -58,7 +58,7 @@ #ifdef ASSERT xmlStream::~xmlStream() { - FREE_C_HEAP_ARRAY(char, _element_close_stack_low); + FREE_C_HEAP_ARRAY(char, _element_close_stack_low, mtInternal); } #endif @@ -155,14 +155,14 @@ int old_len = _element_close_stack_high - old_ptr; int new_len = old_len * 2; if (new_len < 100) new_len = 100; - char* new_low = NEW_C_HEAP_ARRAY(char, new_len); + char* new_low = NEW_C_HEAP_ARRAY(char, new_len, mtInternal); char* new_high = new_low + new_len; char* new_ptr = new_high - old_len; memcpy(new_ptr, old_ptr, old_len); _element_close_stack_high = new_high; _element_close_stack_low = new_low; _element_close_stack_ptr = new_ptr; - FREE_C_HEAP_ARRAY(char, old_low); + FREE_C_HEAP_ARRAY(char, old_low, mtInternal); push_ptr = new_ptr - (tag_len+1); } assert(push_ptr >= _element_close_stack_low, "in range"); diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/6732154/Test6732154.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/6732154/Test6732154.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 6732154 + * @summary REG: Printing an Image using image/gif doc flavor crashes the VM, Solsparc + * + * @run main/othervm -Xcomp -XX:CompileOnly="Test6732154::ascii85Encode" Test6732154 + */ +public class Test6732154 { + + // Exact copy of sun.print.PSPrinterJob.ascii85Encode([b)[b + private byte[] ascii85Encode(byte[] inArr) { + byte[] outArr = new byte[((inArr.length+4) * 5 / 4) + 2]; + long p1 = 85; + long p2 = p1*p1; + long p3 = p1*p2; + long p4 = p1*p3; + byte pling = '!'; + + int i = 0; + int olen = 0; + long val, rem; + + while (i+3 < inArr.length) { + val = ((long)((inArr[i++]&0xff))<<24) + + ((long)((inArr[i++]&0xff))<<16) + + ((long)((inArr[i++]&0xff))<< 8) + + ((long)(inArr[i++]&0xff)); + if (val == 0) { + outArr[olen++] = 'z'; + } else { + rem = val; + outArr[olen++] = (byte)(rem / p4 + pling); rem = rem % p4; + outArr[olen++] = (byte)(rem / p3 + pling); rem = rem % p3; + outArr[olen++] = (byte)(rem / p2 + pling); rem = rem % p2; + outArr[olen++] = (byte)(rem / p1 + pling); rem = rem % p1; + outArr[olen++] = (byte)(rem + pling); + } + } + // input not a multiple of 4 bytes, write partial output. + if (i < inArr.length) { + int n = inArr.length - i; // n bytes remain to be written + + val = 0; + while (i < inArr.length) { + val = (val << 8) + (inArr[i++]&0xff); + } + + int append = 4 - n; + while (append-- > 0) { + val = val << 8; + } + byte []c = new byte[5]; + rem = val; + c[0] = (byte)(rem / p4 + pling); rem = rem % p4; + c[1] = (byte)(rem / p3 + pling); rem = rem % p3; + c[2] = (byte)(rem / p2 + pling); rem = rem % p2; + c[3] = (byte)(rem / p1 + pling); rem = rem % p1; + c[4] = (byte)(rem + pling); + + for (int b = 0; b < n+1 ; b++) { + outArr[olen++] = c[b]; + } + } + + // write EOD marker. + outArr[olen++]='~'; outArr[olen++]='>'; + + /* The original intention was to insert a newline after every 78 bytes. + * This was mainly intended for legibility but I decided against this + * partially because of the (small) amount of extra space, and + * partially because for line breaks either would have to hardwire + * ascii 10 (newline) or calculate space in bytes to allocate for + * the platform's newline byte sequence. Also need to be careful + * about where its inserted: + * Ascii 85 decoder ignores white space except for one special case: + * you must ensure you do not split the EOD marker across lines. + */ + byte[] retArr = new byte[olen]; + System.arraycopy(outArr, 0, retArr, 0, olen); + return retArr; + } + + public static void main(String[] args) { + new Test6732154().ascii85Encode(new byte[0]); + System.out.println("Test passed."); + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/6894807/Test6894807.sh --- a/test/compiler/6894807/Test6894807.sh Fri Jun 08 12:49:12 2012 -0400 +++ b/test/compiler/6894807/Test6894807.sh Thu Aug 02 14:29:12 2012 -0700 @@ -18,8 +18,6 @@ exit 1 fi -BIT_FLAG="" - # set platform-dependent variables OS=`uname -s` case "$OS" in @@ -27,12 +25,6 @@ NULL=/dev/null PS=":" FS="/" - ## for solaris, linux it's HOME - FILE_LOCATION=$HOME - if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ] - then - BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT | grep -v '^#'` - fi ;; Windows_* ) NULL=NUL @@ -50,9 +42,9 @@ THIS_DIR=`pwd` -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -version +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -version -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -server IsInstanceTest > test.out 2>&1 +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} IsInstanceTest > test.out 2>&1 cat test.out diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestBooleanVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestBooleanVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,952 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestBooleanVect + */ + +public class TestBooleanVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Boolean vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + boolean[] a1 = new boolean[ARRLEN]; + boolean[] a2 = new boolean[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0); + } + for (int i=ALIGN_OFF; i 0); + errn += verify("test_cp_alndst_overlap: a1", i, a1[i], v); + } + for (int i=0; i 0); + errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], v); + } + for (int i=0; i 0); + } + for (int i=UNALIGN_OFF; i 0); + errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], v); + } + for (int i=0; i 0); + errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], v); + } + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = false; + } + } + static void test_vi_neg(boolean[] a, boolean b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b; + } + } + static void test_cp_neg(boolean[] a, boolean[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + } + } + static void test_2ci_neg(boolean[] a, boolean[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = false; + b[i] = false; + } + } + static void test_2vi_neg(boolean[] a, boolean[] b, boolean c, boolean d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_ci_oppos(boolean[] a) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = false; + } + } + static void test_vi_oppos(boolean[] a, boolean b) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[limit-i] = b; + } + } + static void test_cp_oppos(boolean[] a, boolean[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + } + } + static void test_2ci_oppos(boolean[] a, boolean[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = false; + b[i] = false; + } + } + static void test_2vi_oppos(boolean[] a, boolean[] b, boolean c, boolean d) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_ci_off(boolean[] a) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = false; + } + } + static void test_vi_off(boolean[] a, boolean b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b; + } + } + static void test_cp_off(boolean[] a, boolean[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b[i+OFFSET]; + } + } + static void test_2ci_off(boolean[] a, boolean[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = false; + b[i+OFFSET] = false; + } + } + static void test_2vi_off(boolean[] a, boolean[] b, boolean c, boolean d) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = c; + b[i+OFFSET] = d; + } + } + static void test_ci_inv(boolean[] a, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = false; + } + } + static void test_vi_inv(boolean[] a, boolean b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b; + } + } + static void test_cp_inv(boolean[] a, boolean[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b[i+k]; + } + } + static void test_2ci_inv(boolean[] a, boolean[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = false; + b[i+k] = false; + } + } + static void test_2vi_inv(boolean[] a, boolean[] b, boolean c, boolean d, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = c; + b[i+k] = d; + } + } + static void test_ci_scl(boolean[] a) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = false; + } + } + static void test_vi_scl(boolean[] a, boolean b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b; + } + } + static void test_cp_scl(boolean[] a, boolean[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b[i*SCALE]; + } + } + static void test_2ci_scl(boolean[] a, boolean[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = false; + b[i*SCALE] = false; + } + } + static void test_2vi_scl(boolean[] a, boolean[] b, boolean c, boolean d) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = c; + b[i*SCALE] = d; + } + } + static void test_cp_alndst(boolean[] a, boolean[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + } + } + static void test_cp_alnsrc(boolean[] a, boolean[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + } + } + static void test_2ci_aln(boolean[] a, boolean[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = false; + b[i] = false; + } + } + static void test_2vi_aln(boolean[] a, boolean[] b, boolean c, boolean d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_unalndst(boolean[] a, boolean[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + } + } + static void test_cp_unalnsrc(boolean[] a, boolean[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + } + } + static void test_2ci_unaln(boolean[] a, boolean[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = false; + b[i] = false; + } + } + static void test_2vi_unaln(boolean[] a, boolean[] b, boolean c, boolean d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + + static int verify(String text, int i, boolean elem, boolean val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestByteDoubleVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestByteDoubleVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteDoubleVect + */ + +public class TestByteDoubleVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Byte + Double vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + byte[] a1 = new byte[ARRLEN]; + byte[] a2 = new byte[ARRLEN]; + double[] b1 = new double[ARRLEN]; + double[] b2 = new double[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103.; + } + } + static void test_vi_neg(byte[] a, double[] b, byte c, double d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(byte[] a, byte[] b, double[] c, double[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(byte[] a, double[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103.; + } + } + static void test_vi_oppos(byte[] a, double[] b, byte c, double d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(byte[] a, byte[] b, double[] c, double[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(byte[] a, double[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103.; + } + } + static void test_vi_aln(byte[] a, double[] b, byte c, double d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(byte[] a, byte[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(byte[] a, byte[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(byte[] a, double[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103.; + } + } + static void test_vi_unaln(byte[] a, double[] b, byte c, double d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(byte[] a, byte[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(byte[] a, byte[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, byte elem, byte val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, double elem, double val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestByteFloatVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestByteFloatVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteFloatVect + */ + +public class TestByteFloatVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Byte + Float vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + byte[] a1 = new byte[ARRLEN]; + byte[] a2 = new byte[ARRLEN]; + float[] b1 = new float[ARRLEN]; + float[] b2 = new float[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103.f; + } + } + static void test_vi_neg(byte[] a, float[] b, byte c, float d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(byte[] a, byte[] b, float[] c, float[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(byte[] a, float[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103.f; + } + } + static void test_vi_oppos(byte[] a, float[] b, byte c, float d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(byte[] a, byte[] b, float[] c, float[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(byte[] a, float[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103.f; + } + } + static void test_vi_aln(byte[] a, float[] b, byte c, float d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(byte[] a, byte[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(byte[] a, byte[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(byte[] a, float[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103.f; + } + } + static void test_vi_unaln(byte[] a, float[] b, byte c, float d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(byte[] a, byte[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(byte[] a, byte[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, byte elem, byte val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, float elem, float val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestByteIntVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestByteIntVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteIntVect + */ + +public class TestByteIntVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Byte + Integer vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + byte[] a1 = new byte[ARRLEN]; + byte[] a2 = new byte[ARRLEN]; + int[] b1 = new int[ARRLEN]; + int[] b2 = new int[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_vi_neg(byte[] a, int[] b, byte c, int d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(byte[] a, byte[] b, int[] c, int[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(byte[] a, int[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_vi_oppos(byte[] a, int[] b, byte c, int d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(byte[] a, byte[] b, int[] c, int[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(byte[] a, int[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_aln(byte[] a, int[] b, byte c, int d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(byte[] a, byte[] b, int[] c, int[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(byte[] a, byte[] b, int[] c, int[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(byte[] a, int[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_unaln(byte[] a, int[] b, byte c, int d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(byte[] a, byte[] b, int[] c, int[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(byte[] a, byte[] b, int[] c, int[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, byte elem, byte val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, int elem, int val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestByteLongVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestByteLongVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteLongVect + */ + +public class TestByteLongVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Byte + Long vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + byte[] a1 = new byte[ARRLEN]; + byte[] a2 = new byte[ARRLEN]; + long[] b1 = new long[ARRLEN]; + long[] b2 = new long[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_vi_neg(byte[] a, long[] b, byte c, long d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(byte[] a, byte[] b, long[] c, long[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(byte[] a, long[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_vi_oppos(byte[] a, long[] b, byte c, long d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(byte[] a, byte[] b, long[] c, long[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(byte[] a, long[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_aln(byte[] a, long[] b, byte c, long d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(byte[] a, byte[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(byte[] a, byte[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(byte[] a, long[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_unaln(byte[] a, long[] b, byte c, long d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(byte[] a, byte[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(byte[] a, byte[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, byte elem, byte val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, long elem, long val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestByteShortVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestByteShortVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteShortVect + */ + +public class TestByteShortVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Byte + Short vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + byte[] a1 = new byte[ARRLEN]; + byte[] a2 = new byte[ARRLEN]; + short[] b1 = new short[ARRLEN]; + short[] b2 = new short[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_vi_neg(byte[] a, short[] b, byte c, short d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(byte[] a, byte[] b, short[] c, short[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(byte[] a, short[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_vi_oppos(byte[] a, short[] b, byte c, short d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(byte[] a, byte[] b, short[] c, short[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(byte[] a, short[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_aln(byte[] a, short[] b, byte c, short d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(byte[] a, byte[] b, short[] c, short[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(byte[] a, byte[] b, short[] c, short[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(byte[] a, short[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_unaln(byte[] a, short[] b, byte c, short d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(byte[] a, byte[] b, short[] c, short[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(byte[] a, byte[] b, short[] c, short[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, byte elem, byte val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, short elem, short val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestByteVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestByteVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteVect + */ + +public class TestByteVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Byte vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + byte[] a1 = new byte[ARRLEN]; + byte[] a2 = new byte[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + } + } + static void test_vi_neg(byte[] a, byte b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b; + } + } + static void test_cp_neg(byte[] a, byte[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + } + } + static void test_2ci_neg(byte[] a, byte[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_2vi_neg(byte[] a, byte[] b, byte c, byte d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_ci_oppos(byte[] a) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + } + } + static void test_vi_oppos(byte[] a, byte b) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[limit-i] = b; + } + } + static void test_cp_oppos(byte[] a, byte[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + } + } + static void test_2ci_oppos(byte[] a, byte[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_2vi_oppos(byte[] a, byte[] b, byte c, byte d) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_ci_off(byte[] a) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123; + } + } + static void test_vi_off(byte[] a, byte b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b; + } + } + static void test_cp_off(byte[] a, byte[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b[i+OFFSET]; + } + } + static void test_2ci_off(byte[] a, byte[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123; + b[i+OFFSET] = -103; + } + } + static void test_2vi_off(byte[] a, byte[] b, byte c, byte d) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = c; + b[i+OFFSET] = d; + } + } + static void test_ci_inv(byte[] a, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123; + } + } + static void test_vi_inv(byte[] a, byte b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b; + } + } + static void test_cp_inv(byte[] a, byte[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b[i+k]; + } + } + static void test_2ci_inv(byte[] a, byte[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123; + b[i+k] = -103; + } + } + static void test_2vi_inv(byte[] a, byte[] b, byte c, byte d, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = c; + b[i+k] = d; + } + } + static void test_ci_scl(byte[] a) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123; + } + } + static void test_vi_scl(byte[] a, byte b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b; + } + } + static void test_cp_scl(byte[] a, byte[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b[i*SCALE]; + } + } + static void test_2ci_scl(byte[] a, byte[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123; + b[i*SCALE] = -103; + } + } + static void test_2vi_scl(byte[] a, byte[] b, byte c, byte d) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = c; + b[i*SCALE] = d; + } + } + static void test_cp_alndst(byte[] a, byte[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + } + } + static void test_cp_alnsrc(byte[] a, byte[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + } + } + static void test_2ci_aln(byte[] a, byte[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_2vi_aln(byte[] a, byte[] b, byte c, byte d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_unalndst(byte[] a, byte[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + } + } + static void test_cp_unalnsrc(byte[] a, byte[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + } + } + static void test_2ci_unaln(byte[] a, byte[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_2vi_unaln(byte[] a, byte[] b, byte c, byte d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + + static int verify(String text, int i, byte elem, byte val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestCharShortVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestCharShortVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestCharShortVect + */ + +public class TestCharShortVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Char + Short vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + char[] a1 = new char[ARRLEN]; + char[] a2 = new char[ARRLEN]; + short[] b1 = new short[ARRLEN]; + short[] b2 = new short[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = (char)-123; + b[i] = (short)-103; + } + } + static void test_vi_neg(char[] a, short[] b, char c, short d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(char[] a, char[] b, short[] c, short[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(char[] a, short[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = (char)-123; + b[i] = (short)-103; + } + } + static void test_vi_oppos(char[] a, short[] b, char c, short d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(char[] a, char[] b, short[] c, short[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(char[] a, short[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = (char)-123; + b[i] = (short)-103; + } + } + static void test_vi_aln(char[] a, short[] b, char c, short d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(char[] a, char[] b, short[] c, short[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(char[] a, char[] b, short[] c, short[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(char[] a, short[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = (char)-123; + b[i] = (short)-103; + } + } + static void test_vi_unaln(char[] a, short[] b, char c, short d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(char[] a, char[] b, short[] c, short[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(char[] a, char[] b, short[] c, short[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, char elem, char val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, short elem, short val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestCharVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestCharVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestCharVect + */ + +public class TestCharVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Char vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + char[] a1 = new char[ARRLEN]; + char[] a2 = new char[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = (char)-123; + } + } + static void test_vi_neg(char[] a, char b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b; + } + } + static void test_cp_neg(char[] a, char[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + } + } + static void test_2ci_neg(char[] a, char[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = (char)-123; + b[i] = (char)-103; + } + } + static void test_2vi_neg(char[] a, char[] b, char c, char d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_ci_oppos(char[] a) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = (char)-123; + } + } + static void test_vi_oppos(char[] a, char b) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[limit-i] = b; + } + } + static void test_cp_oppos(char[] a, char[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + } + } + static void test_2ci_oppos(char[] a, char[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = (char)-123; + b[i] = (char)-103; + } + } + static void test_2vi_oppos(char[] a, char[] b, char c, char d) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_ci_off(char[] a) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = (char)-123; + } + } + static void test_vi_off(char[] a, char b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b; + } + } + static void test_cp_off(char[] a, char[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b[i+OFFSET]; + } + } + static void test_2ci_off(char[] a, char[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = (char)-123; + b[i+OFFSET] = (char)-103; + } + } + static void test_2vi_off(char[] a, char[] b, char c, char d) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = c; + b[i+OFFSET] = d; + } + } + static void test_ci_inv(char[] a, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = (char)-123; + } + } + static void test_vi_inv(char[] a, char b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b; + } + } + static void test_cp_inv(char[] a, char[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b[i+k]; + } + } + static void test_2ci_inv(char[] a, char[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = (char)-123; + b[i+k] = (char)-103; + } + } + static void test_2vi_inv(char[] a, char[] b, char c, char d, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = c; + b[i+k] = d; + } + } + static void test_ci_scl(char[] a) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = (char)-123; + } + } + static void test_vi_scl(char[] a, char b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b; + } + } + static void test_cp_scl(char[] a, char[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b[i*SCALE]; + } + } + static void test_2ci_scl(char[] a, char[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = (char)-123; + b[i*SCALE] = (char)-103; + } + } + static void test_2vi_scl(char[] a, char[] b, char c, char d) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = c; + b[i*SCALE] = d; + } + } + static void test_cp_alndst(char[] a, char[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + } + } + static void test_cp_alnsrc(char[] a, char[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + } + } + static void test_2ci_aln(char[] a, char[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = (char)-123; + b[i] = (char)-103; + } + } + static void test_2vi_aln(char[] a, char[] b, char c, char d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_unalndst(char[] a, char[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + } + } + static void test_cp_unalnsrc(char[] a, char[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + } + } + static void test_2ci_unaln(char[] a, char[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = (char)-123; + b[i] = (char)-103; + } + } + static void test_2vi_unaln(char[] a, char[] b, char c, char d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + + static int verify(String text, int i, char elem, char val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestDoubleVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestDoubleVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestDoubleVect + */ + +public class TestDoubleVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Double vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + double[] a1 = new double[ARRLEN]; + double[] a2 = new double[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123.; + } + } + static void test_vi_neg(double[] a, double b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b; + } + } + static void test_cp_neg(double[] a, double[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + } + } + static void test_2ci_neg(double[] a, double[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = -123.; + b[i] = -103.; + } + } + static void test_2vi_neg(double[] a, double[] b, double c, double d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_ci_oppos(double[] a) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123.; + } + } + static void test_vi_oppos(double[] a, double b) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[limit-i] = b; + } + } + static void test_cp_oppos(double[] a, double[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + } + } + static void test_2ci_oppos(double[] a, double[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123.; + b[i] = -103.; + } + } + static void test_2vi_oppos(double[] a, double[] b, double c, double d) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_ci_off(double[] a) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123.; + } + } + static void test_vi_off(double[] a, double b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b; + } + } + static void test_cp_off(double[] a, double[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b[i+OFFSET]; + } + } + static void test_2ci_off(double[] a, double[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123.; + b[i+OFFSET] = -103.; + } + } + static void test_2vi_off(double[] a, double[] b, double c, double d) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = c; + b[i+OFFSET] = d; + } + } + static void test_ci_inv(double[] a, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123.; + } + } + static void test_vi_inv(double[] a, double b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b; + } + } + static void test_cp_inv(double[] a, double[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b[i+k]; + } + } + static void test_2ci_inv(double[] a, double[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123.; + b[i+k] = -103.; + } + } + static void test_2vi_inv(double[] a, double[] b, double c, double d, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = c; + b[i+k] = d; + } + } + static void test_ci_scl(double[] a) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123.; + } + } + static void test_vi_scl(double[] a, double b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b; + } + } + static void test_cp_scl(double[] a, double[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b[i*SCALE]; + } + } + static void test_2ci_scl(double[] a, double[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123.; + b[i*SCALE] = -103.; + } + } + static void test_2vi_scl(double[] a, double[] b, double c, double d) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = c; + b[i*SCALE] = d; + } + } + static void test_cp_alndst(double[] a, double[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + } + } + static void test_cp_alnsrc(double[] a, double[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + } + } + static void test_2ci_aln(double[] a, double[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123.; + b[i] = -103.; + } + } + static void test_2vi_aln(double[] a, double[] b, double c, double d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_unalndst(double[] a, double[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + } + } + static void test_cp_unalnsrc(double[] a, double[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + } + } + static void test_2ci_unaln(double[] a, double[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123.; + b[i] = -103.; + } + } + static void test_2vi_unaln(double[] a, double[] b, double c, double d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + + static int verify(String text, int i, double elem, double val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestFloatDoubleVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestFloatDoubleVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestFloatDoubleVect + */ + +public class TestFloatDoubleVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Float + Double vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + float[] a1 = new float[ARRLEN]; + float[] a2 = new float[ARRLEN]; + double[] b1 = new double[ARRLEN]; + double[] b2 = new double[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123.f; + b[i] = -103.; + } + } + static void test_vi_neg(float[] a, double[] b, float c, double d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(float[] a, float[] b, double[] c, double[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(float[] a, double[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123.f; + b[i] = -103.; + } + } + static void test_vi_oppos(float[] a, double[] b, float c, double d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(float[] a, float[] b, double[] c, double[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(float[] a, double[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123.f; + b[i] = -103.; + } + } + static void test_vi_aln(float[] a, double[] b, float c, double d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(float[] a, float[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(float[] a, float[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(float[] a, double[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123.f; + b[i] = -103.; + } + } + static void test_vi_unaln(float[] a, double[] b, float c, double d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(float[] a, float[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(float[] a, float[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, float elem, float val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, double elem, double val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestFloatVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestFloatVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestFloatVect + */ + +public class TestFloatVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Float vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + float[] a1 = new float[ARRLEN]; + float[] a2 = new float[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123.f; + } + } + static void test_vi_neg(float[] a, float b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b; + } + } + static void test_cp_neg(float[] a, float[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + } + } + static void test_2ci_neg(float[] a, float[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = -123.f; + b[i] = -103.f; + } + } + static void test_2vi_neg(float[] a, float[] b, float c, float d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_ci_oppos(float[] a) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123.f; + } + } + static void test_vi_oppos(float[] a, float b) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[limit-i] = b; + } + } + static void test_cp_oppos(float[] a, float[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + } + } + static void test_2ci_oppos(float[] a, float[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123.f; + b[i] = -103.f; + } + } + static void test_2vi_oppos(float[] a, float[] b, float c, float d) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_ci_off(float[] a) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123.f; + } + } + static void test_vi_off(float[] a, float b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b; + } + } + static void test_cp_off(float[] a, float[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b[i+OFFSET]; + } + } + static void test_2ci_off(float[] a, float[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123.f; + b[i+OFFSET] = -103.f; + } + } + static void test_2vi_off(float[] a, float[] b, float c, float d) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = c; + b[i+OFFSET] = d; + } + } + static void test_ci_inv(float[] a, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123.f; + } + } + static void test_vi_inv(float[] a, float b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b; + } + } + static void test_cp_inv(float[] a, float[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b[i+k]; + } + } + static void test_2ci_inv(float[] a, float[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123.f; + b[i+k] = -103.f; + } + } + static void test_2vi_inv(float[] a, float[] b, float c, float d, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = c; + b[i+k] = d; + } + } + static void test_ci_scl(float[] a) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123.f; + } + } + static void test_vi_scl(float[] a, float b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b; + } + } + static void test_cp_scl(float[] a, float[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b[i*SCALE]; + } + } + static void test_2ci_scl(float[] a, float[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123.f; + b[i*SCALE] = -103.f; + } + } + static void test_2vi_scl(float[] a, float[] b, float c, float d) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = c; + b[i*SCALE] = d; + } + } + static void test_cp_alndst(float[] a, float[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + } + } + static void test_cp_alnsrc(float[] a, float[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + } + } + static void test_2ci_aln(float[] a, float[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123.f; + b[i] = -103.f; + } + } + static void test_2vi_aln(float[] a, float[] b, float c, float d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_unalndst(float[] a, float[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + } + } + static void test_cp_unalnsrc(float[] a, float[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + } + } + static void test_2ci_unaln(float[] a, float[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123.f; + b[i] = -103.f; + } + } + static void test_2vi_unaln(float[] a, float[] b, float c, float d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + + static int verify(String text, int i, float elem, float val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestIntDoubleVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestIntDoubleVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntDoubleVect + */ + +public class TestIntDoubleVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Integer + Double vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + int[] a1 = new int[ARRLEN]; + int[] a2 = new int[ARRLEN]; + double[] b1 = new double[ARRLEN]; + double[] b2 = new double[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103.; + } + } + static void test_vi_neg(int[] a, double[] b, int c, double d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(int[] a, int[] b, double[] c, double[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(int[] a, double[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103.; + } + } + static void test_vi_oppos(int[] a, double[] b, int c, double d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(int[] a, int[] b, double[] c, double[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(int[] a, double[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103.; + } + } + static void test_vi_aln(int[] a, double[] b, int c, double d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(int[] a, int[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(int[] a, int[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(int[] a, double[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103.; + } + } + static void test_vi_unaln(int[] a, double[] b, int c, double d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(int[] a, int[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(int[] a, int[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, int elem, int val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, double elem, double val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestIntFloatVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestIntFloatVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntFloatVect + */ + +public class TestIntFloatVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Integer + Float vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + int[] a1 = new int[ARRLEN]; + int[] a2 = new int[ARRLEN]; + float[] b1 = new float[ARRLEN]; + float[] b2 = new float[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103.f; + } + } + static void test_vi_neg(int[] a, float[] b, int c, float d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(int[] a, int[] b, float[] c, float[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(int[] a, float[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103.f; + } + } + static void test_vi_oppos(int[] a, float[] b, int c, float d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(int[] a, int[] b, float[] c, float[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(int[] a, float[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103.f; + } + } + static void test_vi_aln(int[] a, float[] b, int c, float d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(int[] a, int[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(int[] a, int[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(int[] a, float[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103.f; + } + } + static void test_vi_unaln(int[] a, float[] b, int c, float d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(int[] a, int[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(int[] a, int[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, int elem, int val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, float elem, float val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestIntLongVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestIntLongVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntLongVect + */ + +public class TestIntLongVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Integer + Long vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + int[] a1 = new int[ARRLEN]; + int[] a2 = new int[ARRLEN]; + long[] b1 = new long[ARRLEN]; + long[] b2 = new long[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_vi_neg(int[] a, long[] b, int c, long d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(int[] a, int[] b, long[] c, long[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(int[] a, long[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_vi_oppos(int[] a, long[] b, int c, long d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(int[] a, int[] b, long[] c, long[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(int[] a, long[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_aln(int[] a, long[] b, int c, long d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(int[] a, int[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(int[] a, int[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(int[] a, long[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_unaln(int[] a, long[] b, int c, long d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(int[] a, int[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(int[] a, int[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, int elem, int val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, long elem, long val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestIntVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestIntVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntVect + */ + +public class TestIntVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Integer vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + int[] a1 = new int[ARRLEN]; + int[] a2 = new int[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + } + } + static void test_vi_neg(int[] a, int b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b; + } + } + static void test_cp_neg(int[] a, int[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + } + } + static void test_2ci_neg(int[] a, int[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_2vi_neg(int[] a, int[] b, int c, int d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_ci_oppos(int[] a) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + } + } + static void test_vi_oppos(int[] a, int b) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[limit-i] = b; + } + } + static void test_cp_oppos(int[] a, int[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + } + } + static void test_2ci_oppos(int[] a, int[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_2vi_oppos(int[] a, int[] b, int c, int d) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_ci_off(int[] a) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123; + } + } + static void test_vi_off(int[] a, int b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b; + } + } + static void test_cp_off(int[] a, int[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b[i+OFFSET]; + } + } + static void test_2ci_off(int[] a, int[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123; + b[i+OFFSET] = -103; + } + } + static void test_2vi_off(int[] a, int[] b, int c, int d) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = c; + b[i+OFFSET] = d; + } + } + static void test_ci_inv(int[] a, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123; + } + } + static void test_vi_inv(int[] a, int b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b; + } + } + static void test_cp_inv(int[] a, int[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b[i+k]; + } + } + static void test_2ci_inv(int[] a, int[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123; + b[i+k] = -103; + } + } + static void test_2vi_inv(int[] a, int[] b, int c, int d, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = c; + b[i+k] = d; + } + } + static void test_ci_scl(int[] a) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123; + } + } + static void test_vi_scl(int[] a, int b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b; + } + } + static void test_cp_scl(int[] a, int[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b[i*SCALE]; + } + } + static void test_2ci_scl(int[] a, int[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123; + b[i*SCALE] = -103; + } + } + static void test_2vi_scl(int[] a, int[] b, int c, int d) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = c; + b[i*SCALE] = d; + } + } + static void test_cp_alndst(int[] a, int[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + } + } + static void test_cp_alnsrc(int[] a, int[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + } + } + static void test_2ci_aln(int[] a, int[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_2vi_aln(int[] a, int[] b, int c, int d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_unalndst(int[] a, int[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + } + } + static void test_cp_unalnsrc(int[] a, int[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + } + } + static void test_2ci_unaln(int[] a, int[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_2vi_unaln(int[] a, int[] b, int c, int d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + + static int verify(String text, int i, int elem, int val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestLongDoubleVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestLongDoubleVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongDoubleVect + */ + +public class TestLongDoubleVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Long + Double vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + long[] a1 = new long[ARRLEN]; + long[] a2 = new long[ARRLEN]; + double[] b1 = new double[ARRLEN]; + double[] b2 = new double[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103.; + } + } + static void test_vi_neg(long[] a, double[] b, long c, double d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(long[] a, long[] b, double[] c, double[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(long[] a, double[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103.; + } + } + static void test_vi_oppos(long[] a, double[] b, long c, double d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(long[] a, long[] b, double[] c, double[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(long[] a, double[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103.; + } + } + static void test_vi_aln(long[] a, double[] b, long c, double d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(long[] a, long[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(long[] a, long[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(long[] a, double[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103.; + } + } + static void test_vi_unaln(long[] a, double[] b, long c, double d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(long[] a, long[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(long[] a, long[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, long elem, long val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, double elem, double val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestLongFloatVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestLongFloatVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongFloatVect + */ + +public class TestLongFloatVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Long + Float vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + long[] a1 = new long[ARRLEN]; + long[] a2 = new long[ARRLEN]; + float[] b1 = new float[ARRLEN]; + float[] b2 = new float[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103.f; + } + } + static void test_vi_neg(long[] a, float[] b, long c, float d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(long[] a, long[] b, float[] c, float[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(long[] a, float[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103.f; + } + } + static void test_vi_oppos(long[] a, float[] b, long c, float d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(long[] a, long[] b, float[] c, float[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(long[] a, float[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103.f; + } + } + static void test_vi_aln(long[] a, float[] b, long c, float d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(long[] a, long[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(long[] a, long[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(long[] a, float[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103.f; + } + } + static void test_vi_unaln(long[] a, float[] b, long c, float d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(long[] a, long[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(long[] a, long[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, long elem, long val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, float elem, float val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestLongVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestLongVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongVect + */ + +public class TestLongVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Long vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + long[] a1 = new long[ARRLEN]; + long[] a2 = new long[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + } + } + static void test_vi_neg(long[] a, long b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b; + } + } + static void test_cp_neg(long[] a, long[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + } + } + static void test_2ci_neg(long[] a, long[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_2vi_neg(long[] a, long[] b, long c, long d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_ci_oppos(long[] a) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + } + } + static void test_vi_oppos(long[] a, long b) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[limit-i] = b; + } + } + static void test_cp_oppos(long[] a, long[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + } + } + static void test_2ci_oppos(long[] a, long[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_2vi_oppos(long[] a, long[] b, long c, long d) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_ci_off(long[] a) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123; + } + } + static void test_vi_off(long[] a, long b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b; + } + } + static void test_cp_off(long[] a, long[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b[i+OFFSET]; + } + } + static void test_2ci_off(long[] a, long[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123; + b[i+OFFSET] = -103; + } + } + static void test_2vi_off(long[] a, long[] b, long c, long d) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = c; + b[i+OFFSET] = d; + } + } + static void test_ci_inv(long[] a, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123; + } + } + static void test_vi_inv(long[] a, long b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b; + } + } + static void test_cp_inv(long[] a, long[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b[i+k]; + } + } + static void test_2ci_inv(long[] a, long[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123; + b[i+k] = -103; + } + } + static void test_2vi_inv(long[] a, long[] b, long c, long d, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = c; + b[i+k] = d; + } + } + static void test_ci_scl(long[] a) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123; + } + } + static void test_vi_scl(long[] a, long b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b; + } + } + static void test_cp_scl(long[] a, long[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b[i*SCALE]; + } + } + static void test_2ci_scl(long[] a, long[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123; + b[i*SCALE] = -103; + } + } + static void test_2vi_scl(long[] a, long[] b, long c, long d) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = c; + b[i*SCALE] = d; + } + } + static void test_cp_alndst(long[] a, long[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + } + } + static void test_cp_alnsrc(long[] a, long[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + } + } + static void test_2ci_aln(long[] a, long[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_2vi_aln(long[] a, long[] b, long c, long d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_unalndst(long[] a, long[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + } + } + static void test_cp_unalnsrc(long[] a, long[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + } + } + static void test_2ci_unaln(long[] a, long[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_2vi_unaln(long[] a, long[] b, long c, long d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + + static int verify(String text, int i, long elem, long val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestShortDoubleVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestShortDoubleVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortDoubleVect + */ + +public class TestShortDoubleVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Short + Double vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + short[] a1 = new short[ARRLEN]; + short[] a2 = new short[ARRLEN]; + double[] b1 = new double[ARRLEN]; + double[] b2 = new double[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103.; + } + } + static void test_vi_neg(short[] a, double[] b, short c, double d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(short[] a, short[] b, double[] c, double[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(short[] a, double[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103.; + } + } + static void test_vi_oppos(short[] a, double[] b, short c, double d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(short[] a, short[] b, double[] c, double[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(short[] a, double[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103.; + } + } + static void test_vi_aln(short[] a, double[] b, short c, double d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(short[] a, short[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(short[] a, short[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(short[] a, double[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103.; + } + } + static void test_vi_unaln(short[] a, double[] b, short c, double d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(short[] a, short[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(short[] a, short[] b, double[] c, double[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, short elem, short val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, double elem, double val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestShortFloatVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestShortFloatVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortFloatVect + */ + +public class TestShortFloatVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Short + Float vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + short[] a1 = new short[ARRLEN]; + short[] a2 = new short[ARRLEN]; + float[] b1 = new float[ARRLEN]; + float[] b2 = new float[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103.f; + } + } + static void test_vi_neg(short[] a, float[] b, short c, float d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(short[] a, short[] b, float[] c, float[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(short[] a, float[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103.f; + } + } + static void test_vi_oppos(short[] a, float[] b, short c, float d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(short[] a, short[] b, float[] c, float[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(short[] a, float[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103.f; + } + } + static void test_vi_aln(short[] a, float[] b, short c, float d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(short[] a, short[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(short[] a, short[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(short[] a, float[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103.f; + } + } + static void test_vi_unaln(short[] a, float[] b, short c, float d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(short[] a, short[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(short[] a, short[] b, float[] c, float[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, short elem, short val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, float elem, float val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestShortIntVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestShortIntVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortIntVect + */ + +public class TestShortIntVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Short + Integer vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + short[] a1 = new short[ARRLEN]; + short[] a2 = new short[ARRLEN]; + int[] b1 = new int[ARRLEN]; + int[] b2 = new int[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_vi_neg(short[] a, int[] b, short c, int d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(short[] a, short[] b, int[] c, int[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(short[] a, int[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_vi_oppos(short[] a, int[] b, short c, int d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(short[] a, short[] b, int[] c, int[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(short[] a, int[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_aln(short[] a, int[] b, short c, int d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(short[] a, short[] b, int[] c, int[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(short[] a, short[] b, int[] c, int[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(short[] a, int[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_unaln(short[] a, int[] b, short c, int d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(short[] a, short[] b, int[] c, int[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(short[] a, short[] b, int[] c, int[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, short elem, short val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, int elem, int val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestShortLongVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestShortLongVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortLongVect + */ + +public class TestShortLongVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Short + Long vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + short[] a1 = new short[ARRLEN]; + short[] a2 = new short[ARRLEN]; + long[] b1 = new long[ARRLEN]; + long[] b2 = new long[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_vi_neg(short[] a, long[] b, short c, long d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_cp_neg(short[] a, short[] b, long[] c, long[] d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + c[i] = d[i]; + } + } + static void test_ci_oppos(short[] a, long[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_vi_oppos(short[] a, long[] b, short c, long d) { + int limit = a.length-1; + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_cp_oppos(short[] a, short[] b, long[] c, long[] d) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + c[limit-i] = d[i]; + } + } + static void test_ci_aln(short[] a, long[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_aln(short[] a, long[] b, short c, long d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_alndst(short[] a, short[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + c[i+ALIGN_OFF] = d[i]; + } + } + static void test_cp_alnsrc(short[] a, short[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + c[i] = d[i+ALIGN_OFF]; + } + } + static void test_ci_unaln(short[] a, long[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_vi_unaln(short[] a, long[] b, short c, long d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + static void test_cp_unalndst(short[] a, short[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + c[i+UNALIGN_OFF] = d[i]; + } + } + static void test_cp_unalnsrc(short[] a, short[] b, long[] c, long[] d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + c[i] = d[i+UNALIGN_OFF]; + } + } + + static int verify(String text, int i, short elem, short val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + static int verify(String text, int i, long elem, long val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7119644/TestShortVect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7119644/TestShortVect.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7119644 + * @summary Increase superword's vector size up to 256 bits + * + * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortVect + */ + +public class TestShortVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int OFFSET = 3; + private static final int SCALE = 2; + private static final int ALIGN_OFF = 8; + private static final int UNALIGN_OFF = 5; + + public static void main(String args[]) { + System.out.println("Testing Short vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + short[] a1 = new short[ARRLEN]; + short[] a2 = new short[ARRLEN]; + System.out.println("Warmup"); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + start = System.currentTimeMillis(); + for (int i=0; i= 0; i-=1) { + a[i] = -123; + } + } + static void test_vi_neg(short[] a, short b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b; + } + } + static void test_cp_neg(short[] a, short[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = b[i]; + } + } + static void test_2ci_neg(short[] a, short[] b) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = -123; + b[i] = -103; + } + } + static void test_2vi_neg(short[] a, short[] b, short c, short d) { + for (int i = a.length-1; i >= 0; i-=1) { + a[i] = c; + b[i] = d; + } + } + static void test_ci_oppos(short[] a) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + } + } + static void test_vi_oppos(short[] a, short b) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[limit-i] = b; + } + } + static void test_cp_oppos(short[] a, short[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[i] = b[limit-i]; + } + } + static void test_2ci_oppos(short[] a, short[] b) { + int limit = a.length-1; + for (int i = 0; i < a.length; i+=1) { + a[limit-i] = -123; + b[i] = -103; + } + } + static void test_2vi_oppos(short[] a, short[] b, short c, short d) { + int limit = a.length-1; + for (int i = limit; i >= 0; i-=1) { + a[i] = c; + b[limit-i] = d; + } + } + static void test_ci_off(short[] a) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123; + } + } + static void test_vi_off(short[] a, short b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b; + } + } + static void test_cp_off(short[] a, short[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = b[i+OFFSET]; + } + } + static void test_2ci_off(short[] a, short[] b) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = -123; + b[i+OFFSET] = -103; + } + } + static void test_2vi_off(short[] a, short[] b, short c, short d) { + for (int i = 0; i < a.length-OFFSET; i+=1) { + a[i+OFFSET] = c; + b[i+OFFSET] = d; + } + } + static void test_ci_inv(short[] a, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123; + } + } + static void test_vi_inv(short[] a, short b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b; + } + } + static void test_cp_inv(short[] a, short[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = b[i+k]; + } + } + static void test_2ci_inv(short[] a, short[] b, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = -123; + b[i+k] = -103; + } + } + static void test_2vi_inv(short[] a, short[] b, short c, short d, int k) { + for (int i = 0; i < a.length-k; i+=1) { + a[i+k] = c; + b[i+k] = d; + } + } + static void test_ci_scl(short[] a) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123; + } + } + static void test_vi_scl(short[] a, short b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b; + } + } + static void test_cp_scl(short[] a, short[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = b[i*SCALE]; + } + } + static void test_2ci_scl(short[] a, short[] b) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = -123; + b[i*SCALE] = -103; + } + } + static void test_2vi_scl(short[] a, short[] b, short c, short d) { + for (int i = 0; i*SCALE < a.length; i+=1) { + a[i*SCALE] = c; + b[i*SCALE] = d; + } + } + static void test_cp_alndst(short[] a, short[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = b[i]; + } + } + static void test_cp_alnsrc(short[] a, short[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = b[i+ALIGN_OFF]; + } + } + static void test_2ci_aln(short[] a, short[] b) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i+ALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_2vi_aln(short[] a, short[] b, short c, short d) { + for (int i = 0; i < a.length-ALIGN_OFF; i+=1) { + a[i] = c; + b[i+ALIGN_OFF] = d; + } + } + static void test_cp_unalndst(short[] a, short[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = b[i]; + } + } + static void test_cp_unalnsrc(short[] a, short[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = b[i+UNALIGN_OFF]; + } + } + static void test_2ci_unaln(short[] a, short[] b) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i+UNALIGN_OFF] = -123; + b[i] = -103; + } + } + static void test_2vi_unaln(short[] a, short[] b, short c, short d) { + for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) { + a[i] = c; + b[i+UNALIGN_OFF] = d; + } + } + + static int verify(String text, int i, short elem, short val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7169782/Test7169782.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7169782/Test7169782.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7169782 + * @summary C2: SIGSEGV in LShiftLNode::Ideal(PhaseGVN*, bool) + * + * @run main/othervm -Xcomp -XX:CompileOnly="Test7169782::" Test7169782 + */ + +public class Test7169782 { + static long var_8; + + static { + var_8 /= (long)(1E100 + ("".startsWith("a", 0) ? 1 : 2)); + } + + public static void main(String[] args) { + System.out.println("Test passed."); + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7174363/Test7174363.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7174363/Test7174363.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7174363 + * @summary crash with Arrays.copyOfRange(original, from, to) when from > original.length + * + * @run main/othervm -XX:-BackgroundCompilation Test7174363 + */ + +import java.util.*; + +public class Test7174363 { + + static Object[] m(Object[] original, int from, int to) { + return Arrays.copyOfRange(original, from, to, Object[].class); + } + + static public void main(String[] args) { + Object[] orig = new Object[10]; + for (int i = 0; i < 20000; i++) { + try { + m(orig, 15, 20); + } catch(ArrayIndexOutOfBoundsException excp) {} + } + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7177917/Test7177917.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7177917/Test7177917.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * Micro-benchmark for Math.pow() and Math.exp() + */ + +import java.util.*; + +public class Test7177917 { + + static double d; + + static Random r = new Random(0); + + static long m_pow(double[][] values) { + double res = 0; + long start = System.nanoTime(); + for (int i = 0; i < values.length; i++) { + res += Math.pow(values[i][0], values[i][1]); + } + long stop = System.nanoTime(); + d = res; + return (stop - start) / 1000; + } + + static long m_exp(double[] values) { + double res = 0; + long start = System.nanoTime(); + for (int i = 0; i < values.length; i++) { + res += Math.exp(values[i]); + } + long stop = System.nanoTime(); + d = res; + return (stop - start) / 1000; + } + + static double[][] pow_values(int nb) { + double[][] res = new double[nb][2]; + for (int i = 0; i < nb; i++) { + double ylogx = (1 + (r.nextDouble() * 2045)) - 1023; // 2045 rather than 2046 as a safety margin + double x = Math.abs(Double.longBitsToDouble(r.nextLong())); + while (x != x) { + x = Math.abs(Double.longBitsToDouble(r.nextLong())); + } + double logx = Math.log(x) / Math.log(2); + double y = ylogx / logx; + + res[i][0] = x; + res[i][1] = y; + } + return res; + } + + static double[] exp_values(int nb) { + double[] res = new double[nb]; + for (int i = 0; i < nb; i++) { + double ylogx = (1 + (r.nextDouble() * 2045)) - 1023; // 2045 rather than 2046 as a safety margin + double x = Math.E; + double logx = Math.log(x) / Math.log(2); + double y = ylogx / logx; + res[i] = y; + } + return res; + } + + static public void main(String[] args) { + { + // warmup + double[][] warmup_values = pow_values(10); + m_pow(warmup_values); + + for (int i = 0; i < 20000; i++) { + m_pow(warmup_values); + } + // test pow perf + double[][] values = pow_values(1000000); + System.out.println("==> POW " + m_pow(values)); + + // force uncommon trap + double[][] nan_values = new double[1][2]; + nan_values[0][0] = Double.NaN; + nan_values[0][1] = Double.NaN; + m_pow(nan_values); + + // force recompilation + for (int i = 0; i < 20000; i++) { + m_pow(warmup_values); + } + + // test pow perf again + System.out.println("==> POW " + m_pow(values)); + } + { + // warmup + double[] warmup_values = exp_values(10); + m_exp(warmup_values); + + for (int i = 0; i < 20000; i++) { + m_exp(warmup_values); + } + + // test pow perf + double[] values = exp_values(1000000); + System.out.println("==> EXP " + m_exp(values)); + + // force uncommon trap + double[] nan_values = new double[1]; + nan_values[0] = Double.NaN; + m_exp(nan_values); + + // force recompilation + for (int i = 0; i < 20000; i++) { + m_exp(warmup_values); + } + + // test pow perf again + System.out.println("==> EXP " + m_exp(values)); + } + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7179138/Test7179138_1.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7179138/Test7179138_1.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,66 @@ +/* + * Copyright 2012 Skip Balk. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7179138 + * @summary Incorrect result with String concatenation optimization + * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation Test7179138_1 + * + * @author Skip Balk + */ + +public class Test7179138_1 { + public static void main(String[] args) throws Exception { + System.out.println("Java Version: " + System.getProperty("java.vm.version")); + long[] durations = new long[60]; + for (int i = 0; i < 100000; i++) { + // this empty for-loop is required to reproduce this bug + for (long duration : durations) { + // do nothing + } + { + String s = "test"; + int len = s.length(); + + s = new StringBuilder(String.valueOf(s)).append(s).toString(); + len = len + len; + + s = new StringBuilder(String.valueOf(s)).append(s).toString(); + len = len + len; + + s = new StringBuilder(String.valueOf(s)).append(s).toString(); + len = len + len; + + if (s.length() != len) { + System.out.println("Failed at iteration: " + i); + System.out.println("Length mismatch: " + s.length() + " <> " + len); + System.out.println("Expected: \"" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "\""); + System.out.println("Actual: \"" + s + "\""); + System.exit(97); + } + } + } + } +} + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/compiler/7179138/Test7179138_2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/7179138/Test7179138_2.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,66 @@ +/* + * Copyright 2012 Skip Balk. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7179138 + * @summary Incorrect result with String concatenation optimization + * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation Test7179138_2 + * + * @author Skip Balk + */ + +public class Test7179138_2 { + public static void main(String[] args) throws Exception { + System.out.println("Java Version: " + System.getProperty("java.vm.version")); + long[] durations = new long[60]; + for (int i = 0; i < 100000; i++) { + // this empty for-loop is required to reproduce this bug + for (long duration : durations) { + // do nothing + } + { + String s = "test"; + int len = s.length(); + + s = s + s; + len = len + len; + + s = s + s; + len = len + len; + + s = s + s; + len = len + len; + + if (s.length() != len) { + System.out.println("Failed at iteration: " + i); + System.out.println("Length mismatch: " + s.length() + " <> " + len); + System.out.println("Expected: \"" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "\""); + System.out.println("Actual: \"" + s + "\""); + System.exit(0); + } + } + } + } +} + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/gc/6941923/test6941923.sh --- a/test/gc/6941923/test6941923.sh Fri Jun 08 12:49:12 2012 -0400 +++ b/test/gc/6941923/test6941923.sh Thu Aug 02 14:29:12 2012 -0700 @@ -30,7 +30,7 @@ exit 0 fi -$JAVA_HOME/bin/java -version > $NULL 2>&1 +$JAVA_HOME/bin/java ${TESTVMOPTS} -version > $NULL 2>&1 if [ $? != 0 ]; then echo "Wrong JAVA_HOME? JAVA_HOME: $JAVA_HOME" @@ -119,7 +119,7 @@ options="-Xloggc:$logfile -XX:+UseConcMarkSweepGC -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=$gclogsize" echo "Test gc log rotation in same file, wait for $tts minutes ...." -$JAVA_HOME/bin/java $options $testname $tts +$JAVA_HOME/bin/java ${TESTVMOPTS} $options $testname $tts if [ $? != 0 ]; then echo "$msgfail" exit -1 @@ -148,7 +148,7 @@ numoffiles=3 options="-Xloggc:$logfile -XX:+UseConcMarkSweepGC -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=$numoffiles -XX:GCLogFileSize=$gclogsize" echo "Test gc log rotation in $numoffiles files, wait for $tts minutes ...." -$JAVA_HOME/bin/java $options $testname $tts +$JAVA_HOME/bin/java ${TESTVMOPTS} $options $testname $tts if [ $? != 0 ]; then echo "$msgfail" exit -1 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/gc/7168848/HumongousAlloc.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/gc/7168848/HumongousAlloc.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test Humongous.java + * @bug 7168848 + * @summary G1: humongous object allocations should initiate marking cycles when necessary + * @run main/othervm -Xms100m -Xmx100m -XX:+PrintGC -XX:G1HeapRegionSize=1m -XX:+UseG1GC HumongousAlloc + * + */ +import java.lang.management.GarbageCollectorMXBean; +import java.lang.management.ManagementFactory; +import java.util.List; + +public class HumongousAlloc { + + public static byte[] dummy; + private static int sleepFreq = 40; + private static int sleepTime = 1000; + private static double size = 0.75; + private static int iterations = 50; + private static int MB = 1024 * 1024; + + public static void allocate(int size, int sleepTime, int sleepFreq) throws InterruptedException { + System.out.println("Will allocate objects of size: " + size + + " bytes and sleep for " + sleepTime + + " ms after every " + sleepFreq + "th allocation."); + int count = 0; + while (count < iterations) { + for (int i = 0; i < sleepFreq; i++) { + dummy = new byte[size - 16]; + } + Thread.sleep(sleepTime); + count++; + } + } + + public static void main(String[] args) throws InterruptedException { + allocate((int) (size * MB), sleepTime, sleepFreq); + List collectors = ManagementFactory.getGarbageCollectorMXBeans(); + for (GarbageCollectorMXBean collector : collectors) { + if (collector.getName().contains("G1 Old")) { + long count = collector.getCollectionCount(); + if (count > 0) { + throw new RuntimeException("Failed: FullGCs should not have happened. The number of FullGC run is " + count); + } + else { + System.out.println("Passed."); + } + } + } + } +} + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/6294277/SourceDebugExtension.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/runtime/6294277/SourceDebugExtension.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6294277 + * @summary java -Xdebug crashes on SourceDebugExtension attribute larger than 64K + * @run main/othervm -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n SourceDebugExtension + */ +import java.io.*; + +public class SourceDebugExtension extends ClassLoader +{ + static final int attrSize = 68000; + static byte[] header = { +(byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe, (byte)0x00, (byte)0x00, (byte)0x00, +(byte)0x32, (byte)0x00, (byte)0x1e, (byte)0x0a, (byte)0x00, (byte)0x06, (byte)0x00, +(byte)0x0f, (byte)0x09, (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x11, (byte)0x08, +(byte)0x00, (byte)0x12, (byte)0x0a, (byte)0x00, (byte)0x13, (byte)0x00, (byte)0x14, +(byte)0x07, (byte)0x00, (byte)0x15, (byte)0x07, (byte)0x00, (byte)0x16, (byte)0x01, +(byte)0x00, (byte)0x06, (byte)0x3c, (byte)0x69, (byte)0x6e, (byte)0x69, (byte)0x74, +(byte)0x3e, (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x28, (byte)0x29, (byte)0x56, +(byte)0x01, (byte)0x00, (byte)0x04, (byte)0x43, (byte)0x6f, (byte)0x64, (byte)0x65, +(byte)0x01, (byte)0x00, (byte)0x0f, (byte)0x4c, (byte)0x69, (byte)0x6e, (byte)0x65, +(byte)0x4e, (byte)0x75, (byte)0x6d, (byte)0x62, (byte)0x65, (byte)0x72, (byte)0x54, +(byte)0x61, (byte)0x62, (byte)0x6c, (byte)0x65, (byte)0x01, (byte)0x00, (byte)0x04, +(byte)0x6d, (byte)0x61, (byte)0x69, (byte)0x6e, (byte)0x01, (byte)0x00, (byte)0x16, +(byte)0x28, (byte)0x5b, (byte)0x4c, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, +(byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2f, (byte)0x53, +(byte)0x74, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x67, (byte)0x3b, (byte)0x29, +(byte)0x56, (byte)0x01, (byte)0x00, (byte)0x0a, (byte)0x53, (byte)0x6f, (byte)0x75, +(byte)0x72, (byte)0x63, (byte)0x65, (byte)0x46, (byte)0x69, (byte)0x6c, (byte)0x65, +(byte)0x01, (byte)0x00, (byte)0x0d, (byte)0x54, (byte)0x65, (byte)0x73, (byte)0x74, +(byte)0x50, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x2e, (byte)0x6a, (byte)0x61, +(byte)0x76, (byte)0x61, (byte)0x0c, (byte)0x00, (byte)0x07, (byte)0x00, (byte)0x08, +(byte)0x07, (byte)0x00, (byte)0x17, (byte)0x0c, (byte)0x00, (byte)0x18, (byte)0x00, +(byte)0x19, (byte)0x01, (byte)0x00, (byte)0x34, (byte)0x54, (byte)0x65, (byte)0x73, +(byte)0x74, (byte)0x20, (byte)0x70, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x72, +(byte)0x61, (byte)0x6d, (byte)0x20, (byte)0x66, (byte)0x6f, (byte)0x72, (byte)0x20, +(byte)0x62, (byte)0x69, (byte)0x67, (byte)0x20, (byte)0x53, (byte)0x6f, (byte)0x75, +(byte)0x72, (byte)0x63, (byte)0x65, (byte)0x44, (byte)0x65, (byte)0x62, (byte)0x75, +(byte)0x67, (byte)0x45, (byte)0x78, (byte)0x74, (byte)0x65, (byte)0x6e, (byte)0x73, +(byte)0x69, (byte)0x6f, (byte)0x6e, (byte)0x20, (byte)0x61, (byte)0x74, (byte)0x74, +(byte)0x72, (byte)0x69, (byte)0x62, (byte)0x75, (byte)0x74, (byte)0x65, (byte)0x73, +(byte)0x07, (byte)0x00, (byte)0x1a, (byte)0x0c, (byte)0x00, (byte)0x1b, (byte)0x00, +(byte)0x1c, (byte)0x01, (byte)0x00, (byte)0x08, (byte)0x54, (byte)0x65, (byte)0x73, +(byte)0x74, (byte)0x50, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x01, (byte)0x00, +(byte)0x10, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c, +(byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2f, (byte)0x4f, (byte)0x62, (byte)0x6a, +(byte)0x65, (byte)0x63, (byte)0x74, (byte)0x01, (byte)0x00, (byte)0x10, (byte)0x6a, +(byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e, +(byte)0x67, (byte)0x2f, (byte)0x53, (byte)0x79, (byte)0x73, (byte)0x74, (byte)0x65, +(byte)0x6d, (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x6f, (byte)0x75, (byte)0x74, +(byte)0x01, (byte)0x00, (byte)0x15, (byte)0x4c, (byte)0x6a, (byte)0x61, (byte)0x76, +(byte)0x61, (byte)0x2f, (byte)0x69, (byte)0x6f, (byte)0x2f, (byte)0x50, (byte)0x72, +(byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x53, (byte)0x74, (byte)0x72, (byte)0x65, +(byte)0x61, (byte)0x6d, (byte)0x3b, (byte)0x01, (byte)0x00, (byte)0x13, (byte)0x6a, +(byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x69, (byte)0x6f, (byte)0x2f, +(byte)0x50, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x53, (byte)0x74, +(byte)0x72, (byte)0x65, (byte)0x61, (byte)0x6d, (byte)0x01, (byte)0x00, (byte)0x07, +(byte)0x70, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x6c, (byte)0x6e, +(byte)0x01, (byte)0x00, (byte)0x15, (byte)0x28, (byte)0x4c, (byte)0x6a, (byte)0x61, +(byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, +(byte)0x2f, (byte)0x53, (byte)0x74, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x67, +(byte)0x3b, (byte)0x29, (byte)0x56, (byte)0x01, (byte)0x00, (byte)0x14, (byte)0x53, +(byte)0x6f, (byte)0x75, (byte)0x72, (byte)0x63, (byte)0x65, (byte)0x44, (byte)0x65, +(byte)0x62, (byte)0x75, (byte)0x67, (byte)0x45, (byte)0x78, (byte)0x74, (byte)0x65, +(byte)0x6e, (byte)0x73, (byte)0x69, (byte)0x6f, (byte)0x6e, (byte)0x00, (byte)0x21, +(byte)0x00, (byte)0x05, (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x00, (byte)0x00, +(byte)0x00, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x07, +(byte)0x00, (byte)0x08, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, (byte)0x00, +(byte)0x00, (byte)0x00, (byte)0x1d, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x01, +(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x05, (byte)0x2a, (byte)0xb7, (byte)0x00, +(byte)0x01, (byte)0xb1, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, +(byte)0x0a, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x01, +(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, (byte)0x00, +(byte)0x0b, (byte)0x00, (byte)0x0c, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, +(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x25, (byte)0x00, (byte)0x02, (byte)0x00, +(byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x09, (byte)0xb2, (byte)0x00, +(byte)0x02, (byte)0x12, (byte)0x03, (byte)0xb6, (byte)0x00, (byte)0x04, (byte)0xb1, +(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x0a, (byte)0x00, +(byte)0x00, (byte)0x00, (byte)0x0a, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x00, +(byte)0x00, (byte)0x03, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x04, (byte)0x00, +(byte)0x02, (byte)0x00, (byte)0x0d, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02, +(byte)0x00, (byte)0x0e, (byte)0x00, (byte)0x1d, (byte)0x00, (byte)0x01, (byte)0x09, +(byte)0xa0 + }; + + public static void main(String[] args) throws Exception + { + try { + SourceDebugExtension loader = new SourceDebugExtension(); + /* The test program creates a class file from the header + * stored above and adding the content of a SourceDebugExtension + * attribute made of the character 0x02 repeated 68000 times. + * This attribute doesn't follow the syntax specified in JSR 45 + * but it's fine because this test just checks that the JVM is + * able to load a class file with a SourceDebugExtension + * attribute bigger than 64KB. The JVM doesn't try to + * parse the content of the attribute, this work is performed + * by the SA or external tools. + */ + byte[] buf = new byte[header.length + attrSize]; + for(int i=0; itest.out 2>&1 +${JAVA} ${TESTVMOPTS} -Xverify -Xint -cp . bug_21227 >test.out 2>&1 grep "loader constraint" test.out exit $? diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/6878713/Test6878713.sh --- a/test/runtime/6878713/Test6878713.sh Fri Jun 08 12:49:12 2012 -0400 +++ b/test/runtime/6878713/Test6878713.sh Thu Aug 02 14:29:12 2012 -0700 @@ -25,8 +25,6 @@ exit 1 fi -BIT_FLAG="" - # set platform-dependent variables OS=`uname -s` case "$OS" in @@ -34,12 +32,6 @@ NULL=/dev/null PS=":" FS="/" - ## for solaris, linux it's HOME - FILE_LOCATION=$HOME - if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ] - then - BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT | grep -v '^#'` - fi ;; Windows_* ) NULL=NUL @@ -57,11 +49,11 @@ THIS_DIR=`pwd` -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -version +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -version ${TESTJAVA}${FS}bin${FS}jar xvf ${TESTSRC}${FS}testcase.jar -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} OOMCrashClass1960_2 > test.out 2>&1 +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} OOMCrashClass1960_2 > test.out 2>&1 if [ -s core -o -s "hs_*.log" ] then diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/6929067/Test6929067.sh --- a/test/runtime/6929067/Test6929067.sh Fri Jun 08 12:49:12 2012 -0400 +++ b/test/runtime/6929067/Test6929067.sh Thu Aug 02 14:29:12 2012 -0700 @@ -19,8 +19,6 @@ echo "If this is incorrect, try setting the variable manually." fi -BIT_FLAG="" - # set platform-dependent variables OS=`uname -s` case "$OS" in @@ -42,7 +40,19 @@ ;; esac -LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/i386/client:/usr/openwin/lib:/usr/dt/lib:/usr/lib:$LD_LIBRARY_PATH +# Choose arch: i386 or amd64 (test is Linux-specific) +# Cannot simply look at TESTVMOPTS as -d64 is not +# passed if there is only a 64-bit JVM available. + +${TESTJAVA}/bin/java ${TESTVMOPTS} -version 2>1 | grep "64-Bit" >/dev/null +if [ "$?" = "0" ] +then + ARCH=amd64 +else + ARCH=i386 +fi + +LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${ARCH}/client:/usr/openwin/lib:/usr/dt/lib:/usr/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH THIS_DIR=`pwd` @@ -51,10 +61,10 @@ cp ${TESTSRC}${FS}T.java ${THIS_DIR} -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -fullversion +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -fullversion ${TESTJAVA}${FS}bin${FS}javac T.java -gcc -o invoke -I${TESTJAVA}/include -I${TESTJAVA}/include/linux invoke.c ${TESTJAVA}/jre/lib/i386/client/libjvm.so +gcc -o invoke -I${TESTJAVA}/include -I${TESTJAVA}/include/linux invoke.c ${TESTJAVA}/jre/lib/${ARCH}/client/libjvm.so ./invoke exit $? diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/7020373/Test7020373.sh --- a/test/runtime/7020373/Test7020373.sh Fri Jun 08 12:49:12 2012 -0400 +++ b/test/runtime/7020373/Test7020373.sh Thu Aug 02 14:29:12 2012 -0700 @@ -2,10 +2,10 @@ ## ## @test -## @bug 7020373 7055247 +## @bug 7020373 7055247 7053586 7185550 ## @key cte_test ## @summary JSR rewriting can overflow memory address size variables -## @ignore Ignore it until 7053586 fixed +## @ignore Ignore it as 7053586 test uses lots of memory. See bug report for detail. ## @run shell Test7020373.sh ## @@ -27,21 +27,13 @@ exit 1 fi -BIT_FLAG="" - # set platform-dependent variables OS=`uname -s` case "$OS" in - SunOS | Linux ) + SunOS | Linux | Darwin ) NULL=/dev/null PS=":" FS="/" - ## for solaris, linux it's HOME - FILE_LOCATION=$HOME - if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ] - then - BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT | grep -v '^#'` - fi ;; Windows_* ) NULL=NUL @@ -59,11 +51,11 @@ THIS_DIR=`pwd` -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -version +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -version ${TESTJAVA}${FS}bin${FS}jar xvf ${TESTSRC}${FS}testcase.jar -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} OOMCrashClass4000_1 > test.out 2>&1 +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} OOMCrashClass4000_1 > test.out 2>&1 cat test.out @@ -74,7 +66,7 @@ echo "Test Failed" exit 1 else - grep "java.lang.LinkageError" test.out + egrep "java.lang.LinkageError|java.lang.NoSuchMethodError|Main method not found in class OOMCrashClass4000_1|insufficient memory" test.out if [ $? = 0 ] then echo "Test Passed" diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/7020373/testcase.jar Binary file test/runtime/7020373/testcase.jar has changed diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/7051189/Xchecksig.sh --- a/test/runtime/7051189/Xchecksig.sh Fri Jun 08 12:49:12 2012 -0400 +++ b/test/runtime/7051189/Xchecksig.sh Thu Aug 02 14:29:12 2012 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -41,18 +41,10 @@ fi -BIT_FLAG="" - OS=`uname -s` case "$OS" in SunOS | Linux ) FS="/" - ## for solaris, linux it's HOME - FILE_LOCATION=$HOME - if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ] - then - BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT` - fi ;; Windows_* ) printf "Not testing libjsig.so on Windows. PASSED.\n " @@ -69,20 +61,16 @@ # LD_PRELOAD arch needs to match the binary we run, so run the java # 64-bit binary directly if we are testing 64-bit (bin/ARCH/java). - -# However JPRT runs: .../solaris_x64_5.10-debug/bin/java -# ..which is 32-bit, when it has built the 64-bit version to test. -# -# How does this script know we are meant to run the 64-bit version? -# Can check for the path of the binary containing "x64" on Solaris. +# Check if TESTVMOPS contains -d64, but cannot use +# java ${TESTVMOPS} to run "java -d64" with LD_PRELOAD. if [ ${OS} -eq "SunOS" ] then - printf "SunOS test JAVA=${JAVA}" - printf ${JAVA} | grep x64 > /dev/null + printf "SunOS test TESTVMOPTS = ${TESTVMOPTS}" + printf ${TESTVMOPTS} | grep d64 > /dev/null if [ $? -eq 0 ] then - printf "SunOS x64 test, forcing -d64\n" + printf "SunOS 64-bit test\n" BIT_FLAG=-d64 fi fi @@ -127,20 +115,19 @@ printf "Skipping test: libjsig missing for given architecture: ${LIBJSIG}\n" exit 0 fi -# Use java -version to test, java version info appeas on stderr, +# Use java -version to test, java version info appears on stderr, # the libjsig message we are removing appears on stdout. # grep returns zero meaning found, non-zero means not found: -LD_PRELOAD=${LIBJSIG} ${JAVA} ${BIT_FLAG} -Xcheck:jni -version 2>&1 | grep "libjsig is activated" - +LD_PRELOAD=${LIBJSIG} ${JAVA} ${TESTVMOPTS} -Xcheck:jni -version 2>&1 | grep "libjsig is activated" if [ $? -eq 0 ]; then printf "Failed: -Xcheck:jni prints message when libjsig.so is loaded.\n" exit 1 fi -LD_PRELOAD=${LIBJSIG} ${JAVA} ${BIT_FLAG} -Xcheck:jni -verbose:jni -version 2>&1 | grep "libjsig is activated" +LD_PRELOAD=${LIBJSIG} ${JAVA} ${TESTVMOPTS} -Xcheck:jni -verbose:jni -version 2>&1 | grep "libjsig is activated" if [ $? != 0 ]; then printf "Failed: -Xcheck:jni does not print message when libjsig.so is loaded and -verbose:jni is set.\n" exit 1 diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/7158800/BadUtf8.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/runtime/7158800/BadUtf8.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,1254 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7158800 + * @summary Test that 1200 symbols that hash to the same value triggers + * the symbol table alternate hashing mechanism. There isn't actually a + * way to verify this. + */ +// +// Generate large number of strings that hash to the same value +// to slow down symbol table lookup. + +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; + +public class BadUtf8 { +static String[] strings = { + "EOcLKvbddZyPxYpb", + "DncLKvbdPxmAGrqj", + "DoCjjvbdpxoIHQdY", + "EPCkKvbdqYoHfqEY", + "DnbkKvbdezvYdiUX", + "DnbjjvbdeEoRbXCj", + "EObkKvbdbsCkUEKB", + "EOcLKvbdnUtyjiqf", + "DncLKvbdRWnDcMHc", + "DoCkKvbdrSUkOLAm", + "DncLKvbdfNFwGmJk", + "EPDLKvbdvAdYroFI", + "DoDLKvbdiGibyViu", + "DncLKvbdYqNEhmFR", + "DoCkKvbdEARhlzXX", + "DncLKvbdSZjHsCvA", + "DncKjvbdqTsgRqkU", + "DnbjjvbdqAiFAXHd", + "EPDKjvbdGcjvJaij", + "DnbkKvbdwtldpxkn", + "DoDKjvbdYkrETnMN", + "EPCjjvbdbBWEfQQX", + "EPCjjvbduMXwAtBX", + "DncLKvbdbsCkTcia", + "DoCjjvbdczYpYZRC", + "EOcKjvbdFeiqmhsq", + "DoCkKvbdKCicQibx", + "EOcKjvbdZLrEUOLm", + "DoCjjvbdaNKbStmH", + "DoDKjvbdJbjDQjDY", + "EPCkKvbdemFwGmKL", + "EPDKjvbdZQleImEq", + "DncKjvbdZjShPfbG", + "DnbjjvbdqYnhHREY", + "DoCkKvbdaRfDIUGL", + "DoDKjvbdLrWlyuQz", + "DnbjjvbdZisHofaf", + "EObjjvbdhtydvrUb", + "DnbjjvbdRotHKGEX", + "EObjjvbdNeEThhkE", + "EPCjjvbdZtJJZESn", + "DoDKjvbdnPyxvLYb", + "EPDKjvbdeEoRbWbj", + "EOcLKvbdFxttaEXb", + "EObjjvbddwystRez", + "EPCjjvbdJpzEnenF", + "DnbkKvbdTppntuIN", + "EPCkKvbdTukpKUBR", + "DnbkKvbdhlFEOUcZ", + "EObkKvbdlhdUQuRa", + "DnbjjvbdkClKqHUg", + "EOcKjvbdqTtGqqkU", + "DncKjvbdtkwvaUBX", + "DoDKjvbdsQWOjCuf", + "DncLKvbdEKIJuwjA", + "DncKjvbdGLErcIMu", + "EOcLKvbdNPwpumfs", + "EObkKvbdnVUzLJrG", + "DoCkKvbdcTDKsdKB", + "DncKjvbdKRZdoFme", + "EOcLKvbdemFvgNKL", + "EPCkKvbdznopdblY", + "EPDLKvbdOYPVzdOU", + "DnbjjvbdsZlPsAhO", + "DoDLKvbdKCjDRKDY", + "DoCkKvbdhuZeXSVC", + "EPDKjvbdOStVgEtp", + "DncLKvbdvwMAvBWV", + "EPDKjvbdBcoaWJlf", + "EOcKjvbdZxdKODMS", + "DoCjjvbdbsCkTcjB", + "EOcLKvbdwWlAuaWV", + "DnbjjvbdFejRnJUR", + "DnbjjvbdmIdTqVSB", + "DnbkKvbdqBIeAWhE", + "DncKjvbdrMzJyMIJ", + "DoCkKvbdZGvdAOsJ", + "DncLKvbdjggLfFnL", + "DoCjjvbdYqNFJMdq", + "DoCkKvbdqZPHfqDx", + "DncLKvbdOEdThiLE", + "DoCkKvbdZirgpGaf", + "EPDLKvbdziuQPdSt", + "EObkKvbdKQyeOenF", + "DoDLKvbduaDySndh", + "DoCjjvbdVUNUGLvK", + "DncKjvbdAMhYrvzY", + "DnbkKvbdnQZxvKxb", + "EPCjjvbdBhjakJFj", + "DncLKvbdmfeYNNfy", + "DoDLKvbdjlbLydfo", + "DoDLKvbdpyPIGpcx", + "EOcLKvbdnVUzLJqf", + "DoCjjvbdmJETqVSB", + "DoDLKvbdJTZAsMxM", + "DoCkKvbdnQZxvLZC", + "DoDKjvbdACqwizJQ", + "DncKjvbdvBEZSoFI", + "DncKjvbdGckVjCJj", + "DncLKvbdiMFENtcZ", + "Dnbjjvbdjuvmcaww", + "DnbkKvbdZyEKNblS", + "DoCjjvbduMYXBUBX", + "DnbjjvbdFWYopNJe", + "DoDKjvbdelfXGljL", + "DnbjjvbdakLenmcA", + "EPDKjvbdfILWRmpg", + "EObjjvbdSLYeuHLT", + "DoCjjvbdMfbolotk", + "EPDLKvbdrRuKnKaN", + "EOcKjvbdyzdnRhIh", + "DoDLKvbdGAoRZJzm", + "DoCjjvbdhlFDnUcZ", + "EPDLKvbdmpZyVkYb", + "DncKjvbdTpqPUuIN", + "DncLKvbdHDjvJaij", + "EPDLKvbdYlRcsmkm", + "EPDLKvbdvlvAMdFN", + "DncKjvbdIsZArmYM", + "EOcLKvbdegjuqnQg", + "EOcLKvbdZQmFJNFR", + "DoCjjvbdZxdJmcMS", + "EPCkKvbdlZTSTYgU", + "DoDKjvbdqceJPnWB", + "DncLKvbdVgwuxGxz", + "DncKjvbdDnbkLXDE", + "EPDLKvbdatbHYKsh", + "DncKjvbdEzsqFLbi", + "EPDLKvbdnVVZkKRf", + "EOcKjvbdKeegbBQu", + "EPCkKvbdKfGHaaRV", + "EPDKjvbdmIctRVRa", + "EPCjjvbdRMxBxnUz", + "DnbjjvbdJYTbILpp", + "EPCkKvbdTAEiHbPE", + "EOcLKvbdfelZnGgA", + "DoCjjvbdOStWGeUp", + "EOcLKvbdemGXHNJk", + "DoDKjvbdYTMAmUOx", + "EPCkKvbdpyOhGpcx", + "EPCkKvbdAMgxsWzY", + "DnbjjvbdYkrETnMN", + "EPDLKvbdUQqPUtgm", + "DncKjvbdehKurNqH", + "DoCjjvbdZMSETnLm", + "DoDKjvbdIHGyyXwg", + "EObjjvbdXGYzUAPT", + "DoCjjvbdhbPCeWqR", + "DoCkKvbdKNADzGuB", + "DnbjjvbdFeirOJTq", + "DncLKvbdaRecHtFk", + "DnbkKvbdzoPpeClY", + "EObkKvbdZRMeJMeR", + "DnbjjvbdYfvdAPSi", + "DncLKvbdJcKCqJcY", + "EOcLKvbdqvokbhyR", + "DoDLKvbdrRuLNjaN", + "DoCjjvbdTlWPBWOi", + "DoCkKvbdjvWnEBxX", + "DoDLKvbdTkunaVoJ", + "DoCkKvbdQZNAHTSK", + "EObjjvbdqwPkbhyR", + "EOcLKvbdNHDPlpUk", + "DncLKvbdIHHZxxYH", + "DncLKvbdtkxXAtAw", + "DncLKvbdSCEFMJZL", + "DnbjjvbdZQmEhldq", + "DoCjjvbdNGbolotk", + "DnbjjvbdnCKWwnmu", + "DncLKvbdzHZMANEw", + "DoDKjvbdmttykJrG", + "DnbkKvbdlrZUzSci", + "EPDKjvbdSKyGVHKs", + "DoCjjvbdKVuGEFGi", + "EPCjjvbdCIkBkIej", + "DncLKvbdzHZMAMeX", + "DnbkKvbdaSFbgsek", + "DncLKvbdHDjujBij", + "DoDKjvbdGZVUaDwb", + "DnbjjvbdZnnJFEzK", + "DoCkKvbdtcDUwWOo", + "DoCkKvbdlBMoNALA", + "EOcKjvbdNsUWHFUp", + "DoDLKvbdVUNUFlVj", + "DnbkKvbdhkdcnUcZ", + "DncLKvbdLiBkqYAS", + "EOcKjvbdzoPpdcLx", + "EPDKjvbdijGIJmXr", + "EOcKjvbdZisHofaf", + "DoDLKvbdeOdrkUUS", + "DoDLKvbdnPyxvKxb", + "EPDKjvbdIxUBhMRQ", + "DncLKvbdlhctRUqa", + "DoDLKvbdmgFXlnGy", + "DncKjvbdCJKbKiGK", + "EOcLKvbddndrjtUS", + "DnbjjvbdkDLjqGuH", + "DncKjvbdmIcsptqa", + "DoCkKvbdvvlAvBWV", + "EObjjvbdjblLQftg", + "DnbjjvbdCEQBWKMf", + "DnbjjvbdBdPaVilf", + "DoCkKvbdZxcjODLr", + "DoCkKvbdEObjjwCd", + "EPDKjvbdyTNhlqbH", + "EPCkKvbdUMVoAvPJ", + "DncKjvbdUxhUZjoO", + "DncKjvbdqqtjmkAm", + "DncKjvbdKfGICBRV", + "EPCjjvbdVrOXaeLc", + "EPDLKvbdwXLaWBWV", + "EPCkKvbdjblKqHUg", + "DnbjjvbduDCuWuoP", + "EPDKjvbdNGbpMouL", + "EObjjvbdBcoaVjNG", + "DncLKvbdrWpMDIxq", + "DncLKvbdhaoCdwRR", + "DnbkKvbdFxtuBDwb", + "DncKjvbdIjEAKPgE", + "EOcLKvbduCbuXVoP", + "DoDKjvbdZtIiZDsO", + "DnbjjvbdEztRElCi", + "DncLKvbdxmsHwsJD", + "DnbjjvbdRbEElIxk", + "DoDKjvbdWHwvXgYz", + "EOcKjvbdQlwbYnUz", + "EOcLKvbdVTltFkuj", + "DncKjvbdliETptqa", + "DnbkKvbddoErjtTr", + "DoCkKvbdgPazvdXh", + "DncKjvbdySmhlqag", + "DoCjjvbdbPgHDkzd", + "DoCkKvbdFWZPomKF", + "EObjjvbdssSSxydc", + "EObjjvbdzQnliJwA", + "EObkKvbdKCjCpibx", + "EPCjjvbdpyOhHREY", + "DncLKvbddjJqutzn", + "EObkKvbdBdQAujMf", + "EPCkKvbdLAjflbXq", + "DncLKvbdLBLGlaxR", + "DoDLKvbdrpWPJbuf", + "DoCjjvbdEKHiuxKA", + "DoCjjvbdXsMAlsnx", + "EObkKvbdptTgSSLU", + "DoDKjvbdnHFXmNfy", + "DncKjvbdCJKbKhej", + "EPCjjvbdhlEdOUby", + "EOcKjvbdKWUfEFGi", + "DoDKjvbdZQmFJMdq", + "EPCjjvbdiGjDZWKV", + "EObkKvbdVAbQrprZ", + "DoDKjvbdfekzNgHA", + "DoDLKvbdnHEwlmgZ", + "DncKjvbdwzHeexEr", + "DoCjjvbdmpZxujyC", + "EPDKjvbdwMvAMcdm", + "DoCjjvbdfHkVrNqH", + "EPCkKvbdYzbfRiuy", + "EPCkKvbdZtIiZDrn", + "DnbjjvbdjvWnDbYX", + "DoCjjvbdOStVgEtp", + "EPDLKvbdZMSETmlN", + "EPDKjvbdBhjajhej", + "EPCjjvbddoFTLUUS", + "DnbkKvbdsQVoJcWG", + "EPCjjvbdrEFJQNvB", + "DoCjjvbdMpYRWOGs", + "EOcLKvbdZirgpHBf", + "EPDLKvbdyOTIXsJD", + "DoCkKvbdKRZdnfNe", + "DnbjjvbdbBWFFoow", + "EPCjjvbdgFlZnHHA", + "DnbkKvbdGGJrOIsq", + "DoDLKvbduDCtwWPP", + "EObjjvbdNddUIhjd", + "DnbjjvbdxsNiMqag", + "EObjjvbddeOrCWbj", + "EObjjvbdPxmAGsRj", + "EOcLKvbddeOrCXDK", + "DoDLKvbddeOrBwCj", + "DoCjjvbdVqnYCElD", + "DnbkKvbdUyIUZjoO", + "EObjjvbdeFOrCXDK", + "EObkKvbdVrNxCFLc", + "EObjjvbdTfzmkwWF", + "EOcKjvbdIHGzZYYH", + "EPDKjvbdtbbuXWPP", + "DoCjjvbdZisIQHBf", + "EObjjvbdbsCkUDjB", + "EPCkKvbdVwJXudFH", + "EPDKjvbdrouoKDVf", + "EPCkKvbdFyVVBEYC", + "DncLKvbdZnnIeEzK", + "EPDLKvbdxVNFQxkn", + "DoDKjvbdpxnggRDx", + "DoDLKvbdqZOgfpcx", + "DncKjvbdCIjakJGK", + "EPCkKvbdCJLBjhej", + "DoDLKvbdnPzYvKxb", + "EOcKjvbdqTsgSRkU", + "EOcLKvbdLBLGlaxR", + "DoDLKvbdcbTMrAUN", + "DncLKvbdzitoodSt", + "DoDKjvbdJvUfDdfi", + "EOcLKvbdHDjvKCJj", + "EPCkKvbdeOeTKssr", + "DnbkKvbdlYrqsYft", + "DncLKvbdiiehKMxS", + "DncKjvbdURQoVUhN", + "DnbkKvbduMYXBUAw", + "DoDLKvbdSPtHJfEX", + "EObkKvbdqBJFAWgd", + "EOcKjvbdFpATWgFy", + "DoDLKvbdBsBDTfXS", + "DncKjvbdjhHLfFmk", + "DoCjjvbdCJKakIfK", + "DnbkKvbddoFSjtTr", + "EObkKvbdANIYsWzY", + "EObjjvbdCTAbtFvr", + "EObjjvbdrRtkOLAm", + "DnbkKvbdkxsSTYgU", + "DoCjjvbdnBiwXnmu", + "EObjjvbdwtmEqYlO", + "EPDKjvbdrylQTAhO", + "DoDLKvbdtbbtvvOo", + "EPCjjvbdZLrETmlN", + "EPDLKvbdWXJYWDdg", + "DoCkKvbdKQzFOfOF", + "EPCjjvbdwzIFfXeS", + "DncKjvbdRjyFuHLT", + "EPDLKvbdULunaWPJ", + "DncKjvbdUxhTykOn", + "DnbkKvbdJcKCqKDY", + "EPDLKvbdcbSmSATm", + "DnbkKvbdegjurNqH", + "EPDKjvbdZjTIQGbG", + "EPCjjvbdiLddNuCy", + "DoCjjvbdZQldiNEq", + "EOcLKvbdakMGPODA", + "EObjjvbdnHEwlmgZ", + "EOcLKvbdBsAcUGXS", + "EPCkKvbdiVZdwSUb", + "EOcLKvbddCTNSAUN", + "DnbkKvbdEXxMUUUM", + "DncKjvbdYpldiMeR", + "DoDKjvbdNddTiIjd", + "DoDLKvbdZLqdUNlN", + "EPCkKvbdiBncFWpq", + "DncLKvbdiCPDEvqR", + "EOcKjvbdUyHszKoO", + "DncKjvbdhtydvqtb", + "EPCjjvbdpxoHgQcx", + "EObkKvbdkWWnDaxX", + "DnbjjvbdBhkBkJFj", + "DoCkKvbdRacdkhyL", + "EOcLKvbdZjTHpHCG", + "EPCkKvbdMowqWOGs", + "DncLKvbdegjurNpg", + "EObjjvbdfMfWfmKL", + "EPDLKvbdZirgpGaf", + "DoDLKvbdiZuFlQnG", + "DncLKvbdFxuVAcxC", + "EObkKvbdZisHofaf", + "EOcKjvbdJSyBSmYM", + "EPDLKvbdVYgtZkPO", + "EOcKjvbdRbEFMJYk", + "DncLKvbdrEFIonWB", + "DncKjvbdKDJbqJcY", + "EOcLKvbdhfjCxuiu", + "EObjjvbdLLAhWAKZ", + "DoCkKvbdRXNcblID", + "DoDLKvbdcbSmSATm", + "EOcLKvbdwWlAvAuu", + "EObkKvbdiBnbdvpq", + "DoCkKvbdNQXpumgT", + "DncLKvbdkVwOECYX", + "DnbkKvbdfoazwDxI", + "DoDLKvbdbBWFFpPw", + "DoDLKvbdvBDxsPEh", + "EPDKjvbdJqZdoFme", + "DoDLKvbdIryArmXl", + "EPCjjvbdANIZSwZx", + "EPCkKvbdVhYVxGxz", + "DncKjvbdLAjgNCYR", + "DncKjvbdxxIjCQZk", + "DncKjvbdbiNKKewY", + "EPCjjvbdlrZVZsEJ", + "EPDKjvbdIryAsMwl", + "DoCkKvbdtAHRIAAr", + "EPDKjvbdJmAEZfuB", + "EPCkKvbdZjSgogBf", + "DoDLKvbdOXnuzcnU", + "DnbkKvbdehKvRnQg", + "EObjjvbdZyDimbkr", + "DoDKjvbdmajWwoOV", + "EOcKjvbdkMalZeHP", + "EOcKjvbdIjEAJpHE", + "EPCkKvbdDihKVxKA", + "DncKjvbdNddUIiKd", + "EObjjvbdqdFIpOWB", + "DoCkKvbdxnShXsJD", + "DoDLKvbdjmBkzEfo", + "EOcLKvbdatagYLTh", + "DoCjjvbdVhYVxHYz", + "DnbjjvbdJbjDRKDY", + "EPCjjvbdLBLHNCYR", + "DnbjjvbdnGeYNOGy", + "EOcLKvbdUsmTekvK", + "EPCjjvbdtkxXBTaX", + "EPCjjvbdzoPqFCkx", + "DncKjvbdCIjbKhej", + "DncKjvbdZLqdTmkm", + "DoDKjvbdsPunicVf", + "EOcKjvbdmgFXmNgZ", + "EObkKvbdiMFENuCy", + "DoDKjvbdhanbeXRR", + "EObkKvbdACqwiyhp", + "DncKjvbdZisIQHBf", + "EPCjjvbdgQBzwDwh", + "DnbjjvbdyYJJaoyk", + "DoDKjvbdxUldqZMO", + "EObkKvbdkClLQgVH", + "EPCjjvbdZQldiMeR", + "EPDLKvbdZyEKOClS", + "EPDLKvbdcIlikFvx", + "DoDKjvbdrzMQTBHn", + "DnbjjvbdVYgtZkPO", + "DoDLKvbdHEKuiajK", + "EPCkKvbdczZQXxqC", + "DoDKjvbdrDdiQNua", + "DncLKvbdcImKLGWx", + "DoCjjvbdVYgtZkPO", + "EPDLKvbdZnnIeFZj", + "EPDKjvbdMIakqYAS", + "DoCkKvbdSLYfUgLT", + "EPDLKvbdiCObdvpq", + "DnbjjvbdRpUHKFcw", + "DoDLKvbdIHHZyYXg", + "EPCjjvbdypoMhiwA", + "DnbkKvbdCEPaVjMf", + "DnbkKvbderAvzlDP", + "DnbkKvbdZQleImFR", + "EOcKjvbdKRZdneme", + "DoDLKvbdiBnbeXQq", + "DncLKvbdEPDKjvcE", + "EOcLKvbdauCGwkTh", + "DncLKvbdEvZQPmJe", + "EPCkKvbdURQnuVIN", + "DncLKvbdegjvSOQg", + "EPCjjvbdKaKgMawq", + "DnbkKvbdRzKISbvA", + "DncLKvbdiLdcnUcZ", + "EPDLKvbdkDMKpfuH", + "DoDLKvbdRbDdkhyL", + "DnbjjvbdDwxMUUTl", + "DnbkKvbdrpWPKCuf", + "DnbkKvbdNVSqjmAX", + "DoDKjvbdRbDeMIxk", + "EOcLKvbdcyxpXyRC", + "DncLKvbdRMwbYnUz", + "EObjjvbdqlzJxlHi", + "DoCkKvbdJYUCIMQp", + "DncLKvbdLZQjSzuG", + "EOcKjvbdxVNEqYkn", + "DnbkKvbdZoOIeFZj", + "DoCjjvbdBraCtFwS", + "EOcLKvbdliDsqVSB", + "EPCkKvbdeATqNXif", + "DncLKvbdkMbLydgP", + "EObjjvbdZxdJmbkr", + "DoCjjvbdraellHLZ", + "EObkKvbduDCuWvPP", + "DoCkKvbdpstGrSLU", + "DoCjjvbdLGFgbBQu", + "DnbkKvbdhtzFWquC", + "EObjjvbdoAKztHdO", + "EPDLKvbdatafxKtI", + "EPDKjvbdkWXNcaww", + "DoCkKvbdwkXEHzzG", + "EObkKvbdmgEwmNgZ", + "DncKjvbdBiLCLJFj", + "DoCjjvbdeOdsKssr", + "EOcLKvbdfILWSORH", + "EObkKvbdCDpAujMf", + "EPDKjvbdKDKDQibx", + "DoDKjvbdVUMtGLuj", + "EObkKvbdrXQMCiYq", + "DncKjvbdePEsLTtS", + "DncLKvbdDxYLtUTl", + "EPCkKvbdGYuVBEYC", + "DncLKvbdNeEUIiKd", + "EPCkKvbdpxoIHRDx", + "EObjjvbdFkEsDHlu", + "EObjjvbdssSSxzFD", + "DoCkKvbdUtNTfMVj", + "DnbjjvbdJcKDRKDY", + "DncKjvbdqiAKEmOe", + "DoDKjvbdtlXwAtBX", + "DnbkKvbdxmsIYTIc", + "EObkKvbdLrXMzUpz", + "DoCjjvbdkxsSSxft", + "DncKjvbdQlwaxnUz", + "EObkKvbdjhGlFfNk", + "EPCkKvbdxsNhmRag", + "DoDLKvbdMfcPmQUk", + "DoDKjvbdQvnEDLhD", + "EObjjvbdVgxVxHYz", + "DoDLKvbdlrYtyrdJ", + "DoCjjvbdezvYeIsw", + "DncLKvbdNddTiIjd", + "EPDLKvbdGGJrNiUR", + "EPDLKvbdRzJhTDWA", + "EPCjjvbdvvkaWBVu", + "EOcKjvbdRXNdCkgc", + "EOcKjvbdQZNAHTSK", + "EPCkKvbdsCGNLfkZ", + "EOcLKvbdDwwktTsl", + "EOcLKvbdqlzJyLgi", + "EOcLKvbdxsNiMqag", + "EOcLKvbdhzVFlROG", + "EOcKjvbdEztRFMCi", + "DnbkKvbdqiAJdmPF", + "EPDLKvbdjcMKqGtg", + "EObkKvbdTlWOaWOi", + "EPDLKvbdURRPUuHm", + "DoDKjvbdelfWgNKL", + "EOcLKvbdGAnqZJzm", + "EObjjvbdGZUuAdXb", + "DoDLKvbduLwwAtAw", + "DoCjjvbdZjTIQGbG", + "EPCjjvbdRNXbYnUz", + "EPDLKvbdiLeENtby", + "EObjjvbdMowpunGs", + "EOcKjvbdbiNJjevx", + "DoDKjvbdEYYLstTl", + "DoDLKvbdqUTfrRjt", + "DoDKjvbdbsCkUEJa", + "DoDKjvbdXsMBNUPY", + "EPCjjvbdRNXaxnUz", + "DoDLKvbdNGcQNQUk", + "DnbjjvbdEARiMywX", + "EPDKjvbdSKxfUfkT", + "DncKjvbdhtyeXRtb", + "DncKjvbdZLqcsnLm", + "EObkKvbdZnmheEzK", + "EObjjvbdtbcUvuno", + "DnbjjvbdrzMQTBHn", + "DnbjjvbdDwwktTsl", + "EPDKjvbdkxsSTYgU", + "DoDKjvbdIryArlxM", + "DoDKjvbdnBivxOnV", + "DoDKjvbdeATplwif", + "EOcLKvbdKeegbApu", + "EPCjjvbdMgDQMotk", + "DoCjjvbduCbtwWOo", + "DnbkKvbdyNsHwrhc", + "DnbkKvbdtvNxJpsA", + "EOcLKvbdqAheAWgd", + "DoCkKvbdURQoUtgm", + "EOcKjvbdqceIpOWB", + "DoCkKvbdVwIwudFH", + "DnbkKvbdbLMFnmcA", + "EOcLKvbdZjTHpHBf", + "EOcKjvbdRXNdCkhD", + "EPDLKvbdiHJcZViu", + "DoCjjvbdxxIjCPzL", + "DnbkKvbdBcpBWJmG", + "EPCkKvbdZyEKOCkr", + "EPDKjvbdOTUWHFVQ", + "DoCjjvbdIGgZxwwg", + "EPDLKvbdFjeSbhMu", + "EPDLKvbdhgKCxvJu", + "EOcLKvbdNsUWGdtp", + "EPDKjvbduVnXipsA", + "DncLKvbdGYuVBEXb", + "EPDLKvbdZtIhyESn", + "DoDKjvbdZxdJmcLr", + "DoCjjvbdUsltGLuj", + "DoDKjvbdDoDLKvbd", + "DncLKvbdrDdhpNvB", + "EPDLKvbdKCjDRJbx", + "DoDLKvbdxLWdHzyf", + "EObkKvbdrzMQTAhO", + "EOcLKvbdOFDtJJKd", + "EPCkKvbdrSVKmjaN", + "EOcKjvbdWWiYVdEg", + "EOcKjvbdWWhwvDdg", + "DncKjvbdpstHRqjt", + "EPCkKvbdKWVFceGi", + "DoCkKvbdZjShPfbG", + "DoCkKvbdSxKlNzkY", + "EPDLKvbdIwtCHkqQ", + "EOcKjvbdsCGNLgLZ", + "DncKjvbdzaAOfgCM", + "DoDLKvbdxmrhYSiD", + "DncLKvbdfMfWgMjL", + "EPDKjvbdqFdEsuaI", + "EOcLKvbdiLeDnUcZ", + "DoCjjvbdKVuFceHJ", + "DoCjjvbdfekzNgHA", + "EOcKjvbdOFEThiLE", + "EPDLKvbdqceJPnWB", + "DoDLKvbduCbtwWOo", + "DncKjvbdTqROtuIN", + "DncKjvbdpedFUWBI", + "DoDLKvbdrEFJQNua", + "DoDLKvbdyXhjCPyk", + "EPCkKvbdJYUBhLqQ", + "EPCkKvbdtcCuXVno", + "DoDLKvbdZLrEUOLm", + "EPCkKvbdpstGrRjt", + "DncLKvbddePSCXCj", + "EObkKvbdauCHXjsh", + "DoDLKvbdkHfkefNk", + "EObjjvbdMRwMzUpz", + "EObjjvbdaMkCTVNH", + "DoCkKvbdGGJrNhtR", + "EPDLKvbdvBDxrneI", + "EPDLKvbdIHHZxwxH", + "EOcLKvbdrJAJdmPF", + "EOcKjvbdGZUuAdXb", + "EOcLKvbdbUbHYLUI", + "DnbjjvbdJzofYEAN", + "EPDKjvbdFxtuBDxC", + "DnbkKvbdQvnDbkgc", + "EPDKjvbdJmADzGta", + "DoDKjvbdZRMdhleR", + "DnbkKvbdsrqsZZeD", + "EObkKvbdrovPJbuf", + "EPCjjvbddeOqbXCj", + "EObjjvbdtcDVXVoP", + "DncKjvbdMfbpNQVL", + "DoCkKvbdhbPCeXQq", + "DoCkKvbdNHComQVL", + "EObjjvbdvBDxroFI", + "EPCjjvbdnBivwoNu", + "EObjjvbdbhljKewY", + "EPDKjvbdZyDimcMS", + "EObkKvbdWSOXbElD", + "EOcKjvbdTfznMXVe", + "EPCjjvbdZtJJYcsO", + "DoCjjvbdRjxfVHLT", + "DoCkKvbdVTltGMVj", + "DncKjvbdYfwEAOri", + "DncKjvbdYkrEUOMN", + "EObkKvbdqGEEsuaI", + "DncLKvbdjJfHimXr", + "EPDLKvbddndsLUTr", + "DnbkKvbdqBJFAWhE", + "EPDLKvbdEOcKjwDE", + "EPCkKvbdtvOYJqTA", + "DncLKvbdkyTRsZHU", + "DoCjjvbdTppnuVIN", + "DncLKvbdwyhFeweS", + "DncKjvbdsBelkgKy", + "DoCjjvbdKDKCqJcY", + "DoCjjvbdkClKqHVH", + "DoCjjvbdcTCjtDia", + "EPDLKvbdUVkpJtAq", + "EPDLKvbdRyjITCvA", + "DnbjjvbdJuuFcdgJ", + "DoDKjvbdrJAJdmOe", + "DncKjvbdJcJbqKCx", + "DoDLKvbdJcJbqJcY", + "DoDKjvbdeEoSCXDK", + "DoDLKvbdSwjlNzkY", + "EObjjvbdzitopDrt", + "DoCkKvbdKWVGEEgJ", + "DncKjvbdpssfqrKt", + "EOcLKvbdUMWPBVoJ", + "DncKjvbdyzdmrIIh", + "EPCjjvbdxUldqZLn", + "DoDLKvbdySnImRbH", + "DoCjjvbdGdKvJaij", + "DoCkKvbdxZgeewdr", + "EObkKvbdiLddNuDZ", + "DnbjjvbdSCDdkiZL", + "DncKjvbdznpREcMY", + "EOcLKvbdaRebhTfL", + "DnbjjvbdZQldiMdq", + "EPCjjvbdbrbjtEKB", + "EOcKjvbdEARiMzXX", + "DoDLKvbdXrkaNTnx", + "EPCkKvbdQZNAHTRj", + "DoDLKvbdEzspeLcJ", + "EPCjjvbduVnYKRTA", + "EObjjvbdJXtBhMQp", + "EPDKjvbdeOdrjssr", + "EPCjjvbdLqwMytpz", + "EPDKjvbdUMVoBVoJ", + "DncKjvbdRpUGifDw", + "EPDLKvbdZyDinDLr", + "DnbkKvbdNrsufeVQ", + "EPCkKvbdZMSDtNlN", + "EPCkKvbdySnJNSCH", + "EPCjjvbdfMevfljL", + "DncLKvbdXsMBNTnx", + "DnbkKvbdpxoHfqDx", + "DncLKvbdUQpntthN", + "DncKjvbdIsZArlwl", + "DoDLKvbdZGwEAOsJ", + "EOcKjvbdVvhwvDdg", + "EOcLKvbduWNxJqTA", + "EPCjjvbdHEKvJaij", + "DoDKjvbdrpWOjCuf", + "DncLKvbdrpWOjDVf", + "DoCjjvbdIHGzYwwg", + "DoDLKvbdpxoIGqEY", + "DoDLKvbdJcJbqKDY", + "DoCjjvbdRWmdClHc", + "EPCjjvbdFWYopNJe", + "DncKjvbdmfdwlmfy", + "DoCkKvbdxUleQxlO", + "EObjjvbdnGdxMnGy", + "EPCjjvbdvvlAvBVu", + "DncLKvbddndsKssr", + "EObjjvbdZMRcsnLm", + "EOcKjvbdFxttaEXb", + "DncKjvbdVUNTfMVj", + "EOcLKvbdNrtWHFUp", + "DoDKjvbdwuMdqYlO", + "EPDLKvbdrXPkbhxq", + "EObjjvbdrEFIpNua", + "EObjjvbdziuQQDrt", + "EOcLKvbdqYoIGpcx", + "DnbjjvbdsQVoJcVf", + "EObkKvbdkDMKpgUg", + "EObjjvbdvBDyTPFI", + "DncKjvbduCbuWvOo", + "EPCjjvbdkVvnECYX", + "DncLKvbdZGvdAOri", + "DoCkKvbdrXPlDJZR", + "EOcLKvbduCcVWvOo", + "DoDKjvbdCEPaWJlf", + "EPDKjvbddoErjssr", + "DncKjvbdACqxKZiQ", + "EPCjjvbdUVlPitAq", + "EPDKjvbdjJfHjMxS", + "EObkKvbdAMhYsWzY", + "DoDKjvbdnBivxOmu", + "EOcLKvbdbiNKKfXY", + "EPDKjvbdYqMeIleR", + "EObkKvbdJmADygUa", + "EObjjvbdEPDLLWcE", + "EPCjjvbdrXPkcIxq", + "EOcLKvbdliDtQtqa", + "DoCjjvbdmoyxujyC", + "EPDLKvbddoFTLTsr", + "EOcLKvbdCWzdJEpW", + "DnbjjvbdrEEhpOWB", + "DoDKjvbdZLrDtNkm", + "EOcLKvbdLFfHbAqV", + "EOcKjvbdmttzLKSG", + "EOcLKvbdmbJvwoOV", + "EOcKjvbdUaCQrqSZ", + "DnbjjvbdmgExMnGy", + "EPDKjvbddndrkUUS", + "EObkKvbdDwwkstTl", + "DoCkKvbdcJMjLFwY", + "DnbjjvbdaNLBruMg", + "DoDLKvbdQYmAHTRj", + "DnbkKvbdsQWOicWG", + "EObkKvbdMRwMzUpz", + "DoDLKvbdZshiZDrn", + "EPDLKvbdnPzYujxb", + "EOcKjvbdCEQAujMf", + "EPDLKvbdKefHbApu", + "DoDLKvbdYpldiNFR", + "DoCkKvbdFWZQQNJe", + "DncLKvbdznpQeCkx", + "EOcKjvbdnQZxvKxb", + "DoCkKvbdVBBprpqy", + "DnbkKvbdZirhPfaf", + "DnbkKvbdegjvSNqH", + "EOcLKvbdqdEiPnWB", + "EObjjvbdBhkCKiGK", + "EObjjvbdxZgfGYFS", + "DnbjjvbdNQYQumgT", + "EPCjjvbdxsNhlrBg", + "DoCkKvbdQdDApRDr", + "DoCkKvbdxxIiaoyk", + "EPDKjvbdFeirNhtR", + "DoCjjvbdegjvSOQg", + "EObkKvbdqcdiQNvB", + "DncLKvbdiMEdNtcZ", + "DncLKvbdTqRPUthN", + "EPCkKvbdwygeexFS", + "DoDKjvbdyTOJMrBg", + "DncLKvbdeEoRavbj", + "EPCjjvbdtbcUvvOo", + "EObjjvbdKCicRJcY", + "EObjjvbdZyEKODMS", + "DnbjjvbdmJDtQtrB", + "DncLKvbdEARhlyvw", + "DnbjjvbdIxTbILqQ", + "EOcLKvbdwygefYFS", + "DoCjjvbdznoqFCkx", + "DoCjjvbdRpUGjGDw", + "DncKjvbdhzVGMQnG", + "EPCjjvbdhkeDnVCy", + "EObkKvbdOEdUIiKd", + "DncKjvbdrDeIomua", + "DncLKvbdiHJbxuiu", + "EPDKjvbddxZstRez", + "EPDLKvbdmSYuZrdJ", + "EObkKvbdVUNUFkvK", + "EPDLKvbdNeEUJIjd", + "DoCkKvbdiMEdNuCy", + "DoDLKvbdRDcApQcr", + "EPCjjvbdTlVoBVoJ", + "EObjjvbdLBKgNBwq", + "EPCkKvbdsCFllHKy", + "EObjjvbdnVUzLJqf", + "DoDKjvbdqrVLNkBN", + "DoCkKvbdqFcdtWBI", + "DncLKvbdbVCGxLTh", + "EOcLKvbdeFPSCXCj", + "EOcLKvbdRpTgKFdX", + "EObjjvbdznpQeDLx", + "EOcKjvbdjvXNcaxX", + "DnbjjvbdHDkWJbJj", + "DncKjvbdhkeENuDZ", + "DnbkKvbdnUtyjjSG", + "DoDKjvbdSQUHJfDw", + "DncKjvbdbUbHYLUI", + "EOcLKvbdNsTvGduQ", + "EPDLKvbdSZigsCvA", + "DncKjvbdMfcPlpUk", + "DoDLKvbdxrnIlrBg", + "DncKjvbdiLdcnVCy", + "EPCjjvbdmfeYNOHZ", + "DoCkKvbdjvWmcaxX", + "DoDKjvbdbUbHXkUI", + "DncKjvbdBhkBjiFj", + "DoDLKvbdNHColpVL", + "EOcKjvbdrykosAhO", + "DncLKvbdqGDeUVaI", + "DnbkKvbdhgJcZViu", + "DnbjjvbduLxXAtBX", + "EPCjjvbdYpleJNFR", + "EPDLKvbdQvmdClHc", + "DnbjjvbdJYTbIMRQ", + "DncLKvbdznpRFDMY", + "EOcLKvbdZnmiFEyj", + "DnbkKvbdrRuLOLAm", + "EObkKvbdhkeEOUby", + "DncLKvbdYlSEUOLm", + "DoCjjvbdhkdcmtby", + "DncLKvbdddnrCXDK", + "DoDLKvbdKaLHNCYR", + "EOcKjvbdcyxpYZQb", + "EPDLKvbdACqwjZhp", + "DoCkKvbdBsBDTevr", + "EObkKvbdeKJqvUzn", + "EObkKvbdcImJkGWx", + "DncLKvbdYSlAltOx", + "DncLKvbdlrYtyrdJ", + "EObkKvbdKxqJrztf", + "EOcKjvbdsQWPJcVf", + "DoDKjvbdkySqrxgU", + "EObjjvbdeEoRbXCj", + "EOcKjvbdHDkVjBij", + "DoDLKvbdCTBCsfXS", + "DoCjjvbdKCjDQibx", + "DoCjjvbdlhdTqUrB", + "DoDKjvbdTulQKTaR", + "DoCkKvbdRjxetfkT", + "EPCjjvbdEuyQQNKF", + "EPCjjvbdDoDKkXDE", + "DoCjjvbdsQWPJbuf", + "DoDKjvbdhuZdvqtb", + "EPDLKvbdiHKCyWJu", + "EPDLKvbdLFegaaQu", + "DoCjjvbdqZPHgRDx", + "DncKjvbdUWMPjUAq", + "DoDLKvbdTYKkmzjx", + "DoDKjvbdegjvSOQg", + "DnbkKvbdUtNTekvK", + "EObkKvbdNsTvGeVQ", + "DoDLKvbdfNFvgMjL", + "EOcLKvbdZQmEiNEq", + "EPDKjvbdBraDTfWr", + "EPDKjvbdNGcQNQVL", + "EPDLKvbdZyEKODMS", + "EOcKjvbdBvzdIdpW", + "EPCjjvbdACqwiyiQ", + "DoCjjvbddePRawCj", + "EPDKjvbdWWiXucdg", + "DoDKjvbdWexzUAPT", + "DnbjjvbdwXMBWBWV", + "EOcLKvbdUyHszLOn", + "EPCkKvbdOYOuzcnU", + "EPCkKvbdhancEwQq", + "DnbkKvbdjggLefOL", + "EPCkKvbdFjdsDIMu", + "DoDKjvbdrSUjmkBN", + "DoDLKvbdZjTIQGaf", + "DoDKjvbdMgDPmPtk", + "EPDLKvbdWRmwbFMD", + "DoCkKvbdzROmJKXA", + "DnbkKvbdrDdiQNvB", + "DnbjjvbduDCtwVoP", + "EOcLKvbdCIjbLJFj", + "EPDKjvbdXrkaMsnx", + "EPDKjvbdVhXvXfxz", + "DncKjvbdhbPDEwRR", + "DoCkKvbdpxoHgQcx", + "DoCkKvbduMXwBUBX", + "EObjjvbdNeEThhjd", + "DoCjjvbdirzhrkJz", + "DoDLKvbdaMkCTUlg", + "DncLKvbdWRnYBeLc", + "DnbjjvbdGBPRZJzm", + "EOcLKvbdeOeSjstS", + "DoDLKvbdmIctRVSB", + "DoCjjvbdZxdJnDMS", + "DoCkKvbdRpTgKFcw", + "DncLKvbdTukojTaR", + "DnbjjvbdKRZdoFme", + "DnbkKvbdURQoVUhN", + "DoDLKvbdyYJKBozL", + "EObkKvbdfNFwHMjL", + "DoDLKvbdZisIQHBf", + "EObkKvbdqFcdsuaI", + "DncLKvbdzoPqFDLx", + "DoDKjvbdSKxeuHLT", + "EPDKjvbdsBemLfjy", + "DoCjjvbdJbjCqJcY", + "DoCjjvbdNPxRVnGs", + "DncLKvbdGcjvJbKK", + "EOcKjvbdrWpMDIxq", + "EOcLKvbdQdDApQcr", + "DoDKjvbdZMRdTnLm", + "EOcLKvbddxZssrFz", + "EObjjvbdUtNTfLuj", + "EPCjjvbdLLBIWAKZ", + "DoCkKvbdgFlZmfgA", + "EPCjjvbdUVkoitAq", + "DoDKjvbdDncKjvcE", + "DoDLKvbdRpUHJfEX", + "EPDKjvbdLqvlzVQz", + "EPDKjvbdZMRdUOLm", + "EOcLKvbdCJLBkIfK", + "DncKjvbdaSFbhUFk", + "EPDLKvbdZoNheEzK", + "DncKjvbdUVlPjUAq", + "DnbkKvbdKNADyfuB", + "EObkKvbdZdwfzghb", + "EPDLKvbdZtIhxcrn", + "EObkKvbdGckViajK", + "DncLKvbdFfJqmiUR", + "DncKjvbdKWUfDdgJ", + "DoDKjvbdMtrqjmAX", + "EOcLKvbdsQWPKDVf", + "DoCjjvbdwtleRZMO", + "EObjjvbduaDxsPEh", + "EPDLKvbdKxqJrzuG", + "EOcKjvbdVAaprprZ", + "EObjjvbdEuxopMjF", + "DnbjjvbdyOTHwriD", + "EPDLKvbdrpVnibvG", + "EPDKjvbdkWWnDaww", + "DncLKvbdrXPkbiYq", + "DoDLKvbddxZssqez", + "EOcLKvbdHDkWJbJj", + "DncLKvbdEPCkLWcE", + "DnbkKvbdEXwkstTl", + "EObjjvbdqiAKEmOe", + "DncLKvbdjAQGaQGj", + "EPCjjvbdNeDtJJKd", + "EPCjjvbdvwMBWBVu", + "EPDKjvbdFejSOItR", + "EOcLKvbdNPwqWOHT", + "EPDKjvbdbsCjscia", + "EObkKvbdyYIiaoyk", + "DoDKjvbdLZQirzuG", + "EObjjvbdSLZGVGjs", + "DoCjjvbdAMgxsWzY", + "DoDLKvbdEObjjwCd", + "DnbkKvbdsPvOicWG", + "EPCkKvbdrJAKElne", + "EPCkKvbdauCGwjsh", + "DncLKvbdegkWRnQg", + "EPCkKvbdYpmEiNFR", + "DoDKjvbduaDxsPFI", + "DoCjjvbdcyxoxYqC", + "DoCkKvbdkMakzFHP", + "DnbjjvbdJbibqJbx", + "DnbkKvbdWWhxWDeH", + "DoCjjvbdssRsYzFD", + "DoDKjvbdpyPIHRDx", + "DncLKvbdwNWANDeN", + "DoDKjvbdJYUBglRQ", + "EObkKvbdXnRAYVVt", + "DoCjjvbdUWLpKTaR", + "DoDKjvbdTqROttgm", + "EPCkKvbdVqnXaeMD", + "EObjjvbdADRwiyiQ", + "DoDKjvbdlrZUyrci", + "EPDKjvbdvAdZSndh", + "DoCkKvbdzoQQeDLx", + "DnbkKvbdSQUGjFdX", + "EOcLKvbdqBJFAXIE", + "EObkKvbdSCEFLiZL", + "DnbjjvbdzoQQdcMY", + "DnbkKvbdpxngfqEY", + "DncLKvbdbsDLUEKB", + "DoCjjvbdXrlBMtOx", + "EObjjvbdKCjDQicY", + "DncLKvbdLrWlzUpz", + "EObjjvbdaaWEfQQX", + "EObjjvbdtlYWaTaX", + "DnbkKvbdMowpunGs", + "EObkKvbdSLYeuHKs", + "EObkKvbdTAEhhCOd", + "EPCkKvbdmSYtyrci", + "DncLKvbdYkqcsnLm", + "DoDLKvbdrylQTAgn", + "DncLKvbdJXtCIMRQ", + "EObkKvbdSBdElIyL", + "DoDLKvbdwygefYFS", + "DncKjvbdyXhibPzL", + "EPCjjvbduaDxsPFI", + "EObjjvbdZoNiFEzK", + "EPCjjvbdkNBkyeHP", + "EPCkKvbdWRnXadlD", + "DncLKvbdRWmdDLhD", + "DnbkKvbdmSYtzTDi", + "EOcKjvbdkVwODbXw", + "DncLKvbdQlxCZOUz", + "EObjjvbdbhlijfXY", + "EOcLKvbdXmqAXtut", + "EOcLKvbdmbKXXnnV", + "DoDKjvbdkHgMFfOL", + "EPCkKvbdfekymgHA", + "DoCjjvbdeKKRvUzn", + "DoDKjvbdkHfkefNk", + "DoCjjvbdyqPMiKXA", + "DnbjjvbdUQqOtuIN", + "EOcKjvbdEPCkKwDE", + "DoDLKvbdZRNFIleR", + "DnbjjvbdRacdlJZL", + "EOcLKvbdTukoitAq", + "EOcLKvbdZLrDtOMN", + "EOcLKvbdgKfzcGAE", + "EObjjvbdzjVQQESt", + "EOcLKvbdcIlijevx", + "EOcKjvbdGKdsDHmV", + "DncLKvbdKkBHvAJy", + "EOcKjvbdZMRctOLm", + "EPCkKvbdADRxKZiQ", + "EObjjvbdDwxLsssl", + "EPDLKvbdUxgszLPO", + "EPCkKvbdSQTfiedX", + "EPCjjvbdNeEUJIkE", + "DoDLKvbdpyPHfqDx", + "DnbkKvbdyOShXsJD", + "DncLKvbdLiBkpxAS", + "DoDKjvbdaaWEepQX", + "DoCjjvbdWSOYBeLc", + "EOcKjvbdLFegbAqV", + "EPDKjvbdffLzOGgA", + "EObkKvbdFkErbglu", + "DncLKvbdiZuFlROG", + "DncKjvbdegkWRnQg", + "DoDLKvbdQdDApRDr", + "EOcLKvbdeYZtURez", + "EObjjvbdrXQLcIxq", + "DoDLKvbdxZhGGXeS", + "DoDLKvbdGGKSOItR", + "EObjjvbdjhHLfFnL", + "EOcLKvbdUQpoUuHm", + "DoCkKvbdXrlBNUPY", + "DoDKjvbdJXtCIMRQ", + "DnbkKvbdZMSDsnLm", + "DncKjvbdCTBDUGWr", + "DncKjvbdbhlikGXY", + "DoDKjvbdXmqAYVWU", + "DnbjjvbdliDsqVRa", + "DnbkKvbdmajXYOnV", + "EObjjvbdJpyePGNe", + "DnbkKvbdCTAcUGXS", + "DoDLKvbdCDpBVjNG", + "EOcLKvbdxwhiaoyk", + "DoDKjvbdxVNFQyMO", + "EPCkKvbdVvhwvEEg", + "DnbkKvbdFWYoomJe", + "EOcKjvbdlrZUysEJ", + "EPDKjvbdqquKnKaN", + "DoCkKvbdTkunaVoJ", + "EOcLKvbdfHkVrOQg", + "EPDLKvbdiUzFWrUb", + "DoDLKvbdtAGqIABS", + "DoCkKvbdZRMdhmEq", + "DnbkKvbdNsUVfeVQ", + "EPDLKvbdqwPkbiZR", + "DoCkKvbdNUsSLNAX", + "DncKjvbdmpZxvKyC", + "EPCkKvbdLYqKSztf", + "EPDKjvbdZyEKODMS", + "EPDKjvbdNGbomPuL", + "DncKjvbdZMSDtNlN", + "EPCjjvbdTXjkmzjx", + "EObkKvbdBdQAvKMf", + "EOcLKvbdkySrTYgU", + "DnbkKvbdZoOIddzK", + "DoCkKvbdZMSDsmkm", + "EPCkKvbdCWzdIdpW", + "DncLKvbdBvzdIdov", + "DoCjjvbdaRfDHtFk", + "DnbkKvbdWeyZtAOs", + "DoDLKvbdnCJwYPOV", + "DoCjjvbdEYYLstUM", + "EOcLKvbdwtldqZMO", + "EPCjjvbdFVxoomKF", + "EObkKvbdyqPMhiwA", + "DoDLKvbdkxrrSxgU", + "DoCjjvbdeATqNYKG", + "DncLKvbdJKEAJpHE", + "DoCkKvbddndsLUTr", + "DnbjjvbdqFceUWBI", + "DoDLKvbdhkddOUby", + "DncKjvbdGKdrcIMu", + "EPCkKvbdelevflik", + "DoDKjvbdhaoDFWqR", + "DoCjjvbdYlSDsmlN", + "EPCjjvbdiZuGLpmf", + "EObkKvbdnCJvxPNu", + "DnbkKvbdhzUelRNf", + "DnbkKvbdZeYGzgiC", + "DoCkKvbdDnbkLWbd", + "DnbkKvbdnHFYMmfy", + "DoCjjvbdePEsKtTr", + "DnbjjvbdZQmEhleR", + "DnbkKvbdTkunaVoJ", + "DnbkKvbdFWZPpMjF", + "DoDKjvbdSwkMNzkY", + "EOcLKvbdwtldpyMO", + "EOcKjvbdhkdcmtby", + "DoCjjvbdNQXqWNfs", + "EPDKjvbdzjUpPdTU", + "DnbjjvbdqceJPnWB", + "EPDKjvbdUyHsyjoO", + "EPCkKvbdZshhxcsO", + "DncKjvbdqAiFAWgd", + "EObkKvbdgFkzOGgA", + "DncKjvbdmgFYNNgZ", + "DoDLKvbdDjHjWYKA", + "DnbjjvbdJbicRKCx", + "DnbkKvbdfNFwHMjL", + "EPCkKvbdWSNxBdlD", + "EPDLKvbdCJKbLJFj", + "EPDKjvbdEOcKkXDE", + "EPCkKvbdVrOYCElD", + "DnbjjvbdCIkBjhej", + "DoDLKvbddoFTKstS", + "DnbjjvbduDDVXVoP", + "EObkKvbdxwiKCPzL", + "DnbkKvbdZGvdAPTJ", + "DoDLKvbdBdPaVjNG", + "EOcKjvbdIHGzYwxH", + "DoCjjvbdGFjSNhsq", + "DnbjjvbdlYsSSxgU", + "EPCjjvbdqrUjnKaN", + "EOcLKvbdtvOXipsA", + "DoDLKvbdrounjCuf", + "DoCkKvbdFVyPomKF", + "EOcKjvbdNHCpNPtk", + "EPDLKvbdWeyZtAPT", + "EPDKjvbdjcLkQfuH", + "EOcLKvbdzHZMAMeX", + "DoCjjvbdUMWPBVni", + "EOcKjvbdHELWKBjK", + "DoDKjvbdMgComQUk", + "DnbkKvbdiGjDZWJu", + "DncKjvbdyqOmJKXA", + "DoDKjvbdVZITyjoO", + "DoCjjvbdzQoNJJwA", + "EOcLKvbdGAoQxizm", + "DoDKjvbdatagYKsh", + "EPDKjvbdSBceMJYk", + "DoDLKvbdMpYQvOHT", + "DncKjvbdiCOcFWpq", + "DoCjjvbdUGznLvvF", + "EPDLKvbdANIYrvyx", + "EPCjjvbdIwtCHkpp", + "EObkKvbdJSyBSmYM", + "EObkKvbdwuMdqYlO", + "EObjjvbdmuVZkKSG", + "DncLKvbdSPsfjFdX", + "DoDLKvbdSQUHJedX", + "DoDKjvbdiVZdwSUb", + "EPDLKvbdRjxfVGkT", + "EObjjvbdmpZyVkZC", + "DncLKvbdhzUelROG", + "EPCkKvbdxVMeRZMO", + "EOcKjvbdxxIiapZk", + "EOcKjvbdJSyBTNYM", + "EPDKjvbdMSXMzUpz", + "EObkKvbdJmADzHVB" }; + + public static void main(java.lang.String[] unused) { + try { + BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("bad.out")); + for (int i = 0; i < strings.length; i++) { + out.write(strings[i].getBytes()); + out.write("\n".getBytes()); + } + out.close(); + } catch (Exception e) { + System.out.println("Some exception occurred"); + } + } +} diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/7158800/InternTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/runtime/7158800/InternTest.java Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7158800 + * @run shell/timeout=400 Test7158800.sh + * @summary This test performs poorly if alternate hashing isn't used for + * string table. + * The timeout is handled by the shell file (which kills the process) + */ +import java.util.*; +import java.io.*; + +public class InternTest { + public static void main (String args[]) throws Exception { + final String badStringsFilename = "badstrings.txt"; + + if (args.length == 0 || (!args[0].equals("bad") && !args[0].equals("normal"))) { + System.out.println("Usage: java InternTest [normal|bad]"); + System.exit(1); + } + + FileInputStream fstream = new FileInputStream(badStringsFilename); + DataInputStream in = new DataInputStream(fstream); + BufferedReader br = new BufferedReader(new InputStreamReader(in)); + String toIntern, toDiscard; + int count = 0; + long current = 0L; + long last = System.currentTimeMillis(); + + if (args[0].equals("bad")) { + while ((toIntern = br.readLine()) != null) { + toDiscard = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString()); + toIntern.intern(); + count++; + if (count % 10000 == 0 && count != 0) { + current = System.currentTimeMillis(); + System.out.println(new Date(current) + ": interned " + count + " 0-hash strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)"); + last = current; + } + } + } + if (args[0].equals("normal")) { + while ((toDiscard = br.readLine()) != null) { // do the same read from the file to try and make the test fair + toIntern = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString()); + toIntern.intern(); + count++; + if (count % 10000 == 0 && count != 0) { + current = System.currentTimeMillis(); + System.out.println(new Date(current) + ": interned " + count + " normal strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)"); + last = current; + } + } + } + in.close(); + } +} + + diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/7158800/Test7158800.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/runtime/7158800/Test7158800.sh Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,91 @@ +#!/bin/sh +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# +# +# Run test for InternTest.java +# + +if [ "${TESTSRC}" = "" ] +then TESTSRC=. +fi + +if [ "${TESTJAVA}" = "" ] +then + PARENT=`dirname \`which java\`` + TESTJAVA=`dirname ${PARENT}` + echo "TESTJAVA not set, selecting " ${TESTJAVA} + echo "If this is incorrect, try setting the variable manually." +fi + +if [ "${TESTCLASSES}" = "" ] +then + echo "TESTCLASSES not set. Test cannot execute. Failed." + exit 1 +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + SunOS | Linux ) + NULL=/dev/null + PS=":" + FS="/" + ;; + Windows_* ) + NULL=NUL + PS=";" + FS="\\" + ;; + * ) + echo "Unrecognized system!" + exit 1; + ;; +esac + +JEMMYPATH=${CPAPPEND} +CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH + +THIS_DIR=`pwd` + +${TESTJAVA}${FS}bin${FS}java -fullversion + +${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}InternTest.java + +cp ${TESTSRC}${FS}badstrings.txt . + +${TESTJAVA}${FS}bin${FS}java -XX:+PrintStringTableStatistics -XX:+TraceSafepointCleanupTime InternTest bad > test.out 2>&1 & +C_PID=$! + +sleep 60 + +ps | grep ${C_PID} | grep -v grep + +if [ $? = 0 ] +then + kill -9 ${C_PID} + echo "Test Failed" + exit 1 +else + echo "Test Passed" + exit 0 +fi diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/7158800/badstrings.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/runtime/7158800/badstrings.txt Thu Aug 02 14:29:12 2012 -0700 @@ -0,0 +1,30001 @@ +EOcLKvbddZyPxYpb +DncLKvbdPxmAGrqj +DoCjjvbdpxoIHQdY +EPCkKvbdqYoHfqEY +DnbkKvbdezvYdiUX +DnbjjvbdeEoRbXCj +EObkKvbdbsCkUEKB +EOcLKvbdnUtyjiqf +DncLKvbdRWnDcMHc +DoCkKvbdrSUkOLAm +DncLKvbdfNFwGmJk +EPDLKvbdvAdYroFI +DoDLKvbdiGibyViu +DncLKvbdYqNEhmFR +DoCkKvbdEARhlzXX +DncLKvbdSZjHsCvA +DncKjvbdqTsgRqkU +DnbjjvbdqAiFAXHd +EPDKjvbdGcjvJaij +DnbkKvbdwtldpxkn +DoDKjvbdYkrETnMN +EPCjjvbdbBWEfQQX +EPCjjvbduMXwAtBX +DncLKvbdbsCkTcia +DoCjjvbdczYpYZRC +EOcKjvbdFeiqmhsq +DoCkKvbdKCicQibx +EOcKjvbdZLrEUOLm +DoCjjvbdaNKbStmH +DoDKjvbdJbjDQjDY +EPCkKvbdemFwGmKL +EPDKjvbdZQleImEq +DncKjvbdZjShPfbG +DnbjjvbdqYnhHREY +DoCkKvbdaRfDIUGL +DoDKjvbdLrWlyuQz +DnbjjvbdZisHofaf +EObjjvbdhtydvrUb +DnbjjvbdRotHKGEX +EObjjvbdNeEThhkE +EPCjjvbdZtJJZESn +DoDKjvbdnPyxvLYb +EPDKjvbdeEoRbWbj +EOcLKvbdFxttaEXb +EObjjvbddwystRez +EPCjjvbdJpzEnenF +DnbkKvbdTppntuIN +EPCkKvbdTukpKUBR +DnbkKvbdhlFEOUcZ +EObkKvbdlhdUQuRa +DnbjjvbdkClKqHUg +EOcKjvbdqTtGqqkU +DncKjvbdtkwvaUBX +DoDKjvbdsQWOjCuf +DncLKvbdEKIJuwjA +DncKjvbdGLErcIMu +EOcLKvbdNPwpumfs +EObkKvbdnVUzLJrG +DoCkKvbdcTDKsdKB +DncKjvbdKRZdoFme +EOcLKvbdemFvgNKL +EPCkKvbdznopdblY +EPDLKvbdOYPVzdOU +DnbjjvbdsZlPsAhO +DoDLKvbdKCjDRKDY +DoCkKvbdhuZeXSVC +EPDKjvbdOStVgEtp +DncLKvbdvwMAvBWV +EPDKjvbdBcoaWJlf +EOcKjvbdZxdKODMS +DoCjjvbdbsCkTcjB +EOcLKvbdwWlAuaWV +DnbjjvbdFejRnJUR +DnbjjvbdmIdTqVSB +DnbkKvbdqBIeAWhE +DncKjvbdrMzJyMIJ +DoCkKvbdZGvdAOsJ +DncLKvbdjggLfFnL +DoCjjvbdYqNFJMdq +DoCkKvbdqZPHfqDx +DncLKvbdOEdThiLE +DoCkKvbdZirgpGaf +EPDLKvbdziuQPdSt +EObkKvbdKQyeOenF +DoDLKvbduaDySndh +DoCjjvbdVUNUGLvK +DncKjvbdAMhYrvzY +DnbkKvbdnQZxvKxb +EPCjjvbdBhjakJFj +DncLKvbdmfeYNNfy +DoDLKvbdjlbLydfo +DoDLKvbdpyPIGpcx +EOcLKvbdnVUzLJqf +DoCjjvbdmJETqVSB +DoDLKvbdJTZAsMxM +DoCkKvbdnQZxvLZC +DoDKjvbdACqwizJQ +DncKjvbdvBEZSoFI +DncKjvbdGckVjCJj +DncLKvbdiMFENtcZ +Dnbjjvbdjuvmcaww +DnbkKvbdZyEKNblS +DoCjjvbduMYXBUBX +DnbjjvbdFWYopNJe +DoDKjvbdelfXGljL +DnbjjvbdakLenmcA +EPDKjvbdfILWRmpg +EObjjvbdSLYeuHLT +DoCjjvbdMfbolotk +EPDLKvbdrRuKnKaN +EOcKjvbdyzdnRhIh +DoDLKvbdGAoRZJzm +DoCjjvbdhlFDnUcZ +EPDLKvbdmpZyVkYb +DncKjvbdTpqPUuIN +DncLKvbdHDjvJaij +EPDLKvbdYlRcsmkm +EPDLKvbdvlvAMdFN +DncKjvbdIsZArmYM +EOcLKvbdegjuqnQg +EOcLKvbdZQmFJNFR +DoCjjvbdZxdJmcMS +EPCkKvbdlZTSTYgU +DoDKjvbdqceJPnWB +DncLKvbdVgwuxGxz +DncKjvbdDnbkLXDE +EPDLKvbdatbHYKsh +DncKjvbdEzsqFLbi +EPDLKvbdnVVZkKRf +EOcKjvbdKeegbBQu +EPCkKvbdKfGHaaRV +EPDKjvbdmIctRVRa +EPCjjvbdRMxBxnUz +DnbjjvbdJYTbILpp +EPCkKvbdTAEiHbPE +EOcLKvbdfelZnGgA +DoCjjvbdOStWGeUp +EOcLKvbdemGXHNJk +DoDKjvbdYTMAmUOx +EPCkKvbdpyOhGpcx +EPCkKvbdAMgxsWzY +DnbjjvbdYkrETnMN +EPDLKvbdUQqPUtgm +DncKjvbdehKurNqH +DoCjjvbdZMSETnLm +DoDKjvbdIHGyyXwg +EObjjvbdXGYzUAPT +DoCjjvbdhbPCeWqR +DoCkKvbdKNADzGuB +DnbjjvbdFeirOJTq +DncLKvbdaRecHtFk +DnbkKvbdzoPpeClY +EObkKvbdZRMeJMeR +DnbjjvbdYfvdAPSi +DncLKvbdJcKCqJcY +EOcLKvbdqvokbhyR +DoDLKvbdrRuLNjaN +DoCjjvbdTlWPBWOi +DoCkKvbdjvWnEBxX +DoDLKvbdTkunaVoJ +DoCkKvbdQZNAHTSK +EObjjvbdqwPkbhyR +EOcLKvbdNHDPlpUk +DncLKvbdIHHZxxYH +DncLKvbdtkxXAtAw +DncLKvbdSCEFMJZL +DnbjjvbdZQmEhldq +DoCjjvbdNGbolotk +DnbjjvbdnCKWwnmu +DncLKvbdzHZMANEw +DoDKjvbdmttykJrG +DnbkKvbdlrZUzSci +EPDKjvbdSKyGVHKs +DoCjjvbdKVuGEFGi +EPCjjvbdCIkBkIej +DncLKvbdzHZMAMeX +DnbkKvbdaSFbgsek +DncLKvbdHDjujBij +DoDKjvbdGZVUaDwb +DnbjjvbdZnnJFEzK +DoCkKvbdtcDUwWOo +DoCkKvbdlBMoNALA +EOcKjvbdNsUWHFUp +DoDLKvbdVUNUFlVj +DnbkKvbdhkdcnUcZ +DncLKvbdLiBkqYAS +EOcKjvbdzoPpdcLx +EPDKjvbdijGIJmXr +EOcKjvbdZisHofaf +DoDLKvbdeOdrkUUS +DoDLKvbdnPyxvKxb +EPDKjvbdIxUBhMRQ +DncLKvbdlhctRUqa +DoDLKvbdmgFXlnGy +DncKjvbdCJKbKiGK +EOcLKvbddndrjtUS +DnbjjvbdkDLjqGuH +DncKjvbdmIcsptqa +DoCkKvbdvvlAvBWV +EObjjvbdjblLQftg +DnbjjvbdCEQBWKMf +DnbjjvbdBdPaVilf +DoCkKvbdZxcjODLr +DoCkKvbdEObjjwCd +EPDKjvbdyTNhlqbH +EPCkKvbdUMVoAvPJ +DncKjvbdUxhUZjoO +DncKjvbdqqtjmkAm +DncKjvbdKfGICBRV +EPCjjvbdVrOXaeLc +EPDLKvbdwXLaWBWV +EPCkKvbdjblKqHUg +DnbjjvbduDCuWuoP +EPDKjvbdNGbpMouL +EObjjvbdBcoaVjNG +DncLKvbdrWpMDIxq +DncLKvbdhaoCdwRR +DnbkKvbdFxtuBDwb +DncKjvbdIjEAKPgE +EOcLKvbduCbuXVoP +DoDKjvbdZtIiZDsO +DnbjjvbdEztRElCi +DncLKvbdxmsHwsJD +DnbjjvbdRbEElIxk +DoDKjvbdWHwvXgYz +EOcKjvbdQlwbYnUz +EOcLKvbdVTltFkuj +DncKjvbdliETptqa +DnbkKvbddoErjtTr +DoCkKvbdgPazvdXh +DncKjvbdySmhlqag +DoCjjvbdbPgHDkzd +DoCkKvbdFWZPomKF +EObjjvbdssSSxydc +EObjjvbdzQnliJwA +EObkKvbdKCjCpibx +EPCjjvbdpyOhHREY +DncLKvbddjJqutzn +EObkKvbdBdQAujMf +EPCkKvbdLAjflbXq +DncLKvbdLBLGlaxR +DoDLKvbdrpWPJbuf +DoCjjvbdEKHiuxKA +DoCjjvbdXsMAlsnx +EObkKvbdptTgSSLU +DoDKjvbdnHFXmNfy +DncKjvbdCJKbKhej +EPCjjvbdhlEdOUby +EOcKjvbdKWUfEFGi +DoDKjvbdZQmFJMdq +EPCjjvbdiGjDZWKV +EObkKvbdVAbQrprZ +DoDKjvbdfekzNgHA +DoDLKvbdnHEwlmgZ +DncKjvbdwzHeexEr +DoCjjvbdmpZxujyC +EPDKjvbdwMvAMcdm +DoCjjvbdfHkVrNqH +EPCkKvbdYzbfRiuy +EPCkKvbdZtIiZDrn +DnbjjvbdjvWnDbYX +DoCjjvbdOStVgEtp +EPDLKvbdZMSETmlN +EPDKjvbdBhjajhej +EPCjjvbddoFTLUUS +DnbkKvbdsQVoJcWG +EPCjjvbdrEFJQNvB +DoCjjvbdMpYRWOGs +EOcLKvbdZirgpHBf +EPDLKvbdyOTIXsJD +DoCkKvbdKRZdnfNe +DnbjjvbdbBWFFoow +EPCjjvbdgFlZnHHA +DnbkKvbdGGJrOIsq +DoDLKvbduDCtwWPP +EObjjvbdNddUIhjd +DnbjjvbdxsNiMqag +EObjjvbddeOrCWbj +EObjjvbdPxmAGsRj +EOcLKvbddeOrCXDK +DoDLKvbddeOrBwCj +DoCjjvbdVqnYCElD +DnbkKvbdUyIUZjoO +EObjjvbdeFOrCXDK +EObkKvbdVrNxCFLc +EObjjvbdTfzmkwWF +EOcKjvbdIHGzZYYH +EPDKjvbdtbbuXWPP +DoCjjvbdZisIQHBf +EObjjvbdbsCkUDjB +EPCkKvbdVwJXudFH +EPDKjvbdrouoKDVf +EPCkKvbdFyVVBEYC +DncLKvbdZnnIeEzK +EPDLKvbdxVNFQxkn +DoDKjvbdpxnggRDx +DoDLKvbdqZOgfpcx +DncKjvbdCIjakJGK +EPCkKvbdCJLBjhej +DoDLKvbdnPzYvKxb +EOcKjvbdqTsgSRkU +EOcLKvbdLBLGlaxR +DoDLKvbdcbTMrAUN +DncLKvbdzitoodSt +DoDKjvbdJvUfDdfi +EOcLKvbdHDjvKCJj +EPCkKvbdeOeTKssr +DnbkKvbdlYrqsYft +DncLKvbdiiehKMxS +DncKjvbdURQoVUhN +DnbkKvbduMYXBUAw +DoDLKvbdSPtHJfEX +EObkKvbdqBJFAWgd +EOcKjvbdFpATWgFy +DoDLKvbdBsBDTfXS +DncKjvbdjhHLfFmk +DoCjjvbdCJKakIfK +DnbkKvbddoFSjtTr +EObkKvbdANIYsWzY +EObjjvbdCTAbtFvr +EObjjvbdrRtkOLAm +DnbkKvbdkxsSTYgU +DoCjjvbdnBiwXnmu +EObjjvbdwtmEqYlO +EPDKjvbdrylQTAhO +DoDLKvbdtbbtvvOo +EPCjjvbdZLrETmlN +EPDLKvbdWXJYWDdg +DoCkKvbdKQzFOfOF +EPCjjvbdwzIFfXeS +DncKjvbdRjyFuHLT +EPDLKvbdULunaWPJ +DncKjvbdUxhTykOn +DnbkKvbdJcKCqKDY +EPDLKvbdcbSmSATm +DnbkKvbdegjurNqH +EPDKjvbdZjTIQGbG +EPCjjvbdiLddNuCy +DoCjjvbdZQldiNEq +EOcLKvbdakMGPODA +EObjjvbdnHEwlmgZ +EOcLKvbdBsAcUGXS +EPCkKvbdiVZdwSUb +EOcLKvbddCTNSAUN +DnbkKvbdEXxMUUUM +DncKjvbdYpldiMeR +DoDKjvbdNddTiIjd +DoDLKvbdZLqdUNlN +EPCkKvbdiBncFWpq +DncLKvbdiCPDEvqR +EOcKjvbdUyHszKoO +DncKjvbdhtydvqtb +EPCjjvbdpxoHgQcx +EObkKvbdkWWnDaxX +DnbjjvbdBhkBkJFj +DoCkKvbdRacdkhyL +EOcLKvbdZjTHpHCG +EPCkKvbdMowqWOGs +DncLKvbdegjurNpg +EObjjvbdfMfWfmKL +EPDLKvbdZirgpGaf +DoDLKvbdiZuFlQnG +DncLKvbdFxuVAcxC +EObkKvbdZisHofaf +EOcKjvbdJSyBSmYM +EPDLKvbdVYgtZkPO +EOcKjvbdRbEFMJYk +DncLKvbdrEFIonWB +DncKjvbdKDJbqJcY +EOcLKvbdhfjCxuiu +EObjjvbdLLAhWAKZ +DoCkKvbdRXNcblID +DoDLKvbdcbSmSATm +EOcLKvbdwWlAvAuu +EObkKvbdiBnbdvpq +DoCkKvbdNQXpumgT +DncLKvbdkVwOECYX +DnbkKvbdfoazwDxI +DoDLKvbdbBWFFpPw +DoDLKvbdvBDxsPEh +EPDKjvbdJqZdoFme +DoDLKvbdIryArmXl +EPCjjvbdANIZSwZx +EPCkKvbdVhYVxGxz +DncKjvbdLAjgNCYR +DncKjvbdxxIjCQZk +DncKjvbdbiNKKewY +EPCjjvbdlrZVZsEJ +EPDKjvbdIryAsMwl +DoCkKvbdtAHRIAAr +EPDKjvbdJmAEZfuB +EPCkKvbdZjSgogBf +DoDLKvbdOXnuzcnU +DnbkKvbdehKvRnQg +EObjjvbdZyDimbkr +DoDKjvbdmajWwoOV +EOcKjvbdkMalZeHP +EOcKjvbdIjEAJpHE +EPCkKvbdDihKVxKA +DncKjvbdNddUIiKd +EObjjvbdqdFIpOWB +DoCkKvbdxnShXsJD +DoDLKvbdjmBkzEfo +EOcLKvbdatagYLTh +DoCjjvbdVhYVxHYz +DnbjjvbdJbjDRKDY +EPCjjvbdLBLHNCYR +DnbjjvbdnGeYNOGy +EOcLKvbdUsmTekvK +EPCjjvbdtkxXBTaX +EPCjjvbdzoPqFCkx +DncKjvbdCIjbKhej +DncKjvbdZLqdTmkm +DoDKjvbdsPunicVf +EOcKjvbdmgFXmNgZ +EObkKvbdiMFENuCy +DoDKjvbdhanbeXRR +EObkKvbdACqwiyhp +DncKjvbdZisIQHBf +EPCjjvbdgQBzwDwh +DnbjjvbdyYJJaoyk +DoDKjvbdxUldqZMO +EObkKvbdkClLQgVH +EPCjjvbdZQldiMeR +EPDLKvbdZyEKOClS +EPDLKvbdcIlikFvx +DoDKjvbdrzMQTBHn +DnbjjvbdVYgtZkPO +DoDLKvbdHEKuiajK +EPCkKvbdczZQXxqC +DoDKjvbdrDdiQNua +DncLKvbdcImKLGWx +DoCjjvbdVYgtZkPO +EPDLKvbdZnnIeFZj +EPDKjvbdMIakqYAS +DoCkKvbdSLYfUgLT +EPDLKvbdiCObdvpq +DnbjjvbdRpUHKFcw +DoDLKvbdIHHZyYXg +EPCjjvbdypoMhiwA +DnbkKvbdCEPaVjMf +DnbkKvbderAvzlDP +DnbkKvbdZQleImFR +EOcKjvbdKRZdneme +DoDLKvbdiBnbeXQq +DncLKvbdEPDKjvcE +EOcLKvbdauCGwkTh +DncLKvbdEvZQPmJe +EPCkKvbdURQnuVIN +DncLKvbdegjvSOQg +EPCjjvbdKaKgMawq +DnbkKvbdRzKISbvA +DncLKvbdiLdcnUcZ +EPDLKvbdkDMKpfuH +DoDLKvbdRbDdkhyL +DnbjjvbdDwxMUUTl +DnbkKvbdrpWPKCuf +DnbkKvbdNVSqjmAX +DoDKjvbdRbDeMIxk +EOcLKvbdcyxpXyRC +DncLKvbdRMwbYnUz +EObjjvbdqlzJxlHi +DoCkKvbdJYUCIMQp +DncLKvbdLZQjSzuG +EOcKjvbdxVNEqYkn +DnbkKvbdZoOIeFZj +DoCjjvbdBraCtFwS +EOcLKvbdliDsqVSB +EPCkKvbdeATqNXif +DncLKvbdkMbLydgP +EObjjvbdZxdJmbkr +DoCjjvbdraellHLZ +EObkKvbduDCuWvPP +DoCkKvbdpstGrSLU +DoCjjvbdLGFgbBQu +DnbkKvbdhtzFWquC +EObjjvbdoAKztHdO +EPDLKvbdatafxKtI +EPDKjvbdkWXNcaww +DoCkKvbdwkXEHzzG +EObkKvbdmgEwmNgZ +DncKjvbdBiLCLJFj +DoCjjvbdeOdsKssr +EOcLKvbdfILWSORH +EObkKvbdCDpAujMf +EPDKjvbdKDKDQibx +DoDKjvbdVUMtGLuj +EObkKvbdrXQMCiYq +DncKjvbdePEsLTtS +DncLKvbdDxYLtUTl +EPCkKvbdGYuVBEYC +DncLKvbdNeEUIiKd +EPCkKvbdpxoIHRDx +EObjjvbdFkEsDHlu +EObjjvbdssSSxzFD +DoCkKvbdUtNTfMVj +DnbjjvbdJcKDRKDY +DncKjvbdqiAKEmOe +DoDKjvbdtlXwAtBX +DnbkKvbdxmsIYTIc +EObkKvbdLrXMzUpz +DoCjjvbdkxsSSxft +DncKjvbdQlwaxnUz +EObkKvbdjhGlFfNk +EPCkKvbdxsNhmRag +DoDLKvbdMfcPmQUk +DoDKjvbdQvnEDLhD +EObjjvbdVgxVxHYz +DoDLKvbdlrYtyrdJ +DoCjjvbdezvYeIsw +DncLKvbdNddTiIjd +EPDLKvbdGGJrNiUR +EPDLKvbdRzJhTDWA +EPCjjvbdvvkaWBVu +EOcKjvbdRXNdCkgc +EOcKjvbdQZNAHTSK +EPCkKvbdsCGNLfkZ +EOcLKvbdDwwktTsl +EOcLKvbdqlzJyLgi +EOcLKvbdxsNiMqag +EOcLKvbdhzVFlROG +EOcKjvbdEztRFMCi +DnbkKvbdqiAJdmPF +EPDLKvbdjcMKqGtg +EObkKvbdTlWOaWOi +EPDLKvbdURRPUuHm +DoDKjvbdelfWgNKL +EOcLKvbdGAnqZJzm +EObjjvbdGZUuAdXb +DoDLKvbduLwwAtAw +DoCjjvbdZjTIQGbG +EPCjjvbdRNXbYnUz +EPDLKvbdiLeENtby +EObjjvbdMowpunGs +EOcKjvbdbiNJjevx +DoDKjvbdEYYLstTl +DoDLKvbdqUTfrRjt +DoDKjvbdbsCkUEJa +DoDKjvbdXsMBNUPY +EPCjjvbdRNXaxnUz +DoDLKvbdNGcQNQUk +DnbjjvbdEARiMywX +EPDKjvbdSKxfUfkT +DncKjvbdhtyeXRtb +DncKjvbdZLqcsnLm +EObkKvbdZnmheEzK +EObjjvbdtbcUvuno +DnbjjvbdrzMQTBHn +DnbjjvbdDwwktTsl +EPDKjvbdkxsSTYgU +DoDKjvbdIryArlxM +DoDKjvbdnBivxOnV +DoDKjvbdeATplwif +EOcLKvbdKeegbApu +EPCjjvbdMgDQMotk +DoCjjvbduCbtwWOo +DnbkKvbdyNsHwrhc +DnbkKvbdtvNxJpsA +EOcLKvbdqAheAWgd +DoCkKvbdURQoUtgm +EOcKjvbdqceIpOWB +DoCkKvbdVwIwudFH +DnbkKvbdbLMFnmcA +EOcLKvbdZjTHpHBf +EOcKjvbdRXNdCkhD +EPDLKvbdiHJcZViu +DoCjjvbdxxIjCPzL +DnbkKvbdBcpBWJmG +EPCkKvbdZyEKOCkr +EPDKjvbdOTUWHFVQ +DoCjjvbdIGgZxwwg +EPDLKvbdFjeSbhMu +EPDLKvbdhgKCxvJu +EOcLKvbdNsUWGdtp +EPDKjvbduVnXipsA +DncLKvbdGYuVBEXb +EPDLKvbdZtIhyESn +DoDKjvbdZxdJmcLr +DoCjjvbdUsltGLuj +DoDKjvbdDoDLKvbd +DncLKvbdrDdhpNvB +EPDLKvbdKCjDRJbx +DoDLKvbdxLWdHzyf +EObkKvbdrzMQTAhO +EOcLKvbdOFDtJJKd +EPCkKvbdrSVKmjaN +EOcKjvbdWWiYVdEg +EOcKjvbdWWhwvDdg +DncKjvbdpstHRqjt +EPCkKvbdKWVFceGi +DoCkKvbdZjShPfbG +DoCkKvbdSxKlNzkY +EPDLKvbdIwtCHkqQ +EOcKjvbdsCGNLgLZ +DncKjvbdzaAOfgCM +DoDLKvbdxmrhYSiD +DncLKvbdfMfWgMjL +EPDKjvbdqFdEsuaI +EOcLKvbdiLeDnUcZ +DoCjjvbdKVuFceHJ +DoCjjvbdfekzNgHA +EOcKjvbdOFEThiLE +EPDLKvbdqceJPnWB +DoDLKvbduCbtwWOo +DncKjvbdTqROtuIN +DncKjvbdpedFUWBI +DoDLKvbdrEFJQNua +DoDLKvbdyXhjCPyk +EPCkKvbdJYUBhLqQ +EPCkKvbdtcCuXVno +DoDLKvbdZLrEUOLm +EPCkKvbdpstGrRjt +DncLKvbddePSCXCj +EObkKvbdauCHXjsh +DoDLKvbdkHfkefNk +EObjjvbdMRwMzUpz +EObjjvbdaMkCTVNH +DoCkKvbdGGJrNhtR +EPDLKvbdvBDxrneI +EPDLKvbdIHHZxwxH +EOcLKvbdrJAJdmPF +EOcKjvbdGZUuAdXb +EOcLKvbdbUbHYLUI +DnbjjvbdJzofYEAN +EPDKjvbdFxtuBDxC +DnbkKvbdQvnDbkgc +EPDKjvbdJmADzGta +DoDKjvbdZRMdhleR +DnbkKvbdsrqsZZeD +EObkKvbdrovPJbuf +EPCjjvbddeOqbXCj +EObjjvbdtcDVXVoP +DncKjvbdMfbpNQVL +DoCkKvbdhbPCeXQq +DoCkKvbdNHComQVL +EObjjvbdvBDxroFI +EPCjjvbdnBivwoNu +EObjjvbdbhljKewY +EPDKjvbdZyDimcMS +EObkKvbdWSOXbElD +EOcKjvbdTfznMXVe +EPCjjvbdZtJJYcsO +DoCjjvbdRjxfVHLT +DoCkKvbdVTltGMVj +DncKjvbdYfwEAOri +DncKjvbdYkrEUOMN +EObkKvbdqGEEsuaI +DncLKvbdjJfHimXr +EPDLKvbddndsLUTr +DnbkKvbdqBJFAWhE +EPDLKvbdEOcKjwDE +EPCkKvbdtvOYJqTA +DncLKvbdkyTRsZHU +DoCjjvbdTppnuVIN +DncLKvbdwyhFeweS +DncKjvbdsBelkgKy +DoCjjvbdKDKCqJcY +DoCjjvbdkClKqHVH +DoCjjvbdcTCjtDia +EPDLKvbdUVkpJtAq +EPDLKvbdRyjITCvA +DnbjjvbdJuuFcdgJ +DoDKjvbdrJAJdmOe +DncKjvbdJcJbqKCx +DoDLKvbdJcJbqJcY +DoDKjvbdeEoSCXDK +DoDLKvbdSwjlNzkY +EObjjvbdzitopDrt +DoCkKvbdKWVGEEgJ +DncKjvbdpssfqrKt +EOcLKvbdUMWPBVoJ +DncKjvbdyzdmrIIh +EPCjjvbdxUldqZLn +DoDLKvbdySnImRbH +DoCjjvbdGdKvJaij +DoCkKvbdxZgeewdr +EObkKvbdiLddNuDZ +DnbjjvbdSCDdkiZL +DncKjvbdznpREcMY +EOcLKvbdaRebhTfL +DnbjjvbdZQldiMdq +EPCjjvbdbrbjtEKB +EOcKjvbdEARiMzXX +DoDLKvbdXrkaNTnx +EPCkKvbdQZNAHTRj +DoDLKvbdEzspeLcJ +EPCjjvbduVnYKRTA +EObjjvbdJXtBhMQp +EPDKjvbdeOdrjssr +EPCjjvbdLqwMytpz +EPDKjvbdUMVoBVoJ +DncKjvbdRpUGifDw +EPDLKvbdZyDinDLr +DnbkKvbdNrsufeVQ +EPCkKvbdZMSDtNlN +EPCkKvbdySnJNSCH +EPCjjvbdfMevfljL +DncLKvbdXsMBNTnx +DnbkKvbdpxoHfqDx +DncLKvbdUQpntthN +DncKjvbdIsZArlwl +DoDLKvbdZGwEAOsJ +EOcKjvbdVvhwvDdg +EOcLKvbduWNxJqTA +EPCjjvbdHEKvJaij +DoDKjvbdrpWOjCuf +DncLKvbdrpWOjDVf +DoCjjvbdIHGzYwwg +DoDLKvbdpxoIGqEY +DoDLKvbdJcJbqKDY +DoCjjvbdRWmdClHc +EPCjjvbdFWYopNJe +DncKjvbdmfdwlmfy +DoCkKvbdxUleQxlO +EObjjvbdnGdxMnGy +EPCjjvbdvvlAvBVu +DncLKvbddndsKssr +EObjjvbdZMRcsnLm +EOcKjvbdFxttaEXb +DncKjvbdVUNTfMVj +EOcLKvbdNrtWHFUp +DoDKjvbdwuMdqYlO +EPDLKvbdrXPkbhxq +EObjjvbdrEFIpNua +EObjjvbdziuQQDrt +EOcLKvbdqYoIGpcx +DnbjjvbdsQVoJcVf +EObkKvbdkDMKpgUg +EObjjvbdvBDyTPFI +DncKjvbduCbuWvOo +EPCjjvbdkVvnECYX +DncLKvbdZGvdAOri +DoCkKvbdrXPlDJZR +EOcLKvbduCcVWvOo +DoDKjvbdCEPaWJlf +EPDKjvbddoErjssr +DncKjvbdACqxKZiQ +EPCjjvbdUVlPitAq +EPDKjvbdjJfHjMxS +EObkKvbdAMhYsWzY +DoDKjvbdnBivxOmu +EOcLKvbdbiNKKfXY +EPDKjvbdYqMeIleR +EObkKvbdJmADygUa +EObjjvbdEPDLLWcE +EPCjjvbdrXPkcIxq +EOcLKvbdliDtQtqa +DoCjjvbdmoyxujyC +EPDLKvbddoFTLTsr +EOcLKvbdCWzdJEpW +DnbjjvbdrEEhpOWB +DoDKjvbdZLrDtNkm +EOcLKvbdLFfHbAqV +EOcKjvbdmttzLKSG +EOcLKvbdmbJvwoOV +EOcKjvbdUaCQrqSZ +DnbjjvbdmgExMnGy +EPDKjvbddndrkUUS +EObkKvbdDwwkstTl +DoCkKvbdcJMjLFwY +DnbjjvbdaNLBruMg +DoDLKvbdQYmAHTRj +DnbkKvbdsQWOicWG +EObkKvbdMRwMzUpz +DoDLKvbdZshiZDrn +EPDLKvbdnPzYujxb +EOcKjvbdCEQAujMf +EPDLKvbdKefHbApu +DoDLKvbdYpldiNFR +DoCkKvbdFWZQQNJe +DncLKvbdznpQeCkx +EOcKjvbdnQZxvKxb +DoCkKvbdVBBprpqy +DnbkKvbdZirhPfaf +DnbkKvbdegjvSNqH +EOcLKvbdqdEiPnWB +EObjjvbdBhkCKiGK +EObjjvbdxZgfGYFS +DnbjjvbdNQYQumgT +EPCjjvbdxsNhlrBg +DoCkKvbdQdDApRDr +DoCkKvbdxxIiaoyk +EPDKjvbdFeirNhtR +DoCjjvbdegjvSOQg +EObkKvbdqcdiQNvB +DncLKvbdiMEdNtcZ +DncLKvbdTqRPUthN +EPCkKvbdwygeexFS +DoDKjvbdyTOJMrBg +DncLKvbdeEoRavbj +EPCjjvbdtbcUvvOo +EObjjvbdKCicRJcY +EObjjvbdZyEKODMS +DnbjjvbdmJDtQtrB +DncLKvbdEARhlyvw +DnbjjvbdIxTbILqQ +EOcLKvbdwygefYFS +DoCjjvbdznoqFCkx +DoCjjvbdRpUGjGDw +DncKjvbdhzVGMQnG +EPCjjvbdhkeDnVCy +EObkKvbdOEdUIiKd +DncKjvbdrDeIomua +DncLKvbdiHJbxuiu +EPDKjvbddxZstRez +EPDLKvbdmSYuZrdJ +EObkKvbdVUNUFkvK +EPDLKvbdNeEUJIjd +DoCkKvbdiMEdNuCy +DoDLKvbdRDcApQcr +EPCjjvbdTlVoBVoJ +EObjjvbdLBKgNBwq +EPCkKvbdsCFllHKy +EObjjvbdnVUzLJqf +DoDKjvbdqrVLNkBN +DoCkKvbdqFcdtWBI +DncLKvbdbVCGxLTh +EOcLKvbdeFPSCXCj +EOcLKvbdRpTgKFdX +EObjjvbdznpQeDLx +EOcKjvbdjvXNcaxX +DnbjjvbdHDkWJbJj +DncKjvbdhkeENuDZ +DnbkKvbdnUtyjjSG +DoDKjvbdSQUHJfDw +DncKjvbdbUbHYLUI +EOcLKvbdNsTvGduQ +EPDLKvbdSZigsCvA +DncKjvbdMfcPlpUk +DoDLKvbdxrnIlrBg +DncKjvbdiLdcnVCy +EPCjjvbdmfeYNOHZ +DoCkKvbdjvWmcaxX +DoDKjvbdbUbHXkUI +DncKjvbdBhkBjiFj +DoDLKvbdNHColpVL +EOcKjvbdrykosAhO +DncLKvbdqGDeUVaI +DnbkKvbdhgJcZViu +DnbjjvbduLxXAtBX +EPCjjvbdYpleJNFR +EPDLKvbdQvmdClHc +DnbjjvbdJYTbIMRQ +DncLKvbdznpRFDMY +EOcLKvbdZnmiFEyj +DnbkKvbdrRuLOLAm +EObkKvbdhkeEOUby +DncLKvbdYlSEUOLm +DoCjjvbdhkdcmtby +DncLKvbdddnrCXDK +DoDLKvbdKaLHNCYR +EOcKjvbdcyxpYZQb +EPDLKvbdACqwjZhp +DoCkKvbdBsBDTevr +EObkKvbdeKJqvUzn +EObkKvbdcImJkGWx +DncLKvbdYSlAltOx +DncLKvbdlrYtyrdJ +EObkKvbdKxqJrztf +EOcKjvbdsQWPJcVf +DoDKjvbdkySqrxgU +EObjjvbdeEoRbXCj +EOcKjvbdHDkVjBij +DoDLKvbdCTBCsfXS +DoCjjvbdKCjDQibx +DoCjjvbdlhdTqUrB +DoDKjvbdTulQKTaR +DoCkKvbdRjxetfkT +EPCjjvbdEuyQQNKF +EPCjjvbdDoDKkXDE +DoCjjvbdsQWPJbuf +DoDKjvbdhuZdvqtb +EPDLKvbdiHKCyWJu +EPDLKvbdLFegaaQu +DoCjjvbdqZPHgRDx +DncKjvbdUWMPjUAq +DoDLKvbdTYKkmzjx +DoDKjvbdegjvSOQg +DnbkKvbdUtNTekvK +EObkKvbdNsTvGeVQ +DoDLKvbdfNFvgMjL +EOcLKvbdZQmEiNEq +EPDKjvbdBraDTfWr +EPDKjvbdNGcQNQVL +EPDLKvbdZyEKODMS +EOcKjvbdBvzdIdpW +EPCjjvbdACqwiyiQ +DoCjjvbddePRawCj +EPDKjvbdWWiXucdg +DoDKjvbdWexzUAPT +DnbjjvbdwXMBWBWV +EOcLKvbdUyHszLOn +EPCkKvbdOYOuzcnU +EPCkKvbdhancEwQq +DnbkKvbdjggLefOL +EPCkKvbdFjdsDIMu +DoDKjvbdrSUjmkBN +DoDLKvbdZjTIQGaf +DoDKjvbdMgDPmPtk +EPDLKvbdWRmwbFMD +DoCkKvbdzROmJKXA +DnbkKvbdrDdiQNvB +DnbjjvbduDCtwVoP +EOcLKvbdCIjbLJFj +EPDKjvbdXrkaMsnx +EPDKjvbdVhXvXfxz +DncKjvbdhbPDEwRR +DoCkKvbdpxoHgQcx +DoCkKvbduMXwBUBX +EObjjvbdNeEThhjd +DoCjjvbdirzhrkJz +DoDLKvbdaMkCTUlg +DncLKvbdWRnYBeLc +DnbjjvbdGBPRZJzm +EOcLKvbdeOeSjstS +DoDLKvbdmIctRVSB +DoCjjvbdZxdJnDMS +DoCkKvbdRpTgKFcw +DncLKvbdTukojTaR +DnbjjvbdKRZdoFme +DnbkKvbdURQoVUhN +DoDLKvbdyYJKBozL +EObkKvbdfNFwHMjL +DoDLKvbdZisIQHBf +EObkKvbdqFcdsuaI +DncLKvbdzoPqFDLx +DoDKjvbdSKxeuHLT +EPDKjvbdsBemLfjy +DoCjjvbdJbjCqJcY +DoCjjvbdNPxRVnGs +DncLKvbdGcjvJbKK +EOcKjvbdrWpMDIxq +EOcLKvbdQdDApQcr +DoDKjvbdZMRdTnLm +EOcLKvbddxZssrFz +EObjjvbdUtNTfLuj +EPCjjvbdLLBIWAKZ +DoCkKvbdgFlZmfgA +EPCjjvbdUVkoitAq +DoDKjvbdDncKjvcE +DoDLKvbdRpUHJfEX +EPDKjvbdLqvlzVQz +EPDKjvbdZMRdUOLm +EOcLKvbdCJLBkIfK +DncKjvbdaSFbhUFk +EPDLKvbdZoNheEzK +DncKjvbdUVlPjUAq +DnbkKvbdKNADyfuB +EObkKvbdZdwfzghb +EPDLKvbdZtIhxcrn +EObkKvbdGckViajK +DncLKvbdFfJqmiUR +DncKjvbdKWUfDdgJ +DoDKjvbdMtrqjmAX +EOcLKvbdsQWPKDVf +DoCjjvbdwtleRZMO +EObjjvbduaDxsPEh +EPDLKvbdKxqJrzuG +EOcKjvbdVAaprprZ +EObjjvbdEuxopMjF +DnbjjvbdyOTHwriD +EPDLKvbdrpVnibvG +EPDKjvbdkWWnDaww +DncLKvbdrXPkbiYq +DoDLKvbddxZssqez +EOcLKvbdHDkWJbJj +DncLKvbdEPCkLWcE +DnbkKvbdEXwkstTl +EObjjvbdqiAKEmOe +DncLKvbdjAQGaQGj +EPCjjvbdNeDtJJKd +EPCjjvbdvwMBWBVu +EPDKjvbdFejSOItR +EOcLKvbdNPwqWOHT +EPDKjvbdbsCjscia +EObkKvbdyYIiaoyk +DoDKjvbdLZQirzuG +EObjjvbdSLZGVGjs +DoCjjvbdAMgxsWzY +DoDLKvbdEObjjwCd +DnbkKvbdsPvOicWG +EPCkKvbdrJAKElne +EPCkKvbdauCGwjsh +DncLKvbdegkWRnQg +EPCkKvbdYpmEiNFR +DoDKjvbduaDxsPFI +DoCjjvbdcyxoxYqC +DoCkKvbdkMakzFHP +DnbjjvbdJbibqJbx +DnbkKvbdWWhxWDeH +DoCjjvbdssRsYzFD +DoDKjvbdpyPIHRDx +DncLKvbdwNWANDeN +DoDKjvbdJYUBglRQ +EObkKvbdXnRAYVVt +DoCjjvbdUWLpKTaR +DoDKjvbdTqROttgm +EPCkKvbdVqnXaeMD +EObjjvbdADRwiyiQ +DoDKjvbdlrZUyrci +EPDKjvbdvAdZSndh +DoCkKvbdzoQQeDLx +DnbkKvbdSQUGjFdX +EOcLKvbdqBJFAXIE +EObkKvbdSCEFLiZL +DnbjjvbdzoQQdcMY +DnbkKvbdpxngfqEY +DncLKvbdbsDLUEKB +DoCjjvbdXrlBMtOx +EObjjvbdKCjDQicY +DncLKvbdLrWlzUpz +EObjjvbdaaWEfQQX +EObjjvbdtlYWaTaX +DnbkKvbdMowpunGs +EObkKvbdSLYeuHKs +EObkKvbdTAEhhCOd +EPCkKvbdmSYtyrci +DncLKvbdYkqcsnLm +DoDLKvbdrylQTAgn +DncLKvbdJXtCIMRQ +EObkKvbdSBdElIyL +DoDLKvbdwygefYFS +DncKjvbdyXhibPzL +EPCjjvbduaDxsPFI +EObjjvbdZoNiFEzK +EPCjjvbdkNBkyeHP +EPCkKvbdWRnXadlD +DncLKvbdRWmdDLhD +DnbkKvbdmSYtzTDi +EOcKjvbdkVwODbXw +DncLKvbdQlxCZOUz +EObjjvbdbhlijfXY +EOcLKvbdXmqAXtut +EOcLKvbdmbKXXnnV +DoDKjvbdkHgMFfOL +EPCkKvbdfekymgHA +DoCjjvbdeKKRvUzn +DoDKjvbdkHfkefNk +DoCjjvbdyqPMiKXA +DnbjjvbdUQqOtuIN +EOcKjvbdEPCkKwDE +DoDLKvbdZRNFIleR +DnbjjvbdRacdlJZL +EOcLKvbdTukoitAq +EOcLKvbdZLrDtOMN +EOcLKvbdgKfzcGAE +EObjjvbdzjVQQESt +EOcLKvbdcIlijevx +EOcKjvbdGKdsDHmV +DncLKvbdKkBHvAJy +EOcKjvbdZMRctOLm +EPCkKvbdADRxKZiQ +EObjjvbdDwxLsssl +EPDLKvbdUxgszLPO +EPCkKvbdSQTfiedX +EPCjjvbdNeEUJIkE +DoDLKvbdpyPHfqDx +DnbkKvbdyOShXsJD +DncLKvbdLiBkpxAS +DoDKjvbdaaWEepQX +DoCjjvbdWSOYBeLc +EOcKjvbdLFegbAqV +EPDKjvbdffLzOGgA +EObkKvbdFkErbglu +DncLKvbdiZuFlROG +DncKjvbdegkWRnQg +DoDLKvbdQdDApRDr +EOcLKvbdeYZtURez +EObjjvbdrXQLcIxq +DoDLKvbdxZhGGXeS +DoDLKvbdGGKSOItR +EObjjvbdjhHLfFnL +EOcLKvbdUQpoUuHm +DoCkKvbdXrlBNUPY +DoDKjvbdJXtCIMRQ +DnbkKvbdZMSDsnLm +DncKjvbdCTBDUGWr +DncKjvbdbhlikGXY +DoDKjvbdXmqAYVWU +DnbjjvbdliDsqVRa +DnbkKvbdmajXYOnV +EObjjvbdJpyePGNe +DnbkKvbdCTAcUGXS +DoDLKvbdCDpBVjNG +EOcLKvbdxwhiaoyk +DoDKjvbdxVNFQyMO +EPCkKvbdVvhwvEEg +DnbkKvbdFWYoomJe +EOcKjvbdlrZUysEJ +EPDKjvbdqquKnKaN +DoCkKvbdTkunaVoJ +EOcLKvbdfHkVrOQg +EPDLKvbdiUzFWrUb +DoDLKvbdtAGqIABS +DoCkKvbdZRMdhmEq +DnbkKvbdNsUVfeVQ +EPDLKvbdqwPkbiZR +DoCkKvbdNUsSLNAX +DncKjvbdmpZxvKyC +EPCkKvbdLYqKSztf +EPDKjvbdZyEKODMS +EPDKjvbdNGbomPuL +DncKjvbdZMSDtNlN +EPCjjvbdTXjkmzjx +EObkKvbdBdQAvKMf +EOcLKvbdkySrTYgU +DnbkKvbdZoOIddzK +DoCkKvbdZMSDsmkm +EPCkKvbdCWzdIdpW +DncLKvbdBvzdIdov +DoCjjvbdaRfDHtFk +DnbkKvbdWeyZtAOs +DoDLKvbdnCJwYPOV +DoCjjvbdEYYLstUM +EOcLKvbdwtldqZMO +EPCjjvbdFVxoomKF +EObkKvbdyqPMhiwA +DoDLKvbdkxrrSxgU +DoCjjvbdeATqNYKG +DncLKvbdJKEAJpHE +DoCkKvbddndsLUTr +DnbjjvbdqFceUWBI +DoDLKvbdhkddOUby +DncKjvbdGKdrcIMu +EPCkKvbdelevflik +DoDKjvbdhaoDFWqR +DoCjjvbdYlSDsmlN +EPCjjvbdiZuGLpmf +EObkKvbdnCJvxPNu +DnbkKvbdhzUelRNf +DnbkKvbdZeYGzgiC +DoCkKvbdDnbkLWbd +DnbkKvbdnHFYMmfy +DoCjjvbdePEsKtTr +DnbjjvbdZQmEhleR +DnbkKvbdTkunaVoJ +DnbkKvbdFWZPpMjF +DoDKjvbdSwkMNzkY +EOcLKvbdwtldpyMO +EOcKjvbdhkdcmtby +DoCjjvbdNQXqWNfs +EPDKjvbdzjUpPdTU +DnbjjvbdqceJPnWB +EPDKjvbdUyHsyjoO +EPCkKvbdZshhxcsO +DncKjvbdqAiFAWgd +EObkKvbdgFkzOGgA +DncKjvbdmgFYNNgZ +DoDLKvbdDjHjWYKA +DnbjjvbdJbicRKCx +DnbkKvbdfNFwHMjL +EPCkKvbdWSNxBdlD +EPDLKvbdCJKbLJFj +EPDKjvbdEOcKkXDE +EPCkKvbdVrOYCElD +DnbjjvbdCIkBjhej +DoDLKvbddoFTKstS +DnbjjvbduDDVXVoP +EObkKvbdxwiKCPzL +DnbkKvbdZGvdAPTJ +DoDLKvbdBdPaVjNG +EOcKjvbdIHGzYwxH +DoCjjvbdGFjSNhsq +DnbjjvbdlYsSSxgU +EPCjjvbdqrUjnKaN +EOcLKvbdtvOXipsA +DoDLKvbdrounjCuf +DoCkKvbdFVyPomKF +EOcKjvbdNHCpNPtk +EPDLKvbdWeyZtAPT +EPDKjvbdjcLkQfuH +EOcLKvbdzHZMAMeX +DoCjjvbdUMWPBVni +EOcKjvbdHELWKBjK +DoDKjvbdMgComQUk +DnbkKvbdiGjDZWJu +DncKjvbdyqOmJKXA +DoDKjvbdVZITyjoO +DoCjjvbdzQoNJJwA +EOcLKvbdGAoQxizm +DoDKjvbdatagYKsh +EPDKjvbdSBceMJYk +DoDLKvbdMpYQvOHT +DncKjvbdiCOcFWpq +DoCjjvbdUGznLvvF +EPDLKvbdANIYrvyx +EPCjjvbdIwtCHkpp +EObkKvbdJSyBSmYM +EObkKvbdwuMdqYlO +EObjjvbdmuVZkKSG +DncLKvbdSPsfjFdX +DoDLKvbdSQUHJedX +DoDKjvbdiVZdwSUb +EPDLKvbdRjxfVGkT +EObjjvbdmpZyVkZC +DncLKvbdhzUelROG +EPCkKvbdxVMeRZMO +EOcKjvbdxxIiapZk +EOcKjvbdJSyBTNYM +EPDKjvbdMSXMzUpz +EPCkKvbdNddThhjd +DoDKjvbdznpREcLx +DncLKvbdqYoHgREY +DnbjjvbdiCPCdvqR +DoCjjvbdsQVoKDVf +DoCjjvbdqFcdtWBI +EPCkKvbdFkFTDIMu +DnbkKvbdQvmdCkgc +DnbjjvbduCbtwWOo +DoCjjvbdaNKaruNH +EOcLKvbdrpWPKCvG +DoCjjvbdEKHiuwjA +DoDLKvbdsBfMlHKy +EObjjvbduCcVWuno +DoCkKvbdNddUIiLE +DoDLKvbdVrNwbElD +EPCkKvbdTqQoUuHm +DoCjjvbdcJMikFvx +EOcKjvbdijGIJmYS +DncKjvbdtvNwipsA +EPDKjvbdGQASwGey +DoCkKvbdmJEUQtqa +DncKjvbdpxnggQcx +EOcLKvbdDnbjjwDE +DnbjjvbdxVMdqZLn +EPCkKvbdTkvPAvOi +DnbkKvbddijRvUzn +DnbjjvbdJuuFceGi +DoDLKvbdeATplxJf +EObjjvbdiLeDmuDZ +EObkKvbdzHYlANFX +EObkKvbdSBdFLiYk +DncLKvbdMgCpNPuL +DncLKvbdNsTufeVQ +EPCjjvbdUQqOtuIN +EPCkKvbdKDJcQicY +DnbkKvbdsCFmLfjy +DnbjjvbdNdctJIjd +DoDLKvbdzjUpPdSt +EPDLKvbdMoxRVmgT +EOcKjvbdbsCjscia +DoCjjvbdrDeIpOWB +EPDKjvbdOTUVgFVQ +EOcLKvbduWNwipsA +DoDKjvbdJcJcRKCx +DncKjvbdGZUtaDwb +EPCjjvbdZtJJYdSn +DoDLKvbdtcDVWuoP +EObjjvbdKaLGmCXq +DoCjjvbddZxoxYpb +DnbkKvbdWRmxCEkc +EOcLKvbdNrsufduQ +DoDLKvbdqlzJxlIJ +DoCkKvbdFVyPoljF +DnbkKvbdjggMGGOL +DoDLKvbdLAkHMawq +DncLKvbdwuMdpxlO +DoDKjvbdtSqrxydc +DoCjjvbdSLZGVHKs +DnbjjvbdrMzKYlIJ +DnbjjvbdTAFIhBnd +EPDLKvbdIxTbIMRQ +DoDLKvbdbBVeGQPw +DnbkKvbdvlvANEEm +EPDLKvbdEOcKkXCd +DoCkKvbdYqMdhmFR +EObjjvbdnUtzKiqf +EPCkKvbdtunXjQsA +DnbkKvbdddoSBwDK +DnbjjvbdTqROttgm +EPCkKvbdzQnmJJwA +EObjjvbdfpBzwDwh +DncKjvbdRotHJecw +EPCjjvbdhtzFWrVC +DncLKvbdqdEhpNvB +DnbjjvbdkWWmcbYX +EOcLKvbdYSkaMsoY +EObjjvbdDjIKVxKA +DnbkKvbdrounjDVf +EObkKvbdJzpFwdAN +DoDLKvbdsBelkgLZ +DoDLKvbdwtmEqZMO +DncKjvbdxmrgwriD +EOcKjvbdDoDLLWbd +EPDKjvbdIwtBhLpp +EPDLKvbdUaBqTRRy +DoCjjvbdjKFhJlwr +DoCkKvbdGLFTDIMu +EPCjjvbdrbFmMHKy +DoDLKvbdehKurOQg +DncKjvbdijFhJlwr +DoCjjvbdjvXOEBww +EPCjjvbdTXjkmzkY +EOcKjvbdaSFcHtGL +EPDLKvbdpyPIHQcx +EOcKjvbdmaiwXoNu +DoDKjvbdSBdFMJZL +DoDKjvbdjKGIKMwr +DncLKvbdyXiKBozL +DoCkKvbdqlzJxkhJ +EObkKvbdrNZiyLhJ +DoCkKvbdrpWPKCvG +DncLKvbdVrOXbEkc +DnbkKvbdOAIrtJrA +DnbkKvbdrXQMChyR +EOcLKvbdDnbjjwCd +EPCjjvbdjvXOECXw +EPCkKvbdMgDPmPtk +DoDLKvbdYfwEAPSi +EPCjjvbdzGxlANEw +DoDKjvbdmbKWwoNu +EOcLKvbddZxpXxqC +DoDLKvbdLGGHbApu +DoCjjvbdVTltGLuj +EPCjjvbdOEdThiKd +DoCjjvbdUyHtZkPO +DncLKvbdHELWJajK +EOcKjvbdcarmSAUN +EObjjvbdqiAJdmOe +EObkKvbdZQleImFR +EObkKvbdQccBQRDr +DoCkKvbdLAjfmBwq +DncKjvbdSKxeuHKs +DncLKvbdmJDsqUrB +EOcLKvbdGFirNhtR +DncLKvbdEARiMywX +DnbjjvbdZxcjNblS +DncLKvbdWXIwudEg +DoDLKvbdhkeDmuCy +EObkKvbdUslselWK +DoCkKvbdLhakqYAS +DoCjjvbdIMBzmvpk +EPCjjvbdKaKgMbXq +EPCjjvbdiLeDmtcZ +DnbjjvbdsPvPKCvG +DncLKvbdnVUzLKRf +DoDLKvbdiUyeWrVC +EOcLKvbdjblLRGuH +DnbkKvbdhtydvqtb +EOcKjvbdTqQnuVIN +DoCjjvbdMtsRkNAX +EPCjjvbdGKdrbglu +DncKjvbdMoxQvOGs +DoDKjvbdiHKDZWKV +DoDKjvbdULvPAvPJ +DnbkKvbdEvZQPmKF +EObjjvbdkxrrTZGt +EObjjvbdKCicQibx +DoCjjvbdKkAgvAKZ +EOcKjvbdNxOuzcmt +EPDLKvbdbsCjsdJa +EObjjvbdHDkVjBjK +EPCjjvbdYqMdiMeR +EPCkKvbdczYoxZRC +DncKjvbdnPzYujxb +DnbjjvbdMpYRWOHT +DncLKvbdLFegbBRV +DncKjvbdxVMdqYlO +DoDKjvbdFkErbhNV +DncKjvbdLLBHvAJy +DoDKjvbdTfzmkwWF +EPCjjvbdyXiKCQZk +DoDKjvbdqUUGrSLU +EObjjvbdGcjuiaij +EOcLKvbdZRMdhmFR +DoCjjvbdZoNiEdzK +DoCjjvbdEARiNZwX +DoCkKvbdwXMBVaWV +EPCjjvbdVZHsyjoO +DoDKjvbdyXhjBpZk +EObkKvbdtkxWaUAw +DnbkKvbdLrWmZuQz +DncLKvbdySnJNRbH +EPCjjvbdezvYdhsw +DoDLKvbdhancFWqR +EObjjvbdyzeORgiI +EPCjjvbdyXiJbPyk +EObjjvbduVnXiqTA +DnbjjvbdZjTHofaf +EPDLKvbdLrXMyuQz +DnbjjvbdHffyxxXg +DoDLKvbdOStWGdtp +DnbjjvbddijRvUzn +DoCjjvbdYNqAXtut +EPCjjvbdUQpntuHm +DoDKjvbduWOXjQsA +DoDLKvbdtTRsYydc +DncKjvbdpfDeUVaI +DoDLKvbdULuoAvOi +DnbjjvbdqmZjYkhJ +EPDKjvbdZMSETmkm +DoDLKvbdZshhyETO +DncLKvbdQdCaQQcr +DncKjvbdQccBQRES +EOcKjvbdrNZjYlIJ +EPDKjvbdjAQHBPgK +DoCjjvbdnUuZkJqf +DoDKjvbdLAjfmBxR +EObjjvbdUsltFkuj +DoDLKvbdZQleJMeR +DnbjjvbdBraCtGXS +DoDLKvbdaSFbhUGL +EObjjvbdrbGMkgLZ +EPCkKvbdJYUCHlRQ +EOcKjvbdgFkzNfgA +DoCjjvbdaRecHtFk +EPDKjvbdnUuZkKSG +EPDLKvbdkWWmdBww +EObkKvbdypoNJKXA +EOcKjvbdZxdJmblS +DncLKvbdZirhPgCG +DoDLKvbddeOrCXCj +DoCjjvbdOXoVzcnU +DncLKvbdSBdFMJZL +DncKjvbdrzMPraHn +DncLKvbdqZPHfpcx +DncKjvbdVAbQsQqy +DoDKjvbdySnJNSCH +EPDLKvbdtSqsZZeD +DncLKvbdtvOYKRTA +DncLKvbdLGGICBQu +DoDLKvbdDncLKwDE +EObjjvbdNrtVgEtp +EOcKjvbdUQqOtthN +EObjjvbdZtIiYcrn +EOcKjvbdmuVZjjRf +DnbjjvbdcJNKKevx +DoCkKvbdDxXlTtUM +DncLKvbdqZOhHQcx +EPDKjvbdIsZBSlwl +EOcKjvbdNUsRkNAX +DoDLKvbdRbEFMJYk +DnbjjvbdiBncFWqR +EOcLKvbdRzKIScWA +EOcKjvbdRbEFMIyL +EPDKjvbdsPunjDVf +DoCjjvbdhzVFkpmf +EOcKjvbddxZtUSFz +DncKjvbdnVUykJrG +EOcLKvbdEPCkKvbd +EPCjjvbdnUuZkKSG +DnbjjvbdnCKWxOmu +DnbkKvbdYzcFrKVy +DoDKjvbdvmWAMcdm +EObkKvbdhkdcmuDZ +DncKjvbdNsUVgFVQ +EPDLKvbdYzbeqiuy +EOcLKvbdUxgszLOn +DnbjjvbdZQmEiMeR +DoCjjvbdkHflFemk +EPDLKvbdhbPCdwRR +DoDLKvbdWXIwucdg +DoCjjvbdOYOuzcnU +DoDLKvbdcSbkTdJa +EOcKjvbdEvYpQMjF +EPDLKvbdrykosAhO +EObkKvbdrovPJbvG +DoDLKvbdkHflGGNk +DoCjjvbdZtIiYcsO +DoDLKvbdZnmiEdzK +EObjjvbdZMSDsnLm +EPCjjvbdLAjfmBxR +DncLKvbdptUGrRjt +EOcLKvbdNQXqVmgT +DoDLKvbdCIkCLIfK +EPDLKvbduVmxKRTA +EPDKjvbdHbLzEzAD +EPCjjvbdbUbGxKsh +DoCkKvbdjlbLzEgP +EPCkKvbdXGYzUAPT +DnbkKvbduLxXAsaX +EObkKvbdJvUfEFHJ +EOcKjvbdmbKXXoNu +EPDKjvbdQvnDbkgc +DoDLKvbdiUzFWrVC +EObkKvbdZyEKNcLr +DoDKjvbdrEEhpNua +DnbkKvbdzitoocsU +EPCjjvbdmbJvxOnV +EOcLKvbdNddTiIjd +DncKjvbdfpBzvdYI +EObkKvbdBhjbLIfK +DoCjjvbdFjeTDHmV +EOcKjvbdRjyGVGkT +DoCkKvbdZQldhmFR +EPDKjvbdqlzKZLhJ +DnbkKvbdZoOIeEyj +DncKjvbdBdPaVjNG +EPCkKvbdTulPjUBR +EPDLKvbdGGJqmiTq +DoDLKvbdGGJqmhsq +EOcKjvbdIryBTNXl +EPDLKvbdIsYaSmXl +DoCjjvbdVwJXudEg +EPCkKvbduDCtvuoP +EOcLKvbddBsMrAUN +DncLKvbdrouoJcWG +DoDKjvbdCgLfHAzc +DncLKvbdhtzEvqtb +DoDKjvbdZtIiYcsO +DncKjvbdMfbomPtk +DncKjvbdYqNEiMdq +DnbkKvbdCTBCtFvr +DncLKvbdhtzEvquC +DoCjjvbdAMhZSvyx +DoDKjvbdjlbLzEfo +EOcKjvbdZLrETmkm +DncKjvbdULvPAuni +DoCjjvbdtcCtvuoP +EPCkKvbdOTTugEtp +EObjjvbdhtzEvquC +DoCjjvbdkHgLfFmk +DncKjvbdmoyyVkZC +DnbkKvbdsBemLgKy +DoDKjvbddCTMrAUN +DoCjjvbdmuUykJqf +DnbjjvbdbQHGckzd +DoDLKvbdyOShXriD +EPDLKvbdZRNFImFR +EOcLKvbdDoDKkWcE +EPCkKvbdwMvAMcdm +DnbjjvbdbKlFoNcA +DoCkKvbdMfbpMpVL +DncLKvbdhkeDnUby +DoDKjvbdMSWmZtpz +EPCjjvbdmfeYMmgZ +DnbjjvbdqiAKFMoF +DoCkKvbdSBdElIxk +EOcLKvbduoTzpkPU +DncLKvbdDoCjjwCd +EObjjvbdLGGHbBQu +DnbkKvbdQcbaQRDr +EPDLKvbdyNrgxTJD +EObjjvbdtSqryZdc +DoDLKvbdegkWSNpg +EOcKjvbdZLrDsnLm +EObjjvbdFkEsCgmV +DoDKjvbdatagXjtI +DncLKvbdGZUuBDwb +DoDLKvbduDDUvuno +EObjjvbdURROtuIN +DnbkKvbdyXhjBpZk +DoDLKvbdKaLGlaxR +DoCkKvbdlZTRrxgU +EPDLKvbdUsltFlWK +DncLKvbdGGKRnIsq +DnbkKvbdijFhKNXr +DoDKjvbdrWokbiYq +EObjjvbdUaCRSqRy +EObjjvbdRkYfVHKs +DnbkKvbdQvnDcMID +EObjjvbdvBEYrneI +DnbkKvbdySmiNRbH +EPDKjvbdjuvmcaxX +DoCjjvbdVTmUGLuj +EPDLKvbdxVMeRYlO +DnbjjvbdNPwpvNgT +DoDKjvbdJTZArlxM +EPDLKvbdjbkkRHUg +DnbkKvbdSBdFMIyL +EPDKjvbdMgColpUk +DncLKvbdVAbQsQrZ +DncLKvbdyTOJNRag +DnbjjvbdmgFYMmgZ +EPDKjvbdTAFIgbOd +EObkKvbdFWYoomJe +DoDKjvbdIxUBhMRQ +DoCjjvbdFWYopNKF +DoDKjvbdNdcshiLE +EOcLKvbdwWlBWAuu +EPCkKvbdYpldiNFR +EPDLKvbdQwODbkgc +EPCkKvbdqZOhHQcx +EObjjvbdHDjujCKK +DoDLKvbdnBjWwnmu +EPDLKvbdUQqPUuHm +DnbkKvbdIryBSlxM +DnbkKvbdjhGlFfNk +DnbkKvbdqlyiyMHi +EPDLKvbdxmsIYTIc +EPCjjvbdNrsufduQ +DncLKvbdaaWEepPw +DnbjjvbdkVvnDaxX +EOcKjvbdUQpntuIN +EOcKjvbdQdDAopcr +DoCkKvbduMXvaUAw +DnbkKvbdMRwNZuQz +DoCkKvbdNGcQMotk +EPDLKvbduWOYJpsA +DncKjvbdZtJIxcrn +DnbjjvbdwyhFfXeS +EOcLKvbdIryAsNYM +EObjjvbdyTNiNRag +EPCkKvbdiZuGLqOG +DncKjvbdHELWJbKK +DoDKjvbdIGfyxwxH +EPCkKvbdeOdrkTsr +DoDKjvbdpstGrRjt +EOcKjvbdZtJIxdSn +EObjjvbdZtIiZDrn +DnbjjvbdOEctIhkE +DncLKvbdKDJbqJbx +DncKjvbdEOcLKvcE +EOcLKvbdgLGzcGAE +DoCjjvbdGBPQxizm +EPCjjvbdeFOqbXDK +EObkKvbdehKuqnQg +DncKjvbdRosgKFcw +EOcLKvbdUsmUGLuj +EOcLKvbdrXQMCiZR +DoDKjvbdjcMLQftg +EPDLKvbdHEKvKBjK +EPDKjvbdbVCHYLUI +DncKjvbdFfKSOItR +DncKjvbdYSkaNToY +DncLKvbdQvmccLhD +EOcKjvbdnVUykKSG +DoCkKvbdbsDKsdJa +EObkKvbdGLFTChMu +DoCkKvbdqGEFTuaI +EPCkKvbdddoRbXCj +EPCjjvbdMfbpNQVL +DoDKjvbdFjdrbgmV +EPCkKvbdmRxuZsDi +DncKjvbdaRfChUGL +DncLKvbdMJBkqYAS +EObkKvbdxUmEqYlO +EPDLKvbdtbbtvuoP +DoDKjvbdxsOJNSBg +EPDKjvbdZtIhyDrn +DncLKvbdKCicRKDY +EPDLKvbdUtNUFlVj +EPCjjvbdeATqMxJf +EOcLKvbdaNLBsUmH +DoDKjvbdJcJcQjDY +EPCkKvbdiMEdNtby +DoCjjvbdiGibyWJu +DncKjvbdeEnrCXDK +EPCjjvbdUVlPisaR +DncLKvbdXGZZtAPT +DoDKjvbdddoRbXDK +DoDLKvbdSBdElIyL +DoCjjvbdRNXbZOUz +DnbjjvbdTAEhhCPE +EObjjvbdUMVoBWOi +DnbkKvbdFjdrcHmV +DoCjjvbdfIKurORH +DoDLKvbdVBCRTQrZ +EOcLKvbdZoNhddzK +DoCkKvbdULvOaVoJ +DnbjjvbdZirhPgCG +EOcKjvbdVBBprqSZ +DoDLKvbdaSFcIUGL +DoDLKvbdfIKuqnRH +DncKjvbdijGIKNXr +EPDLKvbdrzMPsAgn +EPDKjvbdNUsSKmAX +EPCkKvbdLLAhWAKZ +DncKjvbdkWWnDaww +DnbkKvbdJYUCHlQp +EPDLKvbdNwoVzdNt +DoCjjvbdSLYetfjs +DoDLKvbdptTgSSLU +DncKjvbdxVMdqZLn +DncKjvbdZyDinDMS +DnbkKvbdnPyxujxb +EPCkKvbdSiZjRABM +EPDKjvbdPyNAHSqj +DncLKvbdqwPlChyR +EPDKjvbdGckWJbKK +DoDLKvbdbBWFFoow +DoCkKvbdkCkkRGuH +DncLKvbdmJDtQuSB +EObkKvbdQdCaQQdS +DncKjvbdKfFhBaQu +DncKjvbdaNKaruMg +EOcKjvbdnPzZWLYb +EObjjvbdxUldqZMO +DnbkKvbdGckWJaij +DncKjvbdkVwODaww +EObjjvbdGKdsDHlu +EObkKvbdKQyeOfOF +EPCkKvbdGdKvKCJj +DnbkKvbdGdKuibKK +DoDKjvbdOFDtJJKd +DoCkKvbdwuMdpxkn +EObjjvbdZjShPgBf +DoDKjvbdcyxpYZQb +DnbjjvbdrbGMkgLZ +DnbjjvbdxsNiMqbH +DoDKjvbdWSOXbFLc +EPCjjvbdrDeIomvB +EOcKjvbdEuxopNJe +DoDKjvbdKDKCqKCx +DoCkKvbdkIHLfGNk +EOcKjvbdnUuZjirG +DncKjvbdIryArmXl +DoDKjvbdraemMGkZ +DncKjvbdEJgivYKA +DoDLKvbdbhmJkGWx +DnbjjvbdZyDimcMS +EOcKjvbdhuZeWrVC +DnbkKvbdRbEFMJZL +EPCkKvbdeOdrkUTr +DoCkKvbdlhdUQuRa +DnbjjvbdZtIiZDsO +EPCjjvbdZyEJmcMS +DnbjjvbdFpATWgGZ +EOcLKvbduaDxroEh +DnbkKvbdpeceUWBI +EOcKjvbdjcMLQftg +DncLKvbdnPzZWLZC +DnbjjvbdZyEKNcMS +DoDKjvbdZMSDsnLm +DnbjjvbdOAIsTjSA +DoCjjvbdWSNxCFLc +DoDKjvbdkClLRHVH +DncKjvbdZxdJmcLr +EPCjjvbdOYOuzdOU +DncKjvbdWHxVxHYz +DoDLKvbdwXMBWBVu +EObjjvbdZxdJmcMS +EOcKjvbdrEFJPmvB +EOcKjvbdQcbaQQcr +EPCkKvbdfHkWRnRH +EOcKjvbdrEEiQNvB +EObkKvbdcTCjtDia +DoCkKvbdnCJvwoOV +DoDLKvbdxnTIYSiD +EOcKjvbdGQASvfey +DoDKjvbdUtNTekvK +DoDLKvbdbUbHXkTh +DncKjvbdaNLBsVNH +EPCkKvbdmtuZjirG +EPDKjvbdvlvANEEm +DnbkKvbdcIljLGWx +EOcKjvbdJSyArmYM +EObjjvbdVTltFlVj +DncKjvbdTAFIgbOd +EOcLKvbdUsltGLuj +EObjjvbdZRNEhmFR +EOcKjvbdUGznMXVe +DnbjjvbdTqQoUthN +DncLKvbdZRNEhmEq +EObkKvbdKxpirzuG +EOcKjvbdiVZdvqtb +EOcLKvbdatbGxKtI +DnbkKvbdpfDdsvBI +DnbjjvbdpyPIGqDx +DoCkKvbdqUUGrRjt +DoCjjvbdfHjuqmqH +EPDKjvbdqlzJyLgi +DoCjjvbdznpREcMY +EObjjvbdjuvnEBww +DoCkKvbdQwNdCkgc +DoCjjvbdxsNhlqag +EOcKjvbdbsDKtEJa +EPDLKvbdfIKuqnQg +DncLKvbdJXsbILqQ +DoDLKvbdiUydwRuC +EOcLKvbdUtMsfMVj +DnbkKvbdfNGWflik +DoDLKvbdqwQLcJZR +DncLKvbdYqMeIleR +DoCjjvbdzaAPGgBl +EPCkKvbdauBgYLUI +EPDLKvbdiUydvqtb +DnbjjvbdRyjITCvA +DncLKvbdIwsahLqQ +EPCjjvbdRacdkiYk +EOcKjvbdRbEFMJZL +DoCjjvbdrzLoraHn +EObkKvbdxxIiaozL +EOcLKvbdJcJbqJbx +EPCjjvbdZisHogBf +EOcKjvbdVTmUGMWK +EPDKjvbdrylQSaIO +DncLKvbdSCEEkiYk +DoDLKvbdhtyeXRuC +EObjjvbdQvmcblID +DoDKjvbdauCGwjtI +DnbkKvbdGYtuBEYC +DoCkKvbdkyTSSxft +EPDLKvbdIGfyyYYH +EObjjvbdjlbLzEgP +EPCjjvbdIwsbHkpp +EPDKjvbdmuUyjjSG +DoCkKvbdUQpoUtgm +EObkKvbdUQqPVVIN +DncLKvbdXrkaMsnx +DncLKvbdaMjbTUlg +DncLKvbdhgJbyVjV +DnbkKvbdURQoUuIN +DnbjjvbdFWZQQMie +EPCjjvbdnCJwYPNu +EOcLKvbdBcpBVimG +DoCkKvbdyqPMiKXA +EObkKvbdnVUzKjRf +DnbkKvbdVgwvXgYz +EObkKvbdZsiJZDsO +EPDKjvbdiCPCdwRR +EObkKvbdGYuUaEYC +DnbkKvbdpyPIHREY +DnbjjvbdiZtfLpnG +EPCkKvbdVUNTelWK +DnbkKvbdTppoVUhN +DnbjjvbdxrnIlrBg +EPDKjvbdmIdUQtrB +EObjjvbdkNBkzFGo +DncKjvbdhbOcFXQq +DoDLKvbdNGcPmQVL +EPDKjvbdZoNheEyj +DnbkKvbdjlbLzEfo +DoCjjvbdZRMdiNEq +EObjjvbdczYoxYqC +EPDKjvbdLAkHMaxR +DoDLKvbdsPunibuf +DoDLKvbdNdcshhkE +EPDKjvbdhkdcnVCy +EPCkKvbdVZHtZkOn +DnbjjvbdsrrTYzFD +DoCjjvbdatbGxKtI +EOcLKvbdnGdxMnHZ +EPDLKvbdmaivwoOV +EObkKvbdjJegjMwr +EPDKjvbdYfwEAOri +EOcKjvbdpxngfpcx +DnbjjvbdEPCjkXCd +EPDKjvbdxsOImRag +EObjjvbdEPDKjwDE +DnbjjvbdYlSETnLm +DncLKvbdBiLBjhej +DoDKjvbdrpWPJcVf +DncKjvbdRpTfiedX +DoDKjvbdakMGOnDA +DnbjjvbduVmxKQsA +DncKjvbdKfFhCBRV +DnbkKvbdpfEFTvBI +DncLKvbdqwQLcIyR +EOcKjvbdlhdTpuSB +DncKjvbdqwQLbhxq +DnbkKvbdnHEwlmgZ +EPDKjvbdDoCjkWbd +EObkKvbdANIYsWyx +EObjjvbdpfEEsvBI +EPDKjvbdCJLCKiFj +DoDKjvbdqcdhonVa +EPCjjvbdzjUpQESt +DncLKvbdZQleImEq +EPCjjvbdEPCkLXCd +EPDKjvbdYlRdUNlN +EObkKvbdxwiKBozL +DnbjjvbdFjdsChNV +EObjjvbdwtleRYlO +DoDLKvbdeOdsLUUS +EPDKjvbdZLqctOLm +DoDLKvbdjlbLyeHP +DoCkKvbdaNLCTVMg +DnbkKvbdEKHjWXjA +DnbkKvbdZshhyDsO +DnbjjvbdsPunibuf +EPCkKvbdwWkaWBVu +EPDLKvbdFpATWfey +EObjjvbdzoQQdcMY +EPDLKvbdpxngfpcx +DnbjjvbdgPazwDwh +EPDKjvbdKVtfEEfi +EOcLKvbdhkeENuDZ +EObkKvbdIwtCILqQ +EPCjjvbdyNrhXsJD +DnbkKvbdMSWmZuQz +EOcLKvbdsPunicWG +DncLKvbdULvPBWPJ +DoCkKvbdKfFhCApu +EOcLKvbdTAEhhCOd +DnbkKvbdSKxetfjs +DoCjjvbdUtNTfLuj +EObjjvbdhzVGMROG +DoCkKvbdxsNhmRag +DnbjjvbddZyPwxpb +EObjjvbdEuxooljF +DncLKvbdVTlsfLuj +DoCkKvbdZjShQGaf +EPDKjvbdrSVKnKaN +DnbkKvbdFxuVBDwb +DoCkKvbdJXtBhLpp +EPCjjvbdHffzZXxH +DoCjjvbdqZOgfqDx +DncLKvbdqwQMChyR +EObjjvbdaSGDIUFk +EPDLKvbdZxdKNcMS +EObjjvbdhuZdwSUb +EPDLKvbdfMfWgMik +DncLKvbdZRNFJMdq +EOcKjvbdJKEAKPfd +EPCkKvbdcyxoxYqC +EOcKjvbdCSaCsevr +DoDLKvbdKQzEoGNe +DoDLKvbdjhHLefOL +DoCjjvbdRjxeuGjs +DncKjvbdyOTIXsIc +DnbkKvbdBdQBWKMf +EOcKjvbduLxXBUBX +EObkKvbdrSUkNkAm +DoDKjvbdKfFhBaRV +EPCjjvbdddoSBvcK +DncKjvbdyOTHxTJD +EOcLKvbdiLeENuDZ +DoCjjvbdJbjDRKCx +EPDKjvbddoErkUUS +DoCkKvbdBiKakJGK +DnbkKvbdCIjbKiFj +DoCjjvbdIsZBSmXl +EOcLKvbdBhjajiFj +DnbjjvbdrzMQTBIO +EObjjvbdrWolChyR +EPCkKvbdEARiMzXX +DoDLKvbdrWpMDJYq +EOcLKvbdKRZdoGOF +DoCjjvbdBsAcUFvr +DoCjjvbdBraDUGXS +DoCkKvbdIwtBhMQp +EObjjvbdeATqMxKG +EPDKjvbdYzbfRjWZ +EOcLKvbdsCGNLgKy +DoDKjvbdhficZWKV +EObjjvbdZQldhldq +EPDKjvbdsQVoJbvG +EPDKjvbdsQVnicWG +DoDLKvbdVZITyjoO +EPCjjvbdILazmvpk +EPCkKvbdZMSDsmlN +DoCjjvbdZGvdAOri +DoDKjvbdwuMeRYkn +DnbjjvbdZyEJmblS +EPDKjvbdhkeENuDZ +EPDLKvbdGdKvKCKK +EPCjjvbdjuwOECXw +EObkKvbdZeXfzghb +EObjjvbdJmAEZgUa +EOcLKvbdtcCuWvOo +EPCkKvbdiiehJlwr +DoDLKvbdwtldpyMO +DoCjjvbdjblLQfuH +DncKjvbdNPwpunGs +DnbjjvbdSLZFtgLT +EPDKjvbdyXhjCPyk +EObjjvbdliETpuSB +Dnbjjvbdqlyixkgi +DoDLKvbdmbJvxOnV +DoCjjvbdZjSgpGaf +DoCjjvbdqdEhpNua +DoDLKvbdelfXGmKL +EPDKjvbdIGgZyYYH +DncLKvbdfMfXHMik +DoCjjvbdZoNheEyj +EPCkKvbdsZlPsBIO +EOcKjvbdLAjgMbXq +DncKjvbdVZITykOn +DnbjjvbdpyOgfqEY +EPDKjvbdbUagYKtI +EObkKvbdrSUjnLBN +DncKjvbdQwNdDLhD +EOcLKvbdrykosBIO +EPDKjvbdsPunicWG +EPCjjvbdliDtQuRa +EOcKjvbdcSbkTdKB +EOcLKvbdKaKgNCXq +DnbjjvbdZshhxcrn +DnbkKvbdcbTMrAUN +EPCkKvbdsQWPKDVf +DncKjvbdijGHjMwr +EOcLKvbdULvPBVni +EPCjjvbdffLynHHA +DoCjjvbdTqQntuHm +DoDLKvbdjuwNdCXw +DoCkKvbdVZITzLOn +EPDLKvbdqrUkOLAm +EPDLKvbdZQmEhmFR +DoDKjvbdwjvdHzyf +EPDKjvbdePErjtTr +EObjjvbdmozYvLZC +DnbjjvbdACrXizIp +EOcLKvbdTvMQJtAq +DncLKvbdssSTZZeD +DnbjjvbdmozZVjxb +EOcLKvbdtSrSxzFD +EPDLKvbdZyDjOCkr +DnbkKvbdbBWEeopX +EOcLKvbdkWWmcbXw +DoCkKvbdkVwNdBww +DncKjvbdEzsqFMCi +DncLKvbdACqxJyhp +DoDKjvbdYpmFIleR +DncKjvbdGKdsCglu +DoCkKvbdZnnJFEzK +DoDKjvbdBsBCtGWr +EPDKjvbdBcpAuimG +DnbjjvbdIGfzYxXg +DnbkKvbdGLEsCgmV +EPCkKvbdySnJNSBg +DoCkKvbdPyNAGrqj +EPDKjvbdmaivxPNu +DnbjjvbddoFSkUUS +DoCkKvbdySmiNRag +DoDLKvbdEYXlUUUM +EObkKvbdCTBCtFwS +DoDLKvbdoznDkXoA +EOcLKvbdBvzciEov +DoCjjvbdSPtHJfEX +EPDLKvbdtvOYJqTA +EPDKjvbdZisHpHBf +EPDKjvbdILazmvqL +EOcKjvbdRpUHKGDw +DncKjvbdWXJYWDdg +EPDLKvbdIwtCHlQp +EPDKjvbdUtNTfLvK +DncLKvbddZxpXxqC +EOcLKvbdkNBlZdgP +EObkKvbdqYnhGqEY +EPDLKvbdfpBzwDwh +DncLKvbdTkuoBVoJ +DnbkKvbdvvlBWAvV +DoCjjvbdrXQMCiYq +EPCjjvbdFeiqmiUR +DncLKvbdzjUopDsU +DncKjvbdhkeDmuCy +EPCjjvbdVqnYBdlD +EOcLKvbdSCDeLiYk +DoCjjvbdJvUeceHJ +EPCjjvbdjgfkfFnL +DnbjjvbdkVwNdBww +EObkKvbdczYowyRC +EPCjjvbdZoNhddyj +EPCjjvbdOSsugEuQ +EObkKvbdZMRcsnLm +EObjjvbdrMzJyLgi +EPDKjvbdrSUjnKaN +EPDKjvbdSLYfUfkT +EPDKjvbdUVlQKUAq +DoDLKvbdJcKCqJbx +DnbjjvbdeFPRbWcK +DoCkKvbdVAbQsQqy +DncLKvbdpeceTvBI +DoDLKvbdcIlikFwY +DoDLKvbdbsDLTdJa +EPCkKvbdRXOEClHc +DnbjjvbdbKkennDA +DncLKvbdEzsqEkcJ +EPCjjvbdJvUedEgJ +EOcLKvbdzitpQDsU +DncLKvbdQvnDblHc +EOcKjvbdbQGgDkzd +DnbkKvbddZyPxYpb +EPDLKvbdLrXNZuQz +DoDKjvbdDjIJvYKA +EPCjjvbdbVCHXjsh +EOcLKvbdsPunicVf +EOcLKvbdEzspdlCi +DoDLKvbdmRxtzSdJ +DnbjjvbdsBfNLfjy +DoCjjvbdcTDLUDia +EPDLKvbdidjgVPAO +DoCkKvbduVmxKQsA +EObjjvbdxLXDgzzG +EPCkKvbduaEZSoFI +EOcLKvbddneSjssr +DoCkKvbdWXJYVdFH +DncLKvbdHkaznWqL +DncKjvbdbVCGxKsh +DnbjjvbdiMEcmtcZ +DoDKjvbdqAheAXHd +EPCkKvbdMIalQxAS +DnbjjvbdVviXucdg +DnbjjvbdMpXpumgT +EObkKvbdMJCLqYAS +EObjjvbdczZQYYqC +DncLKvbdUxgtZjoO +EOcLKvbdjuwNdCYX +DncKjvbdSwjlNzkY +EPDLKvbdrWpLbhxq +DoDKjvbdnBjWwoOV +EPCjjvbdmSYtyrdJ +DoDLKvbdzeZnzdzQ +DncLKvbdMowqWOGs +EPCkKvbdqTsfqrLU +EObkKvbdraemMHKy +EOcLKvbdJcJbpjCx +DnbjjvbdmuUzKjRf +DncKjvbdNeEThhkE +DoDKjvbdHakydzAD +EOcKjvbdXsLaNUPY +EObjjvbdLFfHbBQu +DncLKvbdbKlFoODA +DoCjjvbdRpTfiecw +DnbkKvbdRkYetgLT +DoCjjvbdegkVrOQg +DoDLKvbdhlFEOUby +DoCkKvbdFyUtaEXb +DnbjjvbdAMgxsXZx +EOcLKvbdUQqOtuHm +EPDKjvbdxrmiMrCH +EOcLKvbdREDApQdS +DoDLKvbdWRmxBdlD +DnbjjvbdiHKCyVjV +EPCkKvbdxwhjCPyk +EObjjvbdLKaHvAJy +EPDLKvbdZtJJYcsO +DoCjjvbdbPfgDkzd +EObkKvbdUaBqTRRy +EPDKjvbdGYtuAcwb +DnbjjvbdQcbaQRDr +EPCjjvbdsBfNMHKy +EPDKjvbdZyDimblS +DoDKjvbdJXtBglRQ +EObkKvbdpssfrSLU +EOcLKvbdMRwMytpz +DoCjjvbdEYYMUTtM +DoCkKvbdeAUQmXif +DncLKvbdUaBqSpqy +EObkKvbdVAbQrqRy +EObkKvbdwXMAuaWV +DncLKvbdCIjakIfK +DncLKvbdjmBkzEfo +EOcLKvbdKVtfDeGi +EObkKvbdnQZyVjxb +DncLKvbdzRPMhiwA +DncKjvbdJpydnfOF +EPDKjvbdqTsfrRkU +EPDLKvbdEuyQPlie +DnbjjvbdfSBWzlCo +DnbkKvbdqiAKFMne +EPCjjvbdatbHYLUI +EOcKjvbdNsTugEtp +EPCkKvbdmgFXmNgZ +EPDLKvbdMSXNZtpz +DoDKjvbdUaBprqRy +DnbjjvbdXmqAXtvU +EOcKjvbdHlBznWpk +EOcKjvbdVqmwbElD +DoCkKvbdqrVLOLAm +DnbkKvbdZshiYcrn +DoCkKvbdZoNhddyj +EOcLKvbdEuxooljF +DnbkKvbduCcVXVoP +EPCkKvbdmuVZjirG +DncKjvbdRzKHrbvA +EObkKvbdeKJqutzn +EObkKvbdyOShXsIc +EPCjjvbdRbDdlJZL +DoDKjvbdSBdFMIxk +DncLKvbdKaKgMawq +EObkKvbdCDpAuilf +DnbkKvbdRWnDcLgc +DncLKvbdqlzJxkhJ +EPCjjvbdNHDQMpUk +EOcLKvbdRMwbZNtz +EPDKjvbdOEdThiLE +DoDLKvbdUyHszKoO +DnbkKvbdZisIPgCG +DncKjvbdwzHeeweS +DncKjvbdQwODcLhD +DoDLKvbdqdFJPmua +EOcLKvbdvwMAvBVu +EPDLKvbdbVBfwjsh +DoCkKvbdRyjHrcWA +DoDLKvbdWIYVxGxz +DnbkKvbdbiMjLGXY +EOcLKvbdBhjbKiFj +EObjjvbdCDpAvJmG +EPDKjvbdLBKfmCYR +DoCkKvbdbiMijevx +DnbkKvbdyOSgwriD +EPDLKvbdlYrqsZHU +EOcLKvbdwyhGFxFS +EPDLKvbdRyjHsCvA +EPCkKvbdHgGzYxYH +DoDLKvbdGFjRmhtR +EPDKjvbdFyUtaEYC +DncLKvbdeFOrCWbj +DoDLKvbdJSyArlwl +EOcKjvbdZyEKODLr +EOcLKvbdemGXGmJk +DnbjjvbdSCDeLhyL +DoDLKvbdYTLaMsnx +DoCjjvbdxKwEHzyf +EOcLKvbdiVZdvquC +DnbkKvbdUaBqTQqy +EPCjjvbdGZVVBEXb +DoDLKvbdCEQAvKMf +DoDLKvbdRWmdCkhD +EPDKjvbdRotHJecw +DoCjjvbdZxcimblS +EOcLKvbdtbcUvvOo +DnbjjvbdZsiJZDsO +EOcKjvbdRyjHsCvA +EOcKjvbdxLWdHzzG +DoCjjvbdFjdrbhMu +EPCkKvbdxVNFRYlO +DoCkKvbdmIcsqUqa +EPDLKvbdfMfWgMjL +EPDKjvbdTqQoUthN +EOcKjvbdtkwvaUAw +DoDKjvbdBdPaVilf +DoDLKvbdZMRdTmkm +EPDLKvbdelewGlik +DoCkKvbdwzHfFxEr +EPCkKvbdvAcyTPFI +EObjjvbdQdDBPqES +DoDKjvbdZtIiYcrn +EOcKjvbdypnlhiwA +DoCkKvbdNrtWGduQ +DncKjvbdxsOIlqbH +EPCjjvbdANIYrvyx +DnbjjvbdNwnuzdOU +EPCkKvbdFyUuBEXb +EOcLKvbdaaWFGQQX +DncLKvbdraelkfkZ +EPCjjvbdTpqPVUhN +DncKjvbdySmiNSBg +EPDKjvbdrpWPJbvG +EObjjvbdwNWANEFN +EObjjvbdZeYGzhJC +DoCjjvbddndsKstS +EPDLKvbdegkWSORH +EPCjjvbdvwMAvBVu +EPCjjvbdkySqrxgU +EPCkKvbdHkaznWqL +EPCjjvbdqlzKYkhJ +DncLKvbdZxdJmcMS +EPCjjvbdqGEFTvAh +EObjjvbdTYKkmzkY +EPCkKvbdZisHofbG +EOcLKvbdzoPpdcLx +EPDKjvbdZjTHpHCG +EOcKjvbdKWVGEFHJ +EPCjjvbdhyuFlROG +EPCkKvbdFjeTDIMu +DncLKvbdOYPVzcnU +DoCjjvbdSZjISbvA +DoCkKvbdZoNiEdyj +EPCjjvbdrWpMDJZR +EObkKvbdkVvnDaxX +EObjjvbdcSbjtDia +DnbjjvbdLGGICBRV +EPDLKvbdkWWmcbXw +EObjjvbdnHExNOHZ +DncKjvbdUtNUFlVj +EObkKvbdEvZPomKF +DoCkKvbduoTzpjnt +EOcLKvbdURQoVVHm +DnbkKvbdTAEiIBnd +DncKjvbdQwOECkgc +DnbjjvbdRbDdkiZL +DoCjjvbdEPCkLWcE +EPDKjvbdzjUpPdSt +EPDKjvbdZMSDsmkm +DoDLKvbdBdPaWJmG +EPCkKvbdwjwEHzyf +DnbjjvbdhuZeXSUb +DoCkKvbdlYrqsYft +DoCjjvbdEXxMTssl +DoDKjvbdzoPpdbkx +DncKjvbdWRnXbFMD +DoDLKvbddijRutzn +DncKjvbdnCKWwnmu +EOcLKvbdZMSDsmkm +EOcLKvbdUaCRTRSZ +EObkKvbdkCkjpgVH +DnbkKvbdirziTKiz +DoDLKvbdJpyeOenF +EObkKvbdGKdsDHmV +EObjjvbdoAKzshDn +EPDLKvbdlrZVZrci +DncLKvbdRzKHsDWA +EObkKvbdKkAhWAKZ +EPDLKvbdVAaqSqRy +DoCkKvbdjAPgApHK +EPCkKvbdBcpBWJmG +DncKjvbduCbuXWOo +EOcLKvbdqiAKEmOe +EPDKjvbdYpldhleR +DnbjjvbdEPCjjwCd +DnbjjvbdbsDKtEJa +EObjjvbdKfGICBRV +DoDLKvbdRadFMIxk +DoDKjvbdGGJqmhsq +EPCjjvbdJbicQjDY +DncKjvbdbiNKKfWx +EOcLKvbduLxXAsaX +EPCjjvbdEKIJuwjA +EPCjjvbdWRmwadlD +DnbjjvbdfMewGmJk +EOcLKvbdNxOuzdOU +DnbkKvbdfIKvSOQg +DncLKvbdQZNAHSqj +DnbjjvbdZLqdUNlN +EPCjjvbdSLYetgLT +DncKjvbdeEoSCWbj +EPDLKvbdsCFmMGjy +EPDLKvbdLGGHaaRV +DncLKvbdEuxpQMjF +EObjjvbdVYhTzLPO +EPCkKvbdaSFbhTek +DnbkKvbdDihJuwjA +EObjjvbdFjeTDIMu +EObjjvbdhkeDnUby +DoDKjvbdxUmEpyLn +DncLKvbdiVZdvqtb +DoCkKvbdunszqLPU +DnbkKvbdSBcdkiYk +EObjjvbdbhmKKevx +DnbjjvbdVZHtZkOn +DoDLKvbdZirgogCG +DoDLKvbdqBIeAWhE +EPCjjvbdwtmEqYkn +DncKjvbdKCjDRJbx +EOcKjvbdTvLpJsaR +DoDKjvbdyXhjBozL +DnbjjvbduDDUwVoP +DoDKjvbdzaAOfgBl +DoCjjvbdWSOYCElD +EOcLKvbdqwQMDJYq +DoCkKvbdNHColpUk +EPCkKvbdCEPaVimG +EOcKjvbdjKFhJlxS +EOcLKvbdxUleRYkn +DnbkKvbdrNZjZMHi +DoDKjvbdmuUzLKSG +EObjjvbdfIKurOQg +EPDKjvbdQlwbZNtz +DncKjvbdhkeDnUby +EObjjvbdwuMdqZMO +DncKjvbdliDtQtrB +EPCjjvbdNPwqWNgT +DncKjvbdjAPgApGj +EObkKvbdMpYRVmfs +DnbkKvbdGKeTChNV +DoDLKvbdHbMZdzAD +EObjjvbdQlwayOUz +EPDKjvbdVqnYCFLc +DoCkKvbdmpZyVjyC +EObkKvbdUslsfLuj +DoDLKvbdlhdURVSB +EOcLKvbdmSZVZrci +DoCjjvbdYzberJuy +EPDLKvbdhzVGLpnG +EPCjjvbdsPvOicVf +EObkKvbdeOeTLUUS +DncLKvbdmfdxMnHZ +EPDKjvbdHffzYwxH +EPDLKvbdrylPsAgn +EOcKjvbdwWlBWAvV +EPDKjvbdVAbQsQqy +DnbkKvbdsZlPsBIO +DncLKvbdEzspdkbi +DncLKvbdhyuGMROG +DoCkKvbdFaOpxizm +DoCkKvbdZsiIxcrn +DoCkKvbdijGHjMwr +DnbkKvbdcyxpYZQb +DnbjjvbdEzspdkbi +DncLKvbdNQYRVnGs +EObkKvbdkClKpgVH +EOcLKvbdkClKqHVH +EOcKjvbdhanbdvqR +EPCkKvbdmfdwmNfy +EObkKvbdYTMAmUPY +DoCkKvbdIGgZxxXg +EOcKjvbdnHEwlnHZ +DncLKvbdCDpAuilf +EPCjjvbdmbKXXoOV +EObkKvbdapGfdLzd +EPCkKvbdRjyGVHLT +DoCkKvbddoFTLTtS +EPCjjvbdGLFTCglu +DoCjjvbdiLeENtcZ +DoCkKvbdKCicQjCx +EPCkKvbduoTzqLPU +EPCjjvbduVmwiqTA +EPCjjvbdWIXuxGxz +EPCjjvbdpxngfqDx +EOcKjvbdeOdrkTsr +DoDLKvbdNrsufduQ +EOcKjvbdIHHZyXwg +DoCjjvbdpfEEsvBI +EOcKjvbdhgKDYvKV +DnbjjvbdmbJvxOmu +EPDKjvbdGdKujCKK +DoDLKvbdfkGzcGAE +EPCkKvbdZoNiEeZj +EPDLKvbdaMjbTUlg +EPCkKvbdSPsgJfEX +EPDKjvbdDxYLstUM +EPCjjvbdKVtfDeGi +EOcLKvbdpeceTvAh +EObjjvbdHffzYwxH +DnbjjvbdffMZnHHA +EOcLKvbdsQVnibvG +EOcKjvbdZirgpGbG +EObjjvbdJSxaTMxM +EOcLKvbdbrcLUEKB +EPCjjvbdGZUuAcwb +DnbkKvbdpssgRrLU +DnbkKvbdKVteceHJ +EPDKjvbdmajXYOmu +EPDKjvbdNwoVzdOU +DnbjjvbdrpVnicWG +DoDKjvbdjhGlFfNk +EObjjvbdEXwlTtTl +DoDLKvbdkCkkQftg +DncKjvbdDxYLtUTl +DncKjvbdNQYQunGs +DoDLKvbdZQleImFR +DoDKjvbduVmxKRTA +DoDLKvbdsrqsZZdc +DoDLKvbdZLqctNlN +EPDLKvbdNsUVfeVQ +DncLKvbdhuZeXRuC +EPCkKvbdiCObdwRR +DoDKjvbdIwsbIMQp +EObjjvbdtcCtvvPP +EOcLKvbdpyOhHRDx +EObjjvbdmgEwmOHZ +DoCkKvbdelevgNJk +DoCjjvbduLwwBTaX +DoCkKvbdXrlBNTnx +EPDLKvbduCcUvuoP +EPDKjvbdURRPVUgm +EObkKvbdBsBCsfXS +DoDLKvbdZjSgogCG +EObkKvbdhgKDZViu +EPCkKvbdEYXkstUM +DncLKvbdrMzJyLgi +DnbjjvbdaSFcIUFk +EPDLKvbdnBjWxOnV +EPDLKvbdssRryZeD +EOcKjvbderAvzkbo +DoCjjvbdZirhQHCG +DnbkKvbdBraCtFvr +EOcLKvbdxZgfFxFS +DoDKjvbdJuuFdFGi +EPDKjvbdUQqPUtgm +EPDLKvbdNHCpMpUk +EPDKjvbdnCKXYOnV +DoCkKvbddZyQXyQb +DnbjjvbdpxoHgREY +EPCkKvbdfNFwHNJk +DncLKvbdVBCQsQqy +EPCkKvbdUxhTzLOn +EObjjvbdSQTgJfEX +DoCkKvbdrWpLbiZR +DoDLKvbdtcDUwWOo +DoCkKvbdwzHfGXeS +EPDLKvbdrzMPraHn +EPCkKvbdDoCjjvcE +DoDLKvbdbhlijewY +EObkKvbdUxgsyjoO +DoDLKvbdbUafxKsh +DoCjjvbdULuoBWOi +EPCkKvbdVBBqSqRy +DoCjjvbdhkeENtcZ +EPCjjvbdqYnggRDx +DncLKvbdjhHMFfOL +EOcKjvbdZxcinDMS +DoDLKvbdvBDySndh +DncKjvbdirziTKiz +DncKjvbdJXsaglRQ +DncKjvbdhfjDYvJu +DncLKvbdjuvnDbYX +EOcKjvbdKaLHMaxR +DoCjjvbdiGjDZWKV +DnbjjvbdEObjkWbd +DnbkKvbdJmADygVB +EPDKjvbdJvVFdEfi +EPDLKvbdnGeXmOGy +DoCjjvbdpssgSSKt +EPDKjvbdwtldqYlO +EPDKjvbdmfeXmNgZ +DoCjjvbdqvokbiZR +DoDLKvbdqUUHSRjt +EObkKvbdmbKXYOnV +EOcKjvbdaSGChTfL +EPCkKvbdWWiYWDdg +DoCjjvbduoTzqKnt +DnbjjvbdHDkVjBjK +EOcKjvbdbVBfwjtI +EOcKjvbdjvXOEBxX +DncKjvbdZLrETnMN +EObkKvbdfNGXHMjL +EPCkKvbdkDLkRHUg +EObjjvbdZjTIQGbG +DoDKjvbdZsiIyDsO +DnbkKvbdbrbjscjB +EPCjjvbdmbJwYPOV +DoCkKvbdKDJcQicY +DoDLKvbdZxcinCkr +DoDKjvbduoTzqLPU +EOcKjvbddndsKstS +DnbjjvbdNQXqWNfs +EOcKjvbdIidAKQGd +DoDLKvbdTkvOaVni +DoCjjvbdsPvPJcVf +DoDKjvbdVqnXbElD +EOcKjvbdIHGyyXxH +DnbkKvbdUxgszLOn +EPDLKvbdwuMdpxkn +DnbkKvbdqrVLNkBN +DncKjvbdijFgjMwr +EPCkKvbdSQUGjFcw +EObjjvbdRWmdCkgc +DnbkKvbdVTltFkvK +EOcLKvbdJbjCqKDY +EObkKvbdfMfXGmKL +EObjjvbdzRPNJKXA +EPCjjvbdBsAbtGWr +DoDKjvbdJXsahLqQ +DnbkKvbdlBNOmALA +DoDLKvbdlrYtzTDi +EPDLKvbdZtJIxdTO +DncKjvbdmbJvxPOV +EPDLKvbdaMkBsUmH +EPCkKvbdNsUVgFUp +DoCjjvbdWfYytAPT +EObjjvbdNHCpMpVL +EPCjjvbdMgComPtk +EOcLKvbdeqaWzlDP +DoCkKvbdFVxopNKF +EOcKjvbdYkrDsmlN +DncKjvbdWWiYWEFH +DoDKjvbdSLYfUfkT +DnbjjvbdhkeEOVCy +DoDKjvbdJXsagkpp +DoDLKvbdZoOIdeZj +DncLKvbdLiCMRYAS +DncKjvbdyOTHwsJD +DncKjvbdvmWANDeN +DoDLKvbdtTSTYydc +DoCkKvbddneSjtTr +EObkKvbdkDMKpftg +DnbjjvbdbhljKewY +EPCkKvbdIsZBSlwl +EPCjjvbdlqxuZsDi +DnbjjvbdNrtWGeVQ +EOcLKvbdvBEZSndh +EOcKjvbdrJAJdmOe +DoCjjvbdyOTHxTIc +DoCjjvbdmfdwlnGy +EOcLKvbdkDMKpgVH +DoCkKvbdRECaQQdS +DncKjvbdaMjartlg +EPCjjvbdVviXuceH +DnbkKvbdNsUVgFVQ +DoDKjvbdFkEsDIMu +EOcKjvbddZyPwyQb +DoDKjvbdqmZixlIJ +DoDKjvbdrEEhomvB +EOcLKvbdlZSqsZHU +EPCkKvbdehKuqmqH +DoDLKvbdFxtuBDwb +EPCjjvbdKjaHvAJy +DncLKvbdBcpAujMf +DoCjjvbdNQYRWOHT +DoCjjvbdHakzEzAD +EPCkKvbdJTYaSlwl +DoCjjvbdzitpQETU +DoDKjvbdvBEZSoFI +DncLKvbdnBjXXoOV +DoDLKvbdiZuGMROG +DoDKjvbdKVtecdfi +DnbjjvbddjJqvUzn +EPCkKvbdaMjbStlg +EOcKjvbdSZjHsDWA +DnbkKvbdUaCRSqSZ +DoDLKvbdxZgefXeS +DncKjvbdjhGkfFnL +DncKjvbdIjEAJogE +EPCkKvbdNGcPlpVL +DncKjvbdUMWPAvOi +DnbkKvbdatafxKsh +EObkKvbdjcMLQgUg +DoDKjvbddeOqavcK +EOcLKvbdoznELXoA +EPDLKvbdeOdrjtUS +DnbkKvbdjKFhJmXr +EPCkKvbdpxoHfpdY +DoCjjvbdZLrDsnMN +EPCkKvbdwyhFexFS +EOcKjvbdkClKpftg +DoDKjvbdxnTIYSiD +DncKjvbdxnShYSiD +DoCkKvbdFxtuBDwb +EObjjvbdYkrEUNkm +DnbjjvbdNQYQvNfs +EPCkKvbdhlFDnUby +EOcLKvbdiCObdwRR +DoCjjvbdVwJXvEFH +DnbkKvbdBvzchePv +EObkKvbdZHWdAPSi +DncKjvbdHgGzYxXg +DoCkKvbdMJCMQxAS +EPCkKvbdZLqdTmkm +DoDLKvbdnCJwYPNu +EPCjjvbdOSsvGdtp +DncKjvbdlYrqsZGt +EOcLKvbdJYUBhLqQ +DoCjjvbdZisHpGaf +DnbjjvbdVgxWXfxz +EPDKjvbdkWXNdBxX +DoCkKvbdlZTSSyHU +DncKjvbdjggLeenL +DnbjjvbdKNAEZfuB +DoCjjvbdLAkHMaxR +EOcLKvbdZRNFJNFR +DoDLKvbdjAQGaPfj +EObjjvbdjggMGFmk +DoDLKvbdyfyMAMeX +DncLKvbdjbkkRHVH +EOcLKvbdOTTugFVQ +EOcKjvbdWHxWXfxz +EPCkKvbdvwMBWBVu +EPCjjvbdnHEwlnHZ +DoDKjvbdHEKuiaij +DoCjjvbdVwIwvEEg +EPDLKvbdehKvRnRH +DncLKvbdnVUyjirG +EObjjvbdfMevgNJk +EPDKjvbdjbkjqHVH +DncLKvbdrJAKEloF +DoCkKvbdGckWJaij +DnbjjvbdTvMQJtAq +EPCkKvbdhkddNtcZ +DnbkKvbdrzMQTBIO +DncKjvbdsZlQTAgn +EPDLKvbdOFDtJIjd +EOcLKvbdnBivwoOV +DncKjvbdJXtBhLpp +EPCkKvbdJTYaSmXl +EOcLKvbdLGFgbBQu +DncKjvbdnHEwlmgZ +DoCjjvbdACrYJzJQ +EPCkKvbdiZuGLqNf +DnbjjvbdnGdxMmfy +DnbkKvbdRkZGUgKs +DoDLKvbdZisHofaf +EPDLKvbdJKEAJpGd +DnbkKvbdBsBDUFwS +EObjjvbdtcDVWuno +EOcKjvbdBsAbsfWr +EPDKjvbdrWpMChyR +DoDLKvbdVTltFkuj +EPDKjvbdGFjSOJUR +EOcKjvbdBsAcUGXS +EPCkKvbdcJNKKfWx +EPDLKvbdnQZyWKxb +EPCkKvbdqTtGrSKt +EObkKvbdjJfIKNXr +EOcLKvbdVqmxBdkc +EOcKjvbdFWYopMjF +DnbjjvbdqdFJPnWB +DoCjjvbdehKvRnRH +EPDKjvbdkyTRsZGt +EObjjvbdozmckYPA +DnbjjvbdbrcLUDjB +DoDLKvbdrMyixkhJ +DoDLKvbdrpWOjCvG +DoDKjvbdLFehCAqV +DncKjvbdrWpMCiYq +EOcKjvbdVTmUFkvK +EObkKvbdhficZVjV +EPCkKvbdIsZAsNXl +DoCjjvbdmfdxNOHZ +EPDKjvbdznopdblY +DnbjjvbdLiCMRYAS +DncLKvbdePEsKstS +DoDLKvbdUMVoBVni +DncKjvbdWRnXaeLc +EObjjvbdrDdiPmvB +DoDKjvbdDoDKkXDE +DncKjvbdOAIrtJrA +EPCkKvbdwzIGGXdr +EOcLKvbdUQqPUtgm +EPDLKvbdhlFEOUby +DncKjvbdZirhPfbG +EOcLKvbdKVuGEEgJ +DoDKjvbddePSBvbj +EPDLKvbdfHjuqmqH +EPDKjvbdZjSgpHBf +DncLKvbdunszpjoU +EPCkKvbdqTtHRrKt +EObjjvbdfNGXGljL +EObjjvbdUGznMWue +DnbkKvbdsPuoJbvG +EObjjvbdnQZxujxb +EPDLKvbdczZPwyQb +DoCkKvbdWXIwvDdg +EOcKjvbdQvmdDLhD +DncLKvbdCIkBjiFj +EObjjvbdjJegjNXr +DncLKvbdcIlikFvx +EPDLKvbdRkZFtfjs +DoCjjvbdczYoxZRC +EOcLKvbdatagXjsh +DncLKvbdjcLjqGuH +DoCjjvbdMSWlyuQz +DoCkKvbdjuvnDbYX +DnbjjvbdiMEdOUcZ +EPCjjvbdcTDKtEKB +DnbjjvbdwzHeexEr +EPDLKvbdemGWgNJk +EObjjvbdakLfOnDA +EPDLKvbdTfznLvvF +DoDKjvbdaNLBsUmH +EOcLKvbdhzVFkqNf +DoDKjvbdZRNFIldq +DoDKjvbdlrZVZsEJ +EObkKvbdbUagXjtI +DoDLKvbdUyHsykPO +EObjjvbdkVwNdCYX +EPDLKvbdUVkpJtBR +EPDKjvbdrMzJxkgi +EOcKjvbdSLYfUgLT +DoCjjvbdMRwNZtpz +EPDLKvbdIxTaglRQ +EPDLKvbdJqZdnenF +DoDLKvbdZMRdTmkm +DnbkKvbdANHxrvyx +EPCjjvbdFkErbhNV +EOcLKvbdWSNxCEkc +EPCjjvbdiCPCdwQq +DnbkKvbdbAvEeoow +EOcKjvbdeFOrBvcK +DnbkKvbdaRecHtGL +DnbkKvbdZshhxcrn +EOcKjvbdqTtHRrKt +EObjjvbdauBgXjtI +EOcKjvbdQdCaQRDr +DoCjjvbdFVxopMjF +EPDLKvbdIGgZyXwg +DoDLKvbdRpTfjFdX +DnbkKvbdSQUGifEX +DnbjjvbdpxoIHREY +DoDLKvbdqiAJeMne +EOcLKvbdCIkBkJFj +DncLKvbdFfKSNhsq +DoDKjvbdwWkaVaVu +EPDLKvbdNeETiJKd +DnbjjvbdhbOcEvpq +DoCkKvbdrbGMlHLZ +DnbjjvbdLAjgMawq +DncLKvbdlqyUzSdJ +DncLKvbdYkqdTnLm +EOcKjvbdYkrDsnMN +EOcLKvbdnCKXXnnV +DoCjjvbdDncLLWbd +DoDKjvbdYpmFJMdq +EPDLKvbdFpATXHFy +DoDKjvbdJvUfEEfi +EPDLKvbdmJEURVSB +DncLKvbdtbcVWuno +EOcLKvbdbUagYKtI +EObkKvbdcJMjKevx +DnbjjvbdKVuGEFGi +DoCkKvbdZMRctNkm +EOcLKvbdYpmEiMdq +DoDKjvbdYpmEhmEq +DncKjvbdzjVQQDrt +EPCjjvbdzHYlAMdw +EPDLKvbdYkqcsnMN +EObkKvbdiiehJmYS +DnbjjvbdDwwktUUM +EObkKvbdrounjCuf +DnbjjvbdGGKRmiUR +EOcLKvbdwzIGFxEr +EPDKjvbdOEdUJJLE +DoCkKvbdfNFvgMjL +DoDLKvbdOEdThhjd +DnbkKvbdyTOImSCH +EOcLKvbdzitpQESt +DoDKjvbduDCuWvPP +DoCjjvbdTppnuUhN +DoCkKvbdIBlZdzAD +DoCjjvbdZQmFJMeR +DnbkKvbdJXsaglQp +DoCkKvbdSZigrcWA +EObjjvbdZsiIyETO +EPDKjvbdZLqctOLm +DncKjvbdwyhGFxFS +DncLKvbdqwPkcIyR +EPDKjvbdRkYfUgLT +DoCkKvbdxxIjBpZk +DncLKvbdqlyjYlIJ +EPCjjvbdRaceLiYk +EPDKjvbdjlbLyeHP +EPDKjvbdrbFmLfkZ +EPCkKvbdvBEYsPFI +DncKjvbdSBdElJYk +EPDKjvbdpxoIHREY +EPCkKvbdjhHMFfNk +EPCkKvbdANIYsXZx +EObjjvbdnGdxNOHZ +EObjjvbdKQzFPGOF +DoCjjvbdtunYKRTA +DnbjjvbdLFfHbBRV +EOcKjvbdpedEsuaI +DnbjjvbdYkqcsmkm +EPCkKvbdbrcLUEKB +DnbkKvbdNQYQunGs +DoDLKvbdJcJbqKCx +EPDLKvbdIxTbHlRQ +DnbkKvbdvwMAvBWV +EOcKjvbdfHkVqnQg +EOcLKvbdbKkfPNcA +EPDLKvbdVAbQrpqy +DncLKvbdWRnXaeLc +EPCkKvbdFpATXGey +DoDLKvbdyfxlANFX +DoCkKvbdFVyQQMjF +EOcLKvbdxnShXrhc +DoCjjvbdmaivwoOV +DnbkKvbdbsDLTdJa +DoCkKvbdUtMtGMVj +DnbjjvbdNVSqkNAX +EPDLKvbdWfYytAOs +EPCkKvbdZyEJnDLr +EObkKvbdyXhjCQZk +EObkKvbddoFSkUTr +EOcKjvbdeATqMxKG +DnbkKvbdnPyyWKyC +DncKjvbdkySrTZHU +DnbjjvbdmfdxNNfy +EPCkKvbdHlBznXQk +EPDKjvbdZisIPgCG +DncLKvbdrEEhonVa +DoDLKvbdrykosBHn +EObkKvbdqvpLbiZR +DoCjjvbdhkeDnUcZ +DoCkKvbdVwIwudEg +DncLKvbdyXiJaozL +DoCkKvbdyzeOSIIh +EPCjjvbdkVwNcbYX +DncLKvbdTkuoAuoJ +EPCjjvbdijFgimYS +DncLKvbdliEURUrB +DoDKjvbdURQoUuIN +DoDKjvbdrMzJxkhJ +EPCkKvbdqYngfqEY +EPDLKvbddwzUTrFz +DoCkKvbdyYIjBpZk +EPCjjvbdssSSxzEc +EObkKvbdFejSNiUR +EPCkKvbdrEFJPmua +DnbkKvbdiifIJmXr +EPDLKvbdZLrEUOLm +EObjjvbdGFiqnItR +DoCkKvbdjuwNcaww +DncKjvbdmpZxukYb +DoDLKvbdqdFJQNua +EPDKjvbdNQYRWOGs +DoCjjvbdZeYGzhIb +EObjjvbdZjSgpHCG +EObjjvbdhfjDYvKV +EPCkKvbdJpzFOeme +DnbkKvbdlhcsptrB +DncLKvbdFeiqnJTq +EObjjvbdZxcinCkr +EPDLKvbdFVyQPmKF +EObkKvbdelfWfljL +EOcKjvbdJpydnenF +DnbkKvbdbVCGwkUI +EObkKvbdemFwGmJk +DoCkKvbdBsAbsfWr +EPDLKvbdJYTbHkqQ +DncKjvbdyNrgxTIc +DoDKjvbdGQASvfey +EOcLKvbdRNYCZOUz +EOcKjvbdyzeORgiI +EOcLKvbdZQmEhleR +EPCjjvbdmttyjjRf +DnbjjvbdLBLGmBwq +EOcLKvbdKVuFdFGi +EPCkKvbdxmsHwsJD +DoDLKvbdyOTIXriD +EPDLKvbdZsiJYcsO +EPCjjvbdjvXOEBxX +DoCkKvbdlZSqsZGt +DoDKjvbdADRxKZiQ +EOcKjvbdzoQREcMY +EObkKvbdGGKRmhsq +EObjjvbdJutfDdgJ +DoDLKvbdUsltFkvK +EObkKvbdHDkWKBjK +DncKjvbdLqwMzVQz +EObjjvbdaRecITfL +DoDKjvbdakMGPNcA +DnbjjvbdwXMBWAvV +EOcKjvbdQwOEDLhD +EOcKjvbdAMgxrwZx +DnbjjvbdqqtkNkAm +DoDLKvbdbhmKKewY +DoCjjvbdQmYBxnUz +DnbkKvbdvPTzqKnt +EPCkKvbdJqZePGOF +DoDLKvbdTfznMXVe +DoCkKvbdFyVUaDwb +DncLKvbdFxuUaDwb +EObkKvbdhlEcnUby +DnbjjvbdCJLCKhfK +DoCkKvbdPyNAGrrK +EOcKjvbdVgxVxGxz +EObkKvbdSxKkmzjx +EOcLKvbdemFwHMjL +EObjjvbdrEEiPnVa +DoCkKvbdDjIJvXjA +EPCjjvbdYTMAmToY +DoCjjvbdbLMFnmcA +DoCkKvbdrounjCuf +EPDKjvbdrJAJeNOe +DncLKvbdJbicQjDY +EPCjjvbdmpZxvLZC +DncLKvbdVrNxCElD +DnbkKvbdDoDLKwCd +DoDKjvbdsZkpSaIO +EPCjjvbdNQYRVnGs +DoCkKvbdVrOXbFMD +DoCjjvbdlYrqryHU +DoDLKvbdVTltGMVj +DncLKvbdwzHfGXeS +EPCkKvbdmajXYOnV +EOcLKvbdZLqdTmlN +DoDLKvbdqdFJQOWB +EObkKvbdVgwvXgYz +EPDKjvbdkMakzFHP +DoDKjvbdakLfPNcA +EObjjvbdyYJJbQZk +DoDLKvbdDigivXjA +DoDLKvbdHELWJajK +EObjjvbdZGvdAPTJ +EOcKjvbdUGzmkvue +DncLKvbdSZigsCvA +DoDLKvbddBsMrATm +EObkKvbdmSZUzSdJ +DncKjvbdjAPfaQGj +DoDKjvbdlBMoNALA +DnbkKvbdJTZArlxM +EObjjvbdHgHZyXwg +EPDLKvbdhzUekpnG +EPDKjvbdEOcKjvbd +DoCkKvbdjcLkRHUg +EObjjvbdBiLBkIej +DnbjjvbdZMSEUNkm +DoCkKvbdzRPNJJwA +EPCjjvbdGdKuiajK +EPDLKvbdrEFIpOVa +EPCkKvbdKfGHbApu +EPDKjvbdUtMsfMVj +DoDLKvbdbVCHYKsh +EPDLKvbdEztRFMCi +EOcLKvbdJmADzGta +DnbjjvbdtSrSxydc +DoCjjvbdACrYKZiQ +EPDKjvbdsrqsYzEc +DoCjjvbduLxXAtAw +DoCjjvbdEztQdkbi +DoDLKvbdkClKpgVH +DoDLKvbdSCDeMJYk +DoDLKvbdpxoIGqDx +DoCkKvbdDigjVxKA +EPDKjvbdGGKSOJUR +EOcLKvbdiLeDnVDZ +DnbjjvbdyOSgxShc +EPDLKvbdNsUWHEuQ +EOcLKvbdYpmFImEq +DoDKjvbdZLrDtOLm +DncKjvbdJvVGEFHJ +EOcKjvbdZirgogCG +EPCkKvbdKCjCqJbx +EObjjvbdgKfzcGAE +DncKjvbdZjTIQHBf +DoDKjvbdRDcBQQcr +DnbkKvbdZQmEiNFR +EObkKvbdSiZjRABM +EObkKvbdURROttgm +EObjjvbdlZSrSxft +DoCjjvbdNxPVzdOU +EPCjjvbdqAheAWhE +EPCkKvbdwXLaWBWV +DoCkKvbdKDKDQjCx +EOcKjvbdehLVqnQg +DoCkKvbdZxdJmcMS +DncLKvbdDjHjVxKA +EObkKvbdXrlAmToY +EOcLKvbdwtleRYlO +EPCjjvbdtlYWaUBX +EPCkKvbdiUzFXSVC +DoCjjvbdcJNJkFwY +EObkKvbdaRebhUGL +EOcKjvbdNHDQMotk +DoDLKvbdyTNhlqbH +EOcLKvbdKfGIBaRV +EObkKvbdKaLHMawq +DoCkKvbdnCKWwoNu +EPDLKvbdHffzYwxH +DncKjvbdnGdxMmgZ +EPCjjvbdNPwpvNgT +DoDLKvbdYkrEUOMN +DoDKjvbdTqROuUgm +DoDKjvbdvBDyTPEh +DnbkKvbdJKEAKQHE +EObjjvbdiBoCeWqR +DnbkKvbdmRyUyrci +DnbkKvbdJuuGEFGi +EOcLKvbdFyVVBEXb +EObkKvbdwyhGFwdr +EObkKvbdCTBDTevr +DoDKjvbdjbkkQftg +EOcKjvbdVAbQrqRy +EObjjvbdLAkHMawq +EObjjvbdEztQeLcJ +EPCjjvbdcIlikFvx +DncKjvbdZyEJmcLr +EObjjvbdqceJPmua +DncKjvbdZnmiEdyj +EOcLKvbdiGicYujV +DoCkKvbdFeirNhtR +DoCkKvbdDjHjVxKA +DnbkKvbdqFdEsvBI +EOcKjvbdcImKKevx +EPDLKvbdQmXbZOUz +DncKjvbdqcdhpNvB +EObkKvbdsPvOjCvG +DoDKjvbdFVyQPmKF +EOcKjvbdqYnhGpcx +EPDKjvbdKfGIBaRV +EPCkKvbdnGeXmNgZ +DncKjvbdKVtedEgJ +EObjjvbdCTAbsewS +DnbjjvbdeEoRavcK +EPCkKvbdNsUVfeVQ +EPDLKvbdGdLWKCKK +DnbjjvbdKfFhCBRV +DoCjjvbdZLrDtOLm +EPDLKvbdhtydvrVC +DoDLKvbdZjTIPfaf +DoCjjvbdbrcLTdKB +DncKjvbdzoQRFClY +DnbjjvbdSKyFuHKs +EOcKjvbdZQldiMeR +DncLKvbdkySrTYft +DnbkKvbdSLZGUgKs +EPCkKvbduCbuWvOo +DoDKjvbdsCFlkgLZ +DoCjjvbdrDdiPmvB +EPDLKvbdySnJNRbH +EPDLKvbdDoDKkXDE +EPCjjvbdijGHjMwr +EOcLKvbdeJjSWUzn +EPCkKvbdKWVFdEgJ +DoDLKvbdVYhTykPO +EObkKvbdeJiqutzn +DoCjjvbdRjyFuGkT +DoDKjvbdHDkWJajK +EPCkKvbdbKlFnnDA +EPDKjvbdQwOEDMHc +DoDLKvbdZshiZESn +EObjjvbdkyTSSyGt +DoCkKvbdxUmEpyLn +EObjjvbdMuSqkNAX +DncLKvbdbiNJkGWx +DoCjjvbdWIYVwfxz +DncLKvbdkVwNcaww +DoDLKvbdOFEThhjd +DoDLKvbddndrkUTr +DnbkKvbdyzeNrHiI +EPCjjvbdZRNEhldq +DncKjvbdhlEdNuDZ +DoCjjvbdqquKmkAm +DoDKjvbdFyVVBDxC +EPCkKvbdJuteceHJ +DnbkKvbdiBoDEvqR +DoDLKvbdLqvlzUpz +EPCjjvbdrRuKnLBN +DnbkKvbdZjShQHCG +DnbkKvbdcScLTcjB +EOcKjvbdyNrgxSiD +EOcKjvbdZirhPfbG +DoDLKvbdkIGkefOL +EPDLKvbdkCkkRGtg +EPDKjvbdbUafxLTh +EObkKvbdhfjDYvKV +DoCjjvbdpecdsvAh +EOcKjvbdpfDeUWAh +DnbkKvbdPxmAGsRj +DnbjjvbdZMSEUNlN +EOcLKvbdqFdFTvAh +DoCjjvbdWXJXvDeH +DoCjjvbdqUTfqrLU +EPCjjvbdvOszqLPU +EObkKvbdmtuZkJqf +EOcLKvbdjgfkefNk +DoCjjvbdhaoCeWqR +EObjjvbdKaLHMbXq +DoCjjvbdSLZFtfjs +DoCjjvbdFfKSOItR +DnbkKvbdqUUHSSKt +EPCkKvbdHEKujBjK +EObkKvbdIsZBSmXl +EOcKjvbdRDcApQcr +DoDKjvbduDDVWvPP +EOcKjvbdLBLGlaxR +DoDLKvbdIxTbHlQp +EPDLKvbdrRtkOKaN +DoCjjvbdRjyFtfkT +EPDKjvbdGQASwHGZ +EPDKjvbdMgDPlouL +EObkKvbdJXtCILqQ +EObkKvbdrEFJQNvB +DoCkKvbdeOeTKtUS +EObkKvbdSQTgJfDw +EPCjjvbdSQUGiedX +DoCjjvbdqUUGrRjt +EPDKjvbdTqRPVUgm +EPCkKvbdIMBznWqL +EObkKvbdhancEwRR +EOcKjvbdrMzJxkgi +EPCjjvbdhbPDEvqR +EPDKjvbdZHXEAOsJ +EPDLKvbdxnShXriD +DoCkKvbdLLAgvAKZ +DoCkKvbdhficYvJu +EObjjvbdZRMeIleR +DncLKvbdYfwEAOri +DoDLKvbdDwxMTtUM +DoCkKvbdWRmwbFLc +DnbkKvbdNQYRVnHT +DnbjjvbdjmCMZeHP +EPDKjvbdaNKbTUlg +EPCkKvbdidkHVPAO +DoCjjvbdHfgZxwxH +EObjjvbdxwhibPyk +EPDKjvbdFjeTDHmV +DoDKjvbdiCOcFWqR +DoCkKvbdJmADyfuB +EOcLKvbdhficYujV +DncLKvbdYzbfSJuy +DoCjjvbdbUagXjtI +DoDKjvbdjKFhKNYS +EOcLKvbdCIkCLJGK +DoDKjvbdZshiZESn +EPCkKvbdSQTfjFcw +EObkKvbdiMEcnUcZ +EPDLKvbdyOTHxSiD +EPCjjvbdFjeTDHmV +DnbjjvbdJuuGEFGi +EPDKjvbdhkeDnVCy +EPCkKvbdVAaqSprZ +DncLKvbdVUNTelVj +DoCkKvbdfILVrNpg +DncKjvbdNHDQNPuL +EOcLKvbdLZQirztf +EObjjvbdGckWKCJj +EObkKvbdIHGyyXwg +DncLKvbdiUydwSVC +DoDLKvbdpecdtWBI +EOcLKvbdLGFgaaRV +EOcLKvbdezuxeJUX +EObkKvbdgGLymgHA +DnbjjvbdEvZQQNJe +DncKjvbdJcJbpjDY +DoDKjvbdIxTahLqQ +DncKjvbdBcpAvJlf +EObjjvbdnPyyVkYb +EObjjvbdfNGWfljL +DnbjjvbdieLHVPAO +EOcKjvbdRNYCYmtz +EPDKjvbdiHJcYuiu +EObkKvbdMowqVnHT +DoCjjvbdiUydvrUb +EObjjvbdZMRcsnLm +DnbkKvbdaSFcIUFk +DnbjjvbdZyEKNcLr +DnbkKvbdZnnJFEzK +DncLKvbdJSyBSlxM +DoCkKvbdXsMAmUOx +EPCjjvbddneSkTtS +EOcLKvbdVwIxWEEg +EPCjjvbdxsOJMrBg +DncKjvbdkIHMGGOL +DncLKvbdGFjRmhsq +DnbkKvbdySmiNRag +EPDKjvbdpyPHgREY +DnbjjvbdGZUuAcxC +DnbjjvbdiHKDYvJu +DoCjjvbdtlXwBUBX +EObkKvbdTkvPAvPJ +EOcKjvbdSxLLmzkY +DncKjvbdhgJcZVjV +EOcLKvbdZirgogBf +EOcKjvbdTukpKUBR +EPDLKvbdQlwaxmtz +DoCkKvbdNxOuzdNt +EPDLKvbduCbuXWPP +EPCkKvbdmbJvwoNu +EObkKvbdKDKCqJbx +EPCjjvbdyNsIXrhc +EPCkKvbdSCEEkiYk +EObkKvbdOFDshiLE +DoDKjvbdZnmiFEzK +EObkKvbdJbjDRKDY +EObkKvbdYfvdAOri +DncKjvbdkDLjpfuH +DoCkKvbdsrqsZZdc +DoDKjvbdLBLHNBwq +DncLKvbdDjHjWYKA +DoDKjvbdZQleIldq +DoDKjvbdatbGxKtI +EObjjvbdUWMQKUAq +EOcLKvbdlhdUQtrB +EPCjjvbdAMhZTWyx +DoCjjvbdjhGlGFmk +DoDLKvbdHgGzZXxH +EOcKjvbdrykoraIO +DoDKjvbdjJehJlwr +EObkKvbdrEEhonWB +EPCjjvbdiUyeWrUb +DnbkKvbdNQYRVmgT +EPCjjvbdVUNUFkuj +DnbjjvbdEYYMTtUM +DoDKjvbdYpldhldq +EPCjjvbdtlYWaTaX +DoCjjvbdozmdLXoA +DnbjjvbdZnnJFFZj +EObjjvbdZshiZDrn +EPDLKvbdZjShPfaf +DoCkKvbdrpVnibvG +DoCkKvbdQwNcblHc +EObkKvbdxZgefXdr +DoDKjvbdNddUIhkE +DncKjvbdcImJkFwY +DoDKjvbdZirhQGaf +DoDKjvbdqwPkcJZR +EPDLKvbdkHgLfFnL +DncKjvbdlqxuZrci +DncKjvbdRadFLiYk +EPDKjvbdIHGyxxXg +EObkKvbdmpZyVjyC +EPCkKvbdUaBqSpqy +EOcKjvbdqZOgfqDx +EObkKvbdkNBlZeGo +EObjjvbdOAIrsjSA +EPDLKvbdEvZPpNKF +DnbjjvbdczYoxZRC +DoDKjvbdvAdZTPEh +DncKjvbdqUTfqrKt +EPCkKvbdZGwEAPTJ +EPDLKvbdZMSEUNkm +EPCjjvbdYkqctNlN +DnbkKvbdeEnqawDK +DoCjjvbdKVuGEFHJ +EOcKjvbdzitopDsU +DnbjjvbdsBfNLgLZ +DnbjjvbdcImJkFvx +EPCkKvbdMgCpNQUk +EOcLKvbdZQmEhleR +EPDLKvbdtTRrxzEc +DncLKvbdKVuFceHJ +EPCkKvbdyfxlAMdw +DnbkKvbdsZkosBHn +EPDLKvbdwWlAvBVu +DoDLKvbdlqxuZrdJ +EPDLKvbdMRwMzUpz +EObjjvbdFkFTCgmV +EObkKvbdHEKvJbKK +DncLKvbdkNCMZdfo +DoCjjvbddoFSkTtS +EPCkKvbdRpTfjFdX +DoDKjvbdIGgZyYXg +EPCkKvbdBiLCLIfK +DoCjjvbdKQydnfNe +EPCjjvbdHgGzZYYH +DnbjjvbdYNqAYUvU +DncKjvbdGckVjBjK +DoCjjvbdjhHMFemk +DnbkKvbdkIGkeenL +DncLKvbdmaivwnmu +EPDLKvbdmuVZkJqf +EPDKjvbdNddUIhjd +DoCkKvbdRDbaQRES +DncLKvbdTvLojUBR +DncLKvbdtSrSxyeD +DncKjvbdjgflGFmk +DoCkKvbdQwNdDLgc +DoCkKvbdEXwksssl +DoDKjvbdtAHRIAAr +DoDLKvbdSPsgJecw +EObkKvbdjggLfGOL +DoCjjvbdSBdFLhxk +DoCkKvbdiMEdNuDZ +DoCjjvbdhtzFWrUb +EPCjjvbdSKxetgKs +DoDLKvbddndsLTtS +DncKjvbdtcCtwVno +DoDLKvbdACrYJzJQ +EOcLKvbdyOShXrhc +EObjjvbdqquKnKaN +DoCkKvbdnCJvxOnV +EPDLKvbdFWYpQMjF +DnbjjvbdnCJvwoNu +EObkKvbdhfjCyWKV +DoDKjvbdrNZjZLhJ +DnbkKvbdyNrgwsIc +EPCkKvbdSZjITDWA +DncLKvbdqiAJeNOe +DoCkKvbdhaoDEvpq +EOcLKvbdtkwwAtAw +DncKjvbdsPvOicWG +DoCjjvbdWXJYVcdg +DoDLKvbdmIdUQuSB +DnbkKvbdauBgYKtI +EOcLKvbdJbicRKCx +DoDLKvbdsPuoJcVf +EPCkKvbdfILWRnRH +EPCkKvbdAMhYrvzY +DoCjjvbdKWUedEfi +EPCkKvbdhaoDEvqR +EObjjvbdxVMeRZMO +DncKjvbdFaOqZJzm +DncKjvbdIryArlwl +EObkKvbdRWmccLgc +EPCkKvbdsPunibvG +EOcKjvbdQccBPpcr +EPDKjvbdssRsYzFD +DncLKvbdySmiMqbH +EObkKvbdZLqdTmlN +EPDLKvbdVAaqTQqy +DncLKvbdFWZPomJe +DoDKjvbdUVkojTaR +DncKjvbdULvPBWPJ +EObjjvbdUslsfLuj +DoDKjvbdsBfMlHKy +DoCjjvbdkySrTYgU +EPDKjvbdYgXEAPTJ +EOcLKvbdrzMPsAhO +DoCkKvbdcyxpXyRC +DncLKvbdkIGkeemk +EObkKvbdVqnXbElD +EObkKvbdMuSqkNAX +DncLKvbdkNCLydfo +EOcLKvbdUVlQJsaR +EOcKjvbdczZPxYqC +EObkKvbdWIXvXfxz +DoCkKvbddndsLTtS +DnbkKvbdFfJqmiUR +DncKjvbdURROuVIN +EObkKvbdddnrCXDK +DncLKvbdZyEJmcLr +EPCkKvbdVgxVxHYz +DoDKjvbdFfKRmiTq +EPDKjvbddCTNSAUN +DoDLKvbdUxgsykOn +DoDLKvbdBhjbLIfK +DoCkKvbdFejRmiTq +EPDLKvbdmuUykJqf +DoCkKvbdVTmTfLuj +DoCjjvbdkNCLydgP +DnbjjvbdHffzYxYH +EObkKvbdpxngfpcx +EPCjjvbdKQzFOfOF +DncLKvbdOEdThiKd +EOcKjvbdJSyBTNXl +DncLKvbdyNsIXriD +EOcLKvbdJYTagkpp +DoCjjvbdkMakzEfo +DoDLKvbdZjSgpGbG +DnbjjvbdSQUHJfDw +DncKjvbdRpTgJedX +DncKjvbdrykosBIO +EObkKvbdGYttaEYC +DoCkKvbdZxcjNcMS +DoCjjvbdRadElIyL +DoDKjvbdkySqryGt +EPDKjvbdiHJbyWJu +EPCjjvbdwzHeewdr +EPDKjvbdQwNccLhD +DoCjjvbdbBVeGPow +EOcKjvbdddnrCWcK +EPCjjvbdJXtCHkqQ +EObkKvbdrbFllHLZ +DncKjvbdACqxKZhp +DoCkKvbdJXtCILpp +DncKjvbdEYYMTssl +EOcKjvbdwjvdHzzG +EPDLKvbdemGWgMik +EPCjjvbdqvokcIyR +DnbkKvbdUaCQrprZ +DoCjjvbdKCjCqKDY +EPDKjvbdYSlBMtOx +EPDLKvbdyXiKBozL +EObkKvbdZxdKNcMS +EObkKvbdCDpBVjNG +DncKjvbdmgExMmgZ +EObjjvbdHkaznWqL +EObjjvbdkNCLzEfo +EPDLKvbdyNrgwsIc +DncKjvbdnHFYNNfy +DoCkKvbdDwwktTsl +EPDLKvbdTlWOaWPJ +DoDKjvbdmIctRVRa +EPCkKvbdeEnqbWbj +EPDKjvbdTYLMNzkY +DncKjvbdkHgLfGNk +DncLKvbdnPyxvLZC +EOcLKvbdjKGHjMxS +DoCjjvbdiZtfMROG +EPDKjvbdFeiqmhsq +EPDKjvbdDoDKjvbd +EOcLKvbdKRZeOfOF +DoDKjvbdzoQQeCkx +EObjjvbdEOcLKwDE +DoCkKvbdrafNLgLZ +EObjjvbdMfbomPuL +DncKjvbdUQqPUthN +EOcLKvbddjJrWUzn +DoDLKvbdvBDySoEh +DnbjjvbdVUMselVj +DoCkKvbddndrkUUS +EObkKvbdmpZxvKxb +EPCkKvbdmbJvxPNu +EPCkKvbdmfdwlnHZ +DnbkKvbdZRMdhmFR +DnbjjvbdYSlBNToY +DncLKvbdzoQRFClY +EPCkKvbdVZITzLOn +DncKjvbdZtIiZDrn +DncKjvbdFVxopNKF +EOcKjvbdtTSSxydc +EObjjvbdUVlQKTaR +EPDLKvbdkMbLzEgP +DoDLKvbdKDJcQicY +DoDLKvbdJmAEZgVB +EOcKjvbdCWzdJFPv +DncLKvbddneTLUUS +EObjjvbdBcoaWJlf +EPDKjvbdGcjvJbJj +DoCjjvbdddoRavcK +EOcLKvbdAMhZSvyx +DnbjjvbdajlGOmcA +DoCkKvbdCIkCLJFj +DnbjjvbdMSWmZtpz +EOcKjvbdNGcQMpUk +EOcKjvbdTqROuUhN +DoCkKvbdFVxoolie +DoDKjvbdUQpnuUgm +EPDKjvbdnBiwXnmu +DnbjjvbdJuuGDdgJ +EPCjjvbdZLqcsnLm +EObkKvbdZnmheEzK +DoDKjvbdXsMAltOx +EObkKvbdiMEdOUcZ +DoDKjvbdZRNEhleR +DoDLKvbdMIbLpxAS +DoDLKvbdVwIwucdg +DoCjjvbdRbDeLiZL +DncLKvbdZMRctNlN +DoCkKvbdGcjvJbJj +DnbjjvbdSZihScWA +EPDLKvbdkDLjqHUg +DnbjjvbdZisIPfaf +EObjjvbdmpZyWLZC +EOcLKvbdrbGNLgLZ +DnbkKvbdkVvmdBww +EObjjvbddoFSjstS +EObjjvbdxwiJbPyk +EPDKjvbdTvLoitAq +DoCkKvbdZLrDsnMN +DoDKjvbdOAJTUJrA +EObkKvbdURQntuHm +EObkKvbdkIGkefOL +DncLKvbdsCFllHKy +EPCkKvbdatafxKtI +DoCjjvbdiifHjMxS +DnbkKvbdZsiIyDsO +DncKjvbdieKgUoAO +EPCjjvbdBhkCLIej +DnbjjvbdDxXktTsl +EObkKvbdKCjCqKCx +EOcLKvbdIwsahLqQ +EPDLKvbdhzUfLpnG +EObjjvbdbAvEepPw +EOcLKvbdSLZFuHKs +DnbkKvbdIidAJogE +DnbjjvbdJbjDQicY +EPDLKvbdQwODblID +EObkKvbdqZOgfqEY +EObjjvbdkWWnDbXw +DncLKvbdEvZPpMjF +EPDLKvbdKQydnfNe +EObjjvbdUWMQJtAq +EOcLKvbdqrUjmkBN +DoDLKvbdJmAEZfuB +DoCkKvbdhtydvqtb +DoCkKvbdtAHQhABS +EPDLKvbdxZhGGXdr +EPDKjvbdmSZVZrci +DnbkKvbdZjTHogCG +EObkKvbdYqMdiMeR +DoDKjvbddwzUURez +DoDLKvbdbKlFnnDA +EPCkKvbdGGKSOJTq +EObkKvbdLGFgbBRV +DoCkKvbdKyQjSzuG +DncKjvbdJcJcRJcY +EOcLKvbdnBiwYPOV +EOcLKvbdLGGHaaRV +EObjjvbddneSkTtS +DoDKjvbdiLddOUcZ +EObkKvbdsPvOjCuf +DnbkKvbdZyEKOClS +DoCjjvbdyzeORhIh +DnbkKvbdhkeDmuCy +EObkKvbdvvkaWAvV +EOcKjvbdzeZnzdzQ +DoCjjvbdVAaprqSZ +EObjjvbdjhGkefNk +DncLKvbdSKxfVHLT +EPCjjvbdZRMeImFR +DncLKvbdFeirOJTq +DncLKvbdFfJrOItR +DoDLKvbdmoyyVkYb +DncLKvbdddoRavcK +DoDLKvbdauBfxKtI +EObjjvbdSPtHJfDw +EPCjjvbdCEQBWJmG +DoCjjvbdDnbkLWcE +EPDLKvbdVUNUGMVj +DnbkKvbdnQZyVjyC +DnbkKvbdgFkymfgA +DoDKjvbdRDcBQQdS +EOcKjvbdtcCuWvOo +EObkKvbdlrYuZrdJ +DoCjjvbdZirgogBf +DoDLKvbdMfcPmPuL +EOcKjvbdDwwlTtTl +DncLKvbdwXLaWAuu +EPDKjvbdUaBqSpqy +EObkKvbdHlBznXRL +EPCkKvbdkMakzFHP +DnbkKvbdqZOgfpcx +DnbkKvbdUMWOaWPJ +DncLKvbdMfbolpVL +EObjjvbdfekynGgA +EPCkKvbdWWiXvEFH +DoCjjvbdpxnhGqDx +DoDKjvbdsQVnjDWG +EObkKvbdYNqAXtut +DncLKvbdDnbkLXCd +EObkKvbdKaLGmBwq +DoCkKvbdBvzciFPv +DoDLKvbdjKFgilwr +EPCkKvbdUaBqTQqy +DoDLKvbdVgwvYHYz +EPDKjvbdIHGyyXwg +EPDKjvbdEXxMTstM +DnbkKvbdQccBPpcr +DnbkKvbdMgCpNPuL +EPDKjvbdSPtHKFcw +DoDKjvbdkIHMGFnL +DncLKvbdnGeXmNgZ +DoDLKvbdhtyeWquC +EObjjvbdqGEFUVaI +EOcLKvbdNPwpumgT +DnbkKvbdZshiYdTO +DoDKjvbdZMSETmkm +DncLKvbdRbDdkhyL +EPCjjvbdTvMQJtBR +EObkKvbdjvXOEBww +DncLKvbdrXPkbiZR +EOcLKvbdFejSOJTq +EOcKjvbdegjvRnRH +EPDLKvbdJvVGDeHJ +EObjjvbdXrlBMtOx +DncKjvbdFejSNhsq +EPDKjvbdBiLBjiGK +EOcKjvbddiirVtzn +EPDLKvbdVBBqTRRy +DoCkKvbdeqaWzkcP +EObjjvbdqYnggREY +EPDKjvbdEARiNZwX +EObjjvbdSQTfifEX +EObjjvbdLBLHNBxR +EPCkKvbdNHCpMpUk +EPCkKvbdKVuGDdfi +EPCkKvbdxrnImRbH +EOcLKvbdZRNEiNFR +EOcLKvbdtbcUvuno +EPCjjvbdJTZAsNXl +EPDLKvbdFVyQPljF +DoCkKvbdieKftoAO +EObkKvbdZMSETnMN +DoCjjvbddePSBvcK +DncLKvbdqUUHSSLU +DoDLKvbdZQldhmEq +DoDKjvbdOTTugFUp +DncLKvbdZsiJZESn +DnbjjvbdtbcUwWPP +EPDLKvbddwzTtRez +DnbjjvbdZoNheFZj +EPCkKvbdKfFgbApu +DoDLKvbdhytfMQmf +DnbkKvbdnGeXlnGy +EPCjjvbdSBcdlIyL +DncKjvbdbAvFFpPw +EObjjvbdzoPpeClY +EOcLKvbdqwQMDIyR +EPCjjvbdmaivxOmu +EPCjjvbdIwsahLqQ +DncLKvbdddoSBwCj +EOcLKvbdrEEhpNvB +DoCjjvbdEPCkKvcE +DncKjvbdePEsLTsr +DncKjvbdmRyVZsEJ +DnbjjvbdZLqdTnMN +EPDKjvbdRbEFMIxk +EObjjvbdJXsbHlRQ +DncKjvbdkDMLQftg +EOcKjvbdOEctJIjd +DnbkKvbdqTsfrRkU +EPDKjvbdkIGkeenL +DoDLKvbdUxhUZjnn +DncLKvbdwyhFexFS +EPDKjvbdbLLfOmcA +DnbkKvbdtbbuXWPP +EOcLKvbdYpmEhmFR +DnbkKvbdxmsHxTIc +DoDKjvbdznoqFDLx +EObjjvbdmfdxMnHZ +EObjjvbdYTMBNUOx +EObjjvbdADRwizJQ +EOcLKvbdMoxQvOGs +EOcLKvbdrWolDJYq +EPCjjvbdeFPRbXDK +DoDKjvbdrDdhpNvB +EPDKjvbdZxdKODLr +EOcLKvbdWSNwadlD +EOcKjvbdxrmhlqbH +DoDLKvbdzoPqEblY +DncKjvbdTkuoBWPJ +DnbjjvbdrykpSaHn +EOcKjvbdKWUfDdgJ +DnbkKvbdZMSEUOMN +EObkKvbdSBcdkhxk +DnbjjvbdIGfyyYXg +EPCkKvbdnBjWwoOV +EOcKjvbdzaAPGgBl +DnbjjvbdkVvmdCXw +DoDLKvbdkDLkQfuH +DoCkKvbdVqnXbFMD +DncKjvbdWWiXuceH +DoCjjvbdBvzdIePv +DncKjvbdLFfICBQu +DncLKvbdeFPRawDK +DncKjvbdjmBkydgP +EObjjvbdVUMtFkuj +EPDLKvbdrSUjmkBN +DoDLKvbdSPsgKFdX +DoDKjvbduDDVXVno +DoCjjvbdMuSqjmAX +EPCkKvbdZyEJmcLr +DnbkKvbdMfcQMouL +DoDLKvbdUMWPAuni +DnbjjvbddZxpYZRC +EPDKjvbdbAvEeopX +DnbkKvbddoErkUUS +DoCjjvbdePErjstS +EOcKjvbdGKeTDHlu +EObjjvbdfIKvSORH +EPCjjvbdUsmTelWK +EObkKvbdaMkBsVMg +DoCkKvbdRjxfVHKs +DnbkKvbdMpYQumgT +DncLKvbdVwIxWEFH +DncKjvbdaMkCTUmH +DoDLKvbdhlFENuDZ +EPCjjvbdZisIPgCG +EPCjjvbdZnnJEdzK +EPDKjvbdGLEsDINV +EObjjvbdYzcFrKVy +EPDKjvbdZirhPgBf +EPDLKvbdKaLGmCXq +EObkKvbddoErkTsr +DoCkKvbdRXNdCkgc +DoDLKvbdEvZQQNKF +DoCkKvbdZoNhdeZj +EPCkKvbdhkddNtby +EPDLKvbdZLrDtNlN +DncKjvbdRbDdlIxk +EPCkKvbdEOcKjwCd +DncKjvbdlqyUyrdJ +DoDLKvbdNddThhkE +EOcKjvbdwyhFewdr +EPDLKvbdiUydwSVC +DnbkKvbdYzcFqjWZ +DnbkKvbdiBoCdwRR +EOcLKvbdpecdsuaI +EPCkKvbdQlxCYnUz +EPDLKvbdVvhxWEEg +EOcLKvbdlZSqryGt +EPCkKvbdUaCQsQqy +DoCkKvbdvAdZSndh +DnbjjvbdmttykKRf +EPCkKvbdYgWdAPTJ +DoCkKvbdlYrqsZGt +DnbkKvbdZsiIxcrn +DoCjjvbddeOqavbj +EObkKvbdbVBfwjsh +EObjjvbdMoxQvOHT +EPCkKvbdRbEFLiYk +DoCkKvbdlhdTqUqa +EOcLKvbdMIbMRYAS +EObkKvbdDncKkWbd +DncLKvbdfSAvzkcP +DnbkKvbdxsOIlqbH +DoCkKvbdADSYKZhp +EPCjjvbdZshiZESn +DoCjjvbdieLGuPAO +EPCjjvbdkHgMFenL +EPDKjvbddBrlrAUN +DncKjvbdddoSCXCj +EPCjjvbdsQWOibvG +EObkKvbdKkBHvAKZ +EObjjvbdkWWmdBww +EObjjvbdnGeXmNgZ +EOcLKvbdyNrgwrhc +DnbkKvbdNddThiLE +DncKjvbdDjHivYKA +EObjjvbdWXIxWDdg +EObjjvbdrMyixlIJ +EOcKjvbdcyyPxYpb +DncKjvbdcyxowxpb +EOcLKvbdhbOcFXQq +EOcKjvbdHDjuibKK +DoDKjvbdiVZeXRuC +EOcKjvbdnBjXYOnV +DnbkKvbdOTTufdtp +DoDKjvbdVAbRTRSZ +DnbjjvbdRXOEDLgc +EOcLKvbdznopdcLx +DncLKvbdRNXayOUz +DncLKvbdSPtHKFdX +EPDKjvbdxUldqYkn +DoCkKvbdZRNEiNEq +EPDKjvbdrbFllGjy +EPCjjvbdUyHszLPO +DncLKvbdxwhibQZk +EOcKjvbdFWYopMie +EOcKjvbdaNKbTVMg +DnbjjvbdliETqUrB +EObjjvbdRXODbkgc +DnbkKvbdTlWPBWPJ +EOcKjvbdOFEThiKd +EObjjvbdMSXMzVQz +EObjjvbdHDkVjCKK +EPDLKvbdqFceTuaI +EOcKjvbdFyUtaDxC +EOcLKvbdmgExMnGy +DncKjvbdtlYWaUBX +DoDKjvbdCDoaWJlf +EPDKjvbdkyTSTYgU +DoCjjvbdqqtjnLAm +DnbjjvbdGYtuAdXb +DoCkKvbdBhjbLIfK +EPDKjvbdNPwqVmfs +DoCjjvbdsrqsYzFD +EPDKjvbdSPsfjFdX +EPCjjvbdZyDjNbkr +EPDKjvbdqZOgfpcx +EPCkKvbdqGDeUVaI +DoDKjvbdUVkpKUAq +DoCjjvbdRpUGjGEX +DoDLKvbdmgFYMmfy +EPDLKvbdRpUHKFcw +DoDLKvbdEvZQPmKF +DoDKjvbdZshhxdTO +DoCjjvbdiZuGMROG +DoDKjvbdfpBzvdYI +EPCjjvbdmgFYNOGy +EOcKjvbdNrtWGdtp +DnbjjvbdWHxVwgYz +EPCkKvbdJbjDRKDY +EPCjjvbduWOYJpsA +DncKjvbdehLVrORH +DoCjjvbdGFjSOItR +DoCkKvbdjuwODbYX +EObjjvbdJTZBSmXl +DnbkKvbdzQoNIiwA +EObjjvbdjJfHilwr +EOcKjvbdJpyeOfOF +DnbjjvbdqFdEsuaI +EPDLKvbdUxhTzKoO +EPDKjvbdBraCsfXS +DoCjjvbdLAjgNBxR +EObkKvbdlhdTqUrB +EPCjjvbdZoOIeFZj +DnbjjvbdrDdhpNua +EPCjjvbdIHHZxxYH +EPCkKvbdiMEdOVCy +DoDKjvbdhgJbxvKV +DoDLKvbdUyHsyjoO +DoDKjvbdGQATXGfZ +DnbjjvbdvAdYroEh +EPCkKvbdhtydvrUb +DoCjjvbdsQWOicWG +DncLKvbdcJMjLGWx +DoCkKvbdIwsaglQp +DoCkKvbdYkrEUOLm +EObkKvbdVvhxWDeH +EPDLKvbdZMRdTnLm +DoCjjvbdADRwizJQ +DoDKjvbdSwjkmzjx +DnbkKvbdBiKbLIfK +EPCjjvbdRyigsDWA +EPDKjvbdRXOECkhD +EObjjvbddxZtTqez +EObjjvbdbBVdfPow +DncLKvbdMfcQNQVL +EPDKjvbdVBBqTQrZ +DncKjvbdZMRctOLm +DncKjvbdGGJrOIsq +EPCjjvbdZMSETmlN +DoDLKvbdhlEdOVDZ +EOcLKvbdOhAXyAZB +DoCkKvbdyOTIYSiD +DoCjjvbdUtNUGMVj +EObkKvbdWXJYWDdg +EOcLKvbdBhjbKhej +EObkKvbdVwIwvDdg +EPDLKvbdzjUpQDsU +EOcKjvbdqAiFAXHd +DoDLKvbdqrUkNjaN +EOcKjvbdYORAYUvU +EOcLKvbdcIljLFwY +DnbkKvbdVwJXvDdg +DoDKjvbdVBCQsRSZ +DoDLKvbdmuUzKiqf +EObkKvbdJYUCILpp +EPDKjvbdsQVoKCvG +EPDLKvbdmoyyVkZC +EPDLKvbdsCGNLfjy +EOcKjvbdbiNKLGWx +DoCjjvbdrpVnjDWG +EObkKvbdfVzxPizs +DnbkKvbdRXODcLgc +EPCjjvbdjJfIJlxS +DoCjjvbdZLqcsnLm +DncKjvbdjuvnECXw +DoDLKvbdEPDKkXCd +DnbjjvbdOSsvGduQ +DoDKjvbdIMBzmvpk +EPCjjvbdqrUkOLAm +EPCjjvbdTkvOaVoJ +EObjjvbdozmdKwoA +DncLKvbdDxXkstTl +EOcKjvbdfMewHMik +DoDLKvbdGKeTCgmV +EObjjvbdxnSgwsIc +EPCkKvbdaaVdepPw +EObkKvbdqGEFUVaI +DncLKvbdjblKpgUg +DoDLKvbdRWnEDLhD +DnbjjvbdFxuVAcxC +DncKjvbdqZOhGpcx +DoCkKvbdfHjvRnQg +DnbkKvbdwMvANDeN +EObkKvbdFfKSOIsq +DoCjjvbdmajXYPNu +EObkKvbdANHyTXZx +EPCjjvbdLFfHbAqV +DoCjjvbdVgwuxHYz +EPCjjvbdQvmcblHc +DoDKjvbdaSFbhUGL +DncLKvbdzHZMANFX +DncKjvbdySnJNRbH +DoCjjvbdMpYRVnHT +EObkKvbddePSBwDK +EPCkKvbdMfcPmQUk +EObjjvbdMgCpNQVL +DoDKjvbdrEFIonWB +DoDLKvbdFjdsCgmV +EObjjvbdwtmFRYlO +DnbjjvbdIwtBgkqQ +EPCjjvbduaDxrndh +EPDLKvbdShzKRABM +DnbjjvbdfHjvRnRH +EOcKjvbdBiLBjiGK +EPCjjvbdCEPaWKNG +DoDKjvbdtbbuWuoP +DoDKjvbdegkWRmqH +DnbjjvbdNeETiJLE +EPCkKvbdjcLkRHUg +DnbjjvbdjvXOEBww +EOcLKvbdTlWPAvOi +DoCjjvbdrMyixkhJ +EObkKvbdqGEEtWAh +DncKjvbdbBVeGQPw +DoDLKvbdpssfqqjt +DnbkKvbdFWZPomJe +DoDKjvbdSBcdkiYk +DoCkKvbdvBEZSoFI +EOcKjvbdRaceLhxk +EOcKjvbdJKEAKQHE +DoDLKvbddZyQYYpb +EObjjvbdeXzTsqez +DncLKvbdCSaCtGXS +EPCkKvbdlZSrSyHU +EOcLKvbdTJZiqABM +DncLKvbdvAdYsOdh +DnbkKvbdcyxoxZQb +DnbkKvbdhanbdwRR +EPCjjvbdbBVeFopX +DncKjvbdGLFTDHmV +DoCjjvbdiZuGLpmf +EOcLKvbdJbjCqJbx +EObkKvbdGdLWJbKK +DoCjjvbdRkZGVHKs +DoCjjvbdGckWJajK +DncKjvbdAMgxrvyx +EPCjjvbdEPDKjvbd +EOcLKvbdkDLjqGtg +DoDLKvbdNPxRVnGs +DoDKjvbdySmhmRag +EPCjjvbdVqnXadkc +EPDKjvbdTulPitAq +EObjjvbdGLErcHlu +DoDLKvbdHELWKCJj +EObjjvbdbVCHYLUI +DncKjvbdqvpLbiZR +EPCjjvbdvAdZSoFI +EOcLKvbdfjfzcGAE +DnbjjvbdaNKartmH +EOcLKvbdcTDKsdJa +DncLKvbdOSsufduQ +DnbkKvbdyYIiapZk +DoCjjvbdunszqKoU +DoCkKvbddndsLTsr +DoDKjvbdxxJKBoyk +DoDLKvbdrovOibvG +EPCkKvbdiLddOVDZ +EPCkKvbdiBncFWqR +EOcLKvbdZQldiNFR +DoCkKvbdOEctJJKd +DoCkKvbdrMzKZMIJ +DnbkKvbdVhYVwgYz +EOcLKvbdQvnDblHc +DoDLKvbdmJEURVRa +DoDLKvbdCTBDUFwS +EPCkKvbdNrsvHEuQ +DnbkKvbdegkVqnRH +DoCjjvbddBrlrATm +DoCkKvbdCJLCLJFj +EOcKjvbdxZgefXeS +EPDKjvbdZtJJZDsO +DoCkKvbdQvmdDMID +DoDLKvbdRaceLhxk +DnbkKvbdSBdFLhxk +DoDKjvbdOTTufdtp +DoDLKvbdnQZxujyC +DnbjjvbdZshhyETO +DoCjjvbdtvOYJqTA +DncLKvbdRMxBxmtz +DnbjjvbdEzsqElCi +EObjjvbdKefHbAqV +DnbkKvbdmpZyWKyC +DncLKvbdNQXqWOGs +EPDLKvbdVTlsekuj +EPCkKvbdGcjvJajK +EPDLKvbdIryArlxM +DoDLKvbdwyhGFwdr +EPCkKvbdzaAOgGal +DncLKvbdiHKCxvJu +EOcKjvbdLBKgMbXq +DoCjjvbdTppoVVIN +EPDKjvbdNPxQvOHT +DnbjjvbdTvLpJsaR +DncKjvbdnVUyjiqf +EPCjjvbdVUNTfLvK +EOcLKvbdDxYLtTtM +DnbkKvbddePSCXCj +EPDLKvbdgGLzOHHA +DoCkKvbdTukpKTaR +DncLKvbdVUMtGMWK +EObkKvbdXnRAYVWU +DncLKvbdyqOmJJwA +DoDKjvbdFVyQQNKF +DncKjvbdvOszqLOt +EPCkKvbdZRMdhmFR +EPDLKvbdhlFDmuCy +EOcKjvbdkIHLeenL +DnbjjvbdqceJQOWB +DoCkKvbdzitpPdSt +EPCjjvbdFeiqmhtR +DoDLKvbdsQVoJcVf +EPDLKvbdUQpnuVIN +DoDLKvbdWSNxBdlD +EPCjjvbdpyPHgQcx +EOcKjvbdUyHsyjoO +DoCjjvbdxrnJNSCH +DoCjjvbdKDKCpjCx +EPDLKvbdxsOIlrBg +DoCkKvbdnGdxMnHZ +EPDLKvbdfHkWSNpg +DnbjjvbdkHgMGFnL +EOcLKvbdxmsIYSiD +DoDLKvbdEXxLsssl +DoDKjvbdjFLGuPAO +EOcLKvbdeEoRawCj +DoDKjvbdyOTIYSiD +DnbjjvbdIHGyyXxH +DncKjvbdTqQoUuHm +EOcKjvbdMfcQNPuL +DnbkKvbdatbGxKsh +DoDKjvbdOTUWHEtp +EPCkKvbdGLFTCgmV +DoDKjvbdkHfkfGNk +EObjjvbdJXtBhMRQ +EObkKvbdRpUHKGEX +DnbjjvbdiUzFWrVC +EPCkKvbdliETqUrB +DnbkKvbdZjTIQHBf +DoCjjvbdZMSETnLm +EPDLKvbdFWYoomKF +EPDLKvbdRaceLhxk +DoDLKvbdEASJNZwX +EPDLKvbdGZUtaEXb +DncLKvbdyNrgxSiD +EOcKjvbdbVBgXkTh +EPCkKvbdvOszpkOt +EObkKvbdKfGHbBRV +DncLKvbdjvXOEBxX +EPDLKvbdvAcyTPFI +EObjjvbdNsUWGeUp +EPCjjvbdZtIiZDrn +DoDLKvbdrRtkOLBN +DncKjvbdptUHSSLU +DncLKvbdWSOXaeLc +EPCkKvbdiLeDmuCy +DoCjjvbdhyuFkqNf +DnbkKvbdzoPqFDMY +DoCkKvbdGFirOItR +DoCjjvbdEObjkXCd +DnbkKvbdjKFgilwr +EPDLKvbdVwIwvEFH +DoDKjvbdfIKvRmpg +EPDLKvbdOFDsiIkE +EPDLKvbdGKdrcIMu +EPDKjvbdZnmiEeZj +DoDKjvbdKWVFceHJ +DncKjvbdvBDySneI +DncKjvbddeOqawCj +DoCkKvbdEztRFLbi +EPDKjvbdMpXpumgT +EPDKjvbdtunYJqTA +EPCjjvbdegkVqmpg +EObjjvbdlYsRsZHU +EOcKjvbdbUagXkUI +EPDLKvbdANHySvyx +DnbkKvbdmJEUQtqa +EPDKjvbdVUNUFlVj +EPCkKvbdvvlBVaVu +DoCjjvbdmozZWLYb +DoDKjvbdwzIFfXeS +DoDLKvbdNQXpvOGs +DncLKvbdEYXlTstM +EPCkKvbdbUbGwkUI +EOcLKvbdLBLHNBxR +DnbkKvbdePErkUUS +EObjjvbdyXiJaoyk +DncLKvbdVrNxBeLc +DoCjjvbdaRebhUGL +EOcKjvbdxsNhmSBg +EOcKjvbdXrkaMsoY +EObjjvbdhuZdwSVC +DoCkKvbdqGEFUWAh +DoDKjvbdegkVrNpg +DoCkKvbdtcCtvuoP +EOcKjvbdmJEUQtrB +EOcKjvbdWXIwucdg +DoDLKvbdhgKCyWJu +EPCjjvbdcSbkUDjB +EPDKjvbdLrWmZuQz +EPDLKvbdXrlAlsnx +DnbkKvbdKNADygUa +EPDKjvbdyNrhXsJD +EOcLKvbdIsZBSlxM +EPCkKvbddndrkTsr +DnbjjvbdFyUuBEYC +EPCkKvbdJcKCpjCx +EObkKvbdbBWFGQPw +EOcLKvbdFjdrbhNV +EPDLKvbdrDdiQNvB +EObkKvbdkHgMGGOL +EPCkKvbdkySrSyHU +DncLKvbdaaWEfQQX +EObkKvbdehKvRmpg +DnbkKvbdmIdURVRa +DoDLKvbdvBEZSneI +DoCkKvbdNdcshhjd +DncLKvbdZyEKOCkr +DoCkKvbdVrNwbFMD +DnbkKvbdnCKXXoNu +EPDKjvbdSQTgKGDw +EObkKvbdaRfCgtFk +EObjjvbdkWXNcaww +EObkKvbdDihJuxKA +DncLKvbdnVVZkKSG +EPCkKvbdVBBqSpqy +DncLKvbdqGEFUWAh +DoCkKvbdsPvOjDWG +DncKjvbdySmiNRbH +DoDKjvbdraemLfjy +DoDLKvbdnPzZWKxb +DnbjjvbdRjxfVGkT +DoDKjvbdGLEsDHlu +DnbjjvbdRotHKFdX +DoCkKvbdRpUGiecw +DnbjjvbdZjTHogBf +EPDKjvbdcTCjtDia +EOcKjvbdrounibuf +EOcKjvbdVBCRSqRy +EPDKjvbdEvZPolie +DnbkKvbdzRPNJKXA +DncLKvbdBhjbKiGK +DnbkKvbdqrVKmkBN +DnbjjvbdBraDTewS +DnbkKvbdJcKDRJbx +DoCjjvbdbUbHYLUI +DoDKjvbdUyITykOn +DoCkKvbdYlSEUOMN +EPCkKvbdRpUHKGEX +EObkKvbdTAFJICPE +EPDKjvbdrpWPJcVf +DoCkKvbdZnnJFFZj +EPCkKvbdkVvmcaxX +EOcKjvbdyzdnRgiI +EObjjvbdqAiFAXIE +DncLKvbdWWiYWDeH +EPCjjvbdqlzKZLgi +EObjjvbdauCGwkUI +DoDLKvbdtTSSxydc +EObkKvbdbVCGxLTh +EObkKvbdkWWmdBxX +EObjjvbdRNXaxnUz +EOcKjvbdwXLaVaVu +DncKjvbdqTtGqrKt +DncKjvbdIjEAJpGd +EPDKjvbdHffyyXwg +EObkKvbdSCEFLiYk +DncKjvbdiVZeXRuC +DoDLKvbdWWhwudFH +EPDLKvbdrRuKmkAm +EObjjvbdxsNhlqag +EPDKjvbdcJMikFwY +DoDKjvbdpyPHfpdY +DncKjvbdwyhGGXdr +DoCkKvbdkVwODbXw +DncLKvbdJcJbpibx +EPCkKvbdsQWPJcVf +EOcKjvbdZRNEiMdq +EObkKvbdjvXOECXw +EObjjvbdZxcjODLr +DncKjvbdRWmdDMID +DncKjvbdjvWmcbYX +DoCjjvbdnBjXXoOV +DncKjvbdiBnbdwQq +EPDKjvbdDoDKjwCd +EPCkKvbdFxuVBEYC +DncKjvbdFVxopMie +EOcLKvbdKWUfEEfi +EPCkKvbdNrtVgEtp +DoDLKvbdfoazwDxI +DoDKjvbdqquKmkAm +EPDKjvbdhbPCeXRR +DncKjvbdZtIhyETO +EPCkKvbdQwNdCkhD +EPDKjvbdhzUfMROG +DnbjjvbdrpVoKCuf +EPDLKvbdtlYWaUAw +EOcLKvbddoErjstS +DnbkKvbdyzeORghh +EPDLKvbdZnmhdeZj +DoCjjvbdcIlikGXY +EOcLKvbdLAkHNBxR +DoCjjvbdtkwwBUAw +DoCjjvbdgGMZnHHA +DnbkKvbdUsmTfLuj +EOcLKvbdqZPHgQcx +EPDLKvbdLqvlytpz +DoDLKvbdqdFIomvB +EObjjvbdBhjbKhfK +EOcLKvbdrMyjYlIJ +DncKjvbdDncKkXCd +DnbkKvbdNQXpunHT +EPDKjvbdZjSgofbG +DnbjjvbdBiKbLIej +DoCjjvbdGAoQxizm +EOcLKvbdwtldqZLn +DoDLKvbdIrxaSmXl +DoCjjvbdNHDQMpUk +EOcLKvbdTkunaWOi +DncLKvbdNHCpMpVL +DoDKjvbdelfXHNKL +EObjjvbdcyxpYYqC +DoDLKvbdZGwEAOri +DoDLKvbdIxUCHkqQ +DoCjjvbdoznEKxPA +EOcKjvbdbLMGPNcA +EObjjvbdiiegilxS +DoDKjvbdZRNFImFR +DncLKvbdRbDeLhxk +EPCkKvbdqlzJxlHi +EOcLKvbdhkeDnUby +EPCjjvbdhaoDEwQq +EPCkKvbdFkFScHlu +EPCjjvbdJKEAKQGd +DoCkKvbdpxngfqDx +EObjjvbdUGznLwWF +EObjjvbdVZHsykPO +DncLKvbdYlRdUNlN +EPCkKvbdHDkWKBjK +DncLKvbdjKFhKMxS +DnbjjvbdnBjWxPOV +EObkKvbdtcCtvvOo +DnbjjvbdTpqPUthN +DncLKvbdMoxQvOGs +DnbjjvbdfNGXHMjL +EPDKjvbdhgJcZVjV +DoDLKvbdNGbolpVL +EPDKjvbdatbHYLUI +DncLKvbdczZPwxqC +DnbjjvbdZxcimblS +EPDLKvbdKaKgMbXq +EOcLKvbdtbcUwWOo +DnbkKvbdJutfEEfi +DoCjjvbdmIdURUqa +EPCjjvbddBrmSATm +EPCkKvbdXsLaNUPY +DnbkKvbdNPwpvOGs +EOcKjvbdIwsaglQp +DoCkKvbdlhdUQtrB +DoDLKvbdGdLWJaij +DoCjjvbdwXMAvAvV +DnbkKvbdbrbkTdJa +EPDKjvbdFVxpQNJe +DoCjjvbdHDkWJbKK +DnbkKvbdjvXODbYX +DoCjjvbdemFwGmJk +DoCjjvbdQdCaPpcr +EOcKjvbdqcdiQNvB +DncLKvbdbBWFFoow +EOcKjvbdKaKgMawq +EObkKvbdLBKgMawq +DncKjvbdcbSmSAUN +DoCjjvbdyOTHwsJD +EOcLKvbdOStVfeUp +EObkKvbdHffyyYXg +EPCjjvbdmuUykJrG +DoDLKvbdJYTbILpp +DncKjvbdnGdwlmgZ +EPDKjvbdZQldhldq +EObjjvbdUaBpsRSZ +EOcKjvbdrzLpSaIO +DnbjjvbdLGFgbAqV +EPDKjvbdXrlAmUOx +EPDLKvbdtSqryZeD +DoDKjvbdtlXwAtAw +DoDKjvbdaRebgsfL +EObjjvbdUWLpKUAq +EObjjvbdQvmccLgc +EOcLKvbdznopeDMY +EOcLKvbdIwsbHkpp +EPDLKvbdziuQPcsU +EPDLKvbdelevgMik +DoDKjvbdTAFIgbOd +DoDLKvbdbBWFGPow +DoDKjvbdYqNEiMeR +EOcLKvbdhficYuiu +EOcKjvbdyTOImRbH +DncKjvbdiLeDmtby +EPDLKvbdUsmTekvK +DoCkKvbdkCkkQftg +DoCkKvbdVTmUFlVj +DoCkKvbdTIyjRAAl +EOcKjvbdbUafxKtI +EOcKjvbdZsiIxdSn +DoDKjvbdSCEElIyL +DnbjjvbdBsAbsfXS +DoCkKvbdBcpAuimG +DoCkKvbdVwIwvEEg +DnbjjvbdajlFoNcA +EPCkKvbdtSrTYzFD +DnbkKvbdGFirNhsq +EOcKjvbdapHHELzd +DoDLKvbdiUyeXSUb +DnbjjvbdtAGqIABS +DnbkKvbdXsLaMsnx +DoCkKvbdeEnqawDK +EOcKjvbdDxXkstUM +DnbjjvbdcyxoxZQb +DoDLKvbdlrZVZrci +DoCkKvbdTAEiICPE +EOcLKvbdpyPHfpcx +EPDLKvbdVBCRTQqy +DnbjjvbdmJEUQtqa +DnbjjvbdkClKqHVH +EObkKvbdCJKajiGK +EObkKvbdeAURMxJf +EPDLKvbdcSbkUDjB +DncLKvbdsCFmLfjy +EPCkKvbdIwsahLqQ +DoCkKvbdrJAJeMne +DoDLKvbdIHGzYwxH +DoCjjvbdGckVjBjK +EObjjvbdegkVqmqH +DoDLKvbdLKaIWAKZ +EPDLKvbdaRfChUGL +DoDLKvbdyYJJaozL +DoCkKvbdrWpLbhyR +DoCkKvbdLGGIBaRV +DoDKjvbdKyRJrztf +DoCkKvbdjuvnEBxX +EObkKvbdNeEThhkE +EPCjjvbdQwNcbkhD +DoCkKvbdJqZePGOF +EObjjvbdNGbomQUk +EObkKvbdkxrqsZHU +EOcLKvbdrounjDVf +DoDLKvbdkClLRGtg +EOcLKvbdbKkfOnDA +EPCkKvbdRDbaPpcr +EPDLKvbdkHgLefNk +EOcLKvbdFVxpPmKF +EObkKvbdsrrSxzEc +DnbkKvbdFeirOIsq +DncLKvbdzitopDrt +DoCjjvbduWOXjQsA +EPCkKvbdyXhjCPyk +DoDKjvbdaaWEfPow +DncLKvbdvAcySneI +EObjjvbdADRwjZhp +EObkKvbdnPyxvLYb +DncKjvbdijGIJlwr +EPCjjvbdJcJbqJcY +DnbkKvbdkMbLydgP +DoCkKvbdRDbaQQcr +DoCjjvbdxsOIlrCH +DnbjjvbdKQydnfOF +EPDKjvbdcImKKfWx +DnbjjvbdcImKKewY +EObkKvbdqdFJPmua +EObjjvbdajkennDA +DnbjjvbdZyEKNcLr +DoCjjvbdKWVFdEgJ +EPDKjvbdWXIwuceH +DnbjjvbdqiAJdlne +EOcLKvbdkyTRryGt +EPCjjvbdpaJFAWgd +EPCjjvbdmJDsqVSB +EPCjjvbdREDAopdS +DoCjjvbdRpUHKFdX +DncKjvbdptUHSSKt +EPCjjvbdiCObdvpq +DncLKvbdNwnuzcmt +DncKjvbdqdFIpOWB +DoDKjvbdjggLefNk +EObkKvbdrNZiyLgi +EPCkKvbdaSFcITfL +DnbjjvbdGLFTDINV +EPCkKvbdiLeENuDZ +DncLKvbdZyEJmcLr +EObjjvbduDCuWvOo +DoDKjvbdNQXqWNgT +DncKjvbdVBCRTRRy +EPCjjvbdSQUGifEX +EOcLKvbdANIZSvyx +DoDKjvbdvBDyTPFI +DnbkKvbdEPCkLWbd +DoCkKvbdyYIjCPyk +DnbkKvbdelewGmKL +EPDLKvbdatbGxLUI +EPDLKvbdTvLojTaR +DoCjjvbdhtyeWrVC +DoDKjvbdzeZnzdzQ +DnbjjvbdyzdnRhJI +EPCjjvbduLxWaUBX +EOcLKvbdkyTRsYgU +DnbjjvbdCTBCsewS +EObjjvbdjAPgApHK +EPDLKvbdwkWdHzyf +EObjjvbdsPvOicWG +DoCkKvbdTulPisaR +DnbkKvbduCcUvuoP +EObkKvbdZRMdiMeR +DoCkKvbdSPtHJfDw +DncLKvbdKaLGlaxR +DnbkKvbdRpTgKGDw +DoCjjvbdWXJYWEEg +EObjjvbdWXJYWDdg +EOcKjvbdKCjCqKCx +DnbkKvbdakMGPNcA +DoDKjvbdwkXDgzzG +EObkKvbdNHDPlotk +DncLKvbdyzdmrIJI +EObkKvbdFkErbhMu +EPCkKvbdNeDsiIjd +DoDKjvbdIGfyyXxH +DoCjjvbdZyDinDLr +EPCjjvbdemFvfmJk +EObjjvbdJYTbILqQ +DnbjjvbdWXIwucdg +DoCjjvbdiHKCxvJu +EPDKjvbdfpBzwDxI +DoCjjvbdaNLCStlg +EPCkKvbdnVUykJqf +DoCjjvbdyYIjBozL +EPCjjvbdzjUpQDsU +DoDLKvbdZxcjOCkr +EPCkKvbdeFOrBvcK +EPDKjvbdKaKflaxR +EOcLKvbdfMevgMjL +EPDKjvbdGckWKCKK +DoCjjvbdKVuFdEgJ +EObjjvbdfMfWfmJk +DoDLKvbdMfbomQVL +EPDLKvbdRkYeuGjs +EOcLKvbdKfGHaaQu +EObkKvbdoznDjwoA +EOcKjvbdUMWPBVoJ +DoCkKvbdFjeSbgmV +EPCjjvbdrEFJQOWB +EOcLKvbdvAcyTOdh +DnbjjvbdWfYzUAOs +EObkKvbdTkuoBWPJ +DnbkKvbdFpASvgFy +DoCjjvbdczZQXyRC +DoCjjvbdRDcBQQdS +DoDKjvbdqYngfqDx +EObkKvbdWRmwbElD +EPCjjvbdFyVVBDwb +EObjjvbdBhjbKhej +DncLKvbdzaAPGgBl +EObkKvbdTppoVUgm +DoCjjvbdbrcLTcjB +EPCkKvbdGLFTCglu +DoDLKvbdDwxMUUUM +EPCjjvbdNQYQumgT +DncKjvbdmfeXmOGy +EPCjjvbdwtmFRYkn +DoCkKvbdsBfMlGjy +DncLKvbdRpUHKGDw +EObjjvbdjblLQfuH +EObjjvbdJYTbHlRQ +DoCkKvbdmttyjiqf +DoCkKvbdZQldiMdq +EPDKjvbdFejSNiUR +EOcLKvbdjgfkfFnL +DnbjjvbdMpYQvNgT +DnbkKvbdUyIUZjnn +DnbkKvbdJbjDRKDY +EPCjjvbdeEnrBvcK +EOcKjvbdyzdnSIIh +DoDKjvbdDoDKjwCd +DoDLKvbdCSaDUFwS +DoDLKvbdIrxaTMwl +DnbkKvbdRNXayNtz +DoCkKvbdxxJKBoyk +DncLKvbdnGdxNOGy +DnbjjvbdySmhlqbH +DoCkKvbdxwhjBoyk +EPCjjvbdZQleIleR +EPCjjvbdaRfChTek +EOcKjvbdYTMBNUPY +DoCjjvbdegkWSNpg +EObkKvbdziuQPdTU +EOcKjvbdnCKXYOmu +DoCkKvbdZnmhddzK +EObjjvbdzaAPGgBl +DoDLKvbdePFSjtTr +EPCkKvbdNrtWGeVQ +EPCjjvbdelfWfmKL +DoDKjvbdKxpjSztf +EPDKjvbdxmsIXsIc +EPCjjvbddZyPxYqC +DoDKjvbdvOszqLOt +DncKjvbdatbGxLTh +EObjjvbdzoQQdbkx +DoCjjvbdZRMeImEq +EOcKjvbdqTtGqqjt +EOcKjvbdqAheAWgd +DnbjjvbdySmhmRag +DncKjvbdjKFhJlwr +EPDKjvbdqFceUWBI +DoDKjvbdsBemLgLZ +EPDLKvbdKQzEoFnF +EOcKjvbdFjdsCgmV +EObjjvbdpfEEtWBI +EPDKjvbdZxcjOClS +EPDKjvbdnBivwoOV +EPCjjvbdrylQTAhO +EPDKjvbdKaLGmBxR +EPDKjvbdHgGzYwxH +EObjjvbdkHflGFmk +DnbjjvbdqGDeUVaI +EPDKjvbdMgDQNQUk +DncLKvbdSKyGVHKs +EOcKjvbdqFdEsvAh +EOcKjvbdYkrETnLm +DnbkKvbdqBIeAXHd +DncLKvbdZQldhmFR +DncLKvbdFjeSbhMu +EPCkKvbddePRavcK +EPCkKvbdssRsYzEc +EPCkKvbdRadFLhxk +DnbkKvbdVvhxWEEg +EOcLKvbdIryArmYM +EPCkKvbdKfGHbAqV +DncKjvbdEKIJuxKA +EPDKjvbdIwsbIMRQ +EObkKvbdzaAOfgBl +DncLKvbdeUAUASlv +DnbjjvbdlqxuZsDi +DnbjjvbdUWMQKTaR +EOcLKvbdNGbpNPtk +EPDKjvbdWSOYCEkc +DoCkKvbdjggMGGOL +DoCjjvbdSQUHJecw +DncLKvbdZyDjODMS +EObjjvbdfpBzvcxI +EOcLKvbdTlVoAvPJ +DnbjjvbdVviYWEFH +EPCkKvbdZnmiFFZj +EObjjvbdNGbpNQUk +DoDLKvbdrbGMkfjy +DoDLKvbdxnShYSiD +EObkKvbdJYTahMRQ +DoDLKvbdoAKzshEO +DoCkKvbdZxcjOCkr +EPDLKvbdRWmdCkgc +EPCkKvbdGFiqnJUR +DoDKjvbdRzJgsDWA +DncLKvbdptTfqqjt +EPDKjvbdmIctRUqa +EObkKvbdnBiwXoOV +DnbjjvbdfMevfljL +EObkKvbdBraDUGWr +DncKjvbdUxhTzKnn +DoCjjvbdmfdxMmfy +DnbjjvbdhuZeWrVC +DnbkKvbdLiCLpxAS +DnbjjvbdKfFgbApu +DnbjjvbdziuPpETU +DoCjjvbdwuNEqZLn +EPCkKvbdEXwksssl +EPCjjvbdhgKCxujV +DoDKjvbdhlEdOVDZ +DncKjvbdLAjgMbXq +DncKjvbdOFEThhkE +DoCkKvbdANHxrvzY +EPCjjvbdZtIiZDrn +DoCjjvbdYpldhmEq +DncLKvbdqwPlDIyR +DncLKvbdUtNUFlWK +EObkKvbdkWXODbYX +DnbjjvbdRzJhSbvA +DoCkKvbdEJgjVxKA +DncKjvbdxnSgxShc +EObjjvbdbUbHYKsh +DncLKvbdZoNiFEzK +EPDKjvbdbiMjKevx +DnbkKvbdIwsbHlRQ +EObjjvbdhWyAzzAJ +EObkKvbdqvpLcIyR +EObjjvbdGGKSOIsq +EObkKvbdTpqPUthN +DncKjvbduaEZTOdh +EObkKvbdJJdAJofd +DoCkKvbdEKIJuwjA +DncLKvbdDnbjkXDE +DnbjjvbdhbObdwQq +EObjjvbdunszpkPU +EPCjjvbdwNWANDdm +EPDLKvbdozmcjxPA +EObjjvbdZnmiFFZj +DnbjjvbduDDUwVno +EOcKjvbdZjShPfbG +DncLKvbdADSXiyhp +DoCjjvbduCcVXWPP +DnbkKvbdffLzOHHA +DncLKvbdBdPaWJlf +EPDLKvbdJvVGEFGi +EPCkKvbdvwMBWBWV +EObjjvbdijGHjMxS +EPCkKvbdaNLCTVNH +EPCjjvbdbAudeopX +DoDKjvbdozmcjwoA +EPCjjvbdYlRctOMN +DoCjjvbdDoDLKvcE +EObkKvbdVqmwaeMD +DnbjjvbdqvolChyR +EPCkKvbdRkZGVGjs +DoDKjvbdjvXOEBxX +DoCjjvbdIHHZyXwg +DnbkKvbdLBKgNCYR +EPDKjvbdyNsHxShc +EOcKjvbdyzdmqhJI +DnbjjvbdqFcdtVaI +EObjjvbdrJAKElne +DncKjvbdTvLpJtAq +EObkKvbdDoDKjvbd +EPCjjvbdYlRcsnLm +DoDKjvbdegkVqmqH +EPDLKvbdZHXEAPSi +DoDKjvbdakLennDA +DncLKvbdrDdiPmua +DoCjjvbdhbPDEwRR +EPDLKvbdtcDUvuno +DnbjjvbdEKHjVxKA +EOcLKvbdYqMdhmFR +EPDLKvbdmttzKiqf +EPDLKvbdTkvPAuoJ +DncLKvbdVAbRTQqy +DncLKvbdLBKflbYR +DoCjjvbdZyDimcMS +EOcKjvbdFpATXHFy +EObkKvbdnCJwYOmu +EPCkKvbdVZHszLPO +EPCkKvbdCSaDTfXS +DncKjvbdNVSqjmAX +EPCkKvbdFjdrbhMu +EPCkKvbdbsCkUDjB +EObjjvbdMowpumfs +DoDLKvbdRotHJecw +DnbjjvbdTfzmkwWF +EObjjvbdBcpAvKNG +DoDLKvbdWHxWXfxz +EPCjjvbdqUUGrSKt +DncLKvbdliDsqVSB +DnbkKvbdBdQAujMf +DnbkKvbdWXIxVcdg +DoCkKvbddePSCXCj +DnbjjvbdZirhPfbG +DnbjjvbdyXiKBozL +DnbjjvbdznpREcMY +DncKjvbdJcKCqKCx +EPCkKvbdJbibpjDY +EPDLKvbdkClLRHVH +EPDKjvbdTvLoisaR +EOcKjvbdZGwEAPSi +EPCkKvbdKRZdnenF +DncKjvbdfMfXGmJk +EPCkKvbdhfibyWJu +EOcKjvbdMIbLqYAS +EPDLKvbdbUbHXjtI +EObkKvbdCSaDUFwS +EPDLKvbdGGJqnJUR +EOcLKvbdDoDKjvbd +DnbjjvbdFkFTDIMu +DnbjjvbdgFlZnGgA +DoCkKvbdakLfPODA +EPDLKvbdDwwlTstM +DoCjjvbdMJBkqYAS +DnbjjvbdiGjCxujV +EPDLKvbdVwIwuceH +EPDLKvbdZyEKOCkr +EPDKjvbddoFTLTtS +DoCkKvbdXrlAlsnx +EOcLKvbdZoOIeEzK +DnbjjvbdaMjbTVMg +EPDKjvbdeOeTKssr +DncKjvbdSKxetfjs +DoCjjvbdpxnhGpcx +EPDLKvbdmtuZkJrG +DoCjjvbdYkqdTmlN +EOcLKvbdJuuGEEfi +DoCjjvbdhzUfMROG +DncLKvbdddnrBvbj +EOcLKvbdWSNwbFMD +DoDLKvbdtSrTYydc +EPCjjvbdRjxetgKs +DncKjvbdFxttaEYC +EPDLKvbdiBncFWpq +DnbjjvbdyTOImSCH +DoDKjvbdcyyQXyRC +EOcLKvbdZLrEUOLm +DoCjjvbdXmqAYVWU +EPCjjvbdUsltFkvK +DncKjvbdLqvmZuQz +DnbjjvbdZjTIQGaf +DoDKjvbdzoPpeCkx +EPDKjvbdGGKSNhsq +DncKjvbdtSrSxzFD +EPCkKvbdyOTHxShc +DnbkKvbdehKvSORH +DoDLKvbdWIXvYHYz +EObkKvbdDoCkLXCd +DoDLKvbdLBKflaxR +EPDLKvbdKQzFOenF +EObjjvbdjFLHVPAO +EObkKvbdFeiqmhsq +DoDKjvbdRotHKFdX +DnbkKvbddZxpYZQb +DncKjvbdqqtkNkBN +EPDKjvbdZjShPgBf +DoCkKvbdNHCpMouL +EObjjvbdxZgefYFS +DoCjjvbdNrsvHEuQ +DoCjjvbdwzHeewdr +EObjjvbdvPTzpkPU +EPDKjvbdrounibvG +DnbkKvbdpstGqqjt +EPDLKvbdeFOrCXDK +EOcLKvbdGBPRYizm +DoDLKvbdNwnuzdOU +DnbkKvbdRMwaxnUz +EOcLKvbdDihKWXjA +EObkKvbdFeirOJTq +DoDLKvbdSKxeuGjs +EOcLKvbddndsKssr +DnbjjvbdiCPDEvpq +EOcKjvbdMoxQumfs +DnbkKvbdfNGWfljL +DnbkKvbdIHGzZXwg +EObjjvbdTlWPAvOi +DoDLKvbdnPyyVkZC +EOcKjvbdkWWmdBxX +EObkKvbdEJgjWXjA +DnbjjvbdkMalZdgP +DnbkKvbdsCGNLfjy +DnbjjvbdYqMeIleR +DncLKvbdMgComPtk +DoCkKvbdMfbolouL +DncKjvbderAvzlDP +DnbjjvbdqwQLcIyR +EObjjvbdcImJkFwY +EPCjjvbdYzberKVy +DoCjjvbdEzsqElCi +EObkKvbdRotGiecw +EPCkKvbdGLErcINV +DoCkKvbdYpmEiMdq +DoDKjvbdJXsaglRQ +DnbkKvbdFVxpPmJe +DnbkKvbdxUmEpyLn +EPCjjvbdLrXMytpz +DnbkKvbdhtzEvqtb +EPDKjvbdDxYLstTl +EPCkKvbdiBoDFXQq +EPCkKvbdZoOJEeZj +DoCjjvbduDCuWuoP +EObkKvbdjcLkQfuH +DoCkKvbdcImKLGWx +EPDLKvbdEYXlUUTl +EOcLKvbdZLqdTnMN +EOcKjvbdmozYujyC +DncLKvbdJpzEnfOF +EOcLKvbdiCPCdvpq +DncKjvbdADRxKZhp +DoDLKvbdmJDsqVSB +EObkKvbdnBiwYPOV +EObkKvbdqwQMDIxq +DncKjvbdeFOqbWbj +EPDKjvbdmfeYMmfy +DnbkKvbdGLFSbhNV +DoDLKvbdwkXDgzzG +EObkKvbdbAvFFpQX +EPDLKvbdyXhjBoyk +DoCjjvbdMfbpMouL +DoCjjvbdREDApRES +DncLKvbdmajWwnmu +DoDLKvbdIidAJofd +DoCjjvbdSZihTCvA +DoCkKvbduLwvaUBX +EPCkKvbdiHJbyVjV +EObkKvbdGYtuAdXb +DoDLKvbdCTBCtFwS +EOcLKvbdhlFENtby +DoCkKvbdySnIlrBg +EPDLKvbdwuNFQyMO +DncKjvbdlqxtzTDi +DoDKjvbdWWhxWEFH +DoCkKvbdiHJcZVjV +EPDKjvbdCflGHAzc +DncLKvbdzROmJKXA +EPDLKvbdCJLBjhej +EOcKjvbdVrNwbEkc +DnbkKvbdUtNUFlWK +DoDKjvbdLBKflbYR +EPCjjvbdauBfwkTh +EPCkKvbdrXQMDJZR +DnbjjvbdnVUyjjSG +DncKjvbdiMEdOUby +DoDKjvbdqiAKFNPF +EOcLKvbdQdDBQQcr +DoDKjvbdpxnggQdY +DncKjvbdtSrTYydc +DnbjjvbdwzHefXeS +DoCjjvbdRosfjGEX +EPCkKvbdnPyxujyC +EObjjvbdZyEJnCkr +DnbkKvbdhytelRNf +EPDLKvbdeYZstSFz +EObjjvbdTfzmlXVe +EOcKjvbdbKkenmcA +DncLKvbdvwMAuaVu +EObkKvbdwMvAMdEm +EOcLKvbdkHflFfNk +EPCjjvbdzoPpeDMY +DoCjjvbdiLeDmuCy +EOcKjvbdRpUGjGDw +DnbkKvbdUslsekuj +EPCjjvbdmJEURVRa +DncLKvbdZjSgofaf +EOcLKvbdaMjasUlg +DoCjjvbdREDBPpdS +DnbjjvbdIwsaglQp +DoCkKvbdkNCLzFHP +DoDLKvbdaRfChUFk +EPCjjvbdrRtjnKaN +EPCkKvbduoTzpkOt +EOcKjvbdnHFYMmfy +EOcKjvbdHDkVjBjK +EObjjvbdEXxMTssl +DnbjjvbdNPxRWOHT +EObjjvbdiZtfLpmf +EObjjvbdTvLojTaR +DoDKjvbdKkBIWAKZ +DoDLKvbduCbtwVno +DncLKvbdmttzKjSG +DncLKvbdbBVdfQQX +EObkKvbdyXiKBpZk +DncLKvbdzGxlAMdw +DoCkKvbdMpXpvNfs +DoCkKvbdKQydoGOF +EPDLKvbdTfzmlXVe +EPDKjvbdQccBPqES +EPCjjvbdZtJIyESn +DoCjjvbdVrOXbElD +DnbjjvbdbLMGOmcA +DnbkKvbdnPzZWKyC +EPDLKvbdmajWwoOV +EObjjvbdQwOEDMHc +EPCkKvbdTvMQKUBR +DoCjjvbdOTUVgEtp +DoCkKvbdIHHZyXxH +EPDLKvbdDoDLKwDE +EObjjvbdiZtfMQmf +EObjjvbdijGHimXr +DoDKjvbdVrNxCElD +EPDLKvbdJutedFGi +DnbjjvbdmSZVZsEJ +DncKjvbdqlzKYlIJ +EOcKjvbdfelZnGgA +EOcKjvbdYlRctOLm +DoDKjvbdPxmAHSrK +EPCjjvbdWWiYWEEg +DoCjjvbdbAvFFoow +EOcKjvbdFjeSbglu +EPDLKvbdlqyVZsEJ +EOcKjvbdddoRbXDK +EPCkKvbdaRecHtFk +DncLKvbdSKyGUgKs +DoDLKvbdcyyPwyQb +DoDLKvbdnVUzKjRf +EObjjvbdYkqdUOLm +EObkKvbdRbEEkhyL +DncKjvbdtAHQhAAr +DnbkKvbdVqmwbFMD +EOcLKvbdznoqFDLx +EOcLKvbdEXxLtTsl +DnbkKvbdtumwipsA +EObjjvbdmJEUQtqa +DncKjvbdxwhjCPyk +DnbkKvbdyfyMANFX +DncLKvbdiVZeXRtb +EObkKvbddtAUATMv +EOcKjvbdxnSgwriD +EObjjvbdlrZVZrdJ +EPCkKvbdsBelkfkZ +DoDKjvbdFVyPomJe +EPCkKvbdQmYBxnUz +EOcKjvbdSBdFLhyL +DncLKvbdmJETpuSB +DoDLKvbdRECaPpcr +DncLKvbdIxUBglRQ +DoCjjvbdpssfrSLU +DnbkKvbdSQUHJedX +EObjjvbdkySrTZHU +EObkKvbdZtIiZETO +DoCjjvbdtumwipsA +DoCjjvbddBrlrAUN +EPCjjvbdKCjDQibx +DoCjjvbdQccAopdS +DoDLKvbdSBceLiYk +EPDKjvbdREDAoqDr +EOcKjvbdZQleJMeR +DoCkKvbdEARiMywX +EPDKjvbdkDLkQgUg +DncLKvbdFjdsDIMu +EPCjjvbdlrYtysDi +EPCkKvbdezuxeIsw +EObkKvbdyNsHxTJD +DnbkKvbdemGWgMik +DoDLKvbdBhkCKhej +EOcLKvbdjvWmcaww +EPDLKvbdqTsgRrLU +EObkKvbdZyDimcLr +EPCjjvbdlrYtzTEJ +DoCkKvbdHgGyyYXg +DoCkKvbdZoNhddyj +EPDKjvbdhtzFWquC +EPCkKvbdDoCkKwDE +DoDLKvbdsrqsZZeD +EPCkKvbdiHJbxuiu +DoCjjvbdhlFEOUcZ +EPDKjvbdDigiuwjA +EPDKjvbdQdDBPqES +DoCjjvbdcTCjsdKB +DncLKvbdUsmUFkuj +EPDLKvbdnHEwlnGy +EOcLKvbdxVNEqYkn +DoDKjvbdEuxopNJe +EObkKvbdkClLQfuH +EPCjjvbdcTDLUEKB +EOcKjvbdEPDKkXDE +EPCjjvbdXsLaNUOx +DoDKjvbdFWZQQNKF +EPDLKvbdUtMtFlVj +EOcKjvbdzaAPGfal +DnbkKvbdHlBznXRL +DoDLKvbdTlVoBWPJ +EPCkKvbdDoCjkXDE +EOcKjvbdrzMQTAhO +EOcLKvbdozmdLXoA +DoDLKvbdzQnmIjXA +DoCkKvbdmgExMmgZ +EPCkKvbdzjUoocrt +EOcLKvbdwyhGFweS +EOcLKvbdWWhxVceH +DncLKvbdqqtkOKaN +DoCkKvbdOTTvHEuQ +DoDLKvbdjJehKMwr +DoCjjvbduDCtvuoP +DnbjjvbdqdEiPmvB +DnbjjvbdhtzEwRuC +DnbkKvbdRkYetfkT +DoDKjvbdCDpBVjNG +DoCkKvbdcSbjscjB +EPDLKvbdYpldiMdq +DoCjjvbdaaWEfPow +EOcKjvbdqZPHgQdY +DoCkKvbdeOdrjtUS +DoDLKvbdFaPRZJzm +DnbjjvbdRECaPqES +DncKjvbdaMjaruMg +EObjjvbduVnYJpsA +DnbkKvbdqTsfrSLU +DncKjvbdYqMeJMdq +EOcKjvbdvvlBWAuu +DnbjjvbdUxgtZkOn +EOcKjvbdOSsufduQ +EOcLKvbdtumxJqTA +DncKjvbdIryAsNXl +DoDKjvbdMuTRkNAX +DoDLKvbdxnSgwrhc +EOcKjvbdiHKCxujV +EObkKvbdeKJrVtzn +EPDLKvbdjhHMGGNk +EOcLKvbdkVwNdBww +EOcLKvbdygZMANEw +EPDLKvbdRXODcLhD +EPCjjvbdSPsfjFcw +DoDKjvbdYpleIldq +DoDLKvbdOEcsiIjd +DnbjjvbdddoRavbj +DncLKvbdHDkWKBjK +DoCjjvbdxxJKBoyk +EPDKjvbdYkqdUNkm +DoDLKvbdDnbjjvcE +DoCkKvbdVvhxVceH +EPDLKvbdWRnXbFMD +EObkKvbdliEUQtqa +EPCkKvbdNQXqVmfs +EOcLKvbdIGfyyYYH +DncKjvbdxUldpxlO +DoDKjvbdznopdcLx +DncKjvbdHDkVibKK +EPDLKvbdjlbLydgP +DoDKjvbdYTMAltOx +DoDKjvbdcSbkUEKB +EPCjjvbdzoQREblY +EOcKjvbdZxcinDMS +DoDKjvbdZyDjODMS +DoCjjvbdxZgfFwdr +EPDLKvbdaMkBsVMg +EPCkKvbduDDUvuno +DncKjvbdsCFmLgKy +DoDLKvbddeOrCWcK +DncLKvbdNddThhjd +EOcKjvbdBvzcheQW +EPDLKvbdeEnqbXCj +DoCjjvbdNrtVfduQ +EOcKjvbdZQmEiNFR +EPCkKvbdGFjSNiTq +EPDKjvbdZxcinCkr +DoCjjvbdkNBlZdgP +DoCkKvbdEYXkstTl +DncLKvbdYpmEhmEq +EOcLKvbdePFSkTsr +DoCjjvbdemFvfmKL +DnbkKvbdemFwGljL +EPDLKvbdmbJvxOnV +EPCjjvbdtbcVXVoP +EOcKjvbdFkErcHmV +DoDKjvbdVUMtFlWK +EOcLKvbdkMakydfo +DnbjjvbdIMBznWqL +EObkKvbdptUHRrLU +DnbkKvbdjJfHilwr +EPCjjvbdGYuUaDxC +EObjjvbdmtuZjjRf +DncLKvbdkCkkQfuH +DoDLKvbdtlXwBUBX +DncLKvbdCWzchePv +EObkKvbdrEEiPmua +EOcLKvbdYqNFIldq +DoDLKvbdfILWRnQg +DoDLKvbdqUUGrRkU +DoCjjvbdfMfWflik +EOcLKvbdOTTugEuQ +DncLKvbdjvWnDaww +EOcLKvbdsPuoKDVf +EPDLKvbdZirhPfaf +DoCjjvbdDwxLsstM +DnbjjvbdfHkWRmpg +DncLKvbdrpWOibuf +EPDLKvbdZtIhyESn +DncLKvbdwygfGYEr +EPCjjvbdeEoSCWcK +EPCjjvbdjuvmdBww +EObjjvbdqUTfqqjt +EOcLKvbdZjSgogBf +DoDKjvbdYqMdiMeR +DoCjjvbdKefICApu +DoDLKvbdMfcQNQVL +EPCkKvbdjggMGGNk +EObkKvbdCDoaVjMf +EObkKvbdWWiXuceH +EOcLKvbdURROuVHm +DnbjjvbdpssfrSLU +DncKjvbdgFkzNgHA +DnbjjvbdaSFbgtFk +DncLKvbdIxTahMQp +EPDLKvbdKWVFceGi +DncKjvbdFVyPomKF +DoDKjvbdZirgpHBf +EObjjvbdVqmwadkc +EPCkKvbdieLHVPAO +DncKjvbdZLqdUOMN +DoDKjvbdWWiYWDeH +EObkKvbdQwNdClID +DnbjjvbdMoxRVnGs +DncLKvbdrDdiPmvB +DnbjjvbdZQleJNFR +EOcLKvbdrDdhpOVa +EPDLKvbdYqNFImFR +DoDKjvbdEYXlTtUM +DoCjjvbdhuZeWqtb +EPDKjvbdMfcPlpVL +EOcKjvbdNQYQvNfs +DoDKjvbdiUzFXSVC +DoCkKvbdmRxtzSci +DnbjjvbdbiMikGXY +DoCjjvbdQdDBQQdS +EObjjvbdqZPIGqDx +DoCkKvbdkWWmdBxX +DoDKjvbdKxpirzuG +DoCjjvbdlBNPNALA +DoCjjvbdhzVGMROG +DoCjjvbdzoQREcMY +EPDKjvbdlAlnmALA +EPDLKvbdwuMeRZLn +EOcLKvbdYqMdiNFR +EObkKvbdOTTugEuQ +EOcKjvbdYTMAmUOx +DnbjjvbdRDcBQRES +DoDLKvbdidkHVPAO +EPCkKvbdSKyFtfjs +DoCjjvbdhytelQmf +DncLKvbdEztRElCi +EPDLKvbdRWnEDLgc +DoDKjvbdwuNFQyLn +EObkKvbdGLFTDHmV +DnbkKvbdShyiqABM +EObkKvbdUaCQsRSZ +EOcKjvbdjuwNcbXw +DnbkKvbdmfeXlnHZ +DncKjvbdsPuoKDVf +EOcKjvbdNGbomPtk +DoDKjvbdvPTzpkOt +EPDKjvbdJqZdneme +DncKjvbdqTtGqqkU +DnbkKvbdjggLeemk +DoCjjvbdVZIUZkOn +EPCkKvbdzjVPodTU +DncKjvbdnBjXYOnV +DoDKjvbdHgGzYxYH +EPCkKvbdSZigsCvA +EPCjjvbdtbbtvuno +DoDKjvbdPIAXyAZB +EObjjvbdRNXaxmtz +DoCkKvbdUyITykPO +EPCkKvbdssRryZeD +EObkKvbdJuuGEFGi +DoDLKvbdxZgfGXeS +EObjjvbduoTzqLOt +DoDKjvbdbrbkTcjB +DncLKvbdxxIiaoyk +DoCjjvbdFxtuBDxC +EPDLKvbdzaAPGgBl +EPDLKvbdpxnhGqDx +EOcKjvbdtSqsZZeD +EOcLKvbdMowpvOGs +EObkKvbdVBCRSpqy +DoCkKvbdZRNEiMeR +EPCjjvbdczYowyQb +DncKjvbdjgfkfGNk +DnbkKvbdssSTYzFD +EOcLKvbdVhYWYGxz +DncKjvbdKDJcQibx +DncKjvbdZHWdAPTJ +EPCkKvbdFjdsChNV +DoDLKvbdJcJcRJcY +EPCjjvbdRjyGVHLT +DnbkKvbdBcpBWKMf +DoCjjvbdxUmEpyMO +EPDKjvbdZoNiFEzK +DoCjjvbdPIAYZAZB +EOcLKvbdFejSOIsq +DoDKjvbdjggMGFmk +EObkKvbdWRnXadlD +EObkKvbdnGdxMmfy +DoDLKvbdLBKgNBxR +DoCjjvbdaSGChTek +EPCkKvbdSCEElIxk +EObjjvbdIxTbHlQp +EPCkKvbdOEcshhkE +EOcLKvbdbsCjsdKB +DncLKvbdCSaDUGXS +EPCjjvbdRzJgsDWA +EPDLKvbduCbuXVno +EOcLKvbdGdLViajK +DncKjvbdCWzdJEpW +DncKjvbdjuwODbXw +DncLKvbdqUTfqqjt +EOcKjvbdxUmFRYkn +DoCjjvbdVAaqSqRy +EPDLKvbdaMkBsUlg +EOcKjvbdGLFTCgmV +EPCkKvbdZeYGzgiC +DoCjjvbdwXLaWBVu +DoCjjvbdelevgMik +EPDKjvbdkHgMGGOL +DoCjjvbdcJMjKewY +EOcLKvbdwzHfGYEr +DncLKvbdlZTRryGt +EOcLKvbdfVzwoizs +EPDKjvbdhzUelRNf +EPCkKvbdiHKCxvKV +EOcKjvbdGFjRmhtR +EPDLKvbdGLEsChNV +DoDKjvbdYORAXuWU +DnbjjvbdpstHSSKt +EObkKvbdegkVqmpg +EPDLKvbdhyuGMQmf +EObkKvbdliDtQtqa +DoCkKvbdfNGXGlik +DoCkKvbdHfgZyXwg +DoCjjvbddndsKssr +EPCjjvbdZMSDsnLm +EObkKvbdEXxMTstM +EPDKjvbdJvUecdfi +DnbkKvbdVUMsekuj +EPCjjvbdPyNAGsSK +DoCjjvbdMSWmZuQz +EObkKvbdBcpBVjNG +DnbjjvbdezuxdiUX +EPCjjvbdBdQAvJlf +DncKjvbdOTUWHFVQ +DoDKjvbdaSGDIUFk +EOcKjvbdUGzmlWvF +EOcLKvbdjlakydfo +DoCkKvbdWSOXaeLc +DoDKjvbdznpRFDLx +DoCkKvbdwtldpxlO +DoDLKvbdGdLVjBjK +EObjjvbdmttykKSG +DoDKjvbdZjShQGaf +DoDKjvbdrDdhomvB +EPDLKvbdiUyeXSVC +DncKjvbdIsYaSmXl +DnbjjvbdVhXvYHYz +EPDKjvbdwzHfGXdr +EOcKjvbdxsOJMqbH +DoCjjvbdehKuqmqH +EPCjjvbdZdxGzhJC +EOcKjvbdsCGMlHLZ +DoCjjvbdOEcshhkE +DoCjjvbdEzsqElDJ +DncLKvbdURRPVVIN +EPCkKvbdZoOJFEzK +DnbjjvbdBiKajhfK +EOcLKvbdbUafwkTh +EOcLKvbdVZHszKoO +DnbkKvbdGKdsDIMu +DnbkKvbddoFSkUUS +DnbjjvbdPxmAGrqj +EPCjjvbdKNADzHVB +EPCjjvbdcyxpXxqC +DnbkKvbdLBLGmBxR +EPDKjvbdFWYopNJe +EPCkKvbdcJNKKewY +DoCjjvbdGLErcHmV +EPCjjvbdWXIxWDdg +DnbkKvbdQvmcbkhD +EOcLKvbdbVCGwjtI +DoCjjvbdmgFYMmfy +EPDLKvbdQdDApRES +DnbkKvbdWWhwvEFH +DnbjjvbdxZhFexFS +EPCkKvbdCIjakJGK +EPCkKvbdKQyeOfOF +DncKjvbdEObjkXDE +DnbjjvbdNGcPlotk +DoCjjvbdVUMtGMVj +EPDLKvbdelfWgNKL +DnbkKvbdqwPlDJZR +DncLKvbdbiMikFwY +EObkKvbdkNBkzEgP +DoCkKvbdmuUyjiqf +DncKjvbddneSjtTr +EPCkKvbdRkZFtgLT +EObkKvbdRjyGUgLT +EPCkKvbdKaKgMaxR +DnbkKvbdZMRdTnMN +EPCkKvbdqZOhGpcx +EPCkKvbdxwhjBozL +DncKjvbdGckViajK +EPCkKvbdiifHilxS +EOcLKvbdqUUGrRjt +EPCjjvbdbhljLGWx +DnbkKvbdhgKCxujV +DoDLKvbdJSyAsNXl +DoDLKvbdjgflFenL +EPCkKvbdMJBlQxAS +DncLKvbdUMVoAvPJ +DoCkKvbdkCkjpgVH +EPDKjvbdqGEEsvAh +EObkKvbdmRxuZrci +EObjjvbdNdctIhjd +EPCkKvbdCSaDTevr +EPCjjvbdRDcAopcr +EObkKvbdwtmEpyMO +EOcKjvbdqZPHfqDx +EOcLKvbdaNKbStmH +EOcLKvbdaSFcHsfL +DnbkKvbdRosgJecw +EObkKvbdkySrSyGt +EOcLKvbdwuMdqYkn +EPCjjvbdrDdhonWB +EPCkKvbdiBoDEwRR +EPCkKvbdEztQdlCi +EObkKvbdFyUuBEXb +EPDKjvbdOAIsUJrA +EPDKjvbdKCicRKCx +EObjjvbdSZihSbvA +DncLKvbdvAdYsPEh +DncKjvbdySnImSCH +EObkKvbdiVZeXRtb +EOcKjvbdsCFllHLZ +EPDKjvbdZeXfzgiC +DnbjjvbdMpXpvNgT +DoDLKvbdsCFllHKy +DoCkKvbdqYoHfpdY +DnbjjvbdRzKHrbvA +EOcKjvbdNHComPtk +EOcLKvbdCJLBjiGK +EPDLKvbdsZlPsAhO +DnbkKvbdemFvgMik +DoCjjvbdFyUuBDwb +DnbjjvbdrafMlGkZ +DncKjvbddZyPxYpb +EObjjvbdxZhGFwdr +EPCkKvbdEXwlTssl +DnbkKvbdANIYrvyx +EObjjvbddePRawCj +EPDKjvbdyNsIXrhc +EPCkKvbdhkeEOVDZ +DoDLKvbdAMgxrwZx +EPDLKvbdsQWPJbvG +DoCkKvbdkVvmcbXw +EPDKjvbdJYTbIMQp +DncLKvbdBsAcTewS +DncLKvbdxrnJNRag +EOcLKvbdmSYtzSdJ +EObkKvbdqdFJQNua +DoCjjvbdZyEKOCkr +DoCkKvbdZLrEUOLm +EPCkKvbdRNXaxnUz +EPDLKvbdnUuZjjRf +EObkKvbdmbKXYOmu +DnbkKvbdlZTSTYgU +EPDKjvbdGYuUaDxC +DncLKvbdFyVVAcxC +DoDKjvbdEvZPpMjF +EPDLKvbdSwjlNzjx +EPCjjvbdbKkeoNcA +DoCkKvbdMfcQMotk +DnbkKvbdyTNiNRbH +DncLKvbdFWYpQMjF +EPCkKvbdEvYopMjF +DncKjvbdeKJrWUzn +EOcKjvbdpssfrSLU +EObjjvbdKCjDRJbx +DnbkKvbdeUAUATMv +EPDLKvbdjKGIJlxS +DnbkKvbdpssfqrLU +EPDKjvbdqZPHgQdY +EPDLKvbdeAURNXif +DoCjjvbdypoMhiwA +EPDLKvbdGYtuAdXb +EObkKvbdRaceLiYk +DoCjjvbdXsMBNTnx +EOcLKvbdKCjCqKCx +DoCjjvbdYSlAmUPY +EPDLKvbdpstGrSKt +EPDKjvbdhtyeXRuC +EObjjvbdtlYXBUBX +EObjjvbdRMxByNtz +EObjjvbdhanbeWqR +EOcKjvbdpyPIHQcx +EPDLKvbdrRtjnLBN +DoDKjvbdNQYQvNgT +DnbjjvbdbsDKsdJa +DnbjjvbdDxYMTssl +EPDLKvbdnCKWxOmu +DncKjvbdILazmwQk +DoDKjvbdhgJcYuiu +DoCjjvbdlYrrSyHU +EOcKjvbdVUNUFkvK +EObjjvbdRyjHrbvA +DoDLKvbdDnbkKvbd +EOcKjvbdaNKbStmH +DnbkKvbdjblLRGtg +DncKjvbdxUleQyLn +EPDKjvbdLGFhBaQu +EObkKvbdqmZiyLgi +DoCjjvbdJuuGEFGi +EPDKjvbdqmZixlIJ +DoCjjvbdXnRAYVVt +EOcLKvbdWIYVxGxz +EPCkKvbdxZgfGYEr +EPDKjvbdfNGWfmKL +EPDKjvbdbrbjscjB +DoDKjvbdsPunjCvG +DoDKjvbdziuQQDsU +DoDLKvbdbhlijfWx +EPCkKvbdhgKCyWKV +EPDLKvbdGLEsCgmV +EOcKjvbdmIcspuSB +EPDKjvbdIwsbILqQ +DoDLKvbdpedEsvBI +DncLKvbdsPunjDVf +DncLKvbdIxTbHkqQ +DncLKvbdcSbkTdJa +DncKjvbdUWLpJsaR +DnbkKvbdsQVnjCvG +EPDKjvbdyXiJapZk +EPCkKvbdrzLosAgn +DncLKvbdNsTugEuQ +DoDLKvbdrykoraHn +EObjjvbduaDySoFI +DncKjvbdZHWdAOri +EPCjjvbdlqxtysEJ +DnbkKvbdOSsvHEtp +DoDKjvbdRotGjGDw +DoDKjvbdYfvdAOsJ +DoCkKvbdBhjajiGK +EObjjvbdCgLegAzc +DoDLKvbdhtyeWrVC +EOcKjvbdzitoocrt +EOcKjvbdNVTSKmAX +EPCjjvbdVYgsyjnn +EObkKvbdliEUQuRa +DoCkKvbdqFceUWAh +EPDKjvbdIsZAsMxM +DnbkKvbdUVlPjUBR +DoDKjvbdbUafwjsh +EObjjvbdQlxCZOUz +DoCkKvbdQvnEDLhD +EOcKjvbdUVlQKUBR +EPDKjvbdehKvRnQg +DoDLKvbdxmsIYTIc +EObjjvbdsCGNLfkZ +EObjjvbdmSYtzSdJ +DoCjjvbdiMEcnVDZ +EPCjjvbdypnlhiwA +DoCjjvbdRyihTDWA +DoCjjvbdZoOJEdzK +DoCjjvbdJpzEoGOF +DoCkKvbdYpmEiMeR +EPCkKvbdbhljKfWx +EPDLKvbdqYnggQcx +EOcLKvbdwjwEHzyf +EPCjjvbdLFegbAqV +DoCjjvbdMoxQvNgT +EPCjjvbdZsiIyETO +DoDLKvbdZQmFImEq +DnbjjvbdYkrDtOMN +EPCjjvbdjggMGGOL +DncLKvbdDwwlTstM +EOcKjvbdCWzciFQW +DoCkKvbdyYIiaozL +DnbkKvbdNsTufeVQ +DoDKjvbdjlakydfo +EObjjvbdUGznLvue +DoCjjvbdeFOqawDK +DoCjjvbdZnmiFEyj +EOcKjvbdVBCQrprZ +EOcLKvbdrovOjCvG +DncKjvbdrovPKCuf +EOcLKvbdlYrqryHU +EObkKvbdcyyPxZQb +EObjjvbdnBivwnnV +EObjjvbdjJehJlwr +DnbkKvbdOFDtJIjd +DnbjjvbdVAaqSqSZ +EObkKvbdrXPkbiZR +DoCjjvbdzaAPGfal +DncKjvbdZQldhmEq +EObjjvbdmoyxvLZC +DnbkKvbdmpZxujyC +DoCjjvbdvwLaWBWV +DncLKvbdiVZdvquC +DnbjjvbderBWzlDP +EPCjjvbdjbkjpfuH +DncLKvbdrafNLfkZ +DncKjvbdrWokbhxq +EPCkKvbdsZkosBHn +EOcKjvbdidjfuPAO +DnbjjvbdNGcPmQUk +EPCjjvbdrJAKFNOe +DnbjjvbdTukoitBR +DnbkKvbdySmhlrCH +EObkKvbdrXPkcIxq +EOcLKvbdFejSOItR +EObkKvbdmgExMnGy +EPDKjvbdqrVLOLBN +DoDKjvbdLAkHNCYR +EObkKvbdVrOXbEkc +DnbjjvbdEXwlUTsl +EPCkKvbdyXhjBpZk +EObkKvbdiifHjMxS +EOcKjvbdEKHiuxKA +EObkKvbdZLqdTmlN +EObkKvbdWRnXaeLc +DnbjjvbdWSNwaeMD +DnbjjvbdfNGWgNKL +DoDKjvbdoAKztIDn +DncLKvbdmaivxOmu +DnbjjvbdZLqcsnMN +EObjjvbdcTDKscia +EPCjjvbdOTTufeUp +DoDKjvbdGdLVjBjK +DncKjvbdcJNKLFvx +EOcLKvbdTYKkmzjx +EOcKjvbdZRMeImEq +DoDLKvbdKQyePFnF +DnbkKvbdNrtWGduQ +EPCjjvbdatbHXjtI +EPCjjvbdvwMAuaVu +EPDLKvbdnQZxvLZC +EObjjvbdtlYXAsaX +DnbkKvbduDDVWvPP +EPDLKvbdqTtGrSKt +EObjjvbdxnSgwsJD +EObjjvbdbKkenmcA +EPCkKvbdFaOqYizm +EOcKjvbdLGGHbBRV +DoDLKvbdRzJhTCvA +EPCjjvbdiMFDmtcZ +DnbjjvbdWWhwvEEg +EPCjjvbdJmAEZgVB +DoCjjvbdmuVZjirG +DoCjjvbdliEURUqa +DoDLKvbdnCKWwnnV +EPDLKvbdhgJbyViu +DnbkKvbdjggMFfNk +EObkKvbdEuxopMie +EPDKjvbdssRsYydc +DncLKvbdliDsqVRa +EOcLKvbdLBKflbYR +DncKjvbdzoPpeClY +DncKjvbdqFdEsvBI +DoCjjvbdZMRctOMN +DncKjvbdDnbkLWcE +EObkKvbdMfcQNPuL +DoDKjvbdUWMPjTaR +DnbjjvbdxmsHwsIc +EObkKvbdrDdhonWB +EPCkKvbdhgJcYvJu +DoCkKvbdlYsSSyHU +EPCjjvbdNdcsiJLE +DoDKjvbdhlEcmuCy +EObjjvbdJTZAsNXl +EPCjjvbdznpQeClY +DncLKvbdDxYMTssl +DoCjjvbdkVwNcbXw +EOcLKvbdMgDPlpUk +EObkKvbdXsMAlsnx +DnbkKvbdiBncEvqR +EPCjjvbdeFPSCWcK +DoDKjvbdmuUzKjSG +EPDKjvbdqrUkNjaN +DoDKjvbdhyuFlQnG +EOcKjvbdDigivYKA +DoDLKvbdJYUCHkqQ +DncKjvbdACqwiyiQ +EPDKjvbdEYXkstUM +DoDLKvbdKDKCpicY +DncLKvbdCDoaVjNG +EObkKvbdxZhFexFS +EPCkKvbdKDJcQjCx +DoDLKvbdEPCkKwCd +EPCkKvbdTfzmkwVe +DnbjjvbduWOYJqTA +DoCjjvbdcJMijfXY +EPCkKvbdmaiwYPOV +EOcKjvbddjJrVtzn +EObkKvbdpstHSRjt +EOcKjvbdyXiKCQZk +DnbkKvbdIsYaSmYM +DnbjjvbdwtmFQxlO +DnbkKvbdYpleJMdq +DoCjjvbdkNBkzFGo +EOcKjvbdbsCkUEKB +DoDKjvbdYlRctOMN +DnbkKvbdjuwOECXw +EPDKjvbdWRnXaeMD +DncLKvbdkDLkQgVH +DoDLKvbdFeiqnJTq +EOcKjvbdzHYlAMeX +EPCjjvbdJbjCpjDY +EPDLKvbdzitopDsU +DnbkKvbdziuPpDrt +DncLKvbdySnImSCH +DnbjjvbdySnImRbH +DoCjjvbdKjaIWAJy +DnbjjvbdTqRPUthN +DoCjjvbdURQntuIN +EObjjvbdQlxCYmtz +EPDKjvbdMtsSLNAX +EObjjvbdJbjDQicY +DoDKjvbdEPCkKwDE +EObkKvbdKQydoGNe +DoDLKvbdVwJXuceH +EObjjvbdnUtykJrG +DncLKvbdwMvANEEm +EPDKjvbdpyPHgQdY +DnbjjvbdUVkpKUBR +EOcLKvbdhfjCyVjV +EPDKjvbddoFTKstS +EPCkKvbdANHyTXZx +EPCkKvbdUxhTyjoO +EObjjvbdkVwNdBxX +EPDKjvbdDoCjjvbd +DnbkKvbdWWhwudEg +DnbkKvbdyTNiMrCH +DoDLKvbdelewGljL +DncLKvbdUGznMWue +DncKjvbdwygfFwdr +EPCkKvbdJqZePFnF +DnbjjvbdNsTugEuQ +DoDKjvbdQcbaPqDr +DncLKvbdfMevgNJk +DncLKvbdlrZVZrdJ +DoCjjvbdFjeTCglu +DnbjjvbdYqNFImEq +DoCjjvbdsCGMkfkZ +DncLKvbdhuZdwSUb +DoCkKvbdrXPkbiZR +DoCjjvbdZRMdiMdq +DoDKjvbdemFvgMjL +DoCjjvbdygZMANEw +EOcKjvbdZRMeIldq +EObkKvbdiHJcZWKV +DncKjvbdCJKbKiFj +EObjjvbdzROlhjXA +DnbjjvbdDoDLKvbd +EPDLKvbdVYgtZjnn +EObkKvbdDoCjjwDE +DnbkKvbdrouoJbuf +DoCkKvbdyTOImRag +EPDKjvbdBcpBVilf +DoCjjvbdCWzdJFQW +EPCkKvbdbrbjscjB +EOcLKvbdwkWdHzzG +EPDKjvbdnGeXlnGy +EPCkKvbdznpREcLx +EPCkKvbdZMRcsnLm +EOcKjvbdJSyArmXl +DnbkKvbdZMSDtNkm +EPDKjvbdAMgySvzY +DoDLKvbdyYJJbPzL +DoCkKvbdLAjgMaxR +DoDLKvbdWIXuxGxz +DoCjjvbdqwQLbiYq +DnbkKvbdpyPIHQcx +EOcKjvbdfNGXHNJk +DncKjvbdqYnhHQdY +DncKjvbdeEnrBvcK +EPDKjvbdZjTHpGaf +DoDLKvbduoTzqLPU +DnbkKvbdIjEAJofd +DnbkKvbdxnSgxTJD +DoDLKvbdXsLaMsnx +DnbjjvbdaRfDHsek +DoCkKvbduLwwAtBX +DnbkKvbdrpWPJcVf +DoDKjvbdrbFlkgLZ +DoCkKvbdlqxtyrdJ +EObkKvbdRyihSbvA +EObkKvbdWRnYCFLc +DoCkKvbdOEcshhjd +DnbkKvbdZjTHpHBf +DnbjjvbdcyyPwxpb +DncLKvbdkVvmdCXw +DncLKvbdcScKtEJa +DnbjjvbdrSVLOLBN +EObkKvbdiGjDYvKV +EPCkKvbdEJgjVwjA +DnbkKvbdRosgKFdX +EPDLKvbdcScKtDia +DoCjjvbdtbcVXVno +DncKjvbdhgJbyViu +EPCjjvbdjJehKNYS +EObkKvbdyOTIYTJD +DnbkKvbdRaceMJYk +DoCkKvbdqiAKEmOe +DoDLKvbdEKHiuwjA +EObkKvbdxUldpxkn +EObkKvbdFejRmhtR +DncLKvbdSBcdlIyL +EPCkKvbdxZhFexFS +EObjjvbdwjwEHzzG +EPCjjvbdmRxtzSdJ +EPDLKvbdEvYooljF +DoCkKvbdmgFXlmfy +DoCjjvbdtkxXBTaX +EObkKvbdmgExMnHZ +DncLKvbdjvXODaww +DoCkKvbdSCEFMIyL +EPDKjvbdVYhTykOn +DoDLKvbdNsUVgFUp +DncKjvbdRXOEClID +DoDKjvbdnVVZkKSG +DoDKjvbdWWhxVcdg +EPCkKvbdwuNFQxlO +DncLKvbdKeegbBRV +DncLKvbdUWLpJsaR +EOcLKvbdNxOuzcmt +EObjjvbddwzUUSFz +DoCjjvbdJXtBhMQp +DoCkKvbdLGFgbBRV +EOcLKvbdcJMjKewY +DnbjjvbdxUmEqYkn +DnbkKvbdjbkjqGtg +EPCkKvbdIHGzYwwg +DnbjjvbdrpWOjCvG +DoDKjvbdZMRctNkm +DnbkKvbddZyPwxqC +DoCjjvbdtcDVWuno +DoCkKvbdJcKDRJcY +EOcLKvbdmbKWwnnV +EPDKjvbdcasNSAUN +EPCkKvbdUaBpsQqy +EObkKvbdJutedFHJ +DoDLKvbdBhjakJFj +DnbkKvbdnUuZjiqf +EPDKjvbdpxoHgQcx +DnbjjvbdZjTHofbG +EObkKvbdkxsSSxgU +DnbjjvbdWRmwbElD +DoCkKvbdRkZFuGjs +EPCkKvbdwNWANDdm +EObjjvbdTkvPBVni +DoDKjvbddndrkTtS +DncLKvbdZtJIxdSn +EOcLKvbduaDyTOeI +EOcKjvbdxZgfGXdr +EOcLKvbdkySrTZGt +EPDKjvbdVwJXucdg +EPDLKvbdatagYLUI +DoCjjvbddZxpYZQb +EPDKjvbdtunXjRTA +DoDLKvbdWSOYBeMD +DoCjjvbdHlBznXRL +EPDLKvbdcyxpXxpb +DnbjjvbdAMhYsWzY +EObjjvbdraemLgKy +EPDKjvbdJpzFOenF +DoCjjvbdZnnIeEyj +DoCjjvbdrWpLbiZR +EOcKjvbdLqwMytpz +DncKjvbdKQzEoFme +EPDKjvbdZRMeJMeR +DncKjvbdEuxpPlie +EOcLKvbdFWYpPlie +EOcLKvbdjblKpgUg +EOcLKvbdiBnbdwQq +DoDLKvbdOTTufeVQ +EPDKjvbdpyOggQdY +DnbkKvbdGBOqYizm +EObjjvbdRjxfUfkT +EPCjjvbdUMVoAuoJ +DoDLKvbdVwJXvEEg +EObkKvbdnCKXXoOV +DoDKjvbdNPxRVmgT +DncLKvbdZsiIxdSn +EPDKjvbdjlalZeHP +DoDLKvbdeFPSBvbj +DoDKjvbdVqnXbFMD +DncKjvbdHffyyYYH +EOcLKvbdBhjbLJFj +EPDKjvbdJvVGEFHJ +EOcKjvbdgQBzvdYI +EPDLKvbdpyOggRDx +EObjjvbdKQyeOfNe +EPCjjvbdtcCtwVno +EPCjjvbdQvmdClHc +DnbkKvbdyXiKBoyk +DncKjvbdqTsgSSLU +EObjjvbdyNrgxShc +DnbjjvbdRkZFuGjs +EObjjvbdYfvdAOri +DoDKjvbdkMbMZeGo +EPDLKvbdCIjbLIej +DoDKjvbdHffyxwwg +EPCkKvbdGdLVibJj +DoCkKvbdaaVdepQX +DnbkKvbdSQUGifDw +EPCkKvbdqYngfpdY +DnbkKvbdxUleQyLn +DoCjjvbdqlyixkgi +EPCkKvbdjgfkfGNk +EObjjvbdeFOqavbj +DoDLKvbdYkrDtNlN +DoCkKvbdjhGlFenL +EPCjjvbdijFhJmXr +EObjjvbdnGeYMmfy +EOcLKvbdbhmJjfXY +EOcLKvbdLBKfmCYR +DncLKvbdJSxaSmXl +EPCjjvbdsQVnicWG +DoDKjvbdjhHLfFnL +EObkKvbdjuwOEBww +DoCjjvbdiBncEvpq +EOcLKvbduLxWaUAw +DncLKvbdhuZdwRtb +EOcKjvbdjvWnECXw +EObkKvbdZeYGzghb +DoDLKvbdNQYQumgT +DoDKjvbdJpydoFnF +EPCkKvbdRjyFuGkT +DnbjjvbdraelkgKy +EObjjvbdfNGXHMjL +DoDLKvbduWNwiqTA +DncKjvbdnVUzLJrG +DoDLKvbdehKvSOQg +EPDLKvbdwtmFRYkn +DoDKjvbdKfFgaaQu +DncKjvbdCTBDTfXS +EObjjvbdDoCjjwCd +EPCjjvbdYTMAmUOx +EOcKjvbdiMFDnVCy +EObkKvbdjlalZeHP +DnbjjvbdCJLCLIfK +DoDLKvbdZMRdUNkm +DnbjjvbdURRPVUgm +EObjjvbdJcJbpibx +EObkKvbdrWpMDJZR +EObjjvbdjuwNdBxX +EPCjjvbdbBVdfQQX +EPCjjvbdKRZeOfOF +DoCkKvbdKDKCqKCx +DoCjjvbdkVvmdBxX +EPDKjvbdvAdYroEh +EOcLKvbdtcCuXWPP +EPCjjvbdczZQXxpb +DncKjvbdUxhUZkPO +EObjjvbdlrYtysEJ +DncLKvbdcScLUDia +EPDKjvbdBsAbsevr +DoDLKvbdqTtGqrLU +DoDKjvbdSCEFLiYk +EPCjjvbdRWmccLgc +DncLKvbdNQYQunGs +EObkKvbdmbKXYPNu +EPCjjvbdfMewGmKL +EObjjvbdzROmIiwA +DnbkKvbdliETptqa +EPDKjvbdHlBznWpk +DoCkKvbdUaBpsQqy +DoCkKvbdWSOYCFMD +DoDLKvbdxmrhYTIc +DncLKvbdLAkGlbYR +DncKjvbdlhctRUqa +DoCjjvbduDCtwVno +DnbkKvbdIjEAKQHE +DnbjjvbdiLddNuCy +EPDKjvbdEXwktUTl +EPCjjvbdyNrgwsJD +EObkKvbdnPzYujxb +EPDKjvbdznoqEcMY +EPDKjvbdZRNEhleR +DoCjjvbdGQATXHFy +EPCjjvbdyqPNIiwA +EOcKjvbdkxrrTYgU +EOcKjvbdcImKLFvx +DoCkKvbduoTzpkPU +EPCjjvbdJXtCIMQp +EOcKjvbdrpVoJbvG +DncLKvbdqZPIHRDx +DnbjjvbdTAFJHand +EOcKjvbdtcCuWuno +DncLKvbdfIKurNqH +DncKjvbdLrWmZtpz +DoDLKvbdMtsRjmAX +EObjjvbdLGGHbBRV +EObkKvbdCWzchePv +EOcKjvbdZxcjODMS +EObkKvbdzaAPGgBl +DoDLKvbdKVtecdgJ +DnbjjvbdHDjvJbJj +EPCjjvbdLiCLqYAS +EPDLKvbdFVxpPmKF +DoDLKvbdZisIPgBf +DncLKvbdTppoUtgm +DnbjjvbdpyPIGpdY +DoDLKvbdEztRElCi +DncLKvbdHgGzZYYH +DnbjjvbdZLqctOMN +DnbkKvbdqTtGqqkU +DnbjjvbdiMEcnVCy +EPDKjvbdvBDxrneI +DoDKjvbdemGXHNJk +DoDKjvbdhficYvKV +EObjjvbdegkWSOQg +DoDLKvbdOFDtIiKd +EPCjjvbdBdQAuimG +DoCjjvbdpyPHgREY +DncKjvbdJXsbHkpp +DoDKjvbdRbEElIxk +DoDKjvbdsQWPJcWG +EObkKvbdsCGNLfkZ +EOcLKvbdzaAPGgCM +EObkKvbdzjUoodSt +DnbkKvbdemFvgMjL +DnbkKvbdWWhxVcdg +DncLKvbdxrmiMqag +EPCkKvbdMSWlytpz +EObjjvbdwNWAMdFN +EPDLKvbdlrYtzTEJ +DnbjjvbdVqnYBeLc +DncKjvbdnHEwmOGy +DnbjjvbdtbbuWvPP +DncKjvbdmIcspuSB +EObkKvbdEOcKkXCd +EOcKjvbdDncKkXCd +EPDLKvbduaDxrndh +DoCjjvbdOFDshhkE +DnbkKvbdRaceLhyL +EPCkKvbdZshhyDrn +DoCjjvbdCSaDTfWr +EOcKjvbdqUTfrSLU +EPDLKvbdtTRryZdc +DoDLKvbdkyTRsZGt +EPDKjvbdyqPNIjXA +DoCkKvbdNUrrKmAX +DoCjjvbdSCDeMIxk +EObkKvbdkMbLzEgP +DncKjvbdEvZPpMie +DoCkKvbdyYIibQZk +EObkKvbdNPxQumfs +EOcLKvbdDncKjvbd +EPCkKvbdozmcjxPA +EPDKjvbdCIkCLIfK +DncKjvbdcyxoxZRC +DoCkKvbdeOdrkUUS +DoCjjvbdhzVFlQnG +EObjjvbdOFETiJLE +DncKjvbdhyuGLqNf +EObkKvbdRWmdClID +DoCjjvbdFpATWgFy +DnbkKvbdlqxtysDi +EObjjvbdqmZjYkhJ +DoDKjvbdZyDjODMS +DoCjjvbdEJhJvYKA +EOcKjvbdqTsgRrLU +EOcKjvbdZsiIxcrn +EObkKvbdIHGzZYYH +EPDKjvbdHgGyxxXg +EObkKvbdxmrgwriD +EPCkKvbdxrnJNSBg +DnbkKvbdjhGkefOL +EPCjjvbdKQydoGNe +EOcKjvbdqvpMDJZR +EObjjvbdQdDBQQdS +DoDKjvbdSKxfVHKs +DoDKjvbdbLLeoODA +DoDLKvbdBsAcUGWr +DoCjjvbdRzKHrbvA +EObjjvbdfMfXGljL +EObkKvbddeOrCWbj +DoDKjvbddjJrVtzn +DoDLKvbdhtydvqtb +DnbjjvbdRNXayOUz +EPDLKvbdRjyFtgKs +EObkKvbdsPuoKCvG +EPCkKvbdYqNEiNFR +DncKjvbdUxgsyjnn +EPCjjvbdZRMdhldq +DoDLKvbdEJhKWXjA +DoCkKvbdQwODblID +EPCkKvbdssRrxzFD +DnbjjvbdZxdKOCkr +EObjjvbduCcUwVno +EOcKjvbdmuUzLKRf +EPCjjvbdfpBzvcwh +DnbjjvbdMowpvNfs +EPDKjvbdGLErcHmV +EPDLKvbdZoOIeEyj +DncLKvbdSLZGUgKs +DncLKvbdlqyUzTEJ +EPCjjvbddePRawDK +DncKjvbdHEKvKCJj +DoDKjvbdeEnqavcK +DoDLKvbdtSrTYzFD +EPDLKvbdxUmFQxlO +DnbjjvbdLLBIWAJy +EOcLKvbdMowqWNfs +EPDKjvbdptUGrSKt +DoDLKvbdHEKvKCKK +EPCjjvbdJcJbpjDY +DnbjjvbdMuTRkNAX +DnbkKvbdEzspdlDJ +DncLKvbdVUMsekvK +EPDKjvbdOTUVgEtp +DncKjvbdAMgySwZx +DoCkKvbdwtmFRYkn +EObjjvbdIjEAKPgE +EPDKjvbdRpTfjGEX +DncKjvbdFjeSbglu +EObkKvbdjFLGtoAO +DoCkKvbduWOYJqTA +EPCkKvbdVAapsQrZ +DnbjjvbdVwJXudEg +DoDLKvbdUtMsfLvK +EPCjjvbdHELVjBij +DncKjvbdRWnECkhD +EPDLKvbdZsiJZDsO +DncLKvbdnPzZWLYb +EPCjjvbdznoqEcMY +EOcKjvbdzoQQeDMY +DnbjjvbdznpQdbkx +EPDKjvbdeYZtTrFz +DoCkKvbdkySrTZHU +DncKjvbdCSaDUGXS +DoCkKvbdcJNJjfXY +EOcLKvbdCEQAvJlf +EPDKjvbdyzdmqhJI +DncLKvbdNPwpvNgT +DoDKjvbdqmZixkgi +EOcKjvbdVYhUZkPO +EObkKvbdhgJbxvJu +DoDKjvbdUQqPUuHm +DncLKvbdqvolChyR +EPCkKvbdEXxMTssl +DnbkKvbdHgGzYwxH +DoDLKvbdIidAJpGd +DnbkKvbdZLqdUOMN +DnbkKvbdGckViaij +DoCkKvbdFVxopNJe +EOcLKvbdRbEFMIyL +EObkKvbdLAjflawq +EObjjvbdziuPodTU +EPDLKvbdQwNdCkhD +EPCjjvbdZxdJmcLr +EPDLKvbdxrmhlqag +DoCkKvbdSPsgJfDw +EPCjjvbdkDLjpgUg +DnbjjvbdtbcUwWOo +DnbkKvbdWIXuxHYz +EObjjvbdEvYpQMie +DoDLKvbdIHGzZXxH +EPDLKvbdVYgszKoO +DncKjvbdhancEvpq +EPCjjvbdcJNKKewY +EPDKjvbdWWhwvEEg +EOcLKvbdvAdYsOdh +EObkKvbdcyyPwxqC +EObjjvbdSPtGifDw +EOcLKvbdkMalZeHP +EPDKjvbdYlRctNlN +DoDLKvbdKWVGEFGi +DncLKvbdMgColouL +DncLKvbdhbPCeXRR +DncLKvbdDwxMTstM +DoDKjvbdvAcySndh +EObkKvbdXGYytAPT +DoCjjvbdmuVZjjRf +EOcLKvbdDGlFgAzc +DoDKjvbdiBncFXRR +DoDKjvbdkaMnmALA +DncKjvbdVBCQrqSZ +DoCkKvbdVviYWEFH +EObkKvbdAMhZSwZx +DoDLKvbdeAUQlwjG +DoDLKvbdZxcjODMS +EOcLKvbdrpWPKDVf +EPCkKvbdWRnYCFLc +DnbkKvbdKeehBaRV +DoDKjvbdMSXMzUpz +EOcKjvbdRkZGVGjs +DoDLKvbdFkFScIMu +DoCjjvbdZjTHogBf +DnbkKvbdnBivwnmu +EOcKjvbdCTAcTevr +EOcKjvbdVviXvDeH +DoDLKvbdliDsptqa +EPDLKvbdZirgpGaf +EPCjjvbdaRfChUFk +EPCjjvbdkClKqGtg +DoCjjvbdKQyeOfOF +EPCkKvbdqvpLbiYq +DnbjjvbdCTBDTfXS +DoCjjvbdOEctIhkE +EObjjvbdbVCHXkUI +DncKjvbdxnTIXrhc +DnbjjvbdezvYdhsw +EPCjjvbdDwwkstUM +EPCkKvbdaaVdepQX +DoDLKvbdjlbMZeHP +DoDLKvbdqAiFAXHd +EPDLKvbdGLEsCglu +EPCjjvbdZyDinClS +EPCkKvbdSLYeuGkT +EPDKjvbdwyhGFweS +EOcLKvbdjJfIKNYS +DoCjjvbddeOrCXCj +DoDKjvbdkxrqsZHU +EOcKjvbdGYuVBEYC +DncKjvbdHkazmvqL +DnbkKvbdZsiIxdSn +EObkKvbdhanbeXQq +EOcLKvbdMpXqWNfs +DnbkKvbdEztQdkcJ +EPCjjvbdDjHjWXjA +EOcKjvbdNQYQvNgT +EPCkKvbdNHCpNPtk +DoCjjvbdbsCkUDjB +EObkKvbdOStWGeUp +EOcKjvbdVqnYBdlD +DoCkKvbdvlvANDeN +DoDKjvbdnQZyWKyC +EOcLKvbdkyTRsYft +EOcKjvbdnVUyjiqf +EPCjjvbdXnRAXtut +EPDKjvbddZxpXxpb +EPDLKvbdfHjvSOQg +DncKjvbdXsMBNTnx +DncKjvbdEARiMzXX +EPCjjvbdOStVgEuQ +DnbjjvbdHELWKCKK +EOcLKvbdehLWSOQg +DncLKvbdYkqctOLm +DoDLKvbdxsOJMqbH +DoCjjvbdzGyMANFX +DoCjjvbdSCEElJZL +DoDKjvbdRkYeuHLT +EOcKjvbdXsLaMsnx +DnbjjvbdePFSkUUS +DncKjvbdGZUuAdXb +EOcLKvbdlZSqsZGt +DncKjvbdiCPCdwRR +EObjjvbdjvXOEBxX +EPDLKvbdRXOEDMHc +EPCkKvbdZisIQHCG +EPDKjvbdjKGIKNYS +DncLKvbdWWiYVdEg +DnbjjvbdaMkBruNH +EOcLKvbdOFEThiKd +DoCkKvbdVZHszLPO +DoDKjvbdiHJcYvJu +EPCkKvbdwuNFRZLn +EObkKvbdJqZdoGNe +EOcKjvbddndsLUUS +EOcLKvbdBraCtGWr +DncLKvbdxrnJNRbH +DoDLKvbdCWzciFPv +EPCkKvbdtlXvaUAw +DoCjjvbdMfbomQUk +DoCjjvbdfoazwDxI +DoCkKvbdauCHXkUI +DnbjjvbdaogHELzd +EPCjjvbdTulPisaR +EPCkKvbdOSsvHEtp +DoDLKvbdTkuoBVni +EPDKjvbdVBBqTRSZ +DnbjjvbdEJgivYKA +DncKjvbdJXtBgkqQ +DnbkKvbdbsCjsdJa +EPCjjvbdhlEcnUby +EObjjvbdssSSyZdc +EObkKvbdhgKCyWJu +EObkKvbddeOqbWcK +DoCkKvbdqvpLcJYq +EPDKjvbdxZgefXeS +EOcLKvbdkVwOEBww +EPDKjvbdemFvfljL +EPCjjvbdFkErcIMu +EOcKjvbdZyEKNcMS +EPDKjvbdqlzJxlHi +EPCjjvbdmbJwXnmu +EOcLKvbdcTDLTcia +DoCkKvbdyzdmqhJI +DnbjjvbdGdLWKBij +DoDKjvbduaDxsPEh +DoDKjvbdZshhxdTO +DncKjvbdptUGqrKt +EPCjjvbdJvVFceGi +EOcKjvbdddoRawDK +DoCkKvbdfMfXHMik +EObjjvbdVAbRSpqy +EObkKvbddZyPxYpb +DnbkKvbdVYgszKnn +DoCkKvbdZMRdUNkm +EObjjvbdTvMPitBR +EObkKvbdIxTaglQp +EObkKvbdGGKSNiUR +DoCkKvbdGBOpyJzm +EPCjjvbdqrUjmjaN +DncKjvbdIMBzmvpk +EPCjjvbdcyxoxYpb +EOcKjvbdmIcsqUrB +DoCkKvbdqvolChyR +EPCjjvbdkHgMGGOL +EPDLKvbdpaIeAWgd +DncLKvbdqvokcIxq +EOcKjvbdZsiJYcrn +EObkKvbdyYJKBpZk +DoCkKvbdKDKDQicY +EObkKvbdlhdTptqa +EObkKvbdyXhjBpZk +EObkKvbdKNAEZfta +EOcLKvbdRyihTCvA +DncLKvbdtcCtwVno +DnbjjvbdVZITykOn +DoCjjvbdJSyArlwl +EPDKjvbdDxYLtUUM +EPDKjvbdvlvANEFN +DoDKjvbdrykpTAgn +DnbjjvbdeYZtUSFz +DoDKjvbdzjVQQETU +EObjjvbdiHJbyVjV +DoCjjvbdcScLTcjB +DncLKvbdhaoDEwQq +DnbkKvbdQlwbZNtz +EPCjjvbdEARiMzXX +EPCjjvbdGFjSOIsq +DoDKjvbdrXPlChxq +DoDLKvbdYqMeImEq +DoDKjvbdOFETiJKd +EPCjjvbdCTBDUFvr +DoCkKvbdZoOIdeZj +DncLKvbdHgHZyYXg +EOcLKvbdCSaCsevr +DoCjjvbdsQWOjCuf +DoDKjvbdKWUfDeGi +EOcKjvbdzitpPcrt +EPDKjvbdZyDimcMS +EPCjjvbdBcpAuilf +EOcKjvbdqwQMCiYq +EOcLKvbdsrrTZZdc +EObjjvbdSQUHKGEX +DoDLKvbdcyxoxZRC +EObkKvbdWXJYWEFH +DnbkKvbdhgKDYuiu +DoDKjvbdrSVLOKaN +EPCjjvbdMoxQumgT +EPDKjvbdcbTMrATm +EPDKjvbdznopdcMY +DnbjjvbdzdzOzdyp +EObjjvbdGYuVBEXb +EPDKjvbdiZtekpnG +DoDLKvbdvvlAuaVu +DoDKjvbdEYXkstTl +EPCjjvbdauCHYKsh +DoCjjvbdDjIJuwjA +EObjjvbdkNCLzFGo +EPDLKvbdiGicZWKV +EPCkKvbdtlXvaTaX +DoCkKvbdpyOggQcx +EObjjvbdtTSSyZdc +DoDLKvbdiZtelROG +EOcLKvbdWRnYCFMD +EPDLKvbdNddUIhjd +DncLKvbdEObjjvbd +EPDLKvbdVUNTelVj +EPCjjvbdVhXvYGxz +DoCkKvbdfRaWzkbo +DoCjjvbdRjyGVHKs +DoCjjvbdSKxfUfkT +EOcKjvbdaRecITek +DoCkKvbdEJhKVwjA +DoDLKvbdwXLaWBVu +EPDLKvbdLYqJrztf +DncKjvbdUMVoAuoJ +DnbjjvbdvmWAMcdm +EObjjvbdpssfqrKt +DnbjjvbdhlEcnVDZ +EOcKjvbdNsUWGeVQ +EObjjvbdVUNTekuj +DnbkKvbdVYgsykOn +EObkKvbdpssgSRjt +DncKjvbdVZITzLOn +DoDKjvbdGGJrNiTq +DoDLKvbdACqwizJQ +DoDKjvbdIryArmXl +DoCkKvbdZMRdTmlN +DnbkKvbdrovPKDVf +EObkKvbdrounjDWG +DnbjjvbdCSaDTevr +DnbjjvbdUyITyjnn +DnbkKvbdKRZeOfOF +DoCkKvbdDigiuxKA +EOcKjvbdxsNhlrCH +EOcLKvbdDjHiuxKA +DncKjvbdXmqAXtvU +DnbjjvbdqFdFTvAh +EObkKvbdxrmhmSBg +DoCjjvbdIidAKPfd +EOcKjvbdKQydoGOF +DnbjjvbdlqyUzSdJ +EPDKjvbdtvOYKQsA +EPCkKvbdcIljLFvx +DoCjjvbdYqNEhldq +EPDKjvbdczYpYZRC +DoDLKvbdiBoCeXQq +EOcLKvbdiCPDFXRR +EPDLKvbdZisHofaf +EPDKjvbdmIdURVSB +EPDKjvbdZRNFIldq +DoDKjvbdJpydoFme +DoDLKvbdWWhwudEg +DncLKvbdDnbjjwDE +DncKjvbdqTsfqqkU +DncKjvbdKDKDRKDY +DoDKjvbdTulQJsaR +DoCjjvbdSBdFMIyL +DncLKvbdqTtHSSKt +EOcKjvbdBcoaVjMf +EObjjvbdiiehKNXr +EObjjvbdCWzciFQW +EPDLKvbdWSNwadlD +EPDKjvbdKVuGEFHJ +DoCkKvbdZMRdUNlN +EPDKjvbdZRMdiMdq +EPCkKvbdxUmEpyMO +DoDLKvbdRkYfVHKs +EObjjvbdIwtCIMQp +EPDKjvbdmJDsqUqa +EPDKjvbdrDeJPmvB +EOcKjvbdTvMPisaR +DncKjvbdMtsRjmAX +DnbjjvbdlqyUysDi +EPDKjvbdQwNdClID +DncLKvbdRjxfVGjs +EObkKvbdauBfxKtI +DoDLKvbdiZtfLpnG +DoDKjvbdhancFXRR +DoDKjvbdREDBQQdS +EObjjvbdrzMQTBIO +EOcKjvbdcImKKfXY +DoDLKvbdijGIKNXr +DncLKvbdgGMZmfgA +EPCjjvbdZnmheFZj +EPDKjvbdmuVZjiqf +EObjjvbdeFPRawDK +EPDLKvbdrNZiyLhJ +EOcKjvbdlhdURUrB +EPDLKvbdGGJrNhtR +EOcKjvbdiGibyWKV +EOcKjvbdQlwbZNtz +DncLKvbdnVUzKiqf +EOcKjvbdbsDKscjB +EPDLKvbdDnbjjvcE +DoCkKvbdySmhmRag +DncKjvbdkyTSTYft +DoDLKvbdEYXkstUM +EOcKjvbdiHJbyVjV +EOcKjvbdsQVnicWG +DoCkKvbdoznDkYPA +EObkKvbdURQoVVHm +EPDLKvbdFfKSNiTq +DnbjjvbdVgxVwgYz +DnbkKvbdmfeYNOHZ +DoDKjvbdyqPNIiwA +EObjjvbdFVyQPlie +EOcLKvbdGdKvKBij +EPCjjvbdDwxMUTtM +DoCkKvbdKVtfEEfi +DoCkKvbddjKRvUzn +EObkKvbdliEURVSB +EPDLKvbdWSNwaeMD +EOcLKvbdJqZdoFnF +DnbjjvbdKxqJrzuG +DnbjjvbdmuUyjjSG +EPDLKvbdADRxKZhp +EPCkKvbdiCPDEwRR +EObjjvbdTXkMNzkY +DnbjjvbdMgDPlouL +EPCjjvbdyzeNqghh +EOcKjvbdmuUyjjSG +EPDKjvbdDoDLKvcE +EPDLKvbdNxPVzdNt +DoDKjvbdBhjbKhfK +DnbjjvbdZLrETmlN +DoCkKvbdHffyxwwg +EOcKjvbdYSlAmUPY +EPCjjvbdtTSTYzFD +DoCjjvbdFjeTCgmV +EObjjvbdNwnuzcnU +DoDLKvbdSPsfiecw +DoDKjvbdKVtedFGi +EObjjvbdUaCQsRRy +EObkKvbdbsDLUDjB +EObkKvbdEOcKjvcE +EPCjjvbdyNsIYShc +EOcLKvbdbVCGxKsh +DoDKjvbdlZSqsYft +DoCjjvbdUslselWK +DncLKvbdbUbHXkUI +DnbkKvbdYkqcsmkm +DncKjvbdXsMAmUOx +DoDKjvbdJuuFcdgJ +EOcLKvbdGLFTChNV +DoCkKvbdaaWEfQQX +DncKjvbdVqnXbFMD +EOcKjvbdZyEJnClS +DoCkKvbdNdctJIjd +DoDLKvbdmaiwYOmu +EPCkKvbdmbJvxPOV +DncLKvbdTqRPUuIN +EPDLKvbdGGKSNiUR +EPCjjvbdIwtCIMQp +EOcKjvbdHDjvJajK +EOcLKvbdZyEJnDMS +DnbkKvbdrWpMDJZR +EOcLKvbdbUagXjtI +EOcLKvbdLGFgbBRV +EOcKjvbdqvpMDIxq +EPDKjvbdOAJSsjSA +DncKjvbdsrqsYyeD +DnbjjvbdtkwvaUBX +DnbjjvbdGQASwGfZ +EObkKvbdURROtuIN +EObkKvbdiUydwRtb +EOcLKvbdqlyixkhJ +EPCkKvbduaEYroFI +DoCkKvbdnUtyjiqf +DoCkKvbdssSTYzFD +DncLKvbdeATqMwjG +DnbkKvbdqlyjYlHi +DncLKvbdTAEhhCOd +EOcLKvbdpxoIHQdY +EPDKjvbdEXxLsstM +DncLKvbdbLLfPNcA +DoDLKvbdCWzdIeQW +DnbjjvbdWSNwbElD +DoDKjvbdGFjSOJUR +DoCjjvbdmttzKjRf +EPCjjvbdqmZjZMHi +DncLKvbddwzUTqez +EObkKvbdrEFIpOVa +DnbjjvbduMYWaTaX +EPDKjvbdTAEiIBoE +EOcKjvbdVrNwaeMD +DoCjjvbdSwkMNzjx +DoDKjvbdZoNheEyj +EObjjvbdFpASvgGZ +DnbkKvbdvBDxsPEh +DoDKjvbdIHGzYxYH +EOcLKvbdhanbeXQq +EObkKvbdACqxJyhp +DoDLKvbdgQBzwDxI +EObjjvbdOYOuzdNt +DnbjjvbdRWmdDMHc +EPCkKvbdePFTLUUS +DnbkKvbdHlBznWpk +EPCkKvbdqlyixlIJ +DnbjjvbdIHHZyYXg +EObjjvbdBcoaVimG +EOcLKvbdZnnIddzK +DnbjjvbdBiLBjhfK +EPDLKvbdeOeTKtTr +EObkKvbdYlRcsnLm +DoDKjvbdnHExNOGy +DoCkKvbdnCJwXoNu +EOcKjvbdwWlBWBWV +DnbjjvbdGYuVAdXb +EObkKvbdLGGHbBQu +EPCkKvbdEJgjVxKA +EObkKvbdlqyVZrdJ +EObkKvbdaNLBsUmH +EPCkKvbdGQASwHGZ +DncLKvbdnBjWwnnV +DnbjjvbdUslsekuj +DncLKvbdeATqNYJf +EOcLKvbdIwtCHlQp +EOcLKvbdGLErcIMu +DnbkKvbdjvXOECXw +EPCkKvbdfSAvzkbo +DnbjjvbdsCGNMHKy +DoDLKvbdURQnuVHm +EObjjvbdQvmdCkgc +EPCjjvbdSPsgKFcw +EPDLKvbdYpmEhleR +EPCjjvbdFjdsDHlu +EPDLKvbdqdFIpOWB +EObjjvbdnQZyVkZC +EPCjjvbdQdCaQRES +DnbjjvbdADRwiyiQ +DnbjjvbdiiehKNYS +DoCkKvbdHkaznWqL +EObjjvbdmoyxujxb +EOcLKvbdxxIibQZk +EObjjvbdsPuoKCvG +EObjjvbdjcMKpftg +EOcKjvbdZisHofbG +DncLKvbdUGznLwWF +DoDLKvbdFfJqnJUR +DnbjjvbdsBelkgLZ +DoCkKvbdrbGNLfkZ +DncKjvbdeYZssqez +EPCkKvbdyNsHwsIc +DnbkKvbdrafMkfjy +EPCjjvbdZyEJnDMS +DnbjjvbdFpASwGey +DnbkKvbdLGGIBaQu +DncLKvbddiiqutzn +DncKjvbdWIXuwfxz +DoCjjvbdNPxRVnHT +DncKjvbdwygefXeS +EPDLKvbdmJEUQtrB +EPCjjvbdQwOECkhD +DoDLKvbdNGbpMotk +DncLKvbdRyjIScWA +DncLKvbdVrOXaeMD +DncLKvbdQmYBxnUz +DnbjjvbdVBCRSqSZ +EPCkKvbdRosfifEX +EPDLKvbdlYrqrxgU +EPDLKvbdKVuGDeHJ +DncLKvbdDncLLWcE +EOcLKvbdfNGXGmKL +EOcLKvbdQvmdDMHc +EOcLKvbdEARiMyvw +DoCjjvbdnHFXlnGy +EOcKjvbdhtyeXRtb +DncKjvbdMgDQNQVL +EObjjvbdpedFUWBI +EPDKjvbdkHfkfFnL +DoDKjvbdrXQMChyR +EObkKvbdREDAoqES +DoDKjvbdBdQAvKMf +DoCkKvbdjvWnDaxX +DnbkKvbdePEsKstS +EPDKjvbdyOTHwsJD +DnbkKvbdrSVKnKaN +EPCkKvbdZirgpHBf +DoCkKvbdsQVnjDVf +DnbjjvbdGLEsCgmV +EPDLKvbdelewHMjL +EObjjvbdjlbMZeGo +DoDLKvbdxrmhlrCH +DoCkKvbdczZQXyQb +EObjjvbdRDcBQRDr +DoCjjvbdxLXEHzyf +DoCkKvbdkySrTZGt +DoCjjvbdDoDKjwCd +EObkKvbdKWVGEEfi +DoDKjvbdTqQoUuIN +EObjjvbdZRNEiMeR +DoDKjvbdxUmEpyMO +EPDLKvbdxxJJaozL +EObkKvbdraemLfkZ +EPCjjvbdbiNKLFvx +DnbjjvbdZjSgpHCG +EObjjvbdqBIeAXHd +EObjjvbdVUNUGMWK +EPDKjvbdliDsqUqa +EOcLKvbdxZgfGYFS +DnbjjvbdYpmFJMdq +EPCkKvbdcTCjtEKB +DncLKvbdVUMtFlVj +EPDKjvbdcIlijevx +DoCjjvbdpstHSSKt +EOcKjvbdLAjgMaxR +DoDKjvbdHkaznXQk +EPDLKvbdrovPJcVf +EObjjvbdjblLRHVH +EPCkKvbdfSAvzlCo +EPDLKvbdkHfkefOL +DoCjjvbdbiNKKfXY +EPDLKvbdjJfHilwr +EOcKjvbdxVMeQxkn +DncKjvbdqlzJyMIJ +DoDLKvbdffMZnGgA +EPDLKvbdrpWPJcVf +DnbkKvbdNsTvGeVQ +DncKjvbdZshiZETO +DoCjjvbdWRnXaeLc +EPDLKvbdUaCRTQqy +EOcKjvbdKDKDQjCx +EPCkKvbdLKaIWAJy +DoDKjvbdjblKpftg +EPDKjvbdfHkWSNqH +EObjjvbdSCEEkiZL +EPDKjvbdcyxpYZQb +EPDLKvbdVUMtFkuj +DnbjjvbdVBCQrprZ +EObjjvbddoEsLUUS +DnbkKvbdiHKDZVjV +EOcKjvbdpyPHgRDx +EObjjvbdYpleJNFR +DncLKvbdrDdhpOWB +DncLKvbdcbSmSAUN +DncLKvbdQwODcLgc +EPCjjvbdKVuFcdgJ +EPDLKvbdJvUecdfi +EObkKvbddjJqvUzn +EPCkKvbdLrXNZuQz +DnbkKvbdDihJuxKA +DoCjjvbdegkWSORH +DncKjvbdFyVUaEYC +DoDLKvbdNHDPlpVL +DoDLKvbddneTKtUS +DoCjjvbdEARhlywX +DncKjvbdmbJwYPOV +DnbjjvbddeOrBvbj +EPDKjvbdAMhZTXZx +DnbjjvbdULuoBVoJ +DoCkKvbdMfbomQVL +EObjjvbdyTNhlqbH +EPDLKvbdcyxowxpb +DoCkKvbdEPDLLXCd +DncLKvbdSCEFLiZL +DnbjjvbdBiLCKiFj +EPCjjvbdmgExNNgZ +EOcLKvbdsPvPKDVf +DoCkKvbdbKkfOmcA +DncLKvbdIxTaglRQ +DnbkKvbdFVyQQNJe +EPDLKvbdbsCjtEKB +EPDKjvbdakMFnnDA +EObjjvbdWWiYVcdg +DnbkKvbdfSAvzkcP +EOcLKvbdbKkennDA +EPCjjvbdTppoVUhN +EPDLKvbdemGWgMjL +DnbjjvbdJvUedFHJ +DoDLKvbdqvokbiZR +EPCjjvbdZMRctOMN +DoCjjvbdNPwpunGs +DoCkKvbdZtJIyDrn +EPCjjvbdFejRnIsq +EPDLKvbdZshhxdTO +DncLKvbdxZhGGXeS +DoDLKvbdKyRKSztf +EPDKjvbdCflFgAzc +EPDKjvbdOEdThiKd +DoDLKvbdTAFIgaoE +EObjjvbdEARiNZvw +EOcLKvbdjhHLefOL +DncKjvbdbVCHXjtI +EPDKjvbdeFPRawCj +DoDLKvbdtcCuWuoP +DoDLKvbdUVkpJtAq +EPCjjvbdaSFcHsfL +EPDKjvbdPxmAGrrK +EPCkKvbdDjHjWXjA +DnbkKvbdpssfqrKt +DoDKjvbdePEsKtTr +EObkKvbdDwxMUTtM +DnbkKvbdZRMdiNEq +EPCjjvbdhuZdvquC +DoCjjvbdGLEsChMu +EPDKjvbdRDbaQQdS +EOcKjvbdEJhJvYKA +DncKjvbdkxsSSxft +EObjjvbdKRZdnfOF +EOcLKvbdZQmFIleR +DnbkKvbdjcLjpfuH +DnbkKvbdYzbfSKWZ +EPDLKvbdbUafxLTh +EPCjjvbdJuuFcdgJ +DoCkKvbdJcKCqJcY +DoCjjvbdSKyGVGkT +DoCjjvbdemFvflik +DoCjjvbdvBEYsPEh +EOcKjvbdCWzdJEov +DncLKvbdqTsgSSKt +DnbkKvbdUMVoBWOi +EPCkKvbdOEcsiIjd +DncLKvbdaSFbhUFk +DoCkKvbdhtzEwRuC +DoCkKvbdiCOcEvqR +DoCkKvbdfILVqnRH +DnbkKvbdCJLCKhej +EPCkKvbdakLeoODA +DnbkKvbdUaCRTQrZ +DoDKjvbdRacdkhyL +EPCjjvbdYNqAXtut +DncKjvbdwzHfFwdr +DncLKvbdNrsvGeUp +EPDKjvbdDoCkKvbd +EPCjjvbdrafNLfkZ +EObjjvbdmajXXoOV +DncLKvbdVAbRTQrZ +EObkKvbdkySrTZHU +DoDKjvbdZeXfzghb +EPDLKvbdiCOcFWpq +EOcKjvbdUQpnuUhN +DncLKvbdijGIKMwr +DncKjvbdHgHZxwwg +DncLKvbdVTmUFlWK +DoDKjvbdeYZtUSFz +EPDKjvbdHffyyYXg +DncKjvbdXsLaMtOx +DncKjvbdzitoocrt +DoDKjvbdhtyeWquC +EPDKjvbdEuyPpNKF +DnbkKvbdtvOYKRTA +DncKjvbdZnnJFEzK +EPCkKvbdqZPIGpcx +DnbkKvbdVgxWYGxz +EPCjjvbdOStWHEuQ +EObkKvbdNddTiIjd +DoDKjvbdwXMBWAuu +EPDLKvbdsPvPKDVf +DncLKvbdQvnDbkhD +DncKjvbdEKHjWYKA +EPCkKvbdCgMFgAzc +EOcLKvbdQvnDbkgc +EPCjjvbdDoCkLWbd +DnbkKvbdKCibpicY +EOcLKvbdhfibyViu +EOcLKvbdzQnliJwA +DncKjvbdEASImZwX +EPDLKvbdFkFTChNV +DnbjjvbdEuxoomKF +EOcKjvbdYqMeJMeR +DnbjjvbdgQBzvdYI +DoCjjvbdkxrrSxft +DnbjjvbdjuwNdCYX +EOcLKvbdfpBzwEXh +DoCkKvbdnHFYMmgZ +EOcKjvbdjlbMZeHP +DoCkKvbdmttzKjSG +EPDLKvbdzjUopDsU +EPDLKvbdsZlPraIO +EOcLKvbdLBLHMbYR +EPDLKvbdtbcVXVno +DoDLKvbdaaVeGQQX +EPCjjvbdWSOYCEkc +EObjjvbdxUmFQyMO +DoDLKvbdRbDdkiZL +DoCjjvbdhlFDnVCy +EPDKjvbdcTDKscia +EPCkKvbdjlbMZeGo +DncLKvbdCIkCKiGK +DoCjjvbdrbFmMGkZ +EObkKvbdQccAoqDr +DnbjjvbdTqRPVUgm +EPCkKvbdNrsufeUp +EOcLKvbdrMyjZLhJ +EPDLKvbdiifHimXr +DnbkKvbdpstHSRjt +EOcKjvbdZtIhxdSn +DnbkKvbdbhmKLGXY +DnbkKvbdkxsSSxft +DoCjjvbdTAFIhBnd +EObkKvbdUtMtGLvK +EPCjjvbdpstGrSLU +DncKjvbdxLXDgzyf +EOcKjvbdSCDdlIxk +EObkKvbdOFEUIiLE +DnbkKvbdjggLefNk +DncKjvbdliEUQtqa +EOcLKvbdFjdsDHlu +DncLKvbdeEnqavcK +EOcLKvbdnPyyVjyC +DoDKjvbdliDsptrB +DoCkKvbdrXQLbiZR +DncLKvbdFkErbhNV +DoDKjvbdTqROtthN +DoCkKvbdYSlAmUOx +DnbkKvbdKVuGDdgJ +EOcKjvbdvwLaWAvV +DoDLKvbdEObjjvbd +DnbkKvbdwXLaWBVu +DnbkKvbdmtuZjiqf +DoDKjvbdegkWRnRH +DoCkKvbdeXzUUSFz +DncLKvbdfNGXGmJk +DoCjjvbdEztQdlCi +EPCkKvbdEuyQPljF +EPCjjvbdrEEiQNvB +DnbkKvbdLqwNZtpz +EObkKvbdKeegbBQu +EObkKvbdvBEZSoFI +DoDLKvbdrXQLbhyR +DnbkKvbdbKlGPODA +DncLKvbdnCKXYOnV +EOcKjvbdjcMKpfuH +DoCkKvbdQdCaQRES +EPCkKvbdDncKjwCd +DoDLKvbdYlSDtNkm +EObkKvbdmbKXXnmu +EPCkKvbdjgfkfGOL +DnbkKvbdZyDjNcMS +EOcLKvbdkNCLyeHP +DncLKvbdVUMtGLuj +EOcKjvbdKVtedFGi +EPCjjvbdKRZeOenF +DoCjjvbdUQqPUthN +EPDKjvbdkMbLydgP +EObjjvbdVqmxBdlD +EPDKjvbdjAQGaPgK +DoCkKvbdTlVnaWPJ +EPCjjvbdwjvdHzzG +EObjjvbdBsBCtGWr +EPCjjvbdwuNEqZMO +DncLKvbdbrcKtEKB +EPCkKvbdFyVVAcxC +EPCkKvbdaSGCgsfL +EPDKjvbdrylQTBIO +DncKjvbdfSBWzlCo +EObjjvbdfRaWzlCo +DnbkKvbdsPvOjDWG +EPCjjvbdcbSlrAUN +EObkKvbdrWpLbhxq +EPCjjvbdhgKDZVjV +EOcKjvbdhlFDnUby +DoCkKvbdddoSBvcK +DoCkKvbdpssfrRkU +DoDLKvbdJutfEFGi +EObkKvbdEPDKkWcE +EOcKjvbdcJNJjevx +EPCjjvbdcTDKscia +DncKjvbdYlRcsmlN +EPDLKvbdkHgMFfNk +DoCkKvbdjbkjqGuH +EPDKjvbdTvMPjUAq +DnbkKvbdQYmAGsRj +EPCkKvbdKeegbApu +EPDKjvbdiLdcmtcZ +DoCkKvbdNeDshhjd +EOcLKvbdxnShXsIc +EPDLKvbdyOShXrhc +EObkKvbdbPgHELzd +DoCjjvbdDoCkKwDE +EOcLKvbdmbJvxPOV +DnbjjvbdkNBlZeHP +DnbkKvbdRXNdDMID +DncLKvbdXnRAYUvU +EObkKvbdBcpAuilf +EPDKjvbdSLYeuGkT +DoCjjvbdRaceLiYk +DncLKvbdZoNiFEzK +EOcLKvbdGLEsDIMu +DnbjjvbdnUuZkJqf +DoCkKvbdlqyUyrci +DoCkKvbdLGGHaaRV +DnbkKvbdmoyyWLYb +DncKjvbdMpYRWOGs +DnbjjvbdkyTRsYft +EObkKvbdjKFhJmXr +DnbjjvbdxLWcgzzG +DoCkKvbdxnShXrhc +DnbjjvbdRbEEkiZL +EOcLKvbdWWiXudEg +DoDLKvbdDjIKVxKA +DoDKjvbdgFkzNgHA +EPDLKvbdvvlAuaVu +EPDLKvbdauBfwkTh +DncLKvbdmIctQtrB +EPDKjvbdCDpBWJmG +DoDKjvbdvAcxsPEh +EOcKjvbdrJAKFNOe +EOcLKvbdbsDKscia +DncLKvbdAMhYsWzY +DncKjvbdddnrCXDK +EOcLKvbdkHflGGOL +DoDKjvbdbUafxKsh +DnbkKvbdNdctIiLE +EOcLKvbdvBDyTPEh +DoCjjvbdFejSOJUR +DnbkKvbdUQpntuHm +EObjjvbdTpqOttgm +DoDLKvbdddoSCXCj +DncLKvbdbVCHXkUI +EPCjjvbdKNAEZgVB +EPDKjvbdFjdsDIMu +DnbjjvbdpaIeAXHd +EOcLKvbdrDdhpOWB +EPDKjvbdIxUBhLpp +EPDKjvbdhkddOVCy +EPCkKvbdTkuoAuni +EPDLKvbdnPyxujxb +EObjjvbdfSBWzlCo +EPDKjvbdMuSrKmAX +EPDLKvbdmozYvKyC +DnbkKvbdZirhPfaf +EPCjjvbdNQXqWOHT +DncKjvbdZsiIyESn +DnbkKvbdURQnuUgm +DoCjjvbdkIHMFfOL +EPDKjvbdKfGHaaRV +DncLKvbdtcDUwVoP +EOcLKvbdxrnImRbH +EPDLKvbdozmdLYPA +DoDKjvbdUVkojUBR +DnbjjvbdqUUHRrLU +DoDLKvbdEARhmZvw +EOcLKvbdZHWdAOri +DoCjjvbdVUMtGLuj +EOcLKvbdmfeYNNfy +EPDKjvbdZirgogCG +DnbjjvbdEJhKVwjA +DnbkKvbdkVvmdBxX +DnbjjvbdvBEYsOeI +EPCkKvbdDoCjjwDE +DoCjjvbdRXNdClID +EPDKjvbdkxrrTZGt +EOcLKvbdZdxGzhJC +DoDLKvbdxnSgxSiD +DoDKjvbdIryAsMxM +DnbkKvbdTYKlNzjx +DncLKvbdIGfzZYXg +DncLKvbdQvnEClHc +DnbkKvbdqUTfrRkU +DoDKjvbdRDcAopdS +DoDKjvbdTfznMXWF +EOcLKvbdauCHYKtI +EObkKvbdNrsvHEtp +DoDLKvbdDihJvXjA +DnbjjvbdliDtRVRa +DncKjvbdgFlZmfgA +DncLKvbdmJDsptqa +DncKjvbdfoazvdXh +EOcKjvbdJXtBgkpp +EPCkKvbdqUUGrSKt +EPDKjvbdrMzJyLgi +EPCjjvbdiGjDYuiu +EOcLKvbdkWXNcaww +EOcLKvbdxxIjBoyk +DnbkKvbdePErjssr +DnbjjvbdIryArmYM +EOcLKvbdRMwayNtz +EOcLKvbdRkZGUgKs +DoDKjvbdZLrEUOMN +DnbkKvbdDHMFgAzc +DnbkKvbdwXMBVaVu +DnbjjvbddeOrCXDK +EPDLKvbdwuMeQyLn +EPCjjvbdBhjbLIej +EPDKjvbdaNLCSuMg +EPCjjvbdBhkCKhej +EPCkKvbdptUGrSKt +EObkKvbdVTmTfLvK +DoCkKvbdDoDKkXDE +DnbjjvbdfoazvdYI +DnbkKvbdatbHYKtI +DnbkKvbdVUMtGLuj +EPDKjvbdeEoRavbj +DoCkKvbdJpzFPGNe +DnbjjvbdNHDQNQUk +DncKjvbdYNqAXuWU +EPCkKvbdZnnIddzK +EObkKvbdYlRdTnMN +EPDKjvbdEzspdkcJ +DoDLKvbdCIkBjhfK +EObjjvbdTkuoAvOi +DoCkKvbdhkdcnUby +EPCjjvbdHfgZyYXg +DncLKvbdbsCkTdKB +DoCjjvbdLqwMzVQz +DoDLKvbdRkYfUgLT +EOcLKvbdbQHHELzd +EPCkKvbdbVCGxLTh +EObjjvbdmSYuZsEJ +DoDKjvbdssRsYyeD +EPDKjvbdLrWlytpz +DncKjvbdJTZBSlxM +DnbkKvbdxrnJMrBg +EPCjjvbdxZgfFxFS +EObkKvbdUQpnuVIN +EObkKvbdzjUpQESt +EObjjvbduaDxsPFI +DoDLKvbdkyTRsYft +DoDKjvbdyTOImRbH +EObkKvbdegkWRnQg +DoCjjvbdaSFbgsek +DoDKjvbdrylPsAhO +DoCjjvbdgGMZnGgA +EPCkKvbdlqyUzSdJ +DncKjvbdwNWAMdFN +EPDKjvbdTlWPAuoJ +EOcLKvbdUMWPAuoJ +DnbjjvbddZxowxqC +EPCkKvbdEuyQPlie +DoDKjvbdVAaqSqSZ +EPDLKvbdwtldpxlO +EOcLKvbdrRtkNkBN +DncKjvbdJqZeOenF +DncKjvbdfHkWSNqH +DoCkKvbdnUuZjirG +EOcKjvbdsCFmMGkZ +DoDLKvbdwzIFfYEr +EOcLKvbdqqtjmjaN +DoCjjvbdrbGNLgKy +EPDKjvbdNHComQUk +DnbkKvbdIMBznWqL +EPCjjvbdEKHivXjA +EPDLKvbdVhYWYGxz +EPDLKvbdZxcjNblS +DnbjjvbdJpzEoFme +EPDKjvbderBWzkcP +DoDLKvbdpssgRrKt +EObkKvbdtbbtvuoP +EOcLKvbdqGDeUWAh +DoDKjvbdlZSrTYft +EOcKjvbdFfKRmhtR +DnbkKvbdNPxRVnGs +EPDLKvbdZshhxcsO +EPCjjvbdMoxQvNgT +EPCjjvbdKaKfmBxR +EPDLKvbdSwjkmzjx +DoCkKvbdjbkkRGtg +DoDKjvbdfoazwDxI +DoDKjvbdqwQLbhxq +EPCkKvbdZtIhyETO +DncLKvbdmpZxukYb +EOcKjvbdMoxQumgT +DoCjjvbdLYqJrzuG +EObjjvbdnGeXlmfy +EPDLKvbdyzeOSHhh +EOcLKvbdiZuGMQmf +EPCkKvbdWSNwadkc +DncKjvbdhfibyVjV +EOcKjvbdQmXbZOUz +DoCjjvbdSKxeuGkT +DnbjjvbdbrbkUDjB +EPDLKvbdJcKCqJbx +DnbjjvbdjSziTLJz +EOcKjvbdZxdKNcMS +DoCkKvbdelfWfmJk +DoCjjvbdFjeScHlu +EPDLKvbdnCJvwnnV +EPDKjvbdNrsufduQ +DnbkKvbdjcLjqGuH +EObjjvbdmbKXYOnV +DoCjjvbdRacdkiYk +EObkKvbdaaVdfQQX +DoCkKvbdJpydnfOF +DoCkKvbduCbtwVoP +DoDKjvbdpxnhHRDx +EOcKjvbdmJEUQtqa +EPDLKvbdRkZGVGjs +EPDKjvbdEObjkXCd +EObjjvbdCTAbtGWr +DoCkKvbdqTsfrSKt +DncLKvbdaMkBsUmH +DncLKvbdqlyixlIJ +EPCkKvbdvwMAuaVu +DncKjvbdiUzEwRuC +DoDKjvbdiUzFWrVC +DnbkKvbdkDMKpfuH +EObkKvbdZnnJFEzK +EObkKvbdWWhwudEg +DoCjjvbdypoNIiwA +DoCjjvbdShyiqABM +DnbjjvbdOFEThhkE +DnbjjvbdRXNcbkgc +DoCkKvbdqUTfrSKt +EPDLKvbdfNGWgMjL +EPDLKvbdGFirOJUR +EOcKjvbdSCEFMJYk +EOcKjvbdmpZxukYb +EPDLKvbdrafNLgKy +DnbkKvbdmJDsqUrB +DnbjjvbdjKFgimXr +EOcLKvbdVYgtZjoO +EObkKvbdTvMPjUBR +EOcLKvbdSxKkmzjx +DoDKjvbdnPzYvKxb +EPCjjvbdaRfDITek +EObkKvbdjKGIJmXr +DoCjjvbdliEURVSB +EObkKvbdFaOqYizm +EOcLKvbdqGEEsuaI +DoCjjvbdZQleJNEq +DoCjjvbdbKlFnnDA +DnbjjvbdWIXuwfxz +EPDLKvbdNGcPmPuL +DoCjjvbdBsBDTevr +DnbkKvbdczYoxYpb +EObjjvbdJutedEfi +DncLKvbdGFirNhsq +EPDKjvbdUaCQrqRy +EPCjjvbdQwNdDMID +EPDLKvbdtSrSyZeD +DnbkKvbdNHDQMpUk +DoDKjvbdZirgofaf +EObkKvbdrpWOibuf +DoCkKvbdwygfFxEr +EPCjjvbdSwjlNzjx +DnbkKvbdjKGHjMxS +DncLKvbdijFhKNXr +EOcKjvbdddoRavbj +EPDLKvbdmIdTpuSB +DncLKvbdiiehJmYS +EObkKvbdjcLkQgUg +DoDKjvbdsQVoJbuf +EObjjvbdhzUfMQmf +DnbkKvbdcImKKfWx +EObkKvbdbQHHELzd +DnbjjvbdWWiXuceH +EPDKjvbdjJegjNXr +EPCjjvbdZyEKNblS +DoDKjvbdLqvlzVQz +EPDLKvbdZRNEhmFR +DnbkKvbdGcjuibJj +EOcLKvbdGAnpxizm +EPCjjvbdkVvnDaww +EOcKjvbdHffzZXwg +DoCkKvbdKeehCAqV +EPCjjvbdHEKuiajK +EOcKjvbdUtMselWK +EPDKjvbdEXwlTstM +EPDKjvbdsrrSxzFD +EOcKjvbdEztQeMDJ +EPCkKvbddoFSjstS +DoCkKvbdSCEElIyL +DncKjvbdFVxpQNJe +DnbjjvbdXmqAYUut +DoCjjvbdiZtfLpmf +DoDKjvbdwygeexEr +EOcLKvbdiUyeXSUb +DncKjvbdsZkoraIO +EOcLKvbdACrYJyhp +EOcLKvbdTlVoBVoJ +EPCkKvbdqZPHfqDx +DnbkKvbdmJDsptqa +DncKjvbdhkeDnUcZ +EPDKjvbdURQoUtgm +EPDKjvbdjAQHAogK +EObjjvbdCIkCKhfK +EOcKjvbdYzbfRjWZ +DnbkKvbdWRnYCEkc +DncKjvbdyzeORgiI +EObjjvbdEPCkLWbd +DoDLKvbdNHComPuL +DnbkKvbdaRebhUFk +DnbkKvbdhlEcmtby +EOcLKvbdliETqUrB +EPDKjvbdIxTbHkqQ +DncLKvbdCEPaVjNG +EOcLKvbdIjEAJogE +DoCkKvbdsZkpSaHn +EPDLKvbdEXxLtTtM +DncKjvbdwXMAvAuu +EPDKjvbdakMGPODA +EPCkKvbdauBfxKsh +EOcKjvbdCJKakJFj +EPCkKvbdyXhjBozL +DoDLKvbdkWWnDbYX +DncKjvbdEPCjkXDE +DoDKjvbdlqxtzTDi +EPCjjvbdyTOJNSBg +DoCkKvbdnGeYMmgZ +EPCkKvbdaSFbhUFk +EObjjvbdnCKWxPNu +DoCjjvbdrWpLbhyR +EPDLKvbdmRxtyrci +DnbjjvbdSBdElJZL +DnbkKvbdrXQLbiYq +DoDLKvbdWHwuwfxz +DoCjjvbdZRNFJNEq +DncKjvbdUVkpJsaR +DoCjjvbdbiMijfXY +EPDKjvbdVTmTekvK +DoCjjvbdeXytTrFz +DoDLKvbdyYJKCQZk +DoDLKvbdczZQYZQb +EObjjvbdRadFMJZL +DncLKvbdkVvnECYX +DncKjvbduaDySneI +DnbjjvbdwuNFQyMO +DncLKvbdsrqrxzEc +DoDLKvbdcSbjtEKB +EPCjjvbdZtJIyETO +DoDLKvbdJvUfDdgJ +DnbjjvbdhbPDFWqR +DncKjvbdcyyQYYpb +DoDKjvbdWSNwbFMD +DoCjjvbdmajXXoNu +EPCkKvbdxZgeexEr +EOcKjvbdxsOIlrBg +DoDKjvbdZyEJmbkr +DncLKvbdTkunaVni +EOcLKvbdUQpoUthN +DoDLKvbdyNsHxTJD +DncKjvbdEztRElCi +DnbkKvbdXnRAYVVt +DnbjjvbdqAheAWgd +DnbkKvbdCJLBkIfK +EPDKjvbdUGzmkwWF +EPCkKvbdSiZiqABM +EPDLKvbdidkGtoAO +EOcLKvbdYlSDsnLm +EPDKjvbdMSWmZtpz +DoDKjvbdlhdURVRa +EOcLKvbdOYOuzdOU +DncLKvbdrafMlGkZ +EObjjvbdrylPraHn +DnbjjvbdDncLKwCd +DoCkKvbdoznELXoA +DoCkKvbdmttykJrG +DoDLKvbdBvzciEov +EPCjjvbdeXzUUSFz +DoDKjvbdtunYKQsA +EObjjvbdqceJQNvB +EOcLKvbdqTtGqqkU +DoCkKvbdiGjDYujV +EPCkKvbdRWnEDLhD +EOcLKvbdcSbjtDia +DncLKvbdTqROuVHm +EOcKjvbdiifIKMxS +EObkKvbdlYrqsZGt +DoDKjvbdSBdFLhxk +DnbkKvbdVUNUFkuj +DoCjjvbdrzLpSaIO +DoDKjvbdzGxlANFX +DoDLKvbdfHjuqmpg +EPDKjvbdZRMeIldq +DncKjvbdMfcPlpVL +DncKjvbdxKwDgzzG +EOcLKvbdYzbfRjVy +EObkKvbdWSNwbElD +DoCkKvbdeFOrCXCj +EObjjvbdbKlGOmcA +EOcKjvbdDxXktUTl +EPCjjvbdvBDySneI +EPDKjvbdLFehCBRV +DoDLKvbdiZuFlROG +EPDKjvbdDoDLKvbd +DoCjjvbdQwNdCkhD +DoCjjvbdCJLBkIfK +DnbjjvbdlqyUzSci +DncLKvbdNHCpMpUk +EOcKjvbdiMFEOVCy +DoCkKvbdnGeYNOGy +DnbkKvbdZoOIddzK +EOcKjvbdFpATWffZ +DoDKjvbdeOeTKtTr +DnbjjvbdGGKSNhsq +EOcKjvbdyXiKCPyk +DoCjjvbdeAURNYKG +DoDKjvbdpssfrRjt +EPDKjvbdnVVZjjRf +EOcKjvbdiZuGMQmf +EOcLKvbdNHDPlotk +DnbjjvbduCbtwVoP +EOcKjvbdxUleQxlO +DoDKjvbdnHFYMnGy +DnbjjvbdUVlPitAq +EPCkKvbdjAPgAofj +DoCkKvbdTlVoAuoJ +EPCkKvbdmSYtyrdJ +EPDKjvbdBsAcTevr +EPCkKvbdUyITzKnn +DnbjjvbdbQHGdLzd +EOcLKvbdezuyFIsw +DoDLKvbdEXwlTtUM +EOcKjvbdKyRJrztf +DnbjjvbdtTSSxzEc +DnbjjvbdHDjujBij +DoCjjvbdsQVnicWG +EObkKvbdZsiJYcrn +EPDLKvbdUtNUFkuj +DoDKjvbdNPwpumfs +EOcKjvbdSBcdlJZL +EPDLKvbdmfeXlmfy +DncKjvbdIsZAsNXl +DncLKvbdmJDsptrB +DncKjvbdGYuUaEXb +DncLKvbdyYJJbPzL +DnbkKvbdrpVnicWG +EPCjjvbdTqQoVUgm +DoDLKvbdFVyPpMjF +EObkKvbdZnnIeEyj +EObkKvbdbUagYKtI +DoCkKvbdqGDdtWBI +EPDLKvbdFVxpQNKF +DncLKvbdkWXNdCYX +EPDKjvbddwystRez +EOcKjvbdaNKasUlg +DnbkKvbdNdctIhjd +EPCkKvbdatagYKsh +DoCkKvbdfNFvgMik +EObjjvbdJYTbIMQp +DoCjjvbdEYYMTtTl +DncKjvbdWRmxCElD +EPCkKvbdbsCjsdKB +EOcLKvbdFVxpQMie +EObkKvbdpaJFAWgd +EPDLKvbdijGHimXr +EPCjjvbdlhctQtqa +EObjjvbdFVxoolie +DncKjvbdrJAKEmOe +DnbkKvbdzQnmIiwA +EPCkKvbdkHfkeemk +DnbjjvbdLGGHaaQu +DnbkKvbdOSsugEtp +DnbkKvbdZtIiYcrn +DoCjjvbdQZNAGsSK +EObjjvbdNPxRWOGs +DoCkKvbdVUMsfLuj +DnbjjvbdmJETqUqa +EPDLKvbdBsAcUFvr +EOcLKvbdIsZArlwl +EPCjjvbdNddTiJKd +DoDKjvbdyXhiaozL +DncLKvbdjmCLzEfo +EOcLKvbdRadElJYk +DncLKvbdjbkkQfuH +EObkKvbdXFxzUAOs +DncLKvbdxZhGFwdr +DoCjjvbdNsTugEuQ +EObjjvbdRbDdlIyL +DoCkKvbdePEsLUUS +DoCjjvbdOStVgFVQ +EPDLKvbdUtMtGLuj +EObjjvbdFjdrbhMu +EOcKjvbddeOrBwCj +DnbjjvbdxUmFRYkn +DnbjjvbdCEQBVimG +EOcLKvbdvAdZTPEh +EPCkKvbdGcjvJaij +EPCjjvbdOFETiIjd +EOcLKvbdemGWgNKL +DoCkKvbdqTsfrRkU +DncLKvbdbrcKsdKB +EPDLKvbdTAFIhBoE +DoCjjvbdKCjCqJbx +DnbjjvbdNsUWHFUp +EPDKjvbdkWWmcaxX +EPDLKvbdbKlFoNcA +DoCjjvbdkIGkefNk +EPCkKvbdXFyZtAPT +EPDKjvbdpxnhGpcx +DoDLKvbdhanbeWqR +EOcKjvbdliEUQtqa +EObjjvbdbBVeFpPw +EObkKvbdQdDApQdS +EPDLKvbdnQZyVkZC +EObjjvbdhbOcEwQq +DnbjjvbdBdPaWKMf +DoCjjvbdCTAbtGWr +EPCjjvbdEvYpQMie +EObjjvbdDxYLtUTl +EObkKvbdCTBDTfXS +EPCjjvbdmpZxvKyC +EPCkKvbdRzKITDWA +EObkKvbdemGXGmJk +EOcLKvbdIryAsNXl +DoDKjvbdkWXNcaww +EObkKvbddCTNSAUN +DncKjvbdvBDxroEh +DncLKvbdiCPDEwRR +EObjjvbdRkZGVHLT +DoCjjvbdFkFSbhNV +EPDLKvbdwjvdHzzG +DoDLKvbdqquKmkBN +EOcKjvbdsQVoJcVf +EPCjjvbdYlSEUOMN +EObkKvbdjKGIKMxS +DncLKvbdRpUGifDw +EObkKvbdEuxooljF +EPDLKvbdzitpQETU +EOcKjvbdTvLpKUAq +DoCjjvbdrSVKmkAm +EOcLKvbdEvZQPmJe +EPCkKvbdfelZnHHA +EOcLKvbdjhGlGGNk +DncKjvbdCEPaWJmG +DncLKvbdrpVnjDWG +DoDLKvbdeOeTKtUS +DoCkKvbdtbbuXVno +EObkKvbdYpleJMeR +DnbjjvbdiCPDEvqR +DoDLKvbdUslsekuj +DnbkKvbdGBPQyJzm +EPCkKvbdtbcUwVoP +DoDKjvbddxZssrFz +DncLKvbdkIGlGFmk +EPCkKvbdhuZdwRtb +EObkKvbdehLWSOQg +DoCkKvbdatafwjsh +DoDKjvbdhfjCyViu +DoCjjvbdFyUuAcxC +EObkKvbdUMWPAvPJ +EPDLKvbdxxIjBoyk +DnbjjvbdMRvlytpz +EPCkKvbdDxYLtUTl +DnbjjvbdiVZeXSUb +DoCjjvbdffMZmgHA +EPDLKvbdnPyyVkYb +EPCkKvbdZtIhyETO +DncKjvbdRECaPqDr +EPDKjvbdVrNxBeMD +DnbkKvbdKVuFdFGi +EOcLKvbdrzLosAgn +EPDKjvbdLLAgvAKZ +EOcLKvbdLYpirztf +DncKjvbdnGeXlnHZ +EOcLKvbdQdDAopdS +DnbkKvbdptTfrRkU +DoCjjvbdqGEFUVaI +DncLKvbdrDeIomvB +DoDLKvbdyOTHxSiD +EOcLKvbdRpTfjGDw +DoDLKvbdzitpPdTU +DnbjjvbdUxhTykOn +EOcKjvbdGFjSNhtR +EObkKvbdidkGuPAO +EObjjvbdVAapsQrZ +EPDLKvbdQccAopdS +EObjjvbdmozYukZC +EOcKjvbdGFjSOIsq +EPCkKvbdyzeNrHiI +DncLKvbdEOcKjvcE +DncLKvbdLFfIBaQu +DoDKjvbdtlXwBUBX +DoCjjvbdeOeTLTsr +DncKjvbdiZuGLpnG +DoCkKvbdWRnYBdkc +DncLKvbduCbtvvOo +DnbkKvbdGGKRnIsq +EOcLKvbdVTmUFkuj +EOcKjvbdFkEsDHlu +DoDKjvbdQwNcbkgc +DncLKvbdWRmwbFLc +DnbjjvbdHlBzmwRL +EPDKjvbdDncKjwCd +EObkKvbdGBPRYizm +EOcKjvbdqrVLNjaN +EObjjvbdqFceUVaI +DoCkKvbdZQmFImFR +EPDLKvbdmIctRVSB +EObkKvbdjAQHBPfj +EObjjvbdrEFIonWB +DnbjjvbdsPuoKCuf +DoDKjvbdtbbuXWPP +EPDLKvbdOStWGduQ +DoCkKvbdUQqPUuIN +EPDLKvbdwyhFewdr +EObkKvbdShyiqAAl +EPDLKvbdGZUuBEXb +EPCkKvbdHffyyXwg +EObjjvbdGBOpyJzm +EObkKvbdZirgpGaf +EObkKvbdRjxfUfkT +EPDKjvbdZHWdAPSi +DnbjjvbdVrOYBdkc +DoCjjvbdGGKSNhsq +EOcKjvbdJqZeOenF +EOcLKvbddBsNSAUN +DncKjvbdZtJJYcsO +EPDKjvbdBraDTevr +DoCkKvbdRDcApQdS +EObjjvbdGGJrNiTq +DoCjjvbdGLFTCgmV +DoCjjvbdtlXwBUAw +DncLKvbdQwNdClHc +DoDLKvbdygYlAMeX +EPDLKvbdTvMQKTaR +EPCjjvbdiMFDnVDZ +DoCjjvbdiBoDFXRR +EObkKvbdUQqOuUgm +EOcKjvbdaMkBsVNH +EObkKvbdwuNEqZMO +EObjjvbdLAkGlbXq +EObkKvbdkCkkQgUg +DncLKvbdVqnYCFLc +EPCkKvbdxVMeRZLn +DncLKvbdRXOEClHc +EObjjvbdvwMAvBWV +EObjjvbdIwsahLpp +EObjjvbdKDKCpicY +DoDKjvbdlrZUzTEJ +EOcLKvbdyYIjBpZk +DncLKvbdxsNhlqag +EPDKjvbdgPazvdXh +EPDLKvbdbKlGPNcA +DoCjjvbdqUUHSRjt +DnbkKvbdNeDsiJKd +DnbjjvbdqGEFTvAh +DoDKjvbdnUtykKRf +EPDKjvbdZtJJZDrn +DoCjjvbdmRxtysEJ +EOcKjvbdQmXbYnUz +EPDKjvbdjmCLzFGo +DncKjvbdsBfMkfkZ +EPCkKvbdFVxpPlie +DnbkKvbdZLrEUOMN +DoCkKvbdEOcKkXDE +EObkKvbdvBEYsPEh +EPDKjvbdcJMjLGXY +EOcLKvbdOYPVzcnU +DnbkKvbdsQWOjDWG +EOcLKvbdfHjvRnRH +DoDLKvbdmbKXYPOV +DncKjvbdrpWPJcVf +EOcKjvbdURROuUgm +DnbkKvbdrovOicWG +EObjjvbdLYpirzuG +DnbjjvbdGQASvgGZ +DnbkKvbdYzcFqjVy +DncKjvbdBsBCtFvr +DoDLKvbdYgXEAOri +EOcLKvbdqTsfqqjt +DncKjvbdPIAYZAYa +EOcLKvbdypnliJwA +DnbkKvbdhyuGLqNf +EOcLKvbdjhGkfGOL +DncKjvbdjblLRGuH +EPCjjvbdxwhibPyk +EOcKjvbdBhkCLIfK +DnbjjvbdJTZArlxM +DoCkKvbdRjxetgKs +EObkKvbdiUyeWrVC +EOcKjvbdwXLaWAuu +EPDLKvbdssSTZZdc +EObkKvbdcSbjtDia +DncKjvbdgGMZnHHA +DoCkKvbdatafwkUI +DncLKvbdnCKWxPNu +EObjjvbdyOShXrhc +EPCjjvbdpyPHfqEY +DoDKjvbdbUbGxKsh +EOcKjvbdypoNJKXA +EObkKvbdyTOJMrBg +DoDLKvbdiZtfLpmf +EPCkKvbdLGFgbBQu +EOcLKvbdCJLBkJFj +DnbkKvbdUxgszLPO +DoDKjvbdUQqPVVHm +EPCjjvbdijGIKNYS +EPDKjvbdCJKajhej +EPDLKvbduoTzqLPU +DnbjjvbdJTZBTMwl +EOcLKvbdLAjfmBwq +DoDLKvbdQwOECkhD +DoCjjvbdQYmAHTSK +DoDKjvbdEuyQQMjF +DoDKjvbdZdwfzhIb +EOcKjvbdyTOJNRag +DoDLKvbdbBVdfQPw +DoCkKvbdbVBfxLUI +DncKjvbdcIljKevx +EOcLKvbdhgKDZViu +EObjjvbdOTUWHEtp +DncKjvbdZRMeIldq +DnbjjvbdkHgMGGNk +EOcLKvbdZMSETmlN +EPCkKvbdjcMKpfuH +EPDLKvbdiBncFXQq +EObjjvbdJcKCqKDY +DoDKjvbdQwOEClID +EPCkKvbdRpUHJecw +DoDKjvbdZjSgogBf +DoCkKvbdEObkKvbd +DoDLKvbdDwwktUTl +DoCkKvbdSKyGVHKs +DnbkKvbdZMSETnMN +DncLKvbdiZuGLpmf +EObjjvbdjcLjpgVH +EOcLKvbdYzcFqjVy +EPCjjvbdQvnDcLhD +DoCkKvbdDihJvYKA +EPDLKvbdJqZeOenF +EOcKjvbdWXJXvDdg +DoCjjvbdznpQeCkx +EPCjjvbdjJehJmXr +DoDKjvbdmSYuZsDi +DoDKjvbdFVyPolie +DnbjjvbdULvPAvOi +DncKjvbdwzIGFwdr +DnbkKvbdOEcsiJKd +EPCkKvbdEJhJuwjA +EObkKvbdYSkaNUOx +EObkKvbddoFSkTtS +DoDLKvbdFkFTDHlu +DoCjjvbddwzTtRez +EOcLKvbdDwwlUTtM +DoDKjvbdHDjvJaij +EObkKvbdyTOIlrBg +EOcLKvbdtSqsYzFD +EObkKvbduVmwjQsA +EPDKjvbdbiMjKfXY +DncLKvbdsQWPKDWG +DncLKvbdRbEElIyL +DnbjjvbdGKeTDHlu +EPCkKvbdrpWOjDWG +EObjjvbdVwJYWEFH +EPCjjvbdvBDySoFI +EPCkKvbdZMSDsmkm +EObkKvbdqYnhHREY +EObjjvbdyqPMiJwA +DncLKvbdCTBCtGXS +EPCkKvbdfekynGgA +EPCkKvbdvvkaWBVu +DoCjjvbdGZUuAdYC +DoDKjvbdpyOgfqDx +EPCjjvbdePFTKstS +EOcLKvbdVviXudFH +EPCkKvbddZyQYZQb +DnbkKvbdUaCQrqRy +EPDLKvbdQwNdDMID +DncKjvbdUaCRTQrZ +DnbjjvbdHDkWJbKK +EOcKjvbdOTTvGduQ +DnbjjvbdssRrxzEc +EObjjvbdezuxdiTw +EOcLKvbdGLFTCgmV +EPDLKvbdUxgtZkOn +EOcLKvbdbrbjscia +DnbjjvbdjJfHimXr +EOcKjvbdjcMLQgUg +DoDKjvbdlYrqrxft +EPDKjvbdGYttaEXb +EOcLKvbdhbPDEwQq +EOcKjvbdvAcxroEh +DoDKjvbdVgxVxHYz +DoCkKvbdTqQnuVIN +DoCjjvbdrXQMCiZR +EOcKjvbdMSWlytpz +DoCjjvbdBiLCLJFj +EObkKvbdUyHtZkPO +DoDLKvbdGcjujCJj +EPCjjvbdfkGzbfAE +DoCjjvbdDoCjjwDE +DnbkKvbdqGDdsvAh +DoDLKvbdjvXNdBww +EOcKjvbdANHySvyx +DoCjjvbdeJjRvUzn +DncKjvbdqUTgRqkU +DncLKvbdEvZQPljF +DnbjjvbdSPsgKFdX +EOcKjvbdGLFScHmV +EPCjjvbdqUTgRqkU +EPCkKvbdNxOuzdOU +DoCkKvbdpfEEtWBI +EOcLKvbdDwwlTtTl +EPCjjvbdSZjITDWA +DncKjvbdQwNcblID +DnbjjvbdijGIKMwr +DnbjjvbdYpldiMdq +DncLKvbdemGXHNKL +EPCkKvbdEKHjWYKA +DoDLKvbdwXMBWAvV +DnbjjvbdQwOEClHc +DnbkKvbdbUbHYKtI +DncLKvbdCSaCtFvr +DncLKvbdEuyPpNJe +EPDKjvbdFVyPolie +DncKjvbddneSkTtS +EOcKjvbdZtJIxcsO +EOcKjvbdiGicZWJu +DncLKvbdOFDtIiLE +DoDLKvbdOSsufduQ +DnbkKvbdMfcPmQVL +EObjjvbdiUzEwSVC +DoCkKvbdCIkBkJFj +DncLKvbdYkrETmlN +EObjjvbdqZOggREY +EPCkKvbdHDkViajK +DnbkKvbdbsDLTdKB +EPDLKvbdlqxtzTDi +DncKjvbdLGFgbAqV +EObjjvbdoAKztHcn +EPDLKvbdRXODblID +DoCjjvbdIHGzYwxH +EObkKvbdNPwqVnHT +EOcKjvbdxrnImRag +EOcLKvbdiLddNuCy +DoCkKvbdkMakzEfo +EObkKvbdnPyxukYb +EPCjjvbdZdwfzgiC +EPCkKvbdnHEwmNfy +EObjjvbdySmiNRag +EOcKjvbdzeZnzdyp +EPCjjvbdJvVFdEgJ +EOcKjvbdZQldiMeR +EOcKjvbdFyVVAdYC +DncKjvbdJXsahMRQ +DnbjjvbdfNGXGljL +EOcLKvbdwWlAvAvV +DncLKvbdkIHLefNk +DncLKvbdliDtQtrB +DoCkKvbdxZgefXdr +DncKjvbdCWzchdpW +EPCkKvbdpyPHfpdY +EOcKjvbdhbOcFWqR +DnbjjvbdzjUpPdSt +DoDLKvbdZMRdUOLm +DncLKvbdVwJXucdg +EPCjjvbdWXIxVcdg +DnbkKvbdMpXpvOHT +DncLKvbdRkZGVHKs +DoDKjvbdmpZyWKxb +DoCjjvbdegkWRmpg +DncLKvbdyzeOSHhh +EPDLKvbdRECaPpdS +EPDKjvbdqvpLcJZR +DoCjjvbdRDbaPqDr +EObjjvbdRECaPqDr +EOcLKvbdsBfNLgLZ +DncKjvbdZyEKOCkr +DnbkKvbdSPsgJfEX +EPDKjvbdZRMdiMeR +EPDLKvbdDwwktTsl +EPDLKvbdLhbLpxAS +EPDKjvbdZirgpHBf +DoCkKvbdmtuZkJqf +DnbjjvbdwWkaWAuu +DnbjjvbdRDcBPqES +DnbkKvbdyzeNqgiI +EObjjvbdYkrEUOLm +DoCkKvbdmtuZkKRf +DoCkKvbdNdctIhkE +DnbjjvbdhytfLqOG +EOcLKvbddZyPwxpb +EPCjjvbdYzbeqivZ +EOcKjvbdwygfGXeS +EOcLKvbdRosfifEX +EPCkKvbdznopdbkx +EObkKvbdVBBqSqSZ +EObjjvbdQlxCZNtz +EPCkKvbdhlFDmtby +DoDLKvbdCDpAvJmG +EPDKjvbddeOrCXDK +EOcLKvbdrovOjDWG +DnbkKvbdIGfyyYYH +EObkKvbdmbKWwnmu +EOcLKvbdkDLjqGuH +EPDLKvbdqrUkNjaN +EPDKjvbduDDVXWPP +EObjjvbdZnnJFEzK +DnbjjvbdaRfCgtGL +DoCkKvbdGKdsDHlu +DncKjvbdqlyiyMHi +DoDLKvbdSLYetgLT +DnbkKvbdZQleJNEq +EOcLKvbdZLrETnMN +DnbjjvbdiUydwRuC +EObjjvbdnPzYvLYb +EPCjjvbdGYuUaEYC +EObjjvbdACqwiyiQ +DncKjvbdIHGzZYXg +DncKjvbdxrnIlqag +DnbjjvbdySmhlqag +DoCjjvbdSCEFMJZL +EObjjvbdSKxfUfjs +DnbjjvbdnUtyjjRf +DncLKvbdkyTRsZGt +DoDLKvbdWRnXbElD +EOcKjvbdjvXNcbYX +EOcKjvbddjKSWUzn +DoDKjvbdvBDxrneI +EOcLKvbddndsKtTr +DoDLKvbdZjTHpGbG +DnbkKvbdpfDdsuaI +EPCkKvbdfMfWgNJk +DoCkKvbdjJegjNXr +DoDKjvbdcTDLTdKB +EPDLKvbdwzHfFxEr +DncKjvbdfMfWgMik +DnbkKvbdrbFllGkZ +EPCkKvbdCIkCLJGK +EObjjvbduDDUvvOo +EOcKjvbdDxYMUTsl +EOcLKvbdsPvOibuf +DncKjvbdUsltGLvK +EPCjjvbdyOShYTIc +DoDKjvbduaEZSoEh +DncKjvbdLrXMzUpz +DoCkKvbdNsTufeUp +EObkKvbdLGGIBaQu +EPCjjvbdmSZVZsEJ +DncLKvbdQdDAoqDr +DoCkKvbdKCicRJbx +EPCkKvbdxwhibQZk +DoDKjvbdTvMQJsaR +DoCkKvbdYzcGSJuy +DnbkKvbdwyhGFwdr +DoCjjvbdEOcLKwDE +DoCkKvbdGGKRmhtR +EOcLKvbdrzMQTAgn +DoDLKvbdJvVFceHJ +DnbkKvbdfMfWfmJk +EPCkKvbdmajWwnmu +EPCjjvbdxrmiMqag +EOcKjvbdqUTfqqkU +EObkKvbdoAKztHcn +EObkKvbdkyTSTZHU +EPCjjvbdiCOcEwRR +DnbkKvbdGZUtaDwb +EPCjjvbdYORAXuWU +DoCkKvbdULvPAuoJ +DnbjjvbdcSbjscjB +DoDKjvbdLrXMytpz +DncKjvbdIryBTNYM +DoCjjvbdZyDinCkr +EPDLKvbdZoOJFEyj +DncLKvbdajkfOmcA +EPDLKvbdRNYCYmtz +DoCkKvbddePRawDK +EOcKjvbdbUbHYKtI +EPCjjvbdbrbjscjB +EPDKjvbdKDJcRKCx +EObjjvbdqcdiQOVa +EPDKjvbdZjTIPgBf +DnbjjvbdrSUjmjaN +DnbjjvbdEXxLsstM +EPCkKvbdFjeSbglu +DnbkKvbdLqwMytpz +DoDKjvbdUGznMXVe +EObkKvbdpstHRrLU +DoDKjvbdYTLaNUPY +DnbkKvbdGKdrbhNV +EObjjvbdRMxCZNtz +DncLKvbdDihJuwjA +EPCjjvbdOFDtJIkE +DnbkKvbdliEUQuSB +DoDKjvbdkCkkQftg +EPCkKvbdGZVVAcwb +EObjjvbdkyTSSxgU +EPDKjvbdIryBSlxM +EOcKjvbdWIXvXfxz +DoDLKvbdhfjCyWKV +DoDKjvbdNQXpumfs +DncKjvbdiMEcnVCy +EPDLKvbdxVMeRZLn +EPCkKvbdDoDKjwDE +DnbkKvbdSCEFLiZL +DoCjjvbdqYoHgQcx +EObjjvbdxZhFexFS +EOcLKvbdkDMLRGuH +EPCkKvbdVwJXvDdg +DoCjjvbdjhHLefOL +EOcLKvbdiCOcFWpq +DnbjjvbdrovOjCvG +DncLKvbdRzKHsCvA +EPCkKvbdDoDLKwDE +EOcKjvbdrNZjZLhJ +EObjjvbdTAFIhBoE +DncKjvbdlqyVZsDi +DncLKvbdjggMFenL +EPDLKvbdUsltGMWK +DoCjjvbdkyTRsZGt +EOcLKvbdrzMPsBHn +EPCkKvbddZxpYYpb +DncLKvbdGKdsCgmV +DnbkKvbdvAdYsPEh +DoDLKvbdqUUGrSKt +EPCjjvbdxnTHxTIc +EOcKjvbdZisIQGaf +DncLKvbdBhjbLJFj +DoCkKvbdJSyBTNYM +DnbjjvbdmfdwlmgZ +EOcLKvbdJcJcRJbx +DncLKvbdmoyyWLYb +EObjjvbdSKxfUfkT +EObjjvbdlAlnmALA +DoDLKvbdTlVnaVoJ +EOcKjvbdnCKWwnnV +EPCjjvbdjbkkRGtg +EPCjjvbdULuoBVoJ +EPDKjvbdwMvAMceN +DnbkKvbdznopdcLx +EPCkKvbdeuzwoizs +EPCjjvbdpssfrRjt +EOcKjvbdiGibyWJu +DnbkKvbdYSlBNToY +EPDKjvbdkVwNcbYX +DoCjjvbdsPuoJcVf +DnbkKvbdrbGNLgLZ +DnbkKvbdRbEFMJYk +EObjjvbdqceIonVa +DnbkKvbdTpqPUuHm +EOcLKvbdVviXvEEg +EOcLKvbdvAcxrndh +DnbjjvbdTYKkmzkY +EOcLKvbduDCuXVno +EPCkKvbdEvYpPlie +DncLKvbdaSGCgtFk +DoCjjvbdpfDdtWBI +DncLKvbdHDkWJbJj +DncLKvbdqZOgfpdY +EPCkKvbdFxuVBEXb +DoDKjvbdnBivwnnV +EPCkKvbdRWmcbkhD +EObjjvbdfIKvSOQg +DnbkKvbdcIlikGWx +EOcKjvbdQdDBQQdS +EPCjjvbdnPzZWKyC +DnbkKvbdZxcimbkr +DncLKvbdLFfHaaRV +DoCjjvbdYSlBNToY +DnbjjvbdKCicRKDY +EPCkKvbddneSjtUS +EObjjvbdmIctRUqa +DncKjvbdYqMdiNFR +DnbjjvbduaDyTPFI +EPCkKvbdePEsLTtS +EPCkKvbdbUagYKsh +DoDLKvbdssSSxzFD +EObkKvbdMuSrLNAX +EPDLKvbdddnqbWbj +DnbkKvbdvAcySneI +EPDKjvbdatbGxLUI +EOcLKvbddePRbWbj +DoDLKvbdijGIKNYS +EPCjjvbdNrsugEtp +EOcLKvbdxZhGGYEr +DnbkKvbdTkvPAvPJ +DoCjjvbdFyUuAcwb +DnbjjvbdJTZBTMxM +EPDLKvbdaMkCStmH +EPDLKvbdjKGHimYS +DnbkKvbdelewGlik +EObjjvbdkHgMGGOL +EObkKvbdURRPUuHm +EOcLKvbdjKFhKNYS +EPDLKvbdhyuFkpnG +EOcLKvbdRosgJecw +DoCjjvbdczYoxYqC +DncLKvbdzaAPGgCM +EPDKjvbdiUzEwSUb +DoCjjvbdKQzEneme +EObjjvbdatagXkTh +DoCjjvbdwtldqYkn +EOcKjvbdUxgszLOn +EPCkKvbdUaBprprZ +EOcLKvbdYNqAYVVt +EObjjvbdbUafwkTh +EPDLKvbdcIljLGWx +DnbjjvbdNHDPlotk +EOcLKvbdkIHMFfOL +EPDKjvbddePSCXDK +EOcLKvbdbUafxLTh +DoDKjvbdQlwaxmtz +DoCkKvbdbQHHELzd +EPDLKvbdhficZWKV +DoDKjvbdqrVLOLAm +DoCjjvbduDDUvvPP +EPCjjvbdCEQAuilf +EOcLKvbdEASIlywX +DncLKvbdRNXayNtz +EOcKjvbdVrOXaeMD +EPCjjvbdFWYopNKF +DnbkKvbdSQTfjFcw +DoDLKvbdJTZAsMwl +DoCjjvbdiCPDEvpq +DncKjvbdVwIwuceH +EPDLKvbdJvVFcdfi +EPCjjvbdcbSlrATm +DnbjjvbdqBJFAXIE +EPCkKvbdTAFJHbOd +EPCjjvbdcTCkUEKB +EPCkKvbdxwhibPzL +EPCkKvbdRpTfifEX +EPDLKvbdvAdYsOeI +DncKjvbdpxngfpdY +EPCjjvbdEXwksstM +DnbkKvbdNrsufeUp +DnbkKvbdJKEAJogE +DoCkKvbdNsUWGduQ +DoCkKvbdbrcLTcjB +EOcKjvbdiHJcZViu +EObkKvbdEztQdkcJ +DoCjjvbdliETptqa +EOcLKvbdOEdUIhjd +DoCkKvbdSKxfVGkT +EPCjjvbdIsZAsMxM +EOcKjvbdZsiIyDsO +DncLKvbduDCtwWOo +DnbkKvbdEztQdlCi +DnbjjvbdLZQjSztf +DoDLKvbdXmqAXuVt +EPCjjvbdxsOJNSCH +DoDLKvbdRadElJZL +EOcLKvbdWRnXbEkc +DncKjvbdSCEFLiYk +EPDLKvbdidkHVPAO +DoCjjvbdkClKqGtg +EPDKjvbduLxXBUAw +DncLKvbdqUTfqqkU +EObjjvbdcImKKevx +DoDLKvbdMgCpMpVL +DnbjjvbdtTRsYydc +DnbkKvbdKefHbBQu +EOcKjvbduoTzpjnt +DoCjjvbdjuwNcaww +DncKjvbdTkvPBVni +EPDLKvbdapGfdLzd +EPDKjvbdvAdZTPEh +EPCkKvbdwXLaVaWV +EOcKjvbdZoNhddyj +DncKjvbdqceIonVa +DnbjjvbdIwsbHkqQ +DoDKjvbdjFKfuPAO +EOcLKvbdbhmJkFvx +DncKjvbdDxYMUUTl +DnbjjvbdMfbpNQVL +DoDLKvbdZeXfzhIb +EOcLKvbdVAbRSpqy +DncLKvbdZxcjOCkr +EOcKjvbdyTNiNSCH +EObkKvbdiLddOUcZ +DoCjjvbddwystRez +DoDKjvbdUsmTelWK +EPDLKvbdEPCjkWcE +DoDKjvbdIwsaglQp +EObkKvbdGcjvJbKK +DoCkKvbdRzJgrbvA +EObkKvbdkxsSSxft +DncLKvbdfHjvSNpg +DnbkKvbdxsNiMqag +DoDLKvbdcImKKevx +EOcLKvbdJutfDdgJ +DoDLKvbdhancEwRR +EObkKvbdnPzYvKyC +DoDKjvbdNHDPlouL +EPCkKvbdKaKgMbXq +EOcLKvbdqUTgSRkU +EPCkKvbdZjSgpHBf +DncLKvbdHffzYxXg +DoCkKvbdFkErbhMu +EObjjvbdhancEwQq +EPDKjvbdJYUCHkpp +EPDKjvbdtkwwBUAw +EOcLKvbdiZuGMRNf +EObkKvbdrJAKElne +DnbjjvbdIHHZxwwg +EPDKjvbdkHgMGGNk +DoCjjvbdeOeSjtUS +DoDLKvbdJbicQjCx +DncKjvbdnGeXlnGy +EPDKjvbdKVtecdfi +EOcKjvbdULuoBVni +DnbkKvbdmJDtRVRa +DncLKvbdJTZAsMxM +EPDKjvbdVgxVxHYz +EPCjjvbdVBCRSqSZ +EPCjjvbdJqZdnfOF +DncKjvbdqdEiQOVa +DnbkKvbdZLqdTnLm +EOcKjvbdzHZMANFX +DncKjvbdVrNxBdkc +DnbjjvbdKkAgvAKZ +DnbjjvbdmbKWxOnV +DoDKjvbdYqMeImEq +EObjjvbdbUagYKtI +DncKjvbdQZNAHSqj +DoDLKvbdfoazvcwh +DnbkKvbdVvhwvDdg +DoDKjvbdURQoUthN +EPDLKvbdvBDyTOeI +DnbjjvbdrRuKmkBN +DnbkKvbdRbDdlIxk +EObjjvbdSCDdkhyL +DoDKjvbdSBceMJYk +DoDLKvbdwyhGGYFS +EPDKjvbdQvmcblID +DoDLKvbdaaWFGQQX +DoDKjvbdEASImZvw +EPDLKvbdnQZyWLYb +EPDKjvbdbrcLUEJa +EOcLKvbdKCicQjDY +EPCjjvbdVBCQsQqy +EPCkKvbdkaNPNALA +DncLKvbdaNKartmH +DoDLKvbdCTAbtFvr +EObjjvbddZxowxpb +EObkKvbdTpqOuUgm +DncLKvbdZQleJNFR +DnbjjvbdUVlPisaR +EObjjvbdBsBCtFvr +EPCjjvbdJutecdgJ +EOcKjvbdfNFvgNKL +DncKjvbddneSjtUS +DoDKjvbdjcMKqGtg +EOcLKvbdGdLWKCKK +EOcKjvbdRDcBPpdS +DoCkKvbdauCGwkTh +EPCjjvbdaNLCStmH +EOcKjvbdelfWgMjL +DoDLKvbdtSrSxyeD +EPCjjvbdemGXGmKL +EOcLKvbduDCuXWOo +DncKjvbdauBfxLUI +DnbjjvbdIHGyyXwg +EPCjjvbdEvYooljF +EObjjvbddneTLUTr +DoCjjvbdySmiNRag +DoDKjvbdqUUHSRjt +EObjjvbdczYpXxpb +EObkKvbdaMkBrtlg +EPDLKvbdnUuZkKRf +DoDKjvbdcScKsdJa +EPCjjvbdsrrTYydc +EObjjvbdZoNiFEyj +EPDLKvbdmttyjirG +EOcLKvbdYqMeIleR +DoDKjvbdKWUfEFGi +EOcLKvbdcyxoxYqC +EObkKvbdNeETiJLE +EPCkKvbdUMWOaVoJ +EPCjjvbdWSOXbElD +EPCkKvbdNHCpNPuL +EObkKvbdEuyQQNJe +DoCkKvbdmgExNOGy +EOcKjvbdZtJJYcsO +EOcLKvbdMpXqVnGs +EObjjvbdbsDLTcjB +EPCjjvbddoFTLUTr +EOcLKvbdaNKbTVNH +DoCjjvbdJcKCpicY +DoDLKvbdsBfMlGjy +EPDKjvbdqiAJdlne +EObkKvbdKefHaaRV +DoDLKvbdbiNJjewY +EPCkKvbdVTltFlWK +DoDLKvbdbBWFGPpX +DncLKvbdVZITzKoO +EPCjjvbdnUtzLKSG +EPCkKvbdBraDTevr +EPDLKvbdTkunaWPJ +EObjjvbdZRNFJNEq +DnbkKvbdxUldqYkn +EPDLKvbdtvOYJpsA +EOcLKvbdJvUfEEgJ +DoDKjvbdlYrqsZGt +DncKjvbdePFSjstS +EPDLKvbdqquLOLAm +DoCkKvbdSPtHKFdX +DoCjjvbdZyDjNcMS +EPDKjvbdTlVnaWPJ +EPCjjvbdZirgpHCG +EObkKvbdNQYQvNfs +DncKjvbdqqtjnLBN +DoDKjvbdjJehJmYS +DncLKvbdrNZixlHi +EPDLKvbdMfcPlpVL +EPCjjvbdUWMQJtBR +DoCkKvbdfMfWfljL +DnbjjvbdaRfDHtFk +DncLKvbdiMFDnVDZ +DoCkKvbdXrkaNToY +DoCjjvbdZLqdUNlN +EObkKvbdRjxetfkT +EOcLKvbdmgFXmOGy +EPDKjvbdUQpntuHm +DoDKjvbdpstHRrKt +DncLKvbdHkazmwRL +EObjjvbdpfEFUWAh +DoDKjvbdZyEJnDMS +EObkKvbdiBoCeXQq +DoCkKvbdeATplxKG +DncLKvbdWRmwadkc +EPDKjvbdUQqPUthN +DoCjjvbdnBjXXnmu +EPDLKvbdZjTIPfbG +EPCkKvbdWHwuxGxz +DncKjvbdYpmFJMdq +DoDKjvbdhbPDFXRR +DnbkKvbdBdQBVimG +DoCjjvbdmIctRUqa +EPDKjvbdZyDjNbkr +EOcLKvbdQYmAHSrK +DnbjjvbdqYoHgQcx +DncKjvbdqiAKFMoF +DncKjvbdOTUWHEuQ +DoCjjvbdVTmTfLuj +DoCkKvbdddoRbWcK +EPDKjvbdIsYaTNYM +EObkKvbdRosfiedX +EOcKjvbdcTDLUEKB +EOcLKvbdmozYujxb +DnbjjvbdZirgogBf +EPCjjvbdKWUeceHJ +DnbjjvbdZoOJEdzK +EPDKjvbdEJhKVwjA +DoCkKvbdfpBzvcxI +DoDKjvbdlrYtysDi +DoDLKvbdZjSgofbG +DoCjjvbdUtMtGMVj +EPCjjvbdGGKRmiTq +EPCkKvbdQvnDcMID +DnbkKvbdKCjCqJbx +EPCkKvbdYpleImEq +DoDLKvbdjKFgjNXr +DoDLKvbdZshhxcrn +EPDLKvbdnVVZjjRf +EOcKjvbdqdFIpNua +DnbjjvbdVwIxVdEg +DoCkKvbduaEZSneI +DnbkKvbdznoqFClY +DoCjjvbdoAKzsgcn +EOcKjvbdSLZGVGkT +DncKjvbdiCObeWqR +EPCjjvbdWRnXbEkc +EObjjvbdRotGiecw +EObkKvbdKDKDQibx +DnbjjvbdlYsRsYft +EOcKjvbdUaBqSprZ +DoCjjvbdhkdcmuDZ +EOcKjvbdjgflFfNk +DoCjjvbdGKdrcINV +EOcLKvbdEJgjVxKA +EObkKvbdSxKkmzkY +DnbjjvbdsZkosBIO +DoCjjvbdBvzchePv +EObkKvbdGYtuBEXb +EPDKjvbdiLeENtby +EPCkKvbdRNXbYnUz +EObjjvbdfHkWRnQg +EObkKvbduDDVXWOo +DoCkKvbdJbjCqJbx +EPDLKvbdpedFTvBI +DncLKvbdjJegjMwr +EPCjjvbdUxgszLPO +EObkKvbdxmrhXsJD +EOcKjvbdJSxaSmXl +EPDLKvbdfNFwGmJk +EPDKjvbdsrrTYydc +DncKjvbdhgKDZVjV +EPCkKvbdZMRctNkm +DoDKjvbdezuyEhtX +EPCkKvbdEXwlUTsl +EPDLKvbdeAUQlxKG +DoDKjvbdZnmiEdyj +EObkKvbdrzMPraIO +EPCjjvbdxxIibPyk +EPCkKvbdKfFgbBRV +DoDKjvbdyzeORhIh +DnbkKvbdbAvFGPpX +DncKjvbdZoOJEdyj +DnbkKvbdrJAJdmOe +DoDKjvbdKVuFdEfi +EOcKjvbdqdFJQNvB +EPDLKvbdOEctIhkE +EPDLKvbdvBEYsOeI +DncKjvbdHELVjBjK +DncLKvbdZshhyDsO +EPDKjvbdGdKuibJj +DoCkKvbdEYXkstUM +DnbjjvbdJpyeOfNe +EPDKjvbdzoPpdbkx +DoCkKvbdMSXMytpz +DncLKvbdqZOggQcx +DoDKjvbdmuUyjirG +DnbkKvbdNVSqkNAX +DncLKvbdRotHJfEX +EOcKjvbdZyEJnCkr +EPDLKvbdyYJKBpZk +DnbkKvbdxmrgxTJD +DnbkKvbdhaoDFWqR +DncKjvbdbhmJjevx +EObjjvbdSKyGVGjs +DnbjjvbdSKxfVHKs +DnbjjvbdqdFIomua +DnbkKvbdkHflGGOL +DoDLKvbdqGDeUVaI +EObjjvbdjmBlZeHP +EPCkKvbdmttykJrG +DncLKvbdRXOEDLgc +DoDLKvbdhaoDFWqR +DoDKjvbdvvkaWAuu +DoCkKvbdbhmKKfWx +EObjjvbdSBdFMJZL +DnbjjvbdnUuZjjSG +EPDLKvbdliDtQuSB +EOcLKvbdsCFmMGjy +DnbjjvbdtunXjQsA +EObkKvbdkCkjqHUg +EObjjvbdDoCkKvbd +DnbkKvbdiZuFlROG +EOcKjvbdRNYCZNtz +EOcLKvbdxUmEpxlO +EPCkKvbddePSBwDK +EOcLKvbdauBfxKsh +DoCjjvbdtkwwBTaX +EObjjvbdmgEwmNfy +DnbjjvbdOStWHEuQ +EPCkKvbdGLFTChNV +EPCkKvbdKDJbpjDY +DoDLKvbdnPzZVjxb +DoCjjvbdFVyPomJe +DncLKvbdACqwizIp +EPCkKvbdZirhQGaf +DncKjvbdtTRsZZeD +EObkKvbdLBLHMbYR +EOcLKvbdrNZjZLgi +EObjjvbdTXkLmzkY +EPCkKvbdBsAbsfXS +EOcKjvbdeATpmXif +DoCkKvbdMSWmZuQz +DncLKvbdVTmTfMVj +DoDLKvbdZxdKODMS +EPDKjvbdZjShPgCG +EPDLKvbdxVMdpxkn +EPDLKvbdcSbjsdKB +EPDLKvbdiifIJlwr +DoDKjvbdKQydoFnF +EObkKvbdegkWRmpg +EObkKvbdiBncFXQq +DoDLKvbdNdctJJLE +EOcKjvbdUyHszKnn +EOcLKvbdSQUHKFcw +EObkKvbdUaBqSprZ +DoCkKvbdSCDeLiZL +EPCkKvbdKDKCpjCx +EPDLKvbdwygfFweS +DoDKjvbdiVZeWqtb +DoCjjvbdMRwMyuQz +DoCjjvbdsCGNLfkZ +DoCkKvbdmRxuZsEJ +EPCkKvbdkDMLRGtg +EObkKvbdGdKuibJj +EPCkKvbdePFTLUTr +EOcKjvbdXrlAlsoY +DoDLKvbdZjTHogBf +DnbjjvbdZirhQGaf +EPCkKvbdFVxooljF +DoCkKvbdbKkeoNcA +DoDKjvbdqYngfqEY +EPDLKvbdrWokcJYq +DoCkKvbdMowqVnHT +EPCkKvbdqqtjnKaN +DoDLKvbdiCPDFWqR +DoDLKvbdeJiqutzn +EObkKvbdqcdiPmvB +EPCjjvbdMgComQUk +DoDLKvbduVnYKQsA +DnbjjvbdjhHLfFmk +EOcKjvbdVvhwvEEg +DnbkKvbdZtIhyESn +DncLKvbdznopeClY +EPCkKvbdwtldqZLn +EOcKjvbdeEnrBwDK +DoCkKvbdkxrqsZHU +DoDKjvbdijGHimYS +DncLKvbdfNGWgMjL +EOcKjvbdmbKWxOnV +EPCkKvbdhtzEvrVC +DoDLKvbdhfibyWJu +DoCkKvbdXrkaMsoY +DoCkKvbdzoPpdbkx +EPDLKvbdSLYeuGjs +EOcLKvbdqlyixlIJ +EObjjvbdnVVZjiqf +EOcLKvbdyNrhXriD +DoCjjvbdRjyFtgLT +EOcLKvbdkyTRryHU +EPCjjvbdrykpTBIO +EObjjvbdlqxtzSdJ +EObjjvbdcarmSATm +EOcKjvbdXsLaNToY +EOcKjvbdlqxtysDi +EOcLKvbdaMkCStmH +DncKjvbdbAvFGPow +EPDLKvbdTulQKTaR +DncKjvbdXGYzUAOs +DncKjvbdezuxeItX +DnbkKvbdrykpTBIO +DoCkKvbdxnShXsIc +DoDLKvbdEPCjkXCd +DnbkKvbdIxUBgkpp +DnbkKvbdBiKbKhfK +DoDKjvbdKNADygVB +EObjjvbdADRxKZiQ +EPCjjvbdMfcQMotk +EObjjvbdSBcdkhxk +EPDKjvbdNrtVgFVQ +EPDKjvbdZMRdTnLm +EObkKvbdehKvRnQg +DoCkKvbdliETptqa +DoDLKvbdEXwktUUM +EObjjvbdBiLBjiFj +EOcLKvbdRkYeuGjs +EOcKjvbdmttzKjRf +EObkKvbdxrmhmRbH +DnbkKvbdyXiJaoyk +EObkKvbdxmrgwsIc +DoDLKvbdiZtfMQmf +DnbkKvbdpxoHfpcx +EObjjvbduaEZTOdh +EObkKvbdqqtkNkAm +DoDKjvbdxmrgxTIc +DncLKvbdMgColpVL +EPCkKvbdZnnJEeZj +EPCjjvbdVYgszKoO +EPCkKvbdBcpAuilf +EObkKvbdlhdUQuSB +EObkKvbdMIbLpxAS +EPCjjvbdnVUyjirG +DoDKjvbdKRZeOenF +DnbjjvbduCbuXWPP +DnbjjvbdssRsYydc +EPCkKvbdlhctQtqa +DoCkKvbdsQVoJcVf +EObjjvbdegkWSNpg +DoDLKvbdOAJTUKSA +DoDLKvbdliEURVSB +DoDKjvbdxsNhlqbH +DnbjjvbdOSsvGdtp +EPDKjvbdaaVeGPow +EObjjvbdNeETiIjd +DnbkKvbdJKEAJpHE +EPCjjvbdANIYsWzY +DoCjjvbdjvWmdCXw +EPDKjvbdrouoJcVf +DnbjjvbdiUzFWquC +DnbjjvbdFxtuBEYC +DnbjjvbdRkYfVHLT +EObjjvbdQwNccMID +DoCjjvbdXsMAmTnx +DoCjjvbdjJfIKMxS +EOcLKvbdbiMikGXY +DoCjjvbdQdDAoqES +EPCkKvbdVwIxVcdg +EOcLKvbdCEQAvKMf +EPDLKvbdzROmJKXA +EPDLKvbdZLrDsnLm +DncKjvbdjggMGFmk +DnbkKvbdddnrBvcK +DnbjjvbdpecdsvBI +EPCkKvbdijFgjNYS +EOcLKvbdUaBqTQqy +DncKjvbdkHgMFfNk +EObkKvbdZGvdAPSi +DnbjjvbdqUTgSRjt +DoDLKvbdqvpLcIyR +DncLKvbdLqvlytpz +DnbkKvbdKDJbpjCx +DoCjjvbdlqyUyrci +DnbkKvbdUQqPUuIN +EObkKvbdTlVnaVni +EOcLKvbdNdcshiLE +EObkKvbdkDMLRHUg +DncKjvbdIxTbILpp +EPCkKvbdePFTKssr +DnbjjvbddeOrCWcK +DnbkKvbdatbGxLTh +EObkKvbdqlzKZLgi +EPCjjvbdOTUVgFUp +EOcLKvbdpfEFTvAh +DncLKvbdZnnIdeZj +EObkKvbdZxdKODLr +DoDKjvbdjggLfGNk +EPCjjvbdRDcAopdS +DncKjvbdlZTRryHU +DncKjvbdZshiYdSn +EPDKjvbdatbHYLTh +EPDKjvbdLAjfmCXq +EPDKjvbdOFEUIiLE +DncKjvbdxVNFQxlO +DoCjjvbdrafNLfkZ +DoCjjvbdGFiqnJTq +EPCkKvbdUsmUFlWK +EObkKvbdLBLHMbXq +EPCkKvbdtlYWaUBX +EPCjjvbdSPsfjGEX +EObjjvbdIjEAJogE +DoDLKvbdNHCpNQUk +DncLKvbdYkqdUNkm +DoCjjvbdqquKmkBN +DnbjjvbdEuyQQMjF +EOcKjvbdURRPUthN +EObjjvbdmoyxvLYb +EObkKvbdGYtuAdYC +DnbjjvbdZeYGzhJC +DoDLKvbdCgLfHAzc +DoDLKvbdhuZeXSUb +DoCkKvbdjlbMZdgP +DoCkKvbdemGWgMjL +EPCkKvbdxxJJaoyk +EPDLKvbdqGEEsuaI +EObkKvbdEKHjVwjA +EOcKjvbdiBoDFWpq +EPCkKvbdffLzNfgA +EObjjvbdDoCjkXDE +EPDKjvbdhficZWJu +DoCjjvbdWWiYVdFH +EPCkKvbdKQzFOenF +DoCkKvbdmbJvxPOV +DnbkKvbdtAHQhAAr +EPDLKvbdmSYtzSci +EPDLKvbddeOqavcK +DoCjjvbdCEQBVjMf +EPDLKvbdlYrqsYft +DnbkKvbdJSyBTNXl +EPCjjvbdcbSmSATm +DoDKjvbdfNFwGmJk +DoCkKvbdGLErbhNV +EObkKvbdiZuFlQnG +DnbjjvbdxUmEpxlO +EPDKjvbdUWMPitBR +EPDKjvbdrafNLfjy +EPDLKvbdrWolDJZR +EObjjvbdhbPDFXQq +DncLKvbdqrUkNjaN +DnbkKvbdBiLCKhej +DoDKjvbdSCEFMIxk +DoDLKvbdffLzNgHA +EPCkKvbdZLqcsmkm +DnbkKvbdZMSEUOMN +DnbjjvbdzaAPHHCM +DnbjjvbdCIkBjhfK +DoCkKvbdZirgpHBf +DnbjjvbdIwtBhLpp +EObkKvbdeOeTLUTr +EObkKvbdUxgszLPO +EObkKvbdhzVGLqOG +DnbjjvbdOTTufdtp +EOcKjvbdZRNEhleR +EPCjjvbdKyRKSzuG +DoCkKvbdZtJJYcsO +EOcLKvbdemGXGmKL +EPDKjvbdJXsahMQp +DoDLKvbdhbObeWqR +EObjjvbdFVxpPljF +EOcKjvbdaNLBruMg +DoCjjvbdpyPIGpcx +EOcLKvbdZMRcsmkm +EOcLKvbdnGeXmNgZ +DoDLKvbdjlalZeGo +DoDLKvbdaSGDHtGL +EPCkKvbdCTAbsewS +EPCjjvbdZjSgofbG +DnbjjvbdJutecdfi +EPCkKvbdIryBSmYM +DoCjjvbdfekzOHHA +DnbkKvbdREDAoqES +EPCjjvbdtTSTYzEc +EPCkKvbdmoyyVkYb +EObkKvbdmfdxMnGy +DoCkKvbdwuNFQxkn +DncKjvbdsBelkfjy +EPDLKvbdQvmdDLhD +EPDKjvbdBhkCLJFj +DoCkKvbdeJiqutzn +EOcLKvbdqTsfrSKt +DoDLKvbdakLfOmcA +DncKjvbdKaLHMawq +EPCkKvbdznopdcMY +DoDKjvbdZtJIyDsO +DoDLKvbdsQVnjCvG +DncKjvbduDDUvuno +DoCkKvbdJYUCHlQp +DnbkKvbdnBiwYPNu +EObjjvbdlYrqryHU +EPCjjvbdqcdiPnWB +DoCjjvbdUQpoUthN +EPDKjvbdsZlQTAhO +EOcKjvbdtbbtwWOo +EPDLKvbdJuuGDdgJ +EOcKjvbdjggMGGOL +EPDLKvbdHffyxwxH +EOcLKvbdSCEElIxk +EObkKvbdIwsbHkqQ +EPDLKvbdjbkjqHUg +DnbjjvbdnQZxujxb +EPDKjvbddePRbWbj +DoCkKvbdhtydwRuC +DoDKjvbdCDoaWKMf +EOcKjvbdRjyGVGjs +EObjjvbddCTNSATm +EOcKjvbdZLrETmlN +EPDKjvbdlrZUysDi +EOcLKvbdwtmFRZMO +EPCjjvbdtTRrxydc +EObjjvbdeFPSBvcK +DoCkKvbdwuNFRZLn +DnbjjvbdhytfLpmf +EPCkKvbdrykpTAgn +EObkKvbdRDcApRDr +DoCjjvbdZnnIeFZj +EOcLKvbdePErkUTr +DoDLKvbdrbGNLgLZ +EObjjvbdVZIUZjoO +DncLKvbdzHYlAMeX +DnbkKvbdbsDLTcia +EPCjjvbdOSsufdtp +DncKjvbdpstHSSLU +DncKjvbduDDVWuoP +EPDKjvbdiMEdNuCy +EOcKjvbdtbcVWuno +DoDKjvbdqUTgRqjt +DncLKvbdZyDjNcLr +DoDLKvbdRWmdDLgc +DncKjvbdZLqdUOMN +DoDKjvbdijGIJlwr +EObjjvbduMYXBUAw +DoCkKvbdHDkWJajK +DoCjjvbdRpTfifEX +DoCjjvbdUyHszKnn +EPDKjvbdqZPIGpdY +EPDKjvbdRWmdCkhD +EObkKvbdsrrSyZdc +EOcKjvbdYlSDtNlN +DncKjvbdbKkennDA +EPCkKvbdiZuGMQmf +EPCkKvbdEztQeLbi +EPCkKvbdaRebgsfL +DoCkKvbdBcpAuilf +EOcKjvbdyNsIYShc +EPCjjvbdcIlijewY +DoCjjvbdmbKXXoOV +DncLKvbduDCtwWPP +EPDKjvbdnCJwXoOV +EPCjjvbdjcLkQgUg +DnbkKvbdtcCtwVno +DncKjvbdGFjRmiUR +DncLKvbdrWpLcJYq +DncLKvbdKWVGDdfi +EPCkKvbdnUuZkJrG +EPCjjvbdiCPCeWqR +DncKjvbdEYYMUUTl +EObjjvbdrpWOicWG +DoDKjvbdFejSOIsq +DnbjjvbdqiAJdmOe +EOcKjvbdUyITzKnn +DoDKjvbdfMfWgMjL +DnbkKvbdXrkaMtOx +DoCkKvbdKefIBaRV +EPCjjvbdyTNhlqbH +EPCjjvbdtlXwBUAw +EOcKjvbdRosfjFdX +DoCjjvbdYpldiMeR +DnbjjvbdwzIFexFS +DncKjvbdSCDeLhyL +DncLKvbdrzLpSaHn +DncKjvbduCcVWuoP +DoDLKvbdatagXkTh +DnbkKvbdsCGMlGkZ +EPCkKvbdkWXNdBww +DncKjvbdJcKCpjCx +EOcKjvbdNxPVzdNt +EPCkKvbdKRZeOfOF +DncLKvbdcIljLGXY +EPDLKvbdVhXuwfxz +DoCjjvbdaoffckzd +EOcKjvbdLhbLpxAS +DnbjjvbdnHExMmgZ +EObjjvbdbhljKfXY +DnbjjvbdkDLkRGuH +EPDLKvbdfHkWSORH +EObjjvbdzoPqFClY +DncKjvbdznopdbkx +EObjjvbdnUtzLKRf +EPCkKvbdZQldiMeR +DoDKjvbdFjeScHmV +EPDKjvbdEOcLKwCd +EPDKjvbdyqOmJKXA +EOcKjvbdSQTfiecw +DoDLKvbdDoDLLXDE +DoDKjvbdhlEcmuDZ +EObjjvbdfHkWRmqH +DnbkKvbdIGfzYwwg +DncLKvbdUWMPjUAq +EPDKjvbdkHflGGOL +DnbkKvbdnPzZVjyC +EPDLKvbdSBceLiYk +DncLKvbdUtMsfLvK +DnbkKvbdbrcLTdJa +EObkKvbdIwtCHkqQ +EPDKjvbdtbcVWvPP +EObkKvbdtbcVWuoP +DoDKjvbdKVtfEFGi +EPCjjvbdMRvlytpz +DoDLKvbdwuMeRYlO +EOcKjvbdlhdTqVRa +EPDKjvbdiGjCyVjV +DnbjjvbdrDeJQNua +DoDKjvbdrbFmMHKy +EOcKjvbdfHjurNpg +DnbkKvbdZRNFJMeR +EOcKjvbdqFdEsvBI +DnbjjvbdZirgogCG +DoDLKvbdDncKjwDE +DoCkKvbdjhGlFfOL +EObjjvbdmaivxOnV +EObkKvbdKkAhWAJy +EOcKjvbdNrtWHEuQ +DnbkKvbdFkFTChMu +EObkKvbdeOdrjstS +EOcKjvbdIwsbHlQp +DoCkKvbdeATpmXif +EOcLKvbdKaKgMaxR +EObkKvbdUGznLvvF +DnbkKvbdbLMGPODA +EObjjvbdTkvOaVoJ +EOcKjvbdsQVoKDVf +EPDKjvbdznopdcLx +DoDLKvbdpfDdsvAh +DncKjvbdrDdhpNua +EOcLKvbdhficZVjV +DncKjvbdFxuVBEYC +EPDKjvbdzjVQQETU +EObkKvbdKRZePGNe +EObjjvbdDncLLXDE +EOcLKvbdYkqctNkm +DoDKjvbdtvOYKRTA +DoCkKvbdmajWxPNu +DncKjvbdIjEAJofd +EPCkKvbdiCPDFWqR +EOcLKvbdIHHZxwwg +EOcKjvbdYpmEiNFR +EOcLKvbdQmYCZNtz +EOcLKvbdVYhTykPO +EPCkKvbdJKEAKPfd +DoCjjvbdRkYfUfjs +EPDLKvbdlZTSTZGt +DoDLKvbdNGbpNQVL +DoCjjvbdvAdZTOdh +EPCjjvbdliDsqUqa +EPDKjvbdSPsfiecw +EOcKjvbdYlRcsmkm +DnbkKvbdwXMAvBVu +EPCkKvbdRjxfVGjs +EOcLKvbdCIkCKiFj +DoCkKvbddxZssrFz +EOcKjvbdREDApRES +EOcLKvbdTpqPVVIN +EObjjvbdaaWEeoow +EOcKjvbddeOrCXCj +EOcLKvbdAMgySvyx +EPDLKvbdNPwqVnHT +EObkKvbdwuMeRYlO +DoCkKvbdTkuoAuoJ +EPDKjvbdmJDspuRa +EPCjjvbdNHCpNQVL +DncKjvbdGcjvKBij +EOcKjvbdbQHHELzd +EPDKjvbdPxmAGrqj +EPCjjvbdRbDdkiYk +EPDLKvbdTAFJHand +DoDKjvbdqmZjZMHi +EObjjvbdtSrTYzFD +DncLKvbdhlEcmtby +EObjjvbdmJEUQuSB +DncKjvbddndsKstS +EPDLKvbdmgFYNOGy +DnbjjvbdSCEElIyL +DncKjvbdmaivxOmu +DoDKjvbdFVyPomKF +DnbkKvbdMpXqWOHT +EObjjvbdKefICBRV +EObjjvbdqGDdtWBI +DnbkKvbdCJLCLIfK +EObkKvbdLqwNZtpz +DoDLKvbdiifHjMwr +DoCkKvbdddoRawDK +DncKjvbdbrcKscjB +DnbjjvbdrSVLNkAm +DnbjjvbdffLynHHA +EObkKvbdTAFJHbPE +DncKjvbdDncKkWcE +EOcLKvbdrouoKDVf +EOcLKvbdZisIPfbG +EOcLKvbdiGicYuiu +DoDLKvbdVgxWXfxz +DoCkKvbdffMZmgHA +EObjjvbdWfZZtAPT +EPDLKvbdEzsqElCi +DoCkKvbdYSlAlsoY +EPDLKvbdFWYpPmKF +DoDKjvbdkNCMZdfo +EPDLKvbdehLWSOQg +DnbjjvbdxxJKCPyk +EOcLKvbdMfcQMpVL +EOcLKvbdnVVZkKRf +EObjjvbdczYoxZQb +EPCkKvbdSQUGiedX +DoDKjvbdeuzwpJzs +DoDLKvbdqZPHfqDx +DoCjjvbdKeehCBQu +DnbkKvbdADSYJyiQ +DoCjjvbdFkFTDHlu +EPDKjvbdZoOJEdzK +EPCjjvbdZjTIQGbG +DncKjvbdZHWdAOri +EPCjjvbdeXystRez +EObkKvbdIxTagkpp +EObjjvbdxZgfFxEr +DoDLKvbdjhHLfGNk +EObkKvbdTfznMWue +DoDLKvbdOSsufeVQ +DncKjvbdVUNTelWK +EPCjjvbdZQmFImEq +DnbjjvbdkClLQftg +DnbjjvbdRXNdDLhD +DncKjvbdTqQoVUgm +EPCjjvbdNQYRVmgT +DoDLKvbdnUuZjiqf +DoDKjvbdbsCjsdJa +EOcKjvbdFkEsDINV +DoDKjvbdyOTHxSiD +EOcKjvbdkMbMZdgP +DnbkKvbdeEnqavcK +DoCkKvbdxZhFfYEr +DncKjvbdNPxQunGs +EOcLKvbdOYOuzdNt +DncKjvbdJbicRKDY +DncKjvbdjAQHAofj +EOcKjvbdWWiYVcdg +DnbjjvbdjFKftoAO +EPCkKvbdTXkLmzjx +EPCkKvbdWSNxBeMD +DoCkKvbduMXwBTaX +DoDLKvbdLBKfmBxR +DoCjjvbdEObjjwDE +EPDKjvbdTlVnaVoJ +DoDLKvbdhgJcZViu +EObjjvbdatbHXjtI +EOcLKvbdZeXfzgiC +EPCkKvbdeFPRbXCj +EPCkKvbdZQleJMdq +DnbjjvbdUWLojUAq +EPCjjvbdFaOpyJzm +DnbkKvbdANIYrwZx +EPCkKvbdbBWEeopX +DoDLKvbdczYpYYpb +EPCkKvbdbVBfxLTh +DoDKjvbdLBKflawq +DoCkKvbdyOSgxSiD +EPDKjvbdkDLkQgVH +EObkKvbdjmBlZdfo +EPDKjvbduoTzqLOt +EOcLKvbdaRebhUFk +EPDKjvbdatbGwjtI +EOcLKvbdCIjbLIfK +DncKjvbdkIGkeemk +DncKjvbdxVMeRZMO +EOcKjvbdRXODcMHc +DnbjjvbdqquLOLAm +DoDKjvbdDHLfHAzc +DoCkKvbdnVVZkKRf +DoDLKvbdGcjvJbKK +DoCjjvbdzoQRFDLx +DoDLKvbdmuUzLKRf +EPDLKvbdtumwiqTA +EOcKjvbdmJDsptrB +EPCjjvbdIGgZxwwg +EPDLKvbdxLXDgzzG +DnbkKvbdQwNdCkhD +DnbjjvbdcasNSAUN +EPCkKvbdTulQKTaR +EOcKjvbdhgJbyVjV +DoDLKvbdKVteceHJ +DnbjjvbdHgGzYwxH +EPCjjvbdxnSgxTJD +EPDKjvbdyYJKCPzL +EOcKjvbdOFDtJJKd +EObkKvbdRadEkhxk +DoCkKvbdiifHjNXr +DoCjjvbdnUtyjirG +EObkKvbdJpydoGNe +DoDKjvbdZLqctOLm +DnbkKvbdsBfMkfkZ +EOcLKvbdOStWGeVQ +EPDLKvbdijGIJmYS +DoDLKvbdxxJJbQZk +DncKjvbdHbLydzAD +EOcLKvbdyTNiMqag +EPDKjvbdMgComQVL +DoDLKvbdzitoocsU +EPDKjvbdsBfMkfjy +DoCkKvbdFyUtaEYC +DoDLKvbdJKEAJpGd +DoCkKvbdygZMAMeX +EPCkKvbdJqZdoFnF +DnbkKvbdiBnbdvqR +EOcLKvbdSQUGjFdX +DnbkKvbdmSYtzTEJ +DoCjjvbdehKvSOQg +EOcLKvbdGckVibJj +DncKjvbdhficYvJu +EPDKjvbdwuMeRYkn +EOcLKvbdFejSNiUR +EPCjjvbdOFEUJJLE +DnbkKvbdXsLaMtOx +EPDKjvbddZyPxYpb +EPCkKvbdhzVFkqNf +DoDKjvbdOEdUIiLE +EPCkKvbdnGeXmOHZ +EObkKvbdiMEdNuCy +DoDLKvbddoFTLTtS +EObkKvbdIxTbHlQp +DncLKvbdZRMdhmEq +DoDLKvbdZnmheEyj +EPDKjvbdKeegbApu +DncLKvbdNVTSLNAX +EOcKjvbdKDJbqKCx +EPCjjvbdFfKSOIsq +EPCjjvbdxnShYSiD +EOcLKvbdOStWHFVQ +DncLKvbdsPvOicWG +DnbjjvbdxnTHwsJD +DoDKjvbdLAkGmBwq +DoCkKvbdwMvAMceN +EOcLKvbdmRyVZsDi +EPCkKvbdmpZyWKyC +DoDLKvbdrykpTBIO +DoCjjvbdVgwvYHYz +EPDLKvbdTvMPjUBR +EOcLKvbdgFkzOGgA +DnbkKvbdVBBpsRRy +DnbjjvbdRzKISbvA +EObjjvbdxnTIXsJD +EObjjvbdZoOJEdyj +EPCjjvbdHDjuibKK +EPCjjvbdezuxdiUX +EOcKjvbdYTMAmToY +EObjjvbdJYTbILpp +DoDKjvbdkClLRHUg +EPDKjvbdTkvPAvPJ +EObkKvbdeAURNXjG +DncLKvbdTukpKUBR +DoCjjvbdcTDKsdJa +DoDKjvbdBsAcUGXS +EObjjvbdDoCjjvcE +EOcKjvbdtlYWaTaX +DnbjjvbdRDbaPpcr +EPCjjvbdrylPsAgn +DoCkKvbdOhAYZAYa +DnbjjvbdiUydwSVC +DoCjjvbdwzIFfYFS +DoCkKvbdZshiZDrn +DoCkKvbdZoOIddyj +DncKjvbdpssgSSKt +EPCjjvbdrSUkNkBN +EPDKjvbdjJfIJlxS +EOcLKvbdxVNFRYkn +DoDKjvbdWWhwvEFH +DncLKvbdRDcBQQcr +DnbkKvbdliETpuRa +EPCjjvbdZRMdiMeR +DnbkKvbdiMEdOVCy +EPCjjvbdznpREbkx +DoCkKvbdwzIFexFS +DnbjjvbdmSYuZrdJ +DoDLKvbdCWzchdov +EPDLKvbdpfEFTvAh +EPDLKvbdyOTIYTIc +DncKjvbdNQXqVnHT +DoDLKvbdCgMFgAzc +EOcKjvbdIwtBgkpp +EPDKjvbdRjyGUfjs +EObjjvbdACqwjZiQ +DoDKjvbdpstGrSKt +DnbkKvbdnGdwmOHZ +DncKjvbdiZtfLpnG +DoDLKvbdaSGCgtFk +DoCkKvbdFfJqnIsq +EPCkKvbdkNCLzEgP +EOcKjvbdFeirOJTq +EOcLKvbdUtNUGMWK +EObkKvbdSQUHJfEX +EPCkKvbdqquKmkBN +DnbjjvbdbhmKKfXY +DoCkKvbdIsYaTNXl +DoCjjvbdZoNheFZj +EOcLKvbdBhjbLIfK +EOcKjvbdatafwjsh +DoCjjvbdkxrrSyHU +EPDLKvbdSCEElIxk +EOcKjvbdfMevfmKL +EPCjjvbdMJBlRYAS +DoCjjvbdSxKkmzkY +DnbkKvbdkNCLydgP +EObkKvbdkxsSTZHU +DoCjjvbdRpUGiedX +EOcKjvbdjblLRGuH +EObkKvbdyTNiMrCH +DnbjjvbdZeXfzhJC +DoDKjvbdZxdJmblS +DncKjvbdOStWHEuQ +DoCkKvbdyNsHwsIc +EPDKjvbdkxrqryHU +EObjjvbdZLqctNlN +DoDLKvbdxnSgxShc +EPDLKvbdnBjWwoNu +DoDKjvbdkIHMGGOL +EObjjvbdqUUGrRkU +DncLKvbdRjyGVHKs +EPDKjvbdhfjCyWJu +EPCkKvbdHELVjBjK +DncKjvbdgQBzvcwh +DoDLKvbdVAaqSpqy +DoCkKvbdySnJNSBg +DoDLKvbdpeceUWAh +DncLKvbdaRebgsfL +EOcKjvbdZLqctNlN +EObjjvbdtbbtvvPP +DoCkKvbdZMSDtNlN +EOcKjvbdsBelkfjy +EPDLKvbdTpqPVVIN +DnbjjvbdBiKbKhfK +DnbjjvbdOFEUIiKd +EPCkKvbdSiZjRAAl +EObkKvbdwjwDgzyf +EPCjjvbdhlEdNtby +EPCjjvbdhtydwSUb +EOcKjvbdnQZyVjyC +DoDKjvbdRzKIScWA +EOcLKvbdLBLHNCXq +DoDLKvbdssSTYzFD +EObjjvbdEvYpPlie +DncLKvbdhficYvKV +EPCjjvbdnUuZkJqf +DnbjjvbdXnRAXtut +EPDKjvbddijRutzn +EOcLKvbdEvYpPljF +DoCjjvbdTulQKUAq +EObkKvbdxmsIYShc +EPDLKvbdkyTRryHU +EObjjvbdCEQAvKNG +EObjjvbdGYuVBEYC +EPDKjvbdvAdYsOeI +EObjjvbdRpUHKGEX +EPCkKvbdKDJcQjDY +DoDLKvbdunszqKoU +DoCjjvbdJvUfEEfi +DncLKvbdrpWPJcWG +DoCkKvbdajkfPNcA +DnbjjvbdFpATXHFy +EObkKvbdFfJrOJTq +DncLKvbdZnnJFEyj +DoCjjvbdOEctIiKd +EPDLKvbdVhXuxGxz +EPDKjvbdySmhlrCH +EOcKjvbdiGjDZWJu +DncKjvbddZyQYZRC +DncLKvbdziuPpETU +DncLKvbdJTYaTNXl +EPCjjvbdNddThiKd +DnbkKvbdbAudepPw +EOcKjvbdMowpunHT +DoDLKvbdmbKXYPNu +DoDLKvbdezvZEiTw +DnbjjvbdrMyixkgi +DnbkKvbdKWVGEFGi +DoCjjvbdkDLjpftg +DnbjjvbdJqZePFme +EObkKvbdDwxLsssl +EPCjjvbdmoyyWLYb +EPCkKvbdFjdrcHmV +DoCkKvbdDwxLtTsl +EOcLKvbdoAKztHdO +EPDLKvbdTkuoAuoJ +DncLKvbdURRPVVHm +EPCkKvbdKCicRJcY +DoCkKvbduDCuXWOo +DoCjjvbdRXNdDMID +DoDKjvbdBcpBWJlf +DoCjjvbdTqROttgm +DncKjvbdRadFMIxk +DoDLKvbdCSaDTewS +EOcKjvbdQlxCYmtz +DncLKvbdeOeSkUTr +DnbkKvbdTqQntthN +DnbjjvbdhbObdvpq +EPDLKvbdMowqVmgT +DncKjvbdANIZTWzY +EPDLKvbdiVZeXRtb +DncLKvbdYNqAXtvU +EOcKjvbdfIKurNpg +DoCkKvbdFpATWfey +EPCjjvbdHkazmwRL +DoDKjvbdJvUfDdgJ +EPCkKvbdSBdElIxk +DoCkKvbdbsCjtEJa +DoDLKvbdvBEYsOdh +EOcLKvbdGGJqmhsq +EOcLKvbdJSyBSlxM +DncLKvbdnQZxukZC +EOcLKvbdySnIlrCH +DoCjjvbdIjEAKPgE +DoDLKvbdhlEcnVDZ +EPDKjvbdZeYGzghb +EPDKjvbdbKlGOnDA +EPDKjvbdkMbMZdgP +EOcLKvbdDoCkKwCd +DnbjjvbdLBLGlbXq +EPDLKvbdZxcinCkr +DoCkKvbdqTsfrRjt +DoCkKvbdADSYJzIp +DoDKjvbdbUagYKsh +EObjjvbdjAQHAofj +EOcKjvbdDoDKkXDE +EPDKjvbdSZigsCvA +EPCkKvbdKRZePGOF +EPCjjvbdKaKgNCXq +EObkKvbdxxJKBoyk +EOcKjvbdxmrgwsIc +DnbkKvbdmozYvKyC +DoCkKvbdqquLOLAm +EObkKvbdDncLLXCd +EPDLKvbdjcMKpftg +EPCjjvbdwkXDgzzG +DoDLKvbdHffyxwwg +DoCkKvbdvAdZSneI +EOcLKvbdrovOjDVf +EOcLKvbdsPuoJbuf +DoDLKvbdySnJNSBg +EObkKvbdXsMAltOx +DncLKvbdFfKSOJTq +EPCkKvbdddnrCWcK +DoCjjvbdySmhlrBg +DnbjjvbdNxPVzcnU +DncKjvbdhtzEvrVC +DoCjjvbdQwODblHc +DoDLKvbdjcLjpgVH +EOcLKvbdbKlGOmcA +EPDKjvbdfMfWflik +DncKjvbdmbJwXnmu +EOcLKvbdTkuoAvOi +DnbjjvbdsZkoraIO +DoDKjvbdZMSEUOLm +EOcLKvbdsCFmLfkZ +DncKjvbdUxhTyjnn +EPDKjvbdRosfjGEX +EOcLKvbdmuUzKirG +EPCkKvbdGGJrOItR +EObjjvbdEXwktUUM +DnbkKvbdiifHimXr +EPDKjvbdmJDspuSB +EObjjvbdwyhGFwdr +DncKjvbdatafwkUI +EPDLKvbdYNqAXtut +DoDLKvbdEPCkLWcE +EOcLKvbdqceJQOWB +EPDKjvbdySnJNSBg +DnbjjvbdyzdnSIIh +DoDKjvbdrDdiQNvB +DoCkKvbdYkqdTnLm +DoCkKvbdlZTSTYgU +EPDKjvbdMpXqWNfs +EObkKvbdJbicQjDY +DoDLKvbdGAoRYizm +DncKjvbdmgExNOHZ +DoCjjvbdznoqFDLx +EOcKjvbdieLGtoAO +DoCjjvbdMfbpMotk +EObkKvbdyzdnSHiI +EObkKvbdcSbjscia +DoDKjvbdNGcQNQUk +EPDKjvbdNGbpMpVL +DoDLKvbdUQqPVUgm +DnbjjvbdVvhwuceH +EPDKjvbdDxXkstTl +EPCjjvbdPyNAHTRj +EPDLKvbdeOdsLTtS +DoDKjvbdTAEiICPE +DoDKjvbdZisIQGaf +EObkKvbdxVMdpxkn +EPCkKvbdnUtzKjRf +EOcKjvbdhtydvrVC +DoDKjvbdbrcLTcia +EPDLKvbdbhlikFvx +EPDKjvbdANIZSwZx +EPDKjvbdtbbuXWOo +EObjjvbdliDtQtqa +DncLKvbdGLFScIMu +DnbkKvbdfMfXGljL +EObkKvbdCTBDTewS +EPDKjvbdSiZiqAAl +EOcKjvbdFfKSNhsq +EPCjjvbdyYJKBpZk +DncKjvbdAMgyTWyx +DnbkKvbdpaJFAXIE +EOcKjvbdEYYMUUTl +EPCjjvbdeFOrBvcK +DoDLKvbdptUHSRkU +DoCkKvbdOYPVzcnU +DnbjjvbdijFhKMxS +DnbkKvbdEKHivXjA +DncLKvbdsPvOicVf +DoCjjvbdmbJvxOmu +EOcKjvbdDxYMUUTl +DoDKjvbdZtIhxdTO +DncKjvbdTlVoAuoJ +DoDKjvbdFyUuBDwb +EObkKvbdQYmAGsSK +DnbkKvbduLwwAsaX +EPDKjvbdegkWRmpg +EPDLKvbdRDcAoqDr +DoCjjvbdFWZPolie +DoCkKvbdbhmJkGWx +DncLKvbdrWpMDJYq +DnbjjvbdaaWEeoow +DoDLKvbdzHYlANFX +DoCkKvbdjFLHUoAO +DnbjjvbdZyEKNbkr +DoDKjvbdLrXMyuQz +EPDLKvbdwNWAMdFN +DoCkKvbdkWXODaxX +EOcKjvbdraelkgKy +EOcLKvbdmSZVZsDi +EPCjjvbdkMbLzEfo +EObjjvbdaSFbgtFk +EObkKvbdmIctRUqa +DncKjvbdhtydvquC +EPDKjvbdZoOJEeZj +DoDLKvbdyXiJaozL +EOcLKvbdVwIxWEFH +DnbkKvbdYpmFJMdq +EPDLKvbdjKGIKMwr +EPCkKvbdFpASwHGZ +DncKjvbdKQzEnfNe +DoDLKvbdkVwODaxX +EPCjjvbdzaAOffal +EObjjvbdnHEwlnGy +DncLKvbdLqwMyuQz +EPCkKvbdWRnXaeMD +DoCkKvbdcbSlrAUN +EPDKjvbdMJBlRYAS +EOcLKvbdZxcimbkr +DncLKvbdCDpBVimG +DoDKjvbdGdKvKBjK +EPDLKvbdziuPodSt +DnbkKvbdbrbjtEKB +EOcLKvbdmIcsptqa +EPDKjvbdMRwMyuQz +DoDLKvbdfHkVrNqH +DnbkKvbdLZRKSzuG +EPDKjvbdTfzmkwWF +EOcLKvbdSKxeuHLT +EPDLKvbdkHgLfGNk +DoDLKvbdVhXuxHYz +EOcKjvbdkHgMGGOL +DoDKjvbdEARhmZvw +EPDLKvbdjKFgimXr +EObkKvbdSQUGiecw +EPCjjvbdjKFhJlxS +DoDKjvbdDxXlTtUM +EPDLKvbdelfWgMik +EOcKjvbdtcDVXWOo +DoDKjvbdiZuFlRNf +DoCkKvbdsBellHKy +EPCkKvbdjlbLyeGo +EOcKjvbdhfibxujV +EObjjvbdhyuGMROG +DoDLKvbdgQBzvdYI +DoDKjvbdeATpmXjG +EPDLKvbdjKFgilxS +DoDKjvbdrpWPJbuf +DncLKvbdDncLKvcE +DoCkKvbdkVvmdCXw +DncLKvbdGcjujCJj +DncLKvbdpxngfpcx +DnbjjvbdiCPCdwQq +EPDLKvbdijFhJlwr +DncKjvbdhgJbxvKV +EPCjjvbdZxcjNbkr +DncKjvbdZQleJMdq +DncLKvbdyfxlAMeX +EPCjjvbdFfJrNiUR +EPDLKvbdzjVQPdSt +DoDLKvbdjAQHBPfj +EObjjvbdZoOJFEzK +EObkKvbdFpATWgGZ +EPDKjvbdvAcxrneI +DoDLKvbdxrnJMrCH +DoCkKvbdjmCLydfo +EPCkKvbdegjuqmqH +DoCkKvbdSBdFLiZL +EObkKvbdbAvFFopX +DncLKvbdGQASwGey +DnbkKvbdQccAopdS +EPCkKvbdZshiYdSn +EPCjjvbdHDjujCKK +EObjjvbduDDVWuno +DoCjjvbdzjVQQDsU +EOcLKvbdeFOqavcK +DoDLKvbdyXhibPzL +DoDLKvbdrzMPsAgn +EObkKvbdUtNTfMWK +EOcLKvbdLqwNZuQz +EPDKjvbdqBJFAXHd +DoCkKvbdnUuZkKSG +DoCjjvbdZHXEAOsJ +DncKjvbdQdDBPpcr +DnbkKvbdCIkBkIej +DnbkKvbdMgDPmQUk +DnbkKvbdxxIjCPyk +DnbjjvbdZsiIxdSn +DoCkKvbdADRxJzJQ +EObjjvbdkxsSTZHU +DncKjvbdWXIxVdEg +DnbjjvbdLrWmZtpz +EPDKjvbdhzUelQnG +DoDLKvbdSBceLhxk +EObjjvbdWIXvYGxz +EPDKjvbdEYXktUUM +EObkKvbdhlFENtby +EPDLKvbdNwnuzcmt +EOcKjvbdaaWEfPpX +DncLKvbdddoSCWcK +EPDKjvbdmaiwXnnV +DoDLKvbdMgDQMpUk +DoDLKvbdjFKfuPAO +DncLKvbdnGeYMmfy +DncLKvbdrSUjmkAm +EOcLKvbdfHkWRnQg +DnbjjvbdnCKWxPNu +DnbjjvbdraemLgKy +EObkKvbdWWiYWDdg +DoCkKvbdKfFgaaQu +EPCkKvbdaSFcIUGL +EOcKjvbdkxrqryHU +DncKjvbdRDbaQQcr +DncLKvbdbVBgXjtI +DoCjjvbdqZPHfqDx +DnbkKvbdcyxowxpb +EPCkKvbdWXIxWDeH +DoCkKvbdyXiKBozL +DnbkKvbdlZSrTYft +EObjjvbdGdKujBij +DnbjjvbdtcDVXWPP +DoDKjvbdZnmhddyj +EObkKvbdTukoisaR +EObkKvbdzoPqFCkx +DncLKvbdLhalQxAS +EPCkKvbdVwIwudFH +DoDKjvbdjKGIKNYS +DoDLKvbdjhHLeenL +EPDKjvbdJTZBSlxM +DoCjjvbdFaOqZJzm +DoDLKvbdnBjXXnnV +DoCjjvbdeFPSCXDK +EPCjjvbdbAvFGPow +DnbkKvbdVwIwvEFH +EObjjvbdqUTfrSLU +DncKjvbdqlyixkhJ +DoDKjvbdSLZFuGjs +DncLKvbdsCGNLfkZ +EPDLKvbdaofgDkzd +DoCkKvbddiirWUzn +EOcKjvbduCcVWuno +DnbkKvbdSPsfjGDw +DoCkKvbdFWYpQMie +DoDLKvbdRECaQRES +EPDLKvbdhfibyVjV +DnbjjvbdqTsgSSLU +EObkKvbdrXQMChyR +DncLKvbdNrtVfduQ +EObjjvbdiUzEvqtb +DncKjvbdUaCQsRRy +EPCjjvbdRbEEkiYk +DncKjvbdUtNUGMVj +EPCjjvbdzHYlAMeX +EPCkKvbdeEoRbXCj +DoDLKvbdcScLUDia +DoDLKvbdtbbuWuno +EOcKjvbdbUafwkTh +DoCjjvbdtcDVXWOo +EOcKjvbdHgGyxxYH +EOcLKvbdWSOXbEkc +DoCkKvbdKeehCBRV +DncLKvbdMgComQVL +DoDKjvbdUMVoBVoJ +DoCjjvbdzoQRFCkx +DoCkKvbdUWMQJsaR +DnbjjvbdkNCLydgP +EOcKjvbdmozYvKyC +DnbkKvbdmgExMnGy +DncKjvbdznpQeDMY +DoDKjvbdZxcjNbkr +EOcKjvbdqdEiQNua +EPDLKvbdfHkVrNpg +DnbkKvbdXsMBMsoY +EObkKvbdcJNKLGXY +EPDLKvbdVqmwbEkc +EPCkKvbdJcJbpibx +EObjjvbdYNqAXtvU +EObkKvbdjAQHApGj +EPDKjvbdrbFmMHLZ +DnbkKvbdPIAXyAYa +DoDKjvbdSLZGVHLT +DoCkKvbdDnbkLWcE +DncKjvbdzoPpeDMY +EPDKjvbdQwNdDLhD +EPDKjvbdhfjCxuiu +DoCjjvbdajkenmcA +EPDKjvbdtTSTYyeD +DoCjjvbdijFhKMwr +DoDLKvbdpfDeTuaI +EPCjjvbdJXtCHlQp +EOcKjvbdjbkkRGuH +EObkKvbdVTlselWK +DoCkKvbdauCHXkTh +DnbjjvbdSLZGVGjs +DoDLKvbdehLWRmqH +DncKjvbdSBdFLhyL +DoDLKvbdmajXYPOV +EOcKjvbdpeceTvAh +EPCjjvbdNdctIhkE +EOcLKvbduWNwjQsA +DoCjjvbdtvOYKRTA +DncKjvbdqiAJeNOe +DnbjjvbdUtNUGLvK +EPDKjvbdMgColotk +EOcKjvbdQlxCZNtz +DoDKjvbdmfdwmNfy +EPDKjvbdrovPKDVf +DnbjjvbdDjIJuwjA +EPCjjvbdsBfNMHLZ +DoCjjvbdJbjDRJcY +EPDLKvbdZRMeJNEq +EPCkKvbdRkYfVGkT +DncLKvbdRbDeLiYk +EPCjjvbdqiAJdloF +DoCjjvbdFyVUaDwb +DoCjjvbdMRvmZtpz +DoDLKvbdGQATWffZ +EPCjjvbdwtmFQyMO +EOcKjvbdTIzKRAAl +DoCkKvbdsQVnicVf +DoDLKvbdFfKRmhtR +EOcKjvbdsCFmLfjy +DoDKjvbdddnqbXDK +DoDKjvbdYgWdAOri +DoCkKvbdmuUyjjSG +EObkKvbdhficYvJu +DoCkKvbdQlxCZNtz +EPCkKvbdGZVUaEXb +DncLKvbdEXxMTtTl +DoDKjvbdGFirNiUR +EPCjjvbdpssgRrLU +EObkKvbdVZHsykOn +DncKjvbdyTOJMrBg +EOcKjvbdRacdlIyL +EObkKvbdiCOcFWqR +DoDLKvbdRjxfVGkT +EOcLKvbdiBncFXQq +DncLKvbdnQZxukYb +DoDKjvbdpaIeAWgd +DncKjvbdVqnYCEkc +DnbjjvbdZRMdhmEq +EPCjjvbdhgKDYuiu +EOcLKvbdCIkBjhfK +EPCkKvbdZnmhdeZj +EOcKjvbdTppnuUhN +EOcLKvbdbVBfxKsh +EPDKjvbdFVxpQNKF +DnbjjvbdjvWnDaxX +EObjjvbdANIYrwZx +EObjjvbdauCHXjtI +EObkKvbdZirgpGaf +EObjjvbduoTzqLPU +DoDLKvbdxZhFeweS +DoCjjvbdILaznWqL +DncLKvbdaMkBrtlg +EObjjvbdNrtVgFUp +DnbkKvbdRzKHsCvA +DoCkKvbdiZuFkpnG +DnbkKvbdEztRElDJ +EPCjjvbdRECaQQdS +EPCjjvbdqqtkNkAm +EObkKvbdyNrhXriD +DoDLKvbdegkWRmqH +DncKjvbdNQXqWNfs +DoDLKvbdRadFLhxk +EPDKjvbdxUmFQyLn +EPCjjvbdxxJKBoyk +EObkKvbdnVUzLJqf +DnbjjvbdSQUGiedX +DncLKvbdrpVnjCvG +DoDKjvbdZirgpGbG +DncKjvbdOAJTUJrA +DnbjjvbdUyHsyjoO +EPDKjvbdfpBzvdXh +EPCjjvbdyTNhlqag +DncKjvbdLBKflaxR +DoCjjvbdVwJXvEEg +EOcKjvbdVqnXadlD +DoDKjvbdyNrgxSiD +EObjjvbdnVVZjjRf +DnbjjvbdFeiqmiTq +EObkKvbdFVxpQMie +DnbkKvbdIBkydzAD +EPCkKvbdZjTHofaf +DncLKvbdnPzYukZC +EObkKvbdLYqKSzuG +Dnbjjvbdxmrgwrhc +EObkKvbdTkuoBWOi +EObkKvbdIrxaSlxM +EOcLKvbdJqZeOfOF +DoCjjvbdBhjbKiFj +EPCkKvbdrDeJPnVa +EPCkKvbdNwoVzcnU +EOcLKvbdXmqAYVWU +EPCkKvbdZeYGzhJC +EOcKjvbdNddUIhjd +DoDKjvbdjggLeemk +EObkKvbdxZgefXeS +EOcKjvbdgFkzOGgA +EObkKvbdNdcsiIkE +EPDKjvbdbiMikFwY +EPDKjvbdelfWfmJk +EOcKjvbdHELWJajK +DoDLKvbdZRMeIldq +EOcLKvbdRXNccMHc +EPCkKvbdQlxCZNtz +DoCkKvbdyTOJMqag +EPDLKvbdCTAcTevr +EOcKjvbdrpVnicWG +DnbkKvbdZLrETmkm +EOcLKvbdRpTfifEX +DnbjjvbdQcbaPqDr +DoCkKvbdEuxpQNKF +EPCjjvbdNeEThiKd +EPDKjvbdVYgtZjoO +DoCjjvbdZRMdhleR +DoCjjvbdZsiIyDrn +EPDLKvbdaSGCgtGL +EPDLKvbdqTtGqrKt +DoCkKvbdnVUzKjSG +EPCjjvbdzQoMiJwA +EPDKjvbdXrlBMtOx +DoCjjvbdNHColpVL +EObkKvbdXnRAXuVt +EObjjvbdMJCMQxAS +EObkKvbdIrxaTMxM +DnbjjvbdbAudfQQX +DnbkKvbdnCKXYOmu +DoDKjvbdEXxMUUTl +EObkKvbdyXhiaozL +EObjjvbdEJhKVwjA +EOcKjvbdpfEFTuaI +EOcKjvbdbVCHYLTh +DncLKvbdyqOliJwA +EOcKjvbdkxrqsZHU +DncKjvbdDjHjVwjA +EPCkKvbdkDMLQfuH +EPCjjvbdUVlPjUBR +DoDLKvbdjJfHimXr +DoCkKvbdEuxooljF +DoDLKvbdYzcGRjWZ +DoDKjvbdwyhGGYFS +DnbkKvbdsrrSxyeD +EPCkKvbdxmrhXrhc +EPDKjvbdDjHivXjA +EObkKvbdfMfXGlik +EPDLKvbdGdKvKBij +DoCkKvbdbLMGOmcA +EPCkKvbdRXNdDLgc +EPCjjvbdZsiIxcrn +DoDKjvbdpyPIGqEY +EPDKjvbdlZTRryHU +DoDKjvbdUslsekvK +DncKjvbdKfFhCBQu +DncLKvbdSCDeMIyL +EPDKjvbdJcJcRJcY +DoDLKvbdraellHLZ +EPCjjvbduDCtwWPP +DnbkKvbdBdPaWJlf +EPCkKvbdqFceUVaI +DnbkKvbdcyxoxYqC +DnbkKvbdlYsSTYft +EObjjvbdZHXEAOsJ +EObjjvbdURROtuHm +EPCjjvbdZLrDsnMN +EPCjjvbdfIKvRmpg +EPDLKvbdwWlBVaVu +EObkKvbdZMSDsmkm +EPDKjvbdKNAEZfuB +DnbjjvbdhyuGMROG +EObjjvbdJuuGDdgJ +EPDLKvbdgQBzwDxI +EObjjvbdjvXNdCXw +EPCjjvbdlZSrSyGt +DoDKjvbdXsLaMsnx +DoDLKvbdTlVoAuoJ +DnbkKvbdptUGrSLU +EObkKvbdEztRFMCi +EOcLKvbdTkvOaVoJ +EObkKvbdDoCjjwCd +EPCkKvbdTfznLwVe +EObkKvbdRjyGUfjs +EPDKjvbdVviXvEFH +DnbjjvbdKkBIWAKZ +EOcLKvbdqFdFUVaI +EOcLKvbdBhjakJFj +DncKjvbdauBgYKsh +DnbjjvbdxKvdHzyf +DoCjjvbdxVMdqYlO +EPCjjvbdEPDLLXDE +EPDLKvbdVvhwucdg +DncKjvbdaRfDITfL +EPDKjvbdfpBzvcxI +DoCkKvbdGLFTDHmV +DoDLKvbdcTDKtDjB +DnbkKvbdZRMeIldq +EObjjvbdRjyGVGkT +EPCjjvbdlhctRVRa +DnbjjvbdyXhibPzL +DnbjjvbdFpASvgFy +DnbjjvbdKCicRJcY +DnbkKvbdPxmAGrrK +EPCjjvbdpstHSSKt +EObkKvbdiZtelQnG +DoDLKvbdKkAgvAJy +EObjjvbdsPvPKCuf +EOcLKvbdhyuGLqOG +EPDLKvbdyOSgxShc +EObkKvbdmJDsptqa +EPCjjvbdbVCHYKtI +DoCkKvbdCJLBkIfK +EPDKjvbdTqQnuUgm +EOcLKvbdypnmIjXA +DoDLKvbdiLddOUby +DoCkKvbdaSFbgtGL +EPDLKvbdraellGjy +EObkKvbdWRmwbEkc +EPCjjvbdDoDLKvcE +DnbjjvbdjEjfuPAO +DnbjjvbdqvokbiYq +DnbkKvbdVZITzLOn +EPDKjvbdUWLpJtAq +EObkKvbdwtmFQyMO +DoDLKvbdFWZQPmKF +EPDKjvbdLBKgMawq +DncLKvbdANIYsWyx +EObkKvbdqvolDJYq +EOcKjvbdQlwbZOUz +EPCkKvbdlqyUzTEJ +EPCkKvbdSLYfUgKs +DoCjjvbdRotHJfEX +EOcKjvbdrXQMCiZR +DncLKvbdaofgELzd +DoDKjvbdehKvSNqH +EPCkKvbdzaAOfgBl +DoCkKvbdVUMsfMVj +DoDLKvbdUGznLwVe +EPDLKvbdDoDKjwDE +DoCjjvbdANHxsXZx +EPCkKvbdJpydnenF +EPCjjvbdtTRsZZeD +DoDLKvbdnQZyWLZC +EPCkKvbdKNADyfta +EPCkKvbdUVlPjTaR +DncLKvbdeOeSjstS +DncKjvbdXrlAmUOx +DoCkKvbdxnTIXrhc +EPDLKvbdZjTIQGaf +DoCjjvbdPxmAGrrK +EPDKjvbdLZQirztf +DoDLKvbdkHflGFnL +DoCjjvbdiMFEOUby +DnbjjvbdhaoDFXQq +EPCkKvbdyzeNqhIh +EPDKjvbdbUbGwkUI +DoCkKvbdEXxLsstM +DoDLKvbdaRebhUGL +EObjjvbdMfbpNQUk +DoDLKvbdCEQAuilf +EObjjvbdMowpunHT +DoDLKvbdzHYlAMeX +DoCkKvbdegkVqnQg +DnbkKvbdwWlAuaVu +DncKjvbdFfJqnItR +EObjjvbdZjTHpHBf +EPCkKvbdbsDKtEJa +EOcLKvbdZtIiZESn +DoDLKvbdpxoIHRDx +EPDLKvbdTpqOtuIN +DnbjjvbdmoyxvKxb +DncKjvbdqGEEtWBI +EPCkKvbdQwNdClHc +DoCkKvbdHELViajK +EPDLKvbdCJLBkIfK +EPDLKvbdvwMBWBVu +EPDKjvbdxrmiNRag +EOcKjvbdxVMeQyLn +DoCkKvbdraelkgLZ +EPCjjvbddndsLUUS +DoCjjvbdhgKDYvKV +EPDKjvbdBiKbKiFj +DncKjvbdKkBIWAKZ +DnbjjvbdjlakzEgP +EObjjvbdNrtWGeUp +EPDKjvbdidkGuPAO +DnbkKvbdjAQHBPgK +DoCkKvbdUxgtZkPO +DoDLKvbdDoCkLXDE +DoDLKvbdkVvmcaxX +EPCkKvbdmfeXmOHZ +DoCjjvbdHDkWJajK +DoDLKvbdkHgMGFnL +EObjjvbdBdQAuilf +EPDKjvbdxUleQxlO +DoDKjvbdJbjDRJcY +EPDKjvbdXsMAltOx +EOcKjvbdIrxaSmXl +DoDLKvbdyYJJbQZk +DoDLKvbdQlwaxnUz +EObkKvbdqvpMDIyR +DoCkKvbdhzVGLpnG +DncKjvbdJKEAJofd +EOcLKvbdZLrETnLm +DncKjvbdQvnDcMID +EPDLKvbdiLddOUby +EOcKjvbdeJiqvUzn +DnbjjvbdsBemMGkZ +EPCkKvbddtAUASmW +EPCjjvbdiLeEOVCy +EPDKjvbdkxrrSyHU +DoCjjvbdURQoVUhN +EOcKjvbdtkwwBUBX +EOcKjvbddeOqawCj +EOcKjvbdbAvEfPow +EPCkKvbdzROmIjXA +EObjjvbdKDKCpibx +EPDKjvbdIGfyyYXg +EOcLKvbdeOdsKssr +EOcKjvbdsBelkgKy +DoDKjvbdJYUCIMRQ +EOcLKvbdjcMLQgVH +EOcLKvbdJTYaSmXl +DoDLKvbdNddUJIkE +DoDLKvbdFjdsChNV +DnbjjvbdmttyjjSG +EPDLKvbdVgwuxHYz +EOcLKvbdsCGMkfjy +EOcKjvbdKWVGDeHJ +EPDLKvbdjJegjMwr +DoCkKvbdNHDQMotk +DoDLKvbdjmBkydgP +DnbkKvbdSLZFtfjs +EPDKjvbdjbkjpfuH +EObjjvbdkVwNdBww +DncKjvbdFxtuBEYC +EPCkKvbdrMzJxkhJ +DoDLKvbdptUGrSKt +EOcKjvbdhzUelQnG +EObkKvbdsQVoKCuf +DoCkKvbdzitpPcsU +DoCkKvbdySnJMqag +DncKjvbdZRMeImFR +EObkKvbdYzcFrKVy +DoDKjvbdrNZjZMIJ +EPCkKvbdEvYoolie +EOcLKvbdLBKgNCXq +DnbkKvbdrpVnjDWG +EObkKvbdLLBHvAJy +DoCkKvbdqmZixkgi +DoCjjvbdhytfLpmf +DnbkKvbdVZHsyjoO +EObkKvbdWWhxWEEg +EObkKvbdhfjDZWJu +DoCjjvbdZoOIddzK +DoCjjvbdCDoaWJmG +DoCkKvbdzitoocrt +EOcLKvbdOSsvGduQ +EOcLKvbdVqnXbElD +EPDKjvbdgFlZnHHA +EOcKjvbdUsltFkvK +EPCkKvbdePFSkTsr +EPCkKvbdssSTYzFD +EOcLKvbdVTlselWK +DncKjvbdZRMeJMdq +EOcKjvbdYSlAlsnx +DncLKvbdSZihTDWA +DnbjjvbdvvlBWAuu +EOcLKvbdEvZPoljF +EPDKjvbdHELWJbJj +DoDKjvbdDjHiuxKA +DncLKvbdrMyjYkgi +EOcLKvbdRbDdlIxk +DoDLKvbdFVyQQMie +EOcLKvbdZxdJmcMS +EPDKjvbdFejRmiUR +EPCjjvbdnPyxujxb +DoCkKvbdjKGIKNXr +DoCjjvbdYSlBNUPY +DoDLKvbdZshiZDsO +EPDLKvbdkyTRsYft +DncKjvbdJbicQicY +DoCkKvbdXGZZtAOs +DnbkKvbdZjSgpGbG +DncKjvbdWSOYBeMD +DoDLKvbdKNADyfta +DoDLKvbdLBKgMbYR +EObjjvbdNddThhkE +EPCjjvbdQdCaPqES +DnbkKvbdvBDySoFI +EPCkKvbdDoDLLWcE +DncLKvbdaSGDHtGL +EObkKvbdKNADzGta +DncLKvbdTAFJHaoE +EOcLKvbdTAFJIBoE +DoDLKvbdUtNTelWK +EPCkKvbdKefICApu +EObkKvbdySmhlqbH +EPDLKvbduaEYroFI +DnbjjvbdSKxfVHLT +EObkKvbdhkdcnVDZ +DnbkKvbdCSaDTevr +DoCkKvbdiBoCeXQq +DncLKvbdZjShQGaf +EPCkKvbdIwsagkqQ +DnbkKvbdnCKWwoNu +DncKjvbdelfWgNJk +EOcLKvbdSPtHKFcw +EObjjvbdZRNEhleR +DoCkKvbdbLMGPNcA +DoCkKvbdRkZFtfjs +EOcLKvbdySmhmSBg +DoCkKvbdWHxVwgYz +EObjjvbdURQntuHm +EPDKjvbdySnJMqbH +EOcLKvbdOStWHEtp +EPCjjvbdeOeTKstS +DncLKvbdssRsZZdc +EObjjvbdrovPKCuf +EPDKjvbdiZuFkqOG +DncLKvbdsBfNLfjy +EOcLKvbdCDpAujNG +EPDKjvbdOSsugFUp +DoDLKvbdNQYRVmfs +EOcLKvbdTAEiHaoE +DoCjjvbdEPDKjwDE +EPCkKvbdqUUGqqkU +EPDKjvbdtbcVXVoP +DnbjjvbdhbOcEvqR +EOcKjvbdCTAcUGWr +EPCkKvbdQdDApQcr +DnbjjvbdTfznLwWF +DnbkKvbdCDoaVjMf +EPCjjvbdBsBDUFvr +EPCkKvbdWWiXuceH +DoCjjvbdJcJcRJbx +DoDLKvbdsCGMlHKy +EPCjjvbdSBceLhyL +DoDKjvbdHffzZYYH +EPCkKvbdvAdZTOeI +DnbkKvbdxwhjBpZk +DncKjvbdOFDtIhjd +DoCjjvbdmpZxujxb +EOcKjvbdIryAsMwl +EPCkKvbdTqQnuUhN +DncKjvbdOSsvHEtp +EPDLKvbdZoOIdeZj +DnbkKvbdKeegbAqV +EPCjjvbdqFceUWAh +DnbkKvbdCWzchdpW +EPCkKvbdzQnlhiwA +DoDLKvbdqdEiQNua +DncKjvbdddoRawCj +EPDLKvbdlYrrSxft +DnbkKvbdRWnECkgc +DncKjvbdGYuUaEYC +EPDLKvbdZsiIxcrn +DoCjjvbdJbibqJbx +EPDKjvbdGYtuBDxC +DnbjjvbdCEQAvKMf +EObjjvbdvAcyTPEh +DoCkKvbdxwhjBozL +DoDKjvbdNsTugFVQ +DoDKjvbdkHgLeemk +EOcLKvbdwWlBVaWV +EOcLKvbdrNZjYkgi +DnbkKvbdJYUBglRQ +DnbkKvbdjvWmdCXw +EObjjvbdmajXYPOV +DncKjvbdDihJuxKA +EPCjjvbdwzIGGYFS +DoDKjvbdMpYQvOHT +DncLKvbdbhljLFwY +EObjjvbdelevgMik +DnbjjvbddePSCWbj +DnbjjvbdKQydnenF +DnbkKvbdZQmEhmFR +DoDKjvbdjKFgimYS +EObjjvbdANIZSvyx +DoCjjvbdfHkWRnRH +EObkKvbddiiqutzn +EOcKjvbdqYnhHQdY +DoDKjvbdKCjDQjCx +DoDLKvbdjgflFfNk +EOcLKvbdtTRrxzEc +DnbkKvbduLwwBUAw +DncLKvbdkWXOEBxX +EPDKjvbdNxPVzcnU +EPCjjvbdUMVnaWOi +EObkKvbdZQmFImEq +DncLKvbdQvmdDMID +EObjjvbdGFjSNhsq +EOcLKvbdbAvFFpQX +DoCjjvbdkCkjqGuH +EPCkKvbdbLLeoNcA +DoDLKvbdemFwGmJk +EOcKjvbdVUMtFlWK +EPDLKvbdWXJXucdg +DncLKvbdqcdhpNua +DncLKvbdGYuUaDxC +EPCkKvbdGZUtaDwb +EOcLKvbdjuwODaxX +EOcKjvbdSKyFuHKs +EOcLKvbdNQYQvOHT +EPCkKvbdNGcQNPuL +EOcLKvbdPIAYZAZB +EObjjvbdMfcPlpVL +EPCjjvbdLAjflbXq +EPCjjvbdySmhmRbH +EPDKjvbdxsNhmSBg +EOcKjvbdZMSDsmkm +DoCjjvbdbAudfQQX +DoCjjvbdePErjtTr +DncKjvbdtkxXBUBX +DoCkKvbdqvokbiYq +DnbjjvbdMfbpMouL +DnbjjvbdijFhKNXr +DoDKjvbdhgJcZVjV +EPDKjvbdIHGzZYYH +DnbjjvbdNsTufeVQ +DnbjjvbdqlyixlIJ +EPDLKvbdmaivxPOV +DnbkKvbdmJDsptrB +DnbjjvbdQYmAGsSK +EOcKjvbdZjTIQHCG +EPDKjvbdqGDeTuaI +EOcLKvbdADSYJzIp +DncLKvbdeuzwoizs +EObjjvbdFyUuBEXb +DncLKvbdnUtykJqf +EPCjjvbdelfXGmKL +EOcKjvbdKCjDQjDY +DncKjvbdaaVeGPow +DncKjvbdqvolDJYq +DoCjjvbdDnbjkWbd +DoCjjvbdjlakyeHP +DoCkKvbdLZRJrztf +DncKjvbdZisIQHCG +EPDLKvbdZyDjNbkr +DnbkKvbdLAjfmBwq +EOcKjvbdtSqryZeD +EOcLKvbdIMBzmvqL +EObjjvbdiVZdvqtb +DoDLKvbdMgDPmQVL +EPDLKvbdMgCpNPtk +EObjjvbdKVuGDeHJ +EOcLKvbdjJehJlxS +EPCkKvbdhlEcmuDZ +DoDKjvbdHfgZyXwg +EPCjjvbdShyiqABM +EPDLKvbdMgColouL +EPDLKvbdVqmwadkc +EPCjjvbdnCKWwnmu +DncKjvbdRpUGjGEX +DoDKjvbdkWWnECYX +DnbjjvbdkMalZeGo +EOcKjvbdxUleRYkn +EObkKvbdFxtuBDxC +EObjjvbdnGdwlnGy +EObkKvbduaEYsOeI +EPCkKvbdyTOJMrBg +EObjjvbdDHMFgAzc +DnbjjvbdEOcKkXCd +EPDLKvbdBhjbLIfK +EPCkKvbdZtJJZETO +EOcLKvbdIwsagkqQ +DoCkKvbdZyDjNbkr +DnbjjvbdBsAbsfWr +DoCjjvbdeOeSjssr +EObkKvbdVUNUGMWK +DncLKvbdfMfWfmKL +DoCjjvbduaEZTOdh +DoCkKvbdZisIPgBf +DnbjjvbdVZHtZjoO +DoCjjvbdCWzchePv +EObjjvbdJmAEZfuB +EObjjvbdvvkaVaWV +DoCjjvbdiiegjNXr +DnbjjvbdcScLUEJa +DncLKvbdJXsbHlQp +EPCjjvbdrpWOjDVf +DoDLKvbdDnbjjwDE +DnbjjvbdxnShYSiD +DoCjjvbdqGEFUWBI +DoDKjvbdtSrTYzEc +EObkKvbdEPDLLWcE +DoDKjvbdKQzEnfOF +EPDLKvbdIwtBhMRQ +DoCjjvbdTvLojUBR +EPDLKvbdZyDimbkr +EPDLKvbdptTfrSKt +DncLKvbdkMbLyeHP +EOcKjvbdKfFhBaQu +EObjjvbdeEoRbXDK +EOcKjvbdHDjvJbJj +EObkKvbdEztQeLcJ +DncKjvbdUtMsfLuj +DnbjjvbdRXOECkgc +DncKjvbdLAjfmBxR +EOcLKvbdsPvPJcVf +EPCjjvbdygYlAMdw +DnbjjvbdmuVZkKRf +EPCkKvbdSZigrcWA +DncLKvbdcJMikGWx +EOcKjvbdGLErcHlu +DoDKjvbdKNADygUa +EPDLKvbdMfbolpUk +DoDLKvbdUxhTyjoO +EPCkKvbdMtrqjmAX +EPDLKvbdLBLGmBxR +DoCjjvbdrzMQTAgn +EPDLKvbdUxhTykPO +DnbkKvbdnVUzLJqf +DoCkKvbdLYpirztf +EPDLKvbdFejSOItR +DncLKvbdvlvANDeN +DncLKvbdwtleRYkn +EObkKvbdcJNKLFvx +EPCjjvbdYSkaNTnx +EOcLKvbdSxKlNzjx +DnbjjvbdHbMZdzAD +EPCjjvbdXnRAXuVt +DoDKjvbdQmYBxnUz +DoCkKvbdWSOYCEkc +DnbkKvbdemGXGlik +EObjjvbdNeDsiJLE +DoCkKvbdbiMijfXY +EPCjjvbdmIdTptrB +DoCjjvbdEztQeMDJ +DncLKvbdCIjbLIfK +EPCjjvbdhkeENuDZ +DoCkKvbdAMgxsWzY +DoCjjvbdiZtelQnG +EOcKjvbdWXJXuceH +EOcLKvbdZRMeJMeR +EPCkKvbdiVZdvquC +DoDLKvbdkVvmdCXw +EObjjvbdnHExMmgZ +EPDKjvbdHgHZyYYH +EPDKjvbdRbEFMJYk +EPCkKvbdvBEZSndh +DnbkKvbdcScLTdJa +DoDLKvbdcJMijfXY +DnbjjvbddndrjstS +EPDLKvbdbiNJjevx +DnbkKvbdOSsvGduQ +DoDKjvbdMowpvNfs +DoCkKvbdZjSgpGaf +DnbkKvbdddnqawDK +DoDLKvbdKaLGmCYR +DoCjjvbdmuVZkKSG +EOcKjvbdZQldiMdq +EObjjvbdRNXayOUz +DncLKvbdeuzxQJzs +DncLKvbdEOcKkXCd +DncKjvbdhtyeXSUb +DnbjjvbdEObjkXDE +DncLKvbdKQyePGNe +EOcLKvbdHgGzZXwg +EObkKvbdrMzJxlIJ +EObkKvbdRXNdClHc +DoDLKvbdwzIFexEr +EPDKjvbdJYUCIMQp +DnbkKvbdhbOcFWqR +EOcKjvbdnGdxMmgZ +EObjjvbddeOqawCj +EPCjjvbdqTsgSSKt +DncKjvbdJXtBhLqQ +DoDLKvbdatagYKsh +EOcKjvbdjEkHUoAO +DncKjvbdLFfICBRV +DnbkKvbdKQydoFme +EPDKjvbdhlFEOVCy +EPCkKvbdZxdJmblS +EPDKjvbdJbjCqKCx +DncKjvbdwNWANDdm +EPDLKvbdpyPHfqDx +EPCjjvbdOTTufeVQ +EPCkKvbdtbbtvvOo +DoCjjvbdbBWEfQQX +EObjjvbdKNAEZgVB +DnbjjvbdJXtBgkqQ +EPCjjvbdGYtuBEXb +DoDLKvbdZjShQGaf +DoDLKvbdQmYCYnUz +EOcLKvbdpedFTvAh +EObjjvbdKQydoGNe +EPCkKvbdKDJcRKDY +EObkKvbdrafMkfkZ +EObkKvbdiCObdwRR +EPCjjvbddBsMrAUN +DoDKjvbdWIXvXgYz +DoDKjvbdkClKpftg +EOcKjvbdkCkjpftg +EOcLKvbdVrOYBeLc +EObkKvbdmoyxukZC +EPCjjvbddZyQXyRC +DoCkKvbdhbPCdvqR +DoCkKvbdJvUeceGi +EOcLKvbdVqnXaeMD +DoCkKvbdWWhxVceH +EPDKjvbdiGjDZVjV +EObjjvbdGAnpxizm +DoCjjvbdiZuFlQnG +EOcKjvbdTqRPVVIN +EPCjjvbdqdEhomvB +DoCkKvbdLAkHMaxR +EPDLKvbdOEdThiKd +DnbkKvbdkxrrTZGt +EOcLKvbdEPDLLXCd +DoDLKvbdTIzKRAAl +EPDLKvbdSCDeLiZL +EPCkKvbdpyOgfpdY +EPCjjvbdtkwwBTaX +EPDKjvbdiBoCeWqR +DoCjjvbdhgJbxujV +DoDLKvbdqdEhpNvB +EOcKjvbdkCkjqGuH +EPCjjvbdhbObeXQq +EOcKjvbdxsOImRbH +DoCjjvbdKWVFceHJ +DoDKjvbdBiKbKiGK +EPDKjvbdnGeXmNgZ +EPDKjvbdiifHjNYS +EOcKjvbdauBgXjsh +DnbkKvbdUtMsfLvK +DncKjvbdNrtVgEuQ +EPDLKvbdUsmUGLvK +EOcLKvbdNGcQMpVL +EPCkKvbdqmZjZLhJ +EObkKvbdFfKSOJUR +DncKjvbdhaoCeXRR +DoCkKvbdmfdwlnGy +EPCjjvbdjbkjqGuH +DoDKjvbdlqyVZsEJ +DnbjjvbdWWiYVcdg +EOcKjvbdeATqMwjG +EOcKjvbdqUTgSSKt +DncKjvbdqwQMDJZR +EPCkKvbdsQVoJbuf +DoCjjvbdVTmUFlVj +DoDKjvbdmajWxPOV +EOcKjvbdUQpoUthN +DoDKjvbdwMvAMdEm +EPDLKvbdDnbkLXDE +DncLKvbdFfKSNiTq +DncKjvbdIryBSlwl +DoDKjvbdmgEwlmfy +DncKjvbdqwPkbhyR +DncLKvbdNeETiJKd +EObjjvbdDoCjkXCd +EObkKvbdjgflFfNk +DncLKvbdxsNhlrCH +DoCjjvbdeFOrCWbj +EObjjvbdkNBkzFHP +DoCjjvbdxrmiNSCH +EOcLKvbdVwJXvDeH +EPCkKvbdZRMdhmEq +EObjjvbdjSzhsKiz +DoCkKvbdqdEiQOVa +EOcLKvbdpaJFAWhE +EPDLKvbdRkYfVGjs +DncKjvbdMpXqWNgT +EOcLKvbdVYhUZkPO +DoCjjvbdUxhTyjnn +DoCkKvbdOYOuzcmt +DoDKjvbdZLqdUNlN +DoDLKvbdJSyBTMxM +DoDLKvbdYORAXtut +DncKjvbdHffzYxXg +DncLKvbdmpZyVjyC +EOcKjvbdmfeXlnGy +DoDLKvbdkHfkeenL +DoDLKvbdJTZBSmYM +EObkKvbdrMzKZMHi +DncLKvbdiLeDmuCy +DoDKjvbdjvXNcbYX +DnbkKvbdrJAJeMne +DoDLKvbdvlvAMdFN +EPCjjvbdZLrDsmlN +DnbjjvbdaaVdfPpX +EObkKvbdrbFlkfjy +DoDKjvbdGLErbhNV +DoCjjvbdCIkCKhfK +DnbjjvbdeEoSBwDK +DncLKvbdirziSjiz +EPDKjvbdwzIGGYEr +DncKjvbdbVCGwkTh +EObkKvbdakMFnmcA +DnbkKvbdRpUHKFdX +DoDLKvbdMSWlytpz +DncLKvbdpssgRrKt +EPCjjvbdZRMeImEq +DoCjjvbdqrVKmjaN +EObjjvbdjAQGaPfj +DoDLKvbdyqOmJJwA +DnbjjvbdQccApRES +DoDLKvbdIsYaSmXl +EPCjjvbdrovPKDWG +EPDLKvbdqdEhpOVa +DoCkKvbdVviYVdEg +DoCjjvbdqZPIGqEY +EPCkKvbdOTTvGeVQ +DoCkKvbdDncLLXCd +EObkKvbdvBEYsOeI +DoCjjvbdYORAYVVt +EOcLKvbdhgKCxuiu +DoDKjvbdddoRbWcK +EObkKvbdmoyyWKyC +EOcLKvbdyYJJbQZk +DnbjjvbdUyIUZkPO +DncKjvbdFyUuBDxC +DoCjjvbdnQZyVjyC +DoDLKvbdatbHYKsh +DoCjjvbdczYowxpb +DncLKvbdIsZAsMxM +EPDKjvbdGKeTChMu +DoCkKvbdptTgSRjt +EPDKjvbdMtrqjmAX +DncLKvbdKQzEoFme +EObjjvbdFxtuAcxC +DncKjvbdkDLkRHVH +EPCkKvbdunszqKnt +DoCkKvbdezuxeJTw +EObkKvbdzjVQQDsU +EPDLKvbdjKGIKMxS +DoCjjvbdcyyQXxqC +EObkKvbdhtydwRtb +DnbjjvbdfNGXHNKL +DoDKjvbdmoyxujxb +DncLKvbdmuVZkJqf +EObkKvbdZyDjNbkr +DnbkKvbdyXhiaozL +EObkKvbdKWUfDeHJ +DoCkKvbddoFTLUUS +DnbjjvbdJvUfEFHJ +EObjjvbdsrqrxzFD +EObjjvbdmgFYMmfy +DnbjjvbdbrcLTcjB +EPDKjvbdZtIiZETO +DncKjvbdSLZGVHLT +EObjjvbdhtzFXSVC +EOcKjvbdvAcxsPEh +EOcKjvbdbrbjsdKB +DoDKjvbdezuxdiTw +DoDKjvbdhkdcnVDZ +DoCkKvbdNddUJIkE +DnbjjvbdsCGMlGjy +EOcKjvbdssSSxydc +DoCjjvbdSPtHJfDw +DoDLKvbdmRyVZrdJ +EOcLKvbdBdQBVjNG +EPCjjvbdtvOXipsA +EOcLKvbdDwwlUUUM +EObkKvbdhkeENuDZ +EOcKjvbdwygfGYEr +DncKjvbdbsCkUEJa +DnbkKvbdvlvAMceN +EPDKjvbdTvMPitAq +EPDLKvbdMowpvOHT +EOcKjvbdNQXpvNgT +DncKjvbdYzcFqiuy +EObjjvbdqUUGrRjt +EOcKjvbdUaBqTRSZ +DnbjjvbdrafMkfjy +DncLKvbdmgFXmNfy +DncKjvbdNrtVfdtp +EOcKjvbdVZITyjoO +EPDKjvbdTukpJtBR +DoDLKvbdyOTHxTIc +DnbjjvbdsBfNLfkZ +EPCjjvbdmJDtRVSB +EObjjvbdmJDtRUrB +DnbjjvbdiVZeWrVC +DncKjvbdBiKajhfK +DnbkKvbdziuQPcsU +EOcKjvbdGFiqnJTq +DoCjjvbdAMhZTXZx +DncLKvbdDjHiuwjA +DnbkKvbdBdQBVjNG +EPCjjvbdqlzKYkgi +DncLKvbdLLBIWAJy +DncLKvbdbhljKfXY +DncKjvbdaogHELzd +DnbkKvbdjEkGtoAO +DnbjjvbdGdKvJbKK +EPDLKvbdqrUjnKaN +EObjjvbdnVUykKSG +EPDKjvbdVrNwbFMD +DoDKjvbdvlvAMdEm +EPCjjvbdaaWEeopX +EPDLKvbdULuoBVoJ +EPDLKvbdzjUpPcsU +EPDKjvbdZnnJEdyj +EPDKjvbdtlXwAsaX +EPCjjvbdjJfHimXr +EPCkKvbdxwiKBpZk +DoCkKvbdLiBlQxAS +EObkKvbdXFxytAOs +EObjjvbdnQZxukYb +DncKjvbdZxcjNcMS +DnbkKvbdQcbaQQcr +EObkKvbdVgxVwgYz +DoDLKvbddoEsLUUS +EOcKjvbdTppnttgm +DoDKjvbdBhkBjhej +EPCkKvbdlhcsqVRa +DoDKjvbdZshiYcsO +DoDKjvbdtcDUvvPP +DnbkKvbdRkZFuGjs +DoCkKvbdaaVeFopX +EObkKvbdYORAXtut +DncLKvbdqwPlDJYq +DoDLKvbdbBWEepPw +DnbkKvbdVvhxWDdg +EObkKvbdfHkVqmpg +DncKjvbdaMjartmH +EPCkKvbdBhjbLIej +DoCjjvbdCIjbKiFj +DoDKjvbdkIHLefOL +EOcKjvbdrbGMlGkZ +DncLKvbdPxmAGsRj +EOcKjvbdZxdKODMS +DncKjvbdkDLjqHUg +EOcLKvbdjEkHUoAO +DoDLKvbdrovOjDVf +DncLKvbdZshiZESn +DncKjvbdUyIUZjnn +EPDLKvbdxmrhYSiD +DoCjjvbdaNKasUlg +DnbkKvbdYqMeJMdq +DncKjvbdZoOIeEyj +EOcKjvbdemGXGlik +EObjjvbdyzdnRhIh +DncKjvbdHEKvJbJj +EObkKvbdSCDdlIxk +EPCjjvbdGAoQxizm +DoCjjvbdaNKasVMg +EObkKvbdePErkTtS +EPCjjvbdlhdUQuSB +EPDKjvbdNQXpvOGs +DoCkKvbdXnRAYUut +EObkKvbdcTCkUEKB +DncLKvbdmRyUzSdJ +EPDLKvbdrSVLNkAm +DoCkKvbdJvUecdgJ +DoDLKvbdRDbaQRDr +EPDKjvbdYlSETmlN +EPCkKvbdbUagYKtI +EPCjjvbdssRrxzFD +EPCjjvbdRMwbYmtz +DnbjjvbdxrmhmRag +DoDKjvbdTvLpJtAq +EPDKjvbdVBBprprZ +DnbkKvbdRkYeuGkT +EOcKjvbdmbKWwoOV +EOcKjvbdZeYGzghb +EPCjjvbdFeirOJUR +DoCkKvbdZsiIxcrn +EPDKjvbdDnbkKvcE +DoDLKvbdsrrTZZeD +DncKjvbdJbjCpicY +DnbjjvbdcyxpXxpb +EPCjjvbdrXQLbhxq +DncKjvbdzROmJJwA +DoDKjvbdqdFIpNvB +EPDKjvbdkHfkfGNk +DoDKjvbdFjdsDINV +DoDKjvbdUyITyjoO +EOcLKvbdiUzEwRtb +EPCkKvbdmfeYMmgZ +DncLKvbdHgGyyXxH +EObkKvbdMuTSLNAX +DncKjvbdtbcUwWOo +DoCjjvbdVwIxWEFH +EOcKjvbdhgJcZWKV +DoCjjvbdsCFllHLZ +EPDKjvbdGcjvJbKK +EOcLKvbdnGeYNNfy +DncKjvbdZnnIeFZj +DoDKjvbdxUldqZLn +EOcKjvbdrovOibvG +DoDKjvbdUWLpKTaR +DncKjvbdePFTKtTr +EPDLKvbdFxtuAdYC +DoDLKvbdfIKvRnQg +EPDLKvbdypnmIjXA +DncKjvbdbUagYLUI +EPDKjvbdnVUyjiqf +EObkKvbdKWVGDeGi +EObkKvbdaNKbSuMg +DoDKjvbdNVSqkNAX +EObkKvbdhbPDFWqR +DoDLKvbdLGFhBaRV +EOcKjvbdbrcLUDjB +EObjjvbdZHXEAPTJ +EPCjjvbdCSaDTevr +DncLKvbdgQBzvcxI +EObjjvbdidjfuPAO +DoDLKvbdzjUoodTU +DncKjvbdGLEsChNV +EPCjjvbdNeDshiLE +EObjjvbdGGKRnIsq +EObkKvbdeYZtTqez +EOcKjvbdQwODblHc +DoCkKvbdkClLRHVH +EPCkKvbdxUldqYkn +EPCkKvbdvBDxsPFI +DnbkKvbdqvpLcIyR +DncKjvbdqmZixkhJ +DoDLKvbdkVwNdCYX +EObkKvbdUxgsykPO +EPCkKvbdjcLjpgUg +DnbjjvbdbUagYKtI +EObjjvbdDjHjWXjA +EObjjvbdrykpSaIO +EObjjvbdrbGMlGjy +DncLKvbdVYhUZjnn +DoDLKvbdjlakydfo +DnbkKvbdVTmUGMVj +EObjjvbdZjTIQHCG +EOcLKvbdZxcjNcLr +DoCkKvbdqTsgSRjt +DnbjjvbdCIkBkJFj +EPCkKvbdaogHELzd +EPCjjvbdNPxQunGs +EObjjvbdxZhFfXeS +DoDKjvbdjblKqHUg +EObkKvbdNPxRWNgT +DoDKjvbdkaNOmALA +EPDLKvbdxsOImSCH +EOcLKvbdZshhyETO +EPDLKvbdIHHZyYYH +DoDKjvbdliEURVRa +EObjjvbdiVZeXRtb +EOcKjvbdiHJcYvJu +EOcKjvbdIsYaTNXl +DoCkKvbdtlXvaTaX +EOcKjvbdNQYRVnHT +DoDKjvbddjJqvUzn +DoDKjvbdULuoBVoJ +DoDLKvbdUslselVj +EPCkKvbddePSCWbj +EPDKjvbdNeDtIiKd +EOcKjvbdiUzFXSUb +DoCkKvbdmRyVZsEJ +EPCjjvbduLwwAtBX +EPDLKvbdxZgfGXdr +DnbkKvbdBcpAujNG +DnbjjvbdZtJIyDrn +EObjjvbdmbJvwnmu +EPCjjvbdXnRAYVWU +EOcLKvbdyOShXsJD +DoCjjvbdptUGqqkU +DnbkKvbdFpASwHGZ +DnbkKvbdwtleRYlO +EPCkKvbdnHFYMmfy +EPDKjvbdKCjDQjDY +EObkKvbdeqaWzlDP +DoCkKvbdbLMGPODA +DoCjjvbdpyPIGqDx +EOcKjvbdbhmKLFwY +DoDLKvbdEOcKjwCd +EPCkKvbdePFTKtUS +EPCkKvbdtvNwipsA +EPCkKvbdzoQQdblY +EOcLKvbdKjaHvAJy +EPDKjvbdvPTzpkOt +EPDKjvbdMJCLpxAS +EObkKvbdWWhwvEEg +DnbkKvbdcJNJjevx +DoCkKvbdNQXpunGs +EPDKjvbdWSNxBdlD +EPDKjvbdwyhFeweS +DncKjvbdddnrCWcK +EObjjvbdeKJrVtzn +EObjjvbdrykosBIO +EPDKjvbdiiehKMxS +DncKjvbdrWpMCiZR +DoCjjvbddoFSjssr +DoCjjvbdbhmKKfWx +EObjjvbdmajWwoNu +EOcLKvbdDxYLstUM +EPCjjvbdddoRawDK +DncKjvbdmuUzKjSG +DoDKjvbdLFegbBRV +EPCkKvbdySnJMqbH +DnbjjvbdLLAgvAKZ +EPCjjvbdraemMHLZ +EObjjvbdnUtzLKSG +EPDKjvbdkDMLQgVH +DoDKjvbdkHgMGGOL +DoCjjvbdxsNiNSCH +EObkKvbdNQXpvOHT +EObkKvbdQwNdDLgc +DnbjjvbdegkWRnRH +DnbkKvbdGZUuAcwb +DncLKvbdiMEcmuCy +DoDLKvbdFfJqnJTq +DoDKjvbdZnnJFEzK +EOcLKvbdTqRPUtgm +EOcLKvbdRjyFuHLT +EOcKjvbdhtzEwRtb +EObjjvbdTXjkmzjx +DoDKjvbdqdFJQOVa +DoCkKvbdGckViajK +DncLKvbdDxXlUTsl +EOcLKvbdeUAUASlv +DnbkKvbdzjUpQETU +DnbkKvbdtcCuWuoP +DncLKvbdauBgXkUI +DoCjjvbdUVlPitBR +DnbkKvbdFfJrOItR +DoDLKvbdxnSgwsJD +EPCkKvbdXsMBNToY +DncLKvbdCTAcUFwS +DoDKjvbdhgJbxvJu +DoDLKvbdhkeDnUby +EObkKvbdEvZPpNKF +EPCjjvbdiHJcZWJu +EObjjvbdIHHZyYXg +DoCkKvbdegkVqmqH +DoCjjvbdxVNFRZMO +DoDLKvbdUQpntuIN +DoDKjvbdEJhJuwjA +DoDKjvbdkHflGGNk +DnbkKvbdmttykKRf +DncLKvbdZxdJmblS +DnbjjvbdZQmEhmEq +DoCjjvbdJcJcQjDY +DoDKjvbdBhkCLIej +DoDLKvbdmIcspuRa +DnbjjvbdqiAKElne +DoCjjvbdJpzEoFnF +EOcKjvbdyOShYTJD +DoCkKvbdmuVZjiqf +DoDLKvbdSCDeLhyL +EOcKjvbdJvUedFGi +EObkKvbdehLWRnRH +EPDKjvbdxmrhXriD +DoDLKvbdOTUWGeVQ +EPCjjvbdzRPMhiwA +EPDKjvbdKRZePGOF +DoCkKvbdrDeIomvB +EPDKjvbdkVvmdBww +DoDKjvbdIGfzYwwg +EPDLKvbdFVyPpNKF +DoDKjvbdhytfLqNf +DnbjjvbdMfbomQUk +EOcLKvbdtcDVXWOo +DoDKjvbdqwPlDJYq +EOcLKvbdZshiZETO +EOcLKvbdeEnrCXCj +EOcKjvbdZLrDsnLm +EPCjjvbdLYqKSzuG +DncLKvbdMtsRjmAX +DoCjjvbdJTZArlxM +EPCkKvbdlZSrTZGt +DncKjvbdRyjITCvA +DoCjjvbdEuxpPmKF +DnbkKvbdTYKkmzjx +DoDLKvbduDDVXWPP +DncLKvbdjAPfaPgK +DncLKvbdrEFJPnVa +EPCjjvbdrXQMChyR +DnbkKvbdznpQeDLx +DoCkKvbdjgflFfOL +EObjjvbdjlalZdgP +DoCjjvbdtbcUvvOo +DoCkKvbdrEFIonWB +EObjjvbdwXMAvAuu +DncLKvbdePFSkUTr +EPCkKvbdTppoUuIN +EPDKjvbdIxUCHlQp +DnbkKvbdBiLBjiGK +DoDKjvbdliDspuRa +EObjjvbdFkFTDIMu +EPCjjvbdsQVnjDVf +EPCjjvbdKefIBaRV +DoDKjvbdIryAsNYM +DoCkKvbdsrqrxzEc +EPCjjvbdLqwNZuQz +EOcLKvbdcIlikGXY +DoCjjvbdADSXizIp +DoCkKvbduaEZTOeI +DncKjvbdvBDyTPEh +EPCkKvbdRkZFuHKs +DoDLKvbdSLZFuGkT +EOcLKvbdfekzOHHA +EOcLKvbdkaMoNALA +DncLKvbdkNCMZeGo +EObjjvbdNsUVfduQ +EPCjjvbdZoNiEeZj +DoDLKvbdLYpirzuG +EPDKjvbdmoyxujyC +DoCkKvbdaMjbSuNH +EPDLKvbdxxIjCPzL +DnbkKvbdVAaqSprZ +DoCjjvbduVmxJqTA +DoCkKvbdRkZGVHLT +DoDKjvbdEuyQPljF +DnbkKvbdptUHSRkU +DncLKvbduLxWaUAw +EObjjvbdaaVdfQQX +EPDLKvbdWWiYVdFH +EOcLKvbdfelZmgHA +DoCjjvbdADRxKZiQ +EOcKjvbdfHkWSORH +EObkKvbdTAEiIBoE +DncKjvbdEKIKVxKA +DoCkKvbdkDMKpgVH +DnbkKvbdCWzciEpW +EObjjvbdxZgefXeS +EOcLKvbdsZkpTBIO +DoDLKvbdrJAKFMne +EPDKjvbdkWXNdBww +DnbkKvbdRbEFLhyL +DncLKvbdWXJYWDeH +EOcLKvbdijFgjMwr +DoDLKvbdnHExMnGy +EObkKvbdZeYGzhJC +DnbjjvbdEvZPpMie +EObjjvbdYpldiMdq +DoCjjvbdfRaWzlCo +EPCjjvbdGYtuBDxC +EOcLKvbdQYmAGrrK +EPCkKvbdlhcspuSB +DoDLKvbdezvZFIsw +EOcKjvbdlYsSTZHU +DnbkKvbdmfeXmOGy +DncLKvbdKDKDQicY +DncKjvbdZjTIQHCG +DnbkKvbdgFkzOHHA +DnbkKvbdaNLBsVNH +DoCjjvbdBsBCtGWr +DncKjvbdqdFIomvB +DnbkKvbdkNBlZdfo +DnbkKvbdSQTgKGDw +DoCkKvbddoFTLTsr +DoDKjvbdEYYLtTtM +EOcKjvbdVwJYWEEg +DoDLKvbdyOSgwrhc +DoCkKvbdZMRdUOLm +DoDLKvbdYSlBMtOx +EPCkKvbdkxsRsYft +DnbkKvbdrzLpTAgn +DncKjvbdRjxfUgKs +DnbkKvbdqquLNkAm +DoDLKvbdRMxCYnUz +EPCjjvbdZoOIdeZj +EObkKvbdrpWOicVf +EPDLKvbdkCkjqHVH +EOcKjvbdmSZUzSci +EObjjvbdRjxfUgLT +EObjjvbdNddThhjd +DoCjjvbdKVuFcdfi +EPDKjvbdzjVPodTU +DncKjvbdJTYaSmXl +DncKjvbddZyQXyQb +EPCjjvbdCIkCKiFj +EPDKjvbdTkunaWOi +EObjjvbdfIKuqnRH +DoCjjvbdZRMdiMeR +DnbjjvbdMpXpunHT +DoDLKvbdZRNEhmFR +EObjjvbdaoffdLzd +DoDLKvbdvAdYsOdh +DnbjjvbdSLZGUgLT +DoCjjvbdSCDdkiZL +DoDLKvbdelewHNKL +DoCjjvbdRXNdDMHc +EObjjvbdkWWnDaww +EObjjvbdcyxoxZRC +DncKjvbdelfWfljL +EObjjvbdZnnJEdzK +EOcKjvbdkHflGFnL +DoCkKvbdhbPCdwRR +EPDLKvbdHDkWKCKK +DnbkKvbdRadEkiYk +EOcLKvbdFWYopNJe +DoDLKvbdqTsfrSKt +EObjjvbdxnSgxTJD +EPDLKvbdxZhFewdr +EPCkKvbdTvLojTaR +EObjjvbdfIKuqnQg +EPCjjvbdDxXlTssl +EObjjvbdQvmccLhD +EObkKvbdRNXayOUz +EPCjjvbdatbGxLTh +EOcKjvbdOSsvGeVQ +EPDKjvbdePFTKstS +DnbjjvbdlYsRsZHU +DnbjjvbdZisIQGaf +DoCkKvbdsrqsYzEc +EObjjvbdfILVqnRH +DnbkKvbdZHWdAPTJ +DoDLKvbdEPCkLXCd +EObjjvbdEXwktTsl +DncLKvbdFVyQPlie +DncKjvbdNsUWHEtp +EOcKjvbdyqOmJKXA +EOcKjvbdADSYJyhp +EPDKjvbdUyIUZjoO +EOcKjvbdmJEURVSB +DnbjjvbdIwtBgkpp +EPCjjvbdZQmEhldq +EPCkKvbdDjHiuxKA +DoDKjvbdrEEiQOVa +DncKjvbdKDKDQjCx +DncKjvbdZRNFJMeR +DncLKvbdwygeeweS +DncLKvbdnUuZkKSG +DoDKjvbdvwMAvBWV +DoCjjvbdBhkCLIfK +DnbjjvbdoznDkXoA +EOcKjvbdjgflFemk +EObkKvbdKVtfDdgJ +DnbjjvbdXrkaNUPY +DncKjvbdhlEdNtby +EPDKjvbdemGWfmJk +DoDLKvbdlhctQtrB +EObjjvbdnVVZkJqf +EObjjvbdwuNEpyMO +DoCjjvbdTpqOuVHm +EObjjvbdbLLennDA +DoDLKvbdiGjDZWKV +EPDLKvbdFjeTDHlu +DoDLKvbdDxYLstUM +EPDLKvbdiUzFXSVC +DncKjvbdJYTbHkpp +DoCkKvbdZshhxdSn +EPDKjvbdxrnIlqag +EOcLKvbdiHJcYvJu +DnbjjvbdkVwNcaxX +EObjjvbdpyPIGpcx +EPCkKvbdauCGxLUI +EObkKvbdWRnXadkc +DnbkKvbdVUNUGLvK +EObkKvbdDxYLsssl +DnbkKvbdCJKbKhfK +DncLKvbdbhmKKfXY +EOcLKvbdZoOIeFZj +DoDLKvbdkNCLzFHP +EObkKvbdpxnggQdY +EObkKvbdYqNFJNEq +EPCjjvbdyzdnSHhh +EOcKjvbdczZQYZQb +DncKjvbdZyDimblS +DncLKvbdyOTIXrhc +EObjjvbdhzUelQnG +EObjjvbdFjeTChNV +DoCjjvbdwMvANEEm +DoDLKvbdRXOEDMID +DncKjvbdiHJcYvJu +EOcLKvbdhtzFWrVC +DncKjvbdVYgsykPO +DoCjjvbdGGKRmiUR +EPDLKvbdQmXbYnUz +DnbkKvbdkIGlFemk +DoCjjvbdSPsgJfDw +DncKjvbdzjVQPcrt +EPDKjvbdmfdxNNfy +EPDKjvbdZyDimblS +DoDKjvbdANIZSvzY +DoCkKvbdJqZdoGOF +EOcKjvbdcJMijewY +DncLKvbdNQXqWNfs +DncLKvbdkNBlZeGo +DoCjjvbdHffzZYXg +DoDKjvbdjhHMGGOL +DnbkKvbdiCObdvpq +DoDLKvbdYlRctNkm +EObkKvbdiUzEwRuC +DncLKvbdMfbomPuL +EPCkKvbdlZSrSyGt +DncLKvbdvAcxroFI +DoCjjvbdNGcQNQUk +DncKjvbdWSNxBeLc +EPCkKvbdqvokcIyR +DncLKvbddZyQXxqC +DoCkKvbdvPTzqLPU +DncLKvbdZxcjNblS +EPCjjvbdkMbLzFHP +EPCkKvbdlYrqsYgU +DnbjjvbdWSOXbFMD +DnbkKvbdWeyZtAPT +EPCkKvbdEKHivYKA +DoCkKvbdkNBkyeGo +DoDLKvbdiBoDEvqR +DoDLKvbdRkYfVGjs +EOcKjvbddneSkUTr +EObjjvbdFejRnItR +DncLKvbdLAjgMbXq +DnbkKvbdUGznLwVe +DoDKjvbdLqwNZtpz +EPDKjvbdUxhTyjnn +EPDLKvbdkNBkyeHP +DoCjjvbdgFkzNgHA +EObjjvbdunszpjnt +EPCkKvbdtAHQhABS +DnbjjvbdbKkfOnDA +DoCjjvbdVviYWEFH +DoCjjvbdGZUuAdXb +EObjjvbdhlFDmuCy +DncLKvbdyfyMAMdw +EObjjvbdFyUtaDxC +DnbkKvbdeEoSCXDK +EOcKjvbdbVCGwjtI +EOcLKvbdTAEhgand +EObkKvbdRpUHJecw +DnbjjvbdZsiJZDrn +DncLKvbdtSqrxyeD +DoDKjvbdJSxaSmYM +EPCkKvbdjuvnECYX +DoDLKvbdrMyjYkgi +DnbkKvbdjJegjNXr +DoDLKvbduaDxsOdh +DoDLKvbdmIcsptrB +EObkKvbdFkFTDHmV +DnbjjvbdYORAYVVt +DncLKvbdddoRbWcK +EPDLKvbdLrWmZuQz +DoDLKvbdliETpuRa +DoCjjvbdbrcKsdKB +DoCkKvbdHkazmvpk +EPCjjvbdUaBpsRRy +EObkKvbdKfFhBaQu +DoCkKvbdKQydnfNe +EOcLKvbdDjIKVxKA +DncKjvbdpeceUWBI +DncLKvbdKaLHNBxR +EPDLKvbdptTfrRkU +EPDKjvbddndsLTtS +EObjjvbdMpXpvOHT +DnbkKvbdaMjaruNH +DoCkKvbdpecdtVaI +DncLKvbdRpTfjGEX +EObkKvbdCSaCsevr +DoCkKvbdnHEwmNgZ +EObjjvbdfHjuqmqH +DoDKjvbdKWVGDeGi +DoDLKvbdWHxVxHYz +DnbjjvbdXsLaMsnx +EPDLKvbdDjHiuwjA +DnbjjvbdaaWFGQQX +DnbjjvbdsrrTZZdc +DoCjjvbddneTKtUS +DoDKjvbdcJMjLFvx +DoDKjvbdaNKbTUlg +DnbjjvbdkHflFfOL +EObjjvbdJpzFOeme +DoCjjvbdrounibuf +DoCjjvbdHgHZxwxH +EOcLKvbdSKxeuGkT +EOcLKvbdzQoNJJwA +EObjjvbdZnnJEdzK +DoDLKvbdJuuFcdfi +DncKjvbdIryBSmYM +EObkKvbdyYJJaozL +EObjjvbdFkEsDHmV +DnbkKvbdfMfXHMjL +DnbkKvbdLGGIBaRV +EOcLKvbdRXNdDMHc +DoDKjvbdegjvRnRH +DnbkKvbdKeegaaQu +DnbjjvbdkMakzEgP +DoDKjvbdcTDKtEKB +DncLKvbdhaoDEvqR +DncLKvbdmgEwmNfy +EPDKjvbdCIjbLIfK +DncLKvbdJvUedEgJ +DoCjjvbdFVxpPljF +EOcLKvbdJYUCIMRQ +EPDKjvbddwyssrFz +DoDKjvbdiMEdOUcZ +DoDKjvbdZQleIldq +EPCkKvbdnQZyVkYb +DoCjjvbdNGbpNPuL +DoCkKvbdOStVgFVQ +EOcKjvbdGBPQxizm +DnbjjvbdOXoVzcnU +DncKjvbdyqPNIiwA +DoDLKvbdkIGlGGNk +EPDKjvbdbiNKLFvx +DoCkKvbdCTBCsfWr +DoDKjvbdShyjRABM +EPCjjvbdxwhjBozL +DoCkKvbdqUUHSSLU +DoDKjvbdbBVdfPow +DoCkKvbdqYnggRDx +DoCkKvbdtkwwAsaX +EPDLKvbdZMSDsnMN +EPDLKvbdZjTIQGbG +EPCjjvbdzoPpdblY +EPDKjvbdVviYWEFH +DnbjjvbdUsltGLuj +DoCkKvbdQdDAopcr +EPDKjvbdZxcjNbkr +EPCjjvbdZisHpGbG +EPDKjvbdEuxpPmKF +EOcKjvbdQwNccLgc +EPCjjvbdEYYLstUM +EObkKvbdZRNEhmEq +DoDKjvbdaRfDIUGL +DncKjvbduaDxsOeI +EObkKvbdmaiwYPOV +EOcKjvbdKDJbqJbx +DoDKjvbdQvnEDLgc +DnbkKvbdtlXvaTaX +EPDKjvbdzQoNIiwA +EOcLKvbdNeDsiIjd +DnbkKvbdBdQAvJlf +DoCkKvbdhzVGMROG +EPDLKvbdUaCQsRRy +EOcLKvbdZisHogCG +DoCkKvbdlqxtzTDi +DoCjjvbdRkZGUgKs +EObkKvbdZnmhdeZj +EOcLKvbdZjTHogBf +DncLKvbdhytfLqNf +EPCkKvbdnPyxvKxb +DncLKvbdjcMKqHVH +EPCkKvbduWNwjRTA +DnbkKvbdwygfGXeS +EObjjvbdTlWOaVoJ +EPCjjvbdUtNUGLvK +EObkKvbdKkAgvAKZ +EObkKvbdaMkCTUmH +EPDKjvbdOFDshhjd +EPDLKvbdhzUfLpmf +EPCkKvbdkySrTYgU +EOcLKvbdFfKSNhsq +DncKjvbdOAJTUKSA +EPDLKvbdrDeJPmvB +EPCkKvbdKRZdnfNe +EPCjjvbdRDcAoqDr +EOcKjvbdNHDQNPtk +EOcLKvbdVTmTfMVj +EOcKjvbdrXQMChyR +DoCjjvbdZQmFJNEq +EPCkKvbdWRmwadkc +EObkKvbdSCDeLhyL +DncKjvbdyNsHxTJD +EPDKjvbdtSrTYydc +DoDLKvbdiGjCxuiu +DoCkKvbdrNZjZLgi +EPDLKvbdJmADzGuB +DncLKvbdtcCuWuno +DnbjjvbdDxXktTtM +EPCjjvbddZyPxZQb +EPDLKvbdlqxtysDi +DoDLKvbdbAueGPpX +EObjjvbdVviXvDdg +EPDKjvbdBdQAvKMf +DnbkKvbdPxmAHSqj +DoDLKvbdUsltFlWK +DncKjvbdVhYWYHYz +DoDKjvbddwzTtSFz +DncLKvbdIGfzYwwg +EPCjjvbdmJDsqUrB +EPCkKvbdGQASwGey +EOcLKvbdTlWOaVoJ +DncLKvbdLFehCBRV +DnbjjvbdTkvOaVoJ +EPCkKvbdwXMAvBWV +EObjjvbdpxnhGqDx +EOcLKvbdsrqryZeD +DoDLKvbduVnXjQsA +DncLKvbdRotHKFdX +EOcKjvbdnUtyjirG +EOcKjvbdCJLCLJFj +EOcLKvbdSCEFLiYk +DoDLKvbdjcMLQgVH +DoCkKvbdLBLGlaxR +EObkKvbdZQldiNFR +EOcLKvbduMXwAsaX +DncKjvbdxrnIlrBg +EObkKvbdehKvRnRH +DoDLKvbdRosfiecw +DoCkKvbdFjdrcINV +EPCjjvbdkWWmdBxX +DnbjjvbdFkFTDHlu +DoCjjvbdTAEhgaoE +DoDKjvbdANIZTWyx +EObkKvbdJSyAsNYM +EPDLKvbdqTtHRqkU +EPDKjvbdbBVeFoow +EPCkKvbdYSkaMsoY +DncLKvbdDnbkKwDE +DncKjvbdMSWlzUpz +DncKjvbdauCHXjsh +DoCjjvbdTvMQKUBR +DoDLKvbdrRuLOLAm +EOcKjvbdatbGxKtI +DncLKvbdNGcQMotk +EPDKjvbdiCObeWqR +DoDKjvbduDDUwVno +DncLKvbdYlRcsmkm +DncKjvbdbAueFoow +EObkKvbdYTMBNToY +DncKjvbdvAdYsPEh +EObjjvbdBdQBWKMf +DnbkKvbduCbuWuno +EOcLKvbdKWVGEFHJ +EObkKvbdcyyQXxqC +DnbkKvbdaMjasUmH +EPCkKvbdmgEwlmfy +DoDLKvbdrDdiQOVa +DoDKjvbdUyIUZjnn +DnbkKvbdnBjXYOnV +EOcKjvbdRpTgJfDw +DncKjvbdjcLjqGuH +DnbkKvbdZjTIQHCG +EOcKjvbduVnYKRTA +DnbkKvbdGckWJbKK +EObjjvbdZyEJnDMS +DncKjvbdNsUWGduQ +EObjjvbdKQzEoFme +EOcKjvbdVUMtGLvK +EPDKjvbdrJAKFMoF +DoCkKvbdNrsvHFVQ +DncLKvbdSKyGUfjs +DoCkKvbdVvhxWEFH +DncLKvbdFejRnIsq +EObjjvbdVYhUZkOn +DoCjjvbdxUmEpxkn +DoDLKvbdBiLCKhej +DoDKjvbdIjEAJofd +EOcKjvbdwzHfFwdr +DncKjvbdFjeTDHlu +DnbjjvbdbiMjKewY +DnbjjvbdaNLCTUlg +EObjjvbdDwxMUUTl +DoCkKvbdmttykKSG +EPDKjvbdiUyeXSVC +EPDLKvbdWIYVwfxz +EPDLKvbdemFvgMik +DoCkKvbdUyHszKoO +EObkKvbdTXkMNzjx +DoDKjvbdSQTgKFdX +DnbjjvbdLiBkpxAS +EPCkKvbdRosgKGEX +DoCkKvbdmfdwmNgZ +DncLKvbdiHJbyViu +DncLKvbdxrnJMqbH +EOcKjvbdhlFENtcZ +DoCjjvbdbKkennDA +DnbkKvbdGckWKBjK +DnbjjvbdUyIUZkOn +EPDKjvbdeEnrCXDK +EOcKjvbdsBfMkgKy +DncKjvbdxsNiNSBg +EPDKjvbdkNCLzEgP +EPDKjvbdSKyGVGjs +DoDKjvbdrWolChyR +DncLKvbdWSNwaeLc +EOcKjvbdJYTbHkqQ +DnbjjvbdZshiZDsO +DoDKjvbdSKxfUfjs +EPCkKvbdptTgRrKt +EPCjjvbdREDApQdS +DncLKvbdtvOXjRTA +EPDKjvbdemGXGljL +EObjjvbdBdQAvJmG +EPDLKvbdhuZdwRuC +DncLKvbdjvWnDaxX +EPDLKvbdFVxopMie +EPCkKvbdajkeoNcA +EPCjjvbdSPsfifEX +DnbkKvbdBsAcTfWr +EPCjjvbdEOcLLWcE +DoCjjvbdZLrDsmlN +EPCkKvbdxnSgxTIc +EObjjvbdGQATXGey +EObkKvbdbsDLUEKB +DoCjjvbdrSVKmjaN +EPCkKvbddneTLUUS +DoCkKvbdxmrgwsJD +EPDKjvbdGYuVAdXb +DncLKvbdauBfxLTh +EPDLKvbdrMzKZLgi +EObkKvbdUsltGLvK +DnbjjvbdDxXlTstM +EObkKvbdsBfNLgLZ +DncKjvbdidjgUoAO +EPDLKvbdJJdAKQHE +EOcKjvbdbBWFFpQX +EPCjjvbdSZihTDWA +EPCkKvbdhgKCxuiu +DncKjvbddneTLUTr +DoDKjvbdczZPxZRC +DnbjjvbdlYrrTYft +DoDKjvbdWXJXvEEg +EPDLKvbdbhmJkFvx +EPCjjvbdDxYLtTsl +EPDKjvbdqdFIonVa +EObjjvbdCIjbLIej +DnbjjvbdmbKXXnmu +EPDKjvbdlZTSTYft +EPDKjvbdwXMBVaWV +DnbjjvbdSPtGjGEX +DoDKjvbdrMzKYlHi +EPCkKvbdiVZdwSVC +DnbjjvbdptUHSSKt +DncLKvbdcSbjscjB +DoDKjvbdSPsfiecw +EOcKjvbdegkVqnQg +EObkKvbdjuvmcbXw +DncKjvbdCJLCKhfK +EObjjvbdVqnYBeMD +DoCjjvbdKCjCqJcY +DncLKvbdZRMdhmEq +EOcKjvbdrRtkOKaN +DoDLKvbdRpTfiedX +DoCjjvbdRMwbZOUz +DoCjjvbdrXQMDIxq +EObjjvbdsrqsZZdc +DnbjjvbdfjfzbfAE +DoCkKvbdJSyBTMxM +EPDKjvbdnCJvwoNu +DoCjjvbdmbJvwoNu +DnbkKvbdFWZQPljF +DncLKvbdxnSgwriD +DnbjjvbdVvhwucdg +DoCjjvbdjgfkfFnL +DncLKvbdzRPMiKXA +EOcLKvbdqZPHgREY +EPCkKvbdrylPsAgn +EPCkKvbdVZITykPO +DoCjjvbdhkeEOVDZ +EOcKjvbdUVkpJtAq +EOcKjvbddCTMrAUN +EPDKjvbdZeXfzghb +EPCjjvbdiMFDmuDZ +EPCjjvbdJKEAJpHE +EOcLKvbdajkeoODA +DnbjjvbdZRNEhmFR +EOcLKvbdNHCpNQVL +EObjjvbdmRxtzSci +DoCjjvbdzRPMhjXA +DnbkKvbdnGdwmNfy +EObkKvbdvAcxsOeI +DoDLKvbdBsAcTevr +DoCkKvbdozmdKxPA +DnbkKvbdTlVoBVoJ +EPCkKvbdqwQLcIxq +DncLKvbdbiMjLGWx +DoDLKvbdfHkWRnRH +EOcKjvbdbVCGxKsh +DoCjjvbdTqRPUthN +DoCkKvbdbQGgELzd +EOcLKvbdQZNAHSrK +DoDLKvbdZyDjNbkr +EPCjjvbdqiAJdmOe +EObkKvbdKaLHNBxR +DncKjvbdyXhjBozL +EObjjvbdDjIKWYKA +EOcKjvbdLFegaaQu +EPDKjvbdZjTIPgCG +EOcLKvbdfHjuqnQg +DnbjjvbdlhcsqVRa +DoCjjvbdMuSqkNAX +DncLKvbdCIkBkIej +DncKjvbdUaCQsQqy +EObjjvbdRbDdkhyL +EOcKjvbdpssfrRkU +EOcKjvbdLGFhBaQu +EPCkKvbdqqtjnLBN +EOcLKvbdWRmwbEkc +EObjjvbdpedFTuaI +DoCkKvbdJJdAJofd +DoDLKvbdwNWANEEm +EPCkKvbdYgWdAOri +DoDLKvbdvAcyTOeI +DnbkKvbdbhmJjfWx +EOcLKvbdypnliKXA +EOcKjvbdZyEJnClS +DoCjjvbdZoNhdeZj +EPCkKvbdkDLkRGtg +EObjjvbdNsUWGdtp +DnbjjvbdZQldhmFR +EOcKjvbdYpmEhldq +EPCkKvbdZQmEiMeR +DnbjjvbdhytfLpnG +EObjjvbdmtuZkJrG +EObjjvbdGLEsDINV +EPCjjvbdVhXvYHYz +DoDLKvbdKefICAqV +DncKjvbdUtMsfLvK +EOcLKvbduaEZTOeI +EPDKjvbdddoSBwDK +DoCkKvbdffLymgHA +DnbkKvbdbAueGQQX +DnbkKvbdbrcLTcia +EPCjjvbdRbEElJYk +DoCkKvbdGFirNiTq +DoDKjvbdNdctIhkE +EPDLKvbdQccAoqES +DnbkKvbdFfKRnJUR +DnbjjvbdFfJrNiUR +EPDLKvbdCfkegAzc +EPCjjvbdRXNccMHc +DoCkKvbdZjShPgBf +EOcKjvbdSLZGUfkT +DoDLKvbdBcpAujMf +EOcLKvbduWNwiqTA +DoDLKvbdpyOgfqEY +EOcKjvbdcScKtEJa +EObjjvbdnCJwXoNu +DnbkKvbdjFLGtoAO +DoCjjvbdXrlBMsnx +EPDKjvbdhgJcZWJu +DoCjjvbdiBoDEvpq +EPDKjvbdczYoxYqC +DoDLKvbdjFLHVPAO +DnbjjvbdbPgGdLzd +DoDKjvbdWIYWYGxz +DncKjvbdhytfLpnG +EObjjvbdfHjuqnQg +DnbjjvbdmgExMmgZ +EOcLKvbdhgKDYuiu +EPDKjvbdmJEURVRa +DoDLKvbdJpyePGNe +DoDLKvbdlhdUQuRa +EObkKvbdmuUzLKSG +DnbjjvbdxwhjBozL +EPDLKvbdVZIUZjnn +EPDLKvbdJpydnfOF +EPCkKvbdqqtjmjaN +EPCkKvbdZoOJFFZj +DnbjjvbdmttzKjRf +EPDLKvbduWOXjQsA +EOcLKvbdwtleRYkn +DoCjjvbdLYpjSzuG +EObjjvbdIsYaSmYM +DnbjjvbdyzeORhJI +EOcLKvbdkWWnECXw +EPDKjvbdVviYVcdg +DoDKjvbdBcoaVjMf +DoCkKvbdiMEcmuDZ +EObjjvbdLKaHvAKZ +DncLKvbdJTZArlwl +EOcLKvbdhaoCeWpq +DncLKvbdrWpLcJZR +EObkKvbdHkaznWpk +DnbjjvbdzjVPocrt +EOcKjvbdyqPMhiwA +DoCkKvbdpstHRqkU +DnbkKvbdRkYfVHKs +DoDLKvbdVgwvYGxz +EOcKjvbdFfKSNiUR +DnbkKvbdqquLOLBN +DncKjvbdOAJTTjSA +DoDKjvbddneSkUTr +EObkKvbdlqyUysEJ +DoDKjvbdbhmKKevx +EOcLKvbdiCObdwQq +EPCkKvbdFejSNiTq +EObkKvbdwygfGYEr +EPDLKvbdsQWPKDVf +DncKjvbdjbkjpfuH +EPDKjvbdRkZFuGjs +EPDKjvbdwyhFfXdr +DncKjvbdcIlikFvx +DoCkKvbdiUydwSVC +DncKjvbdiUzFXSVC +EOcKjvbdjKFgimYS +EPDKjvbdjvXODaww +EPCkKvbdRbDdlJZL +EObkKvbdrEEhpNvB +EObjjvbdrpVoKDWG +DoCjjvbdNxPVzcnU +EPDKjvbdVgwvYHYz +DnbjjvbdmuUyjirG +EObjjvbdrSVLNkBN +DncKjvbdUWLojUBR +EOcLKvbdwygefXeS +EObkKvbdhaoDEvqR +EOcLKvbdGGKRmiUR +EOcKjvbdeEnqawDK +EPDLKvbdGGJqnItR +DoDLKvbddeOrBvbj +DnbkKvbdiVZeWquC +DncLKvbdJcJcQjDY +EPDLKvbdkDMLQgUg +EObjjvbdemFvflik +EObkKvbdwzHeewdr +DoCjjvbdHDjuiajK +DoCkKvbdrEEiPnVa +EOcLKvbdypnmJKXA +DoDLKvbdmgFXmOHZ +EObkKvbdUsmUFkuj +EPDLKvbdcScKtDjB +EPCkKvbdUyITzLOn +DncKjvbdZnnIddyj +EPCkKvbdaaVeGPow +DoCjjvbdSQTfifDw +DoDKjvbdDoDKkXCd +DncLKvbdhtzEwRuC +EObkKvbdMpXqVnGs +DoDKjvbdDncLLXCd +DoCkKvbdtcDUwVoP +DoDKjvbdtSqryZdc +EPDKjvbdbBWFGPpX +EPCjjvbdmRxtyrdJ +DoDLKvbdGckVjCJj +EObjjvbdzoPpeCkx +DnbjjvbdKWVFceHJ +EPCjjvbdSKyGVHLT +DoDLKvbdelevgNKL +DoCjjvbdTXjlNzkY +DoDLKvbdpstHSSLU +EPDKjvbdhgKCxuiu +EObkKvbdZQleJMeR +EPCjjvbdKVuGDdfi +DncKjvbdUGzmkvvF +DncKjvbdxrnJMqbH +EPCjjvbdKVuGDdgJ +EObjjvbdptTgRqjt +EObjjvbdCDpAujMf +EPDKjvbdczZQXyRC +DncLKvbdqYngfpdY +EOcLKvbdqBIeAXIE +EPDLKvbdZLrETmlN +EPDKjvbdNeEThhjd +EOcLKvbdmbKWxOnV +DoCkKvbdCDoaWKNG +EOcLKvbdEOcKkWbd +EPCkKvbdNQXpvOGs +EPDLKvbdFyUtaDxC +EPDKjvbdbLMGOnDA +DoDLKvbdJcJcQjDY +EPDLKvbdOTUWHFUp +DoCjjvbdmgFXlnGy +EOcLKvbdRDbaQRES +DoDLKvbdcyxowxpb +EPDLKvbdliEURVSB +EOcKjvbdXnRAXuWU +DoCkKvbdDnbjjwDE +DoCkKvbdKVuGEEfi +EObkKvbdyOTHxShc +EPDKjvbdySnIlqbH +DoDLKvbdHELWJbJj +DnbjjvbdyOTHxShc +DnbjjvbdczZQXxpb +EPDLKvbdZLrDsmkm +EPCjjvbdfNGWflik +EPDKjvbdmbKWwnmu +DncKjvbdrDdiPnWB +EObjjvbdHDjvKCKK +DnbkKvbdUVkojTaR +EObjjvbdptTfrSKt +EPDKjvbdFxttaEXb +DoCkKvbdjvXNcbYX +DoCkKvbdSLYfUgKs +EOcKjvbdHakzEzAD +DncLKvbdiCObdwQq +EPDLKvbdZLqdUNlN +DoDLKvbdhkeDnVCy +EPCkKvbdemFvgNKL +EObjjvbdliDtQuRa +EObkKvbdwuMdpxkn +EObkKvbdirzhrkJz +EPCjjvbdJYTahLqQ +DncLKvbdIHGyxwwg +EPCjjvbdSQUHKGEX +DoCjjvbdZshiYcsO +EOcLKvbdPyNAHSrK +EPCjjvbdbsCjscia +EObjjvbdUWLojUBR +DoDLKvbdKeehBaQu +EObjjvbdjuwODaww +DoDLKvbdtkxXAsaX +DncLKvbddneSkTtS +DnbjjvbdZtJIxcsO +DnbjjvbdJTYaTNXl +EPCjjvbdGKeTDHlu +DoDLKvbdKQydoGNe +DoDKjvbdVrOXaeLc +EPCkKvbdzHYlAMeX +DoDLKvbdBvzchdov +EObkKvbdapGgELzd +DoDKjvbdaMkBsUlg +DnbjjvbdVUNTelWK +EObjjvbdiHJcZWKV +DncLKvbdZoNheEyj +DncKjvbdDHMFgAzc +DnbkKvbdFpATXGey +EPDKjvbdMpXqWOHT +EPCjjvbdmSZVZrdJ +EPDKjvbdcIljKfXY +DoCkKvbdjcLkRGuH +DoDLKvbdGYuVBEXb +EObkKvbdWXIxWDeH +DncKjvbdQlxCZOUz +DnbjjvbdYNqAXtut +EPDLKvbdGdKvJbJj +DoDLKvbdGLFSbglu +EPCkKvbdRjxfVGkT +DoCkKvbduCbuXWOo +DoCjjvbduCbtvuno +EObkKvbdjAQGaQGj +DoDLKvbdqBJFAXHd +EOcKjvbdkClKpgVH +EOcLKvbdiMFDmtby +EPDLKvbdjvXNcbXw +EPCkKvbdxUmFRYkn +DoDKjvbdHgGyyYXg +DoCjjvbdRzJhScWA +DnbkKvbdlZTRsYgU +DnbkKvbdFVxpQNJe +EPCkKvbdZyEJmcMS +EObjjvbdZQldhmFR +EObjjvbdYSlBMtPY +DncLKvbdvBDxsOdh +DoDLKvbdvAdYrndh +DoCjjvbdZyEJmcLr +DnbkKvbdKaLGmCXq +DnbkKvbdZQmFImEq +EOcKjvbdqvolDIxq +DnbkKvbdVqnYBdkc +DoCkKvbdnPyxvLZC +EOcLKvbdmJEURUqa +DoDLKvbdfHkVrNpg +DoCjjvbdznopdblY +DoCkKvbdjvWmdCXw +EOcKjvbdunszpjnt +EObkKvbdzoPqFDMY +EObjjvbdDxXktTtM +EObjjvbdBcoaVjMf +DncKjvbdtcDVWuno +EObjjvbdpyOggQdY +DnbkKvbdwWkaWAuu +EPCjjvbdajkeoODA +EOcKjvbdKNAEZfta +EOcKjvbdZisIQHCG +DncLKvbdEXwksstM +DoDKjvbdtbbuXVoP +DncLKvbdDxYMTstM +DoCkKvbdcyyPwxpb +EPCkKvbdxmrgwsJD +DoDKjvbdYSkaNUOx +EOcLKvbdxwhjCPyk +DncKjvbdUsmTekuj +DnbkKvbdkVwOECXw +EObkKvbdnBjXYOnV +DncKjvbdcasNSATm +EPDKjvbdTAFIhCOd +DnbkKvbdkWWnECYX +DnbkKvbdFjeSbgmV +DoCjjvbdJzoewdAN +DnbkKvbdZeXfzhIb +DncKjvbdMJCLqYAS +DoCkKvbdGLFTCglu +DoDLKvbdMuSrLNAX +EOcKjvbdqceIomvB +DoDLKvbdegkVqnRH +DoDKjvbdKfGICBQu +EOcKjvbdEvYopNKF +DnbjjvbdlrZVZsEJ +DoDLKvbdqqtjmjaN +DncLKvbdQmXaxmtz +EPDKjvbdCDoaVjNG +EPCkKvbdqquLNjaN +DnbjjvbdKRZdoFnF +DoCkKvbdkVwOECYX +DncKjvbdGQATXGfZ +DncLKvbdCDpAujMf +EOcKjvbdDxXlUUTl +EPCjjvbdYkrEUNlN +DnbjjvbdZtJIyETO +DoCjjvbdXsMAltPY +EOcLKvbdxxIjCPzL +DoDLKvbdSLZFuHLT +DncKjvbdFVyQQMjF +DoCjjvbdFaOpyJzm +EPCjjvbdrJAJdmPF +EOcLKvbdMuSqjmAX +DncLKvbdEJgiuxKA +EPDKjvbdBdQAuimG +DnbjjvbdWXIxVdFH +DnbkKvbdHDkVjBjK +EPDKjvbdnHEwlmgZ +EPCkKvbdBiKbKhfK +EPDKjvbdhyuGLpnG +DoCkKvbdZsiJZDsO +DnbjjvbddBrlrAUN +DoCkKvbdYqMeIldq +DncLKvbdZLqdUNkm +EOcLKvbdMuSrKmAX +DoCkKvbdDxXksstM +EOcKjvbdqdEiPmua +DoCjjvbdOEdUJIjd +DoCkKvbdEObkLWbd +EObkKvbdfekynHHA +EPCkKvbdrEFIpNvB +DnbkKvbdnBjXXoOV +EPCjjvbdmgEwmOGy +DncKjvbdKCjDQjCx +EPDKjvbdJqZdoGOF +DncKjvbdUsmTfLuj +DoDLKvbdjcMKpgUg +EPDLKvbdSQUGjGDw +DnbjjvbdRacdlJYk +DncKjvbdYgXEAOsJ +EPCjjvbdhficZWKV +DoDKjvbdGAnpxizm +EPCkKvbdRbDeLhyL +DoDKjvbdiBncEwQq +DoCkKvbdxZgfFxFS +DoCjjvbdqvpMChyR +EObjjvbdbUbGxKtI +DoCkKvbdEObkKvcE +DnbjjvbdKQzEnfNe +DoCjjvbdRWnDblID +DnbkKvbdkxrqsYgU +DncLKvbdqwPlCiYq +EPDKjvbdSZjHsDWA +DncLKvbdEPCjjvbd +EOcLKvbdpyPIGpcx +DncLKvbdbVCGwkTh +DnbkKvbdnPzZWKxb +EObkKvbdGKeTDIMu +EOcKjvbdiifIKNYS +DncLKvbdnQZxvKxb +EPDLKvbdGFjSNiUR +DnbjjvbdRNXaxnUz +EPCjjvbdOTTvGduQ +EObkKvbdUtMselVj +DoCjjvbdnUuZkKSG +EPDKjvbdQmXaxnUz +EPCkKvbdNeDtIhjd +DncLKvbdNxOuzdOU +DncKjvbdJJdAJpGd +DoDKjvbdwuNEqYkn +DncKjvbdZMSDtOLm +DnbjjvbdNeDsiJLE +EPCjjvbdJpzEoGOF +EPCjjvbdkDLkRGtg +DoCjjvbdUWLpJtAq +EPDKjvbdfMfWfljL +EPCkKvbdrMzJyMIJ +DoCjjvbdJKEAJofd +DnbjjvbdnBiwXoNu +DoCjjvbdDihJvYKA +DnbkKvbdSZigsDWA +DoCjjvbdFejRmhsq +DnbkKvbdaMkCTVNH +EObkKvbdczZPxZRC +EPDKjvbdVZIUZjnn +DoDKjvbdkySrTZGt +DoDLKvbdsPvPKDVf +DoCkKvbdwWlBVaVu +EPDKjvbdANIZSvyx +EPCkKvbdnHFYNNgZ +DnbkKvbdNdcsiIkE +EPDLKvbdDoCkLWbd +EPDKjvbdQccBPqDr +EObkKvbdSPsfifEX +EOcKjvbdelfXHNJk +EObkKvbdFfKRmiUR +EOcLKvbdKCibqKDY +EPDLKvbdUWLpJsaR +EPCkKvbdKfFhCBQu +EOcKjvbdmuUzLJrG +EOcLKvbdBdQBVjMf +EOcKjvbdfpBzvcwh +EOcKjvbdmRyUzSci +EOcKjvbdFVxpPlie +DnbjjvbdDwwlUUUM +DncKjvbdUyHsyjoO +DoCkKvbdUslselVj +DncLKvbdmuUykJqf +DncLKvbdLFfHbApu +DncLKvbdhyuFlROG +EPDKjvbdxnTIYTJD +EPDKjvbdTulPjUAq +DoCjjvbdCDoaWJlf +DoCkKvbdbLMGOnDA +EPDKjvbdOStVfdtp +EPCkKvbdZRMeImFR +DoDLKvbdiVZeXRuC +EPDKjvbdRosfiedX +DoCjjvbdnGeYMnGy +DoCjjvbdiiehKNYS +DncKjvbdbhmKKfXY +EOcLKvbdnBjXXoNu +EPDKjvbduLwwAtAw +EOcLKvbdygYlAMeX +DoCkKvbdNsTvHEtp +EPCjjvbdsrrTYzFD +EPCkKvbdBdQAuimG +DncKjvbdmfeYMnHZ +EOcKjvbdxZhFexEr +DncLKvbdZshhyETO +EObkKvbdOFEUJJLE +DoDLKvbduDCtvuoP +EOcKjvbdGZVVBEYC +EObjjvbdZRMeJNEq +DnbkKvbdkxsRsYft +DnbkKvbdsBfNLfjy +EOcLKvbdNPxQvOHT +DnbjjvbdpstHRqkU +EOcLKvbdZQleJNFR +EPCjjvbdxVNEpxkn +DoCkKvbdwtmEqZLn +DoCkKvbdGAoQxizm +DoDLKvbdVqmwaeLc +DoDKjvbdKfGHaaQu +DoCjjvbdcJNKLGWx +EPDLKvbdrzMPsBHn +DncKjvbdfoazwDxI +EPDKjvbdZyEJnClS +DnbjjvbdwMvANDeN +EObjjvbdZshiZETO +EPDKjvbdUslselVj +DoDKjvbdwtmEpyLn +DncLKvbdJTYaTMxM +EPDKjvbdvBDxsOeI +DoDKjvbdxrmhmSCH +EPDLKvbdjJegjNYS +EOcKjvbdJvUedEgJ +DnbkKvbdVZITyjoO +DoDKjvbddePSCWbj +DncKjvbdWIXvXgYz +EPDKjvbdZQmFJMeR +DnbjjvbdqdEiPnWB +DoDLKvbdUVkojTaR +DoDLKvbdFVxpPmJe +EPCjjvbdxmsHwsIc +EPDLKvbdiiehJlxS +EPDLKvbdCTAbsewS +EPCjjvbdzoPpdbkx +DnbkKvbdijGHilxS +EPDLKvbdOYOuzdNt +EOcLKvbdTppoUuIN +DnbkKvbdcScLUDia +EOcLKvbdePFTLUTr +EOcLKvbdhgKCxvKV +EPCkKvbdrJAKFNOe +EOcKjvbdVwJXucdg +EPCkKvbdNddUJJKd +DncLKvbdJYUCHlQp +EObjjvbdkVvnDaxX +EPCjjvbdNeDsiJLE +EPDKjvbdyzeNqhJI +EPCjjvbdmIdTqUrB +EPDKjvbdZoOJFEyj +DoDKjvbduaDxsOeI +EPCkKvbdKjaIWAKZ +DncLKvbdKaLHMbYR +EOcKjvbdrafMlHKy +EPCjjvbdhtzEvqtb +EPCkKvbdddoSCXDK +EOcKjvbdzjUpPdTU +EPCjjvbdLZRJrzuG +EOcKjvbdaMjaruMg +DoCkKvbdyOSgwsJD +EPCjjvbdKDKCqJcY +EObkKvbdvAcxrneI +EObjjvbdwuMeQxkn +DncLKvbdmSZUysDi +DnbkKvbdcIlijfWx +DoDKjvbddndrjtTr +EOcKjvbdwtmEqYlO +EOcKjvbdYzcFqivZ +DnbkKvbdCDpBWJmG +EOcKjvbdaSGCgsfL +EObjjvbdIwtBhLqQ +DnbkKvbdyzdmrIIh +EPDLKvbdWexzUAOs +DncLKvbdRXNdCkgc +EOcKjvbdkVwNdBww +DncLKvbdIGfzYxYH +DoCkKvbdbAvFGPow +DoCkKvbdQlxBxnUz +DncKjvbdqrUkOKaN +EPDLKvbdZisIQGaf +DoDKjvbdsQWPJbvG +DncLKvbdjhHMFfNk +EObkKvbdwNWAMdFN +DoCkKvbdeKKRutzn +EObkKvbdJpyeOfNe +EOcKjvbdQmXayNtz +DncKjvbdnHExNNgZ +EPCjjvbdULuoBVni +DoCjjvbdqquLNjaN +EPDKjvbdyzdnSIJI +DnbkKvbdQvnDcLgc +DoCkKvbdtcDUvvOo +DnbjjvbdnGeXmNfy +DoDKjvbdxsNhmRbH +DoDKjvbdtTSSyZeD +DoDKjvbdRadFMJZL +EOcKjvbdUaCQrpqy +DoDLKvbdEJgivXjA +EOcLKvbdGFjSOItR +EPDLKvbdaSGDIUGL +DnbjjvbdJYTagkqQ +EOcLKvbdZLrDsmlN +EOcLKvbdEJgiuwjA +DoDKjvbdxUleRYlO +DnbjjvbdQwODcLhD +EObkKvbdOTUVgEtp +EObkKvbdRMwaxnUz +EObjjvbdrEFJPmua +EOcLKvbdiUzEvquC +DoDKjvbdMpYQumfs +EPCkKvbdhancEvqR +DncKjvbdkNCMZdfo +DncLKvbdZHWdAOri +EObjjvbdlrYuZrci +EObjjvbdgLGzbfAE +EObjjvbdcTCkUEJa +EPDLKvbdVAbRTRRy +DoCjjvbdYqNEiMeR +DncKjvbdBvzchdpW +DnbkKvbdtSqryZdc +EPCjjvbdwygeeweS +DoCkKvbdqlzJyLhJ +EOcLKvbdtbbtvvOo +DoDKjvbdrSVKnLAm +DnbkKvbdfMevgNKL +EObjjvbdRacdkhyL +EPCkKvbdFpASvgGZ +EPDLKvbdZoOJFEyj +EPCjjvbdzjUpPcrt +EOcKjvbdcbSlrATm +EOcKjvbdqwPkbhxq +DnbjjvbdHELVibKK +EPDKjvbdZQldiMeR +DnbjjvbdpstGqrKt +DoDKjvbdGFjRmiUR +EPCkKvbdssRsZZdc +DnbkKvbdlqxuZsDi +DncKjvbdEXwlUTtM +DnbjjvbdyzdnRhIh +EPCjjvbdkCkkRGtg +EOcLKvbdLrWlytpz +EPCkKvbdCEQAvKNG +DncLKvbdVwIxWDeH +EObkKvbduMYXBTaX +DoCkKvbdRyihTDWA +DnbjjvbdkaMoNALA +DnbjjvbdaMjartlg +DoCkKvbdNVTSKmAX +DoDLKvbddwystRez +EPCjjvbdcImJjevx +DoCkKvbdeAUQlwjG +DoDKjvbdZxcjNblS +DncLKvbdkIGlFenL +DoCjjvbdfHjurNqH +DoCkKvbdiBoDFXRR +EPDLKvbdvBDyTPFI +DnbkKvbdUxhUZkPO +EObjjvbdqZOhHQdY +EOcKjvbdSCDeLiZL +DncKjvbdozmckYPA +DncKjvbdgGLymgHA +DncKjvbdILaznWpk +EPCjjvbdqUTgSSKt +DoCkKvbdrovOjCuf +EOcLKvbdKfGIBaQu +EPDKjvbdCIjajiFj +EPCkKvbdmoyxujyC +EObkKvbdySnJMrCH +EOcLKvbdHDjujBij +EObjjvbdrMyiyMHi +DoCkKvbdiifHimXr +DnbkKvbdbsCkTcia +DnbkKvbdMfbpNPtk +EOcLKvbddoErkUTr +DncLKvbdqZOhGqDx +DnbjjvbdDncKkXCd +DoCjjvbdSCEElIxk +EPCkKvbdbUbHXjsh +DnbkKvbdCTAcUGWr +EPDLKvbdZtIiZESn +DnbjjvbdrDeJPnVa +DoCkKvbdZisIQHCG +DncLKvbdgFkzOHHA +EPCkKvbdmfdxMmfy +DncLKvbdMIbMRYAS +EOcKjvbdaogGckzd +EOcLKvbdLAkHMawq +DncLKvbdxwiJbQZk +DncLKvbdauBgYLUI +DnbkKvbdnQZxvKyC +EOcKjvbdFkEsChNV +DoDLKvbdpstGrRjt +EPDLKvbdlYrrSxgU +DnbjjvbdZQmFIldq +DoCjjvbdbhmKLFvx +EObkKvbdsBellGjy +DncLKvbduCcUwWOo +EObkKvbdJuuGEEfi +DoCkKvbdIwtCHkqQ +EPCkKvbdaMkBruMg +DncLKvbdEARiMyvw +EObjjvbdmgExNOGy +DoCjjvbdpfDdsuaI +EPDLKvbdEzspdlCi +EPDKjvbdqdFJQNua +DnbkKvbdnBjWxOnV +EPDLKvbdZisHogBf +EPCkKvbdjcMKpftg +DnbkKvbdauCGwjsh +DoDKjvbdlYrrTZHU +EOcLKvbdzjVPpDrt +DoCkKvbdQdDApQdS +DoDKjvbdehLWRmpg +EPDLKvbduoTzpkPU +DoCkKvbdliDspuRa +DoDKjvbdEXxLsssl +EObjjvbdZsiJYcrn +DoCkKvbdaaWFGPpX +DoCkKvbdrafNMHLZ +DoCjjvbdmgEwlnHZ +EPCkKvbdFkEsCgmV +DncKjvbdqmZjYlHi +DoCkKvbdfILWSORH +DoDLKvbdnCKXYOnV +DnbkKvbdHgGyyYYH +DoDLKvbdEKHjVxKA +EPDKjvbdbAueGPow +DnbkKvbdFyUuBDwb +EPDKjvbduCcUvvOo +EObkKvbdauBfxKsh +EObjjvbdZjTIPgBf +EObkKvbdNGbolpVL +EOcKjvbdeFOqbWbj +DoCjjvbdvwMAvBVu +DnbkKvbdzRPMhjXA +DncKjvbdFkErcIMu +EPCjjvbdhlFEOUcZ +DoCkKvbdJbjCpicY +EPCkKvbdZGwEAOri +DnbkKvbdNQYQunHT +DoCkKvbdkIHMFfOL +EObkKvbdHELVjBij +DoDLKvbdZQldhleR +DoDLKvbdVTmTelVj +DnbjjvbdJTZArlwl +DnbkKvbdCDpAvKMf +DoCjjvbdDxYLtUTl +DoDLKvbdwkWcgzyf +EPDLKvbdLBKgNCYR +DoDLKvbdZMSEUNkm +EOcLKvbdxUmEpxkn +EOcKjvbdGLFTDHlu +EOcLKvbdyYJKCPyk +DoCjjvbdDnbjjvcE +DoDLKvbdatbHXjtI +EObjjvbdbiMjLGWx +EPDKjvbdTYKlNzjx +EOcKjvbduDDUvvPP +EObkKvbdliETpuSB +DnbjjvbdrWolDIxq +EObjjvbdqZOggQcx +EOcLKvbdyXiKBoyk +DnbjjvbdqmZiyMIJ +EPCjjvbdULuoAuoJ +DoDLKvbdYzcGRivZ +DnbjjvbdtkwwBTaX +DnbjjvbdJbicQicY +DoCkKvbdTukojTaR +EPCkKvbdHbLydzAD +EObjjvbdVTltGLvK +EPCjjvbdUsmUFkuj +EPDLKvbdTqROuVIN +DncLKvbdYkrETnLm +DoCkKvbdeFPSBwDK +DnbjjvbdNGcPmPtk +DnbjjvbdWHwuxHYz +DoDLKvbdNUsRjmAX +EOcKjvbdZjTHpHBf +DncKjvbdWXIwvDeH +EOcLKvbdrJAKEloF +DoCjjvbdFeirOJUR +EOcKjvbdWWhwvEEg +DncKjvbdKeehBaQu +DnbjjvbdZLrDsmlN +EOcLKvbdZnnIeFZj +DoCkKvbdjKGHjMwr +EObkKvbdmIctQtqa +DoCjjvbdkClKpfuH +DnbjjvbdcTDKscia +DnbjjvbdADSYKZiQ +EObkKvbdygZMANFX +EPCjjvbdaMkCTUlg +DoDKjvbdzjVPodTU +EPCkKvbdIxTagkpp +EPCjjvbdZjSgpHBf +EOcLKvbdiCOcEvpq +EOcLKvbdsQWOibvG +DoDKjvbdEuxoomJe +DoDKjvbdmuVZkKSG +DoCjjvbdSZjITDWA +DoCkKvbdCJLBkJGK +EPCkKvbdliDsqVSB +DoCjjvbduaDxrneI +EOcLKvbdtvNxJpsA +EOcKjvbdEuyPoljF +DnbjjvbdwWlAuaWV +DncLKvbduMXvaTaX +EObjjvbddxZstSFz +EPDLKvbdmttykKSG +EPCjjvbdfIKvRnRH +DoDLKvbdjgfkeemk +DoCkKvbdHELVjBjK +EObjjvbdaRecIUGL +DnbkKvbdmSYuZrci +DoDLKvbdKfGHaaQu +EOcLKvbdIwsahLpp +EOcLKvbdEuyPomKF +DoCkKvbdsQWPJcVf +DnbjjvbdbPgHDkzd +DoDKjvbdZMSETnMN +DoDKjvbdJSyBTMwl +EPCkKvbdSCDeMIxk +DoDLKvbdtkwwBTaX +DoCjjvbdtbcVWuoP +EPCjjvbdozmdKxPA +DoCjjvbdtkwwBUBX +DoDLKvbdQdDBPpcr +DoCjjvbdJbjCpjDY +EPCjjvbdCTBDTfWr +EPDKjvbdYNqAYUut +DoDKjvbdURRPVUgm +EOcLKvbdNPwqVmfs +DoDKjvbdsCGMkgLZ +DoDLKvbdZtIiYcsO +EObjjvbdhficZWJu +EPCjjvbdTqRPUuIN +EPCjjvbdyOShXsIc +EOcLKvbdliETqVRa +DncKjvbdYqMdhmEq +DoCkKvbdKfGHbBQu +DnbkKvbdqBIeAXIE +EPDLKvbdQZNAHTRj +EObkKvbdRosgJecw +EPCjjvbdKQzEnfOF +DoDKjvbdzRPMiKXA +DnbkKvbdGcjvJbJj +DoCjjvbdbAvEeoow +DncKjvbdFVyQPmKF +EPDLKvbdRzKIScWA +EPCkKvbdKkAhWAJy +EPCkKvbdJqZdnenF +DoCkKvbdVUMtGMWK +DncKjvbdBiLBjiGK +DnbkKvbdjvWnDbYX +DnbkKvbdwuNEqYkn +DoDKjvbdegjurORH +EObjjvbdpeceTvAh +DoCkKvbdAMgySwZx +EPCkKvbdlZSqsZGt +EPDLKvbdbrbkTdKB +EPDKjvbdhzUekpnG +DncLKvbddeOqbWbj +EPCjjvbdsPunibvG +EOcLKvbdVwIxVdEg +DoCjjvbdkIHLefNk +DnbkKvbdxmrhXrhc +EPCkKvbdziuPocrt +EOcLKvbdNUsSLNAX +DncKjvbdhkddNtcZ +DoCjjvbdMpYRWNgT +EObjjvbddZxoxYqC +EOcLKvbdNVTRjmAX +EPDKjvbdZjTIQHCG +DnbkKvbdHEKvJbKK +EOcKjvbdiGibxvJu +DnbjjvbdsCGNMGjy +DoCjjvbdBhkBjhfK +EPCkKvbdSCDdkhyL +DnbjjvbdNPwpvNfs +EOcLKvbdJTZBTNYM +DncKjvbdqGEFTvBI +EObkKvbddneSjtTr +DncLKvbdqdFJPmua +EPDKjvbdrbFmMGkZ +DoCjjvbdhXZAzzAJ +EOcKjvbdkxsSSxgU +EPDKjvbdrEEhonVa +DnbkKvbdYzcGSKVy +DoCjjvbdzROmJJwA +EPDLKvbdOEdUJJKd +EPCjjvbdqquKmkAm +EOcLKvbdZyEKODLr +DnbkKvbdIsZAsMxM +DnbjjvbdZjTHofaf +DoCjjvbdrSUkOLAm +EPCjjvbdBsAbsewS +EObkKvbdUsltGLuj +EPCkKvbdANHyTWyx +EObkKvbdsBemMGjy +EObjjvbdMoxRVmfs +EPCkKvbdNGbolouL +EPDLKvbdjKGHimXr +DncKjvbdUMWPAuni +EOcLKvbdOEdUIhkE +EPCkKvbdjKGHimXr +EPCkKvbdhuZdwSVC +DoCjjvbdCIkBjiFj +EPCkKvbdxZhGFxFS +EObjjvbdOFDtJJKd +DoCkKvbdfNGWgNKL +EPDLKvbdcarmSATm +DoDKjvbdkNCMZeHP +DoDLKvbdkMakyeGo +DnbjjvbdiHJcYvKV +DnbjjvbdWWhxVcdg +EPDKjvbdVUNTelVj +DoDKjvbdZGvdAPTJ +DoCjjvbdDncLLXCd +EPDKjvbduDCuWuno +DoCkKvbdPyNAHTSK +DncKjvbdqwPlDIyR +EOcKjvbdYzbfSJvZ +DnbkKvbdRotGifDw +DoDLKvbdRDcBQRDr +DoDKjvbdEARiNZvw +DncKjvbdJSxaTNYM +EPDKjvbdVwJXvDeH +EOcKjvbdQwOECkhD +DoCjjvbdEPCkLWbd +EPDKjvbdVBBpsRSZ +EOcKjvbdddoSBwCj +EOcKjvbdFkFScINV +EObjjvbdpstGrSLU +EPDLKvbdhaoDFXRR +EPDKjvbdKfGICApu +EObkKvbdBsAcTevr +EObkKvbdhkeDmtby +DoCkKvbdqYngfpdY +EOcKjvbdsPvPKCvG +DoDLKvbduVmwiqTA +EOcKjvbdidkGtoAO +EPCkKvbdyzeORgiI +DoCkKvbdmJDsqUqa +DncLKvbdiGibyVjV +DncKjvbdhtzEwSVC +EOcLKvbdZRMdiNFR +EOcKjvbdrafMkgKy +DoDKjvbdZGwEAOsJ +EOcLKvbdjmCMZeHP +DncLKvbdjKFgimYS +EPCjjvbddZxpYZRC +DncKjvbdjmBkzEgP +EObkKvbdkIHLeemk +EPDKjvbdjAQGaQGj +DncLKvbdSPtHJfDw +DoCkKvbdGKdsChNV +EPCjjvbdrouoJbuf +EPDKjvbdlhcsqUqa +DoCjjvbdwXMBWAvV +DnbkKvbdhkdcmtby +EOcLKvbdFkEsDHmV +EOcLKvbdCIkBjhej +DoCkKvbdiLeDnVDZ +DoDLKvbdDxXlTssl +DnbjjvbdNrtVfduQ +EPCkKvbdHDkWJajK +EPCjjvbdTulQKUBR +DoDKjvbdJYUBhLpp +DncKjvbdiCOcFXRR +DoCkKvbdxsNiMrBg +EObkKvbdQlxByNtz +EPCjjvbdBhkBjiFj +EPCjjvbdNeDsiIjd +DncLKvbdBsAcTfXS +DncLKvbdDwwlUTsl +EOcKjvbdUQqPVUgm +DncKjvbdmttzKirG +EPCjjvbdKWUfEFHJ +EPCjjvbdGKdrcINV +EPDLKvbdkxrrTYgU +DoCkKvbdQdCaQQcr +DnbkKvbdvAdYroFI +EObkKvbdFxttaDwb +DnbkKvbdQdDBPqES +DncKjvbdkVwODbXw +DoCkKvbdrounicVf +EPCjjvbdBcoaVjMf +DncKjvbdcImKKevx +DoCjjvbdxLWdHzyf +EOcLKvbdcbTNSATm +EPDKjvbdRacdlJZL +EPDLKvbdZQleIleR +EPCkKvbdTfznLwWF +EObkKvbdsCFmLgKy +DoDKjvbdyqOlhiwA +EOcKjvbdtcCtwVoP +DnbjjvbdRWmdCkgc +EOcKjvbdqUTfqrKt +DnbkKvbdRyjHsDWA +DoDLKvbdYqMdiNEq +EOcKjvbdhbPCeXRR +EOcKjvbdVrNwbFLc +EObkKvbdZLqcsmkm +DoDKjvbdRWmdDMID +EPCjjvbdkWXNcbYX +DncLKvbdZyDinClS +EOcLKvbdqUTfqqjt +DncLKvbdUtNTelWK +EPDKjvbdkWWmdCXw +DoDKjvbdezuxdhtX +DoCkKvbdaSGCgtGL +EPDKjvbdVwJYWDdg +DoDLKvbdWSOYCFMD +EObkKvbdxwiJaozL +DoCjjvbdTpqOuVIN +DoCkKvbdrzLpSaHn +DnbkKvbdJutecdfi +DnbkKvbdhgKDZVjV +DncKjvbdCJKajiGK +EPCkKvbdbrcLTcia +DncKjvbdxxIibPzL +DoDLKvbdNUsRkNAX +DoCkKvbdZRMeJMdq +DnbjjvbdxsOJMqbH +DncKjvbdqAheAWhE +DoCkKvbdZnnIddyj +DoCjjvbdrpWOibuf +DoCjjvbdDxXlUUTl +EPDKjvbdZirgofbG +DnbjjvbdDnbkKvbd +EOcLKvbdoznDkXoA +DnbjjvbdozmdKxPA +DnbkKvbdfHkVqmqH +DoDLKvbdkDMLRGtg +EPDKjvbdDxXlUTtM +DoDLKvbdZLrETmkm +DoCjjvbdLAkGlbYR +DncLKvbddndsLUUS +DoCjjvbdaRfDIUFk +DnbjjvbdjJfHjNXr +DncLKvbdeFPRbXDK +DoCkKvbdJYTbIMRQ +DnbkKvbdptUGrRjt +EOcKjvbdkMbLzEfo +DoCjjvbdezuxeJUX +DoCjjvbdZMRctOLm +DoDLKvbdWWiXudEg +DnbkKvbdiiehKNXr +DoCkKvbdXrkaNUOx +EPDLKvbdZjTIQGbG +EObjjvbdeOeTLTtS +EPDKjvbdBraCsewS +EPDLKvbdLBKflaxR +DncKjvbdRzJhScWA +EPDLKvbdGKdrbhMu +DoDKjvbdFeiqmiUR +DnbjjvbdFWYooljF +DnbkKvbdUWLoisaR +EPDKjvbdfRaWzkbo +EPDLKvbdKQzEnfNe +DoDLKvbdnUtyjiqf +DnbjjvbdyNrgxSiD +EOcKjvbdjlakzFHP +DoCkKvbdjvXODaxX +DnbkKvbdLFfHaaRV +EPCkKvbdwuMeRYlO +EPDLKvbdtSqrxzEc +DncKjvbddwytTqez +EOcKjvbdZLqcsnMN +DoCjjvbdkxsSTZHU +EPDKjvbdiZtekqNf +EObkKvbdnCKWwnmu +EObjjvbdauBgYKsh +EPDKjvbdrSVKmkBN +EObkKvbdxrnImSBg +DncKjvbdZnnJEeZj +DoDKjvbdZjTIQHBf +DncLKvbdmIctRVRa +DoCjjvbdziuQQDsU +EPDKjvbdZRNFJNEq +EOcKjvbdTqRPUthN +EPCkKvbdePFSjssr +EPDLKvbdfIKuqmqH +DoDKjvbddZyQYYpb +DoDLKvbdWRmwaeMD +DoDLKvbdOYOuzcmt +DoDLKvbdxsNiNRbH +EPCkKvbdNeEThiLE +EPCkKvbdNPxQunHT +EPCjjvbduCbtvuoP +EOcLKvbdjgfkeemk +EObjjvbdjlbLydfo +DoDLKvbdxmsIXrhc +DoCkKvbdlrZVZsDi +DoDKjvbdEztRElCi +EObjjvbdBsAbsfWr +DoDLKvbdZHWdAOsJ +DnbjjvbdSCDdkhxk +EObjjvbdeFOqbWcK +EPDLKvbdZtJJZESn +EPCkKvbdKfFhBaQu +DoCkKvbdMpYQvNfs +EObjjvbdrpWOjCvG +EPDLKvbdJSxaTMxM +EPCjjvbdOSsvGduQ +DoDLKvbdtumxKRTA +EPDKjvbdBcpBWKMf +DnbkKvbdtbbuWvPP +DoDLKvbdKWUfDdfi +EPDKjvbdOStVgFVQ +EObkKvbdZnmheFZj +DoDLKvbdQwODcMID +DoDKjvbdVrNxBeMD +DoCkKvbdaSFbgsek +DoCjjvbdTvMQKTaR +DoCkKvbdZsiIxdSn +EObkKvbdakMFnnDA +DoDLKvbdJutedFHJ +EOcLKvbdhzVFlQnG +EObjjvbdzjUpQDsU +EPCkKvbdzoQQeCkx +DncKjvbdZjShPgCG +DnbjjvbdMgCpMpVL +DnbkKvbdNGbpNPuL +EObkKvbdKfFhBaRV +DnbjjvbdKQzFPFnF +EPDKjvbdCIkBkJGK +EObkKvbdmajXXnnV +DoCkKvbdNwnuzcnU +EObjjvbdauCGwkTh +DnbkKvbdbiNKKfXY +DnbjjvbdQmYCYnUz +DoDKjvbdiLddNtcZ +EOcKjvbdeEoSBwDK +DoDKjvbdcTCkUDia +DnbkKvbdZRNEhmEq +EPCkKvbdHfgZxxXg +EObjjvbdbsDLUDjB +EPDKjvbdhbPDFWqR +DncLKvbdKNADyfuB +EObkKvbdEztREkcJ +DncLKvbdbLMFnnDA +EObkKvbdZjShPgBf +DncLKvbdbVCHXkTh +DnbkKvbdqTtHSRkU +EObkKvbdfSBWzlDP +DnbkKvbdGKeTDIMu +EOcLKvbdGcjvJbJj +EPCkKvbdMowqWOHT +DncKjvbdYpmFIleR +EPDKjvbdZxcjNblS +DncLKvbdNrtVgEuQ +EOcKjvbdqrVKnLBN +DnbkKvbdatbHXkUI +DoCkKvbdEPDKkWbd +EPDLKvbdmIdURVRa +DoCkKvbdMoxRWNgT +EObjjvbdLBKflbXq +DoCkKvbdSwjkmzkY +DoDKjvbdJbicQicY +EObkKvbdNQYQumgT +DoDKjvbdxxJKCPzL +DncLKvbdnGdxNNgZ +DoCkKvbddijSVtzn +EPDKjvbdrJAJdmOe +DnbjjvbdzoQQeDLx +DoCjjvbdZRMeIldq +DnbjjvbdkHgMGGOL +DoCjjvbdaSGChTfL +EOcLKvbdCJLCKiFj +DoCkKvbdVhXvYHYz +EPCjjvbdcSbjscia +EOcKjvbdxZgeewdr +EPDLKvbdYkqdUNlN +DnbkKvbdREDApQdS +DnbjjvbdmozZVkYb +EPDKjvbdaRecITfL +DncLKvbdZyEJmbkr +EOcKjvbdZnnIdeZj +DncLKvbdeXzTsrFz +DoCjjvbdZRMdhmEq +EOcLKvbdGGJqmhtR +EPDKjvbdIidAJpHE +DncKjvbdMRwNZtpz +DncLKvbdnBiwXoOV +DoDLKvbdqYnhGqEY +EOcKjvbdWexytAOs +EOcKjvbdiZuFlQnG +EObkKvbdVAaqTRRy +EPCkKvbdTAEhgaoE +DoDKjvbdMoxQvNfs +EPDKjvbddjJqvUzn +EObkKvbdBiKajhfK +EPDLKvbdZLqcsmlN +DoCjjvbdgPazwDwh +EPCkKvbdwkWcgzzG +EPDKjvbdlYsSSyGt +EObjjvbdZLrDsmkm +DncLKvbdbsCkUDia +EObkKvbdkxrrSyGt +DnbkKvbdnBivxOnV +DoDLKvbdZirhPgCG +EObjjvbdfMevfmKL +EPDKjvbdSQTgJecw +DoDLKvbdUWMPitAq +DoDKjvbdwtleRZMO +EObjjvbdKRZdoGNe +DoCjjvbdauBgYKsh +DoDKjvbdXrlAlsnx +DncKjvbdUMVnaVni +DncKjvbdiHKDYvKV +DnbkKvbdySnJNSCH +EPCjjvbdfNGWgNKL +EOcLKvbdnQZxujxb +EObjjvbdVgwvXgYz +EOcLKvbdjKGHimYS +DnbkKvbdhanbeXQq +DncLKvbdhzUfLpmf +DoDLKvbdczZPxZRC +EPDKjvbdRNYBxnUz +EOcLKvbdlrZVZrdJ +DncKjvbdtcDUwWOo +EPCkKvbdQvmdDLhD +EPCjjvbdfMfWfljL +DoCjjvbdZyEKNbkr +EOcKjvbdgPazvcxI +DncKjvbdfNGXHMjL +DncLKvbdEKHjWXjA +EObkKvbdZjSgogCG +EPCjjvbdxnSgxShc +EPCjjvbdqrVKmkBN +EPCjjvbdbBVdepQX +DoCkKvbdrXQLbhxq +DoCjjvbdbVBfxLTh +EPCkKvbdHlBznWqL +EPDKjvbdTAEhgaoE +DnbjjvbdCfkfHAzc +DnbkKvbdptTfqqjt +EPDLKvbdWIXuwgYz +EObjjvbdrJAJeNPF +DncLKvbdKDKDRJcY +DnbkKvbdrDeIpNvB +DncLKvbdVwIwudFH +DncKjvbdICMZdzAD +EPCkKvbdsQVnjDVf +EPDKjvbdiZuGMRNf +DoDLKvbdIGfyyXwg +EPDLKvbdYORAXtut +DoCjjvbdhzVGMQnG +EPDLKvbdQwNcbkgc +EObjjvbdsBemLgLZ +DoDLKvbdZtIiYdSn +DoCjjvbdelevfljL +DoCkKvbdcyxowxqC +EPDLKvbdZMRdUNlN +EOcLKvbddZyPwyRC +EPCjjvbdZLrDsnLm +EPCkKvbdgPazwEYI +DoDKjvbdqFdEsvBI +EOcKjvbdVviXvDdg +EPCjjvbdCWzdIdov +DncKjvbdrSVKnLBN +EObkKvbdiLddNtcZ +EPDLKvbdrDdiPmvB +EPDKjvbdKDKDRKCx +DoDKjvbdtSqsZZeD +DoDLKvbdwuNFRYlO +DoCjjvbduLwvaTaX +EObjjvbdtkxXBUBX +EOcLKvbdSQTgJfEX +EObjjvbddneTKtUS +DoDLKvbdAMhYsXZx +EOcLKvbdczZPwxqC +EPDLKvbdjbkjqGtg +EOcLKvbdFkEsChMu +EObjjvbdbsCkUDia +EObkKvbdEzsqElDJ +EPDLKvbdGZUuBEYC +DoCkKvbdzROmJJwA +EPDKjvbduMXwAsaX +EPCjjvbdqwQMDJZR +DoDKjvbdqUUHSRkU +DoCkKvbdwtleQxkn +DnbkKvbdQvnEClHc +EPDKjvbdjvXNcaww +DoCjjvbdjggMFenL +EPDLKvbdJYUBhLpp +DnbkKvbdkNCLyeGo +DoCjjvbdDoCkLWcE +EOcKjvbdYqMeJNFR +EPCjjvbdRDcApQdS +EObjjvbdjblKpgVH +EPDKjvbdqqtjnKaN +DoDLKvbdwtmFRYlO +DoCjjvbdnHEwmNgZ +DncLKvbdaMjasVNH +DncKjvbdnUtzLKSG +DoDLKvbdkySrSyGt +EPCjjvbdyNsIXriD +DoCkKvbdRadFMIyL +EOcKjvbdqvokbhxq +EPCjjvbdYkrEUOLm +EPDKjvbdrpWPKCvG +DncKjvbdxUldpyLn +EObjjvbdrbFmMHKy +DoCjjvbdZHWdAPTJ +DncKjvbdEPDLKwDE +DnbjjvbdZHWdAPTJ +DoDLKvbdNrsvHFUp +DncLKvbdCTBDUFvr +EPDLKvbduDDUvuno +DoDLKvbddwystSFz +DnbkKvbdmbJvwoNu +EPCjjvbdcbTNSAUN +DnbjjvbdnVUzKjRf +EOcLKvbdYlRdUOMN +DoCjjvbdTAFIgand +DnbkKvbdpeceUVaI +DoDLKvbdlZSrTYft +EPCjjvbddePRbXDK +EOcLKvbdJqZdnfNe +EPCkKvbdRaceLhyL +EPDKjvbdLAkGlaxR +EPCjjvbdqGDdsvAh +DnbjjvbdxZgefYEr +EObkKvbdKWVGEFGi +EPCjjvbdSQUHKFdX +EPDKjvbdDxYLsssl +EPCjjvbdfHjvSNqH +EPCkKvbdQwODbkhD +EOcKjvbdZnmiFEyj +EPCkKvbdqwQMChyR +EOcLKvbdZyDimcLr +EObjjvbdjAQGaQGj +EPCkKvbdZtJJYdTO +EObjjvbdjFKgUoAO +DnbkKvbdcScLUEKB +EPDKjvbdjcMLRGuH +EObjjvbdqlzKZLgi +EOcKjvbdFfJrNiUR +EObkKvbdKaKgNBxR +EOcKjvbdHDjujBij +EObkKvbdFejSOJUR +DncLKvbdMIalRYAS +EOcKjvbdVTlsekvK +DoCjjvbdUQqOtthN +DnbjjvbdVYgtZkOn +DnbkKvbdrovOicVf +DncKjvbdKfGIBaQu +DnbjjvbdjuvnDaxX +EPDLKvbdHakzEzAD +EPDLKvbdyzdnRhIh +DoCjjvbdZGvdAPTJ +DoDLKvbdqvolChyR +DncLKvbdjlbLyeHP +EPCkKvbdmIdTptrB +EPCkKvbdQcbaPqES +DoDLKvbdddoSBwCj +DnbjjvbdjvWnECXw +DnbjjvbdZisHofbG +EOcKjvbdZQldhldq +DnbkKvbdfekymfgA +DnbjjvbdLBKgMbYR +EPCjjvbdEARiMzWw +EObjjvbdtSrTYzEc +EPDKjvbdZoOIddyj +DnbkKvbdcSbjtEKB +EObjjvbddndsKssr +DoCjjvbdxnSgxShc +EPCjjvbdOTUVfdtp +DoCkKvbdUtMselWK +DnbjjvbdJpydoGNe +DoCkKvbdGQASwGey +DnbjjvbdnGdxMnGy +EPDKjvbdHDkVibKK +DoCjjvbdtbbuXWOo +EPDKjvbdKWVGEEgJ +EObkKvbdGLEsCgmV +DoCkKvbdbrbjtEKB +EPDLKvbdRzJgrcWA +EPCkKvbdaRecITfL +EObjjvbdrbGMlHKy +DnbkKvbdZdwfzgiC +EPDKjvbdVwJXudFH +DoCjjvbdiZtekqOG +EObkKvbdqrUkOKaN +EObkKvbdySnImRbH +EObjjvbddoFTKstS +EOcKjvbdyOTHxTJD +DncKjvbdFVxoolie +DoCkKvbdFejRnIsq +EPDLKvbdptUGrRkU +EOcKjvbdajlGOnDA +EPDKjvbdrRtkOKaN +EOcKjvbdzoQQeDLx +EPCjjvbdrafMlGkZ +EPCjjvbdmpZyWKyC +DoCkKvbddBrlrAUN +DnbkKvbdMgDPlpVL +DnbjjvbdUxhTzKoO +DoCkKvbdSCDdlIyL +EPDKjvbdmbJvxPOV +EPCkKvbdNGcQMpUk +EPCjjvbdVqmxCFLc +DoDKjvbdrDdhonWB +EOcLKvbdYTLaNToY +DoCkKvbdkIGlFemk +EPDKjvbdNrsvHFVQ +EPDLKvbdrzLoraHn +EObkKvbdraelkgLZ +DoDLKvbdBdQAujMf +DncKjvbdwzIGGYFS +EOcKjvbdZeXfzhIb +DoDKjvbdbAueGPpX +DoCjjvbdZtJJYcrn +DoDKjvbdyqPNJKXA +DoCkKvbdTAFIhCPE +DoDLKvbdjblLQgVH +DoCjjvbdZtJJZDsO +EOcLKvbdrNZixkhJ +DoCjjvbdzoPpdblY +DnbkKvbdqcdhpNvB +DncKjvbdYpldhleR +DoCjjvbdmRyUysEJ +DoCjjvbdJXtBgkqQ +EOcKjvbdVwJYWDeH +DoDLKvbdZLqdUOLm +EPDKjvbdEXwlUUTl +EObkKvbdoznDkYPA +EPCkKvbdEASJNZvw +EPCjjvbdFjdsCglu +DoCkKvbdTlWPBWOi +DnbjjvbdcTCjsdKB +EObkKvbdkySrTYft +EPCkKvbdLrXMytpz +DncKjvbdZQmEhleR +EOcLKvbdHkaznWpk +DnbkKvbdHfgZyXxH +EObkKvbdpecdtWAh +DnbkKvbdRadElJYk +EPCjjvbdTXkMNzjx +DoCjjvbdmSYtzTEJ +EPCkKvbdZsiJZDsO +DncKjvbddoErkTtS +DoCkKvbdZRMdiMeR +EObkKvbdTfzmkvvF +DncKjvbdpxnhHQcx +EPDLKvbdaMjbStlg +DoCjjvbdkHfkefOL +DoCjjvbdqqtkOLAm +DnbjjvbdyzeNqgiI +EOcKjvbdiLeDnUby +DncKjvbdyYIjCPyk +EOcKjvbdpfEFUVaI +EPCjjvbdZirgpHBf +DnbkKvbdKWUecdgJ +EOcLKvbdiHKCxvJu +EPDKjvbdcTCkUEKB +EOcLKvbdaMkBsVNH +EPDLKvbdJutfEFGi +EPCkKvbdFaOqZJzm +EObjjvbdhaoCdvqR +EPCkKvbddZxpXxqC +DnbjjvbdZxcinDLr +DoDLKvbdpssfqrKt +DoCjjvbdqTsgRrLU +EPDLKvbdEYXlUTtM +EObjjvbduVmwjQsA +EOcLKvbdNPxQunHT +DnbjjvbdBhjajiGK +DoCkKvbdUGznMXVe +EPDKjvbdVwIwvEFH +EObkKvbdRMwayNtz +DoDLKvbdQZNAGrrK +EObjjvbdKWUedFGi +DoDLKvbdaNKartlg +DncKjvbduWOXipsA +EObjjvbduVmxKRTA +DoDKjvbdygZMAMdw +DoDLKvbdqTsfrRkU +DoCjjvbdEvYpQMjF +EObkKvbdNPxQunGs +EObkKvbdsZlPsAgn +DnbkKvbdZnnIddzK +EPCkKvbdNQXqWOHT +DnbkKvbdGLFSbhMu +DoDKjvbdrzMPraIO +DnbkKvbdZirgofaf +EPDKjvbdijFhJlxS +DncKjvbdWRmxBeLc +DnbkKvbduDDUvuoP +DoDKjvbdiZuGMQmf +EObkKvbdelfXGljL +EPDLKvbdfNFvfljL +DncKjvbdGKdrcINV +EObjjvbdFfJqnIsq +EOcLKvbdILaznWqL +DncLKvbdJutedFHJ +EOcLKvbdIwtBhLpp +EPDLKvbdsrrSyZdc +EPDKjvbdczZQXxpb +DncLKvbdDoCjjvcE +EPCjjvbdpxoIHREY +DoCkKvbdxxJJbPzL +EPCkKvbdVZIUZkPO +EPDLKvbdULuoBWPJ +EPCkKvbdfMfWfmJk +DnbjjvbdZtIiZETO +DoCjjvbdiMEcnUby +DoCkKvbdcyyPxZQb +DoCkKvbdZirgofaf +EObkKvbdozmdLYPA +DoDKjvbdYkrEUNkm +DoCkKvbdLqwMzVQz +EObjjvbdLFfICBRV +EObjjvbdjJehKNYS +DoCjjvbdEJgiuwjA +EPCkKvbdyqPNIiwA +EPDKjvbdNdcsiIjd +EPCjjvbdauBgXjsh +DnbkKvbdyzeORgiI +EPCkKvbdsCGNLgLZ +EObkKvbdtbbtwVno +EObjjvbdwuMdqZLn +EObjjvbdSQTfiedX +EPCjjvbdmttyjjSG +DncLKvbdnHFYMnGy +DncKjvbdxmsIXrhc +EPDKjvbdQYmAGsRj +EObjjvbdfoazvdYI +DoDLKvbdhaoDEvpq +EObjjvbdDihKVwjA +DoCjjvbdZMSDtNlN +DnbjjvbdhlFDnVDZ +EPCjjvbdiCPCdwRR +DncLKvbdULuoBVoJ +DoDLKvbdyYJKBpZk +DoDLKvbdRbDdlIyL +EOcKjvbdYSlAlsoY +DoCkKvbdySmhlqbH +EOcKjvbduWNxKRTA +DnbkKvbdFjeTDIMu +DoDLKvbdzaAPGgCM +EPCkKvbdBhkCLJGK +DnbkKvbdYpmFJNFR +EPCjjvbdQccBQQdS +EOcKjvbdqGDdtVaI +EOcLKvbdILazmvqL +EPDLKvbdajkennDA +DoDKjvbdxVMdqZLn +EPDKjvbdNPxQunGs +EObjjvbdhytfMROG +EPDKjvbdEXxLtTtM +EPDKjvbdZnnIdeZj +DoDKjvbdGKeTChNV +DncLKvbdjmCMZeGo +DnbkKvbdQwNdClHc +DncKjvbdXrlBMtOx +DoCkKvbdzaAOgHBl +DncLKvbdcIlijewY +EObjjvbdrbFllHKy +EOcKjvbdmbJwXnmu +EObkKvbdssSSxydc +DoDKjvbdSQTgKGEX +DnbjjvbdUyHtZkPO +EPCjjvbdFyUuAdYC +DoCkKvbdqFcdsvBI +EOcLKvbdqwQLbhyR +DoCkKvbdbsCkUEKB +EPCjjvbdIjEAKQHE +DnbkKvbdaNKbTUmH +EObkKvbdnCKWxPOV +EOcLKvbdZxcinClS +EObjjvbdhlFDnVDZ +DncLKvbdpyPHfpdY +EOcKjvbdTlVoAuoJ +EOcKjvbdmbKXXoOV +DoCkKvbdxsOImSBg +DncKjvbdZHXEAPTJ +DoDLKvbdDjIKVwjA +DoDLKvbdnCJvwoNu +EPCjjvbdZeYGzghb +EPDKjvbdHffzYxXg +EObjjvbdirzhrkJz +DoCjjvbdZnnJFFZj +EPDKjvbdeATqMwif +DoDKjvbdbVCHXjsh +DoCjjvbdGckVjCKK +EOcLKvbdyYJJbPzL +DoCjjvbdiCPDFWpq +EOcLKvbdIwtCILqQ +DoDLKvbdKQzFOfOF +EOcKjvbdNPwqWNgT +EObjjvbdZLqcsmkm +EPDLKvbdnPyxvKxb +DoDLKvbdKjaHvAKZ +EObjjvbdjKFgjNYS +DnbkKvbdLAkGmCXq +DoDLKvbdeEoSBwCj +DnbjjvbdHlBznXRL +DnbjjvbdKfGHbBRV +DnbkKvbdZQldiMdq +EOcLKvbdnBivwnnV +DncKjvbdsQVoKDWG +EObkKvbdypnlhiwA +EObkKvbdrykpTAgn +DoCjjvbdaMkBsUmH +EPDLKvbdRDcBPqES +DoCjjvbdpxngfpdY +EOcKjvbdEztRFLbi +EOcLKvbdcbTNSAUN +DoCkKvbdjcLjpfuH +EPCkKvbdjSzhsKiz +EPCkKvbdoAKztIDn +EPCjjvbdMgDQNPuL +DoDLKvbdKNAEZgVB +EPCjjvbdZsiJZDsO +EOcLKvbdkCkkQfuH +DoCjjvbdnGeXmNfy +DnbjjvbdrpVoJbuf +DoCkKvbduCbuWuoP +EObjjvbdSwkMNzkY +DoCkKvbdrNZiyMHi +DnbjjvbduDCtvuoP +DoDLKvbdMuSqjmAX +EObkKvbdsQVnicVf +EPCjjvbdmfeYNNgZ +DncLKvbdmIdURUqa +EPCkKvbdGBPQyJzm +EPCjjvbdZRNFImEq +DncKjvbdNddUJJLE +EObkKvbdaSFbgsek +DncKjvbdDoCkKwDE +DoCjjvbdtkxWaUBX +DncLKvbdfNGXHMjL +EPCkKvbdqTtHSSKt +DnbkKvbdxmrhXsJD +DnbjjvbdmttykKSG +EObjjvbdqcdhomua +DoCkKvbdVTlsfMVj +DnbkKvbdRECaPpcr +DnbkKvbdijFhKNYS +EObkKvbdIwsbIMRQ +EPDLKvbdJbibqJbx +EPDKjvbdxxJKCPyk +EOcKjvbdjuvnECYX +DnbkKvbdKRZePFme +DnbkKvbdMpYRVnGs +EOcKjvbdfMevgNKL +DoCkKvbdmfeXmOHZ +DncLKvbdFpATXGey +DoDKjvbdJXtCIMQp +EObjjvbdZshiZDsO +EPDLKvbdaRfDHsfL +DncKjvbdMIakqYAS +EObjjvbdSLZGUfjs +DoDKjvbdBcoaWJmG +DoDKjvbdEuxpPlie +EObjjvbdJcJbqKCx +DoCjjvbdxwhiapZk +DnbkKvbdsBemLfkZ +DoDLKvbdHgGyxwxH +EOcKjvbdQdDApRDr +EPDLKvbdKWUfDeHJ +DnbjjvbdjvXODbYX +DoDLKvbdHELWJbKK +DncLKvbdgFkynHHA +EPCkKvbdPxmAHSqj +DoDLKvbdYkqdTnLm +EPCkKvbdJYUCILpp +EOcKjvbdxwhjBpZk +DoCjjvbdiMFENtcZ +DoCjjvbdnCJvwoOV +DoDKjvbdSKxetgKs +EOcKjvbdWRmxCFMD +EOcLKvbdpedFTvBI +EObkKvbdbAvEfPow +EObkKvbdZnmiEeZj +DnbkKvbdtTSSyZeD +EPCkKvbdPxmAGsRj +EPCkKvbdVTmUGLvK +EObkKvbdJmADyfta +EOcKjvbdwWlBVaWV +DoDLKvbdjcMKqGtg +EOcLKvbdGGJrNiTq +DnbkKvbdgPazvdYI +EPCkKvbdGLEsDHmV +DnbjjvbdqceIomua +DncLKvbdjbkjpgUg +DoCjjvbdSxLLmzkY +EPDLKvbdjKGHilxS +EPDKjvbdmbJvwoNu +EPDKjvbdjmBkyeHP +EPDLKvbdzROliJwA +DnbjjvbdUaBprprZ +DoDKjvbdtbbtwWPP +DnbjjvbdURQoVVHm +DoCjjvbdjbkjqGuH +DoCjjvbdRbEFLhyL +DncKjvbdBcpAujMf +DoCkKvbdPxmAGrqj +EPDLKvbdZRMeImFR +EOcLKvbdcScKscia +EObjjvbdeXytTrFz +EPCjjvbdKfGICBQu +DncKjvbdijGIKMwr +EObjjvbdZLqctOLm +EObkKvbdSLZFuGjs +DnbjjvbdZMRcsnMN +EPCkKvbdWSOYBeMD +EObjjvbdRacdlJYk +DnbjjvbdFyVUaEXb +EObjjvbdRbEFLiYk +EObjjvbdZjTIQGaf +EPCkKvbdNsTugEtp +DoCkKvbdEASIlyvw +DoCjjvbdsrrSxzFD +DoDLKvbdQwOEDMID +EPDKjvbdaaVeGQPw +DoCjjvbdFejRnItR +EObkKvbdRacdlIyL +DnbjjvbdGGJqnIsq +DoDLKvbdGYtuBDxC +DncKjvbdbLMGPODA +EObjjvbdqYoIGpcx +DncKjvbdrykosAgn +EPCjjvbdJbjDQjCx +EObjjvbdkySqsYft +EPDKjvbdxwhjBpZk +DncKjvbdauBfwkTh +EPCkKvbdtSrSxydc +DoDKjvbdMRvmZuQz +DncLKvbdnUtyjiqf +DoDKjvbdSLYetgKs +DoDLKvbdJbjCqJcY +EPDLKvbdShyiqAAl +EPDLKvbdSQUHJfDw +EOcLKvbdijFhJmYS +EPDLKvbdvwMBWAvV +EObjjvbdeXytUSFz +EObjjvbdWXJXuceH +EPCkKvbdrDeIomvB +DncKjvbdczZQXyRC +DnbjjvbdQlxCZOUz +EPCjjvbdQccApRDr +DoCkKvbdqiAJdloF +DoCjjvbdDwwktTtM +EPCjjvbdRpUGjGEX +DnbkKvbdWfYytAPT +EPCjjvbdUMVoBVni +EObkKvbdxnShYTIc +EObjjvbdVAaqSprZ +DncLKvbdKVtfDdgJ +DoCjjvbdliEUQtqa +DnbjjvbdiGjCyWKV +DnbjjvbdqrVLOLBN +EObkKvbdUaCRSqSZ +EObkKvbdTkvPAuni +DoCjjvbdIGgZyXwg +DoDLKvbdssRsYzEc +DnbjjvbdZLqdTmkm +EPCjjvbdUtNTfLvK +DncKjvbdfMewGmJk +EOcLKvbdCTBDTfWr +EPDKjvbdFpASwGey +EPCjjvbdZLrETmkm +EPDLKvbdyXhjCQZk +DnbkKvbdeATqMxJf +DoCjjvbdjJfHilwr +EPDKjvbdzitopESt +EPDKjvbdEuxopMjF +DoCkKvbdvBEYroFI +DnbkKvbdrNZiyMIJ +EPCjjvbdxVMdpyMO +DnbkKvbdQlxCZOUz +DnbkKvbdqmZiyLhJ +DncLKvbdXnRAXuWU +EObkKvbdRadElJYk +DncKjvbdLiBkqYAS +DnbjjvbdmRyUysDi +DoDKjvbdKCicQjDY +EOcLKvbdRkZGVGjs +DoDKjvbdtSrSyZdc +EOcKjvbdRyjISbvA +EPCjjvbdHffyyYYH +EOcKjvbdaogHDkzd +EPCjjvbdidkGuPAO +EOcKjvbdCDpAujMf +DoCkKvbduVnXjQsA +DnbjjvbdTulQJtAq +DncKjvbdqTsgRrLU +DoCkKvbdzdynzdyp +EObkKvbdemGXHNKL +EOcKjvbdJXtCHlRQ +EPDKjvbdegkWRnQg +DoCjjvbdyXiKCPyk +EPDLKvbdlZTRsZHU +DoCjjvbdfNFvgNKL +DnbjjvbdbVBgYLTh +DncKjvbdcJMikFvx +EPDLKvbdUMVnaVoJ +DoCkKvbdgQBzvcxI +DoCjjvbdZtIhxdSn +EPCjjvbdRWnEDMID +EObkKvbdjlakydfo +DncLKvbdrpWOicVf +EOcKjvbdhgKDYuiu +DoDKjvbdmIdTqUqa +EPCjjvbdwtleQxkn +EObkKvbdcJNKKfWx +DncLKvbdNsUWGdtp +DoDKjvbdWSOXbEkc +EPCkKvbdpyOhHREY +DoDKjvbdkyTSTYft +EPCjjvbdFjdrbgmV +DncLKvbdrounjDWG +DoDKjvbdVTmTfLvK +EPDLKvbdSCDeLiYk +DoCkKvbdrXPlDIxq +DncLKvbdKVuGDeHJ +DnbjjvbdrWokcIxq +EObjjvbdKVuGEEfi +EPDLKvbdrbGMlGjy +EPDKjvbdlqxtzSci +EOcLKvbdwygeeweS +EObjjvbdjKGIKNYS +EObkKvbdVrOXbElD +DnbjjvbdrMzKZLgi +EPCkKvbdMpXqWNfs +EPDLKvbdrSUkOLAm +EPDKjvbdZisIPfbG +EPDLKvbdRDbaQRES +DncKjvbdVTmUGLvK +EOcKjvbdYzcGRjWZ +EObjjvbdMuSrLNAX +DncKjvbdjgflGFnL +DncLKvbdWIXvXfxz +DoDLKvbdNHComPtk +EOcLKvbdSBceLhyL +DoCkKvbdZRMeImFR +EPDLKvbdiifIKMwr +DoCkKvbdvBDxsOeI +EPDLKvbdxmsHxShc +EOcKjvbdcyyPxZRC +DoCkKvbdsBfNMHKy +DoDLKvbdaRebhTfL +DncLKvbdypoNJKXA +EObkKvbdzRPNJKXA +DnbkKvbdTvLoitBR +EOcKjvbdWHwuxGxz +EObjjvbdZHWdAPTJ +DnbjjvbdySnJMqag +EPCkKvbdtTRsYzFD +EPDLKvbdhytelQnG +EPCkKvbdTppntuHm +DnbjjvbdZeYGzhIb +EPCjjvbdIwsaglQp +DoCkKvbdpstGrRkU +EObjjvbdCJLBjiFj +EOcLKvbdePErjstS +EPDKjvbdpxnhGqDx +DnbjjvbdZyEKOClS +DoCjjvbdpyOhHREY +DncLKvbdNGcPmPuL +DoDLKvbdQwNccLgc +EPDKjvbdmbJvxPNu +DnbkKvbdQwOEDMHc +DoDKjvbdXrlAltOx +EPCkKvbdGQASvgGZ +EOcLKvbdmttykKSG +EOcLKvbdGLFSbgmV +DncLKvbduCbuWvOo +EPDKjvbdSQTfiecw +DoCkKvbdYkqctNkm +DoDLKvbdlZSqsZHU +DoDLKvbdqGEEtVaI +EObjjvbdhytekpmf +DoDKjvbdmuUzKiqf +EObjjvbdrMyiyLhJ +DoDLKvbdEARhlzWw +EObjjvbdaRfCgsek +EPDKjvbdaNKaruNH +EOcLKvbdJqZeOenF +DnbjjvbdTfzmlXVe +DoCjjvbdzQoNIjXA +EObkKvbdMpYQvNfs +DncLKvbdVrOYCElD +DoCjjvbdijGIJlwr +DoDLKvbdrXQMDIyR +EPDLKvbdEYYMUTtM +DncKjvbdkHgMFenL +DnbjjvbdqdFIpOWB +EObkKvbdqFceTvAh +EObjjvbdyOSgxSiD +EOcKjvbdDnbkKvcE +DoDLKvbdYqMeImFR +EObkKvbdwtleRZMO +EPCkKvbdrWolCiYq +EObjjvbdrXPkcJYq +DoCkKvbdtlXvaUBX +EOcLKvbdeYZssrFz +DoDLKvbdnGeYMnHZ +EObkKvbdYTLaMtOx +DoDLKvbdJcJcRKDY +EPDKjvbdeKJrVtzn +DoCkKvbdrSUkNjaN +DncKjvbdeATqNXjG +EObkKvbdqlzJyLhJ +EObjjvbdDjIJvXjA +EObjjvbdzGyMAMdw +DoDLKvbdFfJrNiTq +EOcLKvbdBhkCKiGK +EObjjvbdpssgSRjt +DncKjvbdKaLGlbXq +EOcLKvbdlYrqrxgU +EPCjjvbdVqmxBeLc +EPDLKvbdZQmFJNFR +DoCkKvbdkCkkQfuH +DncKjvbdauCGwjsh +DoCjjvbdEASIlywX +DncKjvbdLAjgNBxR +DncKjvbdCDpBVimG +EOcLKvbdqlzJxkhJ +EPDLKvbdtvNxKRTA +DnbkKvbdGLFScINV +DoCkKvbdQvmdCkhD +EPDKjvbdFjdrbhNV +EPCkKvbdZLrETnLm +EPDLKvbdTvLoisaR +EPDLKvbdsrrTZZdc +EPCkKvbdZMRcsmlN +DncLKvbdxnTHxTIc +EOcKjvbdzROliJwA +EOcKjvbdsQVnjDVf +EObkKvbdqGDdsvBI +DncKjvbdwtleQxkn +EObjjvbdTqRPUuHm +DnbjjvbdVwIwvEFH +EPCjjvbdZshhxcsO +DoCkKvbdKCibqJbx +EOcKjvbdUVlQKTaR +EObkKvbdVTmUFlWK +EOcLKvbdmIctRVRa +DoDKjvbdPIAYZAYa +DoCkKvbdjvWnDbXw +DnbjjvbdtvNwjRTA +EObjjvbdNHComQUk +EOcKjvbdySnImRbH +DoCjjvbdDjIKVxKA +DncLKvbdKefHbApu +EObjjvbdehLWRmpg +EOcLKvbdJTZAsMwl +DoDKjvbdZirgpHCG +EObkKvbdozmcjxPA +EObkKvbdsZkosAgn +EPCjjvbdSxKlNzjx +DoCjjvbdfILVrNpg +EPCjjvbdGGKRnJTq +DnbjjvbdpssgSSLU +DoDKjvbdrDdiPmvB +EPCkKvbdZtJJYcsO +DoDLKvbdNdctIhkE +EPCjjvbdcImJkFvx +EOcLKvbdGLErbhNV +DoCkKvbdnQZxukYb +EPCkKvbdWSNxBeLc +EPCkKvbdsPvOjDWG +EOcLKvbdeFOqavbj +EPCjjvbdjAQHApHK +EPDKjvbdwXMBVaVu +DncLKvbdMowqWNfs +DoCkKvbdRbEFMJYk +DoCkKvbdrNZjZLhJ +DoCjjvbduDCtwWPP +EObjjvbdNeEUJIjd +DnbkKvbdlYsRsYgU +DoCjjvbdUxgsyjnn +EObkKvbdbLMGPODA +DoCkKvbddneTKtUS +EOcKjvbdvvkaWAuu +EPDKjvbdVUNUFkuj +EObjjvbdKDKDQjCx +EPDKjvbdnUuZjiqf +DoCkKvbdsCFmMGkZ +DncKjvbdrpVnjDWG +DnbjjvbdiZtfMQmf +DoCkKvbdwWkaVaVu +DoCjjvbdSCDeLiZL +DncKjvbdEYYLtTsl +EPDLKvbdOSsufeVQ +EOcLKvbdWSOXadlD +EPDLKvbdpaJFAXHd +DncKjvbdSCDdkhyL +DoCjjvbdIMBzmvqL +DnbkKvbdVUMsfLvK +DoCkKvbdlhctQuSB +DncKjvbdJuuGEFGi +EPCjjvbdJSyAsMwl +EOcKjvbdUtMtGMVj +EPCkKvbdHDkWKCKK +DncLKvbdySnImRag +EPCjjvbdwMvAMcdm +DnbkKvbdelevfmJk +EPDKjvbdYORAYUvU +EPCkKvbdVwIxWDeH +EObjjvbdtvOXipsA +DncLKvbdhlEdOUcZ +EOcLKvbdTlVoAuoJ +EPCkKvbdNQXpunHT +EOcLKvbdWXJXvDdg +DnbkKvbdZoOJFEzK +EObkKvbdmbKWwoOV +DnbjjvbdiHKDYvKV +DncKjvbdfSBWzlDP +DoCkKvbdLBKflawq +EObkKvbdUsmUFkvK +EObjjvbdLqwNZtpz +DoCkKvbdsBfNLfjy +DncLKvbdjvWmcbYX +EObkKvbdaMkBruMg +EPCkKvbdHkazmvqL +DnbjjvbdRyjHrbvA +EPCkKvbdNQXpvOHT +EObjjvbdOYPVzcnU +DoCjjvbdaSGCgtFk +DoDKjvbdxmsHxSiD +EObjjvbdZirgogCG +EOcLKvbdmuVZkKSG +DncLKvbdUyHszKnn +DnbkKvbdxmsHxTJD +EPCkKvbdVrOYBdkc +EOcLKvbdhkdcmuDZ +DncKjvbdwuMdpyLn +EObkKvbdxVMdpxlO +EPDKjvbdmbKWwoOV +DoCjjvbdhkeDmtby +DncLKvbdLFehCBQu +DoCkKvbdYSkaNUOx +DnbkKvbdmaivxPNu +EPDKjvbdfNFvgNKL +EPDKjvbdhlEdOUcZ +EPDLKvbdTukpKUAq +DncKjvbdUVlQKTaR +DnbkKvbdYgWdAPSi +DoDKjvbdIwsbHkpp +EOcKjvbdlZTSTYgU +DoCkKvbdNHColpVL +EPCjjvbdxrmhmRag +EObkKvbdUxgsyjnn +DoCjjvbdsQVoJbvG +DoCkKvbdBdQBVjMf +EObkKvbdIHHZxxXg +EOcKjvbdJuuFdEgJ +DoDLKvbdwyhGGXeS +DnbkKvbdSKyFuGkT +DoDKjvbdiGibxvKV +DncKjvbdnBjXXoNu +DnbkKvbdFpATWffZ +EPCjjvbduDCtvvOo +EObjjvbdIsZArlxM +DncKjvbdEvYopMjF +EObjjvbdwuMdqYkn +DoCjjvbdwyhFfYEr +EPCjjvbdqUTfrSLU +EOcLKvbdzGxlANEw +EPCjjvbdEOcKjwCd +EPCkKvbdOSsvGeUp +DncKjvbdhlEcnUcZ +EPCkKvbdUVkoitAq +DnbjjvbdOAJTTjSA +DncKjvbdqmZiyLhJ +EObjjvbdpstGqrLU +EPDLKvbdFxuVAcwb +DoCkKvbdauBgYKsh +DnbjjvbdZMRcsmkm +EOcLKvbdqrVLNkBN +DoDKjvbdNQYRWNgT +DoCjjvbdCTBCtFvr +DncKjvbdZyEKNcMS +EPCkKvbdVviYVdFH +DoDKjvbdePErjtUS +EObkKvbdwtmFRZLn +DncKjvbdpedEsvAh +EPCkKvbdzoQRFClY +DoDKjvbdIxTbIMQp +DoDLKvbdxsOImSCH +EPCjjvbdYfwEAOri +EOcKjvbdnPyyWLZC +EOcKjvbdhlFEOVCy +DoCjjvbdwyhFfXdr +DnbkKvbdZQmEhleR +DnbjjvbdbAudepPw +DnbjjvbdMpXqVmgT +DncLKvbdNeEUIhjd +EObkKvbdMfbomQUk +DoCkKvbdqvpMDJYq +DoDLKvbdfekzNfgA +EOcLKvbderAvzlCo +EOcLKvbdiZtelQnG +EPDLKvbdRXNdClHc +EPDKjvbdNrsufeUp +DncKjvbdZQldiMeR +EObkKvbdiLdcmtby +DncLKvbdZQmEhleR +DncLKvbdZRNEiMdq +DncLKvbdWRmwadlD +EPDLKvbdGLEsDHlu +DncLKvbdZjTIPgCG +EObjjvbdxnTIXsIc +EPCjjvbdliETptqa +EOcKjvbdlrZUyrci +DoDKjvbdbKlFnnDA +DnbjjvbdwXLaWBWV +DoCkKvbduaEZSoFI +EPCjjvbdRyjHrbvA +EPCjjvbdLhakpxAS +DoCkKvbdmaiwXoNu +EOcKjvbdyNrhYShc +EObjjvbdsCFllGjy +DnbkKvbdZshhxdTO +DoDKjvbdZjShPfaf +EOcKjvbdmajWwnmu +EObjjvbdJvUfEFHJ +EPCkKvbdOEcsiIkE +EPCkKvbdkNBlZeGo +DoCjjvbdVviXudFH +DnbkKvbdjJfHjMxS +DoDLKvbdGBPRZJzm +EOcKjvbdiCObdvqR +DnbjjvbdVwJYWDeH +DncKjvbdGAoQxizm +EObjjvbdxmsIYSiD +DncLKvbdqqtkOLAm +EObjjvbdvvlAvBWV +DncKjvbdvAdZTPFI +EOcKjvbdjAQHAogK +EObkKvbdpxoIHRDx +EPCkKvbdffLynGgA +EPDLKvbdTvLpKUAq +EOcKjvbdmttzKjSG +DoCkKvbdqwQMChyR +DoDKjvbdrzMPsAgn +DoDLKvbdyYJKCPyk +DoCkKvbdRbEEkhxk +EPCkKvbdBdQAuilf +EPDLKvbdRaceMIyL +EOcKjvbdraelkfjy +EOcLKvbdEASIlzWw +DnbkKvbdOSsvGeUp +DnbjjvbdmuVZkJrG +DnbkKvbdVwIwvDeH +DoDKjvbdwWlAvBVu +DncKjvbdSKyFuGjs +DoCkKvbdOXnuzcmt +DncKjvbdrXPlDJZR +EPDLKvbdsBfNMGjy +EPDLKvbdiifHilwr +DnbkKvbdjvWmcbYX +DoDLKvbdZnmhddyj +EPCkKvbdemFvfmKL +EPDLKvbdNxPVzcnU +DnbjjvbdRkYfUgLT +EPCkKvbdZRMdhldq +EObjjvbdYqMdhmFR +DncLKvbdJvVGDeGi +EPDKjvbdUtMsfLuj +DoDLKvbdZyEJnClS +DnbkKvbdjcMKqGtg +EPCjjvbdDnbjkXDE +DnbjjvbdLGGICAqV +EPDKjvbdWIXvYGxz +EOcLKvbdBiLCKhfK +DnbkKvbddwzUURez +EOcLKvbdZQldiMdq +DncLKvbdKVtfEFGi +DoCkKvbdvAcxsPEh +DncLKvbdjvWmcbXw +EObkKvbdqiAJeNOe +EOcLKvbdUMWPBWPJ +EPCjjvbdOFDshhjd +EOcLKvbdVrNxBeMD +EPDKjvbdiGicZWKV +EObkKvbdtTRrxzFD +DoCjjvbdjJfHilxS +DoCjjvbdelfXGmKL +EPCjjvbdIrxaTMwl +EOcLKvbdRECaPpcr +DnbkKvbdiLeDmtby +EPDLKvbdGcjvKCJj +EOcKjvbdWWiXuceH +DoCkKvbdpstHRrLU +EPDLKvbdkHgLeemk +EPCkKvbdzGxlANEw +EObkKvbdjKGHjMwr +EPCkKvbdiUzEvquC +EOcLKvbdwXMBWBVu +EObkKvbdeKKRvUzn +DncLKvbdSBceLhxk +DoDLKvbdJbibqJbx +DncKjvbdeAUQlxJf +EPDKjvbdbUafwkUI +DoCkKvbdxnTIXriD +EPDLKvbdRacdlJYk +EOcLKvbdmgFXlnGy +EOcKjvbdHELWJaij +EPDLKvbdLhbMQxAS +DnbkKvbdhbPDFXRR +EOcKjvbdqwQMDIxq +DncKjvbdeOdrkTsr +EObjjvbdyOSgwriD +EPCkKvbdjmCLyeHP +DnbjjvbdZisHpGbG +EOcKjvbdIHGzZXwg +DncLKvbdwWkaWAvV +DoDKjvbdffLzOHHA +EPCjjvbdqZPIHREY +DoCkKvbdDjHivYKA +DoDLKvbdYNqAYVWU +EPCkKvbdzjUpPcrt +DncLKvbdlqyVZrdJ +DncLKvbdDoDLLXDE +DoCjjvbdcSbjtDia +DoDKjvbdDxXlUTsl +DncLKvbdJYTahLpp +EObkKvbdNQXqVnHT +EObjjvbdijGIJlxS +EObjjvbdOStVfdtp +EPCkKvbderBWzlCo +EObjjvbdKQzEnenF +EPCjjvbdmtuZkKRf +EPCkKvbdEJhJuxKA +EPCjjvbdgGLymfgA +EObjjvbdRbDeLhxk +EOcKjvbdrSUkNkAm +DoDLKvbdEOcLLXDE +EObjjvbdBhjbKiFj +DoDLKvbdBdQAuimG +DnbjjvbdDwwkstTl +DoDLKvbdVwJYVdEg +EOcKjvbdACqwizJQ +EObjjvbdZsiIyETO +EObkKvbdGLFSbhMu +EOcLKvbdFkFTChNV +DnbjjvbdVBCRSprZ +DoCjjvbdssRsYydc +DoCkKvbdUMWOaWOi +DoDKjvbdYSlBMsnx +EObkKvbdNsTvHFVQ +EPDKjvbdZisIPfaf +EOcLKvbdpssfqqjt +EPCkKvbdNHCpMpVL +EPDKjvbdczZPwxpb +EPCjjvbdnBivxPOV +DoDKjvbdUtNTelVj +EPDKjvbdjhHMFfNk +EObjjvbdEuyPolie +EPDLKvbdKQydneme +EPCkKvbdQvnECkgc +EPDLKvbdatbGxLTh +DoDLKvbdNPxQvOGs +DoDLKvbdySnImSCH +EObkKvbdvBEZTOeI +DoCjjvbdatagXkUI +DnbjjvbdmbKXXnnV +EOcLKvbdmbKXXoNu +EPCkKvbdNsUWGduQ +DncLKvbdpssgSRjt +EPDLKvbdiUzFXSUb +EObkKvbdyzeORgiI +EOcLKvbdKDKDQibx +DoCjjvbdmJDtQuSB +DncLKvbdaNKaruMg +DnbkKvbdOEctJJKd +EObjjvbdkVvnECXw +EObkKvbdKaLHMbXq +DoCjjvbdYzcFqiuy +DoCkKvbdvwLaWAvV +EPDLKvbdnBiwXoNu +EOcLKvbdLBKgNBwq +EPCkKvbdCJLBjiFj +EObjjvbdptUGqrLU +DoCkKvbdWXJYWEFH +EOcLKvbdNeEThiLE +EPCjjvbdtAHQhAAr +EOcKjvbdUGzmlXVe +DnbkKvbdrylPsBIO +EPCjjvbdICLzEzAD +EPDKjvbdrpVoKCuf +EPCjjvbdRkZFuGjs +Dnbjjvbdznopdbkx +DoDLKvbdmgFYNNfy +EObjjvbdptUHRrKt +DoCkKvbdhfjDZWJu +DncLKvbdLGFgbBRV +EPCjjvbdZnnIeEyj +DoDKjvbdmtuZjirG +EPCkKvbdmbJvwoOV +DncLKvbdJpydoFme +EPDKjvbdFyUtaEXb +DnbkKvbdqFcdtWAh +DnbjjvbdWRnXaeMD +EOcKjvbdCIkBkJGK +EOcKjvbdJTZBSlxM +DnbjjvbdziuPocsU +DnbjjvbdhzUelQmf +EPCjjvbdUaBqSprZ +DncLKvbdxZgefXdr +EObjjvbdKVuFdEgJ +EPCjjvbdAMgyTWzY +DnbjjvbdiHJbxuiu +DoDLKvbdUtNTekuj +EPCjjvbdUQpnttgm +DoDLKvbdVAbRTRSZ +DncKjvbdkxsSTYgU +DnbkKvbdMfbomQUk +DoCjjvbdTAEiHbOd +DoCjjvbdczZPxYpb +DnbkKvbdUVkojUBR +DncKjvbdddnqavbj +DoDLKvbdxwhiapZk +DoDKjvbdZirhPfaf +DoDKjvbdTukoitAq +DoCjjvbdrJAKFMne +EObkKvbdZQmEhmFR +DoCjjvbdHgHZyXxH +DncLKvbdNHCpNPuL +DoCkKvbdfIKvRmpg +DoCjjvbdNsUWHEtp +DoCjjvbdpfDdtWAh +DoDLKvbdBhkCKiGK +EObjjvbdtSqsYydc +EPDLKvbdQccBPqES +EOcLKvbduMXvaUAw +EOcLKvbdZMRctNkm +EObjjvbdRadFMIxk +DncLKvbdjhGlFfOL +DoCjjvbdhtzEvqtb +DnbjjvbdUtNUGMWK +EPCjjvbdaaWEfQQX +DncKjvbdunszpkOt +DoDKjvbdEJgjWYKA +DoCkKvbdQYmAGsRj +DoCjjvbdmozYujyC +DnbkKvbduVnYKRTA +DnbkKvbdZxcjNblS +EPDKjvbdzRPNIiwA +EObkKvbdzitopESt +EObjjvbdfILVrNpg +DoCjjvbdNGcPmPuL +DnbjjvbdEYXlUUTl +DnbjjvbdraellHKy +DoDKjvbdZQmEhmFR +DoCkKvbdZnnIdeZj +DnbjjvbdjcMKpgVH +EObkKvbdTfznLvue +EOcKjvbdFkErcIMu +DncKjvbdGdKvKBjK +DoCjjvbdVvhwvEFH +EPCkKvbdmJEUQuSB +DncKjvbdIsZBSlxM +DnbkKvbdmbJvxPNu +DoDKjvbdTqRPVUhN +DoDLKvbdwygefXdr +DnbjjvbdLGGHbBRV +DncLKvbddijSVtzn +EObkKvbdZnnJFFZj +EOcKjvbdCTBCsfXS +DoDLKvbdmttzKjSG +EOcKjvbdyNsIXsIc +EOcKjvbdbVBgXjtI +EOcLKvbdGFjRnJUR +DnbkKvbdYTMBMtOx +EPCkKvbdNGcQMouL +DoDKjvbdJcKDQibx +DoDLKvbdrpWOicWG +EOcKjvbdRaceMIyL +EPDLKvbdWWiYWDeH +EPDLKvbdczZQXxqC +DoDKjvbdLBKgMaxR +DnbjjvbdZjShQHBf +DoCkKvbdKaLGlbXq +DnbkKvbdGdKujCJj +EObkKvbdIBkydzAD +DnbkKvbdqUTgSRkU +EOcLKvbdBiKbKhfK +DoDKjvbdVwIwvEEg +EPDKjvbdIjEAKQHE +DoCkKvbdEPCkLWcE +DoDLKvbdrDeJQNua +EOcLKvbdNddUIhjd +EPCkKvbdYNqAXtvU +EObkKvbdUaCRSqRy +EPCjjvbdqqtjmjaN +EPDLKvbdhbOcFWpq +DoDKjvbdULvPBVni +DoDKjvbdGGJrOJTq +DoCkKvbdqceIpNvB +EOcKjvbddePSCXCj +EPCjjvbdVUNTekuj +DnbjjvbdLGGHbApu +DoCkKvbdcTDLTcia +DnbkKvbdNsUWGeVQ +EObjjvbdZLqcsmlN +EObkKvbdxrnJMrCH +DnbjjvbdqvolChxq +EPCjjvbdaNKbSuNH +DnbkKvbdlYrrTYft +EPCjjvbdwtldpyMO +DnbkKvbdNddThiKd +EPCkKvbdjJfIJlwr +EPCjjvbdJpzEoFme +DnbkKvbdiMEcmuDZ +EOcKjvbdkVvmdBww +EOcLKvbdAMgxrwZx +EObjjvbdatbGwjtI +EOcKjvbdTAEhhCOd +DnbjjvbdfNFwHNJk +EObjjvbdVBBqSpqy +EPCjjvbduaEZSndh +EPDLKvbdpstGqqkU +DnbkKvbdIwtCHlQp +DncKjvbdrbGNMGkZ +EOcKjvbdILaznWqL +DoCjjvbdTXjkmzkY +DoCjjvbdIGfyyXxH +EOcKjvbdjKFhKNXr +EPDKjvbdRDcApRES +EObjjvbdmfdxNNfy +EObjjvbdDihKWYKA +DoCjjvbdzaAOffal +EPDLKvbdQccBQQcr +EPCjjvbdTlWPAvOi +DnbjjvbdqUTfrSLU +EObjjvbdVAbRTRRy +DoCkKvbdnCKWxPOV +EOcKjvbdFjdrbhNV +DnbjjvbdrzLpTAhO +DoCjjvbdDxYMUUUM +DnbjjvbdmoyxujyC +DnbjjvbdUVkoitAq +EObjjvbdrEEhpOWB +DncKjvbdRjyGVGjs +DoCkKvbdJJdAKPgE +DoDKjvbdKDJbqKCx +EPDLKvbdcTDLUDia +DoCkKvbdePEsKssr +EPCjjvbdJbjCqJbx +DoDLKvbddBrmSATm +EOcLKvbdlhcsqVRa +EOcLKvbdKfGICBRV +EPDLKvbdrovPJbvG +DoCjjvbdbAvFGQQX +EPDLKvbdlZTSSxft +DnbjjvbdLqvmZuQz +DncLKvbdZshiYdSn +EOcLKvbduMXvaTaX +EObjjvbdZtJJYcrn +EOcLKvbdczZPwxpb +EPDKjvbdatafwjtI +EObkKvbdsQVnicWG +DnbjjvbdrWokcIyR +DncLKvbdJuteceGi +EOcLKvbdADRwiyiQ +EPDKjvbdCIkBjiFj +EPDKjvbdrNZjYkgi +DnbkKvbdSLYeuHLT +DoDKjvbdkNBkzEfo +DnbkKvbdcyxowyQb +EPDKjvbdYkrETnMN +DoDKjvbdwWlAvAvV +EPCkKvbdczZPxZQb +EPCkKvbdKCibpjCx +EOcKjvbdhytfLqOG +DnbjjvbdxmsHwriD +EPDKjvbdmfeYMmgZ +DoCkKvbdNQXpvNfs +DncLKvbdirziSkJz +EOcKjvbdHffzYxYH +EOcKjvbdWXIxWDdg +DncLKvbdVvhwuceH +DoDLKvbdFxtuBDxC +DncLKvbdJcKCqJbx +DoCkKvbdxLWcgzyf +DnbjjvbdCJLBjiGK +EPCjjvbdcasMrATm +DoDLKvbdLFfICAqV +EPDKjvbdqmZjZMHi +DncKjvbdczZPwxqC +EObkKvbdrWpMDJYq +EPCjjvbdLFehCBQu +EPCkKvbdRzJgsDWA +DoDKjvbdIsZArlxM +DncLKvbdqFcdsuaI +DncLKvbdULvPBVni +EOcLKvbdWXJXuceH +EPDLKvbdaNLCTVMg +EObkKvbdUxhUZjnn +DncLKvbdeATplxKG +DoCjjvbdmSYtzSci +EOcLKvbdkMbLzEfo +EPCjjvbdrpVoJcWG +EPCjjvbdXrlAlsoY +DoDLKvbdUxhTzKnn +EPCjjvbdOEdUJJLE +EObjjvbdKDJcRKCx +EPDKjvbdcyxpXxqC +DnbkKvbdZxdKODMS +DncLKvbdcImJjfWx +DnbjjvbdpfEFTuaI +DnbkKvbdZoNheEyj +EOcKjvbdjFKfuPAO +DnbkKvbdFVyQQNKF +DnbkKvbdDjHiuwjA +EPCkKvbdMgDPlotk +EPDKjvbdxnShXsIc +DoDLKvbdOTUVfduQ +DncKjvbdFejRnIsq +DncKjvbdSQUHJfEX +DncLKvbdRXOEDMHc +DoCkKvbdsZkosAgn +DoDKjvbdUsmUGLuj +EPDKjvbdiifIJmYS +DoDLKvbdZQmEhmFR +EObjjvbdeUAUASlv +DoDLKvbdUsltFlVj +DoCjjvbdSiZjRABM +EOcLKvbdegkVrORH +DoDKjvbdYlRdTnLm +DncKjvbdzitopESt +DnbkKvbdhbPDEwQq +DncKjvbdSKxetgLT +DncKjvbdZQmEiNFR +EPDLKvbdUyITzLPO +DnbjjvbdznpQdblY +EObkKvbdbLMFoODA +EPDLKvbdBhjbLJFj +DoDKjvbdNwoVzdOU +DncKjvbdvBDxsPEh +DnbkKvbdSBceLiZL +EPCkKvbdOhAXyAZB +EObjjvbdZisIQGbG +EOcLKvbdAMgxrvyx +EPDKjvbdCDpAvKMf +DoDKjvbdxVMdpxlO +EOcKjvbdJbicRJbx +DoCkKvbdTppnuVIN +EObjjvbdZjTIPfbG +DoCkKvbdpyOhHQcx +DoCjjvbdfHjvSOQg +DoCjjvbdzoPpdcMY +EPDKjvbdmfeYNNfy +EPCjjvbdXGYzUAPT +DoDLKvbdypnmJKXA +DnbkKvbdBsAcUFwS +DoDLKvbdQYmAGsRj +EObjjvbdUxhTyjnn +DoCkKvbdrouoKCvG +DoDLKvbdhtydwSUb +EPCkKvbddwytUSFz +EOcKjvbdrbFmLgLZ +EObkKvbdbPffckzd +EObjjvbdDxXlTtUM +DnbkKvbdqGEFTvAh +EPCjjvbdDoCkKwDE +EOcLKvbdVviYWDeH +EPCjjvbdWSOYCFLc +DncKjvbdmbKWxPNu +DoCkKvbdZshhxdTO +DoDKjvbdwtldqYkn +DoDLKvbdYSlBMsoY +EPDKjvbdRkZFuHKs +DnbkKvbdeYZstRez +DoCjjvbdrNZixlIJ +DoCjjvbdmgFXlmgZ +EPCkKvbdYlRcsmlN +DoCjjvbdOFETiJKd +EPDLKvbdBhkCLJFj +EPCjjvbdmuVZkJrG +DnbkKvbdFjeTChMu +DoCjjvbdJTZBSlwl +DnbkKvbdozmdLYPA +EObjjvbdtbbtvuoP +DncKjvbdqUTfrSKt +DncKjvbdyTOImSBg +DnbjjvbdcTCkTdKB +EOcKjvbdKaKgNCXq +EPDKjvbdZoOIeEyj +DoDKjvbdYqMeIleR +DncKjvbdnPzZWLZC +EPDLKvbdZirhPfbG +DnbkKvbdGQATXGey +EOcKjvbdZsiJYcsO +DnbkKvbdrWpMDJYq +DoCkKvbdMuTSLNAX +EObjjvbdpxnhHRDx +EOcKjvbdzitpQESt +EPCjjvbdhuZeXSUb +DoCjjvbdNeDtJIkE +DoCkKvbdCEQBWKMf +EPCkKvbdHEKvKCJj +EPCjjvbdatbHYLTh +EObkKvbdLGGICBRV +DncKjvbdRjxeuGjs +DoDKjvbdnHFYNOHZ +EObkKvbdIryAsNYM +EObjjvbdmfdwlnGy +EOcLKvbdNeDsiIkE +DnbjjvbdJTYaSlxM +DoCkKvbdRadEkiYk +DncLKvbdjKFgjNYS +EObkKvbdZjShQGaf +EOcKjvbdKfFgaaQu +DoDKjvbdhgJbyVjV +DoCkKvbdwuNFRZMO +DncLKvbdfekzNfgA +DncKjvbduCcVWuno +EPDLKvbdVrNxBdkc +DnbkKvbdRkYeuHLT +DoDLKvbdwuNEpxlO +DoCjjvbdQccAoqDr +EOcKjvbdUGzmkvvF +DncKjvbdEJhKWYKA +EOcLKvbdssSSxyeD +DoCjjvbdVviXvEEg +DnbjjvbdEuxopNKF +EObkKvbdLAkGlbXq +DoCkKvbdZsiJZESn +DoCkKvbdhkeEOUby +DnbkKvbdbhlikGXY +EObkKvbdLBLGmCYR +EPCjjvbdxUleQyLn +DncLKvbdrbGNMGjy +DoCkKvbdddoSBwDK +EPDLKvbdkyTRsYgU +EPDKjvbdehLVqmqH +EPDLKvbdrbFmMHKy +DncLKvbdmbJvwoOV +EOcLKvbdVUNUFkvK +EPDLKvbdrpWPJbvG +DncKjvbdGAnpxizm +EOcKjvbdyzeNqghh +DoDLKvbdhbPDFWpq +DoDLKvbdfVzxQJzs +DoDLKvbdUMWPBVoJ +EOcLKvbdRpTfjFdX +EPCkKvbdpfDeUWBI +EObjjvbdmuUyjirG +EObjjvbdtbbtwWOo +EObkKvbdrylPsAgn +EOcLKvbdmSYtysEJ +DncKjvbdSCDeMJYk +DoCjjvbdTppoUthN +EPDKjvbdVTmUFkuj +EObjjvbdIsZAsNXl +EOcKjvbdSBcdlJYk +DnbkKvbdZQleIleR +DnbjjvbdddoSBvcK +EOcLKvbdNHComPuL +DncKjvbdiCPCdvqR +EOcKjvbdliDspuSB +EObkKvbdzoPpeCkx +DnbjjvbdcJMijevx +DoDKjvbddZxpYZQb +DoDKjvbdkySrSxft +DoDKjvbdyXhiapZk +EPCkKvbdOAIrsirA +EObkKvbdUaBqSqSZ +EPCkKvbdZtJIyESn +DnbkKvbdTvLoitAq +EPCjjvbdyzeNrIJI +EOcKjvbdiCPDEwRR +EPCkKvbdnCJvwoNu +EPCkKvbdIGfzZYXg +DoCkKvbdkySqrxft +DoCjjvbdZdxGzgiC +DncKjvbdzitpPcsU +DncLKvbdbVCHXjsh +EPCkKvbdlhcsqVSB +EPCjjvbdGYtuAcxC +EOcLKvbdjAQGaQHK +EObjjvbdjlakzFGo +EOcLKvbdvwMAvAuu +EPCjjvbdTqQoVUhN +EPCkKvbdeEnrBwCj +DoCkKvbdsCGMkgKy +DnbjjvbdhkeDnVDZ +EPCjjvbdOFDshiLE +DnbjjvbdDwwlUTsl +EPCkKvbdKWUedEgJ +EPDLKvbdsQVnicWG +EPCkKvbdjgflFfOL +EObkKvbdQYmAHTSK +EObkKvbdSPsgJecw +EObjjvbdjAQGaPgK +DoDLKvbdDxXlUUUM +DoCjjvbdegjuqnQg +DnbkKvbddwzTsqez +DncKjvbdxxJJbPyk +EOcKjvbdGKeTChMu +DoCkKvbdeFPSCWcK +EObkKvbddeOrBwDK +EPCkKvbdaNLBsUmH +DoDLKvbdRpTgJedX +EPCkKvbdkySrSxgU +EPCkKvbdVYhTzKoO +EPCjjvbdxxIjCPyk +EPDLKvbdVrOXadkc +EOcLKvbdEOcKjwDE +DncLKvbdmfeYMnGy +EPCkKvbdVAaprprZ +EPCjjvbdFWYpQMjF +DoCkKvbdqrUjmkAm +DoCjjvbdQvmdDLhD +EPDLKvbdeATqNYKG +DnbkKvbdLGGHaaQu +EObjjvbdezvZEhtX +DnbkKvbdjuwNdBww +DncKjvbdJTZAsMwl +EPDKjvbdkxrrTYgU +EPDKjvbdbAudfQQX +DoCkKvbdVUNUGMVj +EPDLKvbdaNLBsUlg +EPDLKvbdDwxLtUUM +EPCjjvbdMgColpUk +EPDLKvbdaogGdLzd +EPDKjvbdzGxlANFX +EPCkKvbdUQqOuUgm +DoDKjvbdEPDKkXCd +EPDKjvbdbsCkTcia +EObjjvbdTAEhhBnd +EPCkKvbdhzVFkpmf +DnbkKvbdaSFcHtGL +DoCjjvbdGBOpxizm +DncLKvbdGYttaEYC +DoDKjvbdqYoHfpdY +EOcKjvbdrouoKCuf +EOcKjvbdiCPDFWqR +DnbjjvbdVAaprqRy +EPCjjvbdePFSjtUS +DnbkKvbdLGGICBRV +EPDLKvbdkMalZeHP +DoDLKvbdJutfEFHJ +DoDKjvbdVBCRSqSZ +EObjjvbdvvlBWBWV +EOcLKvbdFVxpPmJe +DoDLKvbdKfGHaaRV +DnbjjvbdBvzdIdpW +DncKjvbdNsUWHFUp +EPDLKvbdrSVLNjaN +EPDKjvbdgGMZnGgA +DnbkKvbdSBceMIyL +EOcLKvbdSBdFLiYk +EOcLKvbdRyigrcWA +EPDKjvbdaMkBruNH +DncKjvbdUaCRSpqy +DnbjjvbdIMBzmvpk +DnbkKvbdbVCGxKtI +DncLKvbdliDtQuSB +EObkKvbdHDkVjBjK +DncKjvbdmSYtyrci +DnbkKvbdxVMdpxlO +EPCjjvbdRpTfjGDw +EPCkKvbdhancEvpq +EPDLKvbdNsTvHEuQ +DoDKjvbdfekymfgA +EObkKvbdUWLojUBR +EPCjjvbdJXtBgkpp +DoCjjvbdEPCkLXCd +EPCjjvbdZxcjNcLr +DoCjjvbdZsiJYcrn +EPCkKvbdZtIiZDrn +EObkKvbduLxWaUBX +EObkKvbdZdxGzghb +EOcKjvbdkClLRHVH +EOcLKvbdFjdsDINV +DncKjvbdNeEUIiKd +EPCkKvbdYpmFJNFR +EPDKjvbdlhcsptqa +DoDLKvbdnCKWwoOV +EObkKvbdDnbkLXCd +EObkKvbdQwOECkhD +EOcKjvbdUaCRSpqy +EPCjjvbdBcoaVjNG +DnbjjvbdxmrhXsJD +EObjjvbdcImKKewY +DnbkKvbdpyOgfpdY +DnbjjvbdpyOggRDx +EObjjvbdEOcKjwDE +DnbkKvbduCcUwVoP +EOcKjvbdhgKCxuiu +DoDKjvbdiZtelQmf +DoDKjvbdnBjXYOnV +EPDLKvbdczZPwxpb +EPCjjvbdADRwizJQ +EObjjvbdfVzwpJzs +DnbjjvbdxxIiapZk +EPCjjvbdjcLkQfuH +EPCjjvbdcyyQYYqC +DoCkKvbdEuyPpNJe +DncLKvbdcJNJkGWx +DoDKjvbdZoOIdeZj +DoCjjvbdWHxVwgYz +DnbjjvbdeEoRbWbj +DncKjvbdZMSDsnLm +EOcLKvbdbiNKLFvx +DnbkKvbdjcLjqHVH +DnbjjvbdEYXktTtM +EPCjjvbdCSaCsfWr +EOcLKvbdBdQAuimG +EObkKvbdqdFIpOWB +DncLKvbdelevgNKL +EObkKvbdZMRdUNkm +EPCkKvbdrDdiQOVa +DoDLKvbdCWzdJFQW +EObjjvbdxUleQyMO +DncKjvbdBsAcTfXS +EOcKjvbdRMxBxmtz +EOcKjvbdSKyFuGkT +EPCkKvbdEuxooljF +DncLKvbdYgWdAPSi +DoCkKvbdiHJcYvKV +EPCkKvbdZQldiNFR +DncKjvbdjAPgAofj +EObjjvbdkVvmdBxX +DoDLKvbdsBfMlHLZ +DoDLKvbduWNxKQsA +EObjjvbdOTTugEtp +DoCjjvbdIxUBgkqQ +EOcKjvbdqFceUWAh +DnbjjvbdTkunaVoJ +EPDKjvbdiZtfLqOG +DoCjjvbdcImJkGXY +DncLKvbdpstGrSLU +DncLKvbdRpTfjGDw +DnbkKvbdznpREblY +DnbjjvbdqdEhomvB +DncLKvbdIwtBhMRQ +DoDKjvbdhtzFWqtb +EOcKjvbdiBncEwQq +EPDKjvbdZQleJMdq +EOcLKvbdLAkGlaxR +DoCkKvbdZsiIyDsO +EObkKvbdeOdsKssr +DnbjjvbdJcKCpjDY +EPDLKvbdSBdElIyL +EPCkKvbdyOTHwrhc +EPDLKvbdGLEsDIMu +EPCjjvbdmJETqVRa +DncKjvbdKDJbqJbx +EOcKjvbdbsCkTdKB +EOcKjvbduDCuXVno +EOcKjvbdrXPlDIxq +EOcKjvbdqlyixkhJ +EObjjvbdRkYfUgLT +EPDLKvbdLAkGmCXq +DnbjjvbdHgGzYxXg +DncKjvbdpstHSSKt +DoCkKvbdqvolCiYq +DoCkKvbdmgFYNOHZ +DnbkKvbdqGDeTvBI +DoDLKvbdyzeNrHhh +DnbkKvbdwzHefXeS +DoDKjvbdbiMjLGXY +DnbkKvbdTulQKTaR +DnbjjvbdsPunicVf +DncKjvbdqvpLcIyR +DncLKvbdOFEThhkE +EOcKjvbdZshhxdSn +DncKjvbdpyPHfpdY +DoDLKvbdNGcPmQUk +DoCkKvbdVgwvXfxz +DoCjjvbdCgLegAzc +DnbjjvbdauCGxLTh +DoDKjvbdqFceTvBI +DoCjjvbduMYXAsaX +EPCkKvbdrSVKmkAm +EObkKvbdOYOuzcnU +DncKjvbdYkqctNlN +DncKjvbdSZjHrcWA +DoCjjvbdrEFJQNua +EPCjjvbdRosfjFcw +EObkKvbdZoNiFEyj +EPDKjvbdVgwvXfxz +DoDLKvbdhbPCdvqR +DncKjvbdqvokcIyR +DnbjjvbdpssfqqkU +DncLKvbdzoPpdbkx +DnbjjvbduaDySoFI +EOcKjvbdEASImZwX +DncKjvbdbrcKtDjB +DoCjjvbdQccBQQdS +DoCkKvbdDigjVwjA +DnbkKvbdbVBfwkUI +EOcKjvbdIsYaSlxM +DoDLKvbdKVtedEgJ +EPCjjvbdIryArlxM +DncKjvbdpeceTuaI +EObkKvbdZshiYdSn +DncLKvbdZtIhyESn +DnbjjvbdOYOuzcnU +DoDKjvbdUxhTyjoO +EObjjvbdTppoVVHm +DncKjvbdrWolCiYq +DoDLKvbdNVSrKmAX +EObkKvbdiGicZWKV +DoDKjvbduVmwipsA +EPCjjvbdNPwqVnHT +EObjjvbdelewGmJk +EOcLKvbdgGLzNgHA +DoDKjvbdcJNJjfWx +DoCkKvbdyOTHwriD +EObjjvbdEzspeLcJ +DnbjjvbdjhHLeenL +DncKjvbdOStWHFVQ +EOcLKvbdsZlPsBHn +EPDLKvbdtcCuWuno +DnbkKvbdULunaVni +EPDKjvbdJqZdnfNe +EOcKjvbdqwPkcIxq +EObjjvbdrJAJeNOe +DnbjjvbdRECaPpdS +EPCjjvbdpfEEsvBI +EPDLKvbdIsZArmYM +EPDLKvbdJYUCILpp +EOcLKvbdYlSDtNlN +EPCjjvbdJYTbHkpp +EPDKjvbdYzbfSJvZ +EPCjjvbdRaceMJYk +EObjjvbdZisHofaf +DnbkKvbdRbEElIyL +EOcLKvbdijFhKNXr +EOcKjvbdRXNdDMID +DncLKvbdbiNKLGXY +DoDLKvbdlZSrSyHU +EObkKvbdqZPIHRDx +DoDKjvbdnPzYujxb +EObkKvbdnHEwlmfy +EObkKvbdCWzdIePv +EObkKvbdqlyiyLgi +EPCjjvbdkySqryHU +EObkKvbdcImKKevx +DncKjvbdEASJMzWw +DncKjvbdRkYfUfkT +EPCjjvbdqYoIGpcx +DncKjvbdGckWKBjK +EPCjjvbdYTLaNUOx +EPDKjvbdwtleRZMO +EObkKvbdGFiqnJUR +DncLKvbdlhdURVRa +EObjjvbdqlzJxkhJ +DncLKvbdFaPQyJzm +EPCkKvbdpssgRrLU +EObjjvbdiCOcFXRR +DncKjvbdqTtGqrLU +EPCjjvbdsCFlkgLZ +EOcKjvbduWOXiqTA +EOcKjvbdkClKqGuH +EPCjjvbdMowpvOGs +EPCkKvbdxrmhmRag +DoCjjvbdiUzFXRuC +EOcLKvbdUMWPAvOi +DoDLKvbdmfdwlmgZ +EPCjjvbdehKurNpg +EOcLKvbdBsAcTevr +EPCjjvbdZjTIPgBf +EObjjvbdPIAXyAZB +EPCjjvbdCDoaVjNG +DncKjvbdrpVnicVf +DoDKjvbdlZTSSxgU +DncKjvbdGZVVAdYC +EPDLKvbdsCGMkfjy +EPCjjvbdSPsfjFdX +DoCjjvbdJXsbIMQp +DncKjvbdzeZnzdyp +DnbkKvbdlYsRsYft +DncKjvbdbiMjLFwY +EPDKjvbdyOShYSiD +DoCkKvbdOTTufduQ +EPDLKvbdVwJYVcdg +DoCkKvbdGFiqnJTq +EOcLKvbdUslselWK +EObjjvbdkxsSSyHU +EOcLKvbdxsNhmSBg +DnbjjvbdqqtkOLAm +DnbjjvbdeFPRawDK +DnbkKvbdLZQirzuG +EPCkKvbdFWYpPlie +EObkKvbdrWpMCiYq +EOcKjvbdiiehKNXr +EPDKjvbdEvYopNJe +EPCkKvbdxrmhmSCH +DoCkKvbdptUHSRkU +EOcKjvbdKCjDRJcY +DoDLKvbdrMzKYkgi +DoCjjvbdZLrDtNkm +DoCkKvbdqYnggQcx +DnbkKvbdrovOibvG +DncKjvbdADRwizIp +EOcLKvbdZisHpHCG +EPCjjvbdZRNFImFR +EPDKjvbdVwIxVceH +EOcKjvbdrDeJQNua +EPCkKvbdIxTaglQp +DncKjvbdGFiqmiUR +EPCjjvbdVwJXvEEg +DnbkKvbdwuMeRZMO +EPCkKvbdZRNFImFR +EPCkKvbdnHEwlmgZ +EPDKjvbdLYqKSzuG +DoDKjvbdZsiJYdTO +DoDLKvbdShyjRAAl +DoDKjvbdRadFLiYk +DnbkKvbdjbkjpgUg +EObkKvbdUaBpsRRy +EOcKjvbdehKuqnRH +EObkKvbdDwxMUTsl +EOcKjvbdptUHSSKt +EPDKjvbdHEKuibJj +EOcKjvbdxxIjBpZk +EObkKvbdelewGmJk +DncLKvbdTvLpKUAq +EPCjjvbdGLErbhNV +DncLKvbdfHjvRmqH +DnbjjvbdkMakyeHP +EPDKjvbdJcKCpjDY +DoCkKvbdRECaPpcr +EOcLKvbdmgFYMmgZ +EObjjvbdZRMdiMeR +DoCjjvbdYzcFqivZ +DoCkKvbdeOeTKtTr +EPCkKvbdXFxytAPT +DncLKvbdZnnJEdzK +DncLKvbdhtyeWrUb +EOcKjvbdEJgivXjA +EPDLKvbdssSTYyeD +EPDLKvbdLBLGmCXq +DnbkKvbdKeegbApu +DoDLKvbdJYUBhLqQ +EPDKjvbdwNWANDdm +DoCjjvbdKfGIBaRV +DoCjjvbdbhljLFwY +DncLKvbdmgFXmNgZ +DoDKjvbdZRMeJNFR +DoCkKvbdWeyZtAOs +DoCkKvbdbiNKLFvx +EPDKjvbdUsmTfMVj +EPCkKvbdijFgjMwr +DnbkKvbdbsCjtDia +DnbjjvbdZQleJNFR +DoDLKvbdNQXqWNfs +EOcLKvbdULunaVoJ +DncLKvbdrEEhpOVa +DncLKvbdRyigsCvA +DoCkKvbdVwJYWEEg +DncLKvbdjKGIKMwr +EObkKvbdrEFIpNvB +DoCjjvbdGLEsDINV +EOcLKvbdJSyArlxM +EPCjjvbdTJZiqABM +DncLKvbdCTAbsewS +DnbjjvbdZjTIPfaf +EPCjjvbdbPfgELzd +DnbjjvbdLBLHMbXq +EPCjjvbdqiAKFMoF +DnbkKvbdIBlZdzAD +EPDLKvbdyTNiNRag +DoDLKvbdZjSgogCG +EPCjjvbdjAPgAofj +EPCjjvbdxmrgxTJD +EObjjvbdSPsgKGEX +EObkKvbdRWnDblHc +DnbjjvbdZQmFImFR +DoCjjvbdjuwODaww +EOcLKvbdVviXvEFH +EPCjjvbdcImJkGXY +EPDKjvbdVAbQrqSZ +DoCjjvbdWWiXudFH +EPDKjvbdapGfdLzd +EObkKvbdQwOEDMID +EPCjjvbdKDKCqKCx +DncKjvbdJvUfEEgJ +EObkKvbdDoDLKvcE +EOcKjvbdqwPkbhyR +EObjjvbdyTOJNSCH +EObkKvbdZsiIxdTO +DoCjjvbdaSFbhTfL +EOcKjvbdUslsekvK +DoDKjvbdehLWSORH +EPCkKvbdBsBDTfWr +DoCkKvbdMfbpNQVL +DoCkKvbdezvZFJUX +EObjjvbdJYUBhMRQ +DncKjvbdlhcsptqa +DoCkKvbdiZtfMQnG +EObkKvbdZRMdhleR +EPDLKvbdkySrSxgU +DoCkKvbdYlSDsmkm +DnbkKvbdkNBkzEfo +EPDLKvbdyYJKCPzL +EOcKjvbdqwPkbiZR +DncLKvbdqdFJQOWB +DoDKjvbdFyUtaDxC +DnbjjvbdZyDinDMS +EOcKjvbdqrVKnKaN +DoCjjvbdMgDPlotk +EPCjjvbdUVlPitBR +DoDLKvbdbsCkTcjB +EPCjjvbdnGdwlnGy +DnbkKvbdapGfdLzd +EPDKjvbddndsKtTr +DncLKvbdsrrTZZeD +EObkKvbdqdFJQOWB +DncKjvbdRadFLhxk +DnbkKvbdfILWSORH +DnbkKvbdqZOggQcx +EPDKjvbdCDpAujMf +EObjjvbdxsOImSBg +DoDKjvbdrSUjmjaN +EObkKvbdrMyjYkhJ +EObkKvbdANHySvzY +EObkKvbdgGLynGgA +DoDLKvbdNdcshiKd +EObjjvbdePErkTtS +EPCkKvbdSCEFLhxk +DoDKjvbdIxUBhLqQ +EPCkKvbdVvhxWDdg +EOcLKvbdKfGHbBQu +DoCjjvbdajlFoNcA +DoCkKvbdQdDAopdS +DoDKjvbdSBceMJZL +DoDKjvbdOStWGdtp +DoCjjvbdGdLWKBij +DnbkKvbdvOszpjnt +DncLKvbdUVlPjTaR +DoDLKvbdliDsptrB +EOcKjvbdZisHpHCG +DoDKjvbdkVwODaxX +DoDLKvbdfVzwpJzs +DnbkKvbdDjIKWYKA +EObkKvbdrJAJdmPF +EObjjvbdeATpmYJf +DnbkKvbdQmYByOUz +EPDLKvbdxmrhXsJD +EPDLKvbdCJLBjiGK +DoCkKvbdYpmFJMeR +DoDKjvbdXnRAXuWU +DoDKjvbdiMFDmtby +DnbkKvbddZyQYZQb +DncLKvbdZtIiYdSn +EObjjvbdwMvANDdm +EPDLKvbdIwsbHkqQ +DncKjvbdURQntthN +EObkKvbdTqROttgm +EPCjjvbdTkvOaVni +EOcLKvbdfNFwHNKL +EObkKvbdjgflFfOL +EObjjvbdUQqOuUhN +DncLKvbdegjurNqH +EPDLKvbdxUmEqZMO +DoDKjvbdGcjvKBjK +DoDKjvbdVTltFkuj +DnbkKvbdLYqKSztf +DoDKjvbdUyHtZkOn +EPDLKvbdvAcyTOdh +DncKjvbdqFcdsvAh +DncLKvbdrbFmMHKy +EOcKjvbdYlRdTnLm +DoCjjvbdEASJMzXX +EObkKvbdMoxQvNfs +EOcKjvbdiHJcYujV +DnbjjvbdvAcyTPEh +DoDLKvbdGQASwGfZ +EObkKvbdMoxRVnHT +EObkKvbdhgJcYvJu +DnbjjvbduWOXipsA +DoDLKvbdQcbaQQdS +EObkKvbdUsltFkvK +EPDKjvbdKyQirzuG +EPCjjvbdmJDtQuSB +EObkKvbdXrkaMsoY +EOcKjvbdrEFIpOVa +EPDKjvbdVqmwadkc +EOcKjvbdqYoIGqDx +EObkKvbdtbbtwWOo +EPCkKvbdSKxfUfkT +EPCkKvbdmJDsqUrB +DncKjvbdhaoCeWpq +EObjjvbdFxuVAdYC +EPCkKvbdqFcdsvBI +EPDLKvbdOTUWGeVQ +EPCkKvbdlhdUQtrB +DoDKjvbdCJLCLJGK +EPDKjvbdMgCpMotk +DnbjjvbdrbFlkgLZ +DoDKjvbdqBJFAWhE +EPCjjvbdpyPHfqDx +EOcKjvbdTlVoBVni +EPCjjvbdrRtkNkBN +EPCkKvbdWWhwuceH +EPDKjvbdcImKKewY +EOcKjvbdYSlBNToY +EObkKvbdZRMeIldq +EPDLKvbdMoxRWNgT +EObjjvbdMIbMQxAS +EPCjjvbdQdDBQQdS +EObkKvbddZyPwxqC +EOcLKvbdACrXiyiQ +EPDLKvbdcSbkUEJa +DncLKvbdTkunaWPJ +DnbjjvbdvBEYrndh +EObjjvbdmIctQuRa +DncKjvbdiUydvqtb +DoCjjvbdhkdcnUby +EOcKjvbdePFTLTsr +EOcLKvbdiHJbxujV +EObjjvbdZsiJZESn +EOcKjvbdpxoHfqEY +EPDKjvbdFyUuBDwb +DoDLKvbdBiLBkJGK +EPCkKvbdliDtQuRa +DoDKjvbdhbOcEwQq +DncLKvbdRosgJfDw +EObjjvbdrzMQSaIO +EObkKvbdUsmTfMVj +EOcKjvbdWXIxWEFH +EPCjjvbdcTCjtDjB +EObkKvbdbBVeGQPw +EOcLKvbdaSGDHtFk +DoDLKvbdqFdFUVaI +EPCkKvbdxxIjBozL +DncLKvbdNddUIiLE +EObjjvbduMYWaUAw +EPCkKvbdWWiXvDdg +EObjjvbdJXsbILqQ +DnbkKvbdDnbjjwCd +DnbkKvbdxUldqZMO +DoCjjvbdKyRKSztf +DncLKvbdLFehBaQu +EPDLKvbdjvXNdBww +EOcLKvbduaEZTPFI +DoCkKvbdfMevfmKL +EPCkKvbdpxoIGqEY +EPCkKvbdKWUecdgJ +EObkKvbdmbJwYOmu +EPCkKvbdIsZArmYM +DnbjjvbdxLXDgzyf +DncLKvbdEvYopMjF +DncLKvbdmJETqVRa +DnbkKvbdrouoKDWG +EPDLKvbdbVCGwkTh +DoDKjvbdZirhPgCG +EPDKjvbdTvMQKUAq +DnbkKvbdLrWlzVQz +EOcLKvbdrEEiPmua +DnbjjvbdczZQXyRC +DncKjvbdnUtzKjSG +EPCjjvbdkNCLzFHP +DncKjvbdZyEKNbkr +EObkKvbdJuuFdEgJ +DncLKvbduCbuXWPP +EPCjjvbdyNrhXriD +DnbkKvbdIxTaglQp +EPCjjvbdJvVFceHJ +EPCkKvbdVBBprqSZ +EOcKjvbdkxrqsYgU +EPCjjvbdGLFSbhMu +EObjjvbdnPzZWLYb +EObkKvbdjblLRGuH +DoDLKvbduaDyTPFI +EPCjjvbdiifIJmXr +EObkKvbdYkqctOMN +EPCkKvbdelfXHMjL +EPDLKvbdeFOrCWbj +EObjjvbdeUAUATNW +EPCjjvbdWRmxBeMD +DoCjjvbdZxcinDMS +EOcLKvbdWRmwbElD +DoDLKvbdpssfrSLU +DncLKvbdQccApRES +DoDKjvbdGdKujBij +DoDKjvbdZLqdTmlN +DoCjjvbdbiNKLGXY +DoCjjvbdVZITzKoO +DoCkKvbdsPuoKCvG +EPDKjvbdNGbomQVL +DnbkKvbdkIHMGFnL +EPDKjvbdvPTzpjoU +EOcKjvbdczZPxZQb +DncKjvbdliEURUrB +DnbkKvbdGZUtaDxC +EPCjjvbdrMyjZLhJ +EPCjjvbdTulPjTaR +DoCkKvbdZeYGzhJC +DncLKvbdwygefYEr +DnbjjvbdehLVrOQg +DnbjjvbdZxcjNblS +DoCjjvbdSLYetgKs +EPCkKvbdVAbQrpqy +EPCjjvbdtTSTZZdc +DnbkKvbdSCEFMIyL +DoDKjvbdrDeJPmvB +EOcLKvbduDDVXVno +DoDLKvbdZdxGzhIb +EObkKvbdhgJbxujV +DncLKvbdlYsRsZHU +DoDLKvbdhzUelQmf +EObkKvbdWWhwvDeH +EPCjjvbdjgfkfFmk +EObkKvbdzaAPHGal +DoDLKvbdEPDLLXDE +DoCjjvbdTukpKTaR +EOcKjvbdhaoCeWpq +EPDKjvbdwjvdHzzG +EPDLKvbdJTZBTNYM +DoDLKvbdRECaPqDr +DncKjvbdjhGkfGNk +EObkKvbdjhGkfFmk +DncLKvbdqlyixkhJ +EObkKvbdjEkHUoAO +EPCkKvbdcasMrAUN +EObjjvbdhzUfLqOG +DoCkKvbdEvYopNKF +EPCjjvbdjuwODaxX +DncLKvbddiirWUzn +EObkKvbdOStVfduQ +DnbjjvbdypnmIjXA +DnbjjvbdRWnEClHc +EOcLKvbdbhljLFvx +EPDLKvbdJXsaglRQ +EObkKvbdhzUfLqOG +EObkKvbdnPyxujyC +DoDKjvbdBiKajiFj +DoDKjvbdZjTHpHBf +EPCjjvbdaSFcITek +EObjjvbdYzcFqiuy +DncLKvbdqdFIpNvB +DoDKjvbdLYqJrzuG +DoDLKvbdVwJXucdg +DnbjjvbdhbObdvqR +DoCkKvbdCEQBWJlf +DoDLKvbdSCDdlJYk +EPDLKvbdZyEJnCkr +DoDKjvbdvAcyTOeI +DoDKjvbdkIHLfFmk +EPCjjvbduaEYroFI +DnbkKvbdjblKpgUg +EOcKjvbdwygefYFS +EOcKjvbdliDsqUqa +DnbjjvbdjcMLRGtg +EObkKvbdRbEElJYk +EPCkKvbdqrUkNjaN +EOcLKvbdRotGifDw +DnbkKvbdUsmUGLuj +DoCjjvbdeKJqvUzn +EPDKjvbdQwNdClHc +EOcLKvbdcScLTcjB +DoCjjvbdvBDxroEh +DoDLKvbdIxUBglQp +EPDLKvbdfVzxQJzs +DncLKvbdqlzKYlIJ +DoDKjvbdaNLCSuMg +EOcKjvbdwjwDgzyf +EPDKjvbdIxTaglRQ +DoDKjvbdVTltGLuj +DoCkKvbdiMFENuDZ +EOcLKvbdZyEJnDMS +DnbkKvbdiBoCeXRR +EPCkKvbdbiMijewY +EOcKjvbdmttzLJqf +DncKjvbdYTLaMtOx +EPCjjvbdfIKuqmqH +DoCjjvbdBdQBVjNG +EObkKvbdieLGuPAO +EPDLKvbdsZlQSaIO +DnbkKvbdEztQeMDJ +EPCjjvbdIjEAJpHE +EOcLKvbdfILWRmpg +EPCjjvbdZyDinDLr +DncKjvbdLGGIBaRV +DncLKvbdmozZWLZC +DoCkKvbdlZSrSxft +EOcLKvbdFjdrcINV +EOcKjvbdQvnDblHc +DoCkKvbdqUUHRqkU +EPDKjvbdnBjWwnmu +DoCjjvbdZxcjNbkr +DncKjvbdZisIQHCG +DoCkKvbdJcJcRJbx +EPDLKvbdlhdUQtqa +DnbkKvbdrzLpSaHn +DoDKjvbdziuPpDrt +EPDKjvbdEYXlTtUM +EObkKvbdqdFIpOVa +DncKjvbdpxnhHQdY +DnbkKvbdLhakqYAS +EPCkKvbdrRtkNkBN +EObkKvbdqrVKmjaN +EOcKjvbdxUldqZMO +EOcKjvbdrbFllHKy +DoCkKvbdySmhlrBg +EPCkKvbdkxrqsYgU +EPCkKvbdZLqcsnMN +DncKjvbdFpATXHFy +EPDLKvbdZRMdiMeR +EPDLKvbdRNXbYmtz +DoCkKvbdpyPIGqEY +DoDLKvbdKaKfmCYR +EPDLKvbdrylPsBIO +EObjjvbdUQqOuVHm +EPCkKvbdezvZFItX +EOcKjvbdZirhQHCG +DoDKjvbdePFSjssr +EOcKjvbdCTAcTfXS +EOcKjvbdkxsRsYft +EPDLKvbdQwODcMHc +DoDKjvbdwuNFRZMO +EPCjjvbdEuyPomKF +DoCkKvbdpxnhGpcx +DncKjvbdiVZeWrUb +EOcKjvbdrEEiPmvB +EOcLKvbdZxdJnDLr +EObjjvbdUtNUFkvK +DoDLKvbdZQmFIldq +EObjjvbdnCJvwnmu +EPCkKvbdRWmccLgc +DnbkKvbdnUtykJqf +DnbkKvbdVBBqSpqy +EPCkKvbdZoOIddyj +DnbkKvbdZQldiNFR +DncLKvbdmRyVZsDi +DoCjjvbdcasMrATm +EOcLKvbdtbbtvuno +DoDLKvbdZtJJYdSn +DnbkKvbdGKeTDHlu +DoCkKvbdZjTHpGbG +EOcKjvbdHDjvKCKK +EObjjvbdddnqbXCj +EObkKvbdlZTSTYgU +EPCjjvbdqqtjmkBN +EObjjvbdtAGqIAAr +EObkKvbdrRtjmjaN +DnbjjvbdMRwMytpz +EPCkKvbdsQWPJbuf +DoDKjvbdqFceUWBI +DoCkKvbdnBjWxPNu +DoDLKvbdiUzFXRuC +EObkKvbdQccBPqES +DnbjjvbdOFDtIiLE +EPDKjvbdYlRcsnMN +DncKjvbdFfJrNhsq +DoCkKvbdsCFmMHKy +EPDLKvbdYkrETnMN +DoCjjvbdYNqAXuWU +EPDKjvbdrovPKDWG +DoDLKvbdbKlGOmcA +DoCkKvbdOStWHFVQ +EObjjvbdhbObeXQq +EPCjjvbdeEnrBwDK +DoDLKvbdrbFmMGkZ +DncKjvbdxZhGGYFS +EPDKjvbdbrbkTdKB +EPDKjvbdraellGkZ +EPCkKvbdssSTZZeD +EPDKjvbdDjHiuxKA +DoCjjvbdzoPqFDMY +EPCjjvbdlAlnmALA +DoDKjvbdmtuZjjRf +DoDKjvbdFpASvfey +DoCkKvbdjlakyeGo +DoDKjvbdxnSgxTIc +EPCjjvbdxZhFfXeS +EPCkKvbdqcdiPnVa +EOcLKvbdmfeYMnHZ +DoDLKvbduCbuWvOo +DoDKjvbdmIcsqUqa +EPDKjvbdzoQQdblY +DoDLKvbdRNXayOUz +DnbjjvbdrJAKFNOe +DnbjjvbdZLrEUOMN +EOcKjvbdwygeexEr +EPCkKvbdbVBfwjtI +EObkKvbdKDKDRJbx +DoCkKvbdGckWKBij +EOcKjvbdzjVQPdSt +EPDLKvbdqlzKYkhJ +DnbjjvbdajkennDA +DoDLKvbdRzJgsCvA +EObjjvbdehKuqmqH +DncKjvbdajlFnnDA +DnbjjvbdjEkHUoAO +DoCjjvbdFVyPomKF +DoCkKvbdJcJbpjCx +DnbkKvbdRaceLiZL +EPDKjvbdeEnrBwDK +DoDLKvbdxKvdHzyf +DoCkKvbdSPtHKFcw +EObkKvbdjhHMGGOL +EOcLKvbdGGJqnItR +DoCjjvbdnGdxNNgZ +DoDKjvbdbKkfOmcA +DnbjjvbdelewHNKL +EPCkKvbdcSbjsdJa +EPCkKvbdTAEhgbOd +DncLKvbdUslselVj +DnbjjvbdVrOYBeMD +EObjjvbdEzspeMDJ +EPCjjvbdcTDLTcjB +EPDLKvbdsPvPJbuf +EOcKjvbdqGEFUWBI +EPDKjvbdVgxWYGxz +EOcLKvbdSPtGjGDw +EObkKvbdGckVibJj +DoDLKvbdeEoSCWcK +EPCkKvbdQvmdClID +DncLKvbdhytelROG +EPCkKvbdeXzTtSFz +EPCkKvbdrXQMDIxq +EObkKvbdtlXvaUAw +DnbkKvbdiMFDmtcZ +EPDLKvbdJqZeOfNe +EPDLKvbdmIdUQtrB +DoDKjvbdVTltGLvK +DncLKvbdZRNEhleR +EPDKjvbdjlakydfo +DnbjjvbdFpASvfey +EPCkKvbdkySrTYft +EOcLKvbdVUMtGMVj +EPDLKvbdmRyUysDi +EPCkKvbdGKeScHlu +EObjjvbdczZPwyRC +EPDLKvbdVYhUZkOn +DncLKvbdJbibqKDY +EPDLKvbdfekzNfgA +EObkKvbdKQydoGOF +EObkKvbdVgwvXfxz +DncLKvbdQdDApQcr +DncLKvbdGFjRnJUR +DncKjvbdjgflFemk +DoDKjvbdlhctRVSB +DncLKvbdZLqctOLm +DncKjvbdfSAvzlCo +EPDKjvbdZRMeIleR +EObjjvbdZRMeJMdq +EOcKjvbdMuTSKmAX +DncKjvbdqYngfpdY +DnbkKvbdxrmiMqbH +EObjjvbdbPgGckzd +DoCkKvbdpstGqqkU +DncLKvbdmJDsqVSB +EPDLKvbdtunYKQsA +EObkKvbdDnbkKwCd +EPDLKvbdEXwkstUM +DoDKjvbdrRtkNkBN +DncLKvbdIwtCIMQp +EPDLKvbdZQmEhmEq +DnbkKvbdxmrhYTIc +DoCjjvbdCSaDUGWr +EPCkKvbdatagXkUI +DncLKvbdEPDKkWcE +DncKjvbdZjShPgBf +EPDKjvbdHDkVjCJj +DoCjjvbdsrrTYzEc +EObjjvbdhlEcnUby +DnbjjvbdemFvfmKL +EObkKvbdlhcsqUqa +DoCkKvbdZtIiYdTO +EObkKvbdEXwlTssl +DoDKjvbdhaoCdvqR +EObkKvbdliEURUrB +DoDLKvbdEYXkstTl +DncKjvbdFkEsDINV +DoDKjvbdFkErcHmV +DoDLKvbdKCjCpjDY +EPCjjvbdjJegjMxS +DnbkKvbdnCKWwnmu +DnbjjvbdqwQLbiYq +DoDLKvbdSZigsDWA +EObjjvbduVnYKRTA +EOcKjvbdTlWOaVoJ +DnbjjvbdSCDeMJYk +DnbkKvbdQvmdClID +EPCkKvbdziuQPdTU +EOcLKvbdhficZWJu +EOcKjvbdZLqdTmkm +DoDKjvbdcImKKevx +EOcLKvbdGFirOJUR +EObkKvbdREDApRES +DoDKjvbdHELWKBij +EOcKjvbdrSVLNkBN +EOcKjvbdBdQBWJlf +DoCjjvbdFpATXHGZ +DnbjjvbdqZOhGpdY +EPDLKvbdCSaDUGWr +DoDLKvbdrpWPJcWG +DnbjjvbdZsiJYdTO +EPDKjvbdJvVGEFGi +EPCkKvbdmIctRVSB +DncKjvbdBiLCKhfK +DoCkKvbdZisIQGbG +DoCjjvbduWNwjQsA +EOcLKvbdiHKCyVjV +EPCjjvbdlZSrTZGt +EObjjvbdNPxRWNgT +DncKjvbdeAURNXif +DncLKvbdOStWGeVQ +DoCjjvbdJvUeceGi +DoDKjvbdXsMBMsnx +EPDKjvbdGLFSbhMu +EPDLKvbdEvZPolie +EOcKjvbdrRtjnLBN +EPDKjvbdyOTHxTJD +EPDKjvbdmajWwnmu +EPCjjvbdrNZjZLhJ +DncKjvbdajlFoODA +DoDKjvbdrEFIpOVa +DnbkKvbdpedEtWBI +DncKjvbdqwQMChyR +DnbjjvbdnCKWwnnV +DoCjjvbdNUsRkNAX +EOcLKvbdULvPBWPJ +DncLKvbdjlalZdfo +EPDKjvbdjJfHjNYS +DoDKjvbdPxmAHTSK +DnbkKvbdmIctQtqa +EObjjvbdnHFXmNfy +EPCkKvbdqlzJyLhJ +DnbjjvbdVqnYCElD +EPDKjvbdqTsgRqkU +EPCjjvbdADSYKZhp +EPDLKvbdEvZPoljF +DoCkKvbdLFfICBRV +EOcLKvbdZRNFJNFR +EPDKjvbdpedFUWBI +EPDKjvbdVwJYVceH +DoCjjvbdGYtuBDwb +DoCjjvbdVYgtZjoO +DncKjvbdQccApQcr +EOcLKvbdWWiYWDdg +DncKjvbdyTOJNSBg +DnbjjvbdbAueFpQX +DnbkKvbdiUydwSUb +DoDKjvbdKVtfDeHJ +DoDKjvbdEObjkXCd +EOcKjvbdqlyjYlHi +EOcKjvbdfRaWzlCo +EObjjvbdRWmcblID +DoDLKvbdCDpAvKMf +DncLKvbdmuVZjjSG +EPDLKvbdkaMnmALA +EPCkKvbdcSbkTdKB +DnbjjvbdZtJIyESn +EPCkKvbdQvmccMHc +DncLKvbdfHjvRmpg +DoCjjvbdVvhwvEEg +EPCjjvbdXrkaNTnx +DnbkKvbdGFirNiUR +EObkKvbdZLrDsnLm +EObkKvbdySnJNRbH +DncKjvbdaMkBsUmH +EPCkKvbdqGEFUWBI +EObjjvbdmajXYOnV +DnbkKvbdHELWKBjK +EPDKjvbdWSOYCFLc +DncLKvbdehKurNqH +EPDLKvbdSZjIScWA +DncKjvbdZQldiNEq +DncLKvbdVwIwvEEg +DnbjjvbdauCGxKsh +DnbkKvbdKefHbApu +DoCkKvbdssSTYyeD +DnbjjvbdSPsgJfEX +DoCkKvbdeKKRvUzn +DoDLKvbdiMEcnVCy +DoDLKvbdoAKzsgcn +DoDKjvbdDoDKjvbd +DncKjvbdFWYopMie +EPDLKvbdRNXaxmtz +EOcLKvbdKefHaaRV +EPDKjvbderAvzkbo +EObjjvbdzoQREcMY +DnbkKvbdijFgjMwr +EObjjvbdhbObdvqR +EPCkKvbdySmiMqbH +EObkKvbdyzeOSIIh +DnbkKvbdjcLkRHUg +DoDLKvbdJpydoGNe +DoDKjvbdwXMBWBWV +EObkKvbdsBfMkgKy +DnbkKvbdYkqdTnMN +EPCjjvbdEPDLLWbd +EObkKvbdDwxLtUUM +DncKjvbdNrtVgFUp +EPDKjvbdZQleJNFR +EPDKjvbdJKEAKPfd +DnbjjvbdhgKCxvJu +EObkKvbdLAkHMbXq +EPDKjvbdhancEvqR +DoCjjvbdNsUWHEuQ +DnbkKvbdZjTHofaf +EPCjjvbdrDdiQOVa +EPDKjvbdkMbLzEgP +EPCkKvbdZoOJFEyj +EPCkKvbdADRxJyhp +EObjjvbdaSGCgsfL +DnbjjvbdJbjDQibx +EPCjjvbdpfEEtWBI +EOcLKvbdZxdJmblS +EPCkKvbdRpTgKGEX +DoCjjvbdzRPNIiwA +EObkKvbdzoPpeClY +EObjjvbdeFOrBwDK +DoCkKvbdOTTvHEtp +DnbjjvbdGQATWgFy +EPCjjvbdEvZQQNJe +EObkKvbdjvWnECYX +DoDLKvbdyTOIlqag +DnbkKvbdEASJNZvw +EOcKjvbdsZkosBHn +DoDLKvbdtSqsYyeD +DncKjvbdqlyixkgi +EPCjjvbdTppnuVHm +DncKjvbdatbHYKsh +DoCkKvbduVmwjQsA +EPCkKvbdvAcxsOeI +EObkKvbdRjyFuHLT +EObjjvbdTukoitAq +EOcLKvbdkySqrxft +EObjjvbdQccBPpdS +DoDKjvbdffLzNfgA +DoDKjvbdiCOcEvqR +DncKjvbdIBkzEzAD +EObjjvbdVZHsyjoO +EOcLKvbdZoNheEzK +DnbkKvbdsZkpTAhO +DnbjjvbdqFdEtVaI +DnbkKvbdIGfzZXwg +EPDLKvbdlrZVZsEJ +EObjjvbdBcpAvJmG +DnbjjvbdtSqsYzFD +EPDLKvbdJJdAJogE +DncKjvbdxVMdpyMO +EPCjjvbdQwOEDLhD +DoCjjvbdmgFXmNgZ +DoDLKvbdjEkGuPAO +EPCjjvbdACrXjZiQ +DoCjjvbdZMRdTmlN +DncLKvbdiLeDnVDZ +EObjjvbdVAaprpqy +DoDLKvbdRjyFuGjs +DnbjjvbdVAbQrprZ +EObkKvbdSZjHrcWA +EPDKjvbdVrOYBeMD +EPDLKvbdDwxMUTsl +EPDKjvbdRadElIxk +DnbjjvbdmozZWKyC +DoDLKvbdptTgRrKt +EPCjjvbdatagXkUI +DncLKvbdZLqcsnMN +DoDLKvbdfNFwGmJk +EObkKvbdqTsfrSKt +DncLKvbdZjTHpGbG +DoCjjvbduWNwipsA +EPDKjvbdauCGwkTh +DncLKvbdKVuGEFGi +EObjjvbdZirhPfaf +DoDKjvbdxKvcgzyf +DnbkKvbdxsNhlrCH +DoCkKvbdBsBDUGWr +DncKjvbdfMfXHNJk +DnbjjvbdOSsugFVQ +DncKjvbdZisIPfaf +DnbjjvbdZHXEAOsJ +DnbjjvbdLZRJrzuG +EObkKvbdwuNFQxlO +DncKjvbddxZtURez +EPCkKvbdxrmiNSCH +DoDKjvbdiUydwSVC +EObjjvbdiifIJlwr +DncLKvbdssSSxyeD +EPDKjvbdOEcsiJLE +EOcKjvbdySnIlrBg +EPCkKvbddZyQYZRC +DnbjjvbdWXJXudEg +DoDLKvbdKaLHNCXq +DoDKjvbdGGKRmiTq +DnbkKvbdlrYtyrdJ +EPDKjvbdhtzEvrVC +EObkKvbddZyQYYqC +DoDLKvbdhaoCdwRR +EPCkKvbdxLWdHzyf +DoDKjvbdySmhmRbH +DnbkKvbdZLqcsmlN +EObjjvbdZtJIxdTO +DoDKjvbdDwwksssl +EPDKjvbdFyVVAdXb +DoCkKvbdUtNUFkvK +EPDLKvbdxmsIXsIc +EPDLKvbdUsmUFkuj +EOcKjvbdGKdsDHlu +EOcKjvbdACqwjZiQ +EPDKjvbdFpASwHGZ +DoCkKvbdGZUtaDxC +DncKjvbdmSZVZsEJ +DoCjjvbdJbicRKCx +DncLKvbdTvMQJsaR +DoCjjvbdNeDtJJKd +EPCjjvbdnPzYvKxb +DoDLKvbdyTNhlrCH +EPDKjvbdRosgJecw +EObkKvbdTAEiICOd +EOcKjvbdapHHDkzd +DoCkKvbdjlakzFGo +DncLKvbdrpWPJbuf +DnbjjvbdNQXqVnHT +EOcLKvbdkNCLzFHP +EObjjvbdTukpKTaR +EOcLKvbdEuxpPlie +EPCkKvbdJuuFdFHJ +EPDKjvbdGGJqmiTq +DnbjjvbdOAIrtJrA +DnbjjvbdelfWgNKL +EObkKvbdhbOcEwRR +DncLKvbdqiAKFNPF +DncKjvbdVqnYCFMD +DoDLKvbdWHxWXgYz +EOcLKvbdNVTSKmAX +EPDKjvbduaDySndh +DnbkKvbdiifIJlxS +EPDKjvbdeATpmYJf +DncLKvbduCcVWuoP +EPCjjvbdhficYvJu +DncKjvbdehLVqnQg +EPCkKvbdrDeJPmua +DoCjjvbdTfzmlWue +DncKjvbdZoNiFEyj +DoDLKvbdxmsHxSiD +EObkKvbdVwJYVdFH +EPCjjvbduMXwBUBX +DnbkKvbdTqROuVIN +EPCjjvbdGKeTCglu +EPDLKvbdcyyPwxpb +EPDLKvbdQmXayOUz +EPDLKvbdZyDinCkr +EPDLKvbdZoNheEyj +DncLKvbdmfdxMnGy +DnbkKvbdkClLRGuH +DncLKvbdJXsbIMQp +DnbjjvbdjJegilxS +DoCkKvbdnPyxukZC +EPDKjvbdZMRcsnLm +DoCkKvbdHffzYxYH +DnbkKvbdbsDLTcjB +DoDLKvbdSwjlNzjx +DncKjvbdkaMnmALA +DncLKvbdqmZjZLhJ +DoDKjvbdqrUkNkBN +DncLKvbdmfeXmOGy +EPCjjvbdZMRdTmlN +DnbkKvbdypnlhjXA +EPDLKvbdyOTHxTJD +EObjjvbdMRwMzVQz +EPCjjvbdSCDeMIxk +EObjjvbdOXnuzdOU +EPDKjvbdOStWHFVQ +DoDLKvbdrzLpTAgn +DnbkKvbdULuoAvPJ +EPDKjvbdZxdKODMS +EOcKjvbdbAvEfPpX +DncKjvbdyOSgwriD +EPDLKvbdrJAJdmPF +EPDLKvbdauCGxKtI +DncLKvbdqrVLOLAm +EPDKjvbdkHgLfFmk +DncKjvbdUaCRSqSZ +DnbkKvbdbQGgELzd +EOcKjvbdcJMijfXY +EPCkKvbdeOeTLUTr +EOcKjvbdQmYByNtz +EPDLKvbdFxuVBDwb +EOcKjvbdGGJrNiUR +DoDKjvbddndsLTtS +EOcLKvbddZyPxYqC +EPCkKvbdSKxfVHLT +EOcKjvbdSCDdkiYk +DnbjjvbdtvNwjQsA +EOcKjvbdJXsbILqQ +EObjjvbdjcLkRHVH +EObjjvbdkCkkQgUg +DoCjjvbdTqQnttgm +EPCkKvbdEuyPoljF +DoCkKvbdTqQnuUgm +DoDLKvbdLrWlzVQz +EPCjjvbdRjyGVGkT +DoDLKvbdHEKvKBjK +DoCjjvbdnCJvxOnV +EObkKvbdptUGrRkU +EPDKjvbdQwNcblID +DoCjjvbdIidAKPgE +DoCjjvbdTYLMNzkY +DnbjjvbdEztRFMCi +EObkKvbdBhkCLJGK +EPDLKvbdZisHpGbG +EPDLKvbddePRbXDK +EObkKvbdUQpntuIN +EObjjvbdEPCjjvcE +DncKjvbdbiNJjewY +EPDLKvbdVrOYCElD +EPCkKvbdSBdElIyL +DoDLKvbdzjVQQETU +DoCjjvbdCDpAvKNG +EObkKvbdNHComPuL +EOcKjvbdGdKvJaij +DnbkKvbdqmZjYkgi +DncKjvbdQvnEClID +DncLKvbdWWiXudFH +DoDLKvbdCEQBWJlf +DncKjvbdMpXqWOGs +EPDKjvbdVBCRSqRy +EPDLKvbdqUTgSRjt +EOcLKvbdJXtCHkqQ +EObkKvbdBiLBkJFj +EOcLKvbdVvhwvEEg +EOcKjvbdCTBCsewS +EOcKjvbdyNsHwriD +DoDKjvbdwzHfFxEr +DnbjjvbdypoMiJwA +DoCjjvbdJbicQjCx +EOcLKvbdVUMsekuj +EOcKjvbdCEQBWJlf +EObjjvbdIjEAKQGd +DoCjjvbdDjIJvXjA +DoDLKvbdFyUuAdYC +DncLKvbdRotGiedX +DoCjjvbdBhkBjhej +EOcKjvbdBhkCKhfK +EPCkKvbdLFfHbBRV +DoCkKvbdNUrrLNAX +EOcKjvbdZoOIeEzK +EPCjjvbdkMbMZeHP +DoCjjvbdkVwNdBxX +EPCkKvbdNddThiKd +DnbjjvbdjcLkQftg +DnbkKvbdFkErcHmV +DnbjjvbdqGEEtWAh +DncKjvbdmSYuZsEJ +DoCjjvbdUsmTfMWK +DoCkKvbdVUMtFkvK +EOcKjvbdKfGICBRV +DnbkKvbdMSWlzUpz +EOcLKvbdVBBprpqy +EPCjjvbdnHEwmNgZ +DoCkKvbdeEoRawDK +DnbkKvbdpssgSSLU +DncKjvbdOSsugFUp +DnbkKvbdwzHfGYFS +DoCjjvbdTAEiHbPE +EObkKvbdKaLGmCXq +DnbkKvbdCWzciFQW +DncLKvbdnVVZjiqf +EPCjjvbdOStWHEtp +DoDKjvbdkIGkfFmk +DoDKjvbdZjTIPfbG +EOcKjvbdXsMAlsnx +DnbjjvbdILazmwRL +EOcKjvbdrDdiPmvB +EPDKjvbdiUzEwRuC +EOcKjvbdqAheAXHd +EPCjjvbdRyigsCvA +DoCjjvbdpyOggQcx +EPCkKvbdZyDjNblS +DncLKvbdFejSNiTq +EPDKjvbdzRPNIjXA +DncLKvbdaMkBsVMg +EObkKvbdLYqJrzuG +DncKjvbdsBfNMHLZ +EPDKjvbdjgflFfOL +DoDKjvbdCTAcUGWr +DnbjjvbdSLZGVGkT +DoCkKvbdZQmEhldq +EPDKjvbdUsmTfMWK +DoCjjvbdKefICBRV +EPCjjvbdZMSDsnMN +EObkKvbdwzIGGXdr +EObjjvbdrRtjnLAm +EPDKjvbdXrlAmTnx +EPCjjvbdZtJJZETO +DnbjjvbdieLGtoAO +DnbkKvbdnCJvxPOV +EPDKjvbdjKFgjNYS +DoCkKvbdlhcspuRa +EPDKjvbdbAvEfQPw +EOcLKvbdiGjDYuiu +DncKjvbdnQZxvLZC +DoDLKvbdaogHDkzd +DnbjjvbdMfcQMouL +DncKjvbdKaKgMbYR +DncKjvbdrbGNMHKy +DoCkKvbddoFSjtUS +EPDLKvbdNddTiIjd +EPDKjvbdhgKDZViu +EPDLKvbdkMbLzEfo +DoDKjvbdjmCMZdfo +DoDKjvbdSCDeLhyL +DoCkKvbdQwODcMID +DnbkKvbdgGLymgHA +EPDKjvbdWIYVwfxz +DnbkKvbdZLqdUNkm +DoCkKvbdYlSETmkm +DnbkKvbdLqvlyuQz +DnbkKvbdZRMdiMdq +EOcLKvbddePSCXCj +EPDLKvbdRacdkiYk +DnbjjvbdZisIQGbG +EObjjvbdrpVnibvG +DncLKvbdIxUCHlRQ +EPCkKvbdhuZeXRtb +DnbjjvbdQwODblID +DoDKjvbdezuyEhsw +DncKjvbdiLddNtcZ +EPCkKvbdiLeENtby +DnbjjvbdxKvcgzzG +EPDLKvbdRXNdClID +DncLKvbdEKHjVwjA +EOcLKvbdzoPqFCkx +DoDLKvbdliEURUqa +DoCjjvbdyOTIYTJD +DncLKvbdIHGyyXwg +EPCjjvbdShyjRABM +DoCkKvbdnPyyWLYb +EObjjvbdsPvPJcVf +EPDKjvbdTXjlNzjx +DoDKjvbddneTLUUS +EOcKjvbdmuUyjiqf +DncKjvbdZoOIddzK +DoCjjvbdpyOhGqEY +DoCkKvbdwjwDgzyf +DnbkKvbdxZgeexEr +EOcLKvbdHDjvKCKK +DoCkKvbdpxnhHQdY +DoDLKvbdLrWlzUpz +EPDKjvbdatbHXkTh +DoDLKvbdZyDinDLr +EPCjjvbdGGJqnJTq +DoDKjvbddneTLTsr +DncLKvbdyzdmqhJI +EObkKvbdRjxfVGkT +EPDKjvbdOAJTTirA +EPCjjvbdZoNiFEzK +DnbjjvbdOhAXyAYa +DnbjjvbdACqwizIp +DoDLKvbdcImJjevx +EPDLKvbdxmrhYTIc +DoDLKvbdjcLkRGuH +EPCkKvbdxVNEpxlO +EPCkKvbdKCibqJbx +DoCkKvbdjJfIKMxS +DoDLKvbdVYhUZjoO +EPDLKvbdrJAKEmPF +EOcLKvbdRDbaQRDr +DoCkKvbduWOXiqTA +DoCjjvbdZyDjNcLr +EObjjvbdbBWEeoow +EPDLKvbdUQpnttgm +EOcKjvbdlBNOmALA +DnbjjvbdSPsfiecw +DnbjjvbdwzIGGYFS +EOcKjvbdLGFgaaRV +EOcKjvbdrXQLcJYq +DnbkKvbdmbKXYPOV +DoCkKvbdZisHogCG +EPCkKvbdFVyPpMjF +EOcKjvbdYkrDsmkm +DoDKjvbdxUmEqYlO +EPDKjvbdKNAEZgUa +DoDLKvbdqZPIGpcx +DoCjjvbdMgComPtk +EObjjvbdUyHszKoO +DoCkKvbdeEnqavcK +EPDKjvbdqYoIGqEY +DoDLKvbdCDoaWJmG +EPDLKvbdlZSrTZHU +EPCkKvbdZxcinDMS +DoCkKvbdgFkzNfgA +EOcKjvbdYNqAXtvU +EObjjvbdwygefYEr +EPCkKvbdbBVdfQQX +DnbkKvbdqrVLOLAm +EOcKjvbdFjeTDINV +DnbjjvbdnHFYMnGy +EPCjjvbdrbFllHKy +EPCjjvbdZLrDtOMN +EPDLKvbdcJNKKfWx +DoCjjvbdraemMHLZ +DoDKjvbdeJjSWUzn +EPCkKvbdZnmiEdyj +DnbjjvbdwtleQxlO +DnbkKvbdDwwlUTtM +DoDKjvbdrWpMDJZR +EOcKjvbdegkVrORH +EPCkKvbdiCOcFWqR +DnbkKvbdBsBDTevr +DoCjjvbdjcLjpfuH +DnbjjvbdZxdKODLr +DoCjjvbdqceIpOVa +DoDLKvbdVvhxVceH +EObkKvbdsrqryZdc +DnbkKvbdMSWlytpz +DoDLKvbdqTsfqrKt +EPCjjvbdjKGIKNYS +EOcLKvbdiGibxvKV +EPCjjvbdKDKCpibx +EPDKjvbdQdDBPqDr +DncKjvbdozmdLYPA +DoCkKvbdTvLojUAq +DnbkKvbdbhmKLFwY +EPDKjvbdCIjbLIej +DncKjvbdkHfkeenL +DoDKjvbdtAGqIABS +EPCjjvbdRosfjFdX +EOcKjvbdraemLgLZ +DnbkKvbdxmrgxTIc +DoCkKvbdOAJStJrA +EPCjjvbdqYngfpdY +EPDLKvbdBvzdJEov +DoDKjvbdrDeIpOWB +EObjjvbdqUTfrSKt +EOcKjvbdxnShXsIc +DoDKjvbdEzsqFLcJ +EObjjvbdDxYMUUUM +EOcKjvbdjKFhKNYS +EOcKjvbdjgflGFmk +DoCkKvbdGGKRnItR +EPCkKvbdREDApRDr +EOcLKvbdNQYRWOHT +EPCjjvbdxmrgwriD +DncLKvbdbsCjsdJa +EOcKjvbdypoNIiwA +DncKjvbdZoOJFEyj +DoCjjvbdrbGMkgKy +EPDKjvbdyTNiNSBg +DoCjjvbdczZPwyQb +DoDKjvbdWfZZtAOs +EPDKjvbdznoqFClY +DncKjvbdTlVoBVoJ +EPCkKvbdIxUBhMRQ +DoCkKvbdZQmEiNEq +DoDKjvbdnVUykKRf +DnbjjvbdUtMtFlWK +EObjjvbdOTUVfeUp +DoCjjvbdZMSEUOMN +DoCjjvbdwjwDgzzG +DoDKjvbdYqNEiNFR +DoDLKvbdqiAKEmOe +EPDLKvbdfNGXHNJk +DnbjjvbdCEQBVjMf +EObkKvbdqUUGrRjt +DnbkKvbdjmCLyeHP +DnbjjvbdcJMikFwY +EPCjjvbdjuwNdBxX +DoCkKvbdeqaWzkbo +DncKjvbdTkvOaVoJ +DoDKjvbdZoOIeEzK +DoDLKvbdKDKDRKDY +DncLKvbdqwQMDJYq +EObkKvbdKeegbBRV +EPDKjvbdegjuqnRH +DoDKjvbdxwhjBpZk +EObjjvbdziuQPdSt +EPCjjvbdZyEKOCkr +EPCjjvbdRWmdCkhD +EOcLKvbdQcbaQRES +DncLKvbdIrxaTNYM +DnbjjvbdGFiqmiTq +DoCjjvbdZeXfzghb +DoCjjvbdSLZFuGkT +EPDKjvbdIryBSmYM +EOcLKvbdRyjHsCvA +EPDKjvbdzoPqFCkx +EPDLKvbdFeirOIsq +EObkKvbdLiBkpxAS +DoCjjvbdmuUyjirG +EOcKjvbdpfDeTuaI +DncLKvbdtSqsYyeD +EOcLKvbdAMhYrwZx +EOcKjvbdJSyAsNYM +DncLKvbddneTLTsr +EPDLKvbdANIYsWyx +EObkKvbdRXODblHc +DoCkKvbdYzcGRjWZ +DoDLKvbdkHgLfFnL +DoCkKvbdpyPIGqDx +EObkKvbdwuNEpxkn +DoDLKvbdJSxaTNYM +DoDLKvbdRNXbZOUz +DnbjjvbdNHDPlpUk +EObjjvbdKQzFPFnF +EOcKjvbdwkWdHzzG +EObkKvbdiCPCdvpq +EPCkKvbdwzHfFwdr +DoDLKvbdwuMeQxkn +DoDLKvbdmoyxujyC +DncLKvbdyYJKBoyk +EOcKjvbdhgJbxujV +EOcKjvbdvAcySndh +EPCjjvbdOYPVzcmt +DncKjvbderBWzlCo +DncLKvbdEuxoolie +DoDLKvbdUsmTelVj +DoCkKvbdcImKKfXY +EPCkKvbdKDJcRJcY +DoDLKvbdfILWSOQg +DoDLKvbdtcDVWuno +DoDKjvbdegjvSNpg +DncKjvbdjvXOEBxX +DncKjvbdvOszpjoU +EOcLKvbdkIGkfFnL +EPDKjvbdZxcinCkr +EOcKjvbdNxPVzcnU +DnbkKvbdNrsvHEtp +DnbjjvbdwygefXeS +EObkKvbdnHEwmOGy +EObkKvbdZRNFIleR +DoCjjvbdNHColotk +EPDKjvbdTkuoBVni +EObkKvbdkHgLfGNk +DoCkKvbdVvhxWEEg +EOcLKvbdtbcVWvOo +DoDKjvbdULvOaWOi +EObkKvbdNdcsiJLE +DoDLKvbdOYPVzdNt +DoCkKvbdNeDsiJLE +EOcLKvbdXGYytAOs +EOcKjvbdcIljLGWx +DoDKjvbdIMBzmwQk +EPDKjvbdbrcKscjB +DoCjjvbdqdEhpOWB +DnbjjvbdzoPqFClY +DnbjjvbdKDKCqJcY +EPDLKvbdZRNEhldq +DncLKvbddZyQXyRC +DncLKvbdRzKHrcWA +EObkKvbdTAFIgbPE +EObjjvbdwtmFRYkn +DoDLKvbdCTAbtFwS +EObjjvbdJzpFwdAN +DoCjjvbdCTAbsevr +EObjjvbdyzdmrIIh +DnbkKvbdANIZTXZx +EPCkKvbdVwJXvDeH +DncKjvbdmfdwlnHZ +DoCjjvbdZirhPfaf +EPCkKvbdiHJcYvJu +DnbjjvbdRMxCYmtz +EPDLKvbdZHWdAPSi +DnbjjvbdWSNxBdkc +DoDKjvbdNxPVzdNt +EObjjvbddePRawDK +DncKjvbdaSGCgtGL +DncKjvbddoFSjstS +DnbjjvbdOFETiJLE +DoDLKvbdeAUQmYJf +EObjjvbdZshiZESn +EPCjjvbdVwIwvEFH +DnbkKvbdKDKDQjDY +EPDLKvbdRbEFMJZL +DoDKjvbdiZuGLpnG +DoCjjvbdqGEEtWAh +DnbjjvbdnBiwYPNu +DnbjjvbdtlXwBTaX +DoCjjvbdqYoHfqEY +EPCkKvbdIsZArmXl +DoDLKvbdmfeYNNgZ +DoCkKvbdrafNLgKy +DnbkKvbdYfwEAOsJ +DoDLKvbdrEFIonWB +EPCjjvbdRXODcMID +EPCjjvbdZisIPfbG +DncKjvbdoAKzshEO +EOcLKvbdNQXqVmfs +DnbkKvbddoEsKssr +EPDKjvbdNeETiJLE +EPCkKvbdVgwvXfxz +EOcKjvbdIsZBTNXl +EObkKvbdFeirOJUR +EPCjjvbdVAbRSpqy +DnbjjvbdeXyssqez +EPDLKvbdZGwEAOri +DoCkKvbdVAaqSqRy +DoDLKvbdiVZeWrVC +EPDKjvbdGYuUaDwb +DncLKvbdLrXMyuQz +EPDKjvbdGZUtaEXb +EOcLKvbdzoQRFDLx +EPCkKvbdTAFJICOd +EPDKjvbdNPxRVmfs +DoCjjvbdauBfxKsh +DncLKvbdMIbLpxAS +DoCkKvbdmgEwmNfy +DoDLKvbdhanbdvqR +DoCkKvbdSLYfUfjs +DoCjjvbdTvMQJsaR +DnbkKvbdlhcspuRa +DnbjjvbdJSyBSlxM +EPCjjvbdSLZFuHLT +DoCkKvbdYTLaNUPY +EObjjvbdFeiqnJUR +EPDKjvbdYlRctNkm +EOcKjvbdHDjvJaij +DnbkKvbdnCJvwnnV +DoCjjvbdNHDPlouL +DncLKvbdWXIxWDdg +DoCkKvbdJSyAsMwl +EObkKvbdxmrhXriD +DnbkKvbdJzpGYEAN +EOcLKvbdddnqawDK +EOcLKvbdhyuFkpnG +DnbkKvbdtAHQhABS +DoCjjvbdjhGlFemk +DncLKvbdjJehJmXr +EPDLKvbdHffyyXwg +DoCkKvbdRbEFLiZL +DoCjjvbddePSBwCj +EPDKjvbdeOeTKtUS +DnbjjvbdrDeIomvB +DnbjjvbdVZIUZjoO +EPDKjvbdxmsIYTIc +EPCjjvbdDnbkLXDE +DnbkKvbdYlSDtNlN +EObkKvbdeFPSBvbj +EPCkKvbdkDMKpgUg +DoCkKvbdbKlGPODA +EObjjvbdGdLVjCKK +EPCkKvbdkCkjqGuH +EOcLKvbdqYngfpcx +EPDLKvbdeKJqvUzn +DoCkKvbdkIHMGGOL +DncKjvbdDoDKkXDE +EPCkKvbdsCGNMHLZ +EOcKjvbdyzeNqhJI +DnbjjvbdqwQLbhxq +EObjjvbdaaWEepPw +EObjjvbdDxXktUTl +DnbjjvbddwzTtRez +DnbjjvbdKQyeOfNe +EPDKjvbdbBVdepPw +DncLKvbdfSAvzkbo +DoDKjvbdqYoIHQcx +DoCkKvbdeEnrBwCj +DncKjvbdehLVqnRH +EPDLKvbdhfjDYuiu +EPCkKvbdvmWANEEm +EPCkKvbdZRNEiNFR +EOcLKvbdCSaCtGXS +DoDKjvbdbhljKevx +DoDKjvbdbBVdepQX +DncLKvbdqTsfrSKt +EPDKjvbdjEjgVPAO +DoCjjvbdFeiqmiTq +EObjjvbdcImJkGXY +EObjjvbdJbjCqJcY +DnbkKvbdjcLjpftg +EPDLKvbdWXJYWEEg +DoDKjvbdznpREbkx +EObjjvbdfILVqmqH +DnbkKvbdxwiKCQZk +EPDLKvbdOEdUJIjd +DnbkKvbdsCFmLgKy +DncKjvbdijFhKMxS +EPCjjvbdzitpQDrt +EPCkKvbdZQleImEq +DoDKjvbdZxdKNcLr +DncKjvbdGdLVjCKK +EOcKjvbdhzUfLpnG +DncLKvbdwzHfGYEr +EObjjvbdEObjjvcE +EOcLKvbdfHkVqmpg +DnbjjvbdXnRAXuVt +EOcLKvbdeFOrBwDK +EPCjjvbdzitoocsU +EPDKjvbdZxdJmblS +EObjjvbdFjeScHlu +DoDKjvbdjhGkfFmk +EOcLKvbduDDVXWPP +EPDLKvbdJYUCHkpp +EPCkKvbdkClKpgVH +EObkKvbdJcKCqJbx +DncKjvbdEXwlUTsl +EObkKvbdxwiJbPzL +DncLKvbdHDjujCKK +DnbkKvbdEuyQQMie +EPCkKvbdUaBpsRSZ +EPCkKvbddoFTKstS +EPCjjvbduaEYsOeI +DoDLKvbdcTDKscjB +DncLKvbdNdcshiKd +DnbjjvbdWSOYCEkc +EOcKjvbdZnmiEdzK +EPDKjvbdUQpnttgm +DoCjjvbdnGdwmOGy +DoCkKvbdZyDjNblS +EOcKjvbdShyjRAAl +DncKjvbdTkvOaWPJ +DoDKjvbdOEcsiJKd +DncKjvbdbVBfxKtI +EPCkKvbdrafNLfjy +DoDKjvbduaEZTOeI +DncLKvbdGGKSNhtR +EPCjjvbdnBjWxOmu +EObkKvbdKefICBRV +DncKjvbdZoNheFZj +DnbkKvbdEOcKkWbd +EPDKjvbdNGcPmQUk +EObkKvbdaMjbStlg +DnbkKvbdJYTbIMRQ +DncLKvbdJXsahLpp +DncKjvbddeOrBvbj +DoDLKvbdJSyAsMwl +EPCkKvbdZdwfzhJC +DoCjjvbduDDVWuno +DnbjjvbdEztQdkbi +EOcLKvbdUyHsykOn +EObjjvbdDjHivYKA +DoDLKvbdnUtzLKSG +DncLKvbdSLZFuGkT +DoDKjvbdlYrrTZGt +EOcLKvbdqUUGqrKt +EPDLKvbdEPCjjvcE +EPDKjvbddxZtTrFz +EObkKvbdlYrqrxgU +DoCjjvbdauCGwjtI +DnbjjvbdQZNAHTRj +DoDKjvbdMoxRVmfs +DncLKvbdOTTvGeUp +DncKjvbdcJNKKewY +DoDKjvbdmuVZjjSG +EPDKjvbdUWLpKUAq +EOcLKvbdSLZGVGjs +EObjjvbdCIjakJGK +EPDLKvbdZnmhddyj +EOcKjvbdLBKgMaxR +EOcLKvbdDjHjVwjA +DnbkKvbdYlRcsnLm +DoCjjvbdrRuKnKaN +EPCkKvbdptUHSSLU +DncLKvbdYpmEiNFR +EObkKvbdMIalQxAS +DnbjjvbdJuteceHJ +DncLKvbdFWYpPlie +EPCkKvbdmgFYMmgZ +DoCjjvbdmbJvxOnV +DncKjvbdIGfzZYXg +EPDLKvbdqTtGqrLU +EPCjjvbdWRmwbElD +EPDLKvbdGLErcIMu +EPDLKvbdwygefYEr +EPDKjvbdrSUkOLBN +DoCkKvbdNQYQumfs +DoCkKvbdRjyGVGjs +EPDKjvbdmajXXoOV +DncKjvbdIGgZxwwg +DnbkKvbdxwiJapZk +DoDKjvbdYqMdhleR +EOcLKvbdZtJIxdSn +EPDLKvbdTIzKRABM +EPDKjvbdCEPaWJlf +EOcLKvbdjgflFfOL +EPCjjvbdZjShQGbG +DoDLKvbdHDjvJbKK +EOcLKvbdBiKbLIfK +DncLKvbdiHJbxujV +EObkKvbdKeehBaQu +EPDLKvbdYSlBMsnx +EObkKvbdmJDsptrB +DoDKjvbdTkuoAvPJ +EPDKjvbdZyEJnDLr +EPCkKvbdZoNhddyj +EPDKjvbdVZHsykOn +DnbkKvbdjJegjNYS +DoDLKvbdtcCtwVno +EOcKjvbdkIHLefOL +EOcKjvbdYkqdTnLm +DnbkKvbdiZuGMQmf +DoCjjvbdZLrDsnLm +DoCjjvbdDwwktTsl +EObjjvbdRzKHrbvA +DoDKjvbdQlwaxnUz +EObkKvbdyTOImRag +EPCjjvbdQmYByOUz +EObjjvbdbrbkUDjB +DoDLKvbdGYtuAcwb +DncLKvbdePFSjssr +DoDKjvbdRbDdlIxk +DoDKjvbdwzIGGXeS +EPCjjvbdOTUVgEuQ +EPCkKvbdemGWfmJk +EOcLKvbdZQmEhmEq +DoCjjvbdZRMeJNFR +DoCjjvbdvBEZSoEh +DncLKvbdhlFDnVDZ +DoCjjvbdJJdAKPfd +EObjjvbdyYJKCQZk +EObjjvbdRzKITCvA +EPCjjvbdUMVnaWPJ +DoCjjvbdNddThhjd +EOcKjvbdNPwpvOHT +DnbjjvbdZisHpHCG +EObkKvbdGLFScINV +EOcLKvbdbsDLTdJa +EObjjvbdbhlijfWx +DoDLKvbdVZHszLPO +EObjjvbdZnnJFEyj +DoDKjvbdeOeSkTtS +DoDLKvbdkCkjpgUg +EPCjjvbdFejRnJUR +DoCjjvbdZsiIyDrn +DoDLKvbdtunYJqTA +DnbkKvbdoznELXoA +DoCjjvbdZtIiYcsO +EOcLKvbdGGKSOJUR +DoCjjvbdUMWPAuni +DnbkKvbdEPDKkWbd +EPCkKvbdUxhTzLPO +DoDKjvbdGdKvKBij +DncKjvbdmSZUzSci +EPCjjvbdZjShQGaf +DncLKvbdWRmxCElD +EPDLKvbdqvpMDIyR +DncKjvbdCJKakIfK +EPDKjvbdHELWJbKK +DoDKjvbdjlbLzFGo +EPCjjvbdTkvPBWOi +DoCkKvbdJvVGEFGi +EOcLKvbdUyHszLPO +EObjjvbdVBBpsQqy +DnbkKvbdZdxGzhIb +DnbjjvbdsPvOicVf +DoDKjvbdtcCtwWPP +EOcLKvbdwtmFRYkn +EPDKjvbdegjvSNqH +DoDKjvbdIxUBglQp +EOcLKvbdBcpAvKNG +DnbjjvbdwXMAvAvV +DnbkKvbddoEsLUUS +DncKjvbdCIkCKiGK +DoDKjvbdlZTSTYft +EPCjjvbddoEsKtTr +EObjjvbdFfJrOJTq +EPDLKvbdliDsqVSB +DncLKvbdbUagXjtI +EObkKvbdIsYaSlxM +EPCjjvbdHkaznXRL +DnbkKvbdxUmFQyMO +DoCjjvbdWWiXvDdg +EPCjjvbdSQUHKFcw +EPDLKvbdjKGIJlwr +EOcKjvbdXFxytAOs +DncKjvbdmbKWwoNu +EObjjvbdiZuFkpmf +DoCjjvbdFyVVBDwb +DnbjjvbdeqaWzlDP +EPCjjvbdRyjHsDWA +DnbkKvbdqlzJyMHi +DnbkKvbdZRNFImFR +DoCkKvbdYfwEAPSi +DoCjjvbdOAIrsjSA +EPCkKvbdaNLCTVMg +DnbjjvbdqceIomvB +DnbjjvbdsCFlkgLZ +DoDLKvbdmIdURUqa +EOcKjvbdZshhxcrn +DoDKjvbdZjTIPgCG +DncKjvbdemGWfmJk +DnbjjvbdACqxKZiQ +EObkKvbdkVvnEBxX +DncLKvbdUtNTfMWK +EPDLKvbduaDxsPFI +EObkKvbdgQBzvcxI +EObkKvbdSZihTDWA +EOcLKvbdqYnggREY +EPDKjvbdqiAJdmPF +EOcLKvbdiGjDZVjV +EOcLKvbdGZVVAdXb +DoDKjvbdhfjCxuiu +DnbkKvbduMYXBTaX +DoCkKvbdjSziTKiz +DoDKjvbdqlzKZMIJ +DnbjjvbdkVwOEBxX +DoCjjvbddtAUASmW +DoDLKvbdzjVQQESt +EOcLKvbdkySrSyHU +DncLKvbdNGbolotk +DnbjjvbddeOrBwCj +DoDLKvbdiLdcmuDZ +DoDKjvbdSPsfjFdX +DoCkKvbdbUafxKtI +DnbkKvbdcJNJkFvx +EObjjvbdFejSNiUR +EPDKjvbdQmYCYmtz +DncKjvbdfVzwpJzs +EPDKjvbdWRmwbEkc +DncLKvbdFkEsDIMu +DoCjjvbdQccBPqES +EObkKvbdKCibpjCx +EOcKjvbdLBLHNBwq +DoCkKvbdUMWOaVoJ +DoCjjvbdrbFmMGjy +EOcLKvbdJvVFdEgJ +EPCkKvbdjhHMGFnL +DncKjvbdNxOuzcmt +EPDKjvbdEXxLstUM +DoDKjvbdwygfGXeS +EObkKvbdyTNiMrBg +DncKjvbdlZSrSxgU +EPDKjvbdJXtCHlQp +EPCkKvbddndsLTsr +EObjjvbdNdcshhkE +DncLKvbdSCDeLhyL +DncLKvbdNsTvHEuQ +EOcKjvbdACqxKZiQ +DoCjjvbdptTgRqjt +EPDKjvbdOEdTiJLE +DoDKjvbdrpVoKCvG +DnbjjvbdFjeSbhNV +EPCjjvbdNGbolouL +EPDLKvbdrEFIonVa +DnbkKvbdOFDsiIjd +DoCkKvbdTqQoUuIN +EPDKjvbdeOdsKtTr +DncKjvbdyNrhXsIc +EPDKjvbdnQZxujyC +EPCkKvbdYqMdhmFR +DncLKvbddeOrBvbj +DoCjjvbdLGFgbApu +DoCjjvbdemFwHMik +DoCkKvbdRXOEClHc +DoCkKvbdZQmEiNFR +EPCjjvbdEASIlzXX +DnbkKvbdrWokbiZR +EObkKvbdHELWKBij +DnbkKvbdbUagXkUI +EOcKjvbdbsDLUDia +EOcLKvbdUWLojUAq +DnbjjvbdQvmccMID +DoDKjvbdZxcjODMS +EPDKjvbdTulPjUBR +DncLKvbdjSzhsKiz +EOcKjvbdTAFJICOd +DnbkKvbdKNADzHVB +DoCjjvbdliDtRVSB +EObjjvbdWXIxVceH +EPCjjvbdfHkWRnQg +EObkKvbdjAQGaPgK +EObkKvbdkClLRGuH +DncLKvbdZnnIdeZj +EObjjvbdlYsRsYgU +DoDLKvbdpyPHgQcx +DnbjjvbdnPyyWKyC +EObjjvbdQwNcblID +DnbjjvbdCJKajhfK +EPDKjvbdiHKCyWKV +EObjjvbdeEoRavbj +EOcKjvbdmaivwnnV +EOcKjvbdwNWANDeN +EPDKjvbdTAFIhCPE +DoCjjvbdZQleJMeR +EPDKjvbdmtuZjiqf +DnbkKvbdEPCkLXCd +EObkKvbdqGEEsvBI +EOcKjvbdmIdTqVSB +EObjjvbdJTZBSlwl +EPCjjvbdqlzKZMIJ +EPDKjvbduCbtwWOo +EPDLKvbdnPzYukYb +EPDKjvbdeFPSBvbj +EPDLKvbdHEKvKCJj +EPDKjvbdVUNUGLuj +EOcLKvbdJuuGEEgJ +EOcKjvbdzQnmJKXA +EOcLKvbdrbGMkfjy +DnbjjvbdUsltFkuj +DnbkKvbdDxYMUUUM +DnbjjvbdUQpoUuHm +EPDKjvbdRbDdlJZL +DncLKvbdmgFXlmfy +EPCjjvbdJbibqJcY +DoCjjvbdEPDLLWcE +DoDLKvbdMJCMRYAS +DoCkKvbdQZNAGsSK +EObjjvbdiCPDFXQq +EOcLKvbdVwJXvEEg +DoDLKvbdsrqsYzFD +DncLKvbdjuvnDbXw +EPDKjvbdhgKCyWKV +DoDLKvbdNdctIiKd +EObkKvbduaEYrneI +DoCkKvbdNVSrKmAX +DncKjvbdXnRAXtvU +DoDKjvbdhkddNtcZ +DoCkKvbdiBnbdwQq +DnbkKvbdLBLGlawq +DoDKjvbdygZMANEw +DnbkKvbdZsiIxcsO +EObjjvbdiBoDEwRR +DoCjjvbdHbLzEzAD +EPCkKvbdjbkkQgVH +EOcLKvbdsBemLgLZ +EOcLKvbdptUGrRkU +EPCjjvbdznpQdbkx +DoDKjvbdGYtuAdXb +EOcKjvbdzjUpQETU +EOcLKvbdypoNIjXA +DnbkKvbdSQUHJfDw +EPCkKvbdbsCjtEKB +DoDLKvbdajlFoODA +DoDKjvbdelevfmKL +DnbkKvbdCTAbsfWr +DoDKjvbdjhGlGGNk +DoCkKvbddCTMrATm +EPDLKvbdaMjbSuMg +DoCkKvbdKaLHNCYR +DncLKvbdGGKSNiTq +DoCjjvbdLZRJrztf +EPDLKvbdjlakyeGo +EObkKvbdwuMdpyLn +DnbkKvbdegjuqnQg +EPDKjvbdtTSTYydc +EObkKvbdZyDjOClS +DnbkKvbdqGEEtWAh +EOcLKvbdKQydoFnF +EPDLKvbdqUTgSSKt +DnbjjvbdMJCMQxAS +EPCkKvbdiMFDnUby +EOcKjvbdfpBzwEXh +DoCkKvbdSBceMIxk +EObjjvbdfMevgMik +EPCjjvbdjAQHAofj +EPCjjvbdZLrETnMN +EObkKvbdDoDLLXCd +DncLKvbdSZjHsDWA +DnbjjvbdOStVgFVQ +EObkKvbdbhlijfXY +DnbkKvbdjEjftoAO +DoCjjvbdeEnrCXDK +EOcLKvbdZyEKNcMS +EPDKjvbdWSNwadkc +EPCjjvbdkDLjqHUg +DoCkKvbdSCEFLiYk +DncKjvbdtkwwBTaX +EPDKjvbdCTAbsevr +DncLKvbdmfdwlnGy +DncLKvbdTukpJtBR +DoCjjvbdlYrrTZGt +EOcKjvbdnCKWwoOV +DncKjvbdMgColpVL +EPDLKvbddwytURez +DoCkKvbdakLenmcA +EPCkKvbdQvmdCkhD +DncLKvbdEARhlzWw +EOcLKvbdrXQMDJYq +EObkKvbdmJETptrB +EOcKjvbdAMgxsXZx +EPDKjvbdULvPBVni +DoDKjvbdqGEFTvAh +DoDKjvbdGLFTChMu +DoCjjvbdLBKgNCXq +DoCjjvbdOEcsiJLE +EObjjvbdSLZFuHKs +DoCjjvbdtkxXAsaX +DnbjjvbdNGbpNQVL +EOcLKvbdiLeEOUby +EObjjvbdDoCjjwDE +EPCkKvbdxrnJMrCH +EPDKjvbdJTZBTMwl +DncKjvbdBcpBWJlf +DncLKvbdGKdsDHmV +DncLKvbdDwwlUUTl +EPDLKvbdbQHHELzd +EPDLKvbdYlSEUOLm +EObjjvbdhtyeXSUb +EPCjjvbdACqxKZiQ +EObjjvbdrDdiPmua +EPCkKvbdcyxpYYqC +EPDKjvbdrXQLbiZR +DncKjvbdjmBlZeHP +DncKjvbdlYrrTYft +EObkKvbdaaWFFpPw +DncKjvbdwyhGFwdr +EPCkKvbduLxXAtBX +EObjjvbdhancEvpq +DncLKvbdbiMjKevx +DncKjvbdTIyjRABM +DoCkKvbdcImKLFvx +DnbkKvbdZjSgpHBf +EPCkKvbdGdKvJbJj +EOcLKvbdSCDeMIyL +EOcKjvbdZxdJnClS +EOcLKvbdHDkVibJj +DoDKjvbdezuxeJTw +EOcKjvbdqFceUVaI +EPDKjvbdWIYWXfxz +DoDKjvbdNQXqWOHT +DnbkKvbdOStWHEtp +EPDKjvbdLAkGmBxR +EPDKjvbdDxXksssl +EPCkKvbdTqRPVUgm +DoDLKvbdrDdhomvB +DncLKvbdptUGrSKt +EOcKjvbdiBnbeWqR +DoDKjvbdezvYeJUX +DnbkKvbdOAJStJrA +DnbjjvbdtcCuWvPP +DnbjjvbdIjEAKPgE +EObkKvbdWWiXvEEg +DnbkKvbdSBdFMJYk +EOcKjvbdQdCaQQcr +EPDLKvbdLZRKSzuG +DoCkKvbdpfEFTuaI +DnbkKvbdVBBqSqRy +DncLKvbdMoxRVnGs +EOcLKvbduoTzqKnt +DoCjjvbdxxJKCPyk +DncLKvbdVvhwvEFH +EPDLKvbdOYPVzcnU +EOcLKvbdBdPaWJlf +DnbkKvbdJSyAsMwl +DoCkKvbdYTLaMsnx +EOcKjvbdUWLpJsaR +DoCjjvbdhbOcEwRR +DncKjvbdKfGHbAqV +DoCjjvbdlZTSSyGt +DncLKvbdatbGxLTh +EPDLKvbdiGicYvKV +EOcLKvbdTIyjRAAl +EPDKjvbdZsiIyDsO +DnbjjvbdZLqcsmlN +EOcLKvbdeOeTLTtS +DncKjvbdQdCaPqDr +EPCjjvbdUGznLvvF +EObkKvbdrDdhpNvB +EPDLKvbdRadFLhxk +DnbjjvbdhytelQmf +EPDKjvbdFkFSbhNV +DoDKjvbdaSGDHsek +EObkKvbdzHYlAMdw +DnbjjvbdliDsptrB +EPCkKvbdYlSDtNlN +DoDKjvbdnPyxujxb +EObjjvbdRkYfVGjs +EPCjjvbdRaceMJZL +EOcLKvbdnUuZkJrG +DncKjvbdOYOuzdNt +DoCkKvbdJbjDQicY +DnbjjvbdRyjHsCvA +EOcLKvbdUGzmlXVe +EPCjjvbdMoxRWOGs +DncKjvbdlrZUzTEJ +DoCjjvbdJYUBgkpp +EOcLKvbdACrXizJQ +EPDKjvbdsCGMkfkZ +DncKjvbdqYnhGqEY +DncLKvbdjgflFemk +DncKjvbdrzMQTAgn +DoCjjvbdlZTSSxgU +EPDLKvbdKCibqKCx +EOcLKvbdmJDtQuSB +DncLKvbdQcbaPqES +DoCjjvbdOXoVzdNt +EObkKvbdbsCjsdKB +EPDKjvbdySmiMqbH +DoCjjvbdrMzKZLhJ +DncKjvbdtAGqIAAr +EPCjjvbdEXxMTtUM +EOcKjvbdVrOYBdkc +DoDKjvbdzROlhiwA +DncKjvbdqTtHRrLU +DnbkKvbdiUzEwSUb +DoCkKvbdZLqcsnMN +DnbjjvbdUaBqTRRy +DoDKjvbdRosgKGEX +EObkKvbdShzKRABM +DoDLKvbdqZOhHRDx +EPDLKvbdiUzFWqtb +DoCkKvbdZyEJmbkr +DncKjvbdREDBPpdS +EPCjjvbdMSWmZtpz +EPDLKvbdTAEiHaoE +DoDKjvbdNeETiIjd +EOcLKvbdqdFJPmua +DoCkKvbdRpTfjFcw +DncLKvbdznoqEcMY +DoCkKvbdFfJqmiUR +EOcLKvbdSPsfifEX +DnbjjvbdtunYJpsA +EPDKjvbdqcdiQOVa +DnbkKvbdeXyssrFz +EPDLKvbdQYmAGrqj +EObjjvbdegjuqmpg +EOcLKvbdbLLenmcA +EOcLKvbdpyPHgREY +DoDKjvbdZRMdhmEq +DncLKvbddZxoxZRC +EOcKjvbdKxpjSztf +EPDKjvbdKkBHvAJy +EObkKvbdnBiwYOnV +EObkKvbdrWolDJYq +DoCkKvbdZyEJmbkr +DoDKjvbdkDMLRHUg +EPCjjvbdQwNccMID +DncKjvbdSZihSbvA +DncLKvbdnHFXmNgZ +DncKjvbdGKeSbhMu +DncLKvbdULvPAuoJ +EOcLKvbdYqNFJMeR +DoDLKvbdMfcPmQVL +EPDKjvbdFpATWgGZ +EObjjvbdeqaWzkbo +EOcKjvbdZoNhddzK +EObjjvbdFeiqmiTq +DoDKjvbdauBfwjsh +EOcLKvbdBraDUFvr +DoDLKvbdyYIjCPzL +DnbjjvbdmRxuZsEJ +EObjjvbdMfcQMpUk +EOcKjvbdyNsIXrhc +EPDKjvbdREDBPpcr +EPCjjvbdRkYeuGkT +EPCkKvbdtAHRIAAr +DnbkKvbdxUmFQxkn +EObkKvbdtTSTZZdc +EOcKjvbdmIdUQtqa +EOcKjvbdXrkaNUPY +DoDKjvbdCWzdIePv +DoDKjvbdbBVdfQPw +EPCjjvbdZyEJmblS +DncKjvbdlZTRrxft +EPDLKvbdIxUCIMQp +DnbjjvbdKyRKSztf +EOcKjvbdNeEUIhjd +EOcLKvbdjKGIJmXr +DoDLKvbdCEPaVimG +EPCkKvbdOFDsiIkE +EOcLKvbdehKvSORH +DoDKjvbdwWkaWAuu +EPDKjvbdpxoHfpcx +EPDKjvbdJbjCqJbx +DncKjvbdZtJJZETO +EPDLKvbdsZkpTBHn +EPCkKvbdTlWPAuoJ +DoCjjvbdjggMFfOL +DoDKjvbdfMewGlik +EPDLKvbdnBivwoOV +DoCjjvbdwuNEpxkn +DnbkKvbdiifIKNYS +EOcKjvbdKVuFdFGi +EPCjjvbdZdxGzgiC +EOcLKvbduaDxsPEh +EPCkKvbdRotHJfEX +DncLKvbdCIjajhej +DoCkKvbdcImJjfWx +EOcLKvbdKVtecdgJ +DoCjjvbdeFOrBwCj +EPDKjvbdqvpLcIxq +EObjjvbdEARiMyvw +DncKjvbdbUafxLTh +DncLKvbdLAkGmCYR +DoDKjvbdxVMdqYkn +EPDKjvbdWWiYWDdg +EObkKvbdKDJbpjCx +DoCkKvbdnPyxvKyC +DoCkKvbdZsiJYcsO +EObkKvbdJpzFOeme +EOcLKvbdOSsufeUp +DoDLKvbdTfznMWvF +EPDLKvbdfNFwGlik +EPDLKvbdCDpAuilf +EPDKjvbdbiMikGWx +DoCkKvbdrbGMkfjy +DoCjjvbdWIXuxHYz +EPDKjvbdGFiqnIsq +EPDLKvbdNGbpMpVL +EOcLKvbdtSrTYyeD +DoDKjvbdjJfHjNXr +EPCkKvbdzitpPcrt +DoDLKvbdxmrgxSiD +EPDLKvbdcJNKLFvx +EPDLKvbdsrrSxydc +DnbkKvbdqceIonWB +EPCkKvbdZnnIddzK +DoCjjvbdLYpirztf +EPCjjvbdLrWlzUpz +DnbjjvbdRkZGVGjs +EObjjvbdnBivxOmu +DoCjjvbdmIdUQuSB +EObkKvbdtcCtvuoP +DnbjjvbdANIYrvzY +DncKjvbdmaivwoNu +EOcLKvbdrouoJcWG +DoDLKvbdTppoVVIN +DoDLKvbdVUMtFkuj +DncLKvbdznpQdblY +DncKjvbdEPCkLXDE +EOcLKvbdfHkVqmqH +EPDKjvbdapGgDkzd +EPCjjvbdSPsfifDw +DoDLKvbdGKeTDINV +EObjjvbdyqPNIjXA +EPCjjvbdatbGwkUI +DoCjjvbdCTAcTewS +DnbjjvbdxnTIXsJD +EOcKjvbdbKlFnnDA +DncKjvbdjJegjNXr +EObjjvbdMuTRkNAX +EObkKvbdUxgsykOn +DoCkKvbdRaceMIxk +EPDLKvbdJbibpibx +DoDKjvbdEztQdlCi +EPDKjvbdcyyPwyRC +DncKjvbdjlbMZdfo +EPCkKvbdRXNdClID +DncLKvbdtbbuXVoP +DoDKjvbdieLHVPAO +DoDKjvbdFVxopMie +EObjjvbdzoPpdblY +EPCjjvbdmIdUQuSB +EPCkKvbdYkrEUNkm +DoCkKvbdVwIxVdEg +DoCjjvbdOSsvGdtp +EPCjjvbdmSYtysDi +EObkKvbdWWiYVceH +DoDKjvbdrNZixkgi +EPDKjvbdbVCHYKsh +DnbkKvbdjKFgimXr +EPDKjvbdNsUWHFUp +EObkKvbdeAUQlwjG +EOcKjvbdTAEiICPE +DoCkKvbdZLqdUNkm +EOcKjvbdZisHogCG +EPCkKvbdKVtfEEgJ +EObjjvbdaSGDIUGL +EPDKjvbdZRNFIleR +DoDKjvbdyXiJaoyk +EObkKvbdRkYfVHKs +DnbkKvbdLAkHNCXq +DncKjvbdJpyePFnF +EPCkKvbdkHgMFenL +DoDLKvbdOFDtIhkE +DoCkKvbdtTSTZZdc +EOcLKvbdkClKpfuH +DoCjjvbdBcpBVjNG +DnbkKvbdfMfXHNJk +DoDKjvbdBsBCtFvr +DoCjjvbdHgGzYwwg +DncLKvbdSwjkmzkY +DoCkKvbdDihJuwjA +EPDKjvbdQccBPpdS +EPDKjvbdehLVqnQg +DoCjjvbdmozZVkZC +DoDLKvbdaNKasVNH +EObkKvbdrRtkOLBN +DoDKjvbdehLWRnRH +EObkKvbdSCEEkiYk +DoCjjvbdRXOEDMID +EOcKjvbdFejRmiUR +EOcLKvbdFkEsChNV +DncKjvbdWWhwuceH +EPCkKvbdNwoVzdOU +EOcKjvbdePFSkUTr +DoDKjvbdMRwMzUpz +EObjjvbdLrXMzUpz +EPDKjvbdZxdJnDLr +EOcLKvbdrRtkNjaN +EPCkKvbdTvLoitBR +DncKjvbdKeehCApu +EPDLKvbdemFvfljL +DncLKvbdeFOqawCj +DoDKjvbdZyEJnCkr +DoCjjvbdlZTRsZHU +DnbkKvbdRbDdlJZL +DnbjjvbdYqMdiNFR +EObjjvbdSQTfjFdX +DoCjjvbdgFlZnGgA +DoDLKvbdwtldqYkn +EObkKvbdjggLfFmk +DncLKvbdMgCpNPtk +DncKjvbdmpZyWKxb +EPDKjvbdVqnYBeMD +DoDKjvbdULuoBWOi +DncLKvbdezvZEiTw +EPCkKvbdjblLRHUg +EPCjjvbdBiKakJGK +DncKjvbdTukpJtAq +DoCkKvbdkWWnEBxX +EPCjjvbdnPzYvLZC +EOcLKvbdWHxVxGxz +DncLKvbdNsUWHEtp +EObkKvbdHDkWKBij +EObkKvbdVAbQsQrZ +DnbkKvbdKCibqKDY +EObjjvbdLYqKSztf +DoCkKvbdZLrDtOMN +EOcKjvbdemFvgNJk +DncLKvbdiCOcEvpq +DnbkKvbdEXxLtTtM +EObkKvbdFjdrbglu +EObkKvbdmttykJrG +DoCjjvbdePFTLUTr +DoCkKvbdWRmwadlD +DoDLKvbdVqmxCElD +EPCkKvbdnBiwXoOV +DnbjjvbdEvZQPmKF +EObkKvbdSKyGVGkT +EPCjjvbdauBgXkTh +EPCjjvbdVrNxBeLc +EObjjvbdOEcshiLE +DoDLKvbdbLMGPNcA +DnbkKvbddZxpYYqC +DoCkKvbdlZTSTZHU +EObkKvbdtlXwBTaX +EObkKvbdHffyxwxH +EPDKjvbdrpWOicVf +DncKjvbdkVvmdBww +EPDKjvbduaDySoFI +EObkKvbdsZkosBHn +DoDLKvbdTAFJICOd +DnbjjvbdpstHRrLU +DncKjvbdUQqOtuIN +EPDKjvbdVUMtFlWK +DoDLKvbdrouoKDVf +DoCjjvbdmRyUysDi +EPDKjvbdgFkzNgHA +DnbjjvbdZshiZDsO +DnbjjvbdIMBzmwRL +EObjjvbdZshhxdTO +EOcLKvbdZGwEAOri +EPCkKvbdkHflFfOL +DoCkKvbdKDJcQibx +EOcLKvbdFkEsCgmV +EPCjjvbdJutfEEgJ +DoCkKvbdOXnuzdNt +EPDLKvbduLwwAtAw +DoDKjvbdqvpLbiZR +EPCjjvbdGYuVBEXb +EOcLKvbdCJKajhfK +DnbjjvbdkMbLyeGo +EPCkKvbdijGIKMwr +DoDLKvbdJzpGXdAN +DoDKjvbdNwnuzdOU +EOcLKvbdtSqsYyeD +EOcLKvbdmRxuZrdJ +EPDKjvbdhlEcmtcZ +DoCkKvbdbiNJjevx +DoDKjvbdGckVibJj +DoDLKvbdGLFSbhMu +EPDKjvbdEObjkWbd +EObkKvbdBhkBjiGK +EPDKjvbdtAGqIAAr +DoCkKvbdWRmwadkc +EObjjvbdQdDAoqDr +EOcLKvbdwNWANDeN +EPCjjvbdMowqVmgT +EPDLKvbdegkWSNpg +EPDLKvbdjAQHAogK +DoDLKvbdvwLaVaWV +EPCjjvbdLGFgbBQu +DoCjjvbdxsOJMrCH +EObkKvbdFkFTChMu +EObjjvbdbLLenmcA +EPDLKvbdiCObeXRR +EPCjjvbdhbObdvpq +EObkKvbdVZIUZkOn +EPDLKvbdfVzxPizs +EPDKjvbdnPyyVjyC +DncLKvbdRzKITCvA +EOcLKvbdUtMsfLuj +DncKjvbdVBBpsRRy +DnbkKvbdzeZnzdzQ +EOcLKvbdUtNTfMVj +EObjjvbdqcdiQOWB +DoCkKvbdNddTiIjd +DncLKvbdrykosBHn +EPDKjvbdWRnYBeLc +DncLKvbdrXQLcIxq +EPCkKvbdUWLpKTaR +DoCkKvbdZRNFJMeR +EPDLKvbdunszpjoU +DoDKjvbdzitpPdSt +EObkKvbdvBDxrneI +DoDLKvbdVviXvDeH +EPCkKvbdDihJuxKA +EPCkKvbdNPxQunGs +DoCjjvbdmuUzKjRf +DnbkKvbdbPffdLzd +DoDLKvbdXrlBNTnx +DoDKjvbdZQmEhmFR +EObjjvbdmttzLKRf +DoCkKvbddijRvUzn +EPDLKvbdHffyyYXg +EPCkKvbdcTDKtEJa +EPCkKvbdpecdtWAh +DncKjvbdRjxeuGkT +EPCjjvbdqdEhpOVa +EPCjjvbdelfXGmJk +EObkKvbdWWhwudFH +EPDKjvbdhbObeXQq +DoCkKvbdffLynHHA +DnbjjvbdpaJFAXIE +DoDKjvbdqZPIGpcx +DoDLKvbdmaivxPOV +DncKjvbdqFdEsvAh +EPCjjvbdrpWOibvG +EPCkKvbdyfyMAMdw +DoDLKvbdhuZdvqtb +DncLKvbdWRnYBeMD +DncLKvbdDncLKvbd +EObkKvbdhzUfLpnG +EOcLKvbddoFSkTtS +EPDKjvbdbKlFoODA +DoCkKvbdRWmccLhD +EObjjvbdeAUQlxJf +DncLKvbdKVuGEEfi +EObkKvbdVvhwvEEg +EPDLKvbdhaoDEvqR +EPDKjvbdpfEFTvBI +EPCkKvbdyzeNrIJI +DoDLKvbdGckViaij +EObjjvbdnHExNNfy +EObkKvbdZLqdUOLm +DoDLKvbdDxXktTsl +EObkKvbdFVxpPmKF +DoDKjvbdNdctJJLE +DnbkKvbdTXkMNzjx +DncKjvbdbrbkUEKB +DoCkKvbdGKeSbhNV +EPDKjvbdYSkaMtOx +EPCjjvbdiGicYujV +EObjjvbdnHFXmOGy +DoDKjvbdZyDjNblS +EOcLKvbdGYtuBEXb +DnbjjvbdqGDeUWAh +DnbkKvbdTppnuVHm +EOcLKvbdPyNAGsRj +EPCkKvbdIrxaSlxM +DncKjvbdCfkfHAzc +DnbkKvbdIHHZxxXg +EPCjjvbdjKFhKMxS +EOcKjvbdehKvRnRH +EObjjvbdxVMdpyMO +DnbjjvbdSLYetgKs +EObkKvbdRjyGUfkT +DoCjjvbdwyhFeweS +DncLKvbdrJAKElne +EPCjjvbdiGjCxvKV +EPCjjvbdCIjajiFj +DoDLKvbdunszqLPU +DnbjjvbdySmhlrCH +DnbkKvbdnBjWxPNu +DoDKjvbdlhdTqUrB +DoCjjvbdGdKvJajK +EObjjvbdkySqryHU +EPCjjvbdYkqdTmkm +EObkKvbdDnbjkXDE +EPDKjvbdKDKCqKDY +EOcLKvbdeYZstSFz +EPDKjvbdZyDjNbkr +DncLKvbdPyNAGrrK +DoCkKvbdTlVoAuni +DncKjvbdEPCkKvbd +EPCkKvbdcTCkTcjB +DnbkKvbdcJNKLGXY +DnbjjvbdRkYfVHKs +DoDLKvbdaaWEfQQX +EPDKjvbdmbJvwnmu +EOcLKvbdZyDimcMS +DoDLKvbdYkrEUNkm +DoDKjvbdmaivwnmu +DoDLKvbdqYoIHQcx +EPDKjvbdLrWlyuQz +DncLKvbdkCkkQgVH +EObjjvbdrXPlChyR +DoCjjvbdJTYaTMwl +EPCkKvbdNsTvHFVQ +DnbjjvbdeEnqavcK +EPCjjvbdVvhwuceH +EPCkKvbdbLMFoODA +EPDLKvbdCIkCLIfK +DoDLKvbdbLLennDA +DncLKvbdyNrhYTIc +EPDLKvbdNHCpNQUk +DnbkKvbddndsLUTr +DncKjvbdaogHDkzd +EPDLKvbdZjSgpGbG +DnbjjvbdaSGDIUGL +EPCkKvbdjhGlFfNk +EPDLKvbdbKkenmcA +EOcKjvbdIHHZyXxH +DoCjjvbdiUydwRtb +EPDLKvbdauBgYKtI +EPDLKvbdZMSDsmlN +DoDKjvbddneSjtTr +EPCjjvbdJbibqJbx +DnbjjvbdGYtuAcwb +DoDLKvbdsQVoJbvG +DoCkKvbdxmrhXsIc +DoCjjvbdyNsHwsJD +DoCkKvbdKWVFceGi +DoDLKvbdsBfNMGkZ +DnbkKvbdJzoewdAN +EPDKjvbdwzHefYFS +DnbjjvbdBiKbKhej +EOcKjvbdjuvmdCXw +EOcKjvbdbhmKKevx +DoCjjvbdehLWRmpg +EPCjjvbdACrYJzJQ +EOcKjvbdhuZeXSUb +DoCkKvbdJcJbqJcY +EPDKjvbdYqMeJNEq +DncLKvbdmJDtRUqa +EPDKjvbdnBjWxOnV +DoDLKvbdOEctJIkE +DoCjjvbdDxYLtTtM +EOcLKvbdZnnJFFZj +EOcKjvbdKRZeOfNe +DoCjjvbdTukpJtAq +DoDKjvbdhyuGLpnG +DoDKjvbdhtzFWrUb +DnbkKvbdQccBQRDr +EPCjjvbdTukojUBR +EPDKjvbdeKKRvUzn +EOcLKvbdeXzTtSFz +DncKjvbdyTOJNSCH +EObkKvbdjmBkydfo +EPCjjvbdelevflik +DoDKjvbdZtJIxcrn +DoDKjvbdqiAJeNOe +DoCjjvbdddnqavbj +DoCjjvbdZLrDtOMN +EPDKjvbdZyEKNcLr +EObkKvbdMgDPmQVL +EPCjjvbdxrmiMrBg +EObjjvbdZGvdAPSi +EPCkKvbdvvkaWBWV +DncKjvbdfMewHNJk +DoCjjvbdlrYtyrdJ +DncLKvbdiLeDnVCy +DnbjjvbdvwLaWBWV +EOcLKvbdVBCRSprZ +DoDLKvbdYzbfSKVy +DnbkKvbdXrlBNUPY +EObjjvbdKfFhCAqV +DoCkKvbdVTmTekvK +EPDLKvbdaSGChTfL +DncLKvbdauCGwjsh +EObjjvbdBcpBWJlf +DnbjjvbdZjTIQHCG +DoCkKvbdDjHiuxKA +EObkKvbdZxdKNblS +DoDLKvbdptTfrRjt +DoDLKvbdJbjCqKDY +EOcKjvbdEJhKWYKA +DnbkKvbdssSSyZeD +EOcLKvbdZshhyESn +EPDKjvbdRjxfUgKs +DncKjvbdwygefYEr +EPCkKvbdiLeEOVCy +DnbkKvbdTvLojTaR +DoCkKvbdzdzOzdyp +EPDKjvbdVUNUGMWK +EObjjvbdqdEhonVa +EPDKjvbdKefHbAqV +DncKjvbdtSqsYzFD +DoDLKvbdZjTIPgBf +EPCkKvbdRjyFuHLT +EOcKjvbdUtMsfLvK +DoCjjvbdnHEwlnGy +DnbjjvbdURQnttgm +DoCkKvbdFfJrOIsq +DoDLKvbdjKGIKMwr +EOcKjvbdTAEiIBnd +EPDLKvbdFxttaEXb +DoDKjvbdJTZAsNYM +EPCkKvbdFejSNhtR +EPDKjvbdwkXEHzyf +DnbjjvbdbUafxLTh +DoCkKvbdZQleJNEq +EPCjjvbdmpZyVkZC +DnbjjvbdmJEUQuRa +EObkKvbdrEFIpNua +EOcLKvbdJpzEnfNe +DnbjjvbdyTNiMqag +EObjjvbdNQYQvOHT +EPDKjvbdGKdrbgmV +EOcLKvbdCJKakIej +DncLKvbdlhcsptrB +DnbjjvbdZirhPfaf +DncKjvbdZoNiFFZj +EOcLKvbdjuwNcaww +EOcKjvbdUyITzLPO +DnbjjvbdxVMdpyLn +EObjjvbdnCJwXnnV +EPCjjvbdIMBznWqL +EObkKvbdJpzFOenF +EObjjvbdlhdTpuRa +DncLKvbdSCDdkiZL +EObjjvbdZxcimcMS +EOcKjvbdxVMdqZLn +DoCkKvbdrJAKFMne +EObjjvbdXsMAmUPY +EObjjvbdeFOqbWbj +DncKjvbdCTBCsfWr +DoCjjvbdRyjHsCvA +EPDKjvbdziuQQDrt +EOcLKvbdziuPocrt +EPCkKvbdWWhwvEEg +EPCkKvbdeEoRavcK +EPCjjvbdSKyFuGkT +EPCjjvbdrEFIonWB +EObjjvbdrEFIpOVa +DncKjvbdzGyMANEw +EPDKjvbdrRtjmjaN +DoCkKvbdJbjDRKDY +EObkKvbdfNFvgNKL +DnbkKvbdZHWdAPTJ +EPCjjvbdCDoaWKMf +DncLKvbdJKEAKPgE +DnbjjvbdssSTYydc +EOcKjvbdIsYaTNYM +EPCkKvbdgPazvcxI +DoCjjvbdmozYvLYb +DnbkKvbdeATqNYKG +EObjjvbdIwsbIMQp +EPDLKvbdpssfrSKt +EPCkKvbdhzUfLpmf +EOcKjvbdNGcPlpUk +DncLKvbdhkeEOVDZ +EPDKjvbdLFfIBaRV +EPCkKvbdJuuGEFGi +EOcKjvbdRacdlJYk +EPCjjvbdmbKWxOmu +EPDLKvbdwtmFQxkn +DnbjjvbdgvyAzzAJ +EPDKjvbdNrsugFVQ +DncKjvbdmttzLKRf +DnbkKvbdZyEKNcLr +EObkKvbdxrmiNRag +DoDLKvbdiMFDnVCy +EObjjvbdWSNxBdlD +DnbkKvbdCTBDUFwS +DoDKjvbdYTLaMtPY +EOcLKvbdZtIiZDrn +EObjjvbdYzcGSJvZ +EObkKvbdCSaDUFvr +DoCjjvbdTppnuUgm +DoCkKvbdOTUVfduQ +EOcLKvbdfpBzwDwh +DncKjvbdGBPQyJzm +EPCjjvbdVZITyjnn +EObkKvbdVhXuxGxz +EObjjvbdiifHimXr +EPDKjvbdvwMAvAvV +EOcKjvbdkWXODbYX +DoDKjvbdmbKXXnnV +DoDLKvbdZsiJZDrn +DoCkKvbdlrZUzTDi +DoDKjvbdSQTfjGEX +EOcKjvbdqcdiPnWB +EOcLKvbdpssgSSKt +EPDLKvbdhkeENuCy +EPDKjvbdZQmEhmEq +DoDKjvbdZtJIxcrn +DncLKvbdhgJbxujV +DoCkKvbdDoDKkXCd +EObkKvbdZGvdAOsJ +EObkKvbdwjvdHzyf +EPCjjvbdUQpoUuHm +EPDKjvbdUGznMXVe +DnbjjvbduaEYroFI +DoDLKvbdehLWRnRH +DoDLKvbdgQBzwEYI +EObkKvbdbUagYKsh +EObjjvbdyqPMhiwA +EPDKjvbdvvkaWBWV +DnbkKvbdJTYaTNYM +DoDKjvbdZtIhxdSn +EOcLKvbduaEZTOdh +EObjjvbdkNCMZeGo +EPCjjvbdZLqdTnLm +DoCkKvbdUsltFkuj +DncKjvbdnPyyVkZC +DoDLKvbdwjvdHzzG +EPCkKvbdGKdsCgmV +DnbjjvbdiMFDmtby +EObjjvbddneSjtUS +DncLKvbdezvZFJUX +EPCjjvbdhbOcFWqR +DoCkKvbdaMjbTVMg +DoDLKvbdHDjvKCJj +EOcLKvbdpxoIHRDx +DoDKjvbdZshhxcrn +EOcLKvbdcJNKKewY +EObjjvbdTppntuHm +EPCjjvbdemGWfmJk +DoCkKvbdjcLkQftg +EObkKvbdQwODbkgc +EPDLKvbdCTAcUFwS +DnbjjvbdvOszpkPU +EOcKjvbdkClLRHUg +EOcLKvbdNHCpMpVL +EObjjvbdZMRcsnMN +DoCjjvbdpxnggQcx +EOcKjvbdyTOJNRbH +EPDKjvbdeKKRutzn +DncKjvbdrzLosAgn +EPDKjvbdYzcGRjWZ +EPDKjvbdQcbaPpdS +DnbkKvbdtkxXAsaX +DncKjvbdCDpAvKMf +EPDKjvbdHEKvKBjK +EOcKjvbdfpBzvdYI +DncLKvbdiifIJmYS +EPDLKvbddeOqbWbj +DnbkKvbdZyDinDMS +DoDLKvbdkNCLydgP +EOcLKvbddePSCWbj +DnbkKvbdZxcjNcMS +DoCjjvbdQwNccMID +EPDLKvbdiiehKMwr +EOcLKvbdCTBDUFwS +EPDLKvbdbLMGOnDA +EOcLKvbdUMWOaVni +DnbjjvbdyqPMhjXA +DncKjvbdCTAbsewS +DncKjvbdMpYQvOHT +EPDKjvbdTqRPVVIN +DoCjjvbdZxdJnClS +DoCjjvbdWSNwbElD +DnbkKvbdrWokcIxq +EObkKvbdWIYWXgYz +EPDKjvbdzitopDsU +EObjjvbdUVkojUBR +EPDLKvbdEObkLXCd +EOcKjvbdrbFmMHKy +DnbjjvbdehKuqmpg +EOcLKvbdZshiYcrn +DoCjjvbdZnnIdeZj +EOcLKvbdmttzLKRf +EObjjvbdGZUuBDwb +DoCjjvbdHDjvJaij +DnbjjvbdKQzFPGNe +DncKjvbdRbDeMJYk +DoCjjvbdezuyEhsw +DoDKjvbdwkWdHzzG +DncKjvbdEASJMyvw +DncLKvbdyfyMANEw +EPCjjvbdCSaDTfXS +EOcKjvbdCJKajiGK +EObjjvbdrJAKFNOe +DnbjjvbdFWZPoljF +DnbjjvbdmpZyVjyC +EPDKjvbdiifIKNYS +DncKjvbdGAnqYizm +EOcKjvbdiMFEOVDZ +DnbjjvbdJXtBglRQ +DoCkKvbdijGHilwr +DoCjjvbdDwxMUUUM +DoDLKvbdUMWPBVni +EPCjjvbdDwwksssl +DnbkKvbdNeDshhkE +EObkKvbdbAudfQQX +DnbkKvbdwuMdqZLn +DnbjjvbdijGHjNXr +EPCjjvbdOFETiIkE +DoCjjvbdxsOImSCH +DoCkKvbdLiBkqYAS +DncKjvbdFkFTDHmV +DoCjjvbddoErjstS +EObjjvbdyOTIXsIc +DncKjvbdeXzTtSFz +DoCjjvbdqdFIonWB +EPDLKvbdMpYRWNgT +DoDLKvbdfNGXHNJk +EPCjjvbdePErkTsr +DoCjjvbdNHCpNQVL +EObjjvbdsQVnjCuf +DnbjjvbdtcDUwWPP +DoCjjvbduaDySndh +EPDKjvbdqZPIGqDx +EObjjvbdijFgimYS +DncKjvbdZyEJmblS +DoDKjvbdirziSkJz +DncLKvbdeOeTKtTr +EOcKjvbdfpBzwEYI +DnbkKvbdezvZFItX +EPCjjvbdrRuLOKaN +DncLKvbdbrbjscjB +EObkKvbddBrlrAUN +EPDKjvbdZoOIdeZj +EOcKjvbdGYuUaEYC +EPCkKvbdNxPVzdNt +EOcLKvbdhlFDmuDZ +DncKjvbdKVtecdgJ +EPDLKvbdqlzJxkhJ +EOcKjvbdySmhlqbH +EPCkKvbdxsNiNRag +EPDKjvbdTYKkmzjx +EObkKvbdIryBTMxM +EPDLKvbdxnShXsIc +EPCjjvbdaSFbhUGL +EObjjvbdRDbaQQdS +EObkKvbdrbFmMGkZ +EPCkKvbdWXJXudEg +EOcLKvbdcJNKKfXY +DncKjvbdEuxpPljF +DncKjvbddCTNSATm +EOcLKvbdFVyQPmKF +EPCkKvbdpeceUWBI +DoDLKvbdVTmUGMWK +DoCjjvbdFyVVBEXb +EOcLKvbdTukpKTaR +DncLKvbdDHLegAzc +EPCjjvbddxZtTrFz +DncKjvbdssRsZZeD +DoDKjvbdeOeSjstS +DoDKjvbdQdDApQcr +DncLKvbdURQoUuIN +DnbkKvbdezuxdiUX +EPCjjvbdbPgHDkzd +EOcKjvbdFWZQQMjF +DoDKjvbdMfcQMotk +EPCjjvbdrWokbiYq +DoDKjvbdnGdwmOGy +EOcKjvbdnBjXYOmu +EOcLKvbdDoCjjvbd +DoDLKvbdsQVoJbuf +EObkKvbdZirhQHBf +EPCkKvbdIGgZxwwg +DncLKvbdrMzKZMIJ +DnbkKvbdkHflFemk +EObkKvbdfHkWSORH +DnbkKvbdwygfGYEr +EOcKjvbdxmrgxTJD +DnbjjvbdGdLViaij +DoDKjvbdmSYtysEJ +EObkKvbdfILVqmpg +DncLKvbdADSXizIp +DoCjjvbdznpQdbkx +DncLKvbdmbKWxOnV +EPCkKvbdJvUfEEfi +EOcLKvbdcScLTdJa +DnbjjvbdQcbaPpdS +EPDKjvbdDoDKjvcE +DncKjvbdhzUfMROG +DncKjvbdbrcKtDia +EOcLKvbdJpydoFme +DnbjjvbdxLWdHzyf +EPCjjvbdwuMeQyMO +EOcLKvbdiifHimXr +EOcLKvbdySmiNSCH +EPCjjvbdznopeCkx +EPDLKvbdZshhyESn +DoDLKvbdrDeJQNvB +DoDLKvbdILaznXQk +DoCjjvbdnUtzKiqf +DnbkKvbdjJehKMwr +EOcLKvbdDxXlUUUM +DoCkKvbdtSqsYyeD +DoDKjvbdxVMeQxlO +EPDLKvbdZjTHofaf +EObkKvbdZisHogBf +DnbkKvbdnBiwXoOV +DoCkKvbdYSkaMtPY +DncLKvbdHELVibKK +EPCkKvbdhlEcnVCy +EPCkKvbdZLqdTnMN +DoDKjvbdbsCkUEKB +EPCkKvbdMpYRVnHT +EOcLKvbdFWZQPljF +DoDLKvbdznoqEcLx +DnbkKvbdcImJjewY +EPCkKvbdvvlBVaWV +DoCkKvbdmIdTqUrB +DncKjvbdxZgeexFS +EOcLKvbdrouoJbvG +DoCkKvbdWRnYBdlD +DoCkKvbdBhjbLJFj +DnbjjvbdrouoKDWG +DoDKjvbdUxgsyjnn +DoDLKvbdakMFnnDA +EOcLKvbdZtJJYcsO +DncLKvbdrbFllHKy +EPCjjvbdmajXXnmu +DncLKvbdpyPHgQdY +EObjjvbdyNrgwsJD +EPCjjvbdaMjaruMg +DncLKvbdYfwEAPTJ +DoDKjvbdbiNKLFvx +DoCjjvbdajkfOnDA +EObjjvbdZoOJEeZj +EOcKjvbdqZOhGqEY +EOcKjvbdziuPodTU +DoDKjvbduLxWaUBX +EObkKvbdyXhjBoyk +DoDKjvbdTkunaWPJ +EObkKvbdBraCsfXS +DoDLKvbdTAEiICPE +DnbkKvbdDjHjVwjA +EOcKjvbdqlzKZLhJ +EObkKvbddneTLTsr +EObkKvbdWRmwaeMD +DoDLKvbdLBLHNBwq +DoDLKvbdUxhUZkPO +DncKjvbdYlSDsmkm +DoCkKvbdxZhGFwdr +EObjjvbdbsDKsdJa +EPCkKvbdGYuVAdYC +EObkKvbdRXNccLhD +DnbjjvbdFVxpQMjF +DoDLKvbdMgDQNPtk +EObkKvbdQvmccMHc +DncKjvbdMpXqVnHT +DoCjjvbddZxoxYqC +DncKjvbdnVUzKjRf +DoCjjvbdEuyQPmKF +DoDKjvbdLYqKSzuG +EPDLKvbdTAFJICOd +DoCjjvbdCJLCKiFj +EOcLKvbdFyVVAcwb +DoCjjvbdbQHHDkzd +DoCkKvbdNrsvGduQ +DnbjjvbdRWmcblID +DnbkKvbdQvnEDLgc +DnbjjvbdVZITzKnn +EPDLKvbdxxJJaoyk +EObkKvbddoEsLUTr +DncLKvbdZQldhldq +DoDLKvbddCSmSAUN +DoDLKvbdYpldhldq +DoDLKvbdDxXlUTsl +EPCkKvbdnGdxMmfy +DncKjvbdwWlBWAuu +EOcLKvbdkDMKpgUg +DoDLKvbdZshiYdSn +EPDLKvbdhfjCyWKV +EObjjvbdKRZeOeme +DoCkKvbdznopdcLx +EPCkKvbdZMSDsnMN +DnbkKvbdkWWmcbXw +EObjjvbdpxoHfqEY +DnbkKvbdtlYXAsaX +EPDLKvbdjvXNcaww +EPDLKvbduDDVXVoP +DoDKjvbdLGFgbBQu +EObjjvbdmuUzLKRf +EObjjvbdRaceMIyL +EPDLKvbdiHKCyVjV +DoCkKvbdxnTHwriD +EOcLKvbdZjTIPgCG +DncLKvbdBcpBVjNG +EPDLKvbdVwIxVceH +DoCkKvbdkIGkeemk +DnbkKvbdozmdKxPA +DoDKjvbdjuwNdCXw +DoCkKvbdeEoSCXCj +EPCkKvbdcScKtEJa +EPDLKvbdySnIlrBg +EPCjjvbdnQZyVkYb +DoDLKvbdqYnggREY +EObkKvbdBsBDUGXS +DnbkKvbdUWLoitAq +DoCkKvbdIGgZxxYH +DoDLKvbdvwLaWBVu +EObjjvbdmfeXlnHZ +EPDLKvbdRXNdDMID +EPCjjvbdZLrDsmkm +EOcKjvbdUQpoUuHm +DnbkKvbdEzsqFMDJ +EOcLKvbdQlwayOUz +EPDKjvbdyzdnRhJI +DoDLKvbdwzHfGXeS +EOcKjvbdTvMPitBR +EOcKjvbdJbicRJcY +DoDLKvbdFVxpQNJe +DoDLKvbduLxXBTaX +DoCjjvbdLYpirzuG +DnbjjvbdvwMAvBWV +EPCkKvbdBiKbKiFj +DncLKvbdIryArmYM +DncKjvbdySmiNRag +DncKjvbdeEoRbWbj +DoDLKvbdjuwOECXw +EPDLKvbdFWZPomJe +EObkKvbdjcMLRGtg +DncLKvbdQwNccMHc +EPDLKvbdzQoMiJwA +DoDKjvbdmSYtzSdJ +EOcLKvbdelfWgMjL +EOcLKvbdiMFENuCy +EPCkKvbdezvZEhsw +EPDLKvbdUVlPisaR +EPDKjvbdbKlGOmcA +EObkKvbdzGyMANEw +DoDKjvbdXFxzUAPT +EPDLKvbdqrUkNkAm +EOcKjvbdPxmAGsSK +EOcLKvbdyfyMAMeX +EObjjvbduDDUwVoP +DncLKvbdyYJJbQZk +DoDLKvbdxVNEqYkn +EPCjjvbdNPxRWOHT +EObkKvbdYqNEiNEq +EPDKjvbdXrlAlsoY +EPDLKvbdbrcKtEJa +EObjjvbdGdKvJbJj +DoCjjvbdrDeJPnVa +DoDKjvbdZLrETnMN +DoDKjvbdKVuGDeGi +DoCkKvbdZtJIyETO +EObjjvbdYSlAlsoY +DoDLKvbdCSaDUGWr +EObjjvbdmfeYNNgZ +DoDKjvbdtumwiqTA +DncKjvbdqFdEtWAh +EPCkKvbdauCHXjtI +DnbjjvbdvOszqKoU +EOcKjvbdxrnImSBg +DoCkKvbdjvWmdBww +EPCjjvbdmuUzKiqf +EObjjvbdNdcsiIjd +EOcLKvbdNPxRVnGs +EObkKvbdSPsgKFdX +EPDLKvbdVAbQsQqy +EPDKjvbdVZHsyjoO +DncKjvbdJzofXdAN +EObkKvbdFjeTChNV +DnbjjvbdjJegjNXr +DnbkKvbdZLrDsnLm +DnbjjvbdbAueGQQX +DncLKvbdQcbaQQdS +DnbjjvbdFjdrbglu +DncLKvbdAMgxsWyx +DnbjjvbdRpUHKGDw +DncLKvbdMfcPlpVL +EObjjvbdIwtBhMRQ +EPCkKvbdelfXGmKL +DoDLKvbdFkErbhMu +EPCjjvbdHffyyYXg +DoDKjvbdOEctJIkE +DoCkKvbdKkAgvAKZ +EObjjvbdzitopDsU +EPCjjvbdRpUHJfEX +DoCkKvbdZLrDtNkm +EPCkKvbdijGIKNXr +DoCjjvbdxUmEpxlO +DnbjjvbdIxTbIMRQ +EPCkKvbdMfbpMotk +DncLKvbdjlbLzFGo +EObkKvbdrRtkNjaN +DnbkKvbdRosgKFcw +EPDLKvbdpfDeUWAh +DnbkKvbdkxsRryHU +EPCkKvbdkVvmcbXw +EOcKjvbdhficZWJu +EPDKjvbdCEQBWKMf +DoCjjvbdUyITzKoO +DnbjjvbdaNKbStmH +EPDLKvbdFWYpQMie +EObjjvbdhytekqNf +EObjjvbdeXyssqez +DnbkKvbdLAjgNCYR +DncKjvbdSBdFLiZL +EPDKjvbdBhkBjiGK +DoDKjvbdmajWxOmu +DoCjjvbdrMzJyMHi +DoDKjvbdZLqctOMN +EOcKjvbdnPzYujxb +DncKjvbddoFTKstS +DncLKvbdjcMLRGuH +DoCkKvbdbUagYKtI +DncLKvbdVAaqTRSZ +EPCjjvbdOEdTiJLE +EPCjjvbdJvUfEFHJ +DnbjjvbdIryBTNYM +EPDKjvbdYpleJNEq +DncKjvbdZGwEAOri +DncLKvbdBdQAvJmG +DoCkKvbdmIdTqUqa +EPCkKvbdtcCuWuno +EPCjjvbdmuUyjjSG +DncLKvbdjAQHApHK +EPCjjvbdGdKujBjK +EPDKjvbdYkrETmlN +DncKjvbdYORAYUut +DnbkKvbdiHKCxvJu +EPCjjvbdkHgLfGOL +DoCjjvbdpssfqqkU +EPDKjvbdZnmheEzK +EPDLKvbdySmhlrCH +EPCkKvbdjJegilxS +DoCkKvbdqcdhpNua +EPDKjvbdIHHZyXxH +DnbjjvbdjmBkydgP +DoCjjvbdYkqcsnLm +EPCkKvbdZnmhdeZj +EPDLKvbdDjIJuwjA +EOcLKvbdnQZxvKyC +EPCkKvbdBhkCKiGK +DnbjjvbdYkrDsnMN +DncLKvbdyzeNqghh +DncLKvbdrRuKmjaN +EPCjjvbdssRsYzEc +DoDLKvbdZQleJNFR +EObjjvbdZQleJMeR +EPDKjvbdtvNxJqTA +EObjjvbdbBWFGPpX +EPDLKvbdajkeoODA +EPDLKvbdSZihTCvA +EObkKvbdZMRdTnMN +EPCkKvbdsCFmLgKy +EObjjvbdVvhxVceH +EPCkKvbdaaVeFpQX +DoCjjvbdZQmEhleR +EOcKjvbdhzUfLpmf +EPCkKvbdREDBQRDr +DncLKvbdemFwHNJk +EOcKjvbdGAnqYizm +DncLKvbdtTRsZZdc +DoDLKvbdGGKRmhtR +DoDLKvbdIidAJogE +DoCkKvbdxZhGFxEr +DncLKvbdpxoHgREY +DnbjjvbdQcbaQRES +EPDKjvbdjAPfaPgK +EPCkKvbdvwMAuaWV +EOcKjvbdZLrDsnMN +DncKjvbdyqOlhiwA +EObkKvbdRacdkiYk +DoDKjvbdUWMQJsaR +EPDKjvbdUGzmkvvF +DoCjjvbdhbPDFXRR +EObjjvbdXGZZtAPT +EPCjjvbdMoxRWNgT +EOcKjvbdGFiqmhtR +DoCkKvbdNPxRWNgT +EObkKvbdyNrgxTJD +EPDKjvbdrXPkcJYq +EOcLKvbdFjeTChMu +DncKjvbdjvXNcaww +DncKjvbdkMbMZdgP +EOcKjvbdDnbkLXDE +EObjjvbdbBWFGPow +DoCjjvbdAMhZSwZx +EPDLKvbdZRNEiMeR +DoDKjvbdqdEiQNvB +DoCkKvbddePRavbj +EPDKjvbdaMjbStlg +EObkKvbdHgGyxxYH +EOcKjvbdtkxXBUAw +DnbjjvbdmSZUysEJ +EObkKvbdrXQLbhxq +EObkKvbdVTlsfMWK +DoDKjvbdSLZGUfjs +DoCkKvbdFVyPpMjF +DoCjjvbdhgKCyViu +EPCkKvbdZMSDtOLm +EPCjjvbdySmhlqag +EPDKjvbdWRmwadlD +EPCjjvbdqZPHfpdY +DoDLKvbdXsMBMsoY +DncLKvbdelewHMjL +EObjjvbdYpleImEq +DoDKjvbdZirgogBf +EOcLKvbdrXPlChxq +EPCkKvbdFVxpQMie +DoCkKvbdrNZjZMHi +EOcKjvbdDjIJuxKA +DncLKvbdeOeSkTsr +DoCjjvbdZoNhddyj +DoDKjvbdkWXNcaxX +DoDLKvbdTpqOtthN +DnbjjvbdehKuqnQg +EPCjjvbdmgFXlmfy +DncLKvbdShyiqAAl +EOcKjvbdKaKgNBwq +EPDKjvbdEztREkbi +EOcKjvbdVviXvEFH +EPDKjvbdcIlikGWx +EPCkKvbdUWLojUAq +EPDLKvbdOStWHEtp +DoCjjvbdHlBzmwRL +DnbjjvbdWIYVxHYz +EPDLKvbdADSXjZhp +EPDKjvbdRzJgrcWA +EObkKvbdxrnIlqag +EObjjvbdRosgKFcw +DoDKjvbdkySrTYgU +DncKjvbdsrqrxydc +EPDLKvbdZyEKODLr +EPCjjvbdEXxMUUTl +EOcKjvbdtcCtwWOo +DncLKvbddndrkTtS +EPDKjvbdrafMkfjy +EPCjjvbdJcJbpibx +EObkKvbdFfJqnIsq +EPCkKvbdyNsHwriD +DoCjjvbdaRebgsfL +DnbjjvbduoTzpjnt +EPCjjvbdZGvdAOsJ +DoDKjvbdmozYujyC +EPDKjvbdZGvdAPSi +DnbjjvbdmSYtzTDi +DoCjjvbdRotGjFdX +EObkKvbdSBceLhxk +DoCjjvbddijRvUzn +EObkKvbdMgDQNPtk +DoCkKvbdFVxoomKF +DncKjvbdGcjujBjK +EPDKjvbdBcpAvJlf +DncLKvbdLBLHNCYR +EObkKvbdmIctQtrB +DoDLKvbdFpATXGey +EPCkKvbdbrbkUDjB +DncLKvbdcTCjtEJa +DncLKvbdBsAbsfXS +EPDKjvbdFpATXGfZ +DoDKjvbdwuMeQxlO +EObkKvbdqUUGqrKt +DncKjvbdZyEKODLr +EPDKjvbdjhHLefNk +EPCkKvbdrbFmMGjy +DoCkKvbdsQWOjCvG +DoCjjvbdLBLHMbXq +EObjjvbdrpVnicVf +EPCjjvbdVqmwaeMD +DncLKvbdRNYCYnUz +EObjjvbdRXNdCkhD +DncKjvbdIHHZyYXg +DnbjjvbdyTOJMrCH +DoDLKvbdUsmUFkuj +DncKjvbdQcbaPqES +DnbkKvbdmgFYNNgZ +EOcKjvbdkySrTYgU +DoCjjvbdHlBzmwQk +DnbjjvbdaSFcITek +EObjjvbdQdCaPqDr +DncKjvbdxVMdpyLn +EOcKjvbdiMEdOVCy +DoCjjvbdRosgJecw +DncLKvbdkDMLQftg +EPCkKvbdKDKCqKDY +DoCjjvbdjvWnDaww +EOcLKvbduVnYJpsA +DoDLKvbdWRnYBdlD +DoDKjvbdssSSxzFD +EPDLKvbdJYTaglRQ +EOcLKvbdhzUfLpmf +DoDLKvbdJutfDdgJ +EOcKjvbdxmrgwrhc +EObkKvbdwWkaVaVu +EOcKjvbdxrmiMrBg +DoDKjvbdRDcApRES +DoCjjvbddjJrVtzn +EOcKjvbdxVNEqYlO +DoCjjvbdJJdAJofd +DoDLKvbdemGWfmJk +EOcKjvbdnPyyWKyC +DoCjjvbdbrcLTcia +DoDKjvbdjuvmdCXw +DncLKvbdtkwvaUAw +EOcKjvbdHDkViaij +EObkKvbdRDbaPpcr +EOcLKvbdtSqryZeD +EOcKjvbdrRuLOKaN +EOcKjvbdczYowyRC +DnbkKvbdjcMLQfuH +DncKjvbdmbJwYOnV +EPDLKvbdZnmiFEzK +EPDKjvbdjbkkQgVH +EObkKvbdJTZArmYM +DncKjvbdSPsgJfEX +DncLKvbduMYXBUBX +EObkKvbdkIHMFfOL +EOcKjvbdYORAYVWU +DoCjjvbdyzdmqghh +DncLKvbdtumwiqTA +EPDKjvbdQmYCZOUz +DoCjjvbdtcCtvvPP +EObjjvbdVTmUGMVj +EObkKvbdBsAcUGXS +DoCjjvbdqYngfqDx +EPCkKvbdtkxXBTaX +DoDLKvbdACqwiyhp +DncKjvbdraelkgKy +EPDKjvbduLwvaUBX +DncKjvbdpssgSSLU +EPCjjvbdIxTbHlRQ +EPDKjvbdPyNAGrqj +DoDLKvbdnCJvxOnV +EObkKvbdZRNFJNEq +DoCjjvbdFxuVBEYC +EOcKjvbdVAbRSpqy +DnbjjvbdJbibqKDY +DoDLKvbdKCicQjCx +EPCjjvbdNrtVgFUp +EOcLKvbdZQleJNEq +DoDLKvbdaRebgsfL +DoCkKvbdCIjakIej +EOcLKvbdBraDUGWr +EPDLKvbdADRxKZiQ +DoCjjvbdHkazmvpk +EPDKjvbdUsltGLvK +EOcKjvbdTkvOaVoJ +DncLKvbdZnmiEdyj +DoDKjvbdZtJJYdSn +DoDLKvbdbiNJjfWx +DnbjjvbdIsZBTNYM +EPCkKvbdhbPDEvpq +DncKjvbdqlyjYlIJ +DoCkKvbdbsDLTcia +DoDKjvbdKCjCqKCx +DoDLKvbdnBiwYOmu +DnbkKvbdjKGIKMwr +EPCjjvbdHgGyxxYH +EOcLKvbdcyxpXxqC +DncLKvbdlZSrSyGt +EPCjjvbdTAFIhCPE +EObkKvbdZdwfzgiC +DoDLKvbdSLYfUgLT +DoCjjvbdRMwayNtz +DnbjjvbdCflGHAzc +DoCjjvbdrJAKFNOe +EPCjjvbdjblKpgUg +EPDLKvbdQccAoqDr +DnbjjvbdCJKbKhfK +EPDLKvbdiGibyWJu +EOcLKvbdyNsHxShc +EPDLKvbdmIcspuSB +DnbjjvbdnGdxNOHZ +DoCkKvbdhzVGMRNf +DoDLKvbdeFPRawDK +EObjjvbdsQWOjCvG +EObkKvbdhzUelQmf +EObkKvbdeJirWUzn +DncLKvbdxxIibPzL +EObkKvbdSBceMIxk +DoCkKvbdehKvRmqH +EObjjvbdRbDeLiZL +EObjjvbdGYtuAdYC +DnbjjvbdHDkVibKK +DoCjjvbdKQyeOfNe +DoCkKvbdmbJvxOmu +DoCkKvbdULvOaWPJ +DncLKvbdrWpMCiZR +EObjjvbdhytfLqNf +DoCjjvbdgPazvdXh +DoCjjvbdiHKDYuiu +EPDKjvbdRWnDbkhD +DncLKvbdrMzKZLhJ +EObkKvbdyXhiaoyk +EPCkKvbdjmCLydfo +DnbkKvbdDxYMUTsl +EPDKjvbdxmrgxSiD +DnbkKvbdmSYtyrci +EPCjjvbdqvokcIxq +DoDLKvbdXsMAmUPY +DncKjvbdDoDKkWcE +EPCkKvbdMgDPmQUk +DoDLKvbdKyQirztf +EPCjjvbdmajWwnmu +EOcLKvbddCSlrATm +EPDLKvbdrJAKElne +DoCkKvbdIsZBTMxM +DnbkKvbdffMZnGgA +EOcKjvbdJcKDQjDY +EObjjvbdxsOJMrCH +EObkKvbdEKHiuwjA +DncKjvbdunszpjnt +DoDLKvbdZjTIQHCG +DnbjjvbdsQVnibvG +DnbkKvbdGQATXHGZ +DnbkKvbdBsBDTfXS +DoCkKvbdBsAbsevr +DoCkKvbdRXNdDLhD +EPCjjvbdRadElJZL +DnbkKvbdxwhibPzL +EOcKjvbdCJLBjiFj +DncLKvbdZMSDsmkm +DoDKjvbduaEZSoFI +EPCjjvbdhgJbxujV +EOcLKvbdCJLBjhfK +DoCkKvbdZisHpHBf +DoCkKvbdqFdFUWBI +EPCkKvbdDGlFgAzc +DncKjvbdZxcjNblS +EPDLKvbdLqvmZuQz +DoDKjvbdxZhGFxFS +EObkKvbdZdxGzhIb +DoDLKvbdqwQMChyR +DoCkKvbdjlalZeGo +DncKjvbdZRNEhldq +EPCkKvbdZHXEAPSi +DoDKjvbdDoDLKwCd +DnbkKvbdmbJwYPNu +DncKjvbdMfcPlouL +DoCkKvbdQwODblHc +DoCjjvbdNQYQunGs +DnbjjvbdlqxtzSci +EOcLKvbdrDdhpNua +DncLKvbdKefICApu +EPDKjvbdatagXkUI +DoCjjvbdaofgDkzd +EObkKvbdIrxaTMwl +DncLKvbdSLYfVGkT +EPCkKvbdelevfmKL +DncKjvbdFfKSOIsq +EObjjvbdfILVqnQg +DncLKvbdZjShPgCG +DoCjjvbdrNZixlHi +DnbkKvbddoFTKstS +EOcKjvbdWSNwbFMD +EPDLKvbdpxngfqDx +EOcKjvbdIHGyxxYH +EOcLKvbdvwMAuaVu +EOcKjvbdkxrqryGt +DncLKvbdZjShQHBf +DnbjjvbdiUzEvquC +EObkKvbdpxoHfpcx +DoCkKvbdGAoRZJzm +EOcKjvbdehLVrOQg +EPDKjvbdkDMLRGuH +DnbkKvbdKCjDRKDY +EPCjjvbdLGFhBaRV +EPDLKvbdaMjbSuNH +DncKjvbdWfYzUAOs +DoCjjvbdsBelkfjy +DncLKvbdZnmheFZj +EOcLKvbdatagYLUI +EObkKvbdWXJXvEEg +DoDKjvbdZMRdTmlN +EPCjjvbdWXIwvEEg +DoCjjvbdkCkjqHUg +EPCjjvbdijFhJlxS +EPDKjvbdmSZUysEJ +DoDKjvbdMgDQMouL +EPCkKvbdrDdhomvB +EPCjjvbdRNXbYmtz +EPCkKvbdUtMtFlWK +DnbjjvbdGcjvJajK +EPDKjvbduaDyTOeI +DncLKvbdziuPocrt +DoCjjvbdcScKscjB +DncKjvbdmgExMmfy +EObjjvbdJcJcQibx +EPDKjvbdMpXpvNfs +EObkKvbdyqPNIjXA +EPCjjvbdCSaDUGWr +EOcKjvbdZnnJFEyj +EObkKvbdyOSgwriD +EPCjjvbdtkwwAtBX +DnbkKvbdDncLLXDE +EOcKjvbdZshhxcsO +DoCjjvbdxVMdpxlO +DncKjvbdLGGHaaQu +DoCkKvbdxUmFQyMO +EPDKjvbdpfEEsvAh +DoCkKvbdZRMdhldq +EPDLKvbdYzberJuy +EObjjvbdfHkWSOQg +EPDLKvbdRMxByNtz +DncLKvbdmoyyWLZC +EObkKvbdhtydvrVC +DoCkKvbdVhYWYGxz +EPDKjvbdbVCHXjsh +EPCkKvbdTlWPBVni +DncLKvbdFkEsCgmV +DnbkKvbdIsYaSlxM +DncKjvbdzaAOffbM +DncLKvbdaSFcHtGL +DoDLKvbdiGjDYuiu +EObjjvbdDigjVwjA +DncKjvbdqmZixlIJ +DnbkKvbdRjxfUgLT +EObkKvbdeAURNYKG +EPCjjvbdjvWnECXw +EPCjjvbdNQXqVmgT +DoDLKvbdxmsHxShc +EPCkKvbdqwPlChxq +DnbjjvbduLwwAsaX +DncKjvbduCbuWuno +DnbkKvbdJpydnenF +EPDLKvbdRXOEClID +DncKjvbdSKyFuGkT +DncKjvbdczZQYZRC +EPCkKvbdGZUtaDxC +EPCjjvbdOAJTUKSA +DnbkKvbdsZlQSaHn +DncKjvbduWNwiqTA +DoDLKvbdRNYCZOUz +DoCkKvbdVTmTfMVj +EOcLKvbdeATpmYJf +DncKjvbdbUbGxKsh +DnbkKvbdLZRKSztf +DncKjvbdcJMjLFwY +DnbkKvbdRadEkhyL +EPCkKvbdauBgXkTh +EObkKvbdrJAKFNOe +EOcKjvbdDnbjkXDE +DoDKjvbdrafMlGjy +EOcLKvbdliDtRVRa +EObjjvbdZjShQHCG +DnbjjvbdZnmiFEyj +EPDKjvbdbAueFpQX +EPCjjvbdVwJYVcdg +EObkKvbdijGIJmYS +DoCjjvbdJpyeOenF +DoDKjvbdYlSDsnMN +DncLKvbdehLVqmqH +DnbjjvbdTppnuVHm +EOcKjvbdSLYetgLT +EPCkKvbdZyEKOClS +DoDKjvbdHDjujBij +EPCkKvbdHkazmvpk +EObkKvbdkxrrTYft +EPCjjvbdOTUVfeVQ +DoCjjvbdYzbfSKWZ +DncKjvbdkxrrSxgU +EObjjvbdEOcKkXCd +EPDKjvbdcTCkTcia +DoDKjvbdatagXkTh +DoDLKvbdNHCpMpUk +DoDKjvbdhtzEvquC +EPCjjvbddePSBvbj +DoDLKvbddneTLUUS +DncLKvbdijFhKMwr +EPDLKvbdpxoIHRDx +DncLKvbdqquLOKaN +EPCkKvbdSCEEkiZL +DoDLKvbdvAdYroEh +DncLKvbdDwwksstM +EOcKjvbdKWVFcdgJ +EPDKjvbdZnmhdeZj +DoCjjvbdJSyBTMxM +DoDLKvbdtcDVXVoP +EOcLKvbdbAudfPow +EPCjjvbdpfDdtWAh +DncKjvbduCcUwWOo +DnbjjvbdGFirOItR +DnbjjvbdLBKgNBxR +DnbjjvbduVnYJpsA +DnbjjvbdjuvnDbXw +DoDKjvbdFkFTDINV +EOcKjvbdEvZQQMie +DoCkKvbdMfbolpUk +EPCjjvbdhbPCdwQq +DoDKjvbdZyEKNblS +EPCjjvbduCbtwWPP +DnbjjvbdgLGzbfAE +EObjjvbdqGDdsvAh +EPDLKvbdNGbolotk +DoCkKvbdSPsfifEX +DncLKvbdbVCGwjsh +EObkKvbdijGHjMwr +DnbjjvbdRosfifDw +DoCjjvbdQccApRDr +DoDKjvbdqTtHSSKt +EOcLKvbdsQWPJcVf +EObkKvbdeOdsLTsr +DncLKvbdcTDLUDjB +DoDKjvbdVgwvXfxz +EOcKjvbduoTzqKnt +EPCjjvbdYNqAYVWU +EObjjvbdemGXGmJk +DoCkKvbdVgxWXfxz +DoCjjvbdqlzKZLgi +EPDLKvbdLFfHaaQu +DnbkKvbdcSbkTcjB +EObjjvbdgGLzNgHA +EObjjvbdZjSgpGbG +DnbjjvbdGckVjBij +EOcLKvbdUMVnaWOi +EObkKvbdrylQSaHn +EPDLKvbdZHWdAOri +DoDKjvbdyfxlAMdw +DnbjjvbdZMSDsnLm +DoDKjvbdOTUVgEtp +DnbkKvbdJSxaSlwl +DncKjvbdkNCLzFGo +DoDKjvbdfMevgMik +DnbjjvbdMgDPlpVL +DncKjvbdqquLOLAm +DoCkKvbdfNFwGlik +DncLKvbdpxnhHRDx +DoDLKvbdZMRdTmlN +EPCkKvbdURRPVVHm +EPCkKvbdmgEwmOHZ +EOcLKvbdVAapsRSZ +DoCjjvbdczZPwxpb +EPDLKvbdWXIxWDdg +EPCkKvbdUVlQJtBR +EOcKjvbdelfWgNJk +EPDKjvbdUtMtFkuj +DnbjjvbdRkZFtfjs +EObkKvbdCJLCLJGK +DoDLKvbdKVuGEEgJ +DncKjvbdIxTbHkqQ +DncLKvbdMSWlzUpz +EPCkKvbdKefICAqV +EOcKjvbdtunXjRTA +DoDLKvbdZMSETmlN +EObkKvbdapHHELzd +EObkKvbdmRxtyrdJ +DoCjjvbdtTSSxzEc +EObjjvbddeOrBvbj +DncLKvbdJYUBgkpp +EPCjjvbduLxXBUAw +DnbjjvbdSLYetfjs +DncKjvbdzQnmIiwA +EPCjjvbdRpUGjFdX +EOcLKvbdddnqbWcK +EOcKjvbdWWhwucdg +EOcLKvbdCWzdJEov +EPDKjvbdTkuoAuni +DncLKvbdqUTgSSLU +DoDLKvbdNHDQMotk +DncLKvbdWXJXvEEg +EPCjjvbdaNKaruNH +EPDLKvbdraelkfjy +DncLKvbdLqvmZtpz +DnbjjvbdNddThhkE +DoDKjvbdzoQQdcLx +EPDKjvbdYpldiNFR +EObjjvbdZtJIyDsO +DoCkKvbdWWiYWDeH +DoCkKvbdeEoSBwDK +DoCjjvbdBsAcTevr +EObjjvbdqvpMChyR +EPCjjvbdsCGMlHKy +DnbkKvbduLwwAtAw +EObkKvbdMRwMyuQz +DncLKvbdwWlAuaWV +DncLKvbdHgHZxwxH +DncKjvbdBsAcTewS +DoDLKvbdJpyePFme +DncKjvbdVUNUFlWK +DncKjvbdEYXktTtM +DncLKvbdwMvANDeN +DnbkKvbdtSrTZZeD +EOcLKvbdJYUBhMRQ +DncKjvbdlYrrTZGt +DoDLKvbdliDsqUrB +EObjjvbdegjuqnQg +EObjjvbdlZSrTZHU +DncLKvbdfNGWfljL +DoDLKvbdLFegbBQu +DncLKvbdemGXGmKL +EPDKjvbdDwwksssl +DnbjjvbdxmsIYTJD +DoDLKvbdBsBCtGWr +DoCjjvbdIsYaTNYM +DncKjvbdJuuGEEgJ +EObkKvbdkySqsYgU +DnbkKvbdNPwqWNfs +EPDLKvbdmIdTptrB +DoDLKvbdyqOmIjXA +EPCjjvbdhkeEOUcZ +DoDKjvbdJqZePFme +EPDLKvbdfSAvzlCo +EObjjvbdbhljLFvx +EOcLKvbdaMkBsUmH +DoCjjvbdKyRKSzuG +EObjjvbdcSbjtEJa +EOcLKvbdkHflGFmk +DoDLKvbdemFwHMjL +EObjjvbdSLZGVHLT +DoCjjvbdJXtCILpp +EOcLKvbdaaVdfPow +EOcLKvbdFpATWgGZ +DoCjjvbdxZgeewdr +EObkKvbdeEnqawCj +EObjjvbdhytfMQmf +DnbjjvbdoznEKxPA +DnbjjvbdoAKzsgdO +DoCkKvbdYzbfRivZ +DoDLKvbdqqtkOKaN +DncLKvbdqvokcJYq +EPDKjvbdOStVfeUp +DoDKjvbdZxcinDLr +DoCkKvbdcyyQYYqC +EObkKvbdcIlikGWx +EOcLKvbdffLzNgHA +EPCjjvbdMtsRkNAX +EOcKjvbdpeceTvBI +EOcKjvbdZsiIxcsO +DncLKvbdJvVGDdgJ +DnbkKvbdZMRdTmlN +EPDLKvbdnCJwXnnV +EObkKvbdxUldqZLn +EPCjjvbdNddUJIkE +DoCjjvbdyYJJapZk +DnbjjvbdpxoHgQcx +EObjjvbdHDjvKBij +DncKjvbdUtNUFlWK +EPCkKvbdkVvmdBww +DnbjjvbdgGMZmgHA +DoDLKvbdmIdTqVSB +EOcLKvbdzitpPdTU +DncLKvbdkxrqrxgU +DoCjjvbdVBBpsRSZ +EOcLKvbdGFiqmiTq +EOcKjvbdxsOJMqag +DoCkKvbdHDkVjCJj +EPDKjvbdjSziTKiz +EOcKjvbdCTAbsewS +EPCkKvbdkWWnDbYX +DoDLKvbdJSxaTMxM +DoDLKvbdMoxRWNgT +DoDLKvbdmuVZkJrG +EPDKjvbdbUbHXjtI +DnbjjvbdkWWnEBxX +EOcLKvbdnPyxukZC +DnbjjvbdXrlBMtOx +DoDLKvbdJuuGEFGi +EPDKjvbdUaBprprZ +EObjjvbdsrqrxydc +EObjjvbduCbtwWOo +DoCkKvbdSLYeuHLT +DoDKjvbdKQyePFme +EOcKjvbdeYZssrFz +DoDKjvbdpxoHfpdY +EPCkKvbdcIljKfXY +EPDKjvbdDwwksstM +DnbkKvbdsQWOicVf +EPDLKvbdIidAKQHE +DoDLKvbdrDeJPnWB +EOcLKvbdZoNiEeZj +EObjjvbdptTgRrLU +EPDKjvbdmRyUzTEJ +DoDLKvbdFxtuBEYC +DnbkKvbdehLVqmqH +EPCjjvbdUtNUGLuj +DoDLKvbdxVNEqZLn +DncKjvbdySnImRbH +DoCjjvbdbLMGPNcA +EPCkKvbdzQoMiKXA +DnbkKvbdbiMijevx +EOcKjvbdSQTfiedX +DnbjjvbdZisIQHBf +EObkKvbdYpleIldq +DncLKvbdjmBlZeHP +DncKjvbdSCDdkhxk +DnbkKvbdrykpTAgn +EObkKvbdZQldiMeR +DnbjjvbdeYZssqez +EPDLKvbdlYrrSyHU +EOcLKvbdTpqOttgm +EOcKjvbdCJLCLIej +EPDKjvbdUQqOttgm +EObkKvbdGBOqZJzm +DncKjvbdqwQMDIyR +EPDKjvbdbBWFFoow +EOcLKvbdZMRctOLm +EPCkKvbdHEKuibKK +DnbjjvbdNddThiKd +DncKjvbdJuuFdEgJ +DncLKvbdRzJgsDWA +DncLKvbdRWmdCkhD +EPCjjvbdZRNFImEq +EOcLKvbdUaBqTRSZ +EObkKvbdWIXvYGxz +DoDKjvbdrRuKnKaN +DoCjjvbdYgXEAPTJ +DoCkKvbdwuMeQyMO +EPDLKvbdkHfkfFmk +DoDKjvbdTqQnuUhN +DoCkKvbdbKlFoODA +EObkKvbdrzLoraIO +DncLKvbdFxuVAdYC +DoCjjvbdZQldiMeR +EOcKjvbdJTZBTNXl +EPDKjvbdsQWPKCvG +EOcLKvbdeEoRawDK +EPDLKvbdtTSSxzEc +DncLKvbdliDsqUqa +DnbjjvbdZQleImEq +EPCjjvbdaSGDITek +DoDLKvbdRWnDbkhD +EPDLKvbdpedEsvAh +EPCkKvbdYpldhldq +DoCjjvbdZoOJEdyj +EOcLKvbdmoyxvKyC +EObjjvbdmSZVZsEJ +DoDLKvbdqUUGrSLU +EPDLKvbdmpZxujyC +EPCjjvbdCDpBVilf +EPCjjvbdFfJrNhsq +DoDKjvbdsZkosBIO +DnbjjvbdiBnbdvpq +DncKjvbdkDMKpftg +EPCkKvbdatbGxLTh +DoCjjvbdJTYaTNXl +DnbjjvbdhkdcnVCy +DncLKvbdyNrgxTIc +EPDLKvbdyNsHwriD +EPDLKvbdBdQBVilf +DoDLKvbdIsYaTNXl +DnbkKvbdkxsSTZHU +EPCjjvbdBsBDUGWr +EOcLKvbdgQBzwDxI +DnbjjvbdjblLQfuH +DnbkKvbdbVBgYKsh +DncLKvbdMgComPuL +EPDLKvbdqceIpOVa +DnbjjvbdqFceTvAh +EPCjjvbdFWYpQNJe +DoDLKvbdHDjujBjK +DncLKvbdIHGyyXxH +DnbjjvbdeFOqawCj +DoDKjvbdGQASwGfZ +DncLKvbdrWokbhyR +DncKjvbdSKyFtfkT +DoCkKvbdemFvfmKL +EPDKjvbdxsNhmRbH +EOcKjvbdsPunicVf +EObjjvbdrbGNMGjy +EPDLKvbdOXoVzcnU +EOcLKvbddZxpYYpb +DoDKjvbdVBBpsRRy +EPDKjvbdHDkWKCKK +DoCkKvbdSiZjRAAl +EPDKjvbdURQoVVHm +DoCkKvbdpyPHgQdY +EOcKjvbdGAoQxizm +DnbjjvbdMpXpvNfs +DncKjvbddndrjtUS +DnbkKvbdlhcsptqa +DoCkKvbdfNFvfmKL +EPCkKvbdHffyxxXg +DoCkKvbdYpleImFR +DoCkKvbdbBVdfPpX +DncLKvbdWSNxBdlD +EPDKjvbdSQTfjFcw +EPCjjvbdkxrqsYgU +EPDKjvbdrovOjCvG +DoCjjvbdaSGCgsek +DncLKvbdZGwEAOri +DoDLKvbdJmADzHUa +DoCjjvbdNdcshiKd +DoCkKvbddneTLTtS +EObkKvbdMoxQumfs +DncKjvbdVgxVwfxz +DoDKjvbdGcjuibKK +EObkKvbdTqQnuUhN +DncKjvbdURRPUuIN +EObkKvbdbrbjtEJa +DnbkKvbdKQyeOenF +EObjjvbdbKkfOnDA +EPDLKvbdlhdTptrB +EObjjvbdxnTHxTJD +EObjjvbdKCjCpjDY +DoDLKvbdMSWmZtpz +DoCkKvbdBsBCsfXS +DnbkKvbdfRaWzkcP +EPDKjvbdbAvFGQQX +DoCjjvbddoFSjtUS +DnbjjvbdypoNJJwA +EPDKjvbdzdzOzdyp +EObjjvbdJpzEoFme +DoCkKvbduCbuXWPP +EPCkKvbdFfJrOItR +DoDLKvbdkIGlFfOL +DnbjjvbdbAudfPpX +DoDLKvbdtAHRIABS +EOcLKvbduDCuWuno +DoDKjvbdkHgLfGNk +EOcLKvbdxZhFeweS +EObkKvbdUxgszKoO +EOcKjvbdiBoCeXRR +DnbkKvbdZeXfzhJC +EObkKvbdtcDUvvPP +EOcKjvbdMtrrLNAX +DnbkKvbdWXJYVceH +DnbkKvbdJbjCpibx +EPCkKvbdajlFnnDA +DnbjjvbduaEZTPEh +EOcKjvbdGcjuibJj +DncLKvbdKefHbAqV +DoDKjvbdUxgtZjnn +EPCjjvbdVZITzKnn +EPDKjvbdHkaznXRL +DnbkKvbdOEdTiIkE +DnbjjvbdiGjDYvJu +DoDKjvbdnUtykJrG +EPCkKvbdBdQBWKNG +EPDKjvbdsBemLfkZ +EPCjjvbdtumwiqTA +EOcKjvbdnCKXYPOV +DncLKvbdVwIxVdFH +DnbjjvbdWIYWYGxz +EObkKvbdFpATXHFy +DoCjjvbdauBgXjtI +DnbkKvbdTqROuVHm +DnbjjvbdlhcsqUqa +EPDLKvbdxZhGGXeS +DoDLKvbdZjTHogCG +EOcKjvbdbKlGOnDA +EObjjvbdLiBlRYAS +DncKjvbdxrnJMrCH +EOcLKvbdMJBlRYAS +EOcKjvbdUsmTekuj +DnbjjvbdEYYMTssl +EObkKvbdZMSEUNkm +DncLKvbdGGKSNhsq +DoDKjvbdGZVVAdXb +EPDKjvbdKRZdoFnF +EOcLKvbdEXwlUTtM +DoDKjvbdEztQeLcJ +DoCkKvbdJYUBglQp +DoCkKvbdJTZAsNXl +EObjjvbdvmWAMdEm +EPCjjvbdxZgefYFS +DncKjvbdtTRrxzEc +EOcLKvbdiGjDZWJu +DoCkKvbdYlRctOLm +DncKjvbdDxXlTtUM +EPCjjvbdcyxpYYqC +EOcLKvbdqGDeUWBI +DnbjjvbdnPyxvLZC +DoDLKvbdKefHbApu +DoCkKvbdjblKqHVH +EObkKvbdTfzmkvue +EOcKjvbdZnmiEdzK +EOcKjvbdDxXkstTl +EPDLKvbdBdQAujMf +DoDKjvbdGZVVBDwb +DoDLKvbdEvZPpMie +EPCjjvbdVwJXuceH +DoDLKvbdRjyFtgLT +DoCkKvbdXsLaNTnx +DnbjjvbdDHLfHAzc +DoCkKvbdVBCQrprZ +DoCkKvbdyNsIYShc +EPDKjvbdyXiJbPzL +DoCjjvbdUsltFlWK +EPCkKvbdcyyQYZRC +DnbkKvbdddnqbWbj +EPCkKvbdmuUyjjSG +EObkKvbdZyDinDLr +DnbjjvbdZtIiZESn +EPCjjvbdVBCRTRRy +EOcLKvbdCWzciFPv +EObkKvbdrEFJPnWB +DnbkKvbdqUUHSRkU +EPDLKvbdlqyUyrci +DoCjjvbdIMBznXQk +DoCjjvbdUxgsykOn +EPCjjvbdXsMBMsnx +DncKjvbdjuvmdBxX +EOcLKvbdkIGkeemk +DoCjjvbdjKGIKNYS +EPDLKvbdSLZGVGjs +EOcKjvbdMfcPmQUk +DoCjjvbdrNZjYlIJ +EOcLKvbdkyTSTZHU +EObjjvbdjAQGaQHK +EPDKjvbdMoxRVnHT +EObkKvbdeATpmXif +EObkKvbdFjdsDHmV +DncLKvbdbLLfOmcA +EPCkKvbdunszqLOt +DnbkKvbdnQZxvLZC +DncLKvbdZyDjNblS +DnbkKvbdptTfrSKt +DoDLKvbdzaAOgHCM +EPCjjvbdhbPCeXRR +DnbkKvbdmuVZkKSG +DoCkKvbdziuQQESt +DnbkKvbdhgKDZWKV +DnbjjvbdULuoBWPJ +DncLKvbdWXJXucdg +DoCjjvbdRacdlJYk +DoDLKvbdegjvSNqH +EOcLKvbdnUtzLKRf +EOcKjvbdFxtuBEXb +DoCkKvbdmIcsqUrB +EObjjvbdULvPAvPJ +EOcLKvbdSwkLmzkY +EPCkKvbdSZjITCvA +EPCkKvbdeOdrjtUS +EPCjjvbdIxUBhLpp +EObkKvbdqiAJeMoF +DnbkKvbdhlEcmtcZ +EOcLKvbdFejRnJTq +EOcKjvbdwXMAvBWV +DoDKjvbdmpZyWLZC +DoCjjvbdGLErbhNV +DoDLKvbdmaivwnmu +EOcLKvbdOXoVzcnU +DncLKvbdBhjbLJGK +EPDKjvbdZjTIQGaf +DoCkKvbdgPazwEYI +DncLKvbdGGKRmiUR +EObjjvbdfHkWRmpg +DnbkKvbdXrkaNUPY +EPCkKvbdzQoMhiwA +EOcKjvbdrpWOjDVf +DncKjvbdZtJJZDrn +EPDKjvbdqZOggRDx +DnbjjvbdhgJbyWKV +DoDKjvbdiVZdwRuC +DoDKjvbdIwtCHkpp +DoDKjvbdVAapsRRy +EPDLKvbdwjvcgzzG +DoDLKvbdRyihScWA +DoDLKvbdrRuKmkAm +DnbkKvbdqGDdsuaI +EPCkKvbdAMhYrwZx +DncKjvbdSPsfjGEX +DncKjvbdczYpXxpb +DoDLKvbdkIHMGFmk +EPCjjvbdkClKqHUg +EObkKvbdxVMdqZMO +DoDKjvbdBdQBVjMf +EObkKvbdZjTHpGbG +EPDKjvbdTfzmkvue +EPCkKvbdLAjfmCXq +DoCjjvbdLGGHbApu +EPDKjvbdEzsqEkcJ +DoDKjvbdwygfGYFS +DoDLKvbdhgJbyWKV +EPDLKvbdZshiZETO +EPDLKvbdKWUfDdfi +DnbkKvbdqYoHgQcx +DncKjvbdnGeYMmgZ +EPDKjvbdKCjDRKDY +DoCkKvbdJcKDQibx +EObkKvbdZoNiFFZj +EPCkKvbdUyHsykPO +EOcKjvbdtvNxKQsA +EObjjvbdatafwjtI +DoDLKvbdhzVFkpmf +EObkKvbdMgComQVL +EPCkKvbdSCEEkhxk +DoDLKvbdgFlZnGgA +EObjjvbdZMSETnLm +EObkKvbdtumxKQsA +EObjjvbdZoOIddyj +EOcLKvbdqZOggQcx +EOcLKvbdKfFhBaQu +DncLKvbdzGxlANEw +EObjjvbdehLWRnQg +EObkKvbdEPCjkWbd +EObkKvbdqYnhHRDx +EObkKvbdjvXODaww +DnbjjvbdqTsgSRkU +EOcKjvbdTqQoVVHm +DnbjjvbdQmYBxnUz +DnbjjvbdpyOhGqEY +EOcLKvbdLGGHbAqV +EObkKvbdZirgpHCG +EObkKvbdqYnhGpcx +DncLKvbdrbGNLgKy +EObkKvbdkySrSxgU +EOcLKvbdeAUQlwjG +DncKjvbdkVwNdCYX +DoCjjvbdJvVGDeHJ +EPCkKvbdEuyPpNKF +EOcKjvbdDjHivXjA +DnbjjvbdkNCLydfo +EPCjjvbdZjTHogBf +DoDKjvbdGKeTDINV +DnbkKvbdJXtBglQp +DnbjjvbdFejSOIsq +EOcKjvbdhytelRNf +DnbjjvbdbBVdeopX +DoCkKvbdFjdsDINV +DoDLKvbdjvXNcbXw +DnbkKvbdZdxGzhJC +EPDLKvbdjAPgBQGj +EObjjvbdJXsbHkqQ +EPDKjvbdiVZdwRtb +EObjjvbdGFjSNiTq +EPDKjvbdznpQdbkx +EPCjjvbdemFvgNKL +EPDKjvbdWXIxWEEg +DncLKvbdEObkKvcE +DnbjjvbdLAjfmCYR +EPDLKvbdEXwkstTl +EObjjvbdFfKSNhsq +DncKjvbdygZMANFX +EPCkKvbdYqNFIleR +DoCkKvbdSKyGUgLT +DncKjvbdBdQBVjNG +DnbkKvbdbUagYLTh +EOcKjvbdsPunjDWG +DncLKvbdrEFIonVa +DncKjvbdaSGChTfL +DoCkKvbdcJNKKfXY +EObkKvbdULuoBWOi +DncLKvbdKWVGEEgJ +EPCkKvbdqFdEsuaI +EPDKjvbdAMgySvyx +DncLKvbdiUzEwRuC +EObjjvbdZoNheEzK +DnbkKvbdZLrETnMN +EObjjvbdKWVFcdfi +DoDLKvbdcScLUEJa +EPCkKvbdIwsbIMRQ +EOcKjvbdsBemMHKy +EOcLKvbdzitoodSt +EPDKjvbdrMyjZLhJ +DnbjjvbdaRfCgsfL +DoCkKvbdKQzEnenF +EOcLKvbdUGznLvue +DncLKvbdZxcinCkr +DnbjjvbdEuyPpNKF +DncKjvbdGFirOIsq +EOcLKvbdVqmxBeMD +EOcLKvbdwuMeRZLn +DnbkKvbdBhkBkIej +EOcKjvbdNQXpumfs +EObkKvbdVBCRTRSZ +DoDLKvbdZeYGzhJC +DncLKvbdREDBPqES +DnbjjvbdvBEZSoFI +EPCjjvbdakLeoNcA +EPDLKvbdeFOqbWbj +EPDLKvbdiGicZWJu +EPCkKvbdEKHiuwjA +EPCjjvbdwkWcgzyf +DoDKjvbdmpZyVkZC +EPCkKvbdSZihSbvA +EPDKjvbdelevfmKL +DnbjjvbdeATplwif +DoCjjvbdGAnpxizm +EPDKjvbdTlWPBWOi +EOcKjvbdmSYtzTEJ +DncLKvbdnGeXmNfy +DoDKjvbdTIzJqAAl +EOcKjvbdqdEiPnVa +EOcKjvbdcTCkUEKB +DoCjjvbdEvYopMjF +DoDLKvbdwuMdpyMO +EPDKjvbdEuyQPlie +EOcLKvbdVUMsfMVj +EObjjvbdijFgilxS +DoDKjvbdnPyxujyC +EOcKjvbdTAFIgbPE +DnbkKvbdZxdJnDLr +DncLKvbdqdEiPmua +EOcKjvbdhgJcZVjV +DnbkKvbdRbEFLhxk +DoDKjvbdmaivwoNu +DoCkKvbdZQmFJMdq +DncLKvbdeYZtTqez +EObkKvbdqYoIGpdY +DnbjjvbdEASJMyvw +DoDKjvbdwzHfGYFS +DncKjvbdjvXOECYX +DncLKvbdbBVdepQX +DoDLKvbdrEFIomua +DnbjjvbdYgWdAOsJ +EOcKjvbdkMakydfo +EPCjjvbdegkWSNqH +EPDLKvbdYlSEUNkm +EPDLKvbdzRPMhjXA +DnbjjvbdmSZUyrci +EPDKjvbdiiehKNXr +EPDLKvbdwzIGGXdr +DncKjvbdSLYetfkT +EOcLKvbdURROtuHm +EPDLKvbdEYYLtUUM +EOcLKvbdaSGDIUFk +DnbkKvbdhfibyViu +DncKjvbdeFOqavcK +EPDLKvbdZtIhyETO +EOcKjvbdsPuoKDVf +DoDLKvbdBhkBjiGK +EPDLKvbdnQZyVkYb +DncLKvbdNsTugEtp +EPCjjvbdCDpBWJmG +DoCkKvbdmIdTqVRa +EOcKjvbdptUHRqjt +DnbjjvbdRpTfifDw +DncKjvbdaRebgtFk +EPDLKvbdEARiMyvw +EOcKjvbdyNsHxShc +DoCkKvbdxKwDgzyf +DncKjvbdwuNFQyLn +DncLKvbdegjvSORH +DncLKvbdOStWGdtp +EOcLKvbdcTCkTdKB +DncKjvbdRECaQRES +DoDLKvbdkIHMFemk +EPCkKvbdfjfzcGAE +DncKjvbdZLqdTnLm +EOcKjvbdIMBzmwRL +EOcKjvbdwzHeexFS +EPCjjvbdKVuFdFHJ +EPCjjvbdRXODcLgc +DoDLKvbdlrZVZrdJ +EPDKjvbdjKGIJmYS +EObkKvbdHEKujCJj +DncKjvbdNddTiIjd +DoDKjvbdZjSgpGaf +DoCjjvbdmfeXlnHZ +EPCjjvbdRosfifDw +DoCjjvbdZxcinDLr +DoCjjvbdNeDsiIjd +EPDKjvbdVgxVwgYz +DnbkKvbdqTtGrRjt +DnbkKvbdTqQntuIN +DncKjvbdBvzdJEpW +EPCjjvbdqUUHRrLU +DnbjjvbdqcdhonWB +DncKjvbdHDkWKBjK +DnbkKvbdxVMeQxlO +EObjjvbdkClKpgVH +EOcLKvbdCSaDUGXS +DncLKvbdUQqOttgm +DoCkKvbdZxcjOClS +EPDKjvbdVqmxCFMD +DnbjjvbdqmZixlHi +DnbjjvbdiUydvquC +DoCkKvbdOTTugFVQ +EOcKjvbdUQpoVVIN +DoCkKvbdNHDPlpVL +EOcLKvbdDncLKwCd +EOcLKvbddeOrCXCj +EObjjvbdqvolChyR +EOcLKvbdaofgELzd +DoDLKvbdrpVoKDWG +DncKjvbdaMjasUmH +EObjjvbdliETqUrB +DncLKvbdXsLaMtOx +EObkKvbdrykpTAhO +EPDKjvbdehKvRmpg +EObjjvbdUxhTzKnn +DncLKvbdTfznMXVe +EPDLKvbdqUTfqqkU +DoCjjvbdHELWKCKK +DoDLKvbdwuNFQyMO +DoCjjvbdffLynGgA +EOcLKvbdSLYetfkT +EPDKjvbdtTRryZeD +EPDKjvbdddoRbXDK +DoDKjvbdFVxooljF +DoDLKvbdxsNiNSCH +DoDLKvbdsCGNMGkZ +EOcLKvbdkHfkfFnL +EPCkKvbdqrUjnLAm +DnbkKvbdHELViajK +EOcKjvbdNHDQMouL +EPCkKvbdWWhxVdFH +DnbkKvbdUWMPitBR +DncLKvbdZoOJFFZj +DncKjvbdcIljKewY +DoDLKvbdVUNUGLvK +EObkKvbdNsTufdtp +DnbjjvbdGKdsCgmV +EObkKvbduDCtwWPP +EObjjvbdkMbMZeGo +EPCkKvbdJSyAsNXl +DnbjjvbdmbJwXnmu +EPCkKvbdRjxeuGkT +EObkKvbdaSFcITek +EPDLKvbdGYtuAdYC +DoDKjvbdFeirNiUR +EPCjjvbdhyuGMQmf +EObjjvbdDxYLstUM +EObkKvbdFfKRmhtR +DnbkKvbdyTNhmSCH +EPCjjvbdJSyAsNYM +EPCkKvbdEuxpQMie +DoDLKvbdkClLQgUg +DnbkKvbdssRrxzEc +EPDLKvbdRMwbZNtz +EPCkKvbdssSTYyeD +DoCkKvbdYqMeImEq +EOcLKvbdjuwOECXw +EOcKjvbdOTUWHFUp +EPCjjvbdliDtQtrB +EPDKjvbdZxdJmblS +DoDKjvbdbVCHXkTh +DoDKjvbdpstHSRjt +EOcLKvbdNPwpunGs +DoCkKvbdLAjgNCXq +DoCjjvbdDoDKjvbd +DoCkKvbdZirgpHBf +EPDLKvbdezuxdiTw +DoCkKvbdLrXMyuQz +DncLKvbdqlyjYkgi +DnbkKvbdLrWlzUpz +DoCjjvbdhytfLpnG +EObjjvbdxrmiNSBg +EPDLKvbdqquLNjaN +EObjjvbdiHKCyVjV +DncKjvbdjSziTKiz +EPCjjvbdCflGHAzc +EPCjjvbdZtJJZDrn +EPCjjvbdJKEAKQHE +EPDKjvbdIxTbHlRQ +EOcKjvbdZRMdhmEq +EOcLKvbdmttykJqf +DncLKvbdEzsqFMDJ +EPDKjvbdJuteceGi +EOcKjvbdemFvfmJk +DoCkKvbdkySqsZGt +EOcLKvbdlrZVZsDi +EOcLKvbdEXxLstTl +DnbkKvbdkNBlZeHP +DncLKvbdauCHYKsh +EPCkKvbdhuZeXSVC +EPCjjvbdOTTufdtp +DoDKjvbdDoCkKwCd +DoDLKvbdOAIrsirA +EPCjjvbdlAmPNALA +EOcLKvbdiBoCdwQq +DoCkKvbdnCJwYOnV +EOcLKvbdqwQLbhxq +DncLKvbdGYuVBEYC +EPCjjvbdcyyQXxqC +EPDKjvbdrEEiPmvB +DnbkKvbdJbibqJbx +DncLKvbdiGjCxuiu +EObjjvbdjKGIJmXr +EPCjjvbdFkEsDIMu +EPDKjvbdCWzchePv +EObjjvbdEObjjwDE +EPCkKvbdQdDApRDr +DoDLKvbdbAvEfQPw +DoDLKvbddtAUATNW +DnbjjvbdUxhUZkOn +DnbjjvbdwNWANEEm +EPCjjvbduDCuWuoP +DnbjjvbdjAQHApHK +DncLKvbdJzpFxEAN +DncKjvbdwtldpxlO +EObjjvbdBraCtGWr +EPDKjvbdJmADzGuB +DoDLKvbdRadEkiZL +DoCkKvbdAMhZTXZx +DoCjjvbdqGDeUVaI +DoCjjvbdVvhxWDdg +EOcKjvbdSBceMIyL +DnbkKvbdRkYfUfjs +EOcLKvbdFWYpQMjF +DoDLKvbdhlFENuCy +EObkKvbdiCObeWpq +DnbkKvbdHELWJaij +EObkKvbdCTAcTfWr +EPDKjvbdbrcLTdJa +DoDLKvbdDncKkXDE +DoCkKvbdmSYtzSdJ +EOcLKvbdVZHszLPO +DnbjjvbdhkdcmuCy +DnbkKvbdLrXNZuQz +EPDKjvbdZnmiFEzK +EPCkKvbdlrZVZsEJ +DnbjjvbdqmZixkhJ +DoDLKvbdcTCjsdKB +DoCkKvbdcyyPxYqC +DoDKjvbdssRrxydc +DoDKjvbdvPTzpjnt +EObjjvbdZLqctOMN +DoDLKvbdRNXbYnUz +DncKjvbdJYUBglRQ +EObkKvbdkIGlGFnL +DoDLKvbdiUzEwSUb +EPDKjvbdeEnrCWbj +DoDLKvbdRbDdkhxk +EObjjvbdYzcFqjWZ +EOcLKvbdjggLfFnL +DncLKvbdgQBzwEXh +DoCjjvbdQlxByNtz +DnbkKvbdoznDjwoA +DnbkKvbdVgwuxHYz +DoDLKvbdaaVdepQX +DoDKjvbdLZRKSztf +EPDKjvbdbUbHXkUI +EOcLKvbdjhGkfFmk +EObkKvbdeEoSBvcK +DncKjvbdUtMtGMVj +EPDLKvbdJTZAsMxM +DnbkKvbdOEdUJJKd +DoDKjvbdZHXEAPSi +EObkKvbduaDyTPFI +DnbjjvbdqAiFAWhE +EObjjvbdelevgNKL +DnbjjvbdTAEhgbPE +DoDKjvbdnPzZVkZC +DoDKjvbdQwNdDLhD +DnbjjvbdnBjWwoNu +EObkKvbdfMewGljL +DncKjvbdrpVnjCuf +EPDLKvbdLGFgbBRV +EObkKvbdkCkkRHUg +EObkKvbdTlVoAuoJ +EPDLKvbdrMyjZMHi +EOcLKvbdWHwuxHYz +EOcKjvbdLrXNZtpz +EObjjvbdbQHHDkzd +EOcLKvbdfILWRnRH +EPCjjvbdyfyMAMeX +DncLKvbdNHCpNQVL +EPCjjvbdFkEsDHlu +DncKjvbdGGJqmhtR +DnbkKvbdvAcxrndh +DoCjjvbdqGDeTvBI +DoCjjvbdJvUfDdgJ +DoCjjvbdUVlPisaR +DoCkKvbdqTsgSRkU +EObjjvbdjblKpftg +EObkKvbdtcDVXWPP +DnbkKvbdfHkVqnRH +DncLKvbdmoyxvLZC +EObjjvbdkHfkfFnL +EPDKjvbdwNWAMcdm +EPCjjvbdJpzFOfNe +DncKjvbdmbJvxOnV +DncKjvbdTqQnuUgm +EOcLKvbdTpqOuVHm +DoCjjvbdYlSETmkm +DoDKjvbdjEkGuPAO +DoCkKvbdwygefXdr +EObkKvbdrXPkcJYq +DoCjjvbdxUleQyMO +EOcLKvbdBsAcTfXS +EPDLKvbdLBLGlbXq +EObjjvbdmbJvwnnV +DnbjjvbdbVCGwjsh +DnbkKvbdxUmEpyMO +EPCkKvbdYSlBNTnx +DoDKjvbdeOeSkUTr +DncLKvbdqmZixlHi +EPCkKvbdNHCpNQVL +DoCkKvbdDigjWXjA +EObjjvbdrDeJQNvB +EOcLKvbdJuuGDeHJ +DoCkKvbdddnrCXCj +DoDKjvbdqTtGqrKt +DoDKjvbdeOeTKstS +EObjjvbdySmiNRbH +DnbjjvbdZshiYdTO +EObjjvbdnCKXXnmu +EPDKjvbdqiAKFMne +DoDKjvbdNeEUIiKd +DnbjjvbdzitpPdTU +EPCkKvbdzaAOffal +EOcKjvbdZtIiZDrn +DoCjjvbdtSrTYyeD +DoDLKvbdFVxopNJe +DoDLKvbdJJdAJpHE +DoDLKvbdHDjuiaij +EObkKvbdUWMQKUAq +EPDKjvbdTpqOuVIN +EOcLKvbdqvpMChyR +DoCkKvbdVviXudEg +DoCkKvbdGLErbgmV +EPCkKvbdZirhPfbG +DoCkKvbdWXJYVceH +DnbjjvbdhkeEOUcZ +DncKjvbdSPtHJedX +DncKjvbdFfKRnIsq +DncKjvbdWWhxVdEg +DoCkKvbdOStWHEuQ +DoDLKvbdEuyQPmKF +DncKjvbdrpVoKDWG +DoCjjvbdKVtfEEfi +DoCjjvbdWXIwudEg +EPDKjvbdSCDeMIyL +EPDKjvbdDoDKkXCd +DoCkKvbdJpzEnenF +EPDKjvbdaaWEfPow +DoCjjvbdVwJXucdg +EPCjjvbdauCHYKtI +EOcLKvbdNeDshhkE +DncLKvbdNGcQMpVL +EOcLKvbdIryBSmXl +DnbkKvbdTAFJICPE +EOcLKvbdrMzKYlHi +EOcKjvbdznopeDMY +EOcLKvbdMRvmZuQz +DncKjvbdeFOqbXCj +DncLKvbdbhlijfWx +EOcKjvbdqdEhpOWB +DoDLKvbdUWMQJsaR +DoDLKvbdptUGqrLU +EObjjvbdaSGChUFk +EPCjjvbdYTMAltOx +DncKjvbdEPCkLWbd +EOcKjvbdKCjDRKCx +EPDKjvbdZyDjNcMS +DncLKvbdFfKRnJUR +EPDKjvbdrNZiyLhJ +EOcKjvbdZeXfzgiC +EOcKjvbdbUbGwkTh +EPDLKvbdHfgZxwxH +DncLKvbdrovOjCuf +DnbjjvbdfNGWflik +DnbkKvbdZoNiFEyj +EPCjjvbddneTKtUS +EObjjvbdRbDdlIxk +EOcKjvbdKfFgbBRV +EPDKjvbdFyUuBDxC +EPCkKvbdiUzFXRtb +EPCjjvbdrJAJeNPF +DncLKvbdVAbRSqSZ +EObjjvbdaNKbTVMg +DoCkKvbdlhctQtqa +DoDKjvbdZshiZDrn +EPDLKvbdFkFSbglu +EPCjjvbdHffyxwxH +DncKjvbdTvLojTaR +DnbkKvbdauCHXkUI +DoDKjvbdGdKuiajK +EOcKjvbdkClKqHVH +EPDLKvbdnUtykKSG +DnbkKvbdBiKbKhej +DoDLKvbdHffzZXwg +EPCjjvbdbrbkTcjB +DoCkKvbdVwJYWDdg +DncLKvbdJJdAJogE +EPCkKvbdJvUfDdfi +DoDKjvbdZeYGzgiC +EObjjvbdZyEJnDMS +EOcLKvbdmSZVZsEJ +EPCkKvbdDnbjjvbd +EPCkKvbdJvVGDeGi +DoCjjvbdTXkLmzkY +DnbkKvbdLqwNZuQz +DncKjvbdZtIiYcsO +DoDKjvbdLYqKSztf +DnbkKvbdULuoBVni +EObkKvbdiBnbeWqR +EObjjvbdfILWRmqH +DncKjvbdezvYdhsw +DnbjjvbdJvUfEEfi +EPCkKvbdRpUHKGDw +EObkKvbdZGwEAPTJ +EOcLKvbdcTCkUEKB +EObjjvbdGAoQxizm +DnbjjvbdNwoVzcmt +DncLKvbdJbicRKDY +DnbkKvbdGZVVAcxC +EPCkKvbdRadFMJYk +DnbjjvbdxsNiNRag +DnbjjvbdiBncFXRR +EPCjjvbdySmiNRbH +DoDKjvbdeATqMxKG +DnbjjvbdtSrSyZdc +EOcKjvbdwtldpyLn +EPDKjvbdqwPkbiYq +EPDLKvbdzitpPcsU +DoDKjvbdDjHiuwjA +EPCkKvbdfMewGmKL +DncKjvbdlrYtyrci +EPCjjvbdZQldiMdq +EPDKjvbdJbjDQjCx +DncKjvbdqTsgRrKt +EPCkKvbdEvZQPljF +DoCkKvbdUsltGMWK +EOcLKvbdEJgivXjA +DnbkKvbdePFTLTtS +EPDKjvbdEYYLstTl +EPDKjvbdMfcPmPuL +DoDKjvbdBsAcTevr +EPDLKvbdwtleRZMO +EObjjvbdRotHJfDw +EOcKjvbdJuuFdFHJ +DnbjjvbdZoOIeFZj +DoDLKvbdsZlQSaHn +EPCjjvbddoFTLTtS +DncKjvbdbVBgXjsh +EPCkKvbdaMkBrtlg +EPDKjvbddiiqutzn +EObkKvbdiZuFkpnG +EPCkKvbdIxTaglRQ +EOcKjvbduaEYrndh +DnbjjvbdzQoMiJwA +DoCkKvbdsCGNMHKy +EObjjvbdMoxQunHT +DnbkKvbdxwiJbPzL +EOcLKvbdJbibpjCx +DncKjvbdIxTbHkpp +DoCkKvbdwuMeQxlO +EOcKjvbdKeehCBRV +EPCkKvbdZxdKNblS +EPCjjvbdLFegbBQu +DoCkKvbduLwwBUBX +DoDKjvbdjlbMZeHP +DoDLKvbdjAPfaPfj +EObjjvbdqGEFTvBI +EObjjvbdeAURNXif +EObjjvbdxmrgxTJD +EPCkKvbdqGDeUWAh +DncKjvbdqTsfqrKt +EObjjvbdjEjftoAO +EOcKjvbdNrtWHFUp +EObkKvbduCcUvvOo +EPCkKvbdvwMAvBWV +DncLKvbdtkwwBUBX +DoCjjvbdVZHsyjnn +EPDKjvbdQccBQQdS +DnbkKvbdjgfkeemk +EPDLKvbdFyVVBDxC +DncLKvbdrNZiyMIJ +EObjjvbdHfgZxwwg +DoDKjvbdqceIomvB +EPCkKvbdNGcPlouL +DoCkKvbdCIkBkIej +DoCjjvbdjKFhJmYS +EObkKvbdBsBDUGWr +EObkKvbdnQZxvKyC +DnbjjvbdhzVFkqOG +EPCjjvbdGLFScHlu +DoCjjvbdtlXwAtBX +DoDLKvbdUtMtFkvK +DoCkKvbdBvzchdov +DncLKvbdlZSrTZHU +EOcKjvbdZnnJEdyj +DncKjvbdYpleJMdq +EPDKjvbdiMEcmtcZ +EPCjjvbdfelZmgHA +DnbkKvbdLhalRYAS +DncKjvbdehLWRnRH +DnbjjvbdeKJqvUzn +EPCjjvbdqqtkOLBN +EOcLKvbdfRaWzlDP +DncLKvbdhtzFWquC +EObkKvbdJvVFdFGi +EObkKvbdMfcPlotk +DoCjjvbdtcCuWvPP +DnbjjvbdwtmFRZMO +DoDKjvbdsPvPKCvG +EPCjjvbdmfdwmOHZ +EPDLKvbdMgDPlouL +DoDKjvbdnGdwlnHZ +DoCkKvbdVwJXudFH +EObjjvbdQdCaQQcr +DnbkKvbdYSkaNUPY +DoCjjvbdULvPAuni +EPCjjvbdSZihScWA +DoCkKvbdBiLCKhej +DnbkKvbdhXZAzzAJ +EOcLKvbdQYmAGsRj +EOcLKvbdZtJIyDrn +DnbkKvbdNsTufduQ +EOcKjvbdEXxMUTsl +DoDLKvbdKyRJrzuG +DoDKjvbdrWpLbhxq +DnbjjvbdrDeIonWB +EPDKjvbdHELViaij +DoDLKvbdBdQBWJmG +DncLKvbdRjyGUfkT +EPDLKvbdYNqAYUut +EPDKjvbdRXNdClID +EPCkKvbdNwnuzdOU +EOcLKvbdjmBkydfo +DoCjjvbdrpWPKDVf +EPCkKvbdZyEKNbkr +EOcKjvbdQZNAHTRj +EOcKjvbdwtmEpxkn +DncLKvbdLhbMRYAS +DoCjjvbdsrrTZZdc +DncKjvbdxmrgxShc +EPCkKvbdmozZVkZC +EPCjjvbdbsDLTcia +DoDKjvbdGKeScIMu +EPCjjvbdrEFIpOWB +EOcKjvbdmpZxukZC +DoCkKvbdTkunaVni +DoCjjvbddneSkUUS +EPCjjvbdTlVoBWPJ +DoDKjvbdxsNhmSCH +EPCkKvbdVviXvDdg +DnbjjvbdwzHfFwdr +EPDKjvbdfMewHMjL +DoCjjvbdbsDKtDjB +EPDLKvbdUQpoVVIN +EObkKvbdrEFJPmua +EObkKvbdhlEcnUcZ +DoDKjvbdZRMeIleR +DnbjjvbdmajXYOnV +DoDKjvbdaRfDHtGL +DoCjjvbdbhljKewY +DoDLKvbdDwwksssl +DncLKvbdUMWOaVoJ +DncKjvbdWWiYWDdg +DoCjjvbdyXiJbQZk +DnbkKvbdHDkVibKK +EPCjjvbdtSrSxzEc +EOcLKvbdaSGChUFk +DnbkKvbdYSlBNUOx +EPDLKvbdJTZBSmYM +DoCjjvbdTkvOaWOi +DncKjvbdMowpvNfs +EPDKjvbdeEnqavcK +EOcLKvbdiifIJlxS +DnbkKvbdqceIpNua +EPDKjvbdrNZixkhJ +DncKjvbdiHKDZViu +DnbkKvbdrDdiPnWB +DncLKvbdLGFhCAqV +DoCjjvbdwuMdqYlO +EPCjjvbdePFTKssr +EObjjvbdVBCQrpqy +EObjjvbdbrcKsdKB +DnbkKvbdBvzciEpW +DoCjjvbdIHGyyXxH +EObjjvbdrzLpTAhO +EOcKjvbdemGWgNJk +EObkKvbdVZHtZjnn +EOcKjvbdiCObeXRR +EPCkKvbduoTzpkPU +DoCkKvbdrNZjYkgi +DnbkKvbdTAEhgand +EOcKjvbdhuZdwRuC +DoDLKvbdWWiXuceH +EPDKjvbdZoOIddzK +DncLKvbdVAbRSprZ +DnbjjvbdhgKDZWJu +DoCkKvbdVZITykOn +DoCkKvbdiGibyWKV +EPDLKvbdwyhGGYFS +DoDKjvbdiHKCxvJu +EPDLKvbdhyuGLpnG +EPDKjvbdOAJStKSA +EOcKjvbdzitpPdSt +DoCkKvbdzROlhjXA +DoDLKvbdtTSSxzEc +DoDKjvbdzoQRFCkx +DnbkKvbdxnSgxShc +DnbjjvbdiBoDFWqR +DoCjjvbdnBjWwoNu +DncLKvbdVYhTzKnn +DncLKvbdkIGkefNk +DnbkKvbdlqxuZsEJ +EOcLKvbdACrYJzIp +EPDKjvbdmaiwYOnV +EOcKjvbdYkrEUNlN +DoCjjvbdVUNTfLuj +DoDLKvbdfHkWSOQg +DnbkKvbdBraCsfXS +EOcKjvbdMJBkpxAS +DoDKjvbdcyyQXyQb +EObkKvbdeEnrCXDK +EObkKvbdFejSNiTq +DoCjjvbdEYXkstTl +EPDKjvbdyYIjBpZk +DncKjvbdiHJcZWKV +DncKjvbdQdDAoqDr +EObkKvbduDDUvvOo +EPCkKvbdzGyMANEw +DoDKjvbdQvnECkgc +DncKjvbdVviXudEg +DoDLKvbdQZNAHTSK +EPDKjvbdkCkjqHUg +EObjjvbdwyhFeweS +DoCjjvbdxwiJbQZk +EOcLKvbdEPDLLXDE +DncLKvbdVrNwbFLc +DoCkKvbdjAPgBPgK +EOcKjvbdpstGqqjt +EPDLKvbdHDkVjCKK +DncKjvbdirzhrjiz +DnbjjvbdxrnJNSBg +EPCkKvbdraelkgLZ +DncLKvbdptTgRqjt +DoCkKvbdIsYaTMxM +DoCjjvbdMpXqVnGs +DoDLKvbdUVkoitBR +DoCkKvbdjmCLyeHP +DoCjjvbdiVZeWquC +DoCjjvbdVUMtFlWK +EPDLKvbdxKvdHzzG +DoDKjvbdiMEdNuCy +EPDKjvbdwzIFfYEr +EObjjvbdJXsagkpp +EPCkKvbdxrmhmSBg +DoDKjvbdlqxuZsDi +EPDKjvbdsQVoJcVf +DnbjjvbdEYYLstUM +DncLKvbdkHgLfGNk +EPCjjvbdbsDKtDjB +DnbjjvbdJcKDQibx +DoCjjvbdyzdnSIIh +DnbkKvbdrpWOjCuf +EObjjvbdbAudeopX +DnbkKvbdYkqctNlN +EPDLKvbdfHkWRnRH +EPDLKvbdXmqAYUut +DncKjvbdFyVVBEXb +DnbkKvbdrDdhpNua +DncKjvbdeAURNXjG +DoCkKvbdOTUVgEuQ +EPCjjvbddwyssrFz +DoCjjvbdMpYRWNfs +DoCkKvbdjuvnDaww +DnbkKvbdVhXvXgYz +EObjjvbdTulQKTaR +EObjjvbdOAJTUJrA +EPDLKvbdsZkosBIO +DoCkKvbdhgJbxvKV +EPCjjvbdnBivxOnV +DncKjvbdxrnIlrCH +DncLKvbdzaAPHGbM +EPCkKvbduMXvaUBX +DnbkKvbdSBceMJZL +EObjjvbdJpzEoGOF +DnbkKvbdWexytAPT +DnbkKvbdkVwNcaxX +EOcLKvbdEYYLsstM +DoCkKvbdRosfiedX +EOcKjvbdwuMdpyMO +EObjjvbdUsmUFlWK +EObjjvbdjuwOECXw +DncKjvbdqlzJxkgi +DoCkKvbdiHJbxujV +EPDLKvbdakMFoNcA +EOcLKvbdmIcsqUqa +EPCkKvbdeKKSVtzn +EPCkKvbdvBEZTOeI +DncKjvbdpstHSRjt +EOcKjvbdKVuGEEfi +DoDLKvbdZQldiNFR +EPCjjvbdxnTIYShc +EOcKjvbdtunXjQsA +EPDKjvbdjcLkRHVH +DncKjvbdDoDLLXCd +DnbjjvbdZyEJnDMS +DoDLKvbdFkFTCgmV +EOcKjvbdhkddOUby +EPDLKvbdNeEUJIkE +DnbkKvbdyzeNqghh +EPDKjvbdFVxopMjF +EOcKjvbdGdLVibKK +DncKjvbdBdQAvJlf +DoDKjvbdbiNKLFwY +EPCkKvbdnGeYNNgZ +EPDLKvbdEYXlUTsl +DncLKvbdOEcsiIjd +DncKjvbdKaLHMbYR +DncKjvbdyTOIlrCH +EPCkKvbdMpXpumgT +EPCjjvbdtbbtwVno +DoDKjvbdrRtkOLAm +EObjjvbdbLLfPNcA +DncKjvbdjmCLydgP +DnbkKvbdTkuoBVoJ +DnbkKvbdSCDdlJYk +EObkKvbdCEPaVjNG +DoDLKvbdFaOpxizm +EPCjjvbdfMevgMjL +DoCkKvbdYzcGRjVy +DnbjjvbdKRZdoGNe +EPDLKvbdZisIQHCG +EOcLKvbdZMSEUOMN +DoCjjvbdiGibxuiu +EPDLKvbdZQmFJMeR +DoCkKvbdsBemLfjy +DncLKvbdzoPqEcMY +DncLKvbdMoxRWOGs +EOcLKvbdFeirOJUR +DoDLKvbdpyOgfpdY +DncLKvbdyzeOSIJI +DoDLKvbdRkZFuHKs +DnbkKvbdxVNEqZLn +DoCjjvbdMgDPmPuL +EPDKjvbdZQmEhmFR +DncKjvbdBraDUFwS +DoCkKvbdqqtjmkAm +EPDLKvbdLZQirzuG +DoDLKvbdlYsRryGt +EOcKjvbdKaLHNBxR +EOcKjvbdTqQoUthN +EObkKvbdhbObeXRR +EPDKjvbdJutfDeGi +DoDLKvbdRkZFuGkT +EOcKjvbdrbGNLgKy +DnbjjvbdmpZyWKyC +EPDKjvbdHELVjBij +EPCjjvbduDDUvuoP +EOcKjvbdrDeIonWB +DoCjjvbdnPyyWLZC +EPDKjvbddndrjtUS +EObjjvbdjuvnDbYX +EPDLKvbdCIkBjhfK +EObkKvbdZjTHogCG +EOcKjvbdjJehKNYS +DnbkKvbdSxLMNzkY +DoDLKvbdKDKDRJcY +EPCkKvbdmpZxvKxb +DnbjjvbdssSTYyeD +EObjjvbdHDkVibJj +DnbkKvbdSLZFtgLT +DoCjjvbdxnTIXriD +DnbkKvbdcSbjsdJa +DoCkKvbduoTzpjoU +DoCjjvbdXsLaNUOx +DoDLKvbdcScKtEJa +DnbkKvbdfpBzwDwh +EPDKjvbdjlakyeGo +DnbjjvbdYzcFqivZ +DncLKvbdCIkBjiGK +EPDLKvbdxZhFfYFS +EObjjvbdrEFJQNvB +DoDLKvbdjAPgBQHK +EOcLKvbdkDLjqHUg +DoCkKvbdiUzFWqtb +DoCkKvbdKVtfDdfi +DoDLKvbdwkXEHzyf +EObjjvbdqcdhpOWB +EPCkKvbdeEnrBvbj +DoCkKvbdCTAbsewS +DnbjjvbdNHCpMouL +DoDKjvbdSQUGiecw +DoDLKvbdelevfmKL +DoCkKvbdySnImSCH +DncKjvbdANIZSvzY +DncKjvbdrJAJeNPF +EPCjjvbdqTtGqqjt +EObjjvbdaRfDHsfL +EPCkKvbdrJAJeMne +EPDKjvbdiGjDYvJu +DoDKjvbdMgCpMpVL +DncKjvbdZjTIQHCG +EOcLKvbdJYTbILqQ +DoCkKvbdzoPqEbkx +EPDLKvbdvlvANDeN +DncLKvbdatafwjsh +DncLKvbdJuuFcdgJ +DncLKvbdwXMAvBWV +DoDLKvbdaMjbStmH +DoCkKvbdeOdsLTtS +DoDKjvbdbLLeoNcA +EPDKjvbdJKEAJpGd +DnbjjvbdZnnIeEyj +EOcLKvbdunszpjnt +EObkKvbdmoyyWKxb +EObkKvbdILazmvpk +EPDKjvbdQlwbYmtz +EPCjjvbderAvzkcP +EObkKvbdegjvSORH +EOcKjvbdsrqsYydc +EOcKjvbdfIKvSORH +DnbkKvbdFjdsDIMu +EPDKjvbdpstHRqjt +EOcLKvbdWRmxCElD +EOcLKvbdkHflGFnL +DoCjjvbdZjTHofbG +EObjjvbdeEoSBwCj +EPCkKvbdJSyBTNXl +DnbkKvbdUaCRTQqy +EPDKjvbdSLZFtfkT +DncKjvbdyNrgwsJD +DoDKjvbdezuxdiUX +DoDLKvbdACrXiyhp +DoDLKvbdxwiJaoyk +EOcKjvbdUxhTzLOn +DnbjjvbdnHFYNNfy +EOcLKvbdhanbeWqR +DoDKjvbdzHYlAMdw +DoCjjvbdKyRJrzuG +DncLKvbdliETpuRa +EObkKvbdczYpXyRC +DoDKjvbdFfKRnIsq +EPDKjvbdVAbQsRSZ +DncKjvbdezvZEiUX +DoCkKvbdZisHofbG +EPDKjvbdjKFgilxS +EOcLKvbduVmxKQsA +DnbjjvbdhuZeWrUb +EObkKvbdGYuUaDxC +DoDLKvbdaaWFGPpX +DnbkKvbdUQpoVUhN +EPCjjvbdZxdJmcMS +DncKjvbdhbPCdwRR +EObkKvbdZRMeJNFR +DnbjjvbdTlVoBWOi +DoCkKvbdatbHYKtI +EObkKvbdiHJbxvJu +DncKjvbdsQWOjCvG +DncLKvbdRosfjGEX +EObkKvbdREDBQRDr +EOcLKvbdeEnqawCj +EPDLKvbdGZVUaEXb +EPDLKvbdIryArmXl +EObjjvbdiiehJlwr +DoCkKvbdMJCMRYAS +DnbkKvbdlrYtzTDi +DoDLKvbdnGeXlmfy +DoCkKvbdSCDeMJZL +EObkKvbdLFegaaRV +DoDKjvbdGGKRmhsq +EObkKvbdiLdcnVDZ +DnbjjvbdGBOqZJzm +DnbjjvbdhfjCxvKV +EPCjjvbdlBNPNALA +EOcKjvbdtbbuXWPP +DncLKvbdEPCjjwDE +DoDLKvbdLqwNZtpz +EPDLKvbdbVCGwkUI +DncLKvbdZyDimcLr +DncLKvbdfILWSNpg +DoDKjvbdFVyPpNJe +DncKjvbdqiAJeMoF +EOcKjvbdqrVLOLAm +DoCjjvbdehKuqnQg +DoDLKvbdGLFTCglu +DoCjjvbdXrlBMtPY +DncKjvbdlYrrTYgU +EPCkKvbdWSNxCFMD +DncKjvbdUVkoitAq +DncLKvbdfHjvSORH +DoCkKvbdCEPaWKMf +EObkKvbdmbJvxPOV +EPDKjvbdwzHefXeS +EOcKjvbdvvlAvAuu +DncLKvbdpxngfqDx +DnbjjvbdIwtCIMQp +DncKjvbdHDjvKBjK +EOcKjvbdjmCLzFGo +DnbkKvbdZMRdTnMN +EObjjvbdEOcLLWbd +DoDLKvbdkNBlZdfo +EPCjjvbdemGXHNKL +EOcLKvbdkxrqryGt +EOcKjvbdsPvPKDWG +EOcKjvbdXsMAlsoY +DnbkKvbdmIcspuSB +DoCjjvbdUaBpsRRy +EOcLKvbdSPsfiedX +EOcKjvbdSCEEkiYk +DncKjvbdWXJXudEg +DncLKvbdRyigrbvA +DoDLKvbdUMVoAvOi +DnbjjvbdZtIhxcsO +EOcLKvbdJXsbHkpp +DnbkKvbdZtIhyETO +DncLKvbdHlBzmvpk +EObkKvbdzHZMAMeX +EPDKjvbdKCjCpjDY +EOcKjvbdjblKqHUg +DoDKjvbdGGJrNiUR +DoDLKvbdrEFIomvB +EPCkKvbdrovPKDVf +DoDKjvbdpxnhGpdY +EPDKjvbdemGWgNKL +EPDLKvbdTlWPAuoJ +EOcLKvbdhuZeWqtb +DnbkKvbdhyuGLpnG +EObjjvbdSBcdlJZL +DnbkKvbdeEnqbWcK +DnbjjvbdJKEAJofd +EObjjvbdbQGfckzd +EPCjjvbdRkYeuHLT +DoDLKvbdXrlBMtOx +EObkKvbdznoqFCkx +EPDLKvbdjggLfFnL +EPDKjvbdhuZdwSVC +EPCkKvbdeEoRbXDK +EPCkKvbdKaKgNCYR +DoDLKvbdWWhxWDdg +EPCjjvbdqUTfqqjt +EOcKjvbdcSbkTdJa +DncKjvbdauCHXjtI +DoCkKvbdQlwbZNtz +DnbjjvbdqvolCiYq +EOcLKvbdePFSjstS +EOcKjvbdhgKDZWKV +EObkKvbdCgLfHAzc +DncKjvbdnUuZkKSG +DnbjjvbdlhctRUrB +DoDKjvbdpyPHgREY +DoCkKvbdjJegimXr +EPDKjvbdfHkVrORH +EPDKjvbdyTOIlqbH +EPDKjvbdjKFhKNYS +EPDKjvbdFWZPpMie +EPCjjvbdIwsahLpp +EObkKvbdKfGIBaQu +DncKjvbdGFirOJTq +DnbjjvbdpedFUWBI +EPCkKvbdNeDshiKd +EObjjvbdBiLBjhej +EObjjvbdCJKbLJFj +DncKjvbdvwMAuaWV +DnbjjvbdZRMdhleR +DncKjvbdhgKCyViu +DoCkKvbdhficZWKV +DnbjjvbdwkWdHzyf +DncLKvbdVBBqSprZ +EOcLKvbdUsmTelVj +EOcLKvbdFxuVBEYC +DoDKjvbdKaLHMbYR +EPCkKvbdGdKuiaij +EPDKjvbdfIKvRnQg +DncKjvbdfekzNfgA +DoCkKvbdJbicRJbx +EOcKjvbdIwsagkpp +DncKjvbdOEctIiKd +DncKjvbdOTUVfduQ +EPCkKvbdFWZPomKF +EObjjvbdezvZFJUX +DoCjjvbdtSrTYzFD +DoCkKvbdbVCHYLTh +EPDLKvbdZMRdUOLm +DoDLKvbdNwoVzdNt +EPDLKvbdFaPRZJzm +DoCjjvbdxZhGFweS +EPCjjvbdZQmFImFR +DnbjjvbdsQWOibvG +DoCjjvbdSBdFMIxk +EPCkKvbdEObkKvcE +DoDKjvbdqFcdsvAh +EOcKjvbdezuyEhsw +DnbkKvbdVqnXaeMD +EObjjvbdnGeXlmgZ +DncLKvbdCIkBkIfK +EPDLKvbdpecdtWAh +EPDKjvbdsQVnjCvG +DoDKjvbdkDMLQfuH +EObjjvbdAMhZTWzY +EPCjjvbdiCObdvqR +DoDKjvbdUWLoisaR +DncLKvbdSPtHKGDw +EObjjvbdaNLBrtmH +EPDKjvbdUyHszKoO +DoDKjvbdQwNccLhD +EPDLKvbdnVUzKjRf +DoCkKvbdRyigrcWA +EOcLKvbdbiNKLGXY +DncKjvbdlhctRVSB +DoCkKvbdNPxRWNfs +EObjjvbdANHxsXZx +DnbjjvbdNrsvHEuQ +EPCjjvbdmbJvxPNu +EOcKjvbdJvVGEFGi +EPDKjvbdUWLoitAq +DoCkKvbdkDMKpfuH +EOcLKvbdfjfzbfAE +EOcLKvbdczZQYZRC +DoDLKvbdQwNcblHc +EObkKvbdOTTugEtp +DncKjvbdbUagYLTh +EPCjjvbdfNGWfmKL +EObjjvbdiVZdvrUb +DncLKvbdZyDinDMS +EPCkKvbdmaiwYOmu +EOcLKvbdqUUHSRkU +DncLKvbdDncKjvbd +DoCkKvbdVqmxCElD +EPCkKvbdaRfDIUFk +EOcKjvbdjKGIJlxS +DncLKvbdkxrrTZHU +DncKjvbdypnmIjXA +DoDLKvbdJpyeOfOF +DoDLKvbdwXMBVaVu +DoDKjvbdKfFhCAqV +DoCjjvbdIxTahLqQ +EOcLKvbdADSYKZiQ +DoCkKvbdMowpunHT +EOcKjvbdgKfzbfAE +EPDKjvbdhkddOVDZ +EPDLKvbdemFwHMik +EPCjjvbdUVlQKTaR +DncLKvbdRWnECkhD +DnbjjvbdkWXODbYX +DoCjjvbdZeYGzghb +DoCkKvbdSKyFtfkT +DoDLKvbdBhkCLJFj +DncKjvbdlhdTqVRa +EPDKjvbdqqtjmjaN +DoDLKvbdZjTHofbG +EPDLKvbdJmADzHVB +DoDLKvbdSBceLhyL +EObjjvbdqwPlCiYq +DncLKvbdYORAXtvU +EPDLKvbdZnnJEdyj +DoCjjvbduWNxKQsA +EPDKjvbdWSNxCElD +DoCkKvbdRjyFtgLT +DoCkKvbdeOeSkUUS +EOcKjvbdDihKVxKA +EObjjvbdffLymgHA +DoDLKvbdcScKsdKB +EPDLKvbdlYsSSyGt +DnbjjvbdGKeTDINV +DoDLKvbdCTBCtGXS +EObjjvbdEASIlyvw +EPDLKvbdfMfWfmKL +DoCkKvbdpstGqrLU +DncLKvbdtlXwAsaX +DoDKjvbdNrsvHEuQ +EObjjvbdCTBDTfXS +DoDKjvbdkMalZeHP +DoDLKvbdQccBPqDr +DnbkKvbdYqNEiNEq +DnbkKvbdvBDyTOeI +DnbjjvbdLAkGmBxR +EObkKvbdLiBlRYAS +EPCjjvbdTukpKUBR +EObkKvbdhuZeWqtb +DoDLKvbdZyEJmbkr +DnbjjvbdxrmiNSCH +EPCjjvbdKWVFdFHJ +EPCjjvbdRWmcblID +EPCkKvbdsQVoJcVf +EPCkKvbdGcjuibJj +DoCjjvbdJuteceHJ +DnbjjvbdLLAhWAJy +DncKjvbdULunaWOi +EOcLKvbdHlBznXQk +DoDKjvbdvBDxroEh +DoDKjvbdzaAPHGbM +DoDLKvbdUyITyjoO +DnbkKvbduaDxroFI +EObkKvbdAMhZSvzY +EObjjvbdDoDKkWbd +EObkKvbdGKdrbhNV +EPCkKvbdmgFXlnGy +EOcKjvbdzdzOzdzQ +EPCkKvbdKkBHvAJy +EOcKjvbdqAiFAWhE +DoCjjvbdQvmdClID +DncKjvbdMtsSKmAX +EObjjvbdziuPpETU +DoDKjvbddZyQYZQb +EPDLKvbdauBgXkTh +DnbkKvbdnCJvwnmu +DoCjjvbdxUmFQyMO +DncKjvbdXGYzUAPT +EPDLKvbdOAJTUKSA +DncKjvbddZyPwxqC +EOcKjvbdqlzKYlIJ +DnbjjvbdkVvnDaww +DnbjjvbdZdxGzhIb +DnbkKvbdDwxLtTsl +EObkKvbdGKdrcHmV +DncKjvbdTAFJHbOd +DoDKjvbdEObkKvcE +DnbkKvbdaNLCSuNH +DoDLKvbdDxYLtTtM +EObjjvbdVZIUZjnn +DoCkKvbdNsUVfduQ +EOcLKvbdGGKRmhtR +EPDKjvbdbKlFnmcA +DncKjvbdvvlAvBWV +DoCjjvbdliEUQtrB +DnbjjvbdjgfkfGNk +EPDKjvbdlYsSTYft +DoDLKvbdbKlGOnDA +EPDKjvbdjAPfaPfj +DnbkKvbdzGyMAMeX +DoCjjvbdZnmhddzK +EPCkKvbdIMBzmwQk +EObkKvbdjEkHVPAO +EPCkKvbdQccBPpdS +EPCjjvbdhgKCxvJu +DncLKvbdVgxVxHYz +EOcKjvbdxVNFQxkn +DoDKjvbdbLMGPNcA +DncLKvbdGckWJajK +DnbkKvbdrMyiyLgi +EOcLKvbdKefICApu +DoCjjvbdqFdEtWBI +EPCkKvbdYSlBNUPY +DoCjjvbdIwsbILpp +EPCjjvbdmgFYMnHZ +EObjjvbdQvmccMID +DncLKvbdURQntthN +EOcLKvbddxZtUSFz +EPCkKvbdhtzFWqtb +EOcKjvbdVBCRSpqy +DncKjvbdtbbtvvOo +EPCkKvbdczZQYZQb +DnbjjvbdQwODcLgc +EPDLKvbdtunXipsA +DncLKvbdBhjajhej +DoDKjvbdNrtVfduQ +EOcLKvbdKWUfDdfi +EObjjvbdpstHRrLU +DnbjjvbdznpRFClY +EPCjjvbdfNFvgMik +DoCjjvbdUsltGLvK +DnbjjvbdlqyVZsDi +DoCkKvbdNPwqWOHT +EOcLKvbdakLeoNcA +DoDKjvbdsCGNMGkZ +EPDKjvbdaRfDHsfL +DoDKjvbdZtIhyDrn +EPDLKvbdOStVgFUp +EPCkKvbdeATplxKG +DncLKvbdySmhlrBg +DoDKjvbdnCKWwoOV +DnbjjvbdDncKjvcE +EOcLKvbdwzIGGXdr +EObjjvbdmIdTqVSB +DnbjjvbdUGznLwVe +DncLKvbdTkvOaWPJ +DncKjvbdyOSgwsIc +DncKjvbdjmCLzFGo +DoDLKvbdpssfqqkU +EPDKjvbdmtuZjirG +EOcKjvbdOFEThhkE +DoDKjvbdIMBznWqL +EPCkKvbdJvVFcdfi +EPDKjvbdnBivxOmu +EObkKvbdTvLojTaR +DoCkKvbdMRwNZtpz +EObjjvbdEARhlzXX +DnbjjvbdcScLTcjB +DncKjvbdxmrhXrhc +DoDKjvbdEvZQQNKF +DncLKvbdGLErcHmV +DoDLKvbdFkFTChMu +DoCkKvbdOFETiIkE +EPDKjvbdnVUzLKRf +EPDKjvbdmuUzKjSG +EPCjjvbdwuNFQxkn +DncLKvbdeATpmXjG +EObjjvbdxUmEpxkn +EPDKjvbdcSbkTcjB +EPCjjvbdmbKXXoNu +EPDKjvbdSQUHKFdX +DoDKjvbdCTAbsewS +EOcLKvbdVwJYVdFH +DoDKjvbdZtIiYcsO +EPDKjvbdhkeENtcZ +EObkKvbdGBOpyJzm +EPCkKvbdRMxCYmtz +DoCjjvbdzjVPocsU +DoDLKvbdrDdiPnWB +EPCjjvbdFjdsDIMu +DoDLKvbdSLZGUgLT +EPDLKvbdKefHaaQu +DoDKjvbdKCibpicY +EOcLKvbdijGIJmYS +EObjjvbdelfWgNKL +DnbkKvbdbhmKKfWx +DoDKjvbdSQUHKGEX +EPCkKvbdnGdxMmgZ +DncLKvbdJJdAKPgE +EPDLKvbdmRyUyrdJ +EOcLKvbdhzUfLqOG +DoDKjvbdLAjgMaxR +DoDKjvbdRosfjGEX +EObkKvbdpssfqqjt +DnbkKvbdjAQHAofj +DncLKvbdidkHUoAO +DoCkKvbdCIjbLIej +DncLKvbdelfWfmKL +DoDLKvbdxUleQxkn +EPDLKvbdEvZQPljF +DncLKvbdJbjDQjCx +DncLKvbdyOTIXriD +DoDKjvbdTulPjUAq +DnbjjvbdJSyAsNYM +EOcLKvbdbBVeGQQX +EPCjjvbdbKkenmcA +EPCjjvbdiGjDZWJu +DncLKvbdcSbjsdJa +EObkKvbdZtJIyDsO +DoDLKvbdrafMkgLZ +DoCjjvbdiMFDmuDZ +DnbkKvbdnUtyjirG +EPDKjvbdfNFvflik +DoDLKvbdrWokcJZR +DncKjvbdWWhxWDdg +EPDLKvbdNeDtJJKd +EOcLKvbdqlzKYkhJ +DncKjvbdSQUHKGDw +DoCkKvbdkHflFfOL +EPCkKvbdRXNdDMID +DncLKvbdSLZFtfkT +EOcLKvbdZQldiMeR +DnbjjvbdSBdElJYk +DncLKvbdwWlBVaWV +DoCjjvbdhzUfLqOG +DoDLKvbdmJEUQuSB +DnbjjvbdULvPBVoJ +EPDLKvbdYkrDtOMN +EPDKjvbdHEKujBij +EObjjvbdJuuGDdfi +EObjjvbdzaAOgGbM +DncLKvbdkClLRHUg +EObkKvbdYTMAmToY +EObjjvbdxVMeQyLn +DoDKjvbdrEFJQNua +DncKjvbdYSlBNTnx +DnbjjvbdrSUkOLAm +EOcLKvbdrylQTBIO +DnbjjvbdrouoKDVf +DoDLKvbdwWkaVaVu +DoCkKvbdZQmFIleR +EPCjjvbdiLeENtby +DoCjjvbdrDeJQNua +EObjjvbdIGfzYxXg +DoCkKvbdySmiMqag +EOcKjvbdbVBgYLTh +DoDKjvbdLFehCApu +EPCkKvbdCDpAvJmG +EObkKvbdZLrDtOLm +EPCkKvbdZnnJEdyj +EPCjjvbdZjSgpGbG +EOcKjvbdWSOYBdkc +EPDKjvbdwtleQyLn +DnbkKvbdmJDtQuSB +EObkKvbdkWXODbXw +DncKjvbdezuyEiTw +EObjjvbdnBjWwnmu +EPDKjvbdZxdJmcMS +EPDKjvbdrbGNMHLZ +EObkKvbdEYXlTssl +DnbjjvbdyTOJNRag +DnbkKvbdGZVVAdYC +EPCjjvbdTYLMNzkY +DncLKvbdJcJcRKDY +EOcLKvbdYpmEhldq +DoCkKvbdjKFgjNYS +EPDLKvbdJbibqKCx +EPCjjvbdyTNiNSCH +DoDLKvbdGGKRmhsq +EPDLKvbdLAkGmCYR +EPDLKvbdCEPaWKMf +DoCkKvbdZsiIyDsO +EPCjjvbdjbkkRGuH +DnbkKvbdqYoHgREY +DoDLKvbdZMRctNkm +EObjjvbdDjIJvYKA +DncKjvbdVqnXbEkc +EPCkKvbdiHKCyViu +EOcKjvbdkHflGFmk +DoDKjvbdOFDsiIjd +EOcLKvbdVrOYCEkc +EPCjjvbdhtydvrUb +DoDLKvbdrNZjYlHi +EPDKjvbdVwIxWDeH +EObkKvbdhyuFlRNf +EPDLKvbdSKyFuHKs +DoCkKvbdBhjajiFj +DoDKjvbdhanbeWpq +DncKjvbdGGJqnJTq +EPDKjvbdZtJIyETO +EOcLKvbdANIZSvzY +DnbkKvbdptUHSSLU +DoDLKvbdRDcBPpdS +DoDKjvbdBcpAujNG +DnbjjvbdaaVdeopX +DnbjjvbdhtydvrUb +DoCkKvbdkWXNcaxX +DncLKvbdrNZjYkgi +EPCjjvbdBiKajiGK +EObkKvbdwkWcgzzG +EPCkKvbdRDcApQcr +DncLKvbdfekzNgHA +DoDKjvbdiBoCdwRR +EOcLKvbdIBlZdzAD +DnbkKvbdZLqcsnMN +DoDKjvbdatbGwkUI +EObjjvbdmgFXlmfy +EPDLKvbdxUmEqYkn +EPDLKvbdauBfxKsh +EObjjvbdsPvOjDVf +DnbkKvbdkVwNdBww +EPCkKvbdzaAPGfbM +EOcLKvbdRotGjGDw +EPCkKvbdqceJPmua +EPDLKvbdZyDinCkr +EObkKvbdCDoaWKMf +EOcKjvbdjmCLzEgP +EPDKjvbdHlBznXRL +DncKjvbdeOeTLTtS +EPCjjvbdGZUuBEXb +DnbkKvbdqTtHRqjt +EOcLKvbdFyUuAdXb +EPDLKvbdEARiMzWw +EOcKjvbdFeirNiUR +DoCkKvbdzjUoocsU +EOcLKvbdEztQdlCi +DncLKvbdKCjCpibx +EPCjjvbdxZhGFxFS +EObjjvbdwWkaWAvV +DnbkKvbdaaWFFoow +EOcKjvbdBsBDUGXS +EPDLKvbdmIdUQuRa +DncKjvbdVAbRTRRy +DoCkKvbdHffyxxYH +EObjjvbdDGkfHAzc +DoCkKvbdiCPDFXRR +EPCkKvbdVrNwbEkc +EPCkKvbdiGjDYvKV +DnbkKvbdIMBzmvpk +EPCkKvbdKxqJrztf +DncLKvbdmIctQuSB +EOcKjvbdaSFbhUGL +DoCjjvbdmbKWwnmu +DoCkKvbdiUyeWrVC +DncKjvbdGGKRmhsq +DoCjjvbdehLVqnQg +DncLKvbdTkunaVoJ +DnbjjvbdGZUtaDxC +EPCjjvbdtSrSyZeD +DoDLKvbdjbkkQfuH +EOcLKvbdOFDtJJLE +DnbjjvbdBdQAvJlf +DoCkKvbduDDVWvPP +EOcKjvbdZtJIyDsO +DncLKvbdQccBPpdS +DncLKvbdiUzEvquC +EPCjjvbdvvkaWAuu +DoDLKvbdZoOIeEzK +DnbkKvbdkCkkRGuH +EOcKjvbdRkZGVHLT +EObkKvbdtcCuXVno +EPCjjvbdMpYRVnGs +DoDKjvbdFfJrNiTq +DnbkKvbdZnmiFFZj +EPDLKvbdbhmKKfWx +DoDLKvbdDjHivXjA +DoDLKvbdiLeDnVDZ +EOcLKvbdUQqOtthN +EPDKjvbdZHXEAOri +EObkKvbdvAdYrndh +EObkKvbdQlwaxnUz +DoCjjvbdQwOEDLhD +EPDLKvbdqrVKnLBN +EObjjvbdwtmFQxkn +EPDLKvbdTfznMWvF +DnbkKvbdaMjasVNH +EPCjjvbdcyyQXxpb +DncKjvbdMfcQMpUk +DnbjjvbdZnmheEzK +DncLKvbdbrbkUDia +DncLKvbdiCOcFXRR +DoCjjvbdZxcimblS +EPDLKvbdRkYfVHKs +DncKjvbdDoDKjvbd +EOcKjvbdGAnpxizm +EOcKjvbdYpldhldq +DnbkKvbdQwOEDMID +DnbjjvbdcyxoxYpb +DoCjjvbdakMGOnDA +EPCjjvbdLAkGlawq +DncKjvbdJJdAKPfd +EOcLKvbdxrnImSBg +DoDLKvbdNddUJIjd +DncLKvbdfIKvRmpg +DoCjjvbdiZuGLqOG +EOcLKvbdeAURMwif +DncLKvbdiCPCeWpq +DoCjjvbdGcjvKBij +EPDKjvbdRDcBQQdS +EPCjjvbdUtMtGLvK +EPDKjvbdyXhjBoyk +DoDKjvbdqZOgfpcx +EObjjvbdYTMAmUPY +DoDLKvbdiCObeXQq +DncKjvbdmJDtRUqa +EObkKvbdSCEElIyL +EObkKvbdNGbpMouL +DoCkKvbdEzsqElCi +EObjjvbdOStWHFVQ +EPCjjvbdjmBlZdfo +EPDKjvbdiUyeWqtb +DnbjjvbdYSkaNUPY +DoCkKvbdTAEhhCPE +DoCjjvbdmttyjjSG +EOcKjvbdrMyjZMIJ +EPDKjvbdUsmTelVj +EPCkKvbdNsTugFUp +DnbkKvbdWRnYBeMD +DncLKvbdHgGzZXxH +EPDLKvbdZLrDsmlN +DncLKvbdcSbkUDjB +EObkKvbdziuPpDrt +DoCjjvbdZyEJmblS +EObkKvbdjggMFenL +DnbkKvbdmfeXmNfy +EObkKvbdiBncFXRR +EPDKjvbdADSXiyiQ +EObjjvbdLFfHbApu +EOcLKvbdRMwbZOUz +EPCkKvbdFVxoomJe +EOcLKvbdZnmiEdyj +DncLKvbdULunaVoJ +DncLKvbddndsKtTr +EPDKjvbdEztQeMDJ +EObkKvbdcScKscjB +EOcKjvbdFkErbglu +DoCkKvbdsBfMlGkZ +EPDLKvbdCSaCsfWr +EPCjjvbdVAapsRSZ +EOcLKvbdgFkzNfgA +EPDLKvbdjhHLefNk +EObjjvbdyNsIXsIc +DoCjjvbdqcdiPmvB +EOcKjvbdeXyssrFz +DnbjjvbdEOcKjwCd +DoDLKvbdGKdrbgmV +DncLKvbdKQzEoFnF +DoCkKvbdqvpMDJZR +EObkKvbdZyEKODMS +DncKjvbdBhjbKiFj +DncKjvbdfHkVrNqH +DncLKvbdeXyssrFz +EObjjvbdxmsHwriD +EPDKjvbdRyigsCvA +DoCkKvbdZoNiEeZj +EPCkKvbdhzUfLpnG +DncKjvbdVUNUFkuj +EPDKjvbdRXNdDMID +EObkKvbdlBMnmALA +EPDKjvbdffMZnHHA +EPCjjvbdEARhlyvw +EOcKjvbdVTltGLvK +EOcKjvbdJqZdoFme +EObkKvbdyOTHwsIc +DoDLKvbdCfkegAzc +DnbkKvbdZMRdTmkm +DnbkKvbdhkeEOUcZ +DoDKjvbdZnnIeEyj +DnbjjvbdrafNMGkZ +DoDLKvbdZtJIyESn +EOcLKvbdaRecITek +EPCjjvbdZoOJEdyj +DoDLKvbdxsNhlrBg +EPCjjvbdZxdKNcMS +DoCjjvbdCWzdJEov +EObkKvbdTppnttgm +DnbkKvbdjmCLydfo +EObkKvbdBsAbsewS +EObjjvbdjgflFemk +DnbjjvbdpstGrSKt +EOcLKvbdOTTvHFUp +DoCkKvbdczYowyRC +EObkKvbdTvMPjUAq +EOcKjvbdezvYeJUX +EPCkKvbdzHYlANEw +EPCkKvbdqcdiQOVa +DoCkKvbdsrrSxyeD +EObkKvbdOTUWGeUp +DoDKjvbdbUbHYLTh +DoCkKvbdHakydzAD +DoDKjvbddjJrWUzn +EPDKjvbdmaiwYPOV +DoCjjvbdtbcUwVno +EPDLKvbdrMyjYkgi +DoCjjvbdUQpoUtgm +DncKjvbdddoSBwDK +EPCkKvbdatbGwkTh +DncKjvbdmbJvxPNu +DnbjjvbdwzHeewdr +DncLKvbdzitpPcrt +EOcLKvbdrMyjYkgi +EOcLKvbdrEFIomvB +DoDLKvbdiifIJlxS +EOcLKvbdtvOYKQsA +DoCkKvbdxsNhlqag +DnbjjvbdyTOIlqag +DncLKvbdIGgZyYXg +EOcKjvbdUsmUGMWK +EObkKvbdhzUfMQnG +EPDLKvbdZxdJnCkr +DncKjvbdKWUeceGi +EOcLKvbdmbJvwnnV +DoDLKvbdDncKjvbd +EPCkKvbdZoNheEyj +DncLKvbdVqnXadlD +DncLKvbdtunXipsA +DncLKvbdjAPgBPfj +DoCkKvbdyqPNJKXA +DncKjvbdrpWPJbuf +EOcKjvbdqvpMDJYq +DnbjjvbdcTDLUDia +DnbkKvbdiGjCxvKV +EPDKjvbdauBfxKtI +DoCkKvbdLFfHbApu +DoDLKvbdHffyyXwg +EOcKjvbdIxUCHkqQ +DoDKjvbdzQoMiJwA +DoDKjvbdyYIjBoyk +EObkKvbdxnSgwriD +EObkKvbdIMBznWpk +EPDKjvbdYlSDtOMN +DoDKjvbdijGHjMxS +EOcKjvbdYkqcsnMN +DoCjjvbdmaiwYOmu +EPDKjvbdHELWKBjK +DoCjjvbdwtmFRYlO +EOcLKvbdFeiqnJTq +EPDKjvbdiBncEvqR +DoCkKvbdJXsbILpp +EObjjvbdULunaVni +DncKjvbdDwxLstUM +DoDKjvbdrWpMChyR +EObkKvbdYzcFqivZ +DncKjvbdEzspdlDJ +EPDKjvbdfMfXGmKL +DoCkKvbdCTAbtGWr +DoDLKvbdRkZGUgKs +EPCkKvbdFWZQQMie +DnbjjvbdxVNEqYkn +DoCjjvbdeFPRbWbj +EPCkKvbdZshhyESn +EObjjvbdqrVKnLAm +EPCjjvbdptUGqqjt +EOcLKvbdrEEhpOVa +DncKjvbdzQoNIjXA +DncLKvbdmgFXlnGy +DoDKjvbdZjShQHBf +DnbjjvbdjKGHjNXr +DoDLKvbdqFcdsvAh +EPCkKvbdOEdUIiLE +EPDLKvbdNeEUJJKd +EPCjjvbdzHZMANEw +DnbkKvbdqlzJyMIJ +DnbjjvbdelfXHMjL +EPCkKvbdANHyTWzY +DnbjjvbdREDBPpcr +DncLKvbdQmYCZOUz +EOcKjvbduoTzpjoU +DoCjjvbdqrUjmkBN +DnbjjvbdyfxlANFX +EOcLKvbdJmADygUa +EPDLKvbdyNrhYTIc +DoCjjvbdCTAbtFwS +DncLKvbdSwkLmzkY +DnbjjvbdjhHMFfNk +DoCkKvbdZeXfzhIb +DnbjjvbdbrbjtEJa +DoCkKvbdxrmhmRbH +DoDLKvbdrXQLbhxq +EObjjvbdTulQKUBR +EPCkKvbdMpYQumgT +DncKjvbderBWzlDP +DoCjjvbdiGjCxvJu +DoCjjvbdlZSqsZGt +EOcLKvbdZisIPfaf +DnbkKvbdHEKvKBij +DncLKvbdjSziSjiz +EPDKjvbdCEQBWJmG +EObkKvbdGGKRmiUR +EPDKjvbdMuTRkNAX +DnbjjvbdrXQLbiYq +EPCjjvbdOTUWGduQ +EPCjjvbdnBjXXoNu +DoDLKvbdcarmSAUN +DoCjjvbdNPwqWOGs +EObkKvbdUslsekvK +DnbjjvbdzaAPGfbM +DoCkKvbdGdLVjCJj +DoDLKvbdRjyFtfkT +DoDLKvbdGLFTDHlu +DnbkKvbdGFirOJUR +EPDLKvbddoFTLUUS +EObkKvbdkxrrTZGt +DncKjvbdxrnJMqag +EOcLKvbdCDpBWJmG +DoCjjvbdlqyUysDi +EPDKjvbdTfzmlXVe +DncKjvbdEuxpQMie +EOcKjvbdbLLfPNcA +DncKjvbdVgxWXgYz +DoDKjvbdrbFmLgKy +DoCjjvbdzaAPGfbM +DncLKvbdYSlAlsoY +DoDLKvbdZyEJnClS +EPDLKvbdEvYopMjF +DncKjvbdmtuZjiqf +DoCjjvbdCJKbLIfK +EOcLKvbdcIljLFvx +EObkKvbdrJAKFNPF +DoDKjvbdBiKbKhfK +EPDKjvbdWIYWYGxz +DoCkKvbdjAQGaQHK +DnbjjvbdjblLQftg +DncLKvbdbhlikGXY +EPDKjvbdZLrDsmkm +DoDLKvbdVTlsfMWK +DoCjjvbdliDsptqa +DnbkKvbdjuvmcbXw +DoCjjvbdbVCHXjtI +DoCkKvbdQvmdClID +DnbjjvbdLAkHNCXq +EPDKjvbdZtIhyETO +DnbkKvbdYkqdTmlN +DoDKjvbdMtrrKmAX +DncLKvbdJXtCIMQp +EPCkKvbdlhdTqUqa +EObjjvbdnHFYNNfy +EPDKjvbdxrmhlrBg +DncLKvbdiLeDmtcZ +DncKjvbdNrsufdtp +EObkKvbdlhcsptqa +EObjjvbdNeETiIkE +DnbkKvbdxsNhmRbH +DnbkKvbdADRxKZhp +DnbjjvbdTqROuUgm +EOcKjvbdpxoIGqDx +EOcLKvbdqBIeAWhE +DnbjjvbdCIkBjiFj +DncLKvbdTlWPBWPJ +DoCjjvbdEKHjVxKA +DnbkKvbdZRNFImEq +EObkKvbdJbicQjCx +DoDKjvbdNsTufeVQ +EObjjvbdDxYMUTsl +DoDLKvbdaSFcITfL +EPDKjvbdcTDLTcia +DoCkKvbdlhdTpuRa +EObjjvbdCJKbKiFj +DncKjvbdqAiFAWhE +EPDKjvbdUslsfLuj +EObjjvbdWWiXuceH +EPCjjvbdOEcshiLE +EPDLKvbdEJhJuxKA +DoCkKvbdKyRKSzuG +DncKjvbdHffzZXxH +EOcLKvbdSLZGUfkT +EObkKvbdHgHZxwxH +DnbkKvbdcSbjtEJa +EPDKjvbdZGwEAPTJ +DoDLKvbdeAURNXif +EPDLKvbdMpYQunGs +EObkKvbdNeDshiKd +DoDLKvbdzoQQdbkx +EPDKjvbdWHxWXfxz +EPCjjvbdCEPaVjNG +DoCjjvbdbhlikFvx +EOcLKvbdBvzdIdpW +DoCkKvbdNPwqWNfs +EPCjjvbdbhlijfWx +DncKjvbdqwQLbiZR +EObjjvbdkClLRGuH +DncKjvbdNHDQNQVL +DncKjvbdhkdcmuDZ +EOcKjvbdKWVFdFHJ +EPDLKvbdYTMBMtOx +EObkKvbdSKxfVGjs +DncKjvbdZoOJEdzK +EObjjvbdMpXqVmgT +EPDKjvbdhaoDFXRR +EPCjjvbdrpWPJcVf +EOcKjvbdczYpYZRC +DoDLKvbdLLAhWAJy +DoDKjvbdEObkLXDE +EPDKjvbdnVUykKRf +DnbkKvbdBvzdIdov +EOcKjvbdGFirOJUR +DoCjjvbdGGJrNiTq +EPDKjvbdqAheAWgd +DncKjvbdxmsIXriD +EObkKvbdVAbQsRRy +EPDKjvbdRXODbkhD +EObjjvbdVZHtZjoO +EOcKjvbdffMZmfgA +EOcLKvbdbiMjLGXY +DoDKjvbdUQpoVUhN +EPCkKvbdhfjCxuiu +DoCkKvbdziuPocsU +EObjjvbdBhkBkJFj +DnbjjvbdeAURNXif +DncKjvbdQlxByOUz +EPDLKvbdRbEEkhxk +EPCjjvbdrbFlkgKy +DoCjjvbdaSFbhUGL +EOcKjvbdsCGMkfkZ +DoCkKvbdJbicRJcY +DnbkKvbdqlzKYlHi +DoCjjvbdZyDimblS +EOcLKvbdsrqsZZdc +DoDKjvbdjggMGGNk +DnbkKvbdADSXiyiQ +DoCkKvbdehKurORH +EOcLKvbdrylPsAgn +EPCjjvbdRWmdClID +EPCjjvbdbsCjsdKB +EObjjvbdUQpoVVHm +DnbkKvbdiCObeXQq +DncLKvbdUQpoVUhN +DoCkKvbdKCicRKDY +DncKjvbdjlakzFGo +DnbkKvbdMgDQMpVL +DoDLKvbdWSNxBeMD +DnbkKvbdvBEZTOdh +EPCjjvbdsQWPKCuf +EObjjvbdZeYGzghb +DnbkKvbdxsNhmSCH +EPDLKvbdkySrTZGt +EObkKvbdrDdiQNvB +DncLKvbdHDjuiajK +DoCjjvbdURROtuIN +DncKjvbdKyRJrztf +EObjjvbdIGfyyYXg +DncLKvbdXsMBMtPY +EPCkKvbdaaVdfPpX +DncKjvbdiHJbyWJu +EOcKjvbdSKxfVGjs +DoDKjvbdxZgfFwdr +DnbkKvbdRNYCZNtz +EPCkKvbdCDoaWKNG +DoDKjvbdDjHjWYKA +EPDKjvbdyNsHwsIc +DoDKjvbdUtNTfLuj +DoDLKvbdGGKRnJTq +EPCkKvbdsBemMGjy +EPDKjvbdSQUHKFcw +DnbjjvbdkClKpfuH +EObjjvbdRyjHrcWA +EOcLKvbdSPsfjGEX +DoCjjvbdGckWKBij +EPCkKvbdGdKujBij +DnbjjvbdcJMijewY +EPDKjvbdkIGkefOL +EPCkKvbdrSVLNkBN +DnbkKvbdrpWPJbvG +DoDLKvbdZirgpHBf +EPCkKvbdHDjujBij +EPCkKvbdvBDySoEh +DoDLKvbdePEsKssr +DoDLKvbdZRMdhldq +EObjjvbdUQqPUtgm +DoDLKvbdMSXNZtpz +EObjjvbdVYhTzKnn +EOcKjvbdrNZixlIJ +DoDLKvbdTpqPVVIN +DnbkKvbdkCkjqHVH +DnbkKvbdkWWmcaxX +EOcLKvbdJSyBSlwl +EObkKvbdmRxtzTEJ +DncKjvbdptTgRqjt +EOcLKvbdqYoHfqEY +DoDKjvbdGZUtaDxC +EOcKjvbdKQydoGNe +EPDLKvbdssSTZZeD +EObjjvbdhkddOUcZ +DoDKjvbdGdKvJbKK +EOcKjvbdULvPAuoJ +DoCkKvbdrEFJPnWB +DnbjjvbdfNGWfmJk +EPCkKvbdkWXODaww +EOcKjvbdMtrrKmAX +DnbjjvbdEuyPpMie +EObjjvbdrSVKmkAm +EPDLKvbdhanbdvqR +DoCkKvbdkWWmdBww +DnbjjvbdxUleQyLn +EOcLKvbdpyPHfpdY +DncKjvbdpfDeTvBI +DoCkKvbdnVVZjirG +DnbkKvbdzjVPocsU +EPDLKvbdmfdwlmfy +DnbkKvbdSKyFuGjs +EObkKvbdVAaprpqy +EPCjjvbdUaBqTRRy +EObkKvbdZoNhddzK +DncKjvbdrNZiyLhJ +DncKjvbdaMkBruNH +DoDKjvbdZyDjNcMS +EPCjjvbdZjTIQHCG +EObkKvbdjJegilwr +EPDKjvbdHffzYxYH +EPDKjvbdaSGChTfL +DoDLKvbdcJMjLGWx +EOcLKvbdtlXvaTaX +DoCjjvbdGYuVAcxC +EOcLKvbdUsltGLvK +EPDLKvbdRNXayOUz +DoDLKvbdRadFLiYk +EOcKjvbdCTAbsfXS +EPCjjvbdGZVVAdYC +EPDLKvbdypnliJwA +EPCjjvbdSBdFLhxk +EOcLKvbdGLFSbhNV +DncKjvbdTppnuUhN +EObkKvbdezvYdiTw +DoCkKvbdIsZBSlxM +DncLKvbdRNYBxmtz +EPCkKvbdeFOqawCj +DnbjjvbdtSrTYzEc +DncKjvbdkDLkQgUg +DnbjjvbdEARhlzXX +EOcKjvbdWRmxBeMD +DoDLKvbdzQnliKXA +EPDKjvbdpfDdtWAh +DncLKvbdMgCpMpVL +DnbkKvbdiZtfLpmf +EPDLKvbdzQoNJJwA +EPCkKvbdaNKasUmH +EPDLKvbdRbDeLhyL +DoDLKvbdKRZeOeme +EOcKjvbdZxdJmcMS +DncLKvbdeKKSVtzn +EPDLKvbdRjxeuHLT +EObkKvbdNGcPmPtk +DoCkKvbdtcDVWvPP +EPCjjvbdcTDKscjB +DoDLKvbdbrcLTcia +EObjjvbdvlvAMcdm +EObjjvbdFxuVBDwb +EPCjjvbdhkdcmtby +EOcKjvbdRotHKFcw +DncLKvbdelfWgNKL +EObkKvbduCbuXVno +EPDKjvbdEYXlUUUM +EOcKjvbdbUbHXjsh +EOcLKvbdmgEwmOHZ +DoCjjvbdEXxLsssl +EPDLKvbdZLqdTmlN +EOcLKvbdbsCkUEJa +EOcKjvbdqvpLbhxq +EOcKjvbdfIKvRmpg +DncLKvbdGBOpxizm +DoDLKvbdnBiwXnmu +DoCjjvbdKWVFceGi +EOcLKvbdRbEEkiZL +EObjjvbdffMZmgHA +DoCjjvbdUMWPBWPJ +EObkKvbdkClKpftg +DoDLKvbdBhkBkIej +DoDKjvbdhgJbyWJu +DoCjjvbdEASIlzXX +EPDKjvbdGZUtaDxC +DnbjjvbdlYsRryHU +EOcKjvbdhgKCyWJu +EPCkKvbdsQWOibuf +DoCjjvbdRMwbYmtz +DoDKjvbdZxdJnClS +EPCjjvbdJTZBTNYM +DnbjjvbdiLeEOUby +EOcLKvbdjEjgUoAO +EPCkKvbdzitopDrt +EPCjjvbdtcCuWvPP +DncKjvbdZMRdUNlN +DoDLKvbddZxoxZRC +DoDKjvbdFVxoomKF +DoCkKvbdSLYeuGkT +DncLKvbdYSlBNTnx +EObkKvbdeuzwoizs +EPDKjvbdUQpoUuIN +DoDKjvbdmpZxujyC +EPCjjvbdDGlFgAzc +EPCjjvbdkCkkRGuH +DnbkKvbdvlvAMdFN +DoDLKvbdatbHXkUI +EPCjjvbdFWYoolie +DnbjjvbdrEFJPnWB +EObkKvbdpyOggQcx +EOcKjvbdqwQMChxq +EOcKjvbdqrVLNkAm +EOcKjvbderBWzlCo +DoDLKvbdRWmdDMHc +EOcLKvbdZoNhdeZj +DnbkKvbdunszpkPU +EPDKjvbdGAnpxizm +DoCkKvbdKCjCqKCx +EOcKjvbdZshhyDrn +DoDKjvbdddoSBvcK +DncKjvbdcScKtEJa +EOcLKvbdZjShQGbG +DncLKvbdDncKkXDE +EPDLKvbdrzMQTBHn +EPDLKvbdIxUBglRQ +EPDKjvbdcyxpXxpb +EObkKvbdMSXMytpz +EObkKvbdijGIKMwr +EObkKvbdzdzOzdyp +DnbjjvbdeATplwjG +DnbkKvbdcIlikFwY +DoDLKvbdsPunicVf +EPDKjvbdmozYvLZC +DoCkKvbdkyTSSxgU +DncLKvbdRWnDcLhD +DncKjvbdHELWJaij +DncKjvbdZQmFIleR +EOcKjvbdiCOcEvpq +EOcKjvbdbrbkUEKB +EOcLKvbdOFEThhjd +EObkKvbdbBVdepPw +EObkKvbdUxhTzKnn +EObkKvbdzoPpdblY +EOcLKvbdrbFllHLZ +DoDKjvbdjggMGGOL +DncLKvbdqceJQNua +DoDKjvbdiHJbxvJu +DoDLKvbdySnImSBg +EPCkKvbdtTRrxzFD +EOcLKvbdkVvnEBxX +DnbjjvbdtcCtvvOo +EPCkKvbdyzdmrHiI +DoDKjvbdFjdrbhMu +DoDLKvbdZyEKODLr +DoDKjvbdURQnuVHm +EPCkKvbdZyDimcMS +EOcLKvbdNQXpunHT +DnbjjvbdQlxCYmtz +DnbjjvbdCDoaVimG +EObjjvbdsPvOibvG +DnbjjvbdgGLynGgA +DncLKvbdCDoaWJmG +EObkKvbdnCKXXnnV +EOcLKvbdUxgtZkPO +DnbkKvbdiMFDmuDZ +DncKjvbdiGicZWKV +DoDKjvbdcScKtEJa +DoDKjvbdpssgRqkU +DncKjvbdsBfNLgKy +DoDLKvbdGYttaDwb +DncKjvbdjvWnDaxX +EPCjjvbdhgJcYuiu +DnbjjvbdxUldpxlO +DoDKjvbdUaCRSqSZ +DnbkKvbdNwoVzdNt +DoCkKvbdZnnIeEzK +EPDKjvbdNeEUJIkE +DnbjjvbdJbjDQjDY +EPDLKvbdKVuFceGi +EPCkKvbdKkBIWAJy +EObjjvbdrafMlHLZ +EOcLKvbdZLqctNkm +EObjjvbdMgComPtk +DncKjvbdjhHMGGOL +DnbkKvbdJYUCIMQp +DoCjjvbdhlEcnVCy +DoDLKvbdxsOJNSBg +EOcLKvbdRMxBxmtz +EOcLKvbdHDjujCJj +EObjjvbdZRMdhmFR +EPDLKvbdUQpoUthN +EPCkKvbdvlvANEFN +EObkKvbdSCEEkhxk +EPCjjvbdLBKfmCXq +EPDKjvbdOStVfduQ +EPCjjvbdGcjvJbKK +DnbjjvbdVBBprpqy +DoCjjvbdirziTLJz +DncLKvbdFWYpQNKF +DoDLKvbdjKGHjNYS +DncKjvbdZnmiEdzK +DoDKjvbdySmiMrBg +DncLKvbdeAURNYKG +EPDLKvbdemGWflik +DoDKjvbdaMkBrtmH +DoDKjvbdIxUBglRQ +DoDKjvbdOEcshhjd +EPCjjvbdpxnhGqDx +DncKjvbdYSlBNToY +DnbjjvbdGGKSOJUR +EOcLKvbdZjTHpGbG +EPCjjvbdIHGzZYXg +DncKjvbddndsLTsr +DnbjjvbdqAheAXIE +EOcKjvbdVhXvXfxz +DncKjvbdFyVVAdYC +DnbjjvbdJvVFceGi +EPCkKvbdoznDjwoA +EPDKjvbdvPTzqLPU +EObjjvbdiifIKMwr +EOcLKvbdlZTSSxgU +EObjjvbdQvnECkgc +DncLKvbdjgfkfGNk +DnbkKvbdCDoaWJmG +DnbkKvbdxnTHwriD +DncKjvbdoAKzshDn +DoDKjvbdvAdZSndh +DnbjjvbdRpTgKFcw +EOcLKvbdiiegilwr +EOcKjvbdGdLVjBjK +EObkKvbdGFjRmhtR +EPCjjvbdZsiJYdTO +EPCjjvbdJJdAKPfd +EPDLKvbdKfGHbBRV +DncLKvbdjhHMFenL +EObkKvbdbLMFnnDA +DoCjjvbdUWMPisaR +DnbkKvbdZjTHpHCG +EObkKvbdbsCkTcjB +EPCkKvbdSLYfUfkT +DoDKjvbdZeYGzhIb +DncKjvbdrovPJcVf +EPCjjvbdePFSjtTr +DncKjvbdJbibqJbx +EPDLKvbdDxYMUUTl +DnbkKvbdZHXEAPSi +DncKjvbdVTmUFlVj +EPDKjvbdzoQREcLx +EPDKjvbdKfFhCAqV +DoDKjvbduDDUwVoP +DoDKjvbdgFlZmfgA +EObjjvbdTAEiHbOd +DoCkKvbdMowqVmgT +DncKjvbduMXwBTaX +DncKjvbdeYZssrFz +DncLKvbdmfdxNNgZ +DncLKvbdxLXDgzzG +DoCjjvbdNsTvGduQ +EPDLKvbdTpqOtuHm +EObkKvbdZMRctOMN +EPCjjvbdHEKuibJj +EPCjjvbdBiKbLJGK +DoCjjvbdUtNUFkvK +EOcKjvbdVTltFkuj +DnbjjvbdczYpXxqC +EPDLKvbduWNxKQsA +EOcKjvbddZyQYYqC +DnbkKvbdyfyMAMdw +DncLKvbdDihKWXjA +EPCjjvbdoAKztIDn +DoCjjvbdcTDLUDjB +EPDKjvbdJcJcRKCx +DncKjvbdIxTahLqQ +DoDLKvbdTqROttgm +DoDKjvbdjblLQgUg +EOcLKvbdTppnuUhN +EPCjjvbdrMyjZLgi +EObjjvbdypnmIjXA +DoCkKvbdczYoxZRC +EObkKvbdFjeTDHmV +EPCjjvbdZxcimbkr +DoDKjvbdatbHXkUI +EPDKjvbdvmWAMdEm +DoCjjvbdqwQMCiYq +DoDKjvbduWNwjQsA +DncKjvbdACqwjZiQ +DoCjjvbdOTTvGduQ +EObkKvbdirzhsKiz +EObjjvbdOTTugFUp +EOcLKvbdKDJbqJcY +DoCjjvbdiUyeXRtb +EObjjvbdfMfXHNKL +EOcKjvbdjhHMFfNk +DncKjvbdRpUGjFcw +EPCjjvbdfILVqnRH +EOcKjvbdiHKCyWJu +DoDLKvbdnPzYvLYb +DnbkKvbdnGeYNOHZ +DoDKjvbdtvOXjQsA +EPCjjvbdmIctRVRa +EOcKjvbdpyOhGpcx +DnbkKvbdKQydoFnF +DoDKjvbdkVvnDaww +EObjjvbdbUbHXjsh +EOcKjvbdCJLCLIfK +EPDKjvbdZeYGzhJC +DncKjvbdcScLUDia +DoCkKvbdQmXbZOUz +EOcLKvbdRadFMIxk +DnbkKvbdziuPodSt +EOcKjvbdEXxMUUTl +DnbjjvbdegjvSOQg +EObkKvbdZtJJYdTO +EPDKjvbdVAbQsQrZ +DnbkKvbdkHflFfOL +EObkKvbdtcCuXWOo +DnbjjvbdcTDLUEJa +EPCjjvbdZjTIQHBf +EObjjvbdTAEhhCPE +EOcLKvbdbhlikFwY +DoDLKvbdEPDKkWbd +EOcKjvbdZtJJZESn +EPDKjvbdZMRdUNlN +EPCkKvbdhgJcZWJu +DncKjvbdUaBqSprZ +EOcLKvbdEJgiuxKA +EObjjvbdSPtHKFcw +DoCjjvbdFfKSOJUR +EObjjvbdVrOXaeMD +DoCjjvbdrXPkcIxq +DoDKjvbdZjTHofaf +EOcLKvbdVYgszLOn +DncKjvbdIwsagkpp +DncLKvbdTkvPBVni +EOcLKvbdUtNUFkuj +EObjjvbdZnmheEyj +EPDKjvbdyYIjBoyk +EPCkKvbdqlyiyMIJ +EPCjjvbdYzbeqjVy +EOcLKvbdUQqOuVIN +EObkKvbdZMSDtOMN +DncKjvbdVvhxWDdg +EOcLKvbdiZuFlRNf +EObjjvbdZtJJYcrn +EPCjjvbdmuUzKirG +DoDLKvbdVUMtGMVj +EPDLKvbdhWyAzzAJ +DoDLKvbdfIKvRmqH +DnbjjvbdqdFIpOVa +DnbkKvbdIwtCHkpp +EOcKjvbdeEnrBvcK +DnbkKvbdJuuFdFGi +DoDKjvbdeOeTKtUS +EObjjvbdKWUfDeGi +EPCjjvbdiHJbyViu +EOcKjvbdBraCsfWr +DoCjjvbdGYuVBEYC +DoCkKvbdnHEwmOHZ +EPDKjvbdZisIQGaf +EPCkKvbdmpZxvKyC +DoDLKvbdmSYuZrdJ +EObkKvbdKDJbqKCx +EOcLKvbdZsiJZETO +EPDKjvbdnCJvxOmu +DoCkKvbdjgflGGOL +DnbkKvbdRosfjFdX +EPCjjvbdRECaQQcr +DnbkKvbdNHComQVL +EPCjjvbdrJAKEmOe +DoDLKvbdqBJFAXIE +DncLKvbdGLFTDINV +EOcLKvbdhgJbxujV +DnbkKvbdjSzhsKiz +EOcKjvbdKWVGDdfi +DoDKjvbdZnnIeFZj +DnbjjvbdxxIiaoyk +EObkKvbdczYpYZQb +EPCjjvbdZxcjODMS +EObkKvbdiHJbxvKV +DoCjjvbdJzoexEAN +DoCjjvbdaRfChTek +DoDLKvbdxwhjCPyk +DoDLKvbdVqnYBeLc +DnbkKvbdRDcBPpdS +EObkKvbdYqNFImFR +EPDKjvbdsrrTYzFD +EOcKjvbdqcdhpOWB +EOcKjvbdaNLCTUmH +DoDKjvbdnPzYukZC +DncLKvbdKCjDRKCx +EObjjvbdFkEsDINV +EPDKjvbdMgDQMouL +DncLKvbdOXnuzdNt +EPCjjvbdpstGqrLU +EPCkKvbdRbDdkhyL +DnbkKvbdaogGdLzd +DncKjvbdjlbLydgP +DnbjjvbdUMVoAvPJ +EPCjjvbdJqZeOfOF +DoDLKvbdUsmTekvK +DoCjjvbdpyOgfpcx +DnbkKvbdJYUCIMRQ +DncLKvbdjJfHjMwr +DoCjjvbdRosgKGDw +DoCkKvbddZxpYYqC +DncKjvbdddnrBwCj +EPDKjvbdijGIJlxS +DoCjjvbdkWWnECYX +EObkKvbdqlzJxlIJ +EOcLKvbdzaAPHHBl +DoDKjvbdlZTSSyGt +DnbjjvbdatbHXkUI +EOcLKvbdNdcshiKd +DncKjvbdGdKujBjK +DnbjjvbdRWnDcMID +DoCjjvbdSxKlNzkY +EPDKjvbdHDkWJbJj +EPDLKvbdZxcjNcLr +EOcKjvbdLYqKSzuG +EPDLKvbdjuvmcaww +EPDKjvbdxmrhYTJD +EOcKjvbdZirhPfaf +DnbjjvbdfIKurNqH +EPCkKvbdYTLaNTnx +DoDLKvbddtAUASlv +EPCkKvbdZLrDtOLm +DnbjjvbdnGdxMnHZ +DoCjjvbdeFPSCXCj +DncLKvbdYORAYUvU +EPCjjvbdrXQMDJZR +EPCkKvbdRpTfjGDw +DoCjjvbdpssfrSKt +EPCkKvbdKWUedFHJ +DnbjjvbdVvhwvDdg +DncKjvbdLrWlzUpz +DncKjvbdwtmFQxkn +EObkKvbdmIdTqUqa +DnbkKvbdJutedFHJ +EOcKjvbdVZITykPO +DoDLKvbdhbPDFXQq +DnbjjvbdmuVZjirG +DncLKvbdieKgVPAO +DncKjvbdEuyPpNJe +DoDKjvbdiHJcYuiu +EPDKjvbdmgFYNNfy +DnbkKvbdOTUWGeUp +DoCjjvbdZRNFJNFR +EPDLKvbdYpmFJNEq +EObkKvbdRMxBxnUz +DncKjvbdNQYQvOHT +EOcLKvbdMoxRVnHT +DoDKjvbdpyOhGpcx +EObjjvbdRyjITDWA +EObjjvbdrykosAhO +EOcLKvbdhaoDFXRR +DoDLKvbdIryBSmYM +DnbjjvbdlZSrTYft +DncLKvbdegjurORH +EOcKjvbdJYUCHlRQ +EOcLKvbdREDApRES +EObjjvbdmgFYMnHZ +EPCkKvbdZyDimblS +DoCkKvbdiCPCdwQq +EObkKvbdbVBgYKtI +DoDLKvbdNddUJJLE +DoCjjvbdrpVnibuf +EPDLKvbdKaLGlbYR +DnbjjvbdTpqPVUhN +DoCjjvbdcyxoxYpb +EPDKjvbdhfibxvJu +EPCjjvbdJpydnfNe +DncLKvbduWOXipsA +DoDKjvbdrRtkNkAm +EObkKvbdNQXqVmgT +EObkKvbdCIkBkJFj +EPDLKvbdqUUHSRjt +EOcLKvbdeYZtTqez +EPCjjvbdqUUHRqkU +DncKjvbdkWXODaxX +EPCkKvbdaNKbTVNH +EPCjjvbdvAcxroEh +EOcKjvbdlZTSTZGt +EOcLKvbdLAkHNCYR +DoDLKvbdUtMselWK +EPCjjvbdnVUzKjRf +DoDLKvbdypoMiJwA +EObjjvbdKDKCqKDY +DoCjjvbdrWolDIxq +DoDKjvbdwyhFfXeS +EOcKjvbdnGeYMmgZ +DoDLKvbdREDAopcr +EPCjjvbdiUzFXRuC +DoDLKvbdZQldhmEq +EPCjjvbdtvNwipsA +EPDKjvbdbrcLUDia +DoDLKvbdegkVqnQg +DoCjjvbdznopdcMY +DoCjjvbdmfeXlmgZ +DncLKvbdXrlBMsnx +DoCjjvbdmgEwmOGy +DoCkKvbdjmCLydgP +DncLKvbdmJEUQuSB +DnbjjvbdRbDeLiYk +DnbkKvbdQdDBPqDr +EObkKvbdjKGHjMxS +DoCkKvbdyOTHxSiD +EPCjjvbdQwNdCkhD +EObjjvbdfNFwGljL +EObjjvbdVqmxCElD +EOcKjvbdeOeTKtTr +DoDKjvbdUaBqSpqy +DnbjjvbdmIdURUqa +DoCkKvbdUWMQJtBR +DnbjjvbdxnSgxSiD +DncKjvbdwXMBVaVu +DnbjjvbdvvkaVaWV +EObkKvbdmaiwXnmu +DoCjjvbdgQBzwEYI +EOcKjvbdFVxpPmJe +EObjjvbdKDJcQjCx +DoCkKvbdYlRdUOMN +EOcLKvbdZoOIddzK +DoCjjvbdffMZnHHA +DncKjvbdnQZxujxb +EPDLKvbdwXMBWBVu +DoCjjvbdLFfIBaQu +DncKjvbdGQASwHFy +DnbkKvbdauBfxKsh +EOcLKvbdraelkgKy +EObkKvbdnVUzLKSG +DoDKjvbdANHxrwZx +DncLKvbdqZPHfqEY +EObjjvbdvPTzpjoU +EObjjvbdrWpMDIyR +DnbkKvbdCDpBWKNG +DnbkKvbdyOSgwrhc +DnbkKvbdeKKSVtzn +DncKjvbdMowpumgT +EOcLKvbdOFDtIhjd +EPDKjvbdkDMLRGtg +EPDKjvbdiiehJlwr +EPDLKvbdBdQAvJlf +DoDLKvbdZyEKODMS +EObjjvbdJqZePFme +DnbkKvbdKxqKSztf +EObkKvbdmJEUQuSB +DnbkKvbdREDAopdS +EPDKjvbdwzHefYEr +EPDKjvbdnHExMnGy +EOcKjvbdmozZVjyC +EPDKjvbdZHWdAPTJ +DoDKjvbdjgfkfFnL +DncKjvbdczZPxYqC +DoDKjvbdEXwlUUTl +DncKjvbdhuZdvrVC +DnbkKvbdxKwDgzzG +EPCkKvbdsZlQSaIO +EOcKjvbdzRPMiKXA +DoDKjvbdqvolDIxq +DoDKjvbdQdCaPpcr +EPCjjvbdJmADyfuB +DnbjjvbdsCGNLgLZ +DoDKjvbdKfGICAqV +DoCkKvbdbiNJkGXY +DncKjvbdiGicYvKV +EPCjjvbdSxLLmzjx +DncKjvbdLAjflaxR +EPCkKvbdUyHsyjoO +DnbjjvbdcyxoxYqC +EObkKvbdxZgfGYFS +EPDLKvbdZoNiEeZj +DncLKvbdZtIhxcrn +EPDLKvbdIwtCILqQ +DncLKvbdQmXbYmtz +EOcLKvbdmuUzKiqf +EPDKjvbdsQVnibuf +EObjjvbdOSsugEtp +EOcLKvbdYlSETnLm +EObkKvbdUtNUGMWK +DoDLKvbdzeZnzeZp +DoDKjvbdqTtHRqkU +EObjjvbdmbJvxPNu +DoDLKvbdliDsqUqa +EPCjjvbdhanbdvpq +DoDKjvbdiifHilxS +DoDKjvbdmJDsptqa +DnbkKvbdDncKkWcE +EPCkKvbdaofgELzd +DncKjvbdijGIJmXr +EPCkKvbdRkYfUgLT +EObkKvbdHEKuibKK +DnbjjvbdVhXuwfxz +DoDLKvbdiMEcmuCy +DnbkKvbdJcJcQibx +DnbkKvbdmfeYNOGy +DoDKjvbdqUTgSSKt +EPDLKvbdePErjtUS +EObkKvbdaNKasUmH +EObkKvbdiifIJmYS +EOcKjvbdsPunjCvG +EObkKvbdbrcKtDjB +EPDKjvbdbhlikFwY +EPCjjvbdrpVnjDWG +EPCjjvbdaMkCStlg +DncKjvbdMpXqVnGs +EPDLKvbdZjShPfbG +EPDLKvbdfHkVrOQg +DoCkKvbdDnbjjvbd +DoCkKvbdkySqsYft +DoDLKvbdZRMeImEq +DoDLKvbdYpleIleR +DncKjvbdiHJbyViu +EObkKvbdrMyixkgi +EPDKjvbdqvokbiYq +EOcKjvbdzitoodTU +DnbjjvbdVYhTyjnn +EPDLKvbdyYJJbPzL +EObkKvbdeFPSCWcK +EPDKjvbdIsZArlxM +DnbjjvbdkIHLfGNk +DoDLKvbdehLVqmqH +EOcLKvbdvBEZTPFI +DncKjvbdnUuZjirG +EPCjjvbdakLfOnDA +DnbkKvbdEzsqEkcJ +DnbjjvbdVhXvXgYz +DoCjjvbdIryBTNYM +DncKjvbdZirgpHBf +DoDKjvbdEYYLsstM +DnbjjvbdZshhyETO +DoCjjvbdOTUVgFVQ +EObjjvbdZisHpGbG +DoDLKvbdkDLkRGtg +EObkKvbdegjvSNpg +DncLKvbdfIKvRnQg +DncLKvbdJKEAJpGd +DncKjvbdrRtkNkBN +EPCkKvbdjvWnDaxX +DoCjjvbdmfdwmNgZ +DnbjjvbdbrcLUEJa +DncLKvbdnQZxujxb +DoDKjvbdNsTugEuQ +EOcKjvbdUVlPisaR +EObkKvbdHDjujBij +EPDLKvbdSBdFMJYk +EPCkKvbdVvhxVdFH +DncKjvbdIsYaTNXl +EPDLKvbdIrxaSlxM +EPDKjvbdfoazwDwh +EPCkKvbddeOqbXDK +DoCjjvbdJpzEnfNe +DncKjvbdqiAKFNOe +EPDLKvbduDCtwWOo +DnbjjvbdZjShQGbG +EObjjvbdVAbQsRSZ +DncLKvbdtcCuWuoP +DoDKjvbdTvLoitAq +EOcLKvbdZQleIleR +DoCkKvbduLxXAtAw +DnbjjvbdqYoHfqDx +DoDKjvbdJYTbHkqQ +DncLKvbdGZUtaDxC +EObjjvbdqFdEtWAh +EPCkKvbdILaznWqL +EObkKvbdQwNdCkhD +EPCkKvbdmJDsqUqa +EOcKjvbdvBEYrneI +DoDKjvbdapGgELzd +DoCjjvbdwWlAvAvV +DoDLKvbdJbicQicY +EPDKjvbdaaVdepPw +DoCkKvbdsZkosAhO +DoCkKvbdNeETiJKd +EObkKvbdEObkLXCd +EPCjjvbduCbuXVno +DoCkKvbdrykpTBHn +DnbkKvbdrEFIpNua +DoCjjvbdlYrrSxft +DoDLKvbdqdFIpOVa +EObjjvbdrbFmMGjy +DnbkKvbdRpUHKGDw +EOcLKvbdzoPpdcMY +DoDLKvbdfILVqnQg +DoCkKvbdlZSqsZHU +DncKjvbdrzMQSaIO +DoCkKvbdhuZeWrUb +EObjjvbdfSAvzkbo +DoCkKvbdVZIUZjnn +EOcLKvbdhlEdOUcZ +DoDKjvbdbUagXkUI +DoCjjvbdqUTgRqjt +DoDLKvbdqTsfrRjt +DnbkKvbdrouoKCuf +EPDKjvbdmbKXXoNu +DoDLKvbdhbPDEwRR +DncLKvbduVnYKRTA +DoCjjvbdcJNKKfXY +EPCjjvbdeFOrCXDK +EPCkKvbdczYoxYpb +DnbkKvbdKfGHaaRV +DoCjjvbdMuTRjmAX +DoDKjvbdkMalZeGo +DnbkKvbdbhmKLFvx +EPDLKvbdjuwODbXw +DoDLKvbdUMVoBVoJ +DoCkKvbdRpTgJfDw +EOcLKvbdajlFoNcA +EPCjjvbdRMwaxnUz +EOcLKvbdJcJbpjDY +DoCjjvbdjhHLefNk +EOcLKvbdcasNSATm +DoDKjvbdyOTHwriD +EObjjvbdKQydnenF +EObjjvbdZirhPgBf +EPCjjvbdBiKbLIfK +EOcKjvbdNeDtIiKd +EOcKjvbdkDLjqGtg +DoDKjvbduDDVWuoP +DncLKvbdePErjtTr +EOcKjvbdJbicQjDY +EPDKjvbdrylQTBHn +DnbjjvbdkMbMZeGo +DncLKvbdtlYWaUAw +DoCjjvbdDwxMUTtM +EObkKvbdjblKqGtg +DoDKjvbdRMxCZNtz +EObkKvbdqYoIGqDx +EPDKjvbdmfeYNNgZ +EObjjvbdTAFIhCPE +DoCjjvbdjKGIKMxS +EOcLKvbdMpYRWOHT +EOcLKvbdMoxRVnGs +DncKjvbdhaoDEwQq +DnbkKvbdEXxMTtTl +EPCkKvbdMgCpMpVL +EObjjvbdRzKITDWA +EOcLKvbdrzLosBHn +EPCkKvbdBraCsfWr +DoCkKvbdaaVeGPow +EOcLKvbdIGgZyXxH +EPDKjvbdliETptqa +EOcLKvbdbKlGPODA +DnbjjvbdRadElJZL +EPDLKvbdjFLHVPAO +DnbkKvbdiBnbdwRR +EObkKvbdvBDyTOeI +DnbjjvbdUyHtZjnn +DnbkKvbdmgFYNOGy +DnbkKvbdGKdsDHlu +EPDLKvbdZRNEiMeR +DoCkKvbdbLLeoODA +EObkKvbdANIZSvzY +DoCkKvbdziuPpDrt +DnbjjvbdWHwvXgYz +EPDKjvbdsBfNLgLZ +DoCkKvbdWWiXudFH +EPDLKvbdwzIGGYEr +EOcLKvbdVTmUGMWK +EObjjvbdMSXMytpz +DncKjvbdZirhQGaf +EObjjvbdCJLBjiGK +EPCjjvbdZLrETnLm +EObjjvbdelevfljL +DncKjvbdGYuVBEYC +EPCkKvbdkCkjpgUg +DoCkKvbdbhljLFwY +DnbjjvbdeEoSBvbj +DncLKvbdvAcyTPFI +DnbkKvbdjblLQgVH +EPCjjvbdeEoSBvbj +DnbkKvbdaMjbStlg +EObjjvbdrDdhpOWB +EOcKjvbdbKlFoODA +EPDLKvbdZjTIQGaf +EObjjvbdEzsqEkcJ +DnbjjvbdZRNEiNEq +EObjjvbdqlzJxlIJ +DnbkKvbdkIHLfFmk +EObkKvbdMtrrKmAX +EPCkKvbdNQXpvNgT +EPCkKvbdbrcKtEKB +EObjjvbdSPtGjGEX +DoDKjvbdxwiJaoyk +DnbjjvbdVYhUZkPO +DoDLKvbdXrlBNUPY +DoDKjvbdZnmiEdzK +DoCjjvbdWWiXvDeH +DoDLKvbdyNsHwsIc +DoDKjvbdwyhFfYEr +EPDLKvbdNeDshhkE +EPDKjvbdBiLBkJFj +EOcKjvbdJqZdoGNe +EOcKjvbdbAvEepQX +DoCjjvbdaNLBsUlg +EPDLKvbdvBDxsOdh +DncKjvbdGFirNiTq +EPDLKvbdZnmiEeZj +DncLKvbdePFSjtTr +EOcKjvbdnGdwlnHZ +EOcLKvbduDDUvuno +EObjjvbdZQmFIldq +DoCkKvbdcyxpYYqC +EOcLKvbdMRvlzVQz +DoCjjvbdtcDUwVoP +EPCkKvbdrXQLbhxq +DoDKjvbdkVwODbXw +DnbjjvbdnCJwYOmu +DnbkKvbdqvpLbhxq +DoDKjvbdKDJcQjDY +DnbkKvbdvwMAvAuu +EPDKjvbdtvNxKRTA +DoDKjvbdYkqctOMN +DoDKjvbdtcCuWvOo +DoCjjvbdEObkLXDE +DoCkKvbdbrbjtDia +EObkKvbdDncKkXDE +DnbjjvbdxxJKBozL +EPCjjvbdbhlikGWx +DncKjvbdJXtCIMRQ +EOcLKvbdkVvmcaxX +DoCjjvbdqwPkbhyR +EObjjvbdySnImRbH +EObjjvbdZQleImFR +EObkKvbdmpZxujyC +EPCjjvbdhbPDEvpq +EObkKvbdpyPHgREY +DoDLKvbdwzIGGXeS +EObjjvbdaSGChUGL +DoDKjvbdrbFmMGkZ +EPCkKvbdxKwEHzyf +DnbkKvbdJXtBgkpp +EPCkKvbdlZTRrxft +EOcKjvbdFVyPpNKF +DoCkKvbdaRecHsek +DoDKjvbdFfKRnJUR +DoCjjvbdyOTIXrhc +DoDLKvbdyOSgxShc +DoDKjvbdEOcKjwCd +DoCjjvbdzoPpeClY +DoCkKvbdURRPVUhN +DoDLKvbdVqmxCFMD +EOcKjvbdNVSrKmAX +EOcKjvbdTvLpKTaR +EPDLKvbdCTAbtFwS +EPDLKvbdZyEKNblS +EOcLKvbdsCFllHLZ +EObkKvbdjlbMZeHP +EPDKjvbdMpXpunGs +EObjjvbdaNLCSuNH +DoDLKvbdkCkjqHUg +EPCjjvbdTYKlNzjx +DnbjjvbdNxOuzdOU +DoCkKvbdegjvRmpg +DoCjjvbdhfjCyWKV +DncLKvbdjggMFfNk +EOcKjvbduVmwjRTA +DnbkKvbdDjHiuxKA +EOcLKvbddePRavcK +DnbkKvbdwkWcgzyf +DnbkKvbdHlBznXQk +EPCkKvbdatafxKsh +EPCjjvbdcJMjKfXY +DoDKjvbdrDdiQOWB +DoDLKvbdVvhwvEEg +EObjjvbdwjvdHzzG +DncLKvbduMYXAtAw +DoDLKvbdZQmFJNEq +EPCjjvbdyOTIXriD +DoCkKvbdbiNKLGWx +DncKjvbdHEKvKBij +EPDLKvbdYlSDtNkm +DoDKjvbdTqROuVIN +EPCkKvbddeOqbXCj +EOcLKvbdCTBCsewS +EPCjjvbdnUtykJrG +DnbjjvbdlZTSSyGt +EPCjjvbdjmBkyeGo +DnbkKvbdVhXuwfxz +DncLKvbdePFTLTsr +EOcKjvbdemGWgMik +EObkKvbdhuZeWquC +EPCjjvbdEvYpQNKF +EOcKjvbdpaJFAXHd +DoDKjvbdJSyBSmYM +EOcLKvbdSCDdlIxk +DncKjvbdSLZGVGkT +DnbkKvbdrbFlkgKy +EObjjvbdJSyAsMwl +EOcKjvbdEOcKkXDE +EPCjjvbdMoxQumfs +EPDKjvbdUQpnuUgm +DncKjvbdaaWFFoow +DnbkKvbdakMGPODA +EObkKvbdrEEhomua +EOcKjvbdmozZWLYb +EObjjvbdVgwuxGxz +EOcLKvbdCJLCKhej +EPDLKvbdVUNUGLvK +EOcLKvbdLGGHbBRV +DoCkKvbdlqxtysEJ +EOcLKvbdcScLTdKB +DncKjvbdhtydwRtb +DoCjjvbdcTCjscia +DncLKvbdUslsekuj +DoDKjvbdwuNFRYkn +EOcLKvbdijGHjNYS +DoCjjvbdJSyBSmYM +DoDKjvbdEYXlUTtM +EPDKjvbdUyITzKoO +DnbkKvbdvBDyTPFI +DoDKjvbdYlRcsmkm +DoDKjvbddePRbXCj +EPCkKvbdVZHtZjoO +EPDLKvbdWXIxVceH +EPCjjvbduDDUwVoP +DncKjvbdQlxBxnUz +DoDLKvbdfpBzvdYI +DoCjjvbdMJBlRYAS +EPCkKvbdZisHofaf +DnbkKvbdkWXNdCXw +EOcKjvbdEYXkstTl +EOcKjvbdfekymgHA +EPDKjvbdelfWflik +EPCjjvbddCTNSAUN +EPDKjvbdpfDeUVaI +DncLKvbdiBnbeWqR +EObjjvbdEuyPoljF +EPCkKvbdRDcBQRES +DncKjvbdhfibxujV +EObkKvbdVqnYBeMD +EPDKjvbdJKEAKQGd +EOcLKvbdsQVoJbuf +EOcKjvbdqcdhonVa +EObjjvbdJcKCqJcY +EOcKjvbdpfEEsuaI +EPDLKvbdxnTIYShc +EOcLKvbdxVMdqYlO +EObjjvbdZyDimcMS +DncKjvbdiGjCxvKV +DoCkKvbdRbEEkiYk +DoCjjvbdWIYVxHYz +EPDLKvbdYzcFqjVy +DncLKvbdTYLLmzjx +DoDLKvbdwXLaVaWV +DoDLKvbdMRvlyuQz +DoCjjvbdajkeoNcA +EPCjjvbdjEkHUoAO +DoCjjvbdZoNiFFZj +DncLKvbdlZTRryHU +DoCjjvbdcTDLTdJa +EOcLKvbdlhctRVSB +EObjjvbduaEYroFI +DncKjvbdzjUpQDsU +DoDLKvbdyqPNIiwA +DnbjjvbdhkdcnUby +EObjjvbdVYgtZjoO +DnbjjvbdCJLCLJFj +EPCjjvbdzeZnzdyp +DnbjjvbdqlyjZMIJ +EOcLKvbdGAnpyJzm +DoDLKvbdNGcQMpVL +DncKjvbdADSXiyiQ +DoCjjvbdLBLHNCYR +DoCkKvbduVnXjRTA +DncKjvbdtSqsZZeD +EPDKjvbdpyOhGqEY +EObjjvbdEuyPomKF +EPDKjvbdyOSgxTIc +EPDKjvbdGFiqnJTq +EOcKjvbdyYJJbPzL +DncLKvbdADRwjZiQ +DncLKvbdCSaDUFwS +DoDLKvbdEzsqEkbi +EOcLKvbdssSTYyeD +DnbkKvbdSBdEkiZL +EObjjvbdFWZQPlie +EObkKvbdbBVeFpPw +DoDLKvbdBdQBVjMf +EPDLKvbdptUHRqjt +EPCkKvbdQwODcMID +DoDLKvbdelevgMik +DnbjjvbdVTmUFkuj +DnbkKvbdLYqJrzuG +DoCkKvbdCTAbsevr +DoCjjvbdJpyeOfOF +EPCkKvbdOStWHEtp +EOcLKvbdKVtfEEfi +DoCkKvbdmuUykJqf +DnbjjvbdQZNAHSrK +DnbjjvbdMgDPlpUk +DnbkKvbdCIkBjhfK +EObjjvbdBsBCsewS +EOcLKvbdYzbfRivZ +EOcLKvbdrzMQSaHn +EOcKjvbdRosfjFcw +EPDKjvbdANHyTXZx +EPCkKvbdliDsptqa +EOcLKvbdACrXizIp +EPCjjvbdLFfICApu +DoCjjvbdbAvEepPw +EOcKjvbdTpqPVVHm +DoCjjvbdsBemMGjy +EPCkKvbduaEZTPEh +DoCkKvbdOStWHEtp +EPCjjvbdbBVeGQPw +EObjjvbdOSsufeUp +DoCkKvbdjAQHBPgK +EPCjjvbdbBWEfPow +EPDKjvbdtSqsZZdc +EPCkKvbdegjuqmpg +DoDLKvbdRotGifDw +DoDKjvbdmJEUQtrB +DoCjjvbdcIljKewY +EObkKvbdbiMjKewY +EObjjvbdcScKsdJa +EPDKjvbdtSqsYyeD +DnbkKvbdrpWOjCvG +EPDLKvbdBiKbLIej +EPCkKvbdBdPaWJmG +EObjjvbdZRNEhmEq +EOcLKvbdiUzFWrUb +EPCkKvbdmIdUQtrB +EPCkKvbdbUafxLTh +EOcKjvbdnCKWxOmu +DoCkKvbdsZkosBIO +DnbkKvbdHDjujCJj +DoCjjvbdWSOYCFLc +EPDKjvbdmJETqVSB +DnbjjvbdrXPkcJYq +EObkKvbdMgDPlpVL +DnbjjvbdZisHpGaf +DoCjjvbdGGJqmiTq +EObkKvbdIHGyyYXg +EObkKvbdqTsgRrKt +EObjjvbdmJDtRVSB +DnbjjvbdddoSBvbj +EPDKjvbddePSBvbj +DnbjjvbdBcpAvJlf +DncKjvbdezvYeItX +DoDKjvbdmgEwmNfy +EObjjvbdDigivXjA +EOcLKvbdmJEURUrB +EOcLKvbdePFTLTtS +EPDKjvbdVTmUGMVj +EPDKjvbdnBivwnnV +EPCjjvbdZnmhddzK +DncKjvbdZeXfzgiC +DoDLKvbdEuyPpNJe +DoDLKvbdqdEhpNua +DoDKjvbdFWYpQMie +DoCkKvbdMfcQMpVL +EOcKjvbdmttykKSG +DnbjjvbdlhcspuSB +EPCjjvbdWSNwbFMD +EPDKjvbdRbEElIyL +EOcKjvbdyNsHwsIc +EPCjjvbdrylQTAgn +DncLKvbdADSYJyiQ +EOcKjvbdZjTIPgBf +EObjjvbdKDKDQibx +EObkKvbdKDJcRJcY +DoCkKvbdmSZUzSdJ +EPCjjvbdaNKartlg +DoDKjvbdIGgZyXwg +EObjjvbdauCHXjsh +EObkKvbdxUmEpyLn +EPCjjvbdNsTugEtp +EPDLKvbdZyDimblS +DoDKjvbdbUagYKtI +DncKjvbdliETpuSB +EOcKjvbdDihKWXjA +DncKjvbdZtIiZETO +EObjjvbdygZMAMeX +DoDKjvbdfNGWgMik +DoCjjvbdZMSEUNkm +EOcKjvbdsrqsZZdc +EPCkKvbdACqxJzJQ +EPDLKvbdNdcshiKd +DoDKjvbdyqOmIiwA +EOcKjvbdRMwbYmtz +EOcKjvbdYpmEhleR +DoDKjvbdjJfHimYS +DoCjjvbdrbFmMHLZ +DoCkKvbdBcpBWKNG +DoDKjvbdIxTbHkqQ +DoDKjvbdhuZdwSUb +EPDLKvbdJYUBglQp +EPCkKvbduCcUwVno +DnbkKvbdwuNEpyMO +DncKjvbdssSSxzEc +DoDLKvbdGdLWJbKK +EObjjvbdFjdsDIMu +DncLKvbdfkGzbfAE +EOcLKvbdrRtkOLBN +EPDLKvbdajkfOmcA +EPCjjvbdrMzJxkhJ +DncLKvbdqZOhHREY +DoDKjvbdmJEUQuSB +DnbkKvbdRDbaQRES +EPCjjvbdpyPHgREY +DnbjjvbdMIalQxAS +DncLKvbdiZuGMROG +DoDKjvbdgFkymfgA +DncLKvbdsCGMkgLZ +EObkKvbdRotHJecw +EPDKjvbdkClKpftg +EPCkKvbdRjyGUgLT +EOcKjvbdhuZdvqtb +EOcLKvbdmttzKjSG +EObjjvbdhlEdOVDZ +DoDLKvbdZisHpGaf +DnbkKvbdTqQntuHm +EPDLKvbdNdctIiLE +EObkKvbdWRnXbFLc +EPDLKvbdKVtfDdgJ +EPCkKvbdJSyBTMwl +DnbkKvbduWNxKQsA +DoCkKvbdqGEFUVaI +EPDKjvbdhkdcnVDZ +EPCjjvbdySnIlrBg +EOcLKvbdYlRctNlN +EObkKvbdvBDxroFI +DoDLKvbdxwiJbPzL +EPCjjvbdyNsHxTJD +DoCjjvbdhfjDYujV +DoDLKvbdcImKLFwY +DnbjjvbdqwQMChxq +DncLKvbdaaWEfQPw +DnbkKvbdUQqOuUhN +EOcLKvbdUaCRSqSZ +DnbjjvbdRMxByOUz +EPDKjvbdKCjCpjCx +DncLKvbdrMzJyMIJ +EPCjjvbdOEdThhjd +EPDKjvbdrSUkOKaN +EObkKvbdMowpunGs +DoCjjvbdhzVGLpmf +EOcLKvbdaMkBsVMg +DoCjjvbdkIGkfFnL +DnbkKvbdYpldiNFR +EPDLKvbdZxcjNcMS +EPDKjvbdGGKRnJUR +EPCjjvbdbiNKKfWx +EObjjvbdmRyUyrci +DncKjvbdLrXNZtpz +DncKjvbdZjTIPgCG +DnbkKvbdypoNIiwA +EPCjjvbdDihKVxKA +DncKjvbdyfxlANFX +DoDKjvbdiMFEOVCy +EPCkKvbdtcDUvvPP +DoCkKvbdEvYpQMie +DnbjjvbdZLrDtOLm +EPCjjvbdKQzFPGNe +EPDKjvbdGdLVjCJj +DoDKjvbdqYoHfqDx +DoDLKvbdFVxoomJe +DnbkKvbdKRZePFnF +DoCjjvbdFVyQQMjF +DnbkKvbdTulQJsaR +EObkKvbdkHgMFenL +DoDKjvbdVUMselVj +EPDLKvbdrDdhonVa +DncKjvbdkVvmcaxX +DoDLKvbdrRuKnLAm +EOcKjvbdJbibpjDY +EPDKjvbdXrlAmToY +DnbkKvbdZirhQGbG +DnbjjvbdjgfkfFnL +EOcKjvbdGFjSOJTq +DoDKjvbdSCDeMJYk +DoCkKvbdpecdtWAh +EObjjvbdzeZnzdyp +DoCjjvbdMJBlQxAS +EPDKjvbdnBivwnmu +DoDKjvbdRadElIyL +DoDLKvbdsZlPsBHn +EObjjvbdznopeDLx +EOcLKvbdCJKbKiFj +DncLKvbdmgExNNfy +DnbkKvbdnPzYvKxb +DncKjvbdrDdiPnVa +DoCjjvbdAMgxrwZx +DncLKvbdTfzmkwWF +DncKjvbdqiAJdloF +EPCkKvbdwuMeRZLn +DoCjjvbdVUNUFkuj +DoDLKvbdKQyePGNe +DncKjvbdLqvlzVQz +DoDKjvbdmgFYNNgZ +DnbjjvbddxZtTrFz +EObkKvbdqTsgSSKt +DnbkKvbdZxcimcMS +DoCjjvbdANHySvyx +DoDLKvbdZQmFJMdq +DoCkKvbdHDjujBij +EPDLKvbdsPuoJbuf +EPCjjvbdYpmEhmFR +DncLKvbdZjTHpGaf +EPDKjvbdEuyQQNKF +DoCkKvbdmbKWxPNu +DoCkKvbdRjyFtfjs +DoCkKvbdiifHjNYS +EPDKjvbdpyOhGpdY +DoDKjvbdUVlPitBR +DoCjjvbdEKIJuwjA +EPCjjvbdFkFTDHmV +EOcLKvbdySnJNSCH +DncLKvbdRpUHJedX +EPDKjvbdtvOYJpsA +DoDKjvbdKDKDQjCx +DoDLKvbdaMkCTUmH +EOcKjvbdMpYRVnGs +EOcKjvbdtSqsYzFD +DncLKvbdKaKgNCXq +DoCkKvbdsCFllGkZ +EObkKvbdNrsvGeUp +DoDKjvbdmaivxOnV +EOcLKvbdOEctIhjd +DoCkKvbdemGXGljL +DoDLKvbdjvWmdBxX +EPCkKvbdCIjbLIej +EPCjjvbdkHfkfFmk +DoDLKvbdwzIGFwdr +EOcKjvbddBrlrAUN +EPCkKvbdJutecdgJ +DoCjjvbdWRmwaeLc +DnbkKvbdiVZdwRuC +DnbjjvbdGLEsDHmV +EPCkKvbdxsOJNSCH +EPCjjvbdIwtBgkqQ +DncKjvbdbrbjtDjB +EPCkKvbdjhGkeemk +DncKjvbdWWiXvDeH +EPCjjvbdnUtzKiqf +DncKjvbdTukoitAq +DncLKvbdCIkBjhfK +DoCkKvbdhgKDZWJu +EPDKjvbdBhkBjiFj +DnbjjvbdMfbpNPtk +DoDKjvbdnBjWxPOV +DoCjjvbdEJhKWYKA +EOcKjvbdTpqOtuHm +DoCjjvbdwzIFfXdr +EOcKjvbdrpVoKDVf +EOcLKvbdEYYLtTsl +DoCkKvbdLFfICBQu +EOcKjvbdeXzTsrFz +EOcLKvbdSQUHKFdX +EOcLKvbdraemMHLZ +EPDKjvbdkIGlFemk +DncKjvbdOYOuzcnU +DoCkKvbdIwtCILpp +DncLKvbdZoNiEdzK +DoDKjvbdsrqsZZeD +EPDLKvbdzGyMANEw +DncLKvbdBraCsewS +EObkKvbdpyOgfpcx +DnbjjvbdxmrgxTIc +EOcLKvbdZjSgpHCG +EPCjjvbdrWpMDIxq +DncKjvbdZtJIyESn +EPCjjvbdJSxaSmXl +DoCjjvbdiMFEOVCy +DoCjjvbdDwwlTstM +DncLKvbdJYUCHkpp +EPDLKvbdsrrSxzFD +EObjjvbdkHgMFfNk +EPDKjvbdOStVgFUp +DnbjjvbdjhHMGGOL +DnbjjvbdZyEJmcLr +EPDKjvbdDihKWYKA +DncLKvbdRosfiecw +DoCjjvbdyTNhmSCH +DnbkKvbdFeirNhsq +DoDKjvbdrDeIpNvB +EObkKvbdVAaqTRSZ +EPDLKvbdLAkGlbXq +EOcKjvbdVAaprqRy +EPDLKvbdfIKvRnQg +EPCjjvbdUQpoVUgm +EObjjvbdxVNEpyMO +EOcKjvbdsCFllGkZ +DncKjvbdsBelkgLZ +DoDLKvbdvlvANDeN +DoCjjvbdnBivwoNu +EObjjvbdsCGMkgLZ +EObjjvbdsPvPJbvG +EPDLKvbdxrnImRbH +EPDLKvbdNPxRVnHT +DoDLKvbdMtrqkNAX +DoDKjvbdiGicZWJu +EPDKjvbdOFEUJJLE +EPDLKvbdoAKzshDn +DoDKjvbdehKvRnQg +EObjjvbdLLBIWAKZ +EPDKjvbdeOdsLUUS +DncKjvbdjvWmdBxX +DncLKvbdezuyFJTw +EPCkKvbdNPwpumgT +EPCjjvbdkxsRrxgU +EPDLKvbdptUHSSLU +EPDKjvbdeATqNXif +EPCkKvbdjlakzEgP +EObjjvbdyXiKCPzL +DoCjjvbdhlFDmuDZ +DncKjvbdauCGxLUI +EObjjvbdySmiNSBg +EOcLKvbdfNGWfljL +DncLKvbdVviYWDdg +EPCkKvbdkIHLefOL +EPDLKvbdRNYCZNtz +DoDLKvbdmfdxNOGy +DoDLKvbdcScKtDjB +EOcLKvbdEPDLKvcE +EPCjjvbdUaBprqSZ +EObkKvbdddnqbXDK +EPCkKvbdaaVeGQQX +DoDLKvbduoTzqKnt +DnbjjvbdqwPkbhxq +EObkKvbduaEZTOdh +EOcLKvbdKfFhBaRV +EOcKjvbdVYgtZjoO +EOcLKvbdrSVKnKaN +DnbkKvbdsCFmMGjy +DnbkKvbdSLYeuGkT +DoCkKvbdwWlAvAuu +EPCjjvbdRXOEClID +EPCkKvbdCIkCKiFj +EOcKjvbdGckViajK +DoCkKvbdznpRFCkx +DnbjjvbdxKwDgzyf +DncKjvbdVAaprprZ +DoDKjvbdOEctIhjd +EObjjvbdmIdTptqa +DnbjjvbdvwMAuaWV +EObkKvbdEYXksssl +EPCkKvbdiZtelQnG +EOcKjvbdqdEhpOVa +DnbjjvbdidjfuPAO +DnbkKvbdnBivxPNu +EObkKvbdrSVKmkBN +DnbkKvbdiCPDFWqR +DncKjvbdZisHofaf +DoCjjvbdJvVFcdfi +DoDLKvbdcyxpYYpb +DoCjjvbdrykpTBHn +EPDLKvbdqrUkOKaN +DoCkKvbdGQATWgFy +DncKjvbduaDxsPFI +EPCkKvbdYkqdTnLm +EObjjvbdQYmAGsRj +DnbkKvbdZyEKOCkr +DnbkKvbdOEdThhjd +EPDKjvbdiCOcFWpq +EOcKjvbdMfcQNPtk +EPDLKvbdLGFhBaRV +EPDLKvbdssSSyZeD +EPCkKvbdTAFJIBoE +EObkKvbdeFPRavbj +DnbkKvbdjKFhKNYS +DncLKvbdCJLBjiGK +DncLKvbdqlzJyLhJ +EOcLKvbdRyigsCvA +DoDKjvbdYqMdhldq +DnbjjvbdehKvSOQg +EObjjvbdMgColouL +DoCkKvbdehKuqnRH +DoDKjvbdQvmdCkhD +DoDKjvbdMSWlzVQz +EObkKvbdbhlikGXY +DoCjjvbdeAUQmYJf +EPCjjvbdZyEJmcMS +DoDKjvbdIGfzYxYH +DoDLKvbdHDjvJbJj +EOcKjvbdQwNdCkgc +EPCkKvbdRWnDcMHc +DnbjjvbdrMzJyMIJ +DncKjvbdlhctQuSB +DoDKjvbdbPgGdLzd +EObkKvbdijFhJmXr +DoCjjvbdbQGgDkzd +EPDLKvbdDihJvXjA +EObjjvbdaNKasUmH +DncKjvbdZyEKOClS +DnbjjvbdSLYfVHLT +DoDLKvbdwzHfFweS +EPCjjvbdfNFwHNJk +DoDLKvbdelewHNJk +EPCjjvbduaDxroEh +DoDKjvbddwytURez +DncKjvbdwtmEpyLn +EOcLKvbdCIkBkIej +EOcLKvbdiLddOUcZ +EPDKjvbdiUydwSVC +DncKjvbdrEEiQOVa +DnbkKvbdYzbeqivZ +DoCjjvbdkVwOECYX +DoDLKvbdZLqcsmkm +EObjjvbdVYgtZkPO +EOcLKvbdHffyxwwg +EPDKjvbdcIljLGWx +DnbkKvbdMpXpvNfs +EOcLKvbdFeirOJTq +DncLKvbdWWhxWEFH +DoCjjvbdZRMdhmEq +DnbkKvbdULvPBWPJ +EPDLKvbdZRMdiMdq +DnbjjvbdTYLMNzkY +DoCkKvbdZxcjNblS +DoCkKvbdKCibpicY +EPDLKvbddoFTKtUS +DncLKvbdcImKLGXY +EOcKjvbdKaLGmBwq +EPCkKvbdnHFYMnGy +EPDKjvbdUQqPUuIN +EPDKjvbdeAURNYJf +DoCkKvbdxwiKCQZk +DnbkKvbdKVuGDeGi +EPDKjvbdrovOicVf +DoDLKvbdrylQSaHn +EOcLKvbdySmhlrBg +EOcLKvbdNrsufeVQ +EOcKjvbdzoQREblY +EPCkKvbdzaAOgHCM +DoCjjvbdZLqdTmkm +EObkKvbdNGbpNQUk +EOcKjvbdZshiYdSn +EPDLKvbdDncLKvbd +EOcKjvbdqlzJyMHi +DoCkKvbdBhkCKiFj +EOcLKvbdRaceLhyL +EPDLKvbdxsNiNRbH +DoDKjvbdtcCtwWOo +DnbjjvbdmfdwlnGy +DncKjvbdREDBQQdS +DncLKvbdnPzYvKxb +EPCjjvbdjgfkefNk +DnbkKvbdnUtykJrG +EPDKjvbdSCEFLiYk +EOcLKvbdGcjuiajK +EPCjjvbdJYUCHlRQ +EPDLKvbdYpleIldq +EObkKvbdfMfWflik +DncLKvbdwuMdpyLn +DoDLKvbdEPDLLWcE +DoDLKvbdZLrDtOLm +DoCkKvbddZxoxYqC +DncLKvbdTulQKUAq +DncKjvbdqrUjnKaN +DoCkKvbdGFjRmiTq +EPCjjvbdpssfrRkU +EPDKjvbdrXQLbiYq +DoCkKvbdNQYQunHT +DoCkKvbdNrtWHEuQ +DncLKvbdjgflGGNk +DncKjvbdBsBCsewS +DoCkKvbdMpYRVmfs +DnbkKvbdKfFhBaQu +EObkKvbdGcjuiaij +EObkKvbdakMGOnDA +DnbkKvbdFyUuAcxC +DnbkKvbdtSrTZZdc +EPCjjvbdatafxLTh +EPCkKvbdUGzmlXVe +EObkKvbdZyDinClS +DncKjvbdyzdnSIJI +DnbkKvbdnPyxukZC +DoDKjvbdkDMLQgVH +EObjjvbdbVBfwjtI +EPDLKvbdzRPMhiwA +EObkKvbdhkeDmuCy +DnbkKvbdZQleImEq +EObjjvbdrDeJPnVa +EPDLKvbdaNLBsVMg +DnbkKvbdOEctIhjd +EOcKjvbdatagXkUI +DncKjvbdMowpunGs +EObkKvbdtvNwiqTA +DnbjjvbdyzdnSHiI +EObkKvbdbhlikFvx +EOcKjvbdaNKaruNH +DnbkKvbdiVZdvqtb +EObkKvbdVYgszKoO +DoCkKvbdjJfIKMwr +DncLKvbdezvZFJTw +EObkKvbdcyxoxYqC +EPDLKvbdFejSNiTq +DncKjvbdIwsbIMQp +DnbjjvbdTukpJsaR +EPDLKvbdIsZArlxM +EPDKjvbdTAEhgand +EOcLKvbdfNGXHMik +DoDKjvbdjcMLQgUg +DncKjvbdSLYfVHKs +DoCjjvbdnBjWwoOV +EPCjjvbdnBjWwnnV +EObkKvbdQvmccLgc +EPDKjvbdwuMeRYlO +DoDKjvbdNddUJIjd +DoCkKvbdqUTgSRkU +DoDLKvbdehLVqmpg +DoDLKvbdrovOjCvG +EObjjvbdzoPpdcMY +EPDLKvbdZRNFIleR +DnbkKvbdSLZGVGjs +DoCkKvbdySmiMrBg +DnbkKvbdwyhFfXeS +DoDLKvbdWHwvYHYz +DoCjjvbdIHHZyYYH +EObjjvbdJSyArmXl +DncKjvbdACqxJyiQ +DncLKvbdmpZxujyC +DoCjjvbdFkFScINV +EPDLKvbdCDpAujNG +DnbkKvbdhkeDnUby +DncLKvbdFWYopNJe +DoCjjvbdLAjfmCYR +EPCjjvbdxrmiMrCH +EObjjvbdcImJkGWx +DoCjjvbdFejRnJTq +EObkKvbdYTMAlsnx +EPCjjvbdsPvOibuf +EObjjvbdNeDshhjd +EOcLKvbdBiKbLIej +EObkKvbdauCGxLTh +EPDKjvbdbBWEepQX +EPCkKvbdVrNxBdlD +EObjjvbdMIalRYAS +EOcKjvbdJcKCpjCx +EOcLKvbdLqwNZtpz +DoCkKvbdZisHogBf +DnbjjvbdEPDKjvbd +DoDLKvbdFWZQQNJe +EObkKvbdHgGzYwxH +EOcKjvbdjbkkQfuH +DnbjjvbdtkxXAtBX +EPDLKvbdLAkHNCXq +EOcLKvbdWWhxVdFH +DncLKvbdCWzdIeQW +DoDLKvbdVvhwvDdg +EObjjvbdpfDeUWAh +EOcLKvbdqmZixkhJ +DncKjvbdyzdmrIJI +DncLKvbdRpTgJecw +DoDLKvbdGFjSOIsq +EOcKjvbdwuNFQyLn +DnbjjvbdIsZAsMwl +DncKjvbdptTgRqkU +DncKjvbdZQmEiNEq +DnbkKvbdauCHYLTh +EPDLKvbdyzdmrHhh +EPCjjvbdZoOJFEyj +EOcLKvbdUQqOttgm +DoCjjvbdRNYCZNtz +EPDKjvbdrRtkOLBN +DncLKvbdmajWxOmu +EPDLKvbdLBLHMbXq +DoDLKvbdCIjajhfK +EObjjvbdYkrDtOMN +EOcLKvbdUtNUGMVj +EObjjvbdaSFcHsek +DnbkKvbdXrkaMtPY +DoCkKvbdZQmFImFR +EOcLKvbdcJMijewY +EPDLKvbdGLErbhNV +DnbkKvbdiUydwSVC +EPDLKvbddndsKssr +DoDLKvbdxwhjCPzL +DoCkKvbdxVMeQxkn +DncKjvbdiBoCdwRR +EPDLKvbdnPyyVkZC +EPCjjvbdmuUzLKRf +DoDLKvbdSQUGiecw +DoDKjvbdRbDdlJZL +DncKjvbdqrVKnLAm +DoDKjvbdVBCQsQrZ +DoDKjvbdmbKWxPNu +EObjjvbdFVyQPmKF +DnbjjvbdiiehJlxS +EOcKjvbdIrxaSmYM +EOcKjvbdsZkosAgn +EOcLKvbdnCKWxPOV +EPDLKvbdKWUecdfi +DncLKvbdhgKDZWKV +EPDLKvbdySnImSCH +EObkKvbdJKEAKQGd +EOcLKvbdZMSETmkm +DoCjjvbdhgJcYujV +EOcLKvbdehLVqmpg +DoCkKvbdezuyFItX +DncLKvbdvBDxsOeI +EObkKvbdTulPisaR +DnbkKvbdajkfPODA +DoDKjvbdYkrEUOLm +EPCkKvbdfIKvSNpg +EPCkKvbdiBncEwQq +EOcKjvbdKWUecdgJ +EObkKvbdYlRcsmkm +EPCjjvbddwzUTqez +DnbjjvbdeYZstRez +EPDLKvbdxVNEqZLn +DncLKvbdFjeScINV +EObjjvbdxUleQxkn +DncKjvbdKWUfDdfi +DoDLKvbdssRrxzEc +EObjjvbdRpUGiedX +EOcLKvbdZQleJMdq +DnbkKvbdqdFIpNua +EPCjjvbdYzberKWZ +DoDKjvbdxxIjBoyk +EOcLKvbdEObkKwDE +DoDLKvbdqquLNjaN +DncKjvbdwuNFRZLn +DoCjjvbdqUTgRrKt +EObkKvbdVwIwvDeH +DnbkKvbdVwJYWEEg +DnbjjvbdYlSETnMN +DnbkKvbdqTsgRqjt +DoDKjvbdiGicZVjV +DnbjjvbdxnTHxTJD +EObkKvbdqUTfrSKt +DoCkKvbdFyVVBEXb +EOcKjvbdqGDdsvAh +EPCkKvbdTkunaVni +EObkKvbdMRvlzVQz +EPDKjvbdDncKkWbd +EObjjvbdqqtkNkBN +DncLKvbdfHkWRnRH +DnbjjvbdiLdcnUby +EOcKjvbdVYgsyjnn +EPCjjvbdUtNTfMWK +EPDKjvbdqYoHgREY +DncKjvbdGZUuAdYC +DnbjjvbdDnbjjwDE +EOcKjvbdTqQntthN +EOcLKvbdUyITzLPO +EOcLKvbdjblLRHVH +DoCkKvbdLGFhCBQu +DncLKvbdliEUQuSB +EObkKvbdRacdkiZL +EOcLKvbdaSFcHtFk +DoDKjvbdJYTahLpp +EPDLKvbdUQqOuVIN +EPCjjvbdqmZjYkhJ +DoCkKvbdRjyGUgKs +EObjjvbdyNrhYSiD +EPCkKvbdBhkCKiFj +EObjjvbdYlSDtOLm +DoCjjvbdTAFIhBoE +DncKjvbdNdctJIjd +DoDLKvbdGdKvJaij +EObjjvbdJpydnfNe +EPDLKvbdCDpAvKNG +DoDLKvbdeEoRavbj +DoCkKvbddoFSjssr +EPCjjvbdqYoHfqEY +EPCkKvbdFkFScHmV +EObjjvbdcyyQYZRC +DoDKjvbdyzdmrHhh +DoDKjvbdUWLojUAq +EObkKvbdiCPCdwRR +DoCkKvbdCTBDTevr +EOcKjvbdLAkGlbXq +EPDKjvbdcyyQXyRC +EPDLKvbdyNsHxSiD +EPDKjvbdqUTgRrKt +DoDKjvbdJuuFdEfi +DoDLKvbdEXwktTtM +EObkKvbdeJirVtzn +EObjjvbdYTMBMsnx +DnbkKvbdNQXpumfs +EPDLKvbdzitopDrt +DncLKvbdDxXlUUUM +EOcKjvbdADSXiyhp +DoCjjvbdqTsgSSKt +DoCkKvbdZtIhxdTO +EOcKjvbdUyHtZjnn +EPDLKvbdcSbkTdKB +DncLKvbdxZgfGYEr +DncKjvbdeATplxJf +DoDLKvbdnCJwXnmu +DnbkKvbdbKlFnnDA +DoCkKvbdrDeIpNua +EPCjjvbdmttzKirG +DoDKjvbdbrbkUDjB +DnbkKvbddZxoxZRC +EObkKvbdhgKDZWKV +DnbjjvbdGFiqmhtR +EPDKjvbdULvOaWPJ +EOcLKvbdygYlANFX +DnbjjvbdIHGzZYYH +EOcKjvbdhkeENuCy +EOcLKvbdNddTiJLE +EObjjvbdGFiqnJUR +EOcLKvbdjvWnEBxX +EPCjjvbdVBCRTRSZ +DncKjvbdVBCRTRSZ +EObkKvbdBdQAvJlf +EObkKvbdJYUCHkpp +EOcKjvbdGckVjCJj +EObkKvbdBsAcUGWr +DoDLKvbdIxUBhMQp +DoDKjvbdMgDQNPtk +EOcLKvbdHEKujCKK +DoCjjvbdLhalQxAS +EObkKvbdULuoBVoJ +EPDKjvbdhfjDZVjV +DoCkKvbdKDJbqJbx +DoCkKvbdbKlGPNcA +DncKjvbdrpVnicWG +EPDKjvbdvAdZSneI +DnbkKvbdFyVUaEYC +EOcKjvbdHDjuibJj +DnbjjvbdbiMjLFvx +EPCjjvbdUsltGLvK +DoCjjvbdkNBkzEgP +DncLKvbdFxtuBEYC +EOcKjvbdnBjWxPNu +DnbkKvbdqUTfrRjt +EPCjjvbdZHXEAPSi +DoCjjvbdxxJJapZk +DncKjvbdZyDimcLr +DnbjjvbdiBnbeWpq +EObjjvbdjbkkQftg +EObjjvbdqvokbhyR +EOcLKvbdeYZtTrFz +EPCkKvbdLqvmZtpz +DoDKjvbdNeDsiIjd +EPCkKvbdeXystRez +EOcKjvbdAMhZSvzY +EPCjjvbdSwkMNzkY +DoDKjvbdtlYXAtBX +EPCjjvbdBvzdIdov +DoDLKvbdVBBqSqRy +EOcLKvbdTvMQKUAq +EOcLKvbdxVMeQyMO +EPDLKvbdBsAbtGWr +DoCkKvbdKefHaaRV +DncLKvbdCTBDTewS +EPCjjvbdTIyjRAAl +DoDKjvbdkxsSSxft +EObjjvbdjvXOECXw +EPDKjvbdVTlsfLvK +EOcKjvbdjJfHjNXr +EObjjvbdfMfWflik +DnbkKvbdYqNFImEq +DoDLKvbdcJMikFvx +DoCkKvbdrXPlDIyR +EObjjvbdeOdsLTtS +DncLKvbdJSyArmXl +EObjjvbdkNBlZeHP +EObkKvbdfHkVqnRH +DncLKvbdKCjCqKDY +DoDLKvbdUyHsykOn +DncKjvbdWWiYWEEg +EPCkKvbdKWVFdEfi +EObkKvbdFpATWgFy +EOcKjvbdrzLpTAgn +EPCjjvbdhuZeWrVC +EPCkKvbdraellGjy +DncLKvbdGKeTCgmV +DoDLKvbdCEQAvJlf +DoDLKvbdJvUfEFGi +EOcKjvbdHDkVjCJj +EPCjjvbdZxdJnClS +DoCjjvbdcImJjewY +DoDLKvbdkDMLRHUg +DoDLKvbdqZOggREY +DoCkKvbdkMakyeHP +DoCkKvbdEvYpPmJe +DncLKvbdJJdAJpHE +DoDKjvbdEPCjkXCd +DnbjjvbdlAmOmALA +DoDLKvbdsBfNLgLZ +DncLKvbdKyQjSzuG +EPDLKvbdeAURMxJf +EPCjjvbdkHflGGOL +EOcKjvbdEuxpPlie +DncKjvbdcyyPxYqC +DoCkKvbdRDbaPqES +DncLKvbdaaVeFpQX +EOcLKvbdMuTSLNAX +EPCkKvbdbiMjKfWx +EOcKjvbdSCEEkiZL +DncKjvbdbhmJkGWx +DncKjvbdWXJYVcdg +EOcLKvbdvBDxrndh +DoCkKvbdCEQBVjNG +EPDLKvbdxUmFQyMO +DnbkKvbdznpRFCkx +DoCjjvbdKDJbpjDY +EOcLKvbdREDBQRDr +DoDLKvbdZtIhyETO +EObjjvbdKfGHbBQu +DnbjjvbdnUtzKirG +EPDLKvbdyNsHwsIc +DoCjjvbdIrxaSlxM +DoCkKvbdRjyFuHLT +EPCkKvbdJvUfDdgJ +DnbkKvbdgQBzvcwh +DnbkKvbdpyOgfqEY +DnbkKvbdmRxuZsEJ +EObkKvbdmRyUysDi +DnbjjvbdrzMPraIO +EPDLKvbdDxXksssl +EPDLKvbdqUUGrSKt +EPCjjvbdZisIPfbG +EPDLKvbdiGicZVjV +DnbjjvbdqcdiPnVa +DoDLKvbdGKdsCglu +EPCkKvbdYSlBNUOx +DoCkKvbdjmBkyeHP +EObjjvbdKDJcRKDY +EPDKjvbdiLdcmuCy +DoCjjvbdbAvEfQQX +EPDKjvbdegjvRmqH +EOcLKvbdrounibvG +DoCkKvbdliEUQtrB +DoCkKvbdrXPlChyR +DnbkKvbdcyxoxZRC +DoCkKvbdWIYWYHYz +DnbkKvbdmJETptrB +EObjjvbdbBVeGPpX +DoCkKvbdypnliKXA +EOcLKvbdatagXkTh +EPDKjvbdrounjDWG +EPDKjvbdUyHsyjnn +EPDKjvbddZxoxZRC +DnbjjvbdKCjCpjDY +DoCjjvbdKkBHvAJy +DnbjjvbdjbkkRGuH +DoCjjvbdrafNMGjy +DncKjvbdxnTHwsJD +DncKjvbdemFvfmJk +DnbjjvbdIwsbILqQ +EObjjvbdUMWPAvOi +EOcLKvbdGKdsChMu +DoCjjvbdWXIxWEEg +DoCjjvbdvPTzqKnt +DoDKjvbdILazmwRL +EPCkKvbdjlakzFHP +EPDLKvbdKDJbqKCx +EOcLKvbdHELWKBjK +DoCkKvbdOFDshhkE +EPDKjvbdBhkCKhej +DoDKjvbdNddTiJKd +EPCkKvbdVqmwadkc +EPCkKvbdFfKSOItR +EPCjjvbdZshiYcrn +DncLKvbdvAcxsOeI +EObkKvbdKVtfEFHJ +DncLKvbdXsMBNUPY +DoDLKvbdCTAbtGXS +DoDKjvbdRyjHsDWA +DoCjjvbdJcKDRJcY +EOcKjvbdEuxpPljF +DncLKvbduWNxKQsA +EOcLKvbdhuZeXSUb +EObjjvbdjvWnDaxX +EObjjvbdwWlAvAuu +EObkKvbdqquKnLBN +DoDLKvbddCSmSATm +DoCjjvbdwtmEpxlO +DnbjjvbdDoCkLWcE +DncLKvbdwyhGFxEr +EOcKjvbdrykosAgn +DnbjjvbdNeEUJJLE +DoDKjvbdjuwNdCYX +EPDKjvbdiGibyVjV +DnbjjvbdYqNEhmEq +EPDLKvbdxVNEpyLn +DoCjjvbdZeYGzgiC +DoCjjvbdZjTIQGbG +DnbkKvbdSPsfjGEX +EObjjvbdBsBDUGXS +DoCkKvbdsBfNMGkZ +EOcLKvbdLBLGmCXq +EPDKjvbdJTZBTNYM +DnbjjvbdJTZBSmYM +DoDLKvbdjKFgjNYS +DoDKjvbdqlzKYkhJ +EPCkKvbdkWXOECYX +EObkKvbdFkEsDINV +EObjjvbddndsKstS +DoCjjvbdauBfwjsh +DnbjjvbdFjeTCglu +EOcLKvbdfMfWflik +EObjjvbdlYsRryGt +EPCjjvbdtbcVWuoP +DnbjjvbdMgDPmQVL +DoDLKvbdjhHLefNk +EOcLKvbdUsmTfMWK +DoCkKvbdptTfqqjt +EObkKvbdrRuKmjaN +EPCjjvbdzoQQdcMY +DoDKjvbdrpVoKDVf +DoCkKvbdlZSrTYft +DoCjjvbdBhjajiFj +EOcLKvbdzoQQdbkx +EObkKvbdOhAYZAYa +EOcKjvbdjvXNdBww +DnbjjvbdEXwlTtTl +DoCkKvbdzjVPocsU +DoDLKvbdZQldiMeR +DncKjvbdYNqAYVVt +DnbjjvbdtvNxKRTA +EPCjjvbdqceIonWB +EOcKjvbdyXiKCPzL +DoCkKvbdfIKurNpg +DoDKjvbdFxuVAdYC +EOcLKvbdeOdrjssr +DncLKvbdxnShYTIc +EPDLKvbdoznEKwoA +DoDLKvbdptTfrRkU +DncLKvbdkWWnDaxX +EPCjjvbdKWVGDeHJ +EPCjjvbdtumwipsA +DoCkKvbdZxcinDMS +EObjjvbdCWzdIeQW +EPDKjvbdHgGzYwwg +EOcKjvbduDCtvvOo +DnbjjvbdqvokbiZR +DnbjjvbdmIcsptqa +DncLKvbdrJAJdmPF +EPCkKvbdKjaHvAJy +DoCkKvbdhuZdwSUb +EOcKjvbdnPzZVjyC +DoDKjvbdYSlAmUPY +EOcKjvbdffLzNgHA +DncLKvbdptUHRqjt +EPCjjvbdyTNiMqag +DoCjjvbdauBgXkTh +EPCjjvbdbiMikGXY +EOcLKvbdIHGzZXwg +DncKjvbdrXPkcIxq +DnbjjvbdOTTugEuQ +DnbkKvbdjcMKqHUg +DoDKjvbdffMZnHHA +DoCjjvbddijSWUzn +DncKjvbdBhkCKiGK +DncKjvbdJYTbHkqQ +DnbkKvbdqwPlCiZR +DoCkKvbdxUmFRYkn +DoDKjvbdmSZUzTDi +EPDLKvbdkyTSSxft +DoCjjvbdmajXYPOV +EPCkKvbdMowqVnHT +DncLKvbdTppoUuHm +EPDLKvbdgFkymfgA +EObjjvbdhgJcYujV +DncKjvbdtAGqIABS +DoDLKvbdqZOhGpdY +EObkKvbdjbkkRGuH +DoCjjvbdGLEsChNV +DnbjjvbdZoOIeEyj +DncLKvbdbrbjsdJa +EPCjjvbdGGJqmiTq +EPCkKvbdNPxRWNgT +EPCjjvbdJpydnfOF +EOcKjvbdcyxoxYpb +EPDKjvbdmozZWLYb +EObjjvbdVTmUFlVj +DoCjjvbdNrtWGduQ +DncKjvbdqUTfqqkU +DoDKjvbdTfznMWue +EOcLKvbdNsTugEuQ +DoDLKvbdjhHLfGOL +EObjjvbdZtJJYdSn +DoDKjvbdZjTHofbG +DncKjvbduCbtwVno +EPCkKvbdZtIhxcsO +EOcLKvbdnUuZkJqf +EObkKvbdiCPCeXQq +EOcKjvbdZtJIxcsO +EOcLKvbdZRNEhmFR +DnbkKvbdFjdsDINV +DncKjvbdsZlQSaIO +EObjjvbduLxXAtAw +DncKjvbddoFSjtTr +DoCkKvbdmbKXXoOV +DoDKjvbdOAIsTirA +DncLKvbdMfcQMpVL +EPDKjvbdsrqrxzFD +EOcLKvbdZRMdiMdq +EObkKvbdCTAbsfXS +EPDLKvbdtunYJpsA +EObkKvbdYSkaNToY +DoCkKvbdZMRdUOMN +EPCkKvbdIsYaSmYM +DncLKvbdVYgtZkPO +EObjjvbdaNLBsUmH +EOcLKvbdZyEKOCkr +DoDLKvbdOSsufdtp +DoDKjvbdhbPCdvqR +DnbkKvbdiZuFkpnG +DoDKjvbdHDjujCJj +EPDKjvbdCDpBVjMf +EObkKvbdeFOrBwDK +DoDLKvbdhgJbxvJu +EObjjvbdiZuFlQmf +EPDKjvbdeuzwpJzs +EPDKjvbdezuyEhsw +EPCkKvbdJYTbIMQp +DnbkKvbdkIHLeenL +DoCkKvbdAMgyTXZx +DnbkKvbdfIKvRnQg +EPDLKvbdJqZePFnF +DoCjjvbdRjxfVGkT +EOcLKvbdySmhlqbH +DnbjjvbdEYYMUTtM +DoDLKvbdhtydvquC +EObjjvbdZRMdiMdq +EPCjjvbdVZITzLOn +DoCkKvbdmuVZjjRf +DoCjjvbdzoQREbkx +DnbkKvbdkyTSSxgU +DoCjjvbdzRPNIjXA +EPDKjvbdnPyxvLZC +EOcKjvbdSZjHrbvA +EPCkKvbdShyjRABM +EObjjvbdYpmEiMeR +DoCjjvbdFaOqYizm +DncLKvbdEvZQQMjF +DncKjvbdNrtWGeVQ +DoDKjvbdqdFJPmvB +DnbjjvbdRXODblID +DoDLKvbdyzdnRhIh +EPCkKvbdcTCjsdKB +DncLKvbdJcKCqKCx +EObjjvbdmfdwmNgZ +EPDLKvbdqUTgSSLU +EObjjvbdZyEKODLr +EPDKjvbdTppoVVIN +DnbjjvbdFVyPpNJe +EPDKjvbdJYUBhLqQ +EPDLKvbdqceIpOWB +EPDLKvbdiBnbeXQq +DnbkKvbdGZVVBEYC +DncKjvbdGLFTDINV +EObjjvbdUGzmlXWF +EOcLKvbdxrmiMqbH +DoDLKvbdJpzEnenF +EObjjvbdEvYoomJe +DoDKjvbdJqZdoFme +EObjjvbdEuyPpMie +EOcKjvbdmtuZjjRf +EPDKjvbdjKGHilwr +EPCkKvbdpaIeAWgd +DoDKjvbdGZVUaDxC +DoCjjvbdFkErcHlu +EOcKjvbdrbFllGjy +DnbkKvbdMRwMzUpz +DoCkKvbdDxYLtTsl +EOcLKvbdLBKfmBxR +DoCjjvbdVwJYWDeH +DoCkKvbdZoOIdeZj +EPDLKvbdpfEFUWAh +EOcLKvbdKWVGDdfi +EObkKvbdtvNwipsA +DoCjjvbdwuNEqZMO +EObkKvbdfSBWzkbo +EPDLKvbdFxuVAdXb +DnbkKvbdRWnEClHc +EOcKjvbdkCkjqHUg +DoCjjvbdbsDKscia +EPDLKvbdzQoMiKXA +DnbkKvbdRDcApQcr +DoDKjvbdZtIiYcrn +DoDLKvbdqZPHgQdY +EObjjvbdyfxlAMeX +EObjjvbddjJrWUzn +EPDKjvbdjcMLQgVH +EOcLKvbdozmckXoA +EPDKjvbdcJMjLGWx +EPCkKvbdbhlijewY +EObjjvbdrEFJPnWB +EOcKjvbdmuVZjirG +DncKjvbdnBjXYOmu +DncLKvbdjcLjqHUg +EPDLKvbdlhdUQuRa +DoDKjvbdVwIwvEFH +EObkKvbdZMSDsnLm +DoDLKvbdzHZMAMdw +EOcKjvbdZMSDsnLm +DncKjvbdZshhyDsO +DncKjvbdCEPaWJlf +EOcKjvbdxxJKCQZk +EPCkKvbdezvZEiTw +EPDLKvbdypoMiKXA +EPCkKvbdnUuZjjRf +DnbkKvbdFfJqnJUR +DoCjjvbdTpqPUthN +DncKjvbdcyxoxYpb +EObkKvbdCSaCsfXS +DnbkKvbdRacdlIyL +DoCjjvbdTIzKRABM +EPCkKvbdatbGwjsh +EObjjvbdUsltGMWK +DoDLKvbdtvOXjQsA +DnbjjvbdYSlAmUPY +EOcKjvbdwuNEpxkn +EObkKvbdYqMdiMdq +EOcKjvbdnGeXlmgZ +DnbkKvbdqwQLcJYq +EObkKvbduVmxJqTA +EObjjvbdmoyyVkYb +DoDKjvbdBdPaWKMf +DncKjvbdVvhwvEFH +EObkKvbdauBfxLUI +EOcLKvbdMgDQNQUk +EOcKjvbdsQVnjCuf +EObkKvbdjuvnEBww +DoCkKvbdkWXODbXw +EPCkKvbdZyDjNblS +DoDKjvbdZLqdUNlN +DoDKjvbdbLMFoNcA +DoCkKvbdFVyQPmJe +EOcKjvbdhkdcmuCy +EPCkKvbdmtuZjiqf +DnbjjvbdRbEFLiYk +EPCkKvbdySnJMqag +EPDLKvbdhlFDnVCy +DoCjjvbdzoQREblY +EPCjjvbdvBEYroFI +EPCjjvbdJbjCqJcY +DnbkKvbdliEURUrB +DoDKjvbdOTUWGdtp +EOcLKvbdZnmhddzK +EPDKjvbdSBcdkiZL +DoCjjvbdZMRctOLm +DoDLKvbduCcUwVno +DoDLKvbdEzspeMDJ +EPCjjvbdULunaWOi +DoDLKvbdIwsaglQp +EObkKvbdJuuFdFGi +EPCkKvbdQccBQRDr +EPDKjvbdNrsugEtp +EPDLKvbdEXxLtUUM +DoDKjvbdVBCQsRRy +DncKjvbdeFPSCWcK +DoDLKvbdhficYvJu +DncKjvbdkClLRHVH +EOcLKvbduWNxKRTA +EObjjvbdNPwpumgT +DoCjjvbdjmCLzFGo +DncKjvbdZtIhxdSn +EObkKvbdKQyePFme +EPCjjvbdEuxpPljF +DoCkKvbdZtIhyDrn +EPDLKvbdJpzFOfNe +EPDKjvbduaEZTPFI +EPDLKvbdSQTgKFcw +EOcLKvbdBcpAujMf +EPCjjvbdfHkVrOQg +EPCjjvbdKaKflaxR +EObkKvbdZjTIQGaf +EOcLKvbdijGIKMwr +EPDLKvbdvBEZTOdh +DnbkKvbdZRNEhleR +DnbkKvbdijFgimXr +EObjjvbdEASIlywX +DoCjjvbdKaKgNCXq +EPDLKvbdTppoUuHm +EPCkKvbdwzHefYEr +EPCkKvbdhtyeWrUb +DnbkKvbdPyNAGsRj +EPDKjvbdmttzKiqf +DnbjjvbdRacdkhyL +EOcLKvbdeJjRvUzn +EObjjvbdNHCpNQVL +EPCjjvbdgLGzcGAE +DoCkKvbdidkGtoAO +DnbkKvbdKDJcRKCx +DnbjjvbdSQTgKGEX +EPDLKvbdyqPMiJwA +DnbkKvbdLrWlytpz +DnbjjvbdmgExNNgZ +EPCkKvbdlYsRrxgU +DnbjjvbdTkuoAvPJ +EOcKjvbdgFkymgHA +EPDLKvbdmaivxOnV +DnbjjvbdEztQeMDJ +EObjjvbdWfYzUAPT +DnbkKvbdiMEdNuDZ +DoDKjvbdgQBzwEXh +EOcLKvbdSBcdlIyL +DnbjjvbdrMzJxkhJ +DnbjjvbdddnrCXDK +DncLKvbdmbKXXnnV +DnbjjvbdYzbfSKWZ +EPCjjvbdUMWPBVoJ +EPDKjvbdBraDUGWr +DoCkKvbdFkFTDINV +DncKjvbdYkqdTmkm +DncKjvbdmpZyVjyC +DoCjjvbdZisIQHCG +DncLKvbdYqMeJMeR +EPDKjvbdZjTHpHBf +EOcLKvbdcJMikFwY +DoCkKvbdFpATXHGZ +DnbjjvbdVBBqSpqy +DoCkKvbddZyQXxpb +EOcLKvbdqlyiyMHi +EPDLKvbdfMfWgNJk +DoCjjvbdrNZjZLgi +EPCkKvbdeOdsKtTr +EPDKjvbdLrXMytpz +DncLKvbdQvnDcMHc +DoDLKvbdyYJJbPyk +DnbjjvbdrylPsBIO +DnbkKvbdTqROuUgm +DoCjjvbdcyyQYZRC +EObjjvbdbLMFnmcA +EObjjvbdbVCGxKsh +EObjjvbdelfWgMjL +EPDLKvbdnGdwmOGy +EPCkKvbdcTDLTdKB +DncLKvbdUxhTyjoO +EPCjjvbdwzHfFxEr +EPCjjvbdkxrqryHU +DncLKvbdDihJvYKA +EPCkKvbdRzJhScWA +EObjjvbdZHWdAOri +DoDLKvbdjbkkRGuH +DncKjvbdNVSrLNAX +DncKjvbdVqnYCElD +DnbjjvbdFWZPpMjF +DoCjjvbdZMRctNkm +EPCjjvbdRNXaxmtz +EOcLKvbdLZQjSztf +EObjjvbdePFSjssr +EOcKjvbdjbkkRHUg +EPDKjvbdcSbjtEJa +EObkKvbdKQzFPFme +DoCkKvbdnUtzKjRf +DncLKvbdeOeTKtUS +DoCjjvbdpstGqqjt +EOcKjvbdrpWPJcWG +EPCkKvbdwkXDgzyf +DncKjvbdnPyxvLYb +DoCkKvbdpxoIHRDx +DnbjjvbdLFegaaRV +EPCjjvbdrXQLcJYq +DncKjvbdWXJXvDdg +DnbjjvbdQdCaQRDr +EOcLKvbdWWiXuceH +DoCjjvbdbiNJkGXY +EPDKjvbdijGHjMxS +DoDLKvbdTfzmkwVe +EObkKvbdmSZUzTEJ +DnbjjvbdKefHaaRV +DncLKvbddoFSjstS +DncLKvbdSLYfUgKs +EPCkKvbdCIjbLJGK +DncKjvbdKNADzGuB +DoDKjvbdBcpBVjMf +DnbjjvbdpxoHfqEY +DoCjjvbdANHyTWyx +DoDKjvbdFjeSbgmV +DnbkKvbdxwiKCPzL +DncKjvbdqceIpNvB +DnbjjvbdLFfHbAqV +EPDLKvbdtTSTYydc +EPCjjvbdezvYdiTw +EObjjvbdWWiYVdFH +EOcLKvbdZyDjNbkr +EObkKvbdwzIFeweS +EPCjjvbdjmBkzFGo +EObjjvbdGAoRYizm +EObjjvbdjcMLQgVH +DoCjjvbddePRavbj +EOcKjvbdlhcspuSB +EPCjjvbdSCEFMJZL +EObkKvbdEYYLsssl +EObkKvbdpstGrSLU +DoDLKvbdIGgZxwwg +EObkKvbdWIYWYGxz +EPCjjvbdfILWSNqH +DnbkKvbdFWYpPljF +DoCjjvbdVAbRSqRy +EOcKjvbdeEoSCWcK +EOcKjvbdSBceMIxk +DoCjjvbdgFkzOGgA +EObkKvbdbPfgELzd +DnbjjvbdmtuZkJqf +EPCkKvbdYgWdAPSi +EObkKvbdmaiwXoOV +EOcKjvbdjuvnDbXw +DncLKvbdiBoCdvpq +DnbkKvbdZxcjNbkr +EPDKjvbdKfFgaaRV +DoDKjvbdNGcPlouL +EOcKjvbdHlBznXQk +EPCjjvbdKQydoFme +EPCjjvbdDxYLsssl +DoCjjvbdHbLydzAD +DnbkKvbdZisHofbG +DnbkKvbdvvkaWBWV +DncLKvbddxZtUSFz +EPCjjvbdBcpBWJlf +EObkKvbdVBBprpqy +DoCkKvbdaSFcITfL +DoCkKvbdZLqctOMN +EPDKjvbdFWYpQMie +DncKjvbdOEctJIjd +DoCkKvbdEuyQPmJe +DncLKvbdZGwEAOsJ +DncKjvbdlqyUzSci +EOcKjvbdKCibqKCx +DnbjjvbdEOcLKvbd +DncKjvbddneTLUUS +EPCjjvbdhbPDFWpq +DoCjjvbdeAUQmXjG +EPDKjvbdVwJYWDeH +DncKjvbdePFTKstS +DoCjjvbdjggMFemk +EPCjjvbdcScLUDjB +DoDKjvbdZjTIQGbG +EObjjvbdehKurNpg +DncLKvbdbsDLUEJa +EOcLKvbdEJgjWXjA +EPCkKvbdqquKnKaN +DnbjjvbdZjShQHCG +DoCjjvbdCEPaVilf +EObjjvbdzjUpQDrt +EOcLKvbdUVlPjUBR +DnbjjvbdeFPSCWbj +DoCkKvbdKxpirzuG +DncLKvbdrykpTAgn +DoDKjvbdemGXGljL +DncLKvbdTYKlNzkY +DncKjvbduaDyTOeI +EObkKvbdnBjWwoOV +EPCkKvbdGdLWKCJj +EPDKjvbdKeegaaQu +EObkKvbdxnShXrhc +DoCkKvbdsBemLgKy +EPCjjvbdrzLoraHn +EPDLKvbdrRuKmjaN +DncLKvbdmajWxPOV +DncKjvbdKVuGDeGi +EObjjvbdziuQPdTU +DnbkKvbdZxcinCkr +EPCkKvbdlqxtzTDi +EPCkKvbdyzeOSHiI +DnbkKvbdqmZiyMIJ +EOcLKvbdIwtBgkqQ +DncLKvbdfekzOHHA +EPCkKvbdKNADzGuB +EOcLKvbdUaBqSqRy +EPDKjvbdddnrBvbj +DncLKvbdmuVZjirG +EOcKjvbdbBWEepPw +DncLKvbdwjvdHzyf +EPDKjvbdmgFXlmgZ +EPCkKvbdtSqryZeD +EObkKvbdOFEUIhkE +EOcKjvbdiBncFXRR +DncLKvbdxZgeeweS +EPDLKvbdxwiKCPyk +EPDKjvbdHEKvJajK +DncKjvbdrafMlGjy +EOcLKvbdwWlBWBWV +DncLKvbdegjvRmqH +EObkKvbdehKvRmqH +DoDLKvbdUaBpsQrZ +EPDKjvbdRaceMJYk +DnbkKvbdZRNEhldq +DnbjjvbdKCibpjDY +DoDLKvbdKaLGmCXq +DncLKvbdKaKflbYR +DoCjjvbdZQleJNFR +EPCjjvbdZHWdAOsJ +EObkKvbdpxnggRDx +EPDKjvbdiUzFXSVC +DncKjvbdhfjDZWJu +DoCjjvbdYkrDtNlN +EOcLKvbdkVvmdBxX +DnbjjvbdFkFScHlu +DoCjjvbdlrYuZrci +EOcKjvbdrDdiPnWB +DoCjjvbdfoazvcwh +EPCkKvbdtkxWaUAw +EObjjvbdVYgsyjoO +EPCjjvbdssSTZZeD +DoCjjvbdbVBfwjsh +EPCjjvbdVgwuxGxz +EOcKjvbdZoNhdeZj +EPCkKvbdGYttaDwb +DncLKvbdvAcySoEh +DoDKjvbdIGfzZYYH +DoDKjvbdtcCtvvPP +EObjjvbdkxsRryHU +DnbkKvbdJSyBTMwl +DoCjjvbdsPuoJbuf +DnbjjvbdZxcimcMS +DoDKjvbdNGbpMouL +DnbjjvbdSZjHrbvA +DoCkKvbdmRxtysDi +EOcLKvbdZQmEiMeR +EPCjjvbdpfEEtVaI +EPCjjvbdtTRrxzEc +DoCkKvbdZdxGzghb +DncKjvbdrykpTBIO +EPCkKvbdxxIjCPyk +DncLKvbdCEQAujNG +EOcLKvbdrWokbhyR +EPDKjvbdjJehKMwr +DncLKvbdSxLMNzjx +DnbjjvbdZyDinDMS +EObjjvbdZirhQGaf +DncLKvbdkClKqHVH +EObkKvbdfIKvRmqH +DoDLKvbdQvmcblID +EPDKjvbdNsTufdtp +EObkKvbdZRMeIleR +DnbkKvbddwytTrFz +EObjjvbdZxdKODMS +EPCkKvbdSLZFtgKs +EPDKjvbdrovPJbuf +EPCjjvbdHgHZxxYH +EPCjjvbdddoSBvbj +DoDKjvbdegkVqmpg +DoDKjvbdCfkfHAzc +EObjjvbdtvNxJqTA +EPDKjvbdhtyeXSVC +EPDLKvbdUtMtGLvK +EPCjjvbdFaPRYizm +EPCkKvbdVZIUZkOn +EPDKjvbdFeiqnIsq +EObkKvbdddoRbWcK +EOcLKvbdaNLCSuMg +EObjjvbdFpATXGfZ +DncLKvbdrXPkcJYq +EPCjjvbdFjdrcHlu +EObkKvbdUQqPVUhN +DoDLKvbdpxoHfqDx +DncLKvbdypoNIjXA +EPCjjvbdmRxuZrdJ +EPDKjvbdqZPHgREY +EOcLKvbdZGwEAPTJ +DncLKvbdjuwNcbXw +DoCkKvbdTlWPBVoJ +DoCjjvbdRzKIScWA +EPDLKvbdZnnJFEzK +EPDLKvbdqvokbhyR +DnbkKvbdAMhZTWyx +EPCkKvbdqYoHgRDx +EPDKjvbdZtJJZETO +EObkKvbdWRmxBdlD +DnbkKvbdwWkaWBWV +DncKjvbdgKfzcGAE +DncLKvbdtbcUwVno +EOcLKvbdcImJjfWx +DncLKvbdSwjlNzjx +EObkKvbdjblLQftg +DncLKvbdQmYByNtz +DnbjjvbdhlFDmtby +DnbjjvbdcTDKsdJa +EPCkKvbdqUTgSRkU +EOcKjvbdZQleImEq +EOcLKvbdtTRrxzFD +EPCkKvbdUVkpKUAq +DncLKvbdmbJvwoNu +EPDKjvbdrJAKFMne +DncKjvbdpyOhGqEY +EOcLKvbdLrWlzVQz +DnbjjvbdvAdYsPFI +EPCkKvbdDoDKjvbd +DoDLKvbdelfWgMjL +EObkKvbdaMjbTUlg +EObjjvbduVmwjRTA +EPCjjvbdHffyxwwg +DnbkKvbdXrkaNToY +DoCjjvbdZshhyDrn +DoDKjvbdunszqKoU +EPCkKvbdmJDtRVSB +DnbkKvbdcImKLFwY +DoCjjvbdpedEtVaI +DnbjjvbduMXwAtBX +EPDLKvbdhbPDFWpq +EPCjjvbdrDdiQNua +DnbkKvbdKxpirzuG +EObkKvbdcTCjtEJa +DncLKvbdZQmFIldq +DoCkKvbdqUUGrRkU +DnbkKvbddZyQXyRC +DncLKvbdIryBTNXl +EPDKjvbduaDxrneI +DoCkKvbdZMSDsmlN +DoDKjvbdrovOjCvG +EOcLKvbdhyuFkpmf +DoDLKvbdddnrBwDK +DncKjvbdDwxLstTl +EPDLKvbddZxpXxpb +DoDKjvbdCSaDTewS +EPCkKvbdVqmxBeLc +DoCkKvbdZMSEUNkm +DnbkKvbdznopdcMY +EPCjjvbdqYoHgQcx +EPCkKvbdlhdUQuRa +EObjjvbdauBgYLUI +EObjjvbdySnJMrCH +EObjjvbdkIGlGGOL +DoCkKvbdwXMAvBWV +DnbjjvbdiCOcFXRR +EPCkKvbdIHGzZYXg +EPDKjvbdiMFDmuCy +EOcKjvbdtlXvaUBX +DoDLKvbdhfibxuiu +EPCkKvbdqwQMChxq +EObkKvbdRkYeuGjs +DoDKjvbdYkrEUNlN +EPDKjvbdZshiYcsO +DnbkKvbdQlxBxnUz +DncKjvbdSPtGifEX +DoDLKvbdmajXXoNu +EObjjvbdHbMZdzAD +EPCkKvbdZyEKNblS +EObkKvbdKfFgbBRV +EOcLKvbdOTUVgFVQ +DoCkKvbdfMevgMik +EPDKjvbdptTfrSKt +DnbkKvbdxZhFexFS +DncLKvbdUaBqTQrZ +DoCjjvbduDDUwWPP +DoDKjvbdNsUVfduQ +EObkKvbdvOszpjoU +EObkKvbdNsTvGdtp +EPDKjvbdxwhiapZk +DoDKjvbdiGjCxvJu +DoDLKvbdxxIibPyk +DncKjvbdvAdYroFI +EOcLKvbdLAkGmBwq +DncLKvbdIsYaTMxM +EPDLKvbdFejRmiUR +DoCkKvbdbrbjscia +DoDLKvbdiHJbyWJu +EOcKjvbdIwtBhMQp +EObkKvbdpfDdtVaI +EObjjvbdfMevfmJk +EObjjvbdptUHRrLU +EPDLKvbdYgXEAOri +EObkKvbdZoOJEeZj +DoDKjvbdqUUGqqjt +DnbjjvbdxnTHwriD +EPDKjvbdfHkWRmpg +EPDLKvbdePEsLUUS +EPCjjvbdEPCkLXDE +DoCjjvbdgQBzvdYI +DoCkKvbdZjSgogBf +EObkKvbdtunYKQsA +EPDKjvbdezvYdiTw +EPDLKvbdLBLGmCYR +EObkKvbdSLYfVHKs +EPDKjvbdfILWSNqH +EObjjvbdqlyixkhJ +DoCkKvbdjKFgjNXr +DoDLKvbdyzdmrHhh +DoDLKvbdYpleImEq +DoDKjvbdUxgtZkPO +EPDLKvbdJKEAKPgE +DoDKjvbdRXODblHc +DoCkKvbdmozYujxb +EOcKjvbdMgCpMouL +DncKjvbdZsiJZESn +EPCkKvbdzROmIiwA +DnbkKvbdEOcLKvbd +EPCjjvbdpxoIHRDx +DnbkKvbdEJgivXjA +DoDKjvbdfHjurOQg +EObjjvbdyYIjCPzL +DoCjjvbdvlvANEEm +DncLKvbdOXoVzdOU +EObkKvbdatagYKtI +DnbkKvbdGYtuAcwb +EObkKvbdegjuqnRH +DnbkKvbdtumxKQsA +DnbkKvbdIxTbILqQ +DncKjvbdIsZBTMxM +EPCjjvbdRjyFuHLT +EOcKjvbdJXtCIMQp +DoDKjvbdYkqdUOLm +EObjjvbdZsiIyESn +DnbkKvbdhtyeWrUb +EPCjjvbdEuyQPmKF +EOcLKvbdeFOrCWcK +DoDLKvbdEvYpPlie +DoCjjvbdZtJIyETO +EPCjjvbdrWokcJYq +DoDLKvbduaDySneI +DncLKvbdsPunjCuf +EObkKvbdpyOhGpcx +EObkKvbdliDsqUqa +DoDLKvbdhaoCeXQq +DncLKvbdaRfChUFk +EOcKjvbdYTMAlsoY +EPCkKvbdfkGzbfAE +EOcKjvbdURQnttgm +DoDLKvbdDoCjjvcE +DncLKvbdCJKbLJGK +EPDKjvbdhlFEOVDZ +DnbkKvbduCcVWvOo +EPCjjvbdQdDBPpcr +EObkKvbdbBVdeopX +DnbkKvbdWHwuwfxz +DoDLKvbdsrqrxzFD +DoDKjvbdCSaCsfXS +DoCkKvbdNPxQunGs +EPDLKvbdyzeNrHhh +EObjjvbdWXIwudFH +EPCjjvbdKWVFceHJ +EOcLKvbdqwPlCiZR +DncLKvbdyOTHwsJD +DncLKvbdxUleRZMO +DnbjjvbdZHWdAPTJ +DoDLKvbdePEsKstS +EPDKjvbdHDkVjBij +EObjjvbdSPtHJecw +EObjjvbdyTOJNRag +EOcKjvbdhfibxuiu +EOcKjvbdRDbaPqES +DnbjjvbdemGWflik +DoDKjvbdwjwEHzzG +EObjjvbdsCGNMGjy +DnbjjvbdssRsYyeD +DoDKjvbdJvVFceGi +EPCkKvbdLZQjSzuG +DoDLKvbdqUUHSSLU +EPCjjvbdaaWEeoow +EPCjjvbdDjHiuxKA +EPDKjvbdZQmFIleR +DoDKjvbdRDbaPpdS +EPCjjvbdZoOJFFZj +EObjjvbdQmYBxnUz +EPDKjvbdKCibqKDY +DoDLKvbdsCFmMGjy +DncKjvbdKaKgMaxR +DoCjjvbdrMzJxkhJ +EObkKvbdeKKRutzn +EPCkKvbdcTCjscjB +EPCkKvbdZsiIyDrn +EObjjvbdnBjXXoOV +DoDKjvbdBiKakIfK +EOcKjvbdRpTfjGEX +DoCkKvbdtSqrxydc +EObkKvbdHDkVjBij +DncLKvbdqTsgSSLU +DncLKvbdzdzOzdzQ +DoDLKvbdVrNwadlD +DncLKvbdSQUGifEX +DncLKvbdxxJKBoyk +EPCjjvbdrzLpSaIO +DnbkKvbdhtyeXRuC +DoDKjvbdyTOImSBg +EPDLKvbddZxpXxqC +DoCkKvbdZMSDsnLm +DncLKvbdEARhlzXX +EPDKjvbdkWXOECYX +EObkKvbdSLYetgLT +EPDKjvbdTfznLvvF +DoCjjvbdSZjHrcWA +DncKjvbdmJDsptqa +EOcLKvbdZxdJmblS +DnbjjvbdKWUfDeHJ +EPCkKvbdLiBkpxAS +EObkKvbdePFSkTtS +DoDKjvbdYzbfSKWZ +EPCjjvbdvAdYsPFI +EObkKvbdTAFJIBnd +DnbkKvbdsZkpSaHn +DoDLKvbdczZQYZRC +EPDKjvbdTvMQKTaR +DnbkKvbdyYJKCQZk +EPCkKvbdVAaqTQqy +EOcLKvbdbPfgDkzd +EObkKvbdePErjssr +EPDLKvbdyTOJNRag +EPDLKvbdyTNiNSBg +DoCjjvbdqvpMCiYq +DoDKjvbdRpUHKGEX +DoCjjvbdDoCkLWbd +DncLKvbddCTNSATm +DoCkKvbdcSbkUEJa +EPDLKvbdzjVPocrt +DnbkKvbdxVNFQyLn +DnbkKvbdSKyFtfkT +DoCkKvbdmpZxukZC +DncLKvbdGFjSOJTq +EOcKjvbdhkdcmtcZ +DoCjjvbdyzeORghh +EPCkKvbdRbDeMJZL +DoDLKvbdZMRctOMN +EObjjvbdAMgySvyx +EOcLKvbdTYLMNzkY +DnbjjvbdmuVZjjSG +DnbkKvbdZsiIyDrn +EPDLKvbdjEjfuPAO +DoCjjvbdkxrrSxgU +DncKjvbdSLYfUfkT +DnbjjvbdBcpAvJmG +DoDLKvbdSPsgKFcw +DoCkKvbdrXQMDIyR +EObkKvbdKVuFdEfi +DnbkKvbdrSVLOLBN +DoDKjvbdZnmhdeZj +DoDKjvbdNHDQNPuL +DoDKjvbdpyOggREY +DoCkKvbdQvmcblID +EPCkKvbdMfbomQVL +EPCjjvbdNVTRjmAX +EOcKjvbdbhlijevx +EObkKvbdWWiXvEFH +DncKjvbdlqyVZrdJ +DnbjjvbdrSUkNjaN +DncLKvbdmSZUzTDi +EObjjvbdZQmEhmEq +EOcKjvbdiLdcnVDZ +EObkKvbdySmhlqag +DnbjjvbdbUagYLTh +DncKjvbdBdQAvKNG +DncLKvbdyzdnRghh +EObkKvbdLZRKSztf +DoDLKvbdRXOEDMHc +DncKjvbdFkFSbgmV +EPCjjvbdZQldiMeR +EPDLKvbdFfJqmiTq +EOcLKvbdpssgRrKt +DnbjjvbdKRZeOeme +DnbkKvbdnPzYvLZC +DoDLKvbdUVlQJsaR +EPCjjvbdqFceTvAh +EPDKjvbdEARhlyvw +EPCjjvbdNGbolotk +DoCjjvbdVhYWXgYz +DoCjjvbdUtMtFkvK +DncKjvbdZQldhleR +DnbjjvbdCEPaWKMf +EObjjvbduWOXjQsA +EOcKjvbdIjEAKPfd +DoCjjvbdURRPUuIN +EObkKvbdbhmKKfWx +DoDKjvbdxrnJMrCH +EObjjvbdGFirNiTq +DoDLKvbdtSqsZZeD +EPDLKvbdKkAhWAJy +EPCkKvbdbVBgYKsh +DoCjjvbdKWVFdFGi +EPDKjvbdwXMAuaWV +DoCkKvbdRXNdCkhD +EPCjjvbdZRMdhmEq +DncLKvbdcJMijfWx +DnbkKvbdZRNEiNFR +EObjjvbdAMhYrvyx +EPDLKvbdijGIJmXr +DoCkKvbdbhmJjfXY +EOcLKvbdrzMQTBHn +DnbkKvbdKVtfEEfi +EPCkKvbdxVNFRZMO +EPDLKvbdjcMLQgUg +EObjjvbdjuwODbXw +EObkKvbdZeXfzhJC +EPCkKvbdUyITyjoO +EPCkKvbdGFjRnIsq +DnbjjvbdIwsbHlRQ +DncKjvbdtTSTYzEc +EPDKjvbdhfjCyWKV +DoCjjvbdhytelQnG +DoDKjvbdxnTHxTIc +EOcKjvbdUQqPUtgm +EPDLKvbdkNCMZdgP +DnbkKvbdGKeTDINV +EOcLKvbdZMRcsmlN +DnbjjvbdRXNdCkgc +DoCjjvbdRXNccMHc +EObkKvbdRjyFuGjs +EPDLKvbdmJDtRUrB +DoDLKvbdpyPIGpdY +EPCjjvbdkNCLzEgP +DoDLKvbdZoNiFEzK +DoDKjvbdKVuFcdfi +DoDKjvbdqZOggQdY +EPCkKvbdSQTgJecw +EOcKjvbdrRuKnLAm +EObkKvbdbUbHYLUI +EOcLKvbdyNrgwsJD +DoDKjvbdegkVqnQg +DnbkKvbdGBOpxizm +EObkKvbdJbjDQicY +DncLKvbdSLZFuGjs +DoCkKvbdGckVibJj +DoCkKvbdzeZnzdyp +EObjjvbdxxJKCQZk +EObjjvbdJpzFPGNe +EPCkKvbdUsltGLvK +DoDLKvbdziuQQDsU +DncLKvbdRzKIScWA +DoCkKvbdSLYfVGjs +EPCjjvbdhgKDYujV +DoDKjvbdtunXjQsA +EPDKjvbdqceJPnWB +DncKjvbdUQqOuUhN +EOcKjvbdJvVFceHJ +EPCkKvbdMfcPmQVL +EObkKvbdNrsufdtp +DncLKvbdUQpnuUhN +DncKjvbdYkqdUOMN +EObkKvbdqceJQNvB +EPDLKvbdCWzdJFPv +DncKjvbdauBfxLTh +DncKjvbdZnnJEdyj +DncLKvbdEvYpPlie +DoDLKvbdhaoCdvpq +EObkKvbdCEQBVimG +EOcKjvbdBiKbKhfK +DnbkKvbdeuzwpJzs +DncLKvbdhlEcnVDZ +EObkKvbdkCkjpftg +DncKjvbdZQldhmEq +DoDKjvbdFyVVBEXb +DncKjvbdZirgogCG +EPCkKvbdWXJXvEFH +DnbkKvbdOStVfduQ +DnbkKvbdNGbpMouL +EObkKvbdcIljKfXY +DoDLKvbdXrlBMsnx +EOcLKvbdfNFwGmJk +EObjjvbdUQqPUuHm +DnbjjvbdEXxLtUTl +EPDKjvbdLGFhCBQu +DncKjvbdTYLLmzkY +DoCkKvbdkaNPNALA +DoCjjvbdFxtuBDwb +EPDLKvbdGGJrNhsq +DoCkKvbdZyEJnDLr +EObkKvbdDxXlTssl +EPCkKvbdGKdrbglu +EOcLKvbdmoyyVjxb +DnbkKvbdRNYByNtz +EObjjvbdGFirOItR +DoCjjvbdxUmFRZLn +EPCkKvbdsQWPJcWG +EPCjjvbdegkWSORH +DncLKvbdYzcGRjVy +DoCkKvbdRXNcblHc +EObkKvbdwtldqYkn +DnbkKvbdZisHpGaf +EPCkKvbdGQASvfey +DnbjjvbdeFPRavbj +EOcLKvbdGZVVBEYC +EPCkKvbdKDKDQicY +EPCkKvbdUsmUFkuj +DoCkKvbdatbHXjtI +EObkKvbdlrYtyrdJ +DnbjjvbdjKGHilwr +EOcKjvbdjlakyeGo +DoDLKvbdnPzZVkZC +DnbjjvbdCIjbLJFj +DoCkKvbdegkWSORH +DoDLKvbdjvXODbYX +EPDKjvbdaaVeFoow +DncKjvbdwtmFRZLn +EObkKvbdkNCLzEfo +DncLKvbdrbGMlGkZ +EObjjvbdczZQXxqC +DoCkKvbduaEZTOdh +EObjjvbdZxcjNbkr +EOcKjvbdCJKbKiFj +DnbjjvbdjEkGuPAO +DnbjjvbdZshhyDsO +DoDLKvbdbsCkUDjB +DoCkKvbdNddUIhkE +EPDLKvbduVnYJpsA +DnbjjvbdQvmccMHc +DoDKjvbdDjIKWXjA +DoDLKvbdxZhGGYEr +EObkKvbdqquKmkBN +EObjjvbdLBLHMawq +DoDLKvbdrbFmLgLZ +EPDLKvbdddnrBwCj +DoCkKvbdbrcLUEKB +DoDKjvbdqlyjYlHi +DncKjvbdQwNdDMID +EObkKvbdBiLCKhej +EPCkKvbdSZigsDWA +DnbkKvbdwuNFRYlO +EPDLKvbduCbtvvOo +DnbjjvbdaaWFFpPw +EObkKvbdRECaQQdS +DncKjvbdyOShXsJD +EPCkKvbdFVyPomJe +DoDLKvbdcJMijevx +EObkKvbdSZigsCvA +EObjjvbdrNZjYlHi +DnbkKvbdKfFhBaRV +EPDLKvbdSLZFtgKs +EPDLKvbdrbGNMGjy +EPCjjvbddwzTtSFz +DoDLKvbdnGdxNNgZ +DncLKvbdTfzmlWue +EOcKjvbdbLLfOmcA +DoDLKvbdNGcQNPuL +DncLKvbdUaCQsQqy +EPCjjvbdCfkfHAzc +EPDKjvbdlrYuZsDi +EPDLKvbdmajXYPOV +EObjjvbduCcUvvOo +DoDLKvbdJXsahLqQ +EPCkKvbdOSsugEuQ +DnbkKvbduaDyTOeI +DncLKvbdYqNEhldq +EOcLKvbdeOdsKtUS +EOcKjvbdkHgLefOL +EPCkKvbdrpVoKCuf +EObjjvbdShzJqAAl +DnbjjvbdgPazwDxI +EPDLKvbdEztQdlDJ +DoDKjvbdYpmFImFR +DncLKvbdsBellHLZ +DoCjjvbdatbHYKsh +DoCjjvbdptTgRrLU +EOcLKvbdznpRFCkx +EPCjjvbdWWiYWEFH +EPCjjvbdRosgJedX +DnbjjvbdkIGkefOL +DnbjjvbdiZuGLqNf +EPCkKvbdANIZTWyx +EObjjvbdZQmFJMdq +EObkKvbdjvWmcbYX +DncLKvbdRbEFMJYk +EOcKjvbdpfDdtVaI +EPDKjvbdJqZePFnF +DnbjjvbdeFOqavcK +DoCjjvbdnHFXlnHZ +EPCjjvbdTvLpKTaR +EPDLKvbdVgxVxHYz +EObkKvbdZRNFJMdq +EPDLKvbdbUafwkUI +EObjjvbdKCjDQibx +EPDLKvbdrXPlChyR +DoCjjvbdxsNhlqbH +DoDKjvbdNGbomPtk +EPDLKvbdLBLGmBwq +DncLKvbdIsZBTNYM +EPDLKvbdOXnuzcmt +EPDKjvbdKDJcRJcY +EObkKvbdiBncFWqR +DncLKvbdlhcsqUrB +DncKjvbdrylQTAgn +DoDLKvbdTlWOaWOi +EPCkKvbdegjurNpg +EObjjvbdyTNhmSBg +EPCjjvbdQccBPpcr +EPDKjvbdeOeSkTtS +DoCjjvbdGYuVAdXb +EObjjvbdrzMPsAhO +DncLKvbdrEFJQOVa +EPCjjvbdbhmKKfWx +EPCkKvbdeYZssqez +DnbkKvbdURQntuHm +EPDLKvbdkDLkRHVH +EOcKjvbdlZSrSxft +EObkKvbdijGHimXr +EOcLKvbdpxnggQdY +DncKjvbdJKEAJpGd +EPCjjvbdMowpumfs +DoCkKvbdmSYtysDi +DoDLKvbdBsBDTfWr +EPDLKvbdrMzKZMHi +DnbkKvbdBraDUGWr +DnbjjvbdDxYMTtTl +DncKjvbdFyUuBEYC +EPCkKvbdVZITzKnn +DnbkKvbdTkvPBWPJ +EObkKvbdSQTfjFdX +DoCjjvbdZisIPgBf +EPCkKvbdLGFhCAqV +DoCjjvbdNGcQNPuL +DoCkKvbdqlzJyMIJ +EObjjvbdZtIiZDrn +DnbjjvbdeEoRawCj +DoDKjvbdUaBqSqRy +EOcLKvbdmfdwmOGy +DoDKjvbdptTfqrKt +DoDLKvbdvAcxsPEh +DoCkKvbdySmhmRbH +EOcLKvbdhfjDZWKV +EOcKjvbdHffzZXxH +DoDKjvbdLFfHaaQu +EPCjjvbdgFlZmfgA +EOcKjvbdtcCuXVno +DoDLKvbdZirgpGbG +EObjjvbdNsUWHEuQ +DoDLKvbdsBfNLgKy +DoDKjvbdGGKRnJUR +DoDLKvbdKkAhWAKZ +DnbjjvbdOFDtJJKd +EPCjjvbdMuSrKmAX +DnbjjvbdyXiKBpZk +DncLKvbdOFDtIhjd +DoDKjvbdNPxQumgT +DnbjjvbdrSVLOKaN +EPCjjvbdmJDtRVRa +EPCkKvbdZeXfzgiC +DoDKjvbdhaoCdwRR +DncKjvbdiBncFXRR +EPDLKvbdvBEYrndh +DnbjjvbdBiLBkIfK +EPDLKvbdhgJbyVjV +DncKjvbdzRPNIiwA +DnbjjvbdegjvRmpg +DncLKvbdyYIibQZk +EPCkKvbdxnTIXrhc +EPCkKvbdhkeEOUby +DnbkKvbdjJehKMxS +DoDKjvbdkVwODbYX +EPCkKvbdFWYpQNKF +EPCjjvbdXrkaMsnx +EPDKjvbdRjxetgLT +DoDKjvbdEztRFLbi +DnbkKvbdqdFJQNua +EPDLKvbdTqQntthN +DoDLKvbdYORAXtvU +DnbjjvbdEYXksstM +EPDKjvbdkMbMZdfo +DncLKvbdJKEAKQGd +EOcKjvbdFejSOJUR +DoCjjvbdYlRdTmkm +DoDKjvbdlYrqrxgU +EPDKjvbdKVuFdFGi +EOcLKvbdJqZeOfNe +DnbkKvbdzoPpdcLx +DoDKjvbddePSCXCj +DoDKjvbdEASIlywX +DoCjjvbdrEEiPmua +EPCkKvbdidkGuPAO +EObjjvbdKRZdnfNe +DncKjvbdhgJcZWJu +EPDLKvbdZxcimbkr +EPDKjvbdNeEUIiKd +EOcKjvbdvAdZSndh +DncLKvbdjggMGGNk +EObkKvbdOStVgFUp +EPCkKvbdRaceMIxk +DncKjvbdDwxMUUUM +DncKjvbdWeyZtAPT +EPCjjvbdEYXkstTl +EOcKjvbdxsOJNSBg +EPCkKvbdKQzFPFnF +EOcLKvbdJXtCHkpp +DoCjjvbdtlYXBUBX +EPCjjvbdwuNFRYkn +DoDLKvbdkDLjpfuH +EPDKjvbdxrmhlqbH +EOcLKvbdjmCLzEgP +DoCjjvbduaEYsPFI +EPCkKvbdCEPaWJmG +DncKjvbdwtmEpxlO +EPCkKvbdJbjCpjCx +DnbjjvbdhzVGMRNf +EPCkKvbdZxcinDMS +DoCkKvbdrNZiyLgi +EOcLKvbdIHGyyYYH +EObkKvbdYNqAXuWU +EPDKjvbdtvNwjRTA +EPCkKvbdcJMjLFvx +EPCjjvbdNrsvHEuQ +DoCjjvbdnGeYMmgZ +DoDLKvbdSLZGUfjs +EPDKjvbdtvOYKRTA +DoDKjvbdziuPpESt +DoCkKvbdMgDPlotk +DoCkKvbdeFOrCXDK +DnbkKvbdMgColpUk +EPCkKvbdKVuFdFGi +DoDLKvbduCcUvuoP +DoCkKvbdRDcAopdS +EPDLKvbdehKvSNpg +EOcKjvbdDoCjjvbd +DoCjjvbdOSsufdtp +EObjjvbdGQASwGfZ +DncLKvbdiHJcYujV +DncKjvbdRadFMJZL +EPDLKvbdZxcinDLr +EPDLKvbdhaoDFXQq +DoDKjvbdcJNJkGXY +DoDLKvbduaDySoEh +EOcKjvbdUxhUZkPO +DncLKvbdVYhTzKoO +DnbjjvbdehKvRnQg +DnbkKvbdOhAXyAYa +DncLKvbdxsNiNRag +DoDLKvbdTppoVUgm +EObkKvbdURROuVIN +EOcLKvbdNsTugFVQ +DoCkKvbdrXPlChxq +EPDKjvbdHDkWJajK +DoCkKvbdxnTHxTIc +EPDKjvbdEvZPoljF +EPDKjvbdrzMQTBIO +EPCjjvbdqZPHgQcx +DoCkKvbdVqmxCFMD +DncLKvbdSPsgKGEX +DoCkKvbdzjVPodSt +DoDKjvbdnUtyjiqf +DnbjjvbdIBkydzAD +DoDKjvbdcTDKscjB +EOcKjvbdiHKDYuiu +DncKjvbdBraDUFvr +DoCjjvbdQmYCZOUz +EPCkKvbdySnIlqbH +DnbkKvbdkDLjqGuH +DnbjjvbdVqnYCFMD +DncLKvbdGKeTCglu +DncKjvbdlZSqrxft +DncLKvbdrEEhpNvB +EOcLKvbdrDeJQNvB +EPCkKvbdQmXbYmtz +DoCkKvbdQlxCYnUz +EPCjjvbdEObkLWbd +EPDLKvbdehKuqmqH +EPCkKvbdkCkjpfuH +DncKjvbdRXNcblHc +EPCjjvbdsrqrxydc +EPDKjvbdddoSBvcK +EPCjjvbdADRxJzIp +EPDLKvbdvAcxsPEh +EPDKjvbdSLYfUgLT +DoCkKvbdsrrTYyeD +DoCkKvbdLFegbApu +EPCjjvbdyqOliJwA +EPDKjvbdqTtGrRjt +EPCkKvbdhbObdvqR +EPCjjvbdcScLUEJa +DoDLKvbdRWnDblID +EObkKvbdZLrETnLm +DoDKjvbdiBoDEvpq +DoDKjvbdMpXqVmfs +EPCjjvbdpxngfpcx +DncKjvbdsCGNLfjy +DncKjvbdRjyGVHLT +EPDKjvbdkHflGFmk +DoDKjvbdlhdUQuSB +EPCjjvbdKaLGlbXq +EPCkKvbdVhXvXgYz +EOcLKvbdKyQirztf +EOcLKvbdliDsqVRa +DncKjvbdJutfDdfi +DoDKjvbdEXwksssl +DncLKvbdxxIjCPyk +EObkKvbdKaKgMaxR +EPDKjvbdkCkjpgUg +EOcLKvbdZLqctNlN +EPDKjvbdNddThhjd +EOcKjvbdYlSDsmlN +EPDLKvbdmgExNOGy +DoDKjvbdePErjstS +DnbkKvbdZQleIldq +DncKjvbdpssfrRkU +EOcKjvbdDxYMTtTl +EPCjjvbdySmhmSBg +EPDKjvbdiiehJlxS +EOcLKvbdFkFTDINV +EPCjjvbdVqmxCFMD +DncLKvbdIsZAsMwl +DncKjvbdBraDTfXS +EPDKjvbdmuUykJqf +DnbkKvbdFyVUaEXb +EObjjvbdzROmJJwA +DncKjvbdEYXlUUTl +EPDKjvbdBhjbKhfK +DoCjjvbdJpzEneme +DncLKvbdVwIwuceH +EPDKjvbdhfjDYuiu +EOcLKvbdFpASwHGZ +EPDKjvbdZoOJEdyj +DoDKjvbdqdEiPnWB +DoDKjvbdnBjXYPNu +DoCjjvbdiHKCxuiu +EOcKjvbdGLFTChMu +EOcKjvbdiMEdNtby +DnbkKvbdGdKujBij +DncKjvbdKQydneme +DnbkKvbdziuPocsU +DoDKjvbdmfdxNNgZ +EObjjvbdDxXlUTtM +EObjjvbddePSBwCj +EOcKjvbdNPxQvOHT +DnbkKvbdZHWdAOsJ +EPDLKvbdyqPNIiwA +DoCkKvbdpyPHfqDx +EPDLKvbdUslsekuj +EPCjjvbdiZtfLpnG +DoCkKvbdmSZVZsDi +EPCjjvbdpyOhGpcx +EPDLKvbdzitoodSt +DoDKjvbdVYhUZkOn +EObkKvbdBsAbtGWr +EPDKjvbdvBEYsOdh +EObkKvbdGcjuibKK +DncKjvbdeATqNYKG +DoCjjvbdKNAEZgVB +DncLKvbdqUUHSRjt +EOcLKvbdGcjuibJj +DoDLKvbdnBivxPOV +DnbkKvbdKCjDRKCx +DnbkKvbdrykosAgn +EOcKjvbdUaBqTRRy +EPCjjvbdcSbkTcjB +DoDLKvbdIxTbILpp +DoCjjvbdHDjuibJj +DncKjvbduaDxroFI +DoDKjvbdpedEtWBI +EOcKjvbdXsLaNTnx +EPCjjvbdYORAYVWU +DoCjjvbdYpleIleR +DoDKjvbdCDpAujMf +EPCkKvbdpxoHfpcx +DoCkKvbdUWMPisaR +EPCjjvbdmuUzKjSG +EPDKjvbdkxsRsYgU +EPCkKvbdZxcjNblS +DnbkKvbdbPffckzd +EPDKjvbdUVkpJtBR +DoCkKvbdvlvANEFN +EObkKvbdShyjRAAl +EPDKjvbdxrmhmSCH +DoDKjvbdjvXNcaww +EPDKjvbdkDLjqGuH +EObkKvbdhfibxuiu +EPCjjvbdlqyUyrci +EPDLKvbdFVxopMjF +EOcKjvbdqdEiPnWB +DncKjvbdrXPlChxq +DoCkKvbdxVMeRYkn +EPCjjvbdlhdUQtqa +EObjjvbdRotHKFcw +EObkKvbdwjvcgzzG +EPDLKvbdBhkBjiFj +EObjjvbdlZTSTZGt +DoCkKvbdkIHMFemk +EObjjvbddndrkTsr +DoDLKvbdFVxpQNKF +EPCjjvbdZsiJZETO +EObjjvbdiMFEOUby +DoCkKvbdhlFEOUby +EPCkKvbdrWolDIyR +EObjjvbdmajWwoOV +DoCkKvbdypoMiJwA +DoDKjvbdCDpAvKMf +EPDLKvbdzjVQQDrt +EObjjvbdjlakydfo +EObkKvbdJpyeOeme +DoDLKvbdiHJcYvJu +EOcLKvbdbsDKtEKB +EOcLKvbdrpWOjDVf +EObjjvbdelfWfmKL +EObjjvbdxnSgwriD +DnbkKvbdqlyjZLhJ +EPCkKvbdQdDBPqDr +EPCkKvbdRkYfUfjs +EObjjvbdhtydwSVC +DnbjjvbdWWhwvDdg +DoDLKvbdypnliKXA +DncLKvbdhfibxvKV +DncLKvbdxrmiNSCH +DncKjvbdUaBqSqRy +DoDKjvbdZMSDsmkm +DncLKvbdFjeScHmV +EPDLKvbdQYmAHSrK +DoCkKvbdUVlQJsaR +DoDKjvbdGKdsDHmV +EPCkKvbdkHgLfGNk +EPDKjvbdCIkCLJFj +DoCkKvbdrpWOicVf +DncLKvbdqmZiyMIJ +EObkKvbdNGcQMpUk +EOcLKvbdhfibxuiu +DoCjjvbdjcLjqHVH +EPDLKvbdZxdJnDMS +DncLKvbdHDkViajK +EPDKjvbdhytelRNf +EPDKjvbdZRNFIleR +EObjjvbdNQYRWNgT +EPCjjvbdNdcsiIkE +DoCkKvbdajkfOnDA +EPCjjvbdRNYCZOUz +EPCkKvbdBcpAvKNG +DncKjvbdqTsfqrLU +EPCjjvbdsZlQSaHn +EOcKjvbdqdFIpNvB +DoCjjvbdtbcUwWPP +EObjjvbdEYYMTtTl +EOcLKvbdgGLzNfgA +DoDLKvbdzdynzeZp +DnbjjvbdajlGPNcA +EPCjjvbdEJhJuxKA +EPCjjvbdLLBIWAJy +DnbkKvbdwzIFewdr +DoCkKvbdBvzciEpW +DoDKjvbdaNKasVNH +EPDLKvbdVviXudEg +EPDKjvbdcbSmSAUN +EPDKjvbdqcdiQNua +EPCkKvbdbBVdfPpX +EOcLKvbdrEFIpOVa +DoDKjvbdDigivXjA +DoDKjvbdYSlBMtPY +DoDKjvbdrRtjnLAm +DoDKjvbdKeegbApu +DnbkKvbdHgHZyXxH +EPCkKvbddwzUTrFz +DnbjjvbduDCtwWPP +EOcLKvbdaRfDHsfL +EPCjjvbddeOqbWbj +DncLKvbdOFDsiJLE +EObkKvbdSBceMIyL +EOcLKvbdrylQSaIO +DncLKvbdJcJcQjCx +EPCkKvbdaRfCgsek +EOcKjvbdzitoocsU +DoDKjvbdyzdnSIJI +EObkKvbddndsLTsr +DoDLKvbdcTDKtEKB +EPCkKvbddZyQYYpb +EPDLKvbdCIjakJFj +DncLKvbdLrWlzVQz +EOcKjvbdxrnIlqag +DncLKvbddeOrCWcK +DoCkKvbdRaceLiZL +EPCkKvbddePSCXCj +DoDKjvbdJpzFOeme +DoCkKvbdiMFEOUby +DncKjvbdUQqPVVHm +EOcLKvbdcSbjscjB +DnbjjvbdvPTzpjoU +EPDKjvbdEPDLKvbd +DncKjvbdvBEYsPEh +DnbjjvbdIxTbIMQp +DoDLKvbdZLrETnMN +EPCkKvbdZxdJmbkr +EPCjjvbdIidAKQHE +DncKjvbdrSUjmjaN +DnbkKvbdkaNOmALA +DnbkKvbdiGjCyViu +EPCjjvbdYkrDsmlN +EOcKjvbdypoMhjXA +DoCkKvbdiGjDZViu +DoDLKvbdZxcinClS +DoCjjvbdqUUGrSLU +DnbkKvbdYTLaNUPY +EObkKvbdehKurNpg +EOcKjvbdmRyVZrdJ +EObkKvbdZirhPgBf +EOcKjvbdpyOggQcx +DnbkKvbdfoazwEXh +DnbkKvbdmuUzLJqf +EPDLKvbdYlRdUOLm +DncKjvbdRjyFuGjs +DoDLKvbdQdDAopdS +DoCkKvbdmSYtysEJ +EObjjvbdQdDApRDr +DoDKjvbdyOTHxShc +EPDKjvbdptUHSRkU +EOcKjvbdLGGHaaRV +EOcLKvbdaaWFFopX +DoCjjvbdlBMnmALA +DnbjjvbdZnnIdeZj +DoCjjvbdZMRdUNkm +DoDLKvbdRMxByNtz +EPCkKvbdJYTahMRQ +DncLKvbdpyPIHQdY +DoCkKvbdVBCRTRRy +EOcLKvbdZyEKODLr +EObkKvbdRadEkiYk +EOcKjvbdcyyQXyRC +DnbkKvbdVqnXadkc +EPCkKvbdGKeTDIMu +DnbkKvbdrRtjnKaN +EObkKvbdFVxooljF +DoDKjvbdDoCjjvcE +DnbkKvbddneTLTsr +EPDKjvbdGcjvKCKK +EObjjvbdgPazvdYI +DoDKjvbdSLYfVHKs +DoCkKvbdEPCjkWbd +DnbjjvbdmaivxPOV +EObjjvbdJJdAJogE +DoDKjvbdhkddNtby +DoCkKvbdiCPDEwQq +EOcKjvbdmajXYOmu +DnbkKvbdqYngfqEY +EOcKjvbdTppoUuIN +EPDKjvbdNddThhkE +DncKjvbdDnbkKvbd +DnbjjvbdZRNEiNFR +EPCjjvbdaaWFFopX +EPDLKvbdBhjbKhej +DoCkKvbdfpBzvcwh +DoDKjvbdmSZVZrdJ +EObkKvbdbAueGQQX +EOcKjvbdNQXqWOGs +EPCjjvbdvAcySndh +EOcLKvbdySnImRag +EObkKvbdSxLLmzkY +DnbjjvbdcJMjLGXY +EObkKvbdBsBDUFwS +DoCjjvbdqlyjZLhJ +EPCjjvbdliEURVRa +DoDKjvbdptTgRrLU +DncKjvbdiBoCdwQq +EOcKjvbdEOcLLXDE +EObjjvbdEYYLtTsl +EPDKjvbdVTmTekuj +DncLKvbdLFegbBQu +EPCjjvbdmttzLKRf +EPDLKvbdpfEFTuaI +DncKjvbdiiegjMwr +EObkKvbdxVNEqYlO +DoCjjvbdRWnDblHc +EPCjjvbdaSFbgtGL +DnbkKvbdozmcjwoA +DoDKjvbdPyNAHSrK +DncLKvbdVqnXbEkc +EPCkKvbdFWYpQNJe +EOcLKvbdlYsRsZHU +EOcLKvbdQvmcblID +EObjjvbdRkYetfkT +DoCjjvbdFjdsDINV +EPCjjvbdrafNMGkZ +EPDKjvbdczZQXxqC +EPDLKvbdDwxLtTsl +DoCjjvbdFpASvffZ +DoCjjvbdiMEdOVCy +DoCkKvbdelevfljL +DnbjjvbdaSFcHtFk +DncKjvbdBhkBkIfK +EObjjvbdGKdsDHmV +DncLKvbdhzUekqOG +EOcLKvbdZshiZDrn +DncLKvbdDjIJuwjA +EPCjjvbdpxoHfqEY +EPCjjvbdOAIrsjSA +EPDLKvbdEuyPolie +EPDKjvbdssRrxydc +EPDKjvbdjlakzEgP +DncKjvbdiUydwRuC +DoCkKvbdZMSDtNkm +EPDLKvbdbBVeGQPw +EObkKvbdNHDPlpVL +DoDLKvbdDjHiuxKA +EPDKjvbdatbGwkUI +DnbjjvbdeqaWzkbo +DoDKjvbdvvlBWAuu +EObjjvbdZirhQHBf +EPCkKvbdDncLKvcE +DnbjjvbdehKvSNpg +DncKjvbdVwIwudFH +DoCjjvbdNQYRVmgT +EOcKjvbdNrtWGeUp +DncKjvbdvvlAvAuu +DnbkKvbdjKGHimXr +EObjjvbdhkddNuDZ +EPCkKvbdNddThhkE +EPCjjvbdsPunjDVf +EPDKjvbdxZgfFwdr +DncKjvbdZyDjNblS +EPDKjvbdjcMLQfuH +DncKjvbdwtmFRZMO +DncKjvbdVhXuwgYz +DoCkKvbdVZITyjnn +EPCkKvbdNrtWHEtp +EPCjjvbdMfbomQUk +EObkKvbddwyssqez +EPCkKvbdhfjCyVjV +DoDKjvbdtvOYJpsA +DoDKjvbdiLdcnVCy +EObkKvbdLrWlzUpz +DoCkKvbdSPsgKFdX +EPCjjvbdkNCLyeGo +DncKjvbdCSaCtGWr +DnbjjvbdRkZFtgLT +DoCkKvbdVAaprprZ +DnbjjvbdyXhibQZk +DoCkKvbdsQVnibvG +EPCjjvbduaDyTPFI +DncLKvbdUaCRSpqy +DoDLKvbdnPzYukZC +DoDKjvbdRWnDcMHc +EOcKjvbdxVNFRZLn +EOcKjvbdRkZGUfkT +DnbkKvbdvmWAMdEm +EOcKjvbdmbKXYOmu +EPCkKvbdyXiKCPyk +DnbkKvbdkHgMFfOL +DncKjvbdVYgtZkPO +EPCkKvbdDnbkKwCd +EObkKvbdKfGHaaRV +EPCkKvbdqZOggQdY +EOcLKvbdTlVnaVoJ +DoCkKvbdhanbeWqR +DnbkKvbdypoMiJwA +DnbkKvbduMXvaUBX +DoDKjvbddiirWUzn +EObkKvbdqYoHgQcx +DnbjjvbdFyUuBDwb +DoCkKvbdKCicQjDY +EPDLKvbdezvYeJTw +EPCjjvbdSxKlNzkY +DoDKjvbdQmYByOUz +DnbjjvbdIGgZxxXg +EPDKjvbdqmZjZLgi +DncKjvbdmfeYMmgZ +DncLKvbdGdLVibKK +DoCkKvbdZGvdAOsJ +EObkKvbdjSzhrkJz +EPDLKvbddePRbWcK +EObjjvbdDxXkstUM +DoCjjvbdvlvANDeN +EOcKjvbdrDdiQOWB +DoCkKvbdmajXXoOV +DncKjvbdUtMsekvK +EOcLKvbdxxJKBoyk +EPDKjvbdqYnhGpcx +EObjjvbdatafwkTh +DncLKvbdajkenmcA +DnbjjvbdZQleImEq +EPCjjvbdDncLKwCd +EObjjvbdHELWKBij +EPDLKvbdxrmhmRag +DoCjjvbdwXMBWBVu +EObjjvbdsPvOjCvG +EOcLKvbdssSTZZdc +EPCkKvbddndrkUUS +EOcLKvbdNGbolotk +EObjjvbdZMSDtNlN +EObkKvbdZshiYcsO +DncKjvbdDwxLsstM +EOcLKvbdqZPIGqEY +EOcKjvbdZRNFImFR +EOcKjvbdrDeIonVa +DnbjjvbdYzberKWZ +EObjjvbdegjvRnQg +DoCkKvbduDDUwWOo +EPDKjvbdRotGjGEX +EOcKjvbdKQyeOeme +EPCjjvbdDwxMTtUM +EObjjvbdpedFTvAh +EPDLKvbdFxtuBDxC +DoCjjvbdlqxtzSdJ +DncKjvbdZLrDtOMN +EPCkKvbdGdKujBjK +DoCkKvbdezvYdiTw +DnbjjvbdrEEiQOVa +DncKjvbdOYPVzdOU +DnbjjvbdxwiKCPzL +EObkKvbdRpTgJecw +DoCkKvbdwtmEpxlO +EPDKjvbdqFceTuaI +DncKjvbdsPuoJcWG +DncLKvbdRyjHsCvA +EPCkKvbdyXiJaoyk +EPDLKvbdJvVFcdgJ +DncLKvbdrXPlChxq +EObjjvbdvBEZTOdh +DoDKjvbdqvokcJYq +EOcKjvbdlqxtzSci +EPDKjvbdFkErbglu +DoDKjvbdEPDLKvcE +EObkKvbdijFhJlxS +DoCjjvbdOFDtJJKd +DnbkKvbdyXhiapZk +DncKjvbdEXwlTtTl +DncLKvbdZyEKOCkr +DnbkKvbdqlyjYlIJ +EObkKvbdIGfyxwxH +DnbjjvbdyNrgxTIc +DnbkKvbdeOeSkTsr +EPCjjvbddZyPxZRC +DncLKvbdkDMKpgUg +EPDKjvbdfIKuqnQg +EPCkKvbdhlFENuDZ +DoDLKvbdiBoCdvqR +EPCkKvbdySnImRag +DnbjjvbdIxTahLqQ +DoDKjvbdZnmhddyj +EOcKjvbdgQBzwEXh +EPDLKvbdfILWSNqH +DncKjvbdjcMKqGtg +EObkKvbdKQzEnfNe +EPDKjvbdUQqPVVHm +EObjjvbdREDBPpcr +EObjjvbdnHExMnGy +DnbkKvbdvBDxrndh +DncKjvbdCEPaVimG +DnbkKvbdGBPQxizm +EPDKjvbdLqwMzVQz +DnbkKvbdEPDLLXDE +EPDKjvbdwWkaWBVu +EObkKvbdxrnImSCH +DncKjvbdsrqrxzEc +DnbkKvbdpfDeUWAh +EPDKjvbdjAQHApGj +DoCkKvbdaSGChTfL +DoDKjvbdiHJbxvKV +EPDLKvbdlhdURUqa +EPCjjvbdIwsahMRQ +EObjjvbdGYtuBEYC +DncLKvbdNeEThhkE +EObkKvbdBvzdIePv +EPCjjvbdbAueFpQX +EOcLKvbdjAQGaQGj +EPCjjvbdNHDQNPuL +DncLKvbddoFSkUUS +DncKjvbdACqxJzIp +DnbkKvbdxLWcgzyf +EPCkKvbdTlVnaWPJ +DoCkKvbdCJKbLIfK +DoCkKvbdDwxMUTtM +EPCkKvbdEPDLKwDE +EOcLKvbdTvMQKTaR +EOcLKvbdeXytTrFz +EPDKjvbdNUrrLNAX +DnbkKvbdZjShPgBf +EObjjvbdjAPfaQGj +EPCkKvbdYlRdUNlN +EPDKjvbdzjUoocsU +DoDLKvbdKDKCqJbx +EPCjjvbdQvnECkhD +DnbkKvbdGckVjBij +EObjjvbdXmqAXuVt +EPCjjvbdeFPRavcK +DoDKjvbdEYXlUTsl +DoCjjvbdXrlBNToY +DoDLKvbdrRuLNkAm +DncLKvbdDxXlUTtM +EOcKjvbdwuNEqZLn +EPDKjvbdEOcLLWbd +DoCkKvbdpfDdtVaI +EOcKjvbdmpZyVjyC +EOcKjvbdtSrSxzFD +EObkKvbdsBemLfjy +DoCjjvbdUGznMWue +DncLKvbdbAvEfPpX +DnbjjvbduCcUwVno +DoDLKvbdTppoUuIN +DncKjvbdYqMeImEq +DoCkKvbdrDdhomvB +EObjjvbdgFkzOGgA +EPDKjvbdSwjkmzjx +DoCjjvbdREDBPpcr +EObjjvbdYkrDtNlN +EObjjvbdZisHogCG +DncKjvbdUtMselWK +DoDKjvbdkHfkeemk +DncLKvbdSLYeuHLT +EOcLKvbdeFOrBwCj +EObjjvbdHDjvKCJj +DnbkKvbdkIGkeemk +DoCkKvbdZQmFJMeR +DoCkKvbdqTtGrSKt +DncLKvbdcIljKfWx +DnbjjvbdRjxfUgKs +DnbkKvbdhyuFlROG +EObkKvbdpxoHfpdY +DoDKjvbdhuZdwRtb +DnbkKvbdBdQAvKMf +DoCkKvbdVTlsekuj +EObkKvbdCJLBkIfK +EOcKjvbdmgFYNNgZ +EPDLKvbdxrnImRag +DoCjjvbdbKlGPODA +DoCjjvbdMoxRVmgT +EPDLKvbdKfGIBaRV +DoDKjvbdSCEElJZL +EPCkKvbdmRxtzSdJ +EPDKjvbdjKGIKNXr +DnbkKvbdlhdTptrB +EPDKjvbdBcoaVilf +EPDKjvbdRzKIScWA +EOcKjvbdnHFXmOGy +EPCjjvbdFfJrNhtR +DnbkKvbdzaAPHHCM +DnbkKvbdwXLaWBWV +DoDKjvbdKeegaaQu +EPCjjvbdRotHKFcw +EOcKjvbdnGeXmOGy +DoCjjvbdmIdTqVRa +DncLKvbdfNGWgMik +EPCkKvbdrovPJbuf +EObkKvbdEvYpPljF +DncLKvbdOYPVzdOU +EObjjvbdrzLosAhO +DnbjjvbdyzdnSIJI +EOcLKvbdIsZArmYM +DoDLKvbdvAdZTPEh +DoCkKvbdQvnDcMHc +EObjjvbduMYWaUBX +DncKjvbdUyHszLOn +EPCkKvbdbrbjscia +EObjjvbdTkunaVni +EObkKvbdeATpmYKG +EOcKjvbdqUTfqrLU +EPDLKvbdGYttaDxC +EPDKjvbdRNYByNtz +DncLKvbdADRwizJQ +DncLKvbdKfFgaaQu +EPDKjvbdxZhGGYFS +DncLKvbdwtmFRYlO +EOcLKvbdehLVrNqH +DnbkKvbdKxpirztf +DoCjjvbdZxdKNcLr +DoDLKvbdrbFmMGjy +DoDLKvbdqYnhHQcx +EPCjjvbdGKeTDIMu +EPCjjvbdZRNEhleR +DnbkKvbdfMfXGmJk +DnbjjvbdRjyGVHKs +EPDKjvbdZHXEAOri +EObjjvbdxnTIYTIc +DnbjjvbdTpqOttgm +EOcLKvbdWXIwuceH +EOcLKvbdzROmJKXA +EPCkKvbduCbtwWOo +DncLKvbdJTZBTMwl +EObkKvbdlqyUysDi +DnbjjvbdrpVoJcWG +DoCjjvbdHDjvKCKK +EObkKvbdVwJXvDeH +EPDKjvbdZsiJZDrn +DoCkKvbdhfjDYvJu +DoDLKvbdZyEJmcLr +DnbjjvbdmajXXoOV +DoCkKvbdelewGmKL +DoDLKvbdUtMsfMVj +EOcKjvbdegjuqmpg +DnbkKvbdZMRctNkm +DncKjvbdhlEdOUcZ +DoDLKvbdqAiFAXIE +EObjjvbddBsMrAUN +EPDKjvbdaSGDHtGL +DnbjjvbdbVCGwjtI +DncLKvbdzdzOzeZp +EPDKjvbdKQyePFnF +EPDLKvbdauBgXjtI +EPDLKvbdCSaCtGWr +DnbkKvbdbsCjtEKB +DoDKjvbdCWzdIeQW +EPCkKvbdRbDeLhxk +EObjjvbdOEctJIkE +DoCkKvbdSPtGiedX +DncKjvbddZyPxZRC +DnbjjvbdTukpKUBR +DoCjjvbdpstHRqkU +DncKjvbdNdctIhjd +EOcKjvbdUWMPjTaR +DoCkKvbdLGGHbApu +EObjjvbdmozZWLZC +EObjjvbdULvPAvOi +EPDLKvbdcJMikFvx +DncLKvbdjJfHjMxS +EPCjjvbdqYoIHREY +DoCjjvbdiifHjNXr +EObkKvbdZLrETnMN +DnbkKvbdtSqsYydc +EPDLKvbdCIkCLJFj +DoCkKvbdliDsqUrB +DnbkKvbdNPxQumgT +EPDKjvbdACrYJyiQ +EOcLKvbdYTMBMtOx +DoDLKvbdNGcQNPtk +DncKjvbdtbbtvuno +DncKjvbdZLrEUNlN +DoCkKvbdaogHELzd +DoCjjvbdgFlZmfgA +EPCjjvbdvPTzpkOt +DoCjjvbdjKGHjMxS +EPDLKvbdauBgXjsh +EOcLKvbdiBoCeWpq +EObkKvbdSPsfjGEX +DnbkKvbdzGxlAMeX +DoDLKvbdqFcdtWAh +EPCkKvbdOYOuzcmt +DoCjjvbdDwxLtUTl +DnbkKvbdOTUVgFUp +DnbkKvbdiGibyWJu +EPCjjvbdUyITzLOn +DoCkKvbdbLMFnnDA +DoCjjvbdDwxLsssl +DncLKvbdBiLBjhfK +EPDKjvbdNPwpvOGs +EObkKvbdzQnliKXA +DoCjjvbdeYZssqez +DoCjjvbdeATplxKG +EOcLKvbdRyjIScWA +EPDKjvbddeOqbWcK +EPDLKvbdACrXjZhp +DnbjjvbdmuVZkKSG +EPDKjvbdVqmwbFLc +EPCkKvbdCSaCtFwS +DnbjjvbdVZHszLPO +DoDKjvbdVrNxCFLc +EOcKjvbdegjuqnQg +EPCjjvbdZMSETmlN +EOcKjvbdHDjvKBjK +EPCkKvbdyOTIXsJD +DoDKjvbdnQZyWKxb +DncLKvbdxwhiaozL +DncLKvbdNdcshhkE +EPCjjvbdXnRAYUut +DoDLKvbdNsUWGeUp +DncKjvbdWHwuwfxz +DnbkKvbdRpUGifEX +DnbjjvbdEOcLKwCd +EPDKjvbduaEYsOeI +DnbkKvbdjhHLfFnL +DncLKvbdZoOJEeZj +EPCkKvbdEPCjjvcE +EObjjvbdxUldqYkn +EObkKvbdOEdThiLE +DnbkKvbdjcMKpgVH +EObjjvbdkIGkeenL +DncKjvbdZsiJZDrn +EPCkKvbdxnShXsIc +DoDKjvbdZnmiEdzK +DoCkKvbdVTmUGLvK +EOcLKvbduCcVXVno +EObjjvbdZQleJNFR +EObjjvbdFejRmhsq +EPDLKvbdaMkBruNH +DoCkKvbdNQXqWNgT +DoDKjvbdjuwNcbXw +EPCjjvbdSBceLiYk +DoCjjvbdMgColpVL +DoDLKvbdVZHtZkPO +DoDKjvbduMYXBUAw +EPDKjvbdNeDshiKd +DoDKjvbdTAFJICPE +EObjjvbdJvVFceGi +EObjjvbdNHCpMpUk +DnbkKvbdijGIKNYS +DoDLKvbdDncKkXCd +DncKjvbdkMakyeGo +EObkKvbdjKFgilwr +DoCkKvbdOhAXyAZB +DoCkKvbdUGznMWvF +EOcKjvbdRosfifEX +EPDLKvbdfNFvgMjL +EObkKvbdxxJJbPzL +EPCjjvbdQlxCYmtz +EOcLKvbdgPazwEXh +DoDLKvbdkySrTYft +DoDLKvbdhgKDYuiu +DoDKjvbdYkrETmkm +EObjjvbdNPwpunHT +EOcLKvbdYlRdUNlN +DnbkKvbdZLrDtOLm +EObjjvbdxrnJMrCH +EObjjvbdZnnIeFZj +DoCjjvbdzRPMhiwA +DncKjvbdssSSxyeD +EOcLKvbdjAPgAofj +DncKjvbdRosfifEX +DoDKjvbdEXwktUTl +DnbjjvbdWRmwadkc +EPDLKvbdeEoRavbj +DoDKjvbdXsMBNToY +DnbkKvbdVqmxCFLc +EOcKjvbdkVwOEBww +DoCjjvbdfNGXGmJk +EOcLKvbdmtuZjiqf +DoCkKvbdnPyyWKyC +EObjjvbdJpydoGNe +DnbkKvbdjJfHimYS +DoCkKvbdyXhjBozL +DoCjjvbdkIHLeenL +EOcLKvbdTAEiIBoE +DnbkKvbdvBDxsPFI +DncKjvbdlhdTpuRa +EObjjvbdFfJqmiUR +EPCjjvbderAvzkbo +DncLKvbdwygeexEr +EObjjvbdSBdElJZL +EOcKjvbdySmiMrBg +EPDKjvbdatbGwkTh +DncKjvbdnBivwnmu +EPDKjvbdFxuVAdYC +EPDLKvbdqlzJyMHi +EPDKjvbdZRMdhldq +DoCjjvbdNeDtIhkE +DoCkKvbdfMewGlik +EOcLKvbdhaoDEwQq +DnbjjvbdIwsagkqQ +DncKjvbdkIHMGFnL +DoDLKvbdGdKuibKK +DnbjjvbdTAEiICOd +DncLKvbdNeEThiKd +EObkKvbdYpmEiNFR +EPDLKvbdFkFTDHlu +DoCkKvbdkDLkRHUg +DnbkKvbdyYIjCPyk +DncLKvbdFVyQPmKF +DnbjjvbdZQldhldq +DoDKjvbdVqnYBdkc +EPDKjvbdSKxeuGkT +EPCjjvbdiZuGLqNf +DnbjjvbdJTZArmXl +DnbkKvbdyNrgwrhc +EOcLKvbdrNZiyLgi +DncKjvbdSBdFMJZL +EPCkKvbdfMfWfmKL +EPDLKvbdfMevfljL +DoCjjvbdmIcsqVRa +DoDLKvbdrEEhpOVa +EPDLKvbdZRMeImEq +DoDLKvbdyTNiMrBg +EPCjjvbdsQVnibvG +EOcKjvbdvBDxsPFI +DoDKjvbdqquKnKaN +DncLKvbdqGDeTuaI +EPCkKvbdZdxGzgiC +DoDKjvbdkDLkQftg +DoDKjvbdePEsKtUS +DoDKjvbdUxgtZjoO +DncLKvbdxUmFRYlO +DnbjjvbdwuMeRYkn +DoCkKvbdRWmdClID +EPDLKvbdCDpBWJlf +DncKjvbduaEYrneI +DnbjjvbdfHkVqmpg +EPDKjvbdKxpirzuG +DoDLKvbdZLqdUNkm +DoDLKvbdDwxMTstM +EOcKjvbdrzLosAhO +DnbjjvbdqZPHgQdY +EObkKvbdjggMFfNk +EPCjjvbdZMRcsmkm +EObjjvbdEJgiuxKA +DncLKvbdZtJJZDsO +EObkKvbdRjxeuGkT +DncKjvbdqdFJPmua +DoCkKvbdGYtuAcxC +DoCjjvbdZnmheEzK +DoCkKvbdKWUfEFGi +DoCkKvbdfMfXGmKL +DnbjjvbdjvWmcbXw +DnbkKvbdyzeORhJI +EPDLKvbdpstHRqjt +DoDKjvbdTukpKUAq +DoDKjvbdSPtGjFcw +DncKjvbdWSNxCFMD +DnbkKvbdjlalZdgP +EOcLKvbdkxsRsYgU +EObjjvbdLFfICApu +DoDKjvbdCEQBWKMf +DoDKjvbdbAvFFpQX +DoCkKvbdhgKCxvKV +DncLKvbdjcMLQgVH +EPCkKvbdzitpQDrt +EOcKjvbdNVTRjmAX +EPDKjvbdkxsRsZHU +DoDKjvbdKDJcRKCx +EPDKjvbdFjeScHmV +EPCkKvbdZjTIQHBf +DnbkKvbdlqyUyrdJ +DoDKjvbdehKurORH +EObjjvbdbKlFoODA +DoCkKvbdwtmFQyMO +DoCjjvbdXnRAYUut +DoDKjvbdxsOIlqbH +DncLKvbdyNsIXrhc +DoDLKvbdCEQAvKNG +DncKjvbdRotHJedX +EPDLKvbdVZHsyjoO +DnbjjvbdkCkkRHVH +DoDKjvbdRWmcblHc +DncLKvbdqvokbiYq +DoDLKvbdRkZGVHLT +EObjjvbduCbuXVno +DoCkKvbdEJgivYKA +DoDKjvbdkWWnDbYX +EPDKjvbdnGdxMmfy +DoDLKvbdIHGzYxYH +DoDKjvbduCbtwVno +EObkKvbdqlyjYkgi +EObjjvbdVwIwudEg +DnbjjvbdfRaWzkcP +EPCkKvbdEARhlzXX +DnbkKvbdfMevfmJk +DncLKvbdZyDjNcLr +EOcKjvbdtAHQhABS +DncKjvbdkClKqGtg +DoCkKvbdEObkLXCd +EObjjvbdFkFTDINV +EOcKjvbdEztQdkcJ +DoCkKvbdKaLHNBxR +EPDLKvbdhaoCdvqR +EObkKvbdrJAJdmOe +EObjjvbdrpVnjCuf +EPCkKvbdFjeTCglu +DoCjjvbdqdEiPnWB +EPDKjvbdGFirOJUR +EPCkKvbdJmADzHUa +EPCjjvbdWWhwucdg +DncLKvbdBhkBjiFj +DoCkKvbdSZihSbvA +DncKjvbdZtIiZETO +EPDLKvbdCTAcUGXS +DoDKjvbdVqmxCFLc +DncLKvbdmajWwoOV +EPDKjvbdVhYVxHYz +DoDLKvbddoFSjtTr +DoDLKvbdrzMQTAgn +DoCjjvbdUVlPjUBR +EPDLKvbdtvOXipsA +DoCjjvbdrouoKCvG +EObkKvbdOSsufdtp +EPDLKvbdIGfzZXxH +EObkKvbdbQGgDkzd +DoCkKvbdOFDtJIkE +EPCjjvbdiHJbyWJu +DnbjjvbdLAkHMaxR +EPCkKvbdJTZBTMwl +DncLKvbdSQTfjGEX +EOcLKvbdlrZVZrci +EObjjvbdkyTSTZHU +EPCjjvbdxUleQxkn +EPDLKvbdEKIKWYKA +DoCkKvbdZHWdAPSi +EPDLKvbdxVNFRZMO +EPDLKvbdcSbkTcjB +DoCkKvbdlYsSTZGt +EPDKjvbduaDxroFI +EObkKvbdNHDQMouL +DoDLKvbdxrnJMqbH +DnbjjvbdmfeXmOGy +DoDKjvbdidkGtoAO +DnbjjvbdGYtuBEXb +DnbjjvbdRECaQQdS +DoCkKvbdmajXXnnV +DncKjvbdZMSEUNlN +EPCkKvbdZtJIxcrn +DncLKvbdJpydneme +DncKjvbdVviYWEEg +DoDLKvbdyXhjBoyk +DoCjjvbdbhlikGXY +DnbkKvbdVviXudFH +EPCkKvbdYTMAlsnx +EPCjjvbdxZhFeweS +DoCjjvbdyNsIXriD +DoDKjvbdznoqEcMY +DnbjjvbdauCHXjtI +DncKjvbdIsZAsMwl +EPCkKvbdZMSDtOLm +DnbkKvbdJqZePFme +EPDKjvbdkHfkeenL +DoDLKvbdaNLCStmH +DncLKvbdIwsbHkqQ +EObkKvbdfHjvRnRH +EPCjjvbdlqyVZsDi +EObkKvbdEuxoolie +DoDKjvbdjAPgAofj +EOcLKvbdjcMLRHVH +DncKjvbdjKFgjNXr +EPCkKvbdmIctQuRa +DncLKvbdJpyePGOF +DncLKvbdNGbpMouL +EObkKvbdpfDdsuaI +EPCjjvbdyzeORhIh +DoDKjvbdrDdhpNua +DoCjjvbdFfKRmhtR +EPDLKvbdpfEEsuaI +EPDLKvbdqcdhpOVa +EPCjjvbdVYgsykPO +DoDLKvbdDncLLXCd +EObkKvbduaEYroEh +EOcLKvbdkNBlZeHP +EObjjvbdGcjvJajK +DncLKvbdrpVoJbuf +EObjjvbdEKIJuxKA +DncKjvbdZxcjODMS +DncLKvbdmgFXmOGy +DoCkKvbdUMVoAuoJ +DoDKjvbdqcdiQNua +DnbkKvbdbrcKtDia +DnbkKvbdKfFgbApu +DncKjvbdezvZEiTw +DnbkKvbdlqxtzSdJ +DoCjjvbdOTUWGeUp +EPCkKvbdJXtBhMQp +EOcLKvbdOAJTTjSA +EOcKjvbdfILVrNpg +EOcLKvbdnQZxvLZC +EPDKjvbdyYJJaoyk +DnbjjvbdkMakzFHP +DnbjjvbdjbkjpfuH +DoCkKvbdgGLymfgA +DoDLKvbdJYUBhLpp +EPCjjvbdJSyBTMxM +DnbjjvbdyTNiMrBg +DnbkKvbdqYoHfpdY +EOcKjvbdZyEKNcLr +DoCkKvbdZtIiYcsO +EPCkKvbdZQmFJNFR +DncKjvbdSPsgKFdX +DoCjjvbdvwMAuaWV +EPDKjvbdHfgZxxYH +EObkKvbdrSUjnKaN +DnbjjvbdKWVGEFGi +DncKjvbdsPvOjDWG +EPDKjvbdhzVFkqOG +DoDKjvbdssSSyZdc +DoDKjvbdYkqcsmlN +EPCjjvbdYpldiNFR +DncLKvbdemFwGlik +DoDLKvbdjuvmdBxX +DoDKjvbdCTBDTewS +DoCkKvbdKeehBaQu +EObkKvbdwyhFexEr +DoDKjvbdQvmccMID +DoDKjvbdVviYVceH +EPCkKvbdmRxtyrdJ +EPDLKvbdYqMeJNFR +EPCkKvbdRbDeMIxk +EPCkKvbdcJMjKfXY +DnbkKvbdVwIwvDdg +DnbjjvbdIwtCHkpp +DncLKvbdczYpYYqC +EPCkKvbdKaLGmBxR +DncKjvbduLwwAsaX +DncLKvbdssRrxzEc +EObjjvbdrXQMCiZR +DnbkKvbdZRNFImFR +EOcKjvbdACqwjZhp +DnbjjvbdbKlGOmcA +EObjjvbdGFirOJUR +EPDLKvbdqvokbiYq +EOcKjvbdJmAEZgUa +DoCkKvbdbhljKevx +EPCjjvbdbKlGPNcA +EOcKjvbdRMxByOUz +EOcKjvbdbsDLUEJa +EPCkKvbdRacdlJZL +EObkKvbdmuUyjjSG +EObkKvbdjKFgjNXr +DoDLKvbdlhctQuRa +DoCkKvbdjKFhKMxS +EObjjvbdpedEtVaI +EOcKjvbdIwtBhLpp +DnbjjvbdZHWdAPSi +EOcLKvbdiLdcmuCy +EOcLKvbdjcMLRGuH +EPCjjvbdRbDdkiZL +EOcKjvbdiHJbxvKV +EOcLKvbdaSGDHsfL +DoCkKvbdjKFhJlwr +DncKjvbdiBoCeWqR +EOcLKvbdegjvSNpg +EOcLKvbdrbGMlHLZ +DnbjjvbdBraDUGXS +DncLKvbdFeirOIsq +EPDLKvbdhytekpmf +EOcKjvbdIsYaTMwl +DnbkKvbdrSVLOKaN +DoCkKvbdTIyjRABM +EOcLKvbdsBfNMGkZ +EPDLKvbdUtNTfMWK +EObkKvbdRjxeuGjs +EObkKvbdTqQnuVIN +EObjjvbdhuZdwRuC +EOcLKvbdqTtHSSKt +DncKjvbdmpZxvLZC +DoDLKvbdlAloNALA +EPDKjvbdiLddOUby +EPDLKvbdwuMdpxlO +DncKjvbdNrsvHEuQ +EPCkKvbdyOSgxTJD +EOcLKvbdIryArlxM +EPDLKvbdZHXEAPSi +EPCjjvbdSCDdlIxk +EOcKjvbdySnJNSCH +DnbjjvbdijGIKNXr +EPDKjvbdVAaqTRSZ +EObjjvbdkxsSSxft +EPCkKvbdnUtzKiqf +EPCkKvbdlqxuZsEJ +EObjjvbdEXxMUUUM +EPCkKvbdLFfIBaQu +DnbjjvbdrRtkNjaN +DoCjjvbdNHCpMpUk +EPDKjvbdZjTIQGaf +EPCkKvbdHELWJbKK +DoDKjvbdJbibpjCx +DnbjjvbdJSyArmYM +EPCjjvbdfNFwGmJk +EOcLKvbdYTMBMsnx +DoDLKvbdyTOJMqbH +EObjjvbdEPDLLXDE +DncLKvbdkyTSTZGt +EObjjvbdGBPRYizm +DoCkKvbdVviXvDeH +DncKjvbdsQWOicVf +DoCkKvbdfHjvSNqH +DncKjvbdlZTSSxft +DncKjvbdFVyPolie +EPCjjvbdRXODblID +DoCjjvbdlhcsqVSB +DncLKvbdqYnhGqDx +EObjjvbdFeiqmiUR +DnbjjvbdKefHaaQu +DoDKjvbdRNXbYmtz +EOcKjvbdNwnuzcmt +DoDLKvbdXFxytAPT +EPDLKvbdOTUVfdtp +DoCjjvbdraelkfkZ +DncKjvbdXsMAltPY +DoDKjvbdVUMsfLuj +EPDLKvbdZisIPfbG +EPDKjvbddZxpYYqC +DnbkKvbdzjUopESt +DnbkKvbdVUMtGMVj +DncLKvbduCbtwWOo +EObkKvbdaaVeFpPw +DncKjvbdKNADzGta +DncKjvbdeEoSCXCj +EObjjvbdhancEvqR +EObkKvbdKCicQibx +DncLKvbdijGHjMwr +DoCkKvbdziuPpETU +DoCjjvbdiBnbeXRR +DoCkKvbdZQmEiMdq +EObkKvbdrMyjZMHi +EOcKjvbddoErkTtS +DoCkKvbdtkwvaUAw +EPDLKvbdTlVnaVoJ +DncKjvbdfHjurOQg +DoDLKvbdWWiXvEEg +EPCkKvbdqdEhpNua +EOcLKvbdYSkaMtPY +EPCkKvbdxmsHxTIc +DnbjjvbdJqZdnenF +EPDKjvbdWexzUAOs +EOcLKvbdrovPKCuf +DoDKjvbdkxsSSyGt +Dnbjjvbdzdynzdyp +EOcLKvbdHEKvJbJj +EObjjvbdOStWHEuQ +DnbjjvbdkyTRsZGt +DoCkKvbdcJNKKevx +DoDKjvbdSPtGifDw +EObkKvbdGdLVibKK +DnbjjvbdbBVdfPow +DncKjvbdhtyeXSVC +EPDLKvbdptTfrSLU +DncKjvbdjvXODaww +DncKjvbdqZOgfqDx +DncLKvbdTJZjRABM +EOcLKvbdTpqPVUhN +EOcKjvbdRWmdClID +DoCjjvbdqquLOLAm +DoCjjvbdFfJqmiUR +EOcKjvbddBsMrATm +EOcKjvbdYzcFrKVy +EPCjjvbdsZlQSaIO +EPCkKvbdkHfkeenL +EOcKjvbdiHJcYuiu +DoDKjvbdCEPaVilf +DoCjjvbddBrmSAUN +EPDLKvbdSPtGifDw +EOcLKvbdAMhYrvyx +DncLKvbdTIyjRAAl +EOcLKvbdZtIhyESn +DnbjjvbdVUNUFlWK +EOcKjvbdyXiJaoyk +EPCkKvbdDncLKvbd +EOcLKvbdKWVFcdgJ +EPDKjvbdnQZxvKyC +DncKjvbdjJehJlxS +DoDKjvbdRkYfVHKs +EPDLKvbdirzhsLJz +EObkKvbdVUMtFkuj +DnbjjvbdqwPkbiYq +EPCjjvbdIGfzZYXg +DoCkKvbdlYsRryGt +EObjjvbdpfDeUWBI +EOcKjvbdwtldpxkn +DoCkKvbdzitopETU +DoDKjvbdJuuGEEfi +DnbkKvbdnPzZVkZC +EOcKjvbdmfeYMnGy +EPDKjvbdkIGlGGNk +DncKjvbdezvZEhtX +EPDKjvbdqqtjmkAm +EPDLKvbdzRPNIiwA +DoCkKvbdGKeSbgmV +EPDLKvbdmJETqVSB +EPDKjvbdbVCGwkTh +DoCjjvbdBhkBkIej +EOcLKvbdbBWFFopX +DncLKvbdjggLfGOL +EPCkKvbdzQnmIiwA +EOcLKvbdhbPDFWpq +EPDLKvbdkClLQgVH +EObkKvbdrWpMChyR +DncKjvbdMfbpNPuL +DnbjjvbdNsUVfeVQ +EOcKjvbdaRfDHtFk +DoDKjvbdRbEFLhyL +EOcKjvbdmIcsqUqa +DncKjvbdFVyPpNJe +DoCjjvbdLAjgMaxR +EOcLKvbdypoNJKXA +DncLKvbdEztRFMCi +DoCkKvbduVmwiqTA +EObkKvbdUyHsykPO +DoCkKvbdhzUfLqNf +EPCjjvbdiUzEvqtb +EPDKjvbdpfDeTuaI +EPCkKvbdSwjkmzjx +DncLKvbdjKFgjMwr +EOcLKvbdRWnECkhD +EOcKjvbdZoOJFEyj +DnbkKvbdvvlAvAvV +DncKjvbdZLqcsmlN +DncKjvbdyqOliJwA +EPCkKvbdKWUedEfi +DoCkKvbdePEsLTtS +DnbkKvbdtcDVXVoP +EPCjjvbdKCjCpicY +EObkKvbdZdwfzhJC +EPDLKvbdBhjajiGK +EOcKjvbdJXsahMRQ +DoCkKvbdZxdKNcLr +EPDKjvbdnBjWwoOV +DncLKvbdapGgDkzd +EPDKjvbdjmCLzEgP +EPCkKvbdWRmwbFMD +DnbjjvbdBdQAujMf +EObkKvbdzjUpPcsU +DoDLKvbdwtmFQyMO +DoCkKvbdiMEcmtby +DncKjvbdSBcdkiYk +EPCkKvbdfSBWzkbo +EOcLKvbdxVMeRZLn +DnbjjvbdCSaDUGXS +DncKjvbdZtJIyETO +EPCkKvbdTkvOaVni +DnbkKvbdkySqsYft +EPCjjvbdxsOJMrCH +EPCjjvbdCWzdJEov +EPCjjvbdEARiMywX +EObkKvbdxsNiNSCH +DncLKvbdhbPDFWqR +EObkKvbdVUNUFlVj +EObjjvbdXrlBNToY +EOcLKvbdfHjvSOQg +EPCjjvbdwWkaWAuu +DncKjvbdbKlFnnDA +EPCkKvbdRkZFuGkT +EPCjjvbdMowpvNfs +DncLKvbdmtuZjjSG +DnbkKvbdiCPDEvqR +DncLKvbdbAudfPow +DnbjjvbdFjeSbhMu +DncKjvbdSQTfjGEX +EPDKjvbdbAueGQQX +DnbkKvbdjKGIJmXr +EOcKjvbdIryBTNYM +EPDLKvbdmgEwlnGy +EObjjvbdSBdEkhxk +DoCjjvbdfMfWgMjL +EPDLKvbdEObjjwCd +EObjjvbdhzUekqOG +EObjjvbdWSNwbElD +DoDKjvbdrNZjYkhJ +DoCkKvbdRkYfUgKs +EObjjvbdczYpYZRC +DoCkKvbdzoQQeDMY +DncKjvbdFxuVBEXb +DoDKjvbdSiZjRABM +DoDLKvbdYzbfRivZ +EPDLKvbdlqyUyrdJ +EOcLKvbdtbbuWvOo +DncKjvbdSKxfVGkT +DoCjjvbdEXxLtUTl +EOcLKvbdEPCjkWbd +EPDLKvbdEObkLXDE +EPCkKvbdxKvdHzzG +EPDKjvbdpfDdtVaI +DoCjjvbdbAueGPpX +DoCjjvbdZMRdUOLm +DoDLKvbdwtmFRYkn +DoCjjvbdNPwpumgT +DoCkKvbddijSWUzn +DoDKjvbdJXsbHkqQ +DnbjjvbdxZhFexEr +DoCjjvbdSQUHJedX +EPDLKvbdjmCMZdgP +DncLKvbdMfbomPtk +EOcLKvbdqTtHRqjt +EPCkKvbdqceIpNvB +DncLKvbdFxtuBDxC +EPCkKvbdxVNEpyLn +EOcKjvbdYzbeqivZ +DoCjjvbdNdcsiJLE +DoDKjvbdzjVQQDsU +EObjjvbdvBDySneI +DoDKjvbdBhjbKhej +EPDLKvbdWSOYBdlD +EOcKjvbdOYOuzcnU +EPCkKvbdkCkkQgVH +DnbkKvbdtlXwBTaX +DnbkKvbdTppoVUgm +DoCjjvbdQmXaxnUz +DncKjvbdkHfkfFmk +EPCjjvbdmgEwlnHZ +EPDLKvbdZdxGzhJC +EPCkKvbdmIdTqUqa +DoDKjvbdzGyMAMeX +DnbkKvbdTppnuUhN +DoCjjvbdSLYfUgLT +DnbkKvbdZsiJZETO +EObkKvbdNUrqjmAX +EObjjvbdZyDimcLr +DoCkKvbdRDbaQRDr +DnbjjvbdbAudfPow +EPDKjvbdZjTHpGaf +DoDKjvbdqwQLcIxq +DnbjjvbdZLqdTmkm +DoDKjvbdyXiKCPzL +EObjjvbdssSTYyeD +DoCjjvbdddoRawCj +DoCjjvbdkMbLydfo +DoCjjvbdVTmUFkvK +DoCjjvbdhyuFkpmf +EObkKvbdlYsSSyGt +EPCjjvbdtvNxKQsA +DoDKjvbdRpTgKFdX +EObjjvbdjbkkQgVH +DnbjjvbdaNLCStlg +EOcKjvbdDxYLsssl +DoCjjvbdfNFvgMjL +DncLKvbdrovPJcWG +DnbkKvbddoFSjssr +DnbjjvbdSQTgKGDw +DoCjjvbdQvnEDLhD +EOcKjvbdUxhUZkOn +EPCjjvbdEzsqFMDJ +DoDKjvbdGdKuiaij +EOcKjvbdxrnJMrCH +DnbjjvbdUWMQJtBR +EObkKvbdEKHivYKA +EPDLKvbdYSlAltOx +DnbjjvbdbVCHXjtI +DnbkKvbdtkwwAtBX +DoCjjvbdZQleJNEq +EPDKjvbdEPCjjvcE +EPCjjvbdCSaDUFwS +EPDKjvbdHELViajK +DoDLKvbdijFgjNXr +DncLKvbdjmCLydfo +EObkKvbddZyQXxqC +DnbkKvbdySnImSCH +EPCjjvbdqmZjYkgi +EPCjjvbdGFirNiTq +DoDKjvbdRXNdDMID +DncLKvbdMfcQNQUk +EOcLKvbdZdwfzghb +EPDLKvbdULuoBWOi +EObjjvbdFyVUaDwb +DoCjjvbdNQXpumfs +DnbkKvbdrWolDIxq +EPCkKvbdBvzdIeQW +DnbkKvbdfIKuqmpg +EOcKjvbdnBiwXoNu +EObjjvbdiHKDZWKV +EPCjjvbdZLqdTnLm +DoCjjvbdlYsSTYgU +EPDLKvbdsBfNMHKy +DnbkKvbdjuvmdCXw +EPDLKvbdRDcBQQdS +EOcKjvbdySmhmRbH +EPDLKvbdbrbjscia +EPDLKvbdkxrrTZGt +DoDKjvbdcJMjLGWx +EPDKjvbdKeegbBQu +DnbjjvbdvPTzqKoU +EOcLKvbdIidAKPgE +DoDLKvbdVrOYBdkc +EObjjvbdeFOqawDK +EOcLKvbdZRNEhmFR +EObjjvbdKfFgbBRV +DoCjjvbdiLeEOVCy +EPCkKvbdqmZjYkgi +EPDKjvbdHffyxxXg +EPDKjvbdZLrDsmlN +DnbjjvbdTkuoBVoJ +EOcKjvbduDDUvvOo +DoDKjvbdZdwfzhJC +EPCkKvbdfMfWgNKL +EPCjjvbdRXOECkgc +EOcKjvbdMowpvNfs +DoDLKvbdiBoCeWpq +EObkKvbdNwoVzdOU +EPDLKvbdDoDKjvbd +EObjjvbdLFehCBRV +EOcLKvbduCcVWuno +EOcKjvbdXsMBMtOx +DnbkKvbdcIljKewY +DoDLKvbdEzspdkcJ +DncKjvbdqcdhomua +EPDKjvbdiifHjNXr +EObkKvbdVqnXbFLc +EPCkKvbddwyssrFz +DncKjvbdrSVKmkAm +EPCjjvbdTlVoBVni +EObjjvbdOhAYZAYa +EPCjjvbdRadEkiZL +DoCkKvbdSCEEkiYk +EObjjvbdGZVVAcxC +DnbjjvbdZyEJnDMS +EOcKjvbdzitoodSt +EPDKjvbdXFxzUAPT +DnbjjvbdziuQQESt +EPCjjvbdEARhmZvw +DncLKvbdatbHXkTh +DncKjvbdbsCjtDjB +EPCjjvbdKWVGDdgJ +EPDKjvbdrafNLfkZ +EObkKvbdFkEsChMu +DnbkKvbdVgxWXfxz +EObjjvbdJbjDRJbx +EObkKvbdwyhFfYFS +EPCjjvbdMfbpNPtk +EObkKvbdbsDKtDia +EPCkKvbdkxsRsZHU +DnbkKvbdvAdZTOdh +DncKjvbdptUHRrLU +DncKjvbdvPTzqKnt +DncLKvbdTppoUthN +DnbkKvbdrbFlkgLZ +EPCjjvbdGdKvJajK +EPDLKvbdACqxKZiQ +DoCkKvbdbPffckzd +DoCkKvbdhbOcEvqR +DnbjjvbduCcVWvOo +DoCkKvbdmuUzLKRf +EPCjjvbdbUbHYLUI +DoDKjvbdbKkeoNcA +DoCjjvbdcScKtEJa +DoCjjvbdyzdnRgiI +EPCjjvbdkIGlFfOL +EOcLKvbdzjUpPcsU +DoDLKvbdJuuGEEgJ +DncLKvbdTqROtthN +EOcLKvbdpstGqqkU +EPCkKvbdtSrTYzEc +EPDKjvbdezvYdiUX +DoDKjvbdtTRrxzFD +DoCjjvbdrovOjDWG +DoDKjvbdUQpoUthN +EOcKjvbdKDJbpicY +DnbjjvbdaSGCgtFk +DoDKjvbdGZVVAcwb +DnbjjvbdEvYopNJe +EObjjvbdSQTgKFdX +EPDLKvbdrXPkbhyR +DoDLKvbdhyuGMROG +DoDKjvbdzoQRFClY +EPCkKvbdKWUeceHJ +EObkKvbdZnmiFFZj +DnbjjvbdtcDUwVoP +DoCkKvbdjlakyeHP +EPCkKvbdBvzdIdpW +EPCjjvbddePRawCj +DoDKjvbdmfeYNNfy +DnbkKvbdSLYetgKs +DncKjvbdFejRnJTq +EPDLKvbdIGfzZXwg +DncKjvbdJvVFdFHJ +EOcLKvbdIHHZyYYH +EPDLKvbdyXhiaoyk +DoCjjvbdADSYJzIp +EObjjvbdNPxQunHT +EPCkKvbdxnTHwrhc +DncKjvbdTppnuVHm +EObkKvbdjlbLydfo +DoDLKvbdVBBpsRRy +DnbjjvbdACqwiyhp +DoCkKvbdZRNFJNEq +EOcLKvbdaRfDHtFk +DoCkKvbdKfFgbBQu +DnbjjvbddCTNSAUN +EPDLKvbdTfznMXVe +EOcKjvbdeOeSkUTr +DnbkKvbdqdEiPnVa +EOcLKvbdsBemMHLZ +DoCkKvbdNPxQvOGs +EPDLKvbdOTTufeUp +DncKjvbdraelkfjy +DoDLKvbdZoOIeFZj +DnbkKvbdptTgRrLU +DncKjvbdACrXiyhp +EPDLKvbdIGgZxwxH +DnbjjvbdZnmiEeZj +DnbkKvbdWRmxCFLc +DoDLKvbdyYIiaozL +EPCjjvbdOTTvGeUp +EPCkKvbdNUsSKmAX +EPCjjvbdDigiuwjA +DoDKjvbdIrxaTMxM +DoDKjvbdZyDimcLr +EPCjjvbdjbkkRHVH +DoCjjvbdWXJYVceH +EOcLKvbdlZTSSyHU +DncLKvbdwuNEqYlO +EPCkKvbdrpWPJbuf +DncKjvbdtbcUwWPP +EOcKjvbdGKeScINV +DncKjvbdZeXfzhJC +DncKjvbdUQqPVVIN +DoDKjvbdxsNhmSBg +DoDKjvbdURROuVHm +DncKjvbdRMwbYmtz +DoDKjvbdZRMeImEq +EOcLKvbdWHwvXgYz +EPDLKvbdIwsahMQp +EOcKjvbdfHkVrNqH +EObjjvbddjKSWUzn +DncKjvbdxwiJbQZk +EPCkKvbdMSWlzVQz +DoDLKvbdUQpnuUhN +DncLKvbdiCPCdvqR +DoCjjvbdapHHELzd +DncKjvbdyOSgwrhc +DoCkKvbdDxYLtUTl +EObjjvbdyfyMAMdw +EObjjvbdHffzYxYH +DoDKjvbdYzcFrKWZ +EPDLKvbddZyPwyRC +EPCkKvbdLhalRYAS +DoCkKvbdGYtuBEXb +DoCjjvbdrylQTAgn +DoCjjvbdbBVeGPpX +EPDLKvbdYpmFImFR +DnbkKvbdJcKCpjDY +DncLKvbdYTLaNUPY +DnbkKvbdeOeSjtTr +DoCkKvbdEYYLtTtM +EPCkKvbdrzLoraIO +DoCjjvbdKWVGDdfi +DoDKjvbdBhjbLIfK +EPCkKvbdNQYQvOGs +EOcLKvbduLxXBTaX +EPDKjvbdANHySwZx +DnbkKvbdeOdsLTtS +DnbkKvbdUsmTfMWK +DoDLKvbdcImJkGXY +DncKjvbdsPunibuf +DnbjjvbdIGfyxxYH +DoDLKvbdvBDyTOeI +EPDLKvbdGKeScHmV +EOcLKvbdqFceUVaI +DncLKvbdqdEhpOWB +DoDLKvbdTulPitAq +DnbjjvbdWXIwudEg +EPDLKvbdcTDKtDjB +DoCjjvbdgFlZnHHA +DnbkKvbdwuNEqZLn +EObkKvbdmRxtzSci +EObjjvbdjvXNdCYX +DnbkKvbdqGDdsvBI +DncKjvbdqdEhomvB +DoCjjvbdrpVoKCvG +EObkKvbdWHwvYHYz +EOcKjvbdrykoraHn +EPCkKvbdsPuoKCuf +DncKjvbdZjSgofaf +DncKjvbdNeETiIjd +DoDLKvbddoFSkTsr +EPCkKvbdkWWnECXw +DnbkKvbdZRNFIldq +EObjjvbdzjVQPdTU +DnbjjvbdhytelRNf +EOcKjvbdNPxQunHT +DoCkKvbdmuVZkJrG +EPCjjvbdUVlQJtBR +DoDKjvbdzitpQESt +DoCjjvbdraemLfkZ +DoDLKvbdkNBlZeHP +EObkKvbdrbGNMHLZ +EPDLKvbdkIHLeemk +DoDKjvbdbAvEeopX +DoDKjvbdiGjCxujV +EPCkKvbdqlzJxkgi +DncLKvbdVZITzLPO +EOcLKvbdVZITykOn +EPCjjvbdjuvnDaww +DoDKjvbdkVwOECYX +EObjjvbdcyxpXyRC +DnbjjvbdULvPAuni +DnbkKvbdOTUWGdtp +EOcLKvbdKDJcRKCx +EPCkKvbdBsBDUFwS +DncLKvbdQdDAopcr +EObjjvbdcSbjtEKB +DnbjjvbdlAloNALA +DoCjjvbdADSXizJQ +EOcKjvbdrpWOibvG +EObjjvbdIGfzZXwg +EPDKjvbdptUHRrKt +DncLKvbdZdwfzhIb +DoCkKvbdQZNAGrrK +DoDKjvbduCbtvuoP +EPCjjvbdJuuFceGi +EPCkKvbdgGLymgHA +DnbjjvbdcyyPxYpb +EPCkKvbdhuZeWquC +EObkKvbdyTNiNRbH +DoCjjvbdVAaqSprZ +DncLKvbdoznDkYPA +EPCkKvbdiUydvquC +DncLKvbdhytfMROG +DoCkKvbdmbKXYPNu +DnbkKvbdMpYQunHT +EOcLKvbdHkaznXQk +DoDLKvbdTvMPisaR +DoCkKvbdIryBTNXl +DoDLKvbdZLrDsmkm +DncLKvbdlhctRVRa +EPCjjvbdYkqcsmkm +EPCjjvbdEXwlUTtM +EObkKvbdEvZPoljF +EPDLKvbdZRNEiNFR +DoCkKvbdANIZTXZx +DncKjvbdZoOIeFZj +DoDLKvbdeJirWUzn +DoCjjvbdRWmdDLgc +DoDKjvbdACrYKZhp +EPDKjvbdMowpunHT +EOcKjvbdYTLaNTnx +DnbjjvbdQvnEClHc +DnbkKvbdSBceLhyL +DoDKjvbdjgflGGOL +EOcKjvbdYpldiMdq +DoCjjvbdrovPKDWG +DoDKjvbdZisHofbG +DoDKjvbdEOcLKwDE +EPCjjvbdhfjDZWJu +DncKjvbdhfjCyWJu +EOcLKvbdtSqsYzEc +DoDLKvbdbQHHELzd +DoDKjvbdySnImRbH +EOcLKvbdVqmxCElD +DnbjjvbdNdcsiJKd +EPCkKvbdkNBkzEfo +DnbkKvbdJKEAKPfd +DncLKvbdiifIJlwr +DnbjjvbdhtzEvqtb +EObjjvbdwWlAvBWV +EPDLKvbdlhctQuSB +EOcLKvbdNddUIiKd +EPDKjvbdJSxaTMxM +EPDLKvbdVrOXaeMD +DoDLKvbdGcjvKBjK +DncLKvbdqvpLbiZR +EPCkKvbdjKFgilxS +DncLKvbdDoCjjvbd +DoCjjvbdqqtjnKaN +EOcKjvbdBvzdJEpW +DoCkKvbdcarlrATm +DoDLKvbdQdCaQQdS +DncKjvbdVqnXadkc +DoCjjvbdJvUecdgJ +DnbkKvbdVYhUZkPO +EPDKjvbdxZgfFxEr +EPCjjvbdsPunicWG +DnbkKvbdmSYtyrdJ +DnbjjvbdTulQJsaR +DncKjvbdsrrSxyeD +DnbkKvbdzQnmJJwA +DncKjvbdatafxLTh +EOcLKvbdmfeYNNgZ +EObkKvbdNxOuzcnU +EPDLKvbdDwwksstM +EPDLKvbdxnTIYTIc +EPDKjvbdHgGyyXxH +EOcKjvbdGAnpyJzm +DoCkKvbdUQqPVUhN +DncLKvbdYgWdAOri +DoDLKvbdygZMANFX +EPCkKvbdrJAJdlne +EPDLKvbdZnmheEyj +DnbjjvbdIxUCHkpp +DnbkKvbdjJehJlwr +DoDKjvbdhlEdNuDZ +EOcKjvbdeOeSkTsr +EOcLKvbdVqnYBdlD +DoDKjvbdeATqMwif +EPCjjvbdrXQLbhyR +DnbjjvbdFkErbhMu +DoCjjvbdpxnhHQcx +EOcLKvbdrWpMDIxq +EPDKjvbdVhYWYGxz +DoCkKvbdwzIGFxFS +DoCjjvbdEztQeLbi +DnbjjvbdlZTRrxgU +DncLKvbdSZihSbvA +DnbjjvbdrzLpTAgn +EPCjjvbdNrsugFVQ +DnbjjvbdxUleQxlO +DncKjvbdtkwwBUAw +DoCjjvbdbBVdeoow +EPDKjvbdEObjkXDE +DnbjjvbdhgJbxvKV +EPCkKvbdIwtCHlQp +DoCkKvbdxmsIXrhc +EObkKvbddePSCXDK +EOcKjvbdVrOXbEkc +EOcLKvbdFVyPomJe +DoDLKvbdREDBPqDr +DncLKvbdaNLCStmH +DncLKvbdbAudfQPw +DoDKjvbdRaceLiZL +DoCkKvbdJYUCIMRQ +DnbkKvbdYkrDtOMN +DnbjjvbdFkFTChNV +EOcLKvbdZRMeImFR +EObkKvbdUxgszLOn +EOcKjvbdFjdsChMu +EObkKvbdrafNLgLZ +EPDKjvbdelewGmJk +EOcKjvbdZMRctNlN +DoDLKvbdliEUQtqa +DncKjvbdqUUHSRjt +EPDKjvbduCbtwVno +DoCkKvbdaaVeFoow +EPDLKvbdkClKqGuH +DoDLKvbdCflFgAzc +DoDLKvbdTAEhgbPE +EObkKvbdmtuZjjRf +EObjjvbdKDKCqJbx +DncKjvbdrovOjDVf +DoCkKvbdhtzFWqtb +DncLKvbdEvYpQNKF +EOcLKvbdeFPRavcK +DoDLKvbdhlEcnUby +DoCkKvbdegjvSOQg +DncKjvbdhbPCeWpq +DnbjjvbdsrrTYyeD +DncLKvbdTlWPAvOi +EPCjjvbdwzHeexEr +DncLKvbdmJEUQuRa +DnbkKvbdkIHLeemk +EObkKvbdhtyeXSUb +EOcLKvbdHDkWKCJj +EOcLKvbdRbDdkhyL +EObkKvbdRosfifDw +EPCjjvbdOStVfduQ +DnbkKvbdiHJbxujV +DoCjjvbdsPuoJcWG +EPCkKvbdDxXktTtM +DoCjjvbdHDjujCJj +EObjjvbdUWLoisaR +EPDKjvbdqiAKEmOe +DoDLKvbdxmsIYShc +EPCkKvbdCJKbKiGK +DoDLKvbdRECaQRDr +EPDLKvbdYqNEiNEq +DnbkKvbdiMEcnVCy +DoCkKvbduCbtwVno +DoDKjvbdHbMZdzAD +DnbkKvbdemGXGmKL +DoDLKvbdgQBzwDwh +DoDKjvbdKQzEoGOF +DoDKjvbdWSNwaeMD +EPDKjvbdySmhlqbH +EObkKvbdDxYLtTtM +DnbjjvbdFxuVBEXb +EObjjvbdiBoCdwRR +EPCjjvbdGQATWgGZ +EPCkKvbdYpleJNEq +EOcLKvbdvPTzqKoU +DnbkKvbdZQmEhldq +DncKjvbdLBKgMawq +EPCkKvbdqFceTvAh +EPCjjvbdkIHMFenL +DoDKjvbdehLVqnRH +DoDKjvbdxwhibPyk +DnbkKvbdkMbMZeHP +EOcKjvbdsrrSyZeD +EOcLKvbdMowpunHT +EObjjvbdJqZdnfOF +DoCkKvbdezuxdhtX +DnbjjvbdaaWFFopX +DoCjjvbdqdFJQOVa +EPCjjvbdWWhwudFH +EPDKjvbdhtzFWrUb +EPCkKvbdWSNwaeMD +EObkKvbdcIlikFvx +EPCkKvbdauCGwkTh +EPCkKvbdbhmJkGWx +EPDKjvbdRosgJfEX +DnbkKvbdTvMQJtAq +DnbkKvbdsBfMlGkZ +DnbkKvbdVrNxCElD +DoDLKvbdmpZxukZC +EObkKvbdhlEcnVCy +EOcLKvbdwzIFfYFS +DnbkKvbdZtIhxdSn +DoDLKvbdjgfkfFmk +DoDLKvbdqTtHSRkU +EObjjvbdSCDeLiZL +DoDKjvbdeATplxJf +DnbkKvbdIBkzEzAD +EOcKjvbdFWZQPljF +DoCjjvbdRbDeMJYk +EPDLKvbdDoCkKvcE +DoCkKvbdZjShPfbG +DnbjjvbdNPxQvOGs +EPDLKvbdKyQirztf +DoDLKvbdJutecdfi +DoCjjvbdTppoUuHm +EPDLKvbdjEkGuPAO +DnbkKvbdVTmTekuj +DnbkKvbdZyEJmcMS +EOcKjvbdNddThhjd +DncLKvbdrDdhpNua +EOcKjvbdBiLBkJGK +DoCkKvbdrXPkbhxq +DnbjjvbdZQmEiMdq +DncLKvbdhzUfMROG +EPDKjvbduaEYroEh +DoCjjvbdJYUCHkqQ +DoCjjvbdwzHfFxEr +EPCjjvbdLiBkqYAS +DoDLKvbdxZgfFxEr +DoCkKvbdraemLgLZ +DoDLKvbdxxJJaozL +EPDLKvbdKeehBaRV +DoCkKvbdPIAYZAZB +EObjjvbdBvzdIdov +DoDKjvbdjblKqGuH +DoDKjvbdlhdURVSB +EPDKjvbdqvpMDJZR +DncKjvbdajkeoODA +EOcKjvbdkySqsZHU +DnbjjvbdJqZdnfOF +DncKjvbdZHWdAOsJ +DoCkKvbdaNLCStlg +DoDLKvbdVZHszKnn +DoCjjvbdtvOYJpsA +DoCjjvbdNPxQvNfs +DoDLKvbdZLqctOMN +EObjjvbdvwMAvAvV +DnbkKvbdEuxpPlie +DnbkKvbdAMhYsWyx +DoCkKvbdtumwjQsA +EPCjjvbdVAaprqRy +EObkKvbdlZSqsYgU +EObkKvbdBvzdIdov +DnbjjvbdyOShYTJD +EOcLKvbdZshhxdSn +EPDKjvbdUtMselWK +DoDLKvbdYqNEiMeR +DncLKvbddePSBwDK +DncLKvbdqYnggQcx +DnbkKvbdqceJQOVa +DoDLKvbdtSrTZZeD +EPCjjvbdANHyTWzY +DoDLKvbdcIlikFvx +DoDKjvbdxmsHwsIc +EObkKvbdYzbfRiuy +EPDKjvbdWHwuwfxz +EOcLKvbddndsLTsr +EObkKvbdwXMAuaVu +EPDLKvbdbVBfwjtI +EObjjvbdfMfXHMik +DoCkKvbdOXoVzdOU +DnbkKvbdnGeXlnHZ +EPCjjvbdGGJrOJTq +EPCkKvbdhanbeWqR +EOcLKvbdLhbLpxAS +EPDLKvbdbBVdepPw +EOcKjvbdWSNwadlD +DoCkKvbdaRfChTek +EPCkKvbdmbJvxOmu +DoCkKvbdCSaCsfXS +EObkKvbdbhljKewY +DncLKvbddZxowxpb +DnbjjvbdRDcBQQdS +DnbjjvbdKDJbqKDY +EObkKvbdWRmxCFLc +EPDLKvbdYlSETmkm +EOcLKvbdMIalRYAS +DoDKjvbdCEQAuimG +EPDKjvbdCTAcTewS +EPCjjvbdrRtkOKaN +DnbkKvbdtTRryZeD +DnbjjvbdMgColpVL +EOcKjvbdrDdhomua +EPDKjvbdRbDeMJZL +DnbkKvbdxnSgwrhc +DoDKjvbdVvhxVdFH +DncKjvbdLYqJrzuG +DncLKvbdZsiIyETO +EPDLKvbdieLHUoAO +EPDLKvbdNsUVgEuQ +EPDLKvbdoAKztHcn +DncKjvbdfNFvgNJk +DoCkKvbdqYoHgQcx +DncLKvbddwzUUSFz +DoCkKvbdIHGzZYXg +DncLKvbddZxpXxpb +DnbjjvbdhlFDnUcZ +EPCjjvbdSKxfUfjs +DoCkKvbdbAvFGPpX +EOcLKvbdVhXuwfxz +EPCkKvbddoEsKtTr +DncKjvbdhkeEOVDZ +EObjjvbdNUrqjmAX +EPDLKvbdUWLojTaR +DoDLKvbdWIYVwfxz +DnbkKvbdUtMsekvK +EOcKjvbdRpUHJecw +DoDKjvbdCJKbKiFj +EObjjvbdEuxoomJe +EPCjjvbdLrWlytpz +EObjjvbdMgDPlotk +DncLKvbdNrtWHFVQ +DoCjjvbdZeYGzgiC +EPCkKvbdKaKfmCYR +DoCjjvbdjlakzEfo +EPDKjvbdpeceTvBI +DnbkKvbdKDKCqJcY +DoDKjvbdMowqWNgT +EPDKjvbdRMxCYmtz +EObjjvbdrXQLbiYq +DncLKvbdZnmheFZj +EOcLKvbdiLeENtcZ +DncKjvbdzaAPGfal +EPCkKvbdeATqNYKG +EObjjvbdSCDdlIyL +DoCkKvbdVZHtZjnn +EPCjjvbdZtIhxdTO +EPDKjvbdTlVoAuoJ +EObjjvbdZRNFIleR +DoDLKvbdEPDLKwCd +DnbjjvbdfRaWzkbo +EPDLKvbddneSjstS +EObkKvbduCbtwWOo +EPCkKvbdmoyyWKyC +EPCjjvbdehLVrORH +DoDLKvbduCcUvuno +EObkKvbddZxowxqC +EObkKvbdKQydoFme +EPCkKvbdqqtkOKaN +DoDKjvbduaEYsOeI +EObkKvbdePEsLUTr +DoDLKvbdbsDLTcia +DncLKvbdDwwlTtUM +EOcKjvbdOEdUIhkE +DoDLKvbdtvOXjRTA +EObkKvbdeFPSCXCj +EPCkKvbdqlzJxlIJ +EOcKjvbdUMVoBVni +EPCkKvbdqqtkNkBN +DoDLKvbdiVZeWquC +DncKjvbdZLrDsmlN +EPCkKvbdzitopESt +EOcKjvbdnBjXYPOV +EObkKvbdehKurOQg +DoCjjvbdmJDsptrB +DnbkKvbdaNKbTVNH +DncLKvbdGQASvfey +EOcLKvbdtbcUwVno +EOcKjvbdqUUHSSLU +EOcLKvbdvwLaWBWV +EPCkKvbdRacdlIxk +DnbkKvbdxZgfGXeS +EOcLKvbdVAapsQqy +EOcLKvbdQvnECkhD +EPDKjvbdCWzchdpW +DoCjjvbdpedFUWBI +EPDKjvbdqvpMCiYq +EPDLKvbdEPDKjwCd +DncLKvbdGckWJaij +EObjjvbdgPazwEXh +DoCkKvbdUVlPitBR +DoCjjvbdMSXMzVQz +DnbkKvbdliEUQuRa +DoCkKvbdOStVgFUp +EPCjjvbdUtMtGMVj +DoCkKvbdKWVFdFHJ +EPCkKvbdUxhUZkOn +DnbkKvbdLBKflbYR +EPCkKvbdFkEsCglu +DnbkKvbdKCibpjCx +DnbkKvbdGLEsChNV +DoCjjvbdLGFhCApu +DncLKvbdeXzTsqez +DoCkKvbdxrmhlqbH +EPDLKvbdYlRdTmlN +EPCjjvbdqYnhHRDx +EPDKjvbdWfYzUAOs +EPCkKvbdMJCLpxAS +EObkKvbduCbtwVoP +DoCkKvbdmfdwlmfy +EPCjjvbdVBBprpqy +DoDLKvbdEKHivXjA +DoDLKvbdkWWnECYX +EOcKjvbdqUUHSRkU +DncKjvbdYlRcsnLm +EOcKjvbdelfWfmJk +EPDLKvbdZtIhxcsO +EOcLKvbdGKdrcINV +EPDLKvbdOAIsUKSA +DoCjjvbdXFxytAOs +EPCjjvbdUQpntuIN +EPDLKvbdTvLpJtBR +EPDKjvbdRyihSbvA +DnbjjvbdhyuFlROG +EObkKvbdZxcinClS +EOcKjvbdptTfqrKt +DoDLKvbdURRPUtgm +EObkKvbdaNKbTVNH +EOcLKvbdiZuFlQmf +EPDKjvbdePEsLUTr +EPCjjvbdFxuUaEYC +EPDLKvbdliETpuRa +EObjjvbdjKFhKNYS +DoCkKvbdwzHefXeS +DoDLKvbdFfJqmiUR +EObjjvbdcJMjKewY +EObjjvbdqdFIomua +DnbkKvbdFejRnJTq +DnbjjvbdEzsqFMCi +EPDLKvbdhzUelROG +EPDKjvbdLKaIWAKZ +DoCkKvbdGGJrOIsq +EOcKjvbdVUMtGMWK +EObkKvbdmpZyVkZC +DoDLKvbdJTYaSmXl +EObjjvbdmSZUyrci +EObkKvbdxnSgwsIc +EOcLKvbdhgJcYujV +DoDKjvbdUQpoVVHm +EPDKjvbdKWVFdEgJ +DoCkKvbdWXJXudEg +EObkKvbddxZtURez +DnbkKvbdZRMeJNEq +EOcKjvbdpxoIHRDx +EObkKvbdGGKSOJTq +EOcKjvbdkIHMFenL +EPDLKvbdTqQoUtgm +DnbjjvbdtvNxJpsA +DnbkKvbdFyUtaDxC +DnbkKvbdSLYeuHKs +DncLKvbdxrmhlrBg +DncLKvbdGdLWJajK +EPCkKvbdSPtHJfEX +EPCkKvbdeKJrVtzn +DoCjjvbdWRnXadlD +DncKjvbdhkdcmtby +DoDLKvbdVviYWEFH +EOcKjvbdTAFJICPE +EPCjjvbdCJKbLIej +DoDLKvbdyYJJaoyk +EPDKjvbdNsUVgFUp +EPCjjvbdrDdhomua +DoDKjvbdySnJNRag +EPCjjvbdyNrgxShc +DnbjjvbdADRxKZhp +DnbkKvbdaMkCStmH +EPDKjvbdfIKvRnRH +DnbkKvbdoAKztIEO +DnbjjvbdDjHjVwjA +EObkKvbdjuwODbYX +DoDLKvbdbhmKKfWx +EPDLKvbdKaLGlaxR +DoDLKvbdwzIGFxFS +EPCkKvbdGBOpxizm +EPDKjvbdRXODcMHc +EOcLKvbdYqNFJMdq +EOcKjvbdxUleQxkn +EPDKjvbdZirgpHCG +DncLKvbderAvzkbo +EPCkKvbdTvMPisaR +EPCkKvbdZtJIxdTO +EOcKjvbddePRavcK +DncLKvbdCDpAuimG +EPDLKvbdQdCaPqES +EObjjvbdZyEJmbkr +DoDLKvbdOEcsiIkE +EOcKjvbdrbFlkgLZ +EOcKjvbdRacdlJZL +EPCkKvbdKDKCqKCx +EPDKjvbdrDeIonVa +DncKjvbdOFEThhjd +DncLKvbdLAkHMbXq +EObkKvbdhytekpnG +DncLKvbdrSUkOLAm +DncLKvbdiCOcFWpq +DoCjjvbdrylPsAhO +EOcKjvbdxVNEpyLn +DnbkKvbdmbJvwnnV +DnbkKvbdVAbQsQrZ +EPCkKvbdCTBCtGXS +DncKjvbdTAEiHbPE +EObjjvbdFeiqnJTq +EPDLKvbdDxYMTtTl +DncLKvbdHDkVibKK +DnbkKvbddePSBvcK +DoCjjvbdauCGwkTh +EPDLKvbdWIYWYGxz +DoDLKvbdjcLjqHVH +DoDLKvbdTfznMXWF +DnbkKvbdkVwNcaww +EObjjvbdlYrrSxgU +DncKjvbdaNLCTUmH +EOcKjvbdznoqEblY +DncLKvbdjuwOEBww +DncKjvbdGQATXHGZ +EOcKjvbdiZuFkpmf +EPCjjvbdajlGOnDA +EPDKjvbdJcJbpjCx +DncKjvbdauBgXjtI +EPCkKvbdsZkpTAhO +EPCkKvbdOEdUIhjd +EOcKjvbdNsUWGduQ +DnbkKvbdVTltFlVj +EObjjvbdaNKasVNH +DnbjjvbdhancEvpq +EPDLKvbdZtIiZETO +DoDKjvbdFxuUaEYC +DoDLKvbdLGGHbAqV +DoDKjvbdqceIpOWB +DoDKjvbdvBEZTPEh +DoDKjvbdKefHbBQu +EPDLKvbdlZTSSyHU +DncKjvbdnPyyWKyC +EObjjvbdsZkpTBHn +DoCjjvbdaaVdepPw +EPDKjvbdtkwvaUAw +EObjjvbdEPCkKvbd +EPCjjvbdtkwvaUBX +DncKjvbdRbDeMIyL +EOcKjvbdxwhjBoyk +DoDLKvbdFxuVAcxC +DnbkKvbdxZgfFxFS +EOcKjvbdjhGkefNk +EOcKjvbdEPDKkWcE +EPDLKvbdQvnEDMID +EOcLKvbdqquKmjaN +DoCkKvbdZtJJZESn +EPDLKvbdTkvOaWPJ +DnbjjvbdcSbkUEJa +EObjjvbdQlxBxmtz +EOcLKvbdehKuqmpg +EObjjvbdpyOggQcx +DncLKvbdnVVZjjSG +EPCjjvbdyqOmIiwA +EPDLKvbddZxpXyRC +EObkKvbdRXODcMID +EOcKjvbdnHFXlmfy +EPDKjvbdznpQdcLx +EOcLKvbdqGDdtWBI +EPCjjvbdZoNhddzK +EOcKjvbdqTsgSSLU +EOcLKvbdRzJhTCvA +EOcKjvbdCIjbLIfK +DncKjvbdKQzEoGNe +EOcKjvbdACrXizJQ +EObjjvbdEzspdkcJ +EObkKvbdsZlQTAhO +EPDKjvbdfoazwEYI +DoDLKvbdjAQGaQGj +DoDLKvbdEzsqFMCi +EPDKjvbdyYJJapZk +DnbkKvbdIxUBglRQ +DoCjjvbdtTRsYyeD +EPDKjvbdGKdsDIMu +EOcLKvbdFyVVAcxC +DnbkKvbdZLrDtNkm +EPDLKvbdsrqrxydc +EPDKjvbdrpVnjCvG +DoDLKvbdmSYtzTEJ +EPDKjvbdajkfOmcA +EPDLKvbdssSSxzEc +EObjjvbdDxYMTssl +DnbkKvbdiMFEOVDZ +EOcLKvbdULvOaVni +EPDLKvbdlqyUzSdJ +EObjjvbdZoNheFZj +DncKjvbdcScLTdKB +EObkKvbdGLFTDINV +DncKjvbdcyyQYZRC +EOcKjvbdYqMeIldq +DoCkKvbdOEcshhkE +EObkKvbdirzhrjiz +EOcLKvbdxUmFRYlO +DoDKjvbdkyTRsZGt +DncKjvbdIryAsNYM +EObkKvbduWNxJpsA +DncKjvbdYkqcsnLm +DoDLKvbddZxpXyQb +DncKjvbdRotGiedX +DnbkKvbdKVtedEgJ +EOcKjvbdjvWnEBww +EObkKvbdFyVVAdXb +DoCkKvbdYlSEUNkm +EOcKjvbdcTDLTcia +EPCkKvbdzjUpQESt +DnbkKvbdqUTfqrLU +EPDKjvbdSQUHJfEX +DnbjjvbdiGjDYvKV +EObkKvbdhkdcnVCy +EPCjjvbdJuuFdFHJ +EObjjvbdYkqdTnMN +DoCkKvbdpssgSRkU +EObkKvbdUWLpKUBR +DoDKjvbdZsiJZESn +DnbkKvbdYqMdhmEq +DoCkKvbdjcLkRHVH +DnbkKvbdSPsgKGDw +DoDLKvbdKVtfEEfi +EPCjjvbdiGibyWKV +EPCjjvbdEYYLtUTl +EPCjjvbdFejSOIsq +DncLKvbdRECaQRES +EPCkKvbdEuyQQNKF +EObkKvbdxwhjCPzL +DncLKvbdiLeDnUby +EOcKjvbdEuxpQMie +EOcKjvbdIidAJogE +DoDKjvbdxsNhlqag +EOcKjvbdEzsqFLcJ +EObjjvbdYTMAmToY +DoDLKvbdwuNFQyLn +DoCkKvbdzitpQDrt +EOcLKvbdZtJIxdSn +DncLKvbdqZPHgRDx +EPDLKvbdMoxQvNfs +DncKjvbdmIctQuSB +DoCkKvbdFfKSNiUR +EPDLKvbdhtydvqtb +EObjjvbdxrnJNRag +DnbjjvbddoFTKssr +EPDKjvbdqlyjZLgi +DnbkKvbdyNsHwsJD +EOcLKvbdxnTHwsJD +EObjjvbdUQqOtuIN +DnbkKvbdwtleQyMO +DoDLKvbdrovPKDVf +EOcLKvbdFaPQxizm +EObjjvbdVAapsQqy +EOcKjvbdJvVFdFGi +DnbkKvbduDDVXVno +EObkKvbdZjTHpGbG +EObjjvbdZirgofaf +DncKjvbdAMgySvzY +DoDKjvbdGdLVibKK +DoDKjvbdWRmwbEkc +DncKjvbdXsMAlsnx +DoDLKvbdtcCuXVoP +DoDLKvbdqlyjYlIJ +EPCjjvbdHELVjCKK +DncLKvbdBdQAuilf +DoCjjvbdeFOrCXDK +DoCjjvbdRpTgJfDw +DoCkKvbdLAkHMbXq +EOcLKvbdaRebhUGL +DncLKvbdnQZyWLYb +EObjjvbdXsMBNUOx +DncKjvbdrSVKnKaN +EPCjjvbdAMhZSwZx +EOcLKvbdcScKtEKB +DncKjvbdKaLGlaxR +EOcKjvbdZRMeJNFR +EPCkKvbdwygeewdr +DnbkKvbdhancFXRR +EOcKjvbdOTUVfdtp +EPDLKvbdmbKXYOnV +DoDKjvbdGLFSbhNV +EPDLKvbdMfbomPtk +DnbkKvbdmIcsqVRa +DoDKjvbdwtmFRZLn +DoCkKvbddtAUATMv +DncKjvbdiBoDEvqR +EObkKvbdiHJcYujV +DnbjjvbdiCPDFWqR +EOcKjvbdyTNhlrCH +DoDKjvbdNQYRVmfs +EOcLKvbdFjdrbhMu +DoCjjvbdsrrSyZeD +EPCkKvbdXsMBMsoY +DoDKjvbdjhHLfFmk +EPCkKvbdyOTIYTIc +EOcLKvbdbhmKLGWx +DnbjjvbdxnTHwsIc +EOcLKvbdZoOJEeZj +EOcKjvbdjmBkzEfo +EPDKjvbdYORAXuWU +EPDKjvbdtkxXAsaX +DoDLKvbduaEYsPFI +EPCjjvbdypoNIiwA +DoDKjvbdVBCRTQrZ +DnbjjvbdlrYtyrdJ +DoCjjvbdhzUekpnG +EOcKjvbdcTCjsdJa +EObkKvbdbhlijfWx +EOcLKvbdYTLaMsoY +DnbjjvbdKVtedFGi +EOcLKvbdsPvPJbuf +DncLKvbdNrsvHEuQ +EObkKvbdmfeYMmfy +EPCjjvbdZjTHpHCG +DoDLKvbdpyOhGqDx +DoDKjvbdRkZGVGjs +DnbjjvbdRWnEDMHc +EPCkKvbdjlbMZdfo +DoCkKvbdyqOmIiwA +DoCkKvbddxZstSFz +DnbjjvbdKCibqJbx +DoCjjvbdqqtjnLBN +DnbjjvbdBhjbLJGK +DoDLKvbdrWokbhxq +EOcLKvbdJzpGXdAN +EPDKjvbdRMxCZNtz +DncKjvbdkClLRGuH +DncLKvbdIHHZxxXg +EPDKjvbdZshiYdSn +EPCkKvbdqcdhomvB +DoDKjvbdVTmUFkvK +EObkKvbdZisHogBf +DoCjjvbdRbDdkiYk +DnbkKvbdGGJrOJTq +DncLKvbdeFPRavcK +DnbjjvbdSPtHKGDw +DoDLKvbdJmADyfuB +EPCjjvbdKCibpicY +DoDLKvbdiGicZVjV +DoCkKvbdZLqdUNkm +EPDKjvbdVUNUFkvK +EPCjjvbdemFvflik +EPCkKvbdkxrqrxft +DnbkKvbdRbEElIxk +EPCjjvbdaaVdfQQX +DoDLKvbdySmhlqag +EPCjjvbdrRuKnKaN +DncLKvbdezuyEhtX +DnbkKvbdtbbuWuoP +DnbkKvbdZtIhxcrn +EObkKvbdcyxoxZQb +EOcKjvbdDxYLtTtM +EObjjvbdjggMFfOL +EPCkKvbdGckWJbKK +DnbjjvbdddnqavcK +EPDKjvbdYgWdAPTJ +DnbjjvbdbhlikGXY +DncKjvbdNPxRVmgT +EObkKvbdRpUHKGDw +EObkKvbdmfdwlmgZ +DoDLKvbdBvzdJFPv +DnbjjvbdZHXEAPSi +EPDKjvbdbQHGdLzd +EOcKjvbdCIjbLIej +DnbjjvbdOXnuzdNt +EObkKvbdrSUkNkBN +DoDLKvbdNeDsiJLE +EPCkKvbdiUyeXRtb +EObkKvbdbsDKsdJa +DncLKvbdbrcLTdJa +DncLKvbdSPsgJecw +EObjjvbdKNADzGta +EPDLKvbdFWZPomKF +EPCjjvbdRzKISbvA +EOcKjvbdvmWAMcdm +DncKjvbdwyhGGYEr +EPDLKvbdfHjuqnRH +EPCjjvbdRXOEDLhD +EPCkKvbdyOSgwsJD +DoDLKvbdnCKXYOmu +DnbjjvbdjmCLyeGo +DnbjjvbdTYKlNzjx +DoCjjvbdZisHpGbG +EObjjvbdUWMPisaR +EObjjvbdqFcdtWAh +EOcLKvbdYqNEhleR +DnbjjvbdlZSrSyGt +EPDLKvbdePEsLTsr +DncKjvbdSBcdlJYk +EPDKjvbdePEsLTsr +EPDKjvbdypnmIjXA +DnbjjvbdsQWPKCuf +EOcKjvbdZRNEhldq +EPCjjvbdYpmFImEq +EPCkKvbdKfFhBaRV +DncLKvbdezvZEhtX +DncKjvbdiCObdvpq +DnbjjvbdmJETqUrB +EOcLKvbdfpBzvcxI +DncKjvbdRbDdkhxk +EPCkKvbdmpZyVkZC +EPDLKvbdyNsIXrhc +DnbkKvbdyYJJaoyk +DncKjvbdwWlBVaWV +DoDKjvbdqwPlCiYq +DncLKvbdvvkaVaWV +DncKjvbdcJMjKewY +EObkKvbdbBWFFpPw +EPCjjvbdpyOhGqEY +EPDKjvbdCDpAujNG +EPDLKvbdCSaCtFvr +DoCjjvbdwygfFxEr +EOcLKvbdLFehBaQu +EPCjjvbdssSSxydc +EPCjjvbdHfgZyYYH +DnbkKvbdnBjWxOmu +DnbkKvbdcJNJjewY +EObjjvbdrzLoraIO +EOcKjvbdADRwjZiQ +EPCkKvbdOAJStJrA +DncLKvbdajkennDA +DoCjjvbdmbKWxPNu +EObkKvbdmbKXYPOV +DoCkKvbdKCjCpjDY +EPCkKvbdIjEAJogE +DoCkKvbdkHgLfGOL +DoCkKvbdJcJbqKCx +EPCkKvbdVUMtGMWK +DoDKjvbdNxOuzcmt +EPDLKvbdNQYRVnGs +DnbkKvbdzjUoocrt +DoDKjvbdDnbjjvcE +DoCkKvbdGBPRZJzm +DoCjjvbdtvNwjRTA +EPDLKvbdZQldhleR +DoDLKvbdUtMsfMWK +DnbkKvbdDxYLtTsl +DoCjjvbdmbJwYPOV +DoCjjvbdaNLCTVMg +DoCjjvbdWXIwvEFH +DoDKjvbddZxoxYpb +DncLKvbdijGHimXr +EPDKjvbdZQmEiMdq +DncKjvbdTulPisaR +DncLKvbdnGdxMnGy +EPCkKvbdlYsSSyHU +DoDKjvbdKRZePFme +DoCkKvbdZRNFJNEq +DncLKvbdkMbMZeGo +DoCkKvbdBiLBkIej +EObjjvbdWXIwvEFH +EOcLKvbdGGJqnJTq +DoDLKvbdRWmcblID +EObjjvbdxUleQxlO +DnbkKvbdREDBPpdS +DnbjjvbdiifHjMwr +EObjjvbdZLqctOMN +EPCjjvbdmRxtyrci +DoDLKvbdDxXlTtUM +DoDKjvbdxrmiNSBg +DoDKjvbdTppntthN +EObjjvbdnUtykKRf +DoCkKvbdRNYBxmtz +EOcLKvbdQYmAHTSK +EPCjjvbdZtIhxcsO +DoCjjvbdbsCjsdJa +EPDKjvbdsZkoraIO +DoDKjvbdEJhJvYKA +EOcLKvbdJSxaTMwl +DoDLKvbdANHxrvzY +EObkKvbdcTDKtDia +EPDKjvbdrWolDJZR +DoDKjvbdsQVnicVf +EPCjjvbdYSlAlsoY +EPCkKvbdJYUBhMRQ +DncLKvbdtlXwBUBX +EObjjvbdVrOYBeMD +EPCjjvbdcJNJkGWx +DncLKvbdjKGHjNXr +DncKjvbdRMwayOUz +EObjjvbdzdzOzdyp +DnbjjvbdNHColpVL +DoDLKvbdNddThiLE +EPDKjvbdFjdsCgmV +DnbjjvbdTJZjRABM +DncKjvbdOTTugFVQ +DncLKvbdVYgszLPO +DncKjvbdEARhlzWw +EPDLKvbdUGzmkvvF +DoDLKvbdmRyVZsEJ +EObjjvbdptUHRqjt +EOcKjvbdJpzFOeme +DnbkKvbdMgDPmPtk +EOcKjvbdhzUfMRNf +DoDLKvbdpyPHgQdY +DoCjjvbdZjShQHCG +EOcKjvbdOTTvGeVQ +EPCjjvbdRacdkiZL +DnbjjvbdzitoodTU +EOcKjvbdxxIjCPyk +EObjjvbdunszqLPU +EObjjvbdwjwDgzzG +DnbkKvbdUyHtZkOn +DnbjjvbdqvpMChyR +DnbjjvbdmIctRUrB +EObkKvbdNHCpMpUk +DoDKjvbdeFPSCXCj +EOcKjvbdtvOXjRTA +DncLKvbdZGvdAPSi +DoCjjvbdQcbaPpcr +DoDLKvbdVUMselVj +DnbjjvbdVgxWXgYz +DoDLKvbdjAQHBQHK +EOcKjvbdxxJKCPyk +DnbkKvbdQdDApQcr +DnbjjvbdqrUjmjaN +EOcKjvbdJzofYEAN +DoDLKvbdJvVGEFHJ +EObkKvbdJcJbpjDY +EPDLKvbdhanbdwRR +EObkKvbdiZtfLqOG +DoCjjvbdeOdsLTsr +DoCjjvbdSLZFuGjs +DoCjjvbdqTsfrRjt +EObjjvbdACqxKZhp +EPCjjvbdxZhFexEr +EPDKjvbdiBoCeXRR +DoDKjvbdqFcdtVaI +DnbkKvbdkClLQgVH +DnbkKvbdZQmEhldq +DnbjjvbdQYmAGrqj +DnbjjvbdiLddNuDZ +DoDLKvbdsQWOjDWG +EPDKjvbdVqnXaeLc +DnbjjvbdwNWANEFN +EPCkKvbdsBfNMHKy +EOcLKvbdKQzFOfOF +DoDKjvbdHELVibJj +EPDKjvbdcImJkFwY +DncKjvbdIwtBgkqQ +EObkKvbdANHySvyx +DoDLKvbdpxnhGqEY +EPCjjvbdrafNMHKy +DoDLKvbdSQTfiecw +DnbkKvbdiMEdOUcZ +EObjjvbdQmYCYnUz +EPDLKvbdWIYWXfxz +EPCjjvbdNeEThiLE +EObjjvbdHDkWJaij +DncKjvbdMgDQNPuL +DncKjvbdKWUedFGi +EPDLKvbdJYUCIMRQ +EOcLKvbdRacdkhyL +EPCkKvbdSBdEkhyL +EPCkKvbdMRwMzUpz +EPDLKvbdkxrqsYft +EObkKvbdRkYetgLT +EPCkKvbdNrsvHFVQ +DoCjjvbdqiAKFNOe +DoDKjvbddwystRez +EOcKjvbdrylQTBHn +EPDKjvbdDjHjWXjA +EObjjvbdCIkCLJGK +DnbjjvbdqwPlDJYq +EPCjjvbdnVUzLKRf +EOcLKvbdUxhUZjnn +DnbjjvbdRpUHJecw +DnbjjvbdjhGlFfNk +EObkKvbdJKEAKPgE +DoDLKvbdIidAKPgE +DncKjvbdCSaCtGXS +DoCjjvbdIidAKQHE +DnbkKvbdFjdsCgmV +DoCkKvbdGKeTCglu +EOcKjvbdEzspeMDJ +EOcLKvbdqUTgSSKt +DoCkKvbdnBivwnmu +DncLKvbdJcJcRKCx +EPCjjvbdVwJXucdg +DnbjjvbdKVuGEFHJ +DncLKvbdnVUzKjSG +DoCkKvbdqGDeTuaI +DnbkKvbdLFfICBQu +DnbkKvbdZjTIQGbG +DoDLKvbddBrlrATm +DncKjvbdYNqAXtut +DnbjjvbdURROtuHm +EObjjvbdxmrgxSiD +DoCkKvbdjJfHjMwr +DncLKvbdNwoVzdOU +EPDLKvbdyTNhlqbH +EObkKvbdiMEcnUby +DoDKjvbdJcKCqJbx +EPDLKvbdNrtVgEtp +DncKjvbdjEkGtoAO +DoDKjvbdNVSrKmAX +EOcLKvbdxmsIYTIc +EObkKvbdcTDKtDjB +EPDLKvbdxsOIlrCH +DnbkKvbdbrbjsdKB +DoCjjvbdpfEEtWAh +DoCkKvbdMowqVmfs +EPCkKvbdeATqMxJf +EObkKvbdjJehJmYS +EPDKjvbdxmrhYSiD +EObjjvbdjbkkQgUg +DoCjjvbdYlRdUNlN +DoDLKvbdiHKDZWJu +DoDKjvbdpedEsvAh +DoCkKvbdEuyPomJe +EPCkKvbdhtyeWrVC +DncLKvbdbAvEfQQX +DnbjjvbdTkvPBWPJ +DncKjvbdYlRdUOLm +DncLKvbdCIjajiGK +EPDKjvbdUtNTfLuj +DnbkKvbdKVuFdEgJ +DoDKjvbdfVzwoizs +EPCjjvbdySmiMrBg +EPCkKvbdrpWPJcVf +DoDKjvbdcImJjewY +DoCkKvbdkVvnECYX +DncKjvbdWRnYCEkc +DoDKjvbdCIkBjhfK +EObkKvbdmIdURVSB +DoCkKvbdTppoUuHm +EPDLKvbdUQqOtuHm +DnbkKvbdhgKDYvJu +DnbkKvbdkHgLfFmk +EPDLKvbdCDoaVjMf +EPCkKvbdehKvSNqH +DncKjvbdNeEUJJLE +DncKjvbdlhdTqVSB +EOcKjvbdEuxpPmJe +DncLKvbdqceIpNua +DnbjjvbdnVVZjjRf +DnbkKvbdKDJcRJbx +EObkKvbdnHEwlmgZ +EOcLKvbdFWZQQMjF +DoDKjvbdKWUedEgJ +DoDLKvbdmozZVkZC +DoCkKvbdZdxGzhJC +EObkKvbdGQATWffZ +EPCkKvbdJuuGDeHJ +DoCkKvbdiGibxvJu +DnbkKvbdBraDUGXS +EPDLKvbdiHKDYvKV +DnbjjvbdZxcjODMS +DnbkKvbdnGdwlmgZ +DoDKjvbdkxsRrxgU +EOcKjvbdrzMQTAgn +DncLKvbdjhHLfGOL +DnbjjvbdQvnEClID +DoDKjvbdqdEhomvB +DoDLKvbdGdKvKCJj +DnbjjvbdqvpLbiYq +EObjjvbdsPvOjCuf +DoDLKvbdVqnXbElD +EPDLKvbdeEoRbXCj +DoCkKvbdyYJKBoyk +DoDLKvbdlhdURUqa +EPDLKvbdYkqdTnMN +DoCkKvbdnGdwmNgZ +EObkKvbdGGKSOIsq +EObjjvbdLLAgvAJy +DnbjjvbdajlFnmcA +DoDLKvbdiifHimYS +EPCjjvbdnPzYukYb +EPDLKvbdVYhTyjnn +EOcLKvbdfNFwHNJk +DoCjjvbdbrbkTcia +DncLKvbdRkZGVHLT +EObkKvbdSQUHKFdX +EOcKjvbdSKxeuHKs +DncKjvbdFxuUaDwb +DoCkKvbdaSGDHtFk +EPDKjvbdZyDimcLr +EObjjvbdiGibxvJu +EPCkKvbdDwwktTsl +EPDKjvbdRadEkiZL +EPDKjvbdmgEwlmfy +DncLKvbdaogHDkzd +EOcLKvbdjuvmdCXw +EPDKjvbdqwPlCiYq +DoDKjvbdLBLHNBxR +EObjjvbdeFOrBvbj +EPDKjvbdFyVVAdYC +EPDLKvbdKNADygUa +DncKjvbdbVCGxLUI +DoCkKvbdJSyArmXl +EObkKvbdQvnDbkgc +EObjjvbdrEEiQOWB +EOcKjvbdZMSDtOLm +DoDKjvbdQvmccLhD +EPCkKvbdrzMQTBHn +EPDKjvbdMgCpNQUk +DoDKjvbdmbJwYPOV +EOcKjvbdgGLymgHA +EObjjvbdsrqsYzFD +EPDLKvbdrNZiyLgi +DnbkKvbdiiegimYS +DoDKjvbdqwQLcJYq +EObkKvbdaNLCSuNH +EPCkKvbdnUuZkJqf +EPCjjvbdSCEEkiZL +DncLKvbdVZHszKnn +DnbjjvbdUtMsfLuj +DoDKjvbdxmrgwriD +DoCkKvbdxxJKBpZk +EObkKvbdZMRdUNlN +EObkKvbdbPgHDkzd +EObkKvbdqqtjnLAm +EPDKjvbdURROuUhN +DoDKjvbdCWzdJFPv +DoDLKvbdMSXMytpz +DnbjjvbdqlyjZMHi +DoDKjvbdbsDLUDia +EOcLKvbduVnXiqTA +DoCjjvbdDxYLsssl +DoDLKvbdyqPMiJwA +EObkKvbdeOdsLUUS +EOcKjvbdEuyQQMjF +DoDKjvbdEztQeMDJ +EPCkKvbdGZVVBDxC +DnbkKvbdnGdxNNgZ +DoCkKvbdcIljLFvx +DoCjjvbdYqMdhmEq +EPDLKvbdgKfzbfAE +EPCjjvbdJcKDRJcY +EOcKjvbdOFDtJJLE +DncKjvbdiLdcmuDZ +EObkKvbdrWpLcJZR +DnbkKvbdVAaqTQrZ +DnbjjvbdFkFTChMu +DncKjvbdaaWEepQX +EPCkKvbdpedEsvAh +DncKjvbdjAQGaPfj +DoDKjvbdbUbHXkTh +DoDKjvbdRjyFtfkT +EOcLKvbdOTTvHEtp +DoCjjvbdRkYfVGjs +DncLKvbdzoQRFCkx +DncKjvbdrMzJyMHi +EOcKjvbdULvPBWOi +EOcLKvbdzdynzdzQ +EPCjjvbdtumxJpsA +DoDLKvbdwMvAMcdm +EOcLKvbdqceIonVa +EObjjvbdOEdUIiKd +EObjjvbdHELVjBij +EObjjvbdqcdiPmvB +DoCjjvbdJvVFdFGi +EPDKjvbdWRmwaeLc +EPDKjvbdZxdJnDMS +DoDKjvbdZxdJnDMS +EObjjvbdxUldpxkn +DnbkKvbdSLYetfjs +EPDLKvbdYqMeIldq +DoCjjvbdrMyjYlIJ +EObkKvbddxZtTqez +EPCkKvbdWSNxCElD +DoDKjvbdWWiYVcdg +DoDLKvbdqGDdsvAh +EOcLKvbdhzVFlRNf +EOcKjvbdaNLCSuNH +DnbkKvbdkHgMFfNk +DnbkKvbddePRbXDK +DncKjvbdNVTSKmAX +EObkKvbdhzUfLpmf +EOcKjvbdZMSDtNkm +EPDKjvbdTqROtuHm +DoCkKvbdddnqbXCj +DoDKjvbdliEURVSB +DncKjvbdtvNxKQsA +DnbjjvbdqceJQOVa +EPDKjvbdpyOggQcx +EOcKjvbdtcDUvuoP +EObjjvbdrWpMChxq +EPDKjvbdGYttaEYC +EObjjvbdiifIKNYS +DoCjjvbdZyEJmcMS +EPDLKvbdKQzFOfNe +DoCkKvbdqYoIGpdY +EPDLKvbdxwhibPzL +EPDKjvbdRadElJYk +DoDLKvbdtkwwAtAw +EPCjjvbdDjHjVxKA +EPDKjvbdrzLosBIO +EPCkKvbdBdPaVimG +DoCjjvbdrafMkfjy +EPDKjvbdNGcPmQVL +DoDLKvbdVviYVdFH +EPCjjvbdkVwODaxX +DncKjvbdkMbMZeGo +EOcLKvbdfkGzbfAE +DnbkKvbdpyOhHQdY +DoDKjvbdQdCaPqES +EObjjvbdEKHiuxKA +DnbjjvbdpxnhGpcx +DnbkKvbdkxsSSxgU +DnbjjvbdURQnuUgm +DoDLKvbdTukpJtBR +EPCkKvbdqAiFAWgd +DnbjjvbdgGLymfgA +EOcLKvbdyYIibQZk +DoDLKvbdWHxVxGxz +EPDLKvbdFyVVAdXb +DnbkKvbdrRuKnKaN +DoDLKvbdTpqOttgm +EPDKjvbdLhbLqYAS +DoCjjvbdHELVjCKK +DncLKvbdfSBWzlDP +DoCkKvbdRDcBPpdS +DoDLKvbdsQWPJcVf +EPCkKvbdySmiMrCH +EPCkKvbdbUbHXjtI +DoDLKvbdUtMsfLuj +EPCjjvbdEvZQPmKF +EObjjvbddeOqbXDK +EPDKjvbdkClKqGtg +DncKjvbdqiAJdmPF +EOcLKvbdlrZUyrci +EOcKjvbdbBVeFpPw +EOcLKvbdULvPBWOi +EPCkKvbdcJMjLFwY +DnbjjvbdZtIhxcsO +EPDLKvbdSPtHJfDw +EObkKvbdaNLBsUlg +DoDLKvbdqvpLcIxq +DoCkKvbdpxoIHQcx +EPCkKvbdlZTRsZGt +DoCjjvbderBWzkcP +EPDLKvbdZtJIxdSn +EOcLKvbdmoyyWKxb +DoDLKvbduaDxroEh +EPDLKvbddoErkTtS +DncKjvbdnPzYvKxb +EObjjvbdsZlPsAhO +EPDLKvbdjJfHjMxS +EOcLKvbdbsDLUDia +DncLKvbdMuTSLNAX +EPDLKvbdemGWfmKL +EObkKvbdKefHbBQu +EOcLKvbduVnXjRTA +DnbjjvbdGZVUaEYC +EOcKjvbdkNCMZeGo +EPCkKvbdGKeSbgmV +DoDKjvbdqrVLNjaN +DnbjjvbdEASIlzWw +DnbjjvbdeOdrkUUS +DncKjvbdDjIJvXjA +DoCjjvbdqGEFUWAh +EPCjjvbdQcbaQRES +DnbkKvbdhtydwSUb +DoCkKvbdMuTRjmAX +DnbjjvbdJutfEEfi +EPCjjvbdzGxlAMeX +DncLKvbdIHGyyYYH +DoDLKvbdxUmEqZLn +DnbkKvbdNHCpMotk +DnbjjvbdFyVVAcwb +EPCjjvbdShzJqABM +DnbjjvbdcyxoxZRC +EPCjjvbdqquKnLBN +DncLKvbdcIlikFwY +DoCkKvbdeOeSkTsr +EOcLKvbdYpldhldq +EPDLKvbdQYmAGsRj +DoCkKvbdzGyMAMeX +EPCkKvbdqrVKnLBN +EObkKvbdxUldpxlO +EPCjjvbdfIKuqnRH +EPDKjvbdFWYpQMjF +EPDLKvbdOFEUJJKd +EOcLKvbdHEKvKBij +DoDKjvbdjcMLRHUg +EPCkKvbdWXIwudEg +DncLKvbdgPazvcwh +DnbjjvbdnVUykJrG +EPCjjvbdxxJJbPyk +DncLKvbdjJehKMxS +DncKjvbdEzspdkbi +EPDKjvbdrpVnjDWG +DnbjjvbdVrOYCFLc +DoDLKvbdMfbpMotk +DncKjvbdbhljLGWx +DncKjvbdxrmhlrBg +EOcKjvbdbKlGPODA +DoDKjvbdJvUfEFHJ +EPCkKvbdySnIlqag +EPDKjvbdVAbQrpqy +DnbjjvbdrykosAhO +DnbkKvbdKfFhCBQu +DnbjjvbdEXwktTsl +DoDKjvbdDoDLLXCd +EObkKvbdvwMAvAvV +EObkKvbdXsLaNUOx +DnbkKvbdRDcBQRES +EOcLKvbdZisIPgCG +DoDKjvbdpfEEtWBI +DoDKjvbdfoazwDwh +EPCkKvbdFpASvffZ +EObjjvbdRWnDblHc +DoCkKvbdNxOuzdOU +DncLKvbdYlSDtOLm +EPCjjvbdjbkjqHVH +EPCkKvbdrMzJxkgi +EPDKjvbdCIkBjhfK +EPCkKvbdUslsekvK +EOcKjvbdFejRnJUR +EPDLKvbdNHColotk +EPCjjvbdUxgtZjnn +DoDKjvbdEOcLLXCd +EPCkKvbdkHflGFnL +EPCjjvbdwygfFxEr +DncKjvbdeOdrjtTr +DoDLKvbdqTtHRqjt +EPDLKvbdQwNdCkgc +EPCkKvbdhzVGLpnG +DoDKjvbdxwiKCPzL +EPCkKvbdZirhQGbG +DoCjjvbdqrUkOKaN +DoDLKvbdlrZUysEJ +DoCjjvbdqFdFUWAh +DnbjjvbdyYJKCPzL +DncKjvbdxUldpyMO +EPCjjvbdvAcyTOeI +EObjjvbdLFegaaRV +DncKjvbdemFvgNKL +EOcLKvbdjcLjqHVH +DoDKjvbdRMxCYnUz +EPDLKvbdRjxfUfkT +DoDLKvbdiMEdNuDZ +DoDLKvbdZRMdhmEq +DoDLKvbdqlyiyLgi +EObjjvbdiiehJmYS +DoCjjvbdwuMeRYlO +EPDKjvbdqquKmkAm +EOcKjvbdlrYtysDi +EPDLKvbdliETqUrB +EObjjvbdePErkTsr +DoDLKvbdfHjvRnQg +EObjjvbdRXOECkgc +EObkKvbdMpXqWOGs +DncKjvbdEJhJvYKA +DoCkKvbdVrOYBeMD +EPDKjvbdTkvPBWOi +EOcLKvbdjuvmcbYX +DncKjvbdMfcQMouL +EOcLKvbdMpXpvOHT +DoCjjvbdiLdcmtcZ +DnbkKvbdiHJcZWJu +EPDLKvbdTqQnuUgm +DncKjvbdLGFgbBQu +EPDKjvbdNdctIiLE +EPDKjvbdZxdKODLr +DoDKjvbdSZjITCvA +EPCjjvbdDwxMUTsl +EPCkKvbdySmhmRag +EOcLKvbdSPtHKGDw +DoDKjvbdmIctRUqa +DoDKjvbdaRfChTek +DncLKvbdyNrhXsIc +DncLKvbdJTZBSlxM +DoDKjvbdFeirOIsq +DnbjjvbdJutedFHJ +DnbkKvbdUsltGMWK +DnbkKvbdbhljLGWx +EPCjjvbdirziTLJz +EOcKjvbdnPzYvKyC +DoDKjvbdkDMLRGtg +DncLKvbdyzeNqhIh +EPCjjvbdYTMAmUPY +DoCkKvbdgGMZnHHA +DncLKvbdlZSqsYft +EOcLKvbdZjShQHCG +DnbjjvbdjhGlGGNk +DoDLKvbdkxsRryGt +DoCjjvbdZyDjNbkr +DnbkKvbdNeEUJIjd +EOcKjvbdxxJJbPyk +DoDLKvbdRbDeMIxk +EObjjvbdrDeJPnWB +EPCkKvbdrXPkbiYq +EPCjjvbdeFPRbWbj +DncLKvbdHffyxxYH +EPDKjvbdcyyQYZQb +DoCkKvbdNsTvGeUp +EPCkKvbdfpBzwDxI +EPCjjvbdqTtHRrLU +EPCkKvbdhgJbxvJu +EOcKjvbdkxsRryGt +EPCkKvbdZshhyETO +DnbkKvbdrWpLbiZR +EObkKvbdnHExMmfy +DnbkKvbdbUbGwkTh +DnbkKvbdnHExMnHZ +EObjjvbdZnmiFEyj +EObkKvbdSQUGjGDw +EPCkKvbdqTtGrRkU +EObjjvbdcImKLGXY +EObkKvbdShzJqAAl +DncLKvbdGGJqnIsq +DnbkKvbdehKuqmpg +DncLKvbddeOrCXDK +EOcLKvbdRMwbYmtz +DnbjjvbdgFlZmgHA +DnbkKvbdyOSgxTJD +EOcLKvbdQZNAGsSK +DoCkKvbdRMwayNtz +DncLKvbdezvYeItX +EOcLKvbdVAapsQrZ +DoCjjvbdcImKLFwY +DoDKjvbdTqQnttgm +DnbjjvbdOEdUJIkE +DoDKjvbdeYZssqez +DnbjjvbdZjSgpHCG +DoCkKvbdTvMPisaR +EOcKjvbdZjSgofaf +EPDLKvbdfVzwoizs +DnbjjvbdCSaCsewS +EPDLKvbdFVyPpMjF +EObkKvbddjJrVtzn +DnbjjvbdyOSgxTIc +EOcLKvbdrovPKDVf +DnbjjvbdxZhGGXeS +DncLKvbdbLLeoNcA +EOcKjvbdMfbomQUk +EPDLKvbdaRebhTfL +DoDLKvbdoAKztHcn +EOcLKvbdGckWJbJj +DncLKvbdqmZjYlHi +DncKjvbdZyDinDLr +DoCkKvbdxwhibPzL +DnbkKvbdZoOJFFZj +EPDLKvbdYpmEiMdq +DoCkKvbdiUzFWquC +DnbjjvbdsPvPJcVf +DncKjvbdDwxMTssl +EObkKvbdZQleJNEq +DoDLKvbdWSNxBdkc +DoCjjvbdcSbkTcia +EOcKjvbdqvolChyR +DnbjjvbdqlzJxlHi +DoCjjvbdlrZUzTEJ +EPCkKvbdGdLWJbJj +EObkKvbdzoPqFDLx +DncLKvbdANIYrwZx +EObjjvbdSPsgJfEX +DoCjjvbdbiNJjfWx +DnbkKvbdMfbpNQVL +EObkKvbddePRbXCj +EPDKjvbdShzKRAAl +DoDKjvbdnPyxukYb +EObjjvbdVZITzKoO +EPDLKvbdZyDinDMS +EPCjjvbdYpldhmFR +DoCkKvbdZjTIPfaf +EObjjvbdqdEiPmua +DnbkKvbdRadEkhxk +EPDLKvbdzjVPpDrt +DnbkKvbdaMkBsUlg +DncLKvbdMpXpunGs +DoDKjvbdUxgszLPO +EPCkKvbdiiegilxS +DoCjjvbdEOcKkWbd +EOcLKvbdcTDLUEJa +EPDLKvbdZtIiYcrn +DoDLKvbdmttyjirG +EPDLKvbdGdLVjBjK +DncLKvbdDigjVxKA +EPCkKvbdelfWflik +DoDKjvbdOTUVfdtp +DncKjvbdTlWOaVni +EPDKjvbdrpWOibvG +EPDKjvbdfRaWzlCo +DncKjvbdlrYuZrdJ +DoDKjvbdIsZBSlwl +EPDLKvbdqquLOKaN +DnbjjvbdJmAEZgUa +EPCkKvbdcImJkFvx +DncLKvbdkxrqsYft +EPCkKvbdUWLojTaR +DoDKjvbdnGeXlmfy +DoCkKvbdiMFDmuCy +EPDKjvbdauCHXjtI +DoCjjvbdBsAcUGXS +DoDKjvbdACrYJyhp +DoDKjvbdsZlPsBHn +DoDLKvbdjJegimXr +DoDKjvbdWXIwvDdg +DncKjvbdelewHNJk +EObkKvbdyTOJMrCH +DoCkKvbdNddUIiKd +DoCkKvbdRyjHrbvA +DoCjjvbdiGjCyWKV +DoDLKvbdhlFEOVDZ +EPCkKvbdQdDAoqDr +DoDKjvbdBiLBjhej +EOcKjvbdqlyjZLgi +DncLKvbdtSrTYzFD +DoCkKvbdrMyjYlHi +EObjjvbdhficYuiu +DoDKjvbdfekymgHA +EOcLKvbdiifHjNXr +EObjjvbdIwsaglQp +DoCjjvbdCIkBkIfK +EPDKjvbdaSFcHsfL +DoDLKvbdMgDPlpUk +EPDKjvbdqYnggQdY +DoDKjvbdaSFbgsek +DoCjjvbdiZtekqNf +EPDLKvbdkClKpftg +DoCkKvbduMYWaUAw +EObkKvbdtTSTYydc +DnbjjvbdptUGqrKt +EObjjvbdYlRctNlN +DncKjvbdMgDQNPtk +DncLKvbdILaznXQk +DoDLKvbdiCPDFWpq +DoCkKvbdiGicZWKV +DncKjvbdFjdrbglu +DncLKvbdKWUfDeGi +DoCjjvbdVhXuwgYz +DoDKjvbdhtzFWquC +EPCjjvbdRpTfiedX +DoCkKvbdKVuFdEfi +DoDLKvbdbBWEfPow +DoCkKvbdZyDjODLr +DncLKvbdeAUQmXif +DoCkKvbdIidAKQHE +EPCkKvbdTqROuVIN +DncKjvbdRXODcMID +DoDKjvbdkyTRsZHU +EPCjjvbdxnTIXrhc +EObjjvbdJzofXdAN +EOcKjvbdiBncFWpq +EObkKvbdYORAXuVt +DnbjjvbdiMEdNtby +EPDKjvbdVrOXbFMD +EPCkKvbdAMgxrwZx +DoCkKvbdtbbuXVoP +EPCjjvbdDoCkKwCd +DncLKvbdVBBpsRRy +DoDKjvbdemGWgMik +EObkKvbdeEnqbXDK +EPCjjvbdhanbdvqR +DnbkKvbdmaiwYOnV +DoCjjvbdcJMjLGXY +DnbkKvbdIryArlxM +EPCjjvbdtkwvaUAw +DnbkKvbdxZgefYFS +EPCkKvbderBWzlDP +EPCjjvbdNxPVzdOU +EPDKjvbdaSGDHsek +EOcKjvbdqcdhpOVa +EPCkKvbdxmsHxShc +DoDKjvbdDncKjwDE +DoCjjvbdYpmEhmFR +DncKjvbdaRfCgsfL +EObjjvbdegjurNpg +DnbkKvbdjhHMFenL +EPCjjvbdMfcPmQUk +EOcLKvbdACrYKZhp +DoDKjvbdffMZmgHA +DoCjjvbdaaVeGQQX +EOcKjvbdSCDdkiZL +EOcKjvbdqwPlCiYq +DoDKjvbdajlGPODA +DncLKvbdJYTbHkpp +DncLKvbdtcDVXWOo +EPCjjvbdEXxLtTsl +EPCjjvbdJuteceGi +DnbjjvbdDoCkLWbd +DoCkKvbduCbtwWOo +EPDLKvbdauBgYLTh +EPCjjvbdOXoVzcmt +DoCkKvbdRMxByOUz +DoCjjvbdqYoIGqDx +EPCjjvbdNGbpMpVL +DoCjjvbdJpzFOfNe +EOcKjvbdVAapsQrZ +DncKjvbdpxoIHQcx +EOcKjvbdRaceLiZL +DncLKvbdtcCuWvOo +EObjjvbdbBVeGPow +DnbjjvbdKyRKSzuG +EOcLKvbdFyVUaEYC +EPDKjvbdkCkkRHUg +EObkKvbdKaKfmBxR +DoDLKvbdbUbGwjsh +DnbjjvbdrovOjDVf +EPCjjvbdZsiIyDsO +EObjjvbdRDbaPqDr +EOcKjvbdnBivwnmu +EPCjjvbdYTMBMsoY +DoDLKvbdxKwEHzzG +EPCkKvbdqTsgRqkU +EPDKjvbdfMfWgNKL +DnbkKvbdznpREbkx +DncKjvbdJXtCHlRQ +EPDLKvbdGYuVBEXb +EPDKjvbdZLrEUOMN +EPDKjvbdtcCtvuoP +EObjjvbdXsLaNUPY +EPDLKvbdyOTIYSiD +EObjjvbdsrrTYyeD +EObjjvbdZisHpGaf +DoDLKvbdvOszqLOt +DncLKvbdaMjbSuNH +DncLKvbdYTMBMsoY +EPDKjvbdwzIGFxFS +EPDLKvbdmRyUyrci +DncLKvbdTkvPBWOi +EPCjjvbdNdcsiIjd +EPCkKvbdEzspdkbi +EObkKvbdrovOicVf +DoDKjvbdhbObeXQq +DncKjvbdZnnIeFZj +EObkKvbdRECaPpdS +EOcKjvbdnGeXlnHZ +EPCjjvbdauCGwjsh +EPCjjvbdczYpXyRC +EOcLKvbdDihJuxKA +EOcKjvbdkVwNcbXw +EObjjvbdbsCkTcia +DoCkKvbdfMewHNKL +DoCjjvbdxZgeexEr +EOcLKvbdiBoDEwQq +DnbkKvbdpstHSSKt +EOcKjvbdQvmdClHc +EPDKjvbdIxUBhLqQ +EObkKvbdZtJIyESn +EPCjjvbdtumwjQsA +DoCjjvbdNPxQunHT +EOcLKvbddndrkUTr +EObjjvbdCTBCsevr +EOcKjvbdiUzEwRuC +EPDKjvbdRyigrbvA +DoCjjvbdezvYeJTw +EOcLKvbdVgxVxGxz +DnbjjvbdZeXfzhIb +DncKjvbdxZgfFweS +DoCkKvbdKxqKSztf +DncLKvbdpyOggREY +EPDLKvbdXrlBNUOx +EPCkKvbdqwPkbiZR +EPDLKvbdbsCjscia +DoDKjvbdnGeYMmgZ +EOcLKvbdUsmTfLvK +DnbkKvbdjuwOEBxX +DnbjjvbdTAFJICPE +DncKjvbdEuxoomKF +EPDKjvbdeOdsLTsr +EObkKvbdZshiYdSn +DncKjvbdcTDKscjB +DncLKvbdvwMBWAvV +EOcKjvbdVwIwudFH +EPDLKvbdlZTSSxgU +EOcKjvbdMgColotk +EOcLKvbdZdxGzgiC +DnbjjvbdULuoBWOi +EObjjvbdiCObeXQq +EPDKjvbdNUsRkNAX +DoCjjvbdZxcjOClS +DncLKvbdiUzEwSVC +DoDLKvbdvlvAMceN +DoDLKvbdqcdhpOWB +EObkKvbdCSaDUGWr +DoCkKvbdssSTYydc +DoCkKvbdnGdxMmgZ +DoCkKvbdHELWJbKK +DoDKjvbdKefHbApu +EObkKvbdVqmwbFLc +DoCkKvbdUtNTekuj +EPDLKvbdTlWOaVni +DoCjjvbdDxXkstUM +EPCkKvbdpxoHfqEY +EPDKjvbdmSYtzTEJ +DoCjjvbdddnrCXDK +EPCkKvbdZjTHpGbG +DncLKvbdhzVGLqOG +EPCjjvbdZjSgogBf +EPDLKvbdkDLjqGuH +DncLKvbdxUmFRZLn +EPDLKvbdjhHMFfNk +EPCkKvbdZjTHpHBf +EObkKvbdegkVqnQg +EPDLKvbdGYttaEXb +EObjjvbdZdwfzhJC +DoCkKvbdGQASwHFy +EPDKjvbdkVvnDbXw +EObkKvbdJYTagkqQ +DoCjjvbdMSWlzVQz +DoCjjvbdnGeYMmfy +DoDLKvbdADRxKZiQ +EObkKvbdZLqdTmkm +EPCkKvbdFeirOItR +EPCkKvbdRjyGVGjs +DncLKvbdiMFDnUcZ +EObkKvbdVAaqSpqy +EPCkKvbdULunaVni +DnbkKvbdcImKKevx +DoCjjvbduaDyTPFI +EPDKjvbdKQydoFnF +EPCjjvbdozmcjwoA +DoDLKvbdZLqdUNlN +DoDKjvbdJXsbHkpp +DoCkKvbdelfXHNJk +EObjjvbdeFOqavcK +EPDLKvbdqlyjZMIJ +DoCjjvbdUtMsekvK +DoCkKvbdIxUBhMQp +EOcKjvbdemGWgMjL +DoCkKvbdwuMeQyLn +DncKjvbdkClKpgVH +DoDKjvbdfNFvflik +DncKjvbdhkdcmuCy +DoDLKvbdCJKakIfK +DnbkKvbdSQTgJfEX +DnbkKvbdkIGlGFmk +DoDKjvbdySmhlqbH +DoCjjvbdGdLVibJj +EPCjjvbdSLZGUfkT +EPDLKvbdSKxfVHKs +DoDKjvbdGLFSbhMu +DoCkKvbdqFcdtWAh +EOcLKvbdbVBfxLUI +DoDKjvbdcScKsdKB +DnbkKvbdVwJYWEFH +EPCjjvbdGQASwHFy +DnbjjvbdqUTfrRjt +EPDLKvbdEYYMTtUM +DoDLKvbdfNFwHNKL +EObkKvbdsQWPJbvG +EOcKjvbdIsYaSmYM +EPDKjvbdBdQAuilf +DnbkKvbdrounibvG +EObkKvbdiCPCdvqR +EOcLKvbdBsAbsfXS +DoCjjvbduDDVWuoP +EPCkKvbdbsCjtEJa +EOcKjvbdcTDLTdKB +DoCjjvbdXGYytAPT +DnbjjvbdePFTLTsr +EObkKvbddoErjssr +EPCkKvbdcTDKsdJa +EPDKjvbdjgflGFnL +EObjjvbddeOqbWcK +EObkKvbdACqwizJQ +EObjjvbdHgGyyXxH +DoCjjvbdqlzKZMHi +DnbjjvbdhfibxvJu +DoDKjvbdSCEFLiZL +EPCjjvbdSCEFLiYk +EObkKvbdiLdcmuDZ +EObkKvbdzGyMAMeX +EPDKjvbdVYhTzKoO +EPCkKvbdxrmiNRag +DoDLKvbdjKGHilxS +EOcKjvbdhWyAzzAJ +EPDLKvbdMfcQNQVL +DncKjvbdYkqdTmlN +DoDLKvbdjJfIJlwr +EOcLKvbdZeYGzghb +DncLKvbdJuuFceGi +EPCkKvbdhzUelRNf +DnbkKvbdBhkCKhej +DoDLKvbdhbObeXRR +DnbkKvbdzHZMAMdw +DoDKjvbdZxcjNblS +DoCjjvbdDwwksstM +DoCkKvbdUVkpJtAq +DoDLKvbdaaWEepPw +DncLKvbdGdKvJbKK +DoDLKvbdTulQJtBR +DoDKjvbdqceJPnVa +DnbkKvbdvAdZTOeI +EOcKjvbdVAbRSqRy +EPCkKvbdTqQnuVHm +DoCjjvbdwNWANDeN +DnbkKvbdZtIiYdSn +EPCjjvbdPIAXyAZB +EPCjjvbdZoOIeEzK +DoDLKvbdmJETqUrB +DoCjjvbdOFDtIiKd +DnbkKvbdqvolDIxq +DnbjjvbdmgFYNNfy +DncLKvbdieLHUoAO +EPCkKvbdDnbkLWcE +DoCjjvbdmJETpuSB +DncLKvbdiiegjNXr +EPDKjvbdZQldiMeR +EOcKjvbdZHXEAPTJ +EObkKvbdWHwvXfxz +DnbkKvbdxUleRZLn +DnbkKvbdtvNxKQsA +DoDKjvbdOStWHEuQ +DnbkKvbdsBellHLZ +DoDKjvbdsCFllGkZ +EPDKjvbdjhGlGGOL +DncKjvbdxxJKBoyk +DncKjvbdrXPkcJYq +DoCkKvbduVnXipsA +DoDKjvbdjKGHjMwr +DoDKjvbdbBWEfPpX +EOcKjvbdznoqEcMY +DoCkKvbdySnJMqbH +DoCjjvbdlrZVZsDi +EPDLKvbdKfFgbApu +DoDLKvbdZRMdiNFR +EObjjvbdpeceUWAh +EObkKvbdRotHKFcw +DncKjvbdiZuFkpmf +DoDKjvbdnGdwmNgZ +DoDKjvbdMoxRVnGs +DoDLKvbdiVZeXRtb +EOcKjvbdGAoRYizm +DoDKjvbdJJdAJpGd +DoDKjvbdwMvANEFN +DnbjjvbdaaWFFpQX +DnbjjvbdqlzKZMIJ +EPDLKvbdxnShXsJD +DncLKvbdMfcPlotk +DncLKvbdURRPVUhN +DnbkKvbdHgGzZXxH +EOcLKvbdYlRctOMN +DncKjvbdnHEwlnGy +DoDKjvbdlYsSTZGt +EOcKjvbdZxcjNcLr +EObjjvbdmttyjjSG +EObkKvbdffLynHHA +DnbkKvbdmpZxvLZC +DncLKvbdBhjakJGK +DoCkKvbdpstHSRkU +EPDLKvbdiLddOVCy +EOcKjvbdxUleQyLn +EPCkKvbdTukpKTaR +EOcLKvbdjvXOECYX +EObjjvbdRWnEDLgc +EObkKvbdbhljLGWx +EPCkKvbdZoOJEdyj +DnbkKvbdqrVKnLAm +DoDKjvbdVAbRTRRy +DnbkKvbdhfjDZWKV +EOcLKvbdkWXOECYX +DnbkKvbdYTLaMsnx +EObjjvbdZRNFImFR +DncLKvbdCWzdIdpW +EOcLKvbdpyPIGqDx +DoDLKvbdiCOcFWpq +EPCjjvbdhtzFXSUb +Dnbjjvbdlqxtyrci +DoCkKvbdiZtelROG +EPCkKvbdVUNUFkvK +DnbkKvbdNddUJJLE +DoCkKvbdNdctIhjd +DnbkKvbdcyyQYZQb +EObkKvbdQmYByNtz +DoDLKvbdVrNxBeMD +EPCjjvbdCTBCsevr +DncLKvbdtSrTYyeD +DnbjjvbdRyigsDWA +DncLKvbdJYUBglQp +DoDKjvbdSPsfiedX +DoCkKvbdADRxKZiQ +EPDLKvbdrEFJPmvB +DnbjjvbdvAcyTOdh +EOcKjvbdaMjasUmH +DoDKjvbdZjSgogBf +DnbkKvbdnGeXmOGy +DnbjjvbdMgComPuL +EPCkKvbdxKvcgzzG +DncKjvbdwtldpyMO +DoDKjvbdbhlikGXY +EPCkKvbdpyPIHREY +DoDLKvbdkClLRHUg +EPDKjvbdqFdFUWBI +EOcLKvbdkxrqrxgU +DoDLKvbdTvLoitAq +DoCjjvbdJuuFcdfi +EPCjjvbdrykpTAhO +EPCjjvbdiZuFkqNf +EObjjvbdEuxpQNKF +EPCjjvbdGGKSOJUR +EPCkKvbdcyxowxqC +DnbjjvbdjhGkeemk +EPDKjvbdijGIJmYS +DnbkKvbdypnliKXA +EOcKjvbdRadFLhyL +EPCjjvbdxwiKCPyk +DoCkKvbdfILVqnQg +DoDLKvbdkNCLzEgP +DoCkKvbdGKdrbglu +DnbkKvbdJcJcRJcY +DoDLKvbdIwsahMRQ +DnbkKvbdNddUIhjd +EPCkKvbdJuuGDdgJ +EPDLKvbdjKGHjMwr +EObkKvbdGdKvKCJj +DncKjvbdNUrqkNAX +DoDLKvbdTqQoVVHm +DoDKjvbdNddTiIkE +EPCkKvbduaEZTPFI +DnbjjvbdFWYopMie +EObjjvbdyXhiaozL +EPCjjvbdhaoDFWpq +DncKjvbdJJdAKQHE +DoDKjvbdegkVrOQg +DnbjjvbdwuMdqYlO +EPCkKvbdLKaHvAJy +DoDKjvbdRbEFLiYk +DoDKjvbdSxLMNzjx +DnbkKvbdGKdsChMu +DncKjvbdACrYJzJQ +DoCjjvbdbUafwkUI +DncKjvbdzjVPpDrt +DnbjjvbdFfKSOJTq +EPDKjvbdHffyyXxH +EOcLKvbdRkZFtgLT +EOcKjvbdXsMAmToY +EOcLKvbdNPwqWNfs +DoCjjvbdEuxpPljF +DncLKvbdjJfIJlxS +DoCjjvbdhgJbxuiu +EPCkKvbdrDdhpOWB +DnbkKvbdwWlBWAuu +EObjjvbdySmiMrCH +EPCjjvbduWOXjRTA +DncLKvbdRDbaPqES +EPCkKvbdjEkHVPAO +EPDLKvbddiiqvUzn +EPDKjvbdyYJKCPyk +DncKjvbdNeEThiKd +DncKjvbdrbGMlGkZ +EOcKjvbdOTTvHEuQ +EObjjvbdFyVUaEYC +EPCkKvbdbiMikFwY +EPDKjvbduaDxsPFI +DncLKvbdozmckYPA +DoDLKvbdVYgsykPO +DoCjjvbdQvnDbkgc +DncKjvbdZLrDtNkm +DoDKjvbdHfgZyYXg +DoDKjvbdauCGwkUI +DoDKjvbdmJDsqVSB +EOcKjvbdhgJbyWKV +EPCjjvbdrouoKDWG +DoDKjvbdQmYCYnUz +DoDLKvbdfHkVqmpg +DoCjjvbdZjShPfaf +DoCkKvbdIGfzYxYH +EPDKjvbdZRMeJNFR +EPCjjvbdRpTgKFdX +EPCkKvbdEYYMUUUM +DncLKvbdwuMdqZLn +EOcKjvbdmuVZkJqf +DncKjvbdhgJbyWJu +DnbjjvbdKVuFcdfi +EPCkKvbdRadElIxk +EPCkKvbdYlSDsmkm +DoDKjvbdhlFEOVDZ +DoCjjvbdIsZBSlwl +DoDKjvbdLAkGmCXq +DoDLKvbdqwQMCiYq +EPDKjvbdURROtuIN +DoCjjvbdpxoHgREY +DncKjvbdwXLaWAuu +EObjjvbdrpWPJcWG +EPDLKvbdmozYvLYb +EPCkKvbdMowpunGs +DnbkKvbdANHySvzY +DncLKvbdZyDinDLr +DoCjjvbdziuPpESt +EPDKjvbdiVZeXRuC +EPDLKvbdDncKkWbd +EOcLKvbdFVxopNJe +DncLKvbdACqxJzIp +DncKjvbdaMkCTUlg +DoCkKvbdhyuGMQnG +EObjjvbdbBWFFpPw +EObkKvbdTAEiICPE +DoDKjvbdbUagXjtI +DoDLKvbdGZUuAcwb +DoDKjvbdnGdwlmgZ +DoDLKvbdVBCRSpqy +DnbjjvbdfIKvRnRH +EObkKvbdaRebgsek +DnbjjvbdNVSrLNAX +EPDKjvbdrJAKEmPF +DnbkKvbdBdQBWKNG +DoCjjvbdePFTLUUS +EPCkKvbdRDcAoqDr +DncLKvbdrNZiyLhJ +DoCkKvbdLqwNZtpz +EPDLKvbdlqxtzTEJ +DnbkKvbdrRtjmkBN +EPCkKvbdZRMeJNEq +DnbkKvbdZsiJYdTO +EObjjvbdUtMtGLvK +EOcLKvbdnCJwYOnV +DncLKvbdUMWPAuni +EOcKjvbdJcJbpjDY +DoCkKvbdcImKLGXY +EObkKvbdYSlAmTnx +DncLKvbdCTBCtFvr +EObjjvbdqlyjYlIJ +DoCkKvbdmSZUzSci +DoDKjvbdjEjfuPAO +EPCjjvbdWfYzUAPT +DnbjjvbdzROmJJwA +EObjjvbdnQZyVjyC +DncKjvbdjAQGaPgK +EObkKvbdtTSTZZeD +DoDLKvbdZLrETnLm +DncKjvbdCDpAujNG +DncKjvbdUyHsykOn +EPDLKvbdeXystRez +EPCjjvbdlrZUyrci +EPDKjvbdwjvcgzzG +EPDKjvbdnHExNOGy +EOcKjvbdZLqdTmlN +EPCkKvbdEuxopMjF +EObjjvbdJYTaglRQ +EPCjjvbdrWpLbiZR +EPCjjvbdNxOuzcnU +DoDLKvbdijFhKNXr +DnbkKvbdKWVGEFHJ +DnbkKvbdKCicQjCx +DoCkKvbdcScLTdKB +EOcKjvbdKWUecdfi +DoCjjvbdiLeDmuDZ +DncKjvbdySnJNSCH +EPDLKvbdZshhyDrn +DnbkKvbdssSSxydc +EOcLKvbdqrUjnLBN +EPDKjvbdGdLWKCKK +EObjjvbdsQWPJbuf +DoDLKvbdJcKDRJcY +DoCjjvbdZoNiEeZj +DnbkKvbdGFjSOJTq +EPDLKvbdxxJKBozL +DoDKjvbdBraDUGXS +EPDKjvbdJbjCpicY +DoCjjvbdVqmwbEkc +EPDKjvbdijFhKMwr +EPDLKvbdrSVLNkBN +DoCkKvbdiUzEvquC +EPCjjvbdWIYVxGxz +DnbkKvbdZoOIdeZj +DncLKvbdZRMeJNEq +EObjjvbdZMSDtOMN +DnbjjvbdRWnDcLgc +DoDLKvbdmRxtzTDi +EOcKjvbdJmADygUa +EOcKjvbdxUmFQyMO +EOcLKvbdOTUWHEtp +DoDLKvbdZRNFJMeR +EOcLKvbdxmsHxShc +EPCkKvbdUxhTykPO +DoCkKvbdelfWfljL +EPDLKvbdFejSOJTq +EPCkKvbdKefIBaRV +DncKjvbddeOqbXDK +EOcKjvbdhlEcnUcZ +DoCkKvbdZtJJZETO +DnbjjvbdSPtHJfDw +DncLKvbdOFDtIhkE +EPDLKvbdFyVVAcwb +DoCjjvbdqTtGqqjt +EOcLKvbdyTOIlrCH +DnbjjvbdACrYKZiQ +DoDLKvbdvmWAMceN +DoDKjvbdLBLHNCYR +EPCkKvbdIxUCHlQp +EPDLKvbdQmXayNtz +DoCjjvbdKRZdoFme +DncLKvbdZoNiEdyj +DoDKjvbdqqtkOLBN +EPCkKvbdiZuFkpmf +DncKjvbdEPCjkXCd +DoDKjvbdbVBgXjsh +DoCjjvbdmRyUzSdJ +EObjjvbdMJCLpxAS +DoCjjvbdwWlBWAvV +EPDKjvbdNHCpMouL +DncKjvbdEOcLKwDE +DoCjjvbdwjvcgzzG +DnbkKvbdNGbpNPtk +DoDLKvbdZGwEAOri +EObjjvbdaRfDITfL +DoDKjvbdVvhwudEg +EPCjjvbdHgGyxwwg +DncKjvbdcJMikFwY +EObjjvbdwMvAMdEm +EOcKjvbduMYXBUAw +EPDLKvbdpfDeTuaI +DoDKjvbdssSSxzEc +DnbjjvbdjblLRHUg +EOcLKvbdVwIxWDeH +EPCkKvbdLGFgaaQu +EPDKjvbdBiKakIfK +DoDLKvbdEOcKjwDE +EOcKjvbddijRvUzn +DoCjjvbdmaivxPOV +DnbkKvbdMfcQNPuL +DncLKvbdZtIiZDsO +DoDLKvbdhlEcmuDZ +EOcKjvbdIGfzYxYH +DncLKvbdICLydzAD +EPDLKvbdMfcPmPuL +DnbjjvbdrRuKmjaN +DnbkKvbdbsDKscjB +DoCkKvbdhkddNtcZ +EOcLKvbdNQXqVnGs +DoDLKvbdrEFIonVa +DoCjjvbdQvnDcMID +EPCjjvbdjlalZeGo +EPCkKvbdjJfIKNYS +EObjjvbdREDBPqES +EPCjjvbdiZtfMRNf +DoDKjvbdADRxJyiQ +DncLKvbdYkqcsnMN +DncLKvbdZshiZDsO +DoDLKvbdRNXayNtz +DncLKvbdqcdiPmvB +EPCkKvbdrNZixlHi +EPCjjvbdwtmFRYlO +EObkKvbdJTZBTNXl +EOcLKvbdWRnXadkc +DoDLKvbdvwMBVaVu +DoDKjvbdlZSrTYgU +EPDLKvbdQcbaQRDr +DoCjjvbdhuZdvrUb +DnbkKvbdZxdKOClS +DncKjvbdJzoexEAN +EOcLKvbdQvmdDLhD +DncLKvbdunszpkPU +EOcKjvbdiZuGMQnG +DncKjvbdVZIUZkOn +DoDLKvbdkxsRsYgU +EPCjjvbdGQASwGey +DncKjvbdnBivwoNu +EPDLKvbdsBelkfjy +DoDLKvbdddoRbWbj +EPCjjvbdhancFXQq +EObkKvbdJvUfEEfi +EPDLKvbdIidAKPfd +DoDLKvbdxVMdpxkn +DoCjjvbdaNLCTVNH +DnbkKvbdZyDinDMS +DoDLKvbdrMzJyLhJ +EPDLKvbdyXhiaozL +DoCjjvbdGKeTDHlu +DncKjvbdwzIGFxFS +EObjjvbdJvUedEfi +DncLKvbdIjEAJpGd +DncKjvbdyTNiNRbH +EOcKjvbdidkGuPAO +DoDLKvbdkVvmcbXw +DoCjjvbdJYTbHkpp +DoDLKvbdFyVVBEYC +EPDLKvbdmoyyVjyC +EOcKjvbdcTDKtDjB +EPCjjvbdEvYpPmJe +DoCjjvbdCJLCKhej +DoCjjvbdSKxfUgLT +DoDLKvbdFjeTDINV +DncLKvbdEXxMUTtM +EOcKjvbdWRnXaeMD +DoCjjvbdrMzJyLgi +DoCkKvbdcSbkUEKB +DnbkKvbdyzeOSIIh +DncLKvbdpstGqrKt +EPDKjvbdCJLBkJGK +EOcLKvbdJcJcQjDY +EPDLKvbdbLLfPNcA +DnbjjvbdEASImZwX +DnbjjvbdtumwiqTA +DnbkKvbdxKvdHzyf +DoCjjvbdVwIxWDeH +DncLKvbdYzcFqjVy +EPDKjvbdqiAJeMoF +DoDLKvbdNQXqVmfs +EPDLKvbdFjdsChNV +DoCkKvbdOTUWGdtp +EOcKjvbdOEdUIiKd +EOcLKvbduaEZSoFI +EOcLKvbdxsNhlrBg +EObkKvbdcIlijfXY +DoDLKvbdLqvlytpz +DoDKjvbdIryBTNXl +EObjjvbdQwOECkhD +DoCjjvbdLFegaaQu +EObkKvbdFkFTChNV +DnbjjvbdyzeOSHiI +EObjjvbdLAkHNCYR +DnbkKvbdZyDimcMS +DncKjvbdkMbLzEgP +DnbjjvbdRbEEkhyL +EOcKjvbdLrXMzVQz +EOcKjvbdVBBqTRRy +EObjjvbdyNsHxTIc +EPCjjvbdMuTRkNAX +DoCkKvbdUaCQrprZ +EPCjjvbdjmCLydfo +DoCjjvbdFyVVAcxC +EPCjjvbdQvnDblID +DnbjjvbdLhbLqYAS +DncLKvbdFxuVBEYC +DncKjvbdGLFScIMu +DncKjvbdBvzcheQW +EPDLKvbdSPsfjFcw +DnbkKvbdsQWOibvG +DnbkKvbdaSGChTfL +EPDLKvbdjmBkzFGo +DoDLKvbdqAiFAWhE +EPDLKvbdkVwNcaww +DoCkKvbdKRZePGOF +EOcLKvbdJXtCIMRQ +EPCkKvbdaNLCTUmH +EPDLKvbdliDtRUrB +EOcLKvbdKfGHbApu +EObkKvbdDwwlTstM +DoDLKvbdmgExMmfy +EOcLKvbdKWUfEFHJ +EPCjjvbdkxrqrxft +DncLKvbdkClKqHUg +DoDKjvbdVqnXadlD +DoDLKvbdULvPBWPJ +DoDKjvbdUslsfMWK +EOcLKvbdJvVFdFGi +DncKjvbdiifHilxS +EPCkKvbdRaceMJYk +DoCkKvbddwytTrFz +EPDLKvbdYkrETnLm +DoCjjvbdiMEdOUby +DoCkKvbdxVMeQyLn +EPCkKvbdwuMdpxlO +EPDLKvbdNPxQumfs +DncKjvbdYpleJNEq +DncKjvbdTAEhhCPE +EOcLKvbdUGznLwVe +EOcKjvbdNPwpunHT +EPDLKvbdKaLHNBwq +EOcLKvbdFfKRmhtR +EObkKvbdYlRcsmlN +DoDLKvbdWSOXadlD +EOcLKvbdWWiXucdg +DoCkKvbdZsiIxcsO +DoDLKvbdbhlikFvx +EOcKjvbdtlYXAsaX +EOcLKvbdUtNTelVj +DoDKjvbdhaoDFXRR +DoDLKvbdEuxoomJe +DoDLKvbdEYYLtTsl +DncLKvbdbhmJkGWx +EPDLKvbdqwPkbhxq +DnbjjvbdlrYuZsEJ +DncLKvbdeKKSWUzn +DnbkKvbdyTNiNSCH +DncKjvbddwzTsqez +DncLKvbdTXkMNzjx +DoDKjvbdJmAEZgUa +DncKjvbdeEnqavbj +EPDLKvbdcJNJjfWx +DncLKvbdPyNAGsRj +DoCjjvbdLGGHbAqV +DncKjvbdddoRbWcK +DoDLKvbdZjTHogBf +EPDLKvbdRkZFuHKs +EOcLKvbdEuyPoljF +EPDKjvbdEYYMTtUM +DncKjvbdDxXlTssl +DnbkKvbdQvmcblID +EObkKvbdjmBkydgP +DoCkKvbdOAJTUKSA +DncKjvbdhgJbxvJu +DoDKjvbdVvhxVceH +DoCkKvbdjvXODaww +EPDKjvbdemFvflik +DoDKjvbdkCkkRGtg +DoCjjvbdDigjVxKA +DncLKvbdLAjgNCYR +EPDKjvbdbUbGwkTh +EObjjvbdmuUzLJrG +DnbjjvbdmgFXlnGy +DoCkKvbdFxttaDwb +EPCjjvbdJcKDRKCx +DoCkKvbdpfDeUWAh +EPDLKvbdADSYJyhp +DoCjjvbdHkazmvqL +DnbkKvbduLxWaUBX +EPCkKvbdQdCaPpdS +EOcLKvbdZdwfzhIb +EPDKjvbdKWUeceGi +EPDKjvbdSCDeMJZL +DoDKjvbdyOShYShc +EObjjvbdliEURVSB +DncLKvbdmgEwlnGy +DnbkKvbdsBemMHKy +DoDKjvbdYzcGSJvZ +EObkKvbdGcjvKBjK +EOcLKvbdJuuGDdgJ +EPCjjvbdOStWGeUp +EOcLKvbdGLEsChMu +EOcLKvbdeATqNYJf +DncLKvbdxxIjCQZk +EObkKvbddZyQXyQb +DoDKjvbdVBCRTRRy +EPCjjvbduDDVWuoP +EOcKjvbdVZHtZkOn +EPCjjvbdZQmEhmFR +DnbkKvbdZyDimcLr +EPDLKvbdjblKqHVH +EOcLKvbdZtIiZDsO +DnbkKvbdRWmcbkhD +EPCjjvbddneSjtTr +DoCkKvbdZQmFJMdq +DoDLKvbdLFegbBRV +EOcKjvbdSwkMNzjx +DoCjjvbdFjeTDHlu +EPCjjvbdtSqrxydc +DncLKvbdSPtHKFcw +DncLKvbdyYJJapZk +EOcKjvbddxZssrFz +EObjjvbdfekzOGgA +EPDKjvbdrylQSaHn +DnbjjvbdZisHofbG +EObjjvbdrbGNMHKy +DnbkKvbdLBKfmBxR +DncKjvbdACqxJyhp +DncLKvbddijRutzn +EPDLKvbdMpYRVmfs +DncLKvbdmttzKiqf +DnbkKvbdZnmhdeZj +EPCkKvbdjKFgjNYS +DnbjjvbdxnTHxShc +EPCjjvbdlZTSTYgU +DoCjjvbdqlyjYkgi +EObkKvbdxVMeQyMO +EPDLKvbdSPtHJecw +EPDLKvbdrpWOibvG +EObkKvbdRbEFLhyL +DoCkKvbdYNqAYUvU +DoCkKvbdnCKXXnnV +EObkKvbdddoSBvbj +DncKjvbdNGcPlpUk +DnbkKvbdmajXXnmu +DoCjjvbdJXsbHlQp +DncLKvbdNGcPlouL +DoCkKvbdTAFJHaoE +EPCjjvbdnPyxvKyC +EPCkKvbdRyihTDWA +DncLKvbdQlxCZNtz +EObkKvbdJSyAsMwl +DoCjjvbdmttykJrG +EPCkKvbdfpBzwEXh +DoCjjvbdrzMQTBIO +EPDKjvbddZxowyRC +DncKjvbdaNKaruNH +DnbjjvbdaNKasVMg +DncKjvbdcbTNSATm +EPCkKvbdiLdcnVDZ +EObjjvbdYTLaMtOx +EOcKjvbdEASIlzWw +DnbjjvbdziuPodTU +EOcLKvbdqUUHRqkU +DnbkKvbdyNsHxSiD +EObjjvbdhkeDnUcZ +EOcKjvbdNHCpNQUk +EPDLKvbdIryBSmYM +DnbkKvbdfekynGgA +EOcLKvbdiHKCyWJu +EObkKvbdrMzKYlIJ +DoCjjvbdsZkoraIO +EOcKjvbdQccAoqES +DoCjjvbdtTRrxzFD +EPCjjvbdJXtBhMRQ +DnbjjvbdsBfNMHKy +DnbkKvbdeEnrBwCj +DoDLKvbdTfzmkvvF +DoCjjvbdCJLCLIej +DnbjjvbdNUrrLNAX +DoCkKvbdxsNiNRag +EPCjjvbdtbcUwVoP +DoDKjvbdaogHDkzd +DncKjvbdpedFTuaI +DnbjjvbdqYngfpdY +DncKjvbdbiNJkGWx +DoCjjvbdGckVjBij +EObkKvbdqceIomvB +EPDLKvbdFWZQQNJe +EObkKvbdrRtkOLAm +DncKjvbdDwwktUTl +EObkKvbdwNWAMceN +DncKjvbdZMSDtOLm +EObjjvbdTkvPAuni +DoDLKvbdUxhTykPO +EOcLKvbdVBCQsQqy +EPDKjvbdZshhxcrn +DnbjjvbdqdEiQOWB +DoDKjvbdkWWmdBww +DoDLKvbdzQoMhiwA +DnbjjvbdUGzmlXWF +DncKjvbdJTYaTMwl +DoDKjvbdGLFScHmV +DoDKjvbdrWpLcJZR +EOcKjvbdwNWAMcdm +EObkKvbdmfeYNOGy +EObkKvbdtcDUwVoP +DnbjjvbdiZuGMQmf +EObjjvbdfMewGmJk +DnbjjvbdANIZTWyx +DncKjvbdtTSSxydc +DnbkKvbdsBfMkfjy +DoDKjvbdSLYfUgKs +DoDLKvbdZisHogCG +EObkKvbdVTlsfMVj +DncKjvbddZyPwxpb +DncLKvbdAMhYsXZx +DncLKvbdxwhjCPzL +EOcKjvbdKRZeOeme +DoCkKvbdunszqLOt +EPDKjvbdZRMdiMdq +DnbjjvbdEuxpPljF +EPDLKvbdGGJrOJUR +EPDKjvbdVviXudEg +DnbjjvbdpfDeTvBI +DncLKvbdRadElJYk +EPDKjvbdaMjbSuMg +EPDLKvbdTAEhhCOd +DncLKvbdTIyiqABM +EPCkKvbdBsBDUFvr +DoCjjvbdcSbkUEJa +EObjjvbdCIjbKhfK +DoDKjvbdauCHXjsh +DoCkKvbdpyPHfqEY +EOcLKvbdDwxMUUUM +DnbjjvbdGFjRmiUR +DoDLKvbdbQGgELzd +EOcKjvbdGGJqnItR +EPCjjvbdxrnJNRag +DoDLKvbdbhmJkFwY +EPDKjvbddoFSkTtS +DncKjvbdNUsSKmAX +EPCjjvbdfelZmfgA +DoCkKvbdjKGIJlwr +EPDLKvbdJYTaglQp +EPCkKvbdVrOXbFMD +EPDKjvbdTpqPUuIN +EPCjjvbdGckViaij +DnbjjvbdczZQYYqC +DoDKjvbdMtrqkNAX +EObkKvbdaNKartmH +EPDKjvbdmSZUysDi +EOcLKvbdlhdURVSB +DncKjvbdWRnXbEkc +DncLKvbdLBKfmBwq +EPDKjvbdZdwfzhIb +EPCkKvbdhancFXRR +EObkKvbdaSFbgtGL +DncLKvbdJXsaglQp +DncLKvbdUsltFlVj +DoDKjvbdLBKfmBwq +EPCkKvbdnVVZjirG +EObjjvbdiZuFlROG +EObkKvbdwygeeweS +EPCkKvbdwjvcgzyf +DnbkKvbdssRsYzFD +DnbjjvbdxwiJaoyk +EPCjjvbdVhYWYHYz +DncKjvbdhzVFkpnG +DncLKvbdeJjSVtzn +DncLKvbdyYIjCPyk +EPDLKvbdJpzEoGNe +DncKjvbdnBiwXoNu +EOcKjvbdVrOYCElD +EObkKvbdLBKgNCXq +EPDKjvbdTlWPBVni +EPDKjvbdFxuVBDxC +DncKjvbdnHFXlnGy +EPCjjvbdYkrDtOMN +DoCkKvbdUWMPjTaR +DoCjjvbdjSziSjiz +DnbjjvbdeOdsKtUS +EPCkKvbdmfdwmOHZ +EObjjvbdtSrTYydc +DnbkKvbdRjxeuGkT +EObkKvbdKeehCApu +EOcLKvbdpxoIGqEY +DncKjvbdbLMGOnDA +EPCkKvbdEXwktUUM +EObkKvbdiUzFWqtb +DoCjjvbdiHKCyViu +EObkKvbdvwLaWAuu +DoDLKvbdiCPDEvqR +EOcKjvbdWXJXvEEg +DoCkKvbdqTtGrSLU +DnbkKvbdtbbuXWOo +EObjjvbdgGLzOGgA +DncKjvbdTlVoBWPJ +DoCkKvbdeEoRbWcK +DoCkKvbdkWWmdCXw +DncKjvbdehLWRmpg +EPCkKvbdjFLGtoAO +DoDKjvbdGLFScIMu +EObjjvbdrRtkOKaN +EPCkKvbdczZQYYqC +DnbjjvbdfHkVqnRH +EOcLKvbdtvNxKRTA +EPCkKvbdADSYJyiQ +EOcKjvbdmJETptrB +EOcLKvbdURQoUtgm +DoDLKvbdZMSDtOMN +EPCjjvbdFfJqnIsq +EOcKjvbdcJNKKfWx +DnbjjvbdkySqrxft +DncLKvbdJpyePFme +DncKjvbduCcVXWPP +EOcLKvbdxKvcgzzG +DoDLKvbdpfEEsvAh +EObkKvbdZyDjNblS +EPCjjvbdhbPDEwRR +EPDLKvbdTqQoUthN +DoDKjvbdxnSgxShc +DoCkKvbdcTCjscjB +DoCkKvbdOTUVfeVQ +DncKjvbdkMbMZeHP +DncLKvbdEvYpPmKF +DncLKvbdJTZBTNYM +EObjjvbdIHGyxxYH +EOcKjvbdraemLfkZ +EOcKjvbdMpYRVmgT +DncKjvbdxZgfFxEr +DnbkKvbdpxoIGpcx +EPCkKvbdkIGlGFnL +DoDKjvbdUslselVj +DnbjjvbdZnnJEdzK +DncLKvbdehLVrORH +DoCjjvbdySmhlqbH +DoDLKvbdADSXiyhp +DoDKjvbdZtJJZDrn +DoCjjvbdezvZEiUX +EOcLKvbdqTtHSRkU +EPDKjvbdVgxWXgYz +DoCjjvbdGZUuBDwb +DncLKvbdhzUekpnG +EPCjjvbdZxcinDMS +EPCkKvbdOFEThiLE +DoDLKvbdhzVGLqOG +EObjjvbdkySqryGt +DoDKjvbdmpZyVkYb +DoCjjvbdnHFYMnGy +EObkKvbdRotGjFcw +EPDKjvbdjblKpgUg +EOcLKvbdWWiYVdFH +DoDLKvbdtbcVXVoP +EPDLKvbdqqtkOLAm +EPDLKvbdmRyUysEJ +DnbkKvbdxnShYTJD +DoDLKvbdGKeSbhMu +DoCkKvbdjuwODbXw +DncLKvbdaMkCSuMg +DncKjvbdtbcUvuno +DnbjjvbdiVZeWqtb +DoCjjvbdLBKgNBxR +EObkKvbdlZSqrxgU +EPCkKvbdULunaWOi +DoCkKvbdwzIGGYEr +EPCkKvbdnHExNOHZ +EObjjvbdpyOgfqEY +DnbjjvbdpedFUWAh +DoCkKvbdhaoDFXQq +DnbkKvbdYqMdhleR +DnbjjvbdsZkpSaIO +EPDKjvbdJcJbqJbx +EObjjvbdehKvRmqH +EOcLKvbdmIdURVSB +EPDLKvbdvOszqKoU +EOcLKvbdZisIQGbG +DnbjjvbdFyVUaDwb +EPCjjvbdTAEiIBoE +DncLKvbdRkZFtgKs +EOcLKvbdzdynzdyp +EOcLKvbdnUtykKSG +DoDKjvbdZQmEhldq +EOcKjvbdnBjWxOnV +EPCkKvbdqvpLbiZR +DoDKjvbdrykosBIO +EOcLKvbdBiKbLJGK +EPDLKvbdBvzciFPv +DoCjjvbdemFwGlik +EPDLKvbdqTsfqqjt +DncLKvbdptUHRrLU +EObkKvbdbUbGwjsh +DoCkKvbdHffyyXwg +EPCjjvbdgGMZnHHA +EPDKjvbdFejRmhsq +DoCkKvbdQvmdCkgc +DncLKvbdyNsHxShc +DoCkKvbdrDeIpOWB +EObkKvbdYzcGRiuy +DncKjvbdMowqWNfs +DoDLKvbdbsDLTcjB +EPCkKvbdZQmEiNEq +EObjjvbdNPwqWNfs +DoDLKvbddeOrBwDK +EObkKvbdrNZixkgi +DoDKjvbdtlXvaUBX +DncKjvbdtunYKRTA +EOcLKvbdfSBWzkcP +EObjjvbdVAbRTQrZ +DnbjjvbdcJNKLFvx +DncKjvbdssRsYyeD +DoDLKvbdqTsgSSLU +EPCkKvbdMowqVmgT +DoCjjvbdDnbjjvbd +EPCkKvbdlhdURUqa +DncKjvbdqrVLOLAm +DoDKjvbdNHDQNQUk +EPCkKvbdXsLaMtOx +EPCkKvbdRosgJfDw +DncLKvbdKVuFcdgJ +DoCjjvbdGGKRnItR +DnbkKvbdeEnrCWcK +EPDLKvbdlZSrTYgU +EPCjjvbdtSrTYyeD +DoCkKvbdZisHpHCG +DnbjjvbdbrbkUDia +DnbkKvbdhficYvKV +EOcKjvbdsBfMlHLZ +DoDKjvbdBdQBVjNG +DnbkKvbdTvLpKUAq +DoCjjvbdzaAPGgCM +EObjjvbdiVZeWrVC +EPCjjvbdZshiYcrn +EObjjvbdRNXbYnUz +EObkKvbdBcpBWJlf +DncKjvbdtbcUvuoP +DoCkKvbdmfeXmNgZ +DncLKvbdbPfgELzd +DncKjvbdZshiYdSn +EObkKvbdDjHiuwjA +DoDLKvbdfIKvRnRH +DnbjjvbdiLeDmtcZ +DoDLKvbdQwNcblID +EObkKvbdmRyUzSdJ +DnbkKvbdnHFYMnHZ +EOcLKvbdfHjvSORH +DncLKvbdlZSrSyHU +EObkKvbdtSrSxzFD +EObjjvbdZyEKNcLr +EObkKvbdRkYeuHLT +EOcKjvbdTkuoAuoJ +DnbjjvbdEPDKkXCd +EPCkKvbdnCJwXoOV +EObjjvbdxrmiMqbH +DoDLKvbdRaceMIyL +EPDKjvbdRosgKFdX +DoCjjvbdzoQQeDMY +DncKjvbdZyEJmcMS +DoDLKvbdOFDshiLE +EPDKjvbdSQUGiedX +EPCkKvbdTIyjRAAl +EObjjvbdxUmFRYkn +DncKjvbdmpZyWLYb +DoCkKvbdygZMANEw +DoDLKvbdhuZeWquC +EObkKvbdFyUuAcxC +DoCkKvbdiCPCeXQq +DncKjvbdsCFlkfkZ +EPCjjvbdNPwpvOHT +DoCjjvbdSPtGjGDw +DncLKvbdAMhZSvyx +EPCkKvbdWXJYWDdg +EPDKjvbdaogHDkzd +DoDLKvbdRosgKFcw +EPDLKvbdrRtjnKaN +DncKjvbdvBEZSoEh +DoDLKvbdmajXYOmu +DnbjjvbdfNFwHMjL +EPCkKvbdezuyEhtX +DoCkKvbdHffzZYYH +EPCkKvbdvAdYsOdh +EPCjjvbdhlFDnVDZ +DncKjvbdbiNKLFvx +DoDLKvbdMIalQxAS +EPDLKvbdGckWKBjK +EOcKjvbdvOszqKnt +DoCkKvbdraelkgKy +EOcKjvbdMgComPtk +DoDKjvbdOSsugFVQ +DoCkKvbdyNrhYTJD +EPCjjvbduDDVXWOo +DncLKvbdiCPDFXRR +DncLKvbdiGibyWKV +EOcLKvbdfNGXHNJk +EObkKvbdBhjakIej +EPCjjvbdxmrhXriD +DnbkKvbdJbibqKDY +DnbkKvbdSCDdkhyL +EPCjjvbdGFirOIsq +DnbkKvbdKVtfDeHJ +DoDKjvbdGKdrbhMu +DncLKvbdZLrETmlN +EObjjvbdjuvmcbXw +DncKjvbdQdDApRDr +EObkKvbdeATplwjG +DoCjjvbdZMRdUNkm +DoDKjvbdTqQoVVIN +EPCkKvbdOTTufeVQ +EPDKjvbdWRnXadlD +DncKjvbdZsiJYdSn +DoCkKvbdZLrDsnMN +DoDKjvbdEKHiuwjA +EPDLKvbdnBivxPOV +EPCjjvbdddnrCWbj +EOcLKvbdpssgSRkU +EPCjjvbdzdzOzdyp +EPCjjvbdZxcinClS +DoDKjvbdvAcySoEh +DnbjjvbdWHxWXfxz +DoDLKvbdCWzdJEpW +DoCjjvbdehLVqnRH +EObjjvbdEXxLstTl +EObjjvbdkMakzEfo +EPCkKvbdKaKflbXq +EPDLKvbdijFgjNYS +DoCjjvbdZsiIxdSn +DncKjvbdeATqNXif +DncLKvbdzoPqEblY +EObkKvbdLAjgNBwq +DncKjvbdUxgsykPO +DoDKjvbdaogGckzd +DncKjvbdFVxpPmJe +EOcLKvbdZLrDtNlN +EObjjvbdYNqAXuWU +DoCkKvbdEYYLstUM +EObjjvbdeFPSBwDK +DncKjvbdePEsKssr +DncKjvbdZjTHogCG +EPCkKvbdjKGHjNXr +DoCkKvbdNrtVgFVQ +DncLKvbdaMjaruNH +DoDLKvbdwjwEHzzG +EOcLKvbdTIzJqABM +DoDLKvbdliETqVSB +DoDLKvbdNrtVfdtp +DnbjjvbdZxdKNcMS +EPDLKvbdbUafxKsh +DoCkKvbdVrNxCFMD +DoCkKvbdxZgefYEr +DoDKjvbdYTLaMsoY +DncKjvbdeAURMwif +EOcLKvbdNGcPmQVL +EPDKjvbdqceJQOVa +DncKjvbdRotHKGEX +DoCjjvbdwNWAMdFN +EPCkKvbdFyVVAcwb +DoDKjvbdmozYvKyC +DncKjvbdSPsgJecw +EPDKjvbdZtJJYcrn +EOcLKvbdGckWKCJj +DoDKjvbdkxrrSxft +DnbjjvbdRbDdlIxk +DncKjvbdyYJJbPyk +DnbjjvbdhgJcYvKV +EObkKvbdjcLjqHUg +EObkKvbdhgJbyWKV +EObjjvbdrovPKCvG +DoCkKvbdbBVdepQX +DnbjjvbdUVkojTaR +EPCkKvbdbUagYLUI +DoDLKvbdptUGqqkU +DoCjjvbdyTNhlqag +DncKjvbdEYXlTssl +EPCkKvbdXFxytAOs +EOcLKvbdNdctIhkE +EPDLKvbdkDMLRGuH +EPDLKvbdDihJuxKA +EOcLKvbdrafNMHLZ +EPDLKvbdbKlFoODA +DncLKvbdZLqcsnMN +DnbjjvbdznpRFDLx +DncLKvbdziuQPdSt +EPCkKvbdbrcKsdKB +DncLKvbdaMkCTUmH +EPDLKvbdYkqdUOLm +DoDKjvbdjhHLfGNk +DoDLKvbdZMSDtNlN +DnbjjvbdZjTHpHCG +DoCkKvbdemFvgNKL +DncKjvbdrRtkOLAm +EPCjjvbdyNrhXsIc +EObjjvbdgPazwDwh +DoDKjvbdRDcAoqDr +DoDKjvbdvvkaWBWV +EOcKjvbdZRMdiNFR +EPCkKvbddePRawCj +DoCkKvbdHDjvKBij +DnbkKvbdZirgpGbG +EOcKjvbdhbPCeWqR +DnbkKvbdNPwpvNfs +EPCjjvbdZirhPfbG +EOcLKvbdIGgZxwxH +EPCkKvbdrykosBHn +DoDKjvbdxnTIYShc +DnbjjvbdNsTvGduQ +DncLKvbdBcpAvJlf +DnbjjvbdlqxtysDi +DoCkKvbdOEdTiIjd +DncKjvbdfHkVrOQg +DoCkKvbdiHKDYvKV +DoDKjvbdOTUVgFUp +EObkKvbdaaVdfPow +DncLKvbdZHXEAPTJ +DnbkKvbdkIHLefNk +DnbkKvbdjEjfuPAO +EObjjvbdhtzFWqtb +DoDLKvbdSQTfjFdX +DncLKvbdHEKvKBjK +DncLKvbdHDkVjBij +EPDKjvbdRpTfiecw +DnbkKvbdiBncEwQq +EObkKvbdRadEkhyL +EPCkKvbdezvYdiTw +EOcKjvbdaMjasUlg +EObkKvbdczZPwyQb +EPCjjvbdTvMQJtAq +EPCjjvbdJXtCIMRQ +DoDLKvbdkDMKpftg +EPCjjvbdiVZdvqtb +DnbkKvbdtunXipsA +DoCjjvbdjJehKNYS +DnbjjvbdJvUeceHJ +DoDKjvbdKRZdoFme +DncLKvbdJcKCpjCx +EPDKjvbdmbKXYPNu +DnbjjvbdkIHLeenL +EPDLKvbdNPxQunHT +DnbjjvbdUtMtFkvK +EPDLKvbdsPvPJcWG +EObjjvbdMRvlzVQz +DoCkKvbdsQWOjDWG +DnbjjvbdXGZZtAPT +DnbjjvbdunszpkOt +DncKjvbdxZhFfXdr +DnbjjvbdRzJgsCvA +EPCkKvbdSCDdlIxk +EPDKjvbdREDBPqES +DnbjjvbdBvzdIdov +DoDLKvbdSLYetfkT +EObjjvbdKWVGDeHJ +DoCjjvbduDDUvuoP +EOcLKvbdWIYWXgYz +DoCjjvbdbhmJjfWx +EPDKjvbdIxUCILpp +EOcLKvbdeXzTsrFz +EPDLKvbdsBemLgKy +EPCkKvbdzjVPpDrt +DncLKvbdZyDimbkr +DnbjjvbdRNYBxmtz +EPCkKvbdvOszpkPU +EObkKvbdSQTfiedX +DncKjvbdZRNFIldq +DoDKjvbdbhlijfXY +EObkKvbdEzspeLcJ +EPCjjvbdKCicRJbx +EOcLKvbdOYOuzcnU +DoCkKvbdhkddOVDZ +DncKjvbdIxTahMQp +EOcLKvbdwygeexFS +EPCjjvbdKRZeOeme +EPDLKvbdgPazvcxI +DncKjvbdfNFwHMik +EOcLKvbdtkwvaTaX +EObjjvbdURQnuVIN +DnbkKvbdiBncFWqR +DncLKvbdaMkCStmH +EPCjjvbdZjSgogBf +DoDKjvbdMowpvOGs +EPCkKvbdsrqsZZdc +DnbkKvbdRpTfjFdX +EOcKjvbdaMjbTVMg +EOcLKvbdmgExMmfy +DncKjvbdCJLCLJGK +DoCkKvbdNeDshiKd +DnbkKvbdGLFSbgmV +EObjjvbdMtrrLNAX +EOcKjvbdpedEsvAh +DoDKjvbdcyxpXyQb +EObkKvbdxZhGGXdr +DoCkKvbdEztQdlCi +EObkKvbdijFgilxS +EPDLKvbdkHgMFenL +EOcLKvbdlrYtysDi +DncLKvbdjcLjpgVH +DoCjjvbdnVVZkKRf +EPDKjvbdFeirNhsq +DnbkKvbdjblLRGuH +EPDLKvbdtTSTZZeD +DoDKjvbdVBCRTRSZ +DncKjvbdTYLMNzjx +DoCkKvbdEztQdkcJ +EObjjvbdpfEFTuaI +DncLKvbdYSlAmUPY +DncKjvbdYpldiNFR +DncLKvbdWXIwvDdg +DoDLKvbdeXyssrFz +DncLKvbdqdEhonVa +EOcLKvbdNQYRVnGs +EObjjvbdRpTgKGDw +DoDKjvbdauCHXkUI +DoDLKvbdhficZViu +DnbjjvbdzoPpeCkx +DoCkKvbdJYTaglQp +DoDKjvbdnBiwYPNu +EOcLKvbdMJCLqYAS +EPCjjvbdYkrDsnMN +EPCkKvbdehKvRmqH +EObkKvbdVqmxCFMD +DncKjvbdrDeJPmvB +EPDLKvbdzaAOgHCM +EOcLKvbdNPxQvNfs +DncLKvbdFVxopMie +EPDKjvbdgQBzwDwh +EObjjvbdTfzmkvvF +EPDLKvbdUaBprpqy +DoCkKvbdnGdxNOGy +DncLKvbdfIKurOQg +EPCkKvbdKDJcRKCx +EPCjjvbdmJEUQuSB +DncLKvbdrafNMGjy +EOcKjvbdZxdKNbkr +DnbkKvbdJmADzGuB +EPCjjvbdQvmdDMID +DnbkKvbdemGWgNJk +DncKjvbdyfxlAMdw +EPCkKvbddtAUATNW +DncKjvbdcasMrATm +DoDKjvbdVhYVxHYz +EPCjjvbdhyuFkpmf +DoDLKvbdcbTMrATm +EPCkKvbdILaznXRL +DoDKjvbdRDbaQQcr +DncKjvbdijFgjNYS +EObkKvbdIMBznXRL +EPCjjvbdxVNEpyLn +DncLKvbdYkqctOMN +EOcKjvbdxrmiNSBg +EPDLKvbdtTRsYzFD +EOcKjvbdzjVQQDsU +EPCjjvbdZMRctNlN +DncKjvbdXrlAmTnx +EOcLKvbdbPgGdLzd +EPDLKvbdFfJqmhsq +EOcLKvbdyzdmqgiI +DoCjjvbduCbtvuoP +DncLKvbdNGcPlpVL +EPCjjvbdGBOpyJzm +EPCkKvbdRDcBPpcr +EOcLKvbdRbEFLhyL +EOcLKvbdePFTLTsr +EObkKvbdcTCkUDjB +DnbkKvbdrWokbhxq +DncLKvbdqUTfrRjt +EOcLKvbdRyihTDWA +EObkKvbdpxnhHQdY +DnbkKvbdrSUkOKaN +DoCjjvbdIGgZyYXg +DoDLKvbdMowqWNfs +DoDKjvbdUxgtZkOn +EObjjvbdUtNTelVj +EObjjvbdlqxtyrdJ +DncKjvbdkVvnDbYX +EObjjvbdePFTKssr +DoCkKvbdMuSrLNAX +EOcLKvbdnQZyWLZC +DoDKjvbdhgJcYujV +DoDLKvbdaMjasVMg +EPCjjvbdcScLUDia +DnbjjvbdbKkeoNcA +DnbkKvbdfpBzwEYI +DoCkKvbdBhkBjhej +DnbjjvbdkDMLRGtg +EObkKvbdeATqNXjG +EOcKjvbdFkFSbglu +DnbjjvbdznpQdcMY +DncLKvbdIidAJpHE +DoCjjvbdLZQirzuG +DnbjjvbdzjUopDrt +EOcLKvbdnUuZjiqf +DoDLKvbdwyhFeweS +DoCkKvbdaoffckzd +EObkKvbdzaAPGgCM +EObkKvbdEzspdkcJ +DnbjjvbdDjHiuxKA +DnbkKvbdVqmxBdlD +EOcLKvbdrJAKFMne +EOcKjvbdZjSgofbG +EPCjjvbdfMfWgNJk +DoCkKvbdTukpJsaR +DoCjjvbdySmiNSBg +DnbkKvbdzGyMANFX +EObkKvbduWNxKQsA +DoDKjvbdRkZFuHLT +DncLKvbdbKlGOmcA +DncLKvbdyNsIXsJD +DnbkKvbdMpXqWNfs +DoCkKvbdHEKujBjK +DncLKvbdDxXktTsl +EPCkKvbdACrYJyiQ +EOcKjvbdqUUHSRjt +DoDLKvbdOFDsiJLE +EObkKvbdrbGMlGjy +DoCjjvbdjblKpgUg +EPCkKvbdiHJcYujV +EPDKjvbdrDeJQNvB +EPDLKvbdbrbkTdJa +DnbkKvbdNeDtIhkE +DnbkKvbdcJNKKevx +EPCjjvbdxVNFQxkn +EObjjvbdhyuGLqOG +EOcKjvbdrafMkfkZ +EObkKvbdRkYetgKs +DnbjjvbdUWLoitBR +DoCjjvbdQvmcblID +EOcLKvbdDoDLLXCd +DncLKvbdzRPMiJwA +DoCkKvbdsZkoraHn +DoDKjvbdkHgMGFnL +EObkKvbdrbFmMGjy +DnbkKvbdRWnDbkhD +EPDKjvbdJbicRJbx +DncKjvbdGZUuAcwb +DoCjjvbdmfdwmNfy +DoDKjvbdBdQAujNG +EPDLKvbdwWlAuaVu +DncLKvbdxmrgxSiD +DoCkKvbdUsmUFkuj +EOcKjvbdcTDKsdKB +DnbjjvbdjcLkRHVH +DoDKjvbdbiMijewY +EPCjjvbdPyNAHSrK +DnbjjvbdFkErcINV +EPDKjvbdZQldhmFR +EPDKjvbdTJZjRABM +EOcKjvbdKaKgMaxR +DoCjjvbdwzHefYEr +DoDLKvbdDwxLtUUM +DoCkKvbdfILWRmpg +DoCkKvbdRyihTCvA +DoDKjvbdSQUGjFcw +DoCjjvbdEYXktUTl +EPCjjvbdoznEKxPA +EPDLKvbdSiZiqABM +EObkKvbdVUNUFkuj +DncKjvbdMfbpNQUk +DncLKvbdEvYopMie +DnbjjvbdMowpvNgT +DncLKvbdKjaHvAKZ +DoDKjvbdqmZjZMIJ +EObjjvbdGcjuibJj +DoDLKvbduLwvaTaX +DoCkKvbdHgHZyYYH +EObjjvbdEOcKjwCd +EPCjjvbdGckWKCKK +EObkKvbdEuyQQMie +DnbjjvbdHgGzZYYH +EObjjvbdVUMsekuj +EObkKvbdWWiXucdg +EPDKjvbdRWnECkgc +EPDKjvbdxZgefYFS +DnbkKvbdEuyPomKF +EPCjjvbddePSCXCj +DoDKjvbdUsltFlWK +DnbkKvbdbsDKtEJa +EObkKvbdmoyyWLZC +DoDKjvbdSCDeMJZL +DnbkKvbdwtleRYkn +EPDLKvbdJpzEnfNe +DncKjvbdZisIQGbG +DoCjjvbdiUzEwRtb +DncKjvbdrounicVf +DncLKvbdmIdURVRa +DoDKjvbdYSlBNUPY +DnbjjvbdKDKDQibx +DoDLKvbdnCJvwoOV +EPDKjvbdgFlZmfgA +DoDKjvbdTukojTaR +DnbjjvbdVAbQsQqy +EOcLKvbdtAHRIABS +DnbjjvbdmbJvwnnV +EOcKjvbdvBDxrneI +DnbjjvbdeJirWUzn +DnbjjvbdKeegaaQu +DnbjjvbdzQoMiKXA +DnbjjvbdxwiJbPyk +EPDLKvbdKNADzHUa +DoCkKvbdANHyTXZx +EObkKvbdxLXDgzyf +EOcKjvbdpxoHgQcx +DncKjvbdLBKflawq +EPDKjvbdhanbdwQq +DnbkKvbdEASIlyvw +EPCkKvbdwzHfGYEr +EOcLKvbdqZPHgQdY +EPDKjvbdqTtGqqjt +DoCjjvbdDxXksssl +DoDKjvbdQlwayNtz +EOcKjvbdTvLoitAq +DnbkKvbdirzhsKiz +EPDKjvbdyzeORghh +DncLKvbdmJDsqVRa +DncLKvbdKefICAqV +EOcLKvbdZnmheFZj +DoDKjvbdIxUCILpp +DncLKvbdxsOIlrBg +DoCkKvbdiVZdvqtb +EPDLKvbdbBWEfQPw +EObkKvbdsCFllGkZ +EObkKvbdNdctIiKd +EObjjvbdozmcjwoA +EPDLKvbdlhdTqUqa +EOcKjvbdbUagYKsh +DnbkKvbdJpydoGOF +DnbkKvbdnGeYMmfy +DncKjvbdtlXwBUAw +DncKjvbdqiAJdlne +EPCkKvbdMIakqYAS +DnbkKvbdCWzchdov +EObkKvbdelewHNJk +EPCjjvbdFpASvgFy +DoDLKvbdVrNxCFMD +DnbkKvbdMpYQvNfs +EPCkKvbdEObkKwDE +EPDLKvbdHDjuibJj +EPCjjvbdKaLHMaxR +DoDKjvbdakLfOmcA +EPDLKvbdMgDQNQVL +DoCjjvbdEvYpQNKF +EPDKjvbdrEEhpOVa +EOcLKvbdOFDsiIjd +DncKjvbdtTSTYyeD +EObjjvbdQvnDblHc +DoDKjvbdVrNwbElD +EPCjjvbdZMRdUNkm +DoCjjvbdhfibxujV +DnbjjvbdYpmFJMeR +DncLKvbdDihKVxKA +DoCjjvbdrNZjYkgi +EOcLKvbdYqNFImEq +DoDLKvbdJbjDQjCx +DoDKjvbdwygefXeS +DncLKvbdUyHsykPO +DncLKvbdJSyBTMxM +EPDKjvbdcImKKfXY +EPCjjvbddndsLTtS +DoDLKvbdEASIlzWw +EObjjvbdrylQTAgn +DoDKjvbdFkFTChMu +DncLKvbdUaCQrprZ +DnbjjvbdOFEThhjd +EObjjvbdlYsRrxgU +EPCkKvbdnGeYNOGy +DoDKjvbdwygefYEr +DoCjjvbdGckViajK +DoDKjvbdSZjITDWA +EObjjvbdkWXNdCXw +EPCkKvbdKjaIWAJy +EObkKvbdKkBIWAKZ +DoDLKvbdptTfqrLU +DoDKjvbdPxmAGsRj +EObkKvbdTvMPitBR +EPCkKvbdegjvSOQg +DoDKjvbdwNWANEEm +EOcLKvbdRNXbYmtz +DoDKjvbdEOcKjwDE +EPDLKvbdfMfXHMik +DoCkKvbdWHwvXfxz +EPCjjvbdelfWgNKL +EPCjjvbdqcdiQOVa +DncKjvbdkyTSTZGt +DoCkKvbdbAueFpPw +EOcKjvbdQwNdClHc +DnbjjvbdxmsIYSiD +EPDKjvbdCTAbtFwS +DncLKvbdJpzFOeme +EOcKjvbdiZuGLqOG +DncKjvbdKaLHMaxR +EPDLKvbdbiMjLFvx +EPCkKvbdjvXODaxX +EOcLKvbdOAJSsirA +EPDKjvbdqYnhHQdY +DoCkKvbdDwwlTtUM +DnbkKvbdRjxfVHKs +EObjjvbdzjUpPcrt +EOcLKvbdeUAUATNW +EObkKvbdQlwaxmtz +EObkKvbdEXxLtUUM +EObkKvbdYkrETmkm +DoCkKvbdxmsHwsIc +DoDKjvbdzjUoocrt +EPDKjvbdqGEFTuaI +EPCjjvbdbiMjLGXY +EPDKjvbdfpBzwEXh +DncKjvbdZeYGzhJC +DoCjjvbdFkEsCglu +DncKjvbdOFDshhjd +DncKjvbdZMRcsnMN +EPCkKvbdrEFJPnVa +DoCkKvbdcyyPxYpb +EPDLKvbdijGIKMwr +DoCjjvbdbAudepQX +DncLKvbdFejSOItR +EOcKjvbdSLZGVHLT +EPDKjvbdMJBkpxAS +DncKjvbdJXsaglQp +DnbkKvbdjcMLRHVH +DoCkKvbdFjeTCgmV +DnbjjvbdqUTfrRkU +DnbjjvbdznoqFCkx +EObkKvbdVqnYBeLc +DoDLKvbdaMjbTVMg +DoCkKvbdSQUHKFdX +DoCjjvbdrDdhomua +DncLKvbdcTCjsdJa +DoCkKvbdsCFlkgKy +EPCkKvbdmbKWwnmu +DoCjjvbdZQmFImEq +EPCkKvbdyXiKCPzL +EOcLKvbdKQzEnenF +EPCjjvbdrbGNMGjy +EPDKjvbdgGMZnHHA +EOcLKvbdfHjuqnRH +EOcLKvbdFeirNiUR +DoCjjvbduaEZSoFI +DncKjvbdbAudfPow +DoCkKvbdbiMikFwY +DoDLKvbdcyxpYYqC +DnbjjvbdpxoHfpdY +DncKjvbdqUTgRqjt +DoDKjvbdcImKKfWx +DnbjjvbdmfeYNNfy +EPCjjvbdIjEAJofd +EObjjvbdLBKgNCXq +EObjjvbduLxWaUAw +DnbjjvbdJTZBTNXl +DoCkKvbduaDyTOeI +EOcLKvbdUyIUZkPO +EOcLKvbddePRawCj +EPDKjvbdhbObeWqR +EOcKjvbdBdQAvJmG +EOcKjvbdkVwODaww +DnbkKvbdUVkoisaR +DnbkKvbdMoxQvNfs +EObjjvbdCJKbLIfK +DncKjvbdYpmFJNEq +DoCjjvbdjKFhKMxS +DnbjjvbdZLrEUNlN +EPDKjvbdwuNFRZMO +EObjjvbdjuvnECXw +EPCkKvbdlZTSTZGt +DoCjjvbdsQVoJcWG +DncLKvbdmJETqVSB +DnbjjvbdjggLfGOL +EObjjvbdxwiKBpZk +DoDLKvbdKDKCpjDY +EPCjjvbdzRPNIjXA +DoCkKvbdkaMoNALA +EPCkKvbdjvWnDaww +EPCkKvbdSBcdkiZL +DnbkKvbdbUbHXkUI +EOcKjvbdURROtuHm +DncLKvbdJmAEZgVB +DoDLKvbdDxYLsssl +DncKjvbdWRnXadlD +EPCjjvbdADSXiyhp +DnbkKvbdNGcPlouL +DnbjjvbdBsAcTevr +EObjjvbdWWhwvDeH +EOcLKvbdbUafxKsh +DoCkKvbdtcCuXWOo +EOcKjvbdbKkennDA +EPDLKvbdGcjujBjK +DoDKjvbdRWmdDMHc +EPCkKvbdmSZUyrdJ +DoCkKvbdLZRKSztf +DncKjvbdZQmFJNFR +EPDLKvbdjhGkefNk +DncKjvbdeATpmYJf +EPCkKvbdDjHivXjA +EObjjvbdFyVVBEXb +DncKjvbdIHHZxxXg +DnbjjvbdMoxQvNfs +EObjjvbdlYsRsZGt +EOcLKvbdZHWdAPTJ +DoCkKvbdoznDjwoA +EOcLKvbdYpmEiNEq +EOcLKvbdfMfWgNJk +DnbjjvbdjlalZeGo +EPDLKvbdVgxVxGxz +DoDKjvbdZRMdiMeR +DnbkKvbdNsUVgFUp +EObjjvbdNGcPmPuL +EPDLKvbdrSUjnKaN +DncKjvbdMgDPmQUk +DoDLKvbdRkZGUfkT +EOcLKvbdpxoIGqDx +DoCkKvbdVwIxVcdg +DoDKjvbdZQmFIleR +EPDKjvbdZshiZDrn +EPCkKvbdFWZPpNJe +DnbkKvbdcImKKfXY +DoCkKvbdiVZeWqtb +EPCkKvbdkxsSSyHU +EObkKvbdcSbkTdKB +EOcKjvbdFxttaEYC +EPCkKvbdhtzEwSVC +EOcKjvbdLAjgNBwq +DoCkKvbdZisHofbG +DoDLKvbdIsYaTNYM +EPDLKvbdADRxJzIp +DoDKjvbdTkuoAvOi +EOcLKvbdZRMeJMdq +EPDLKvbdWWiXvDdg +DnbjjvbdbsDKscjB +DnbkKvbdtlXwBUBX +EPCjjvbdmgFXlmgZ +EObkKvbdjmBlZeGo +EObkKvbdmgEwmOGy +DoCjjvbdtlXwBTaX +EPDKjvbdSiZiqABM +EPDLKvbdEXxMTssl +EPCkKvbdRWmccLhD +DncLKvbdrWpMDJZR +EPDLKvbdelfXGlik +EOcLKvbdFjdsChNV +EPCkKvbdVUMtFkuj +DoDLKvbdtkxXBUBX +DncLKvbdMgDQNPtk +DnbkKvbdMJCMQxAS +EOcLKvbduWOYJpsA +EPCjjvbdZxcimcMS +DoDKjvbdqrUjmkAm +EObjjvbdRzJgsCvA +EOcLKvbdiBoDFXRR +EPCjjvbdSPtHKFcw +DncKjvbdbBVeGPpX +DnbjjvbdRotGiedX +DoDKjvbdIHGzZYXg +DnbjjvbdiGjCyViu +EPCjjvbdSxKkmzjx +EPCjjvbdmajWwoOV +DnbjjvbdmbKWxPNu +EObkKvbdCTBCsfXS +DoCjjvbdKQzEnfOF +EPCkKvbddijRutzn +EObkKvbdFjeTCgmV +DnbjjvbdURQnuUhN +DnbkKvbdiCOcFXRR +EObkKvbdJutfEEfi +DncLKvbdhtydwRuC +DoCjjvbdcTCjsdJa +DnbjjvbdzoPqEcMY +DoDLKvbdSCDdlJZL +EOcKjvbdlhctQuSB +EPDKjvbdOFETiJKd +EObkKvbddZyQYZQb +EOcLKvbdrMyjYlHi +DoDLKvbdqrVLOLBN +DncKjvbdyNsHwriD +EObkKvbdQvnECkgc +DnbkKvbdznopeClY +DoCkKvbdCJLBjiGK +EOcLKvbdauCGxKtI +EPCjjvbdeFOrCWcK +DncLKvbdcSbjtDia +DnbkKvbdKWVGDdgJ +EPDKjvbdrDdiQNua +DncLKvbdqTtGqrKt +DoDKjvbdjJfIKMwr +DoCkKvbdkxsSTZHU +EObkKvbdFejSNhtR +DoDKjvbdnCKWxOmu +DoDLKvbdvBDySneI +DncKjvbddZxpXyRC +EPDKjvbddwzTsqez +DoDLKvbdLFfIBaQu +DncLKvbdwzHeewdr +DncLKvbdOFEUJJKd +DoDLKvbdEvZQQMie +EPDLKvbdWHxVwgYz +DoCjjvbdiGjCxujV +EPDKjvbdrovPJcWG +DoDLKvbdZxcjOCkr +DnbjjvbdRzJgsDWA +DoDLKvbdiZuGLpnG +DncLKvbdTukoitBR +DnbkKvbdnBiwXnnV +DoDKjvbdBvzdIdov +EObkKvbdRWnECkhD +DoCkKvbdRbDeMJZL +DncKjvbdiGjDYujV +EPCkKvbdNdctIiLE +EPCjjvbdKWUfDdfi +EOcKjvbdkIGlGGNk +EPDKjvbdGZVVBDxC +EObkKvbdXsMBNUOx +EObjjvbdANHxrvyx +EPDKjvbdZtIhyDrn +DoCkKvbdRWmdCkgc +EObkKvbdffLynGgA +DoDKjvbdIxTahMQp +DncKjvbdKQzFPGOF +DoDKjvbduDCtwWOo +EOcKjvbdnCJvxOmu +DoCjjvbdEJgivXjA +DncKjvbdemGWgMjL +DncKjvbdCDpBVjMf +DncLKvbdmoyxukZC +EOcLKvbdtkwwBTaX +DoCkKvbdLqwMzUpz +DncLKvbdqFdFUWBI +EPDLKvbdZyEJmblS +EOcKjvbdEzsqFMCi +DoCkKvbdcarmSATm +DncLKvbdFfJqmiTq +DncLKvbdKQzEoGNe +DoCjjvbdUaCRTRSZ +EOcLKvbdqZOhGqEY +DoCkKvbdZisIQGaf +DoCkKvbdeFOrBwCj +DoDLKvbdmIctQtqa +EObkKvbdxVMdqYkn +DncKjvbdwygfFxFS +DoCkKvbdRWnEDLhD +EOcKjvbdmRyUyrci +DoCkKvbdWXIwvDeH +EPDLKvbdRXODcLgc +DoDLKvbdBsBDUGWr +EOcKjvbdEvYopNJe +DoCjjvbdBvzdIdov +DoCkKvbdyzeNrIJI +EObkKvbdCJKbKhej +EObjjvbdQccBQQcr +DnbkKvbdxZgeewdr +DoDKjvbdqcdhpNua +DoCjjvbdeJjSVtzn +DncKjvbddneTKssr +DnbjjvbdZxcjNbkr +EPCjjvbdZisIPfaf +EPCkKvbdkyTRrxft +DncKjvbdVwIxVcdg +DncLKvbdIxTagkpp +EPCjjvbdbrbjtEJa +DncKjvbdkCkjqHUg +DoCkKvbdUxgsyjnn +EObjjvbdUaCRSprZ +DnbjjvbdMJCLpxAS +DncLKvbdliEUQuRa +EPCkKvbdANHxrvzY +EPCjjvbdeAURMwjG +EPDKjvbdZoOIeEzK +DoDKjvbdmuVZkJqf +DncLKvbdaNLCTUlg +DoCkKvbdnQZxvLYb +DncLKvbdhficZWJu +DncKjvbdatbHYLUI +DoCjjvbddndrjtUS +EOcLKvbdsBfMkgKy +DnbjjvbdBiKakIfK +DnbjjvbdSQTfjFcw +DoCjjvbdmoyxvKyC +DoCkKvbdGcjuibKK +DnbkKvbdZQldiMeR +EObkKvbdqquKnKaN +DoCjjvbdZRNEhldq +EPCjjvbdBiKbLJFj +EPCjjvbdyXhjCPyk +DncLKvbdtTSSxzEc +EPCjjvbdnCJwXnmu +DoDLKvbdbBWEfQPw +EOcLKvbdemGXHNKL +DoDLKvbdmfdxMnGy +EOcLKvbdTqQntthN +EOcLKvbdrMyixlIJ +EOcLKvbdVUMselWK +EOcLKvbdBvzchePv +DoCjjvbdbVCHXjsh +EPCjjvbdZRMdhleR +EOcLKvbdhbObeXRR +EPCkKvbdFWZPpMie +DncLKvbdXFyZtAOs +DnbkKvbdTqQoUuHm +EPCjjvbdCSaDUFvr +DoDKjvbdQZNAHTSK +EOcLKvbdmoyyVkZC +DoCkKvbdGLErbhMu +EOcLKvbdtvNwjRTA +EObkKvbdFjdsDINV +EOcKjvbdeOdsLUUS +DncKjvbdMtrrKmAX +EObkKvbdBsBCtGWr +EOcLKvbdVBCRTRSZ +DoDKjvbdKQydoFme +DncLKvbdnHFXmOGy +DnbkKvbdGAnqYizm +EOcLKvbdjlakzEfo +EOcKjvbdegkWSOQg +DoCjjvbdtkwwAsaX +EPCkKvbdeKKSWUzn +EObjjvbdrRtjnLBN +EPCkKvbdeATqMxKG +DnbkKvbdZMRdTmlN +DoDKjvbdNsUWGeVQ +EObjjvbdyXiKBpZk +EOcLKvbdJKEAJpHE +DoDKjvbdzQoNJJwA +DoCkKvbdwygeewdr +EObkKvbdsCGNMHKy +EOcLKvbdlhdUQuRa +EObjjvbdyNsHwsIc +DoDLKvbdWRnXbFLc +EObjjvbduCcUvvPP +EOcLKvbdrEEhonWB +EPCjjvbdRjyFtgKs +EPCjjvbdkNCLzFGo +DoCkKvbdRDbaPpcr +DoDKjvbdQdCaQQdS +DncKjvbdwyhFexFS +EPDLKvbdBhjakJGK +EPDKjvbdaNKaruMg +EObkKvbdzQnliJwA +DnbjjvbdptTfrSLU +DoDKjvbdFWZPpNJe +EObkKvbdZxcjOCkr +DoDKjvbdehLWRnQg +EOcLKvbdcSbkUEKB +EObjjvbdbUafxLTh +EObkKvbdBcpAvKNG +DoDLKvbdySmiNSBg +DncLKvbdmIdUQuRa +EPCkKvbduDDUvuoP +DoDLKvbdMtrqjmAX +DoDLKvbdVZHtZkOn +EOcLKvbdiZuGLpnG +EOcKjvbdxmrgxShc +DoCjjvbdMpYQvNfs +EOcKjvbdCIkCKiFj +EPDLKvbdaaVdepPw +EObkKvbdXFyZtAOs +EPDLKvbdbKlFnnDA +DncLKvbdqGEFTuaI +EOcKjvbdqFcdsvAh +EPCkKvbdcSbkUDjB +DncKjvbdrJAJeMoF +EObjjvbdZMRdUNkm +DncKjvbdCEPaVjNG +DnbjjvbdptUHSSLU +EPCkKvbdUtNTekuj +DoCkKvbdVqmwadlD +EObjjvbdCIkBjiFj +EOcLKvbdbVCGwkUI +EObjjvbdFfKSNiTq +EPDKjvbdJXtCHlRQ +EPDKjvbdTvMQJtBR +EPCjjvbdZMRdTnLm +EPCjjvbdemGXGljL +EPDKjvbdxmsHxTJD +EOcKjvbdiVZdvrVC +DnbkKvbdmSZUzSdJ +EPCkKvbdUaCRTRSZ +DncLKvbdoAKztIDn +EObjjvbdHffyyXxH +EPCkKvbdaMjbStmH +EObjjvbdZyDinDMS +DoDKjvbdjlbMZdgP +DncKjvbdQwOEDMHc +DncLKvbdGLFSbgmV +EPCkKvbdjvXOECXw +DoCkKvbdSBceLhyL +DoDLKvbdEvYpPmKF +EOcKjvbdrbFlkfkZ +EPDKjvbdTvMQJsaR +DncLKvbdjvXNcaxX +DnbkKvbdijGIKNXr +EOcLKvbdiHJcZViu +DoCjjvbdlqxuZsDi +DnbkKvbdhuZeXRtb +DncLKvbdACqxJzJQ +EObjjvbdjlbLydgP +EPDKjvbdxZgefXdr +EOcKjvbdSCEFLiYk +EObjjvbdKefICApu +EPDKjvbdjlbLyeGo +DncLKvbdbAvEepQX +EPCkKvbdrSVKnLAm +DncLKvbdZjTHpHBf +DnbkKvbdCWzdIdov +DoDLKvbdxUmFQyLn +DnbkKvbdxVNFRYkn +DoCkKvbdZisHpHCG +DoDKjvbdwkXEHzzG +DoCjjvbdSPtHJedX +EOcLKvbdBiLBkIej +DoCkKvbdiLdcnVCy +DnbkKvbdlhcsqUqa +EPCjjvbdwzIGFxEr +EPCkKvbdySmiNRag +DncLKvbdHEKujCKK +EPDLKvbddeOrCXDK +DoDLKvbdNGbolpUk +EOcLKvbdtlYXBTaX +EOcLKvbdqwQLcIyR +EObjjvbdIrxaSlxM +EObjjvbdbrcKtEKB +EOcKjvbdpxngfqDx +DoDLKvbdKfFhCApu +DoDLKvbdJvUfEEfi +DncKjvbdsQWOibuf +DoCjjvbdHgGyxxXg +DoCkKvbdZHWdAPTJ +DncKjvbdauBgYLTh +DoDLKvbdJYUCIMRQ +DncKjvbdbrbjtEJa +DnbjjvbdemFwHNJk +DnbkKvbdBvzcheQW +EPCkKvbdJqZePGNe +EPCkKvbdSKxeuGkT +EPDLKvbdIryBTMxM +EPCjjvbdwWlAuaVu +EOcLKvbdyTOJNRbH +EPCjjvbdQvmdClID +DnbjjvbdyTOJMqag +DncKjvbdrXQMDJYq +EPCkKvbdGdLVjBij +EOcLKvbdjJehJmXr +DnbkKvbdCJKakJGK +DoCjjvbdLrWlzUpz +EPCkKvbdhzVFlRNf +DoCjjvbdRDcApRES +EObkKvbdzROmJKXA +DncKjvbdxUmFRYlO +EPCkKvbdURQoVVIN +EPDLKvbdVZHtZkPO +DnbkKvbdatafwjsh +EObjjvbdNrtWGdtp +DoDLKvbdBiLCLJFj +EOcKjvbdmgFXmOHZ +EObjjvbdZRMeImEq +DoCjjvbdiMEdNtcZ +DnbjjvbdgFkzNfgA +DnbjjvbdGKdsDHmV +DncLKvbdIxUBhMRQ +DoDLKvbdjSzhrjiz +DoDLKvbdpyPHgRDx +DoDLKvbdqYoIGpdY +DoCkKvbdUQqPUuHm +EPCkKvbdBraDTfXS +DncKjvbdNrtWGeUp +DncKjvbdJqZdnenF +EPCjjvbdCWzdIePv +DoDKjvbdrXPlDIxq +EPDKjvbdauBgYLUI +EPCjjvbdQmXbYnUz +DoCjjvbdGGJqnJUR +EPDLKvbdkVvnEBww +EPCjjvbdTukoitBR +DoCjjvbdRkZFtgLT +DoDKjvbdEuyPpMie +EPCkKvbdSLYfUgLT +DnbjjvbdIwtBglQp +DnbkKvbdznpQeDMY +EOcKjvbdznpRFCkx +EPDLKvbdtumwjQsA +DoDLKvbdBhjajiGK +DoDKjvbdhlFDmuDZ +DnbkKvbdqquKnKaN +DncLKvbdMowqVmfs +EOcKjvbdqrUjnLAm +EObjjvbdqwQMDIyR +EPDKjvbdnCKXYPOV +DnbkKvbdHffyyXxH +DoCjjvbdlZSrTZGt +DoDLKvbdznpRFDMY +EPDKjvbdWWiXvDdg +DoDKjvbdRWnEClID +DnbjjvbdJcKCqKDY +EPDKjvbdJbjDQicY +DncLKvbdhaoDEwRR +DncLKvbdvAdZSoEh +DncLKvbdeEnrCWbj +DoDKjvbdVvhwvDeH +EOcKjvbdVAapsQqy +EPCkKvbdxnTIYSiD +EPCkKvbdrouoJbuf +EObjjvbdePEsKtUS +EPDLKvbdirziSkJz +DnbjjvbdhaoCdvqR +EPCkKvbdGZVVAdYC +DncKjvbdtbbuWuoP +DoCkKvbdLFehCBRV +DoDKjvbdLZRJrztf +EObkKvbdkHflGFmk +EOcKjvbdJYUCIMQp +EPDLKvbduCcVXWOo +EPCkKvbdptTfqqkU +DoDKjvbdGQATWgGZ +DncKjvbdEztQeMCi +EObkKvbdZtJJZETO +DoCjjvbdZsiIyETO +EObkKvbddndrjstS +EOcLKvbddeOqbXDK +DnbkKvbdCTBDUGXS +EPDKjvbdQlwayOUz +EPCjjvbdlqyUzTEJ +DoDLKvbdhtydvrUb +EOcKjvbdlZTSSyGt +EOcKjvbdmJDtQuSB +DnbjjvbdtSqsZZeD +DoDLKvbdUaBpsRSZ +EPDKjvbdLGFhBaRV +DnbkKvbdSBcdkhxk +DoCjjvbdDoDKkXDE +DoDKjvbdwyhFfYFS +EPDKjvbdOEctJIjd +EPCjjvbdEObjkWcE +EPDLKvbdhtzEvquC +EObkKvbdZjShQHCG +EPCjjvbdmIctQuRa +EPCkKvbdVwIwucdg +EOcLKvbdADRxJzJQ +EOcLKvbdWWiXvEEg +EPCjjvbdTAFIhBoE +EPDLKvbdZLqdTnMN +EPDLKvbdZQldhmEq +EOcKjvbdLLBIWAJy +DncLKvbdrMzKYlIJ +EPCjjvbdzitoodSt +EPDLKvbdLFehCAqV +DoCkKvbdrMyiyMHi +EPDKjvbdkVvmcaxX +EOcKjvbdmpZxvKxb +EPCkKvbdliDtRUrB +DncLKvbdkxsRsYft +EPDKjvbdTqROuVHm +EPCjjvbdSQTgJedX +EPDLKvbdHlBznXRL +DncKjvbdQdDBQRDr +EPDLKvbdliDsqVRa +DoDKjvbdjgflFfOL +EPDKjvbdeEoSCWbj +DnbkKvbdfSBWzkcP +EObkKvbdmIcspuSB +EPCjjvbdvAdZTPEh +DoCkKvbdIGfyxwxH +DnbjjvbdWWiYWDeH +EObkKvbdZQleImFR +DncLKvbdQwNdCkgc +EOcLKvbdQdDBPqES +DnbjjvbdrpWPJbuf +DoCkKvbdTulQKTaR +DoDLKvbdeUAUASlv +EPCjjvbdZQmFJNEq +DncLKvbdVBBqSqSZ +EOcKjvbdqceJPmvB +DncLKvbdZtIiYcrn +EOcLKvbdJSxaSmYM +DoCkKvbdqqtkOLBN +EObkKvbdgFkymfgA +DnbjjvbdVqmwadlD +DncLKvbdsBfNMGkZ +EPDKjvbdEPDKjwCd +EObjjvbdHDjvKBjK +DncLKvbdCTAbsevr +EObkKvbdFxuUaEXb +DoCjjvbdcyyQYZQb +EObjjvbdZsiIxdSn +EPDLKvbdZQmEhmEq +DnbkKvbdxnTIXriD +DncKjvbdfHkVrORH +EOcKjvbdddoSCXDK +EPCkKvbdhanbdvpq +EOcKjvbdRyihTDWA +DnbjjvbdajkeoODA +EOcLKvbdlhdTpuSB +EPDLKvbdhgJbxuiu +EPCjjvbdnHFXmNgZ +EPCkKvbdpecdsvAh +DnbkKvbdVZIUZjnn +DncKjvbdbAvFGPpX +DnbjjvbdkMalZeHP +EOcLKvbdYSlAmUOx +DoCjjvbdHDkWKCKK +EPDLKvbdaRecHsek +EPCjjvbdJXsagkqQ +EObjjvbdRMwbZNtz +EPCkKvbdrbGMlHKy +DncLKvbdKfGICApu +EPDLKvbdUtNTfLvK +EPCkKvbdMJCMRYAS +EOcLKvbdCJKbLJFj +DoDKjvbdfpBzvcxI +EObkKvbdYpldhmFR +EOcLKvbdSPsfiecw +DoCjjvbdHEKvKCKK +DnbjjvbdUGzmkwVe +DnbjjvbdfMfXGmJk +DnbkKvbdZoOIeEyj +EObkKvbdZnmhdeZj +EOcKjvbdTkuoBVoJ +EPCjjvbdGKdsChMu +DoDLKvbdJYTahLpp +EPCjjvbdbhmJkFwY +DoDLKvbdkIHMGGOL +EPDKjvbdZsiIxdSn +EPCjjvbdMgCpNQUk +DncLKvbdjblKqGtg +DncLKvbdOYOuzdNt +DncKjvbdTvMPjTaR +EPDLKvbdiiehKNXr +DoCjjvbdZdxGzghb +DoDLKvbdeOdsKssr +DoDLKvbddBsMrAUN +DoCkKvbdxxIjBozL +DoDKjvbddoErkUTr +EOcLKvbdwzIFeweS +DoDLKvbdREDBQRES +EObkKvbdhlEdOUby +DoCjjvbdNPxRWNgT +DoDLKvbdZLqctNlN +EObjjvbdbUbHXkUI +DnbkKvbdhtydwSVC +EPDKjvbdeUAUASmW +EObjjvbdhgKDYvJu +EOcLKvbdZnmhddyj +DoDLKvbdUVlQKUAq +DoDKjvbdDihJvXjA +DnbkKvbdZLrETmlN +EPCjjvbdxxJJbQZk +EPCkKvbdrounjDVf +DoCjjvbddiirVtzn +DoDLKvbdmttyjiqf +DncKjvbdfHjvSNpg +DoCjjvbdmRxuZsEJ +DoCkKvbdjAQGaQGj +DncLKvbdnVUzLJrG +EPCjjvbdLAjgNCXq +DoDLKvbdqmZixlHi +EPDLKvbdVUMsekvK +EPDKjvbdrMzKZMIJ +EPCkKvbdKDKCpicY +EOcLKvbdwtmEqZMO +EPDLKvbdmgFXlnGy +DncKjvbdyTNhlqbH +DncKjvbdnHFXlnHZ +DoDLKvbdTqROuUgm +DoDKjvbdRMwbZOUz +EPDKjvbdRMwbYmtz +DoDKjvbdZnmheEyj +EPCkKvbdbBWEfPow +DoDKjvbdQwNccLgc +DoCjjvbdhtzFWqtb +DoDKjvbdRotHKGEX +DncKjvbdZsiJZETO +EObjjvbdaNKbStlg +DoCkKvbdsZlQTAhO +EObjjvbdjhGlGGNk +EObkKvbdQdDBQQcr +DoDKjvbdMtrrLNAX +EPCjjvbdRotHKGDw +EPCjjvbdqZPIGqDx +EOcLKvbdiGicZViu +DnbjjvbdJvVGEFGi +DoCkKvbdKNAEZfuB +EPDLKvbdLZRJrzuG +DnbkKvbdhytfLpnG +EPDKjvbdRbEEkiYk +EOcLKvbdcJMjLFvx +DncKjvbdFfKRnItR +DoDLKvbdegjurORH +DnbjjvbdEPDKjvcE +EPCjjvbdkHgLeenL +DncLKvbdZnmheEzK +DncKjvbdZjSgpHCG +DoCkKvbdbBVdeoow +DoDLKvbdZQmEhleR +EPDLKvbdpxoHfpcx +EPCkKvbdSPtGjGEX +DncKjvbdRbDeLhxk +EObkKvbdrpWOibvG +DnbjjvbdfIKurNpg +EPDLKvbdZyEKNbkr +DoDLKvbdwXMAvBWV +EOcLKvbdWWiXvDdg +EOcKjvbdelfWfljL +DncLKvbdjuvnEBxX +DncLKvbdliDspuRa +EObjjvbdVTlsekuj +DoCjjvbderAvzlDP +EPDKjvbdNeDtIhkE +Dnbjjvbddwyssqez +EObkKvbdGGKRnItR +DoCkKvbdHbLzEzAD +EPCkKvbdTvMPjUBR +EObjjvbdTAEiIBoE +DoCjjvbdRjxfUgLT +DnbkKvbdnUuZkKRf +EPDLKvbdjmBkydgP +EObkKvbdNeDsiIjd +DncKjvbdrounjDWG +DnbjjvbdrWokbhxq +DoDLKvbdsPvPKDWG +DncKjvbdZdwfzgiC +EOcLKvbdZLqdUNlN +DoCjjvbdkDMLRHVH +EPDKjvbdirziSjiz +EObkKvbduDDUvuno +DoDLKvbdkHgMGGOL +DncLKvbdhkdcmuCy +EObkKvbdCJLCLIej +DnbkKvbdeFPRawCj +DncKjvbdsQVoKDVf +EPDLKvbdRXNccLhD +EObkKvbdFxttaDxC +EObkKvbdqrVKnKaN +EPCjjvbddoEsKtUS +EObjjvbdzaAOffbM +DoCjjvbdWSNxBdlD +EPCjjvbdqlzKYlIJ +EOcLKvbdQdDApRDr +DncKjvbdczZPwyRC +EOcLKvbdtlXwBUBX +EOcKjvbdmgFYNOGy +DoCjjvbdKVtfEFGi +EObkKvbdrNZjZLgi +EOcKjvbdliETqVSB +EOcKjvbdbVBgXkUI +DncLKvbdNHDPmPtk +DnbjjvbdjlakzEfo +EOcKjvbdVUNTfLvK +EPDKjvbdTXjkmzjx +DncLKvbdrylQTBIO +EPCkKvbdJpzEoGOF +DncKjvbdFeiqmhtR +DncLKvbdZnnJFFZj +EPDLKvbdlrZUzTEJ +EPDKjvbdLFfICBRV +EPCjjvbdcyxpXyRC +DoDLKvbdQdCaQQcr +DncLKvbdZsiJZDsO +EObjjvbdzQoNIjXA +DncLKvbdVqmxBdlD +DoDKjvbdRjxfUgLT +EObjjvbdWIYVxHYz +DoCkKvbdIGfzZXxH +DncKjvbdxsNhlqag +DoDKjvbdFWYopNJe +EPDKjvbdVBCRTRSZ +EPDKjvbdwyhFfXeS +DoCjjvbdziuPocsU +EPDKjvbdYSkaNUPY +EObjjvbdznopdcLx +EOcLKvbduMYWaUBX +EPDKjvbdnPzZWKyC +EObkKvbdZxcimbkr +EObkKvbdBhjbKiFj +EOcLKvbdjuwNdBww +EPDKjvbdmbKWxOnV +DoCkKvbdnHFYNNgZ +DoDLKvbdrMzKYkhJ +EOcLKvbdqdFIpNvB +EPDKjvbdcScKtDjB +EOcLKvbdygZMAMdw +EOcLKvbdsCGNLgLZ +DoDLKvbdaMkBsUlg +DncKjvbdlZSqsYft +DnbkKvbdnVUzLKRf +DoCkKvbdnHFXlmgZ +EPDKjvbdxZgfGYFS +DoCkKvbdxwiKCPzL +DnbkKvbdBcpAvKMf +DoCjjvbddZyQXxpb +DncLKvbdzQnmIjXA +EPDKjvbdFWZQQMjF +DnbjjvbdMgDQMpUk +DncLKvbdOFDtIiKd +DoDKjvbdKNAEZfta +EOcKjvbdhyuGMQmf +DnbjjvbdZnmhdeZj +DncLKvbdhbOcFXRR +EOcLKvbdvBEZSoEh +EOcKjvbdYkrEUOLm +EPCkKvbdNrtWGduQ +EPDKjvbdZjSgpHCG +EObkKvbdyzdmrHhh +DoDLKvbdznpQdblY +DncLKvbdZshhyDrn +DnbkKvbdjvWmdCYX +EOcLKvbdAMgxsWzY +DnbjjvbdwzIGGXdr +EPDKjvbdrNZixlIJ +DoDKjvbdsQWOicVf +DoDKjvbdjuvmdBxX +EObkKvbdzHZMANFX +DoDLKvbddjJqutzn +EOcKjvbdwNWAMdFN +DnbkKvbdTqRPUtgm +EOcKjvbdVYgtZkOn +EPDKjvbdNGcPlotk +DnbjjvbdJbjDRJcY +EPDLKvbdZtJIyESn +DoDKjvbdtcCuXVoP +DoCjjvbdZMSETmlN +DoCjjvbdgGLzNfgA +EPDKjvbdxKvcgzyf +EObjjvbdrMzKZMIJ +DncLKvbdMoxQumfs +EPCjjvbdbhlikFvx +DoDLKvbdRadFMJYk +DnbjjvbdHgGzYxYH +EObjjvbdVZHtZkOn +DnbkKvbdakLfPNcA +DoCjjvbdmfeXmOGy +DoDLKvbdrRtjmjaN +DnbjjvbdUxgsyjoO +DnbjjvbdbhlikFvx +EPDLKvbdRbEFMJYk +EOcKjvbdRXNcblHc +DnbkKvbdqmZixlHi +DoCjjvbdrzLpTBIO +DoCjjvbdILaznXRL +EPDLKvbdRjyGVGkT +EOcLKvbdehKurOQg +DncLKvbdYkrDsnLm +DoDKjvbdZisHpGaf +DncLKvbdpyPIGpcx +EOcLKvbdijFhKNYS +EOcKjvbdMuSqkNAX +EObjjvbdajlFnnDA +EOcKjvbduLxXAsaX +DnbjjvbdiiegjMwr +EPCkKvbdiMEdNuCy +EPCkKvbdqTtHSRkU +EPCkKvbdIryBTNXl +DncLKvbdFjdrcHlu +EPDKjvbdZoOIeFZj +DncLKvbdcbTNSATm +DoDKjvbddePSCWcK +DoDKjvbdZsiJYcsO +DoDKjvbdpeceTuaI +EOcKjvbdjhHMGFnL +EOcLKvbdjcLkRGtg +DnbjjvbdCJLCKiFj +EPDLKvbdZsiIxdSn +EObkKvbdVTlsekvK +EObkKvbdCTAcTewS +DoDLKvbdOYOuzcnU +EPCkKvbdiUydwRuC +DncLKvbdGQATXGey +EPDLKvbdDjIJvXjA +DncKjvbdpxoIHQdY +EObkKvbdZMSDsmkm +EOcLKvbdBvzchdov +EOcLKvbdKRZeOenF +DnbkKvbdwzIFfYEr +DnbkKvbdSKyFuHKs +EPDKjvbddCSlrATm +EObkKvbdSCDeMIyL +EPCjjvbdsCFllGjy +DnbjjvbdHgGyyYYH +DncKjvbdjKFgilwr +DncLKvbdEvYoomJe +EObkKvbdlhdTpuSB +DoDKjvbdWWiYVceH +DnbjjvbdLGGHbBQu +EObkKvbdOXoVzcnU +DnbjjvbdbsCjtDjB +DnbjjvbdQwOECkhD +DnbjjvbdMgComQVL +DoCjjvbdRotGjFcw +DnbjjvbdmajWxOmu +EPCkKvbdbPfgDkzd +Dnbjjvbdpxngfpcx +DoCkKvbdBraCtGWr +DncKjvbduDCtwWPP +EPDLKvbdYzcFrKVy +EObjjvbdbVBgXkTh +DnbkKvbdyYIibPyk +DncLKvbdUVlPitAq +EObkKvbdbKlGOnDA +DnbjjvbdrJAKFNPF +EPDLKvbdLAjgMbYR +DoCjjvbdSxLLmzjx +DncKjvbdeEnqawCj +EObkKvbdFWZQPmKF +EOcKjvbdGdKvJbJj +DnbkKvbdjcLjqHUg +EPCjjvbdQvnDcLgc +EPCkKvbddoFTLTtS +DnbkKvbdZtIhyDrn +EPDKjvbdBvzdIdpW +EObjjvbdEYYLstUM +EPCkKvbdyzdnSHiI +EObjjvbdZLqdTmlN +EPDLKvbdIHHZyXwg +DoCkKvbdbVBfxKtI +DnbkKvbdMpYRWOGs +EOcKjvbdczYoxYqC +EPCjjvbddwytTqez +EPCjjvbduaDySoEh +EObkKvbdTJZiqAAl +EObjjvbdmoyyWLYb +EPDKjvbdnPyxukZC +EObjjvbdrWolDJZR +DoCkKvbduCbtvvPP +EPDLKvbdJbicQibx +DncLKvbdHELVibJj +DnbjjvbdKefHbAqV +DncLKvbdsZkpTBHn +DoDKjvbduCcVXWOo +DnbkKvbdidkGtoAO +DnbjjvbdrEFIonWB +EPCkKvbdfpBzwEYI +DncLKvbdwuNFRZMO +EPDLKvbdrounjCvG +DncLKvbdxxJJaoyk +EPCjjvbdJmADzHUa +EPDLKvbdqGEFTvBI +EPDLKvbdyOShYTJD +EPCjjvbdJutecdfi +EPDLKvbdIMBznXQk +DncKjvbdmoyxvKyC +EPDLKvbdrXQMChyR +DoCkKvbddwytUSFz +DncKjvbdZjTHofbG +EPDKjvbdGcjujCJj +EPCkKvbdvBEYsOeI +DncKjvbdCTAcUGWr +EPCkKvbdmbKWwnnV +DnbjjvbdpxnhHREY +EObjjvbdlZTRsYft +DoCjjvbdhkdcmtcZ +EObjjvbdMfcPmPtk +EPCkKvbdJXtCHkpp +DnbjjvbdrSUjmkBN +EOcLKvbdYSlBMtOx +EObjjvbdznopdbkx +DncLKvbdddoSCXDK +DoCjjvbdOXnuzcnU +EPCkKvbdZGwEAOsJ +EOcKjvbdauCGwjtI +EPDLKvbdNHDPmPuL +EOcLKvbdNHCpMpUk +DoCjjvbdmSYtysDi +DncKjvbdFjeTDINV +DncKjvbdNrtWHFUp +EPCjjvbdmJETqUqa +DncKjvbdEzsqEkcJ +EOcLKvbdmoyyVjyC +EOcLKvbdZMSETnMN +EOcLKvbdBsAbtFvr +EPCjjvbdJutfEFHJ +DoCkKvbdiBoDEwRR +EPDLKvbdZQmFImFR +EPDLKvbdpfDdsuaI +DnbkKvbdmbKXYPNu +EObjjvbdjKGHjNXr +EOcLKvbdpssgSRjt +DoDLKvbdKRZePGOF +DnbkKvbdfekymgHA +DoDLKvbdiCOcFWqR +DnbjjvbdiHJbyWKV +DoDKjvbdsCGNMHKy +DoCjjvbdGKeSbgmV +DoDLKvbdkIGkfFnL +DncKjvbdfILWRnRH +DoDKjvbdGLEsChNV +EPCjjvbdVrNxBeMD +EPDKjvbdSLZGVHKs +EPDLKvbdQlxByOUz +EOcLKvbdMgDQNQVL +DoDLKvbdrRtjnLAm +EObjjvbdCIkBjhfK +DncKjvbdDwwlTssl +DoDLKvbdANIYsWzY +DnbjjvbdxVMdqYkn +DoCkKvbdzdynzdzQ +DnbjjvbdxsNhmRag +EObjjvbdzjVQPcrt +DoCkKvbdbBWFFopX +EPDKjvbdhfibxvKV +DnbkKvbdegjvRmqH +EPCjjvbdkNCMZdgP +EOcLKvbdmtuZkJqf +EObjjvbdemFvfljL +DncLKvbdyYIibPyk +EObjjvbdieKftoAO +DncKjvbdvOszqKoU +DncLKvbdVUNTelWK +EOcKjvbdCDoaWKMf +EPCkKvbdbsDKtDjB +EPDLKvbdmSYuZsDi +DncLKvbdwWlBWBWV +EObjjvbdkVwOEBww +EObkKvbdWSNwbFLc +DnbjjvbdZRNFImEq +DoDKjvbdrounjDVf +EPDKjvbdCJKbKhej +DncKjvbdsrrTYyeD +DoCjjvbdQvnEDMHc +DoCkKvbdGQASwGfZ +EOcLKvbdfSBWzkbo +DoDLKvbdRkZGVGkT +EOcKjvbdyXhjCPzL +EPCkKvbdbrbkTdJa +EPDLKvbdsQVnibvG +DnbjjvbdpyOgfpdY +DoDLKvbdtunXiqTA +EPDKjvbdqGDdsvAh +DncKjvbdjEkHUoAO +EPCjjvbdGQATXGfZ +EOcKjvbdKDJcRKCx +DncKjvbdhyuGMQnG +DoCkKvbdYkrDsnMN +DoCjjvbdaNKbSuMg +EOcLKvbdrykpTAhO +DnbkKvbdrSUkNkAm +EPCjjvbdwzHeeweS +DoDLKvbdSBdFMJYk +DnbjjvbdqUUGrRjt +DoDKjvbdzitoocrt +EPDKjvbdxnShXriD +DoCkKvbdVviXvEEg +EObkKvbdFxuUaDxC +EObkKvbdygZMAMeX +DnbjjvbdiifHilxS +EPDKjvbdZxcjODMS +DoDLKvbdWWhxWEFH +EPCjjvbdzoQQeClY +EOcLKvbdptUHRqjt +DoDKjvbdVviXudEg +EPDLKvbdUQpnuVHm +EPCjjvbdwzHfFweS +EOcLKvbdZxcjNbkr +EObkKvbdZnmhddyj +DoDLKvbdvlvANDdm +EOcKjvbdMfbolpVL +EObjjvbdbAvFFpQX +EOcKjvbdBdPaWJlf +DncKjvbdqceIonWB +DoCkKvbdtcDVWvOo +DoCkKvbddoFTKssr +DoDKjvbdaMkBruMg +EPCjjvbdEuyPolie +DnbkKvbdOEcsiJLE +DncKjvbdHlBznWqL +EPDKjvbdbhlijewY +EObjjvbdfoazwDwh +EOcLKvbdaNKbStlg +DoCkKvbdqdEiQOWB +DoCkKvbdTvLpKUBR +DncKjvbdkNBkzFHP +EObkKvbdFkErcHlu +DoCkKvbdZshiYcrn +EObjjvbdEJhJvYKA +DnbkKvbdOTUWHFUp +DoDLKvbdVhXvXfxz +EPDLKvbdBdPaWKMf +EObjjvbdFejRnJTq +EPDLKvbdULvPBVoJ +EPDKjvbdJzpFwdAN +EPDKjvbdqwPkbiZR +EPDLKvbdrEFIomua +EOcLKvbdijFhJlxS +DnbkKvbdYkrEUOLm +DnbkKvbdIMBznXQk +DncKjvbdZisHpHCG +EPDLKvbdzjUopESt +DnbjjvbdzjUpPcrt +EPDKjvbdqZOgfpdY +DoDKjvbduLxXAsaX +EObkKvbdrMyiyMHi +EPCkKvbdqTsfqrKt +DoDKjvbdTfznMXVe +EObkKvbddoErkUTr +EOcLKvbdHELWKCJj +DncLKvbdUVkpJtAq +EPCjjvbdRMxBxmtz +EPDKjvbdjEjftoAO +EOcLKvbdYkrDsmkm +DoDLKvbdajlFoNcA +DoCjjvbdmJDtRUqa +EPDKjvbdTqQoUuIN +DnbkKvbdtcDUvvPP +DncLKvbdrbGMlHLZ +DnbkKvbdKfGHbApu +DncLKvbdGFjRnIsq +EPDLKvbdJzpGYEAN +DoCjjvbdkySrSyHU +EObjjvbdKVtfDdfi +EPDKjvbdNrsugFUp +DoCkKvbdNxOuzcmt +DoDLKvbdDihJuxKA +DnbkKvbdzdzOzdzQ +DncKjvbdmSYuZrci +EOcLKvbdptTfqqkU +EPCkKvbdVUNTfLvK +DoCkKvbdGdKujBjK +DoCjjvbdzitopETU +DoDKjvbdqvokbiYq +EPDLKvbdGFjSOJTq +DoDKjvbdliETqUrB +DoDKjvbdZisIQGbG +DoCjjvbdnQZyWLZC +EOcLKvbdGdKujCJj +EPCkKvbdaRfDIUGL +EOcKjvbdauCHXjtI +DnbkKvbdbQHHDkzd +DoCjjvbddZxpYYpb +EObkKvbdbBWEepPw +DncKjvbdSLYfVGkT +EObkKvbdVgxVxHYz +DoCjjvbdfpBzwEYI +DoDKjvbdmfdxMmfy +DncKjvbdhancEwRR +DnbkKvbdEASJMzXX +EObjjvbdmfdwmNfy +DnbjjvbdhbOcFXQq +DoCjjvbdVgxVxGxz +EPCkKvbdQcbaQQdS +EPCjjvbdhbObeXRR +EPDKjvbdePFSkUTr +EPDLKvbdMoxQumgT +DoCkKvbdIBkydzAD +EOcLKvbdcasMrAUN +DoCkKvbdUQqOttgm +DnbkKvbdelevfljL +EObjjvbdZeXfzgiC +EPCjjvbdQYmAGrrK +EObjjvbdxZhGFxFS +EObjjvbdJuuGEEgJ +DoDLKvbdEARhlyvw +EPDKjvbdZdxGzhJC +DoCkKvbdzRPMhiwA +DoCkKvbdZxcinClS +EOcKjvbdFyVVBEYC +EOcLKvbdtbcUwVoP +DncLKvbdlZSrTYft +EObkKvbdaaVeGPow +DncLKvbdEKIJvXjA +DncLKvbdbhljKfWx +EObkKvbdVhYVxGxz +EPDKjvbdmpZxukZC +DoDLKvbdnBivxOnV +EObjjvbdRbEEkiZL +EPCkKvbdZRNFIleR +DoDLKvbdZyEJmblS +DncKjvbdkIGkefNk +EPDKjvbdRkZGVGjs +DnbkKvbdiHJbyVjV +EPDLKvbdFjeSbglu +DncLKvbdqFcdtVaI +EOcKjvbdGYuVAdYC +DoCjjvbduaEZSneI +DnbjjvbdKWVFdFHJ +EObjjvbdGdLVjCJj +DnbkKvbdpssgSSKt +DoCjjvbdssRryZdc +EPDKjvbdZisIQHCG +EOcKjvbdCIjajhfK +DoDKjvbdrafNMGjy +EObkKvbdgQBzwEXh +DnbjjvbdgQBzwDwh +DncKjvbdCEQAvKMf +EPCkKvbdiCOcFWpq +EPDLKvbdLFfHbBQu +EPCjjvbdJTYaSmXl +EPCjjvbdRjyFuGkT +DoCkKvbdjFKftoAO +DncKjvbdmaiwXoNu +DoCjjvbdVZITyjnn +DoDLKvbdDxYLtUTl +DnbjjvbdqvpLcJYq +EOcLKvbdlqxuZsDi +DoDKjvbdZshhyDsO +DoCjjvbdGFjSOIsq +DnbkKvbdcScKtEKB +EPCjjvbdMpXqVmfs +EPCjjvbduoTzpjoU +DoDLKvbdYkqctNkm +EObkKvbddoErjstS +DnbjjvbduLxWaUAw +DoCkKvbdRXODbkgc +DoCjjvbdwzIGFweS +DoCkKvbdZyEKOClS +EObjjvbdiGjCxvJu +EObkKvbdbiMijewY +DoDKjvbdqrVKmkBN +DoCkKvbdFyUuBEYC +DoDLKvbdNsTufduQ +DoDLKvbdEPCkKvcE +DoDLKvbdNQYRWNgT +DnbjjvbdNrtWGeUp +DoCjjvbdPxmAGrqj +EPDKjvbdKNAEZgVB +EPDKjvbdmttzKjSG +EPDKjvbdssSSxydc +DoCjjvbdTlWPAuni +EObjjvbdDHLegAzc +EObjjvbdXnRAXtvU +EObkKvbdKfFgaaQu +EOcKjvbdhtzFXSUb +EPCkKvbdJTZAsMwl +EOcKjvbdQYmAGsSK +DoCkKvbdjhHLeemk +EOcLKvbdiifIJmYS +EPDKjvbdLrWlzVQz +DoCjjvbdxsOIlrBg +EPDLKvbdNPxQvNfs +DnbkKvbdIGfyxwxH +DoCjjvbdjKFhKMwr +DnbjjvbddjKSVtzn +DoCjjvbdZoNiFEzK +EPCjjvbdeFOqavcK +DoDLKvbdEuxpQMie +EObjjvbdZjShQHCG +DoDLKvbdZMSDsmkm +DoDLKvbdGYtuBEYC +EPCjjvbdUaBprqRy +EOcLKvbdmozZWLZC +DncLKvbdUWLpKUBR +EPCjjvbdqYnhHQcx +DoDLKvbdUaBprpqy +EPDKjvbdrzMQSaHn +DnbjjvbdGdLWKCJj +EObkKvbdfILVrNqH +EPCjjvbdehKvRmqH +EPDKjvbdOSsvGeVQ +DncLKvbdxxJJaozL +EPCjjvbdZLqctNkm +EOcLKvbdZxcinCkr +DncLKvbdkWWmcbXw +DoDLKvbduCcVXWPP +DncLKvbdyTNhlqbH +DncKjvbdYTMAlsoY +DoCkKvbdRosfjFcw +EPDLKvbdDwxLsstM +EOcKjvbdlZTRryHU +DoCjjvbdNGbpMpVL +EOcLKvbdYgWdAOri +DoCjjvbdDxYLstTl +EObjjvbdIwtBglRQ +EOcKjvbdvPTzpkPU +DoCjjvbduLxXAtBX +DoCjjvbdiLeENuCy +DnbjjvbdUaCRSqRy +DnbjjvbdYpmEhleR +EObjjvbdsPvOjDWG +DoCkKvbdLFfICApu +DncKjvbddxZstRez +EPCkKvbdFyVVAdXb +DoCjjvbdFyVVBDxC +DoDLKvbdFeirNiTq +EPCjjvbdxnSgxTIc +EOcKjvbdAMgySwZx +EObkKvbdkyTRryHU +DoCkKvbdMRwMzUpz +DnbjjvbdCWzdJEov +DoCkKvbdUyITzLPO +EPCkKvbdcSbjsdKB +DoCkKvbdqceIonVa +DoCkKvbdjmCMZeGo +DncKjvbdfMewGljL +EObkKvbdpfEEtVaI +DoDLKvbdczZQYYqC +DoDLKvbdRNXbYmtz +EObjjvbdTvLojUBR +EPCkKvbdtbcVXWPP +DncLKvbdmSYuZrdJ +DoDLKvbdTukpKUBR +EPDLKvbdsQVoKCvG +EPDLKvbdBraCtFvr +EPDLKvbdZQmEiNEq +EPCjjvbdrzLosAgn +EPCjjvbdssRsZZdc +DncKjvbdbAudepQX +DncKjvbdcTDKscia +DncLKvbdlqyVZsEJ +EOcLKvbdbVCHXkTh +EObkKvbdYTMBMsnx +DnbjjvbdULvPAuoJ +DoCjjvbddtAUASlv +DoDKjvbdxUmEpxkn +DncKjvbdQwOEDLgc +DoCkKvbdSPsgKGDw +DncKjvbdiCOcFXQq +EPDKjvbdRkYfUfkT +EObkKvbdKCjDRJcY +DoCjjvbdZLqctOMN +EPCjjvbdUWLpKTaR +EPCjjvbdLqwMzVQz +DnbjjvbdnBivxPNu +EObkKvbdRpUHKFdX +EPCjjvbdeATqNXif +DoCjjvbdfILVrOQg +DoDKjvbdNrtVfeUp +EOcLKvbdNUrrKmAX +EPCjjvbdrbFllHLZ +DncKjvbdkDMLQgUg +DoCkKvbdVvhwvDeH +DnbjjvbdKeegaaRV +DoDKjvbdcJMjKfXY +DnbjjvbdZtJJYcrn +DoDLKvbdyqOliJwA +DoDLKvbdMgDPmPuL +DoCkKvbdHffzZXxH +DoCjjvbdZxdKNblS +EPDKjvbdkDLjqGtg +EPDKjvbdYzbeqjVy +DncLKvbdTppnttgm +EObkKvbdVYgtZjnn +EPCjjvbdzaAOgHCM +EOcKjvbdcyxoxZRC +EPDLKvbdxnSgxTJD +EObkKvbdfMfXHNJk +EPDKjvbdunszpjoU +EObkKvbdFfKRmhsq +EOcLKvbdhtydwRtb +DoDLKvbdYkrDsnLm +EPDLKvbdGGKSOItR +EPCkKvbduDCuXVno +EPDLKvbdrEFJQOVa +EPDLKvbdIjEAKQGd +EObjjvbdIryArmYM +DoDLKvbdYkqctOMN +EPCkKvbdiZtekqOG +DncKjvbdzdzOzeZp +DoDLKvbdbiNKLFwY +DnbkKvbdlhcsqUrB +DnbkKvbdKyRJrzuG +DoDKjvbdOFDtIiKd +DnbjjvbdvvlBWBVu +DnbkKvbdlrZUyrdJ +EObkKvbdxZgeewdr +DncKjvbdegkVrNpg +DoCjjvbdrJAJeNPF +EObjjvbdmfeXmOHZ +DoCjjvbdNPwqVmfs +DnbjjvbdnPzYvLZC +EPDKjvbdZshiYcrn +EOcLKvbdhgJcYvJu +DoDLKvbdXrlAmToY +DnbkKvbdwWlAvBVu +DnbkKvbdjvWnEBww +DoDLKvbdTYLLmzjx +EOcKjvbdDihJuxKA +DncLKvbdTfznLvue +DoCjjvbdVgwvXgYz +EObjjvbdsBfMkgKy +EPCjjvbdUaBqTQrZ +DnbjjvbdbhmJkGWx +EPCjjvbdLBLGmCYR +DoDKjvbdwjwEHzyf +EPDLKvbdegkVrNpg +DoCkKvbdJpzEnfOF +EPCkKvbdFejSOItR +DnbjjvbdTqQnuUhN +EOcLKvbdUMVoAvOi +EPCkKvbdSCEFLiZL +EPCkKvbdnCKXYPNu +EPDLKvbdZyEKNbkr +DncLKvbdZisIQGaf +EObjjvbdGLEsDHmV +DoCjjvbdBcpAujNG +EObjjvbdZRNFIleR +DnbjjvbdVrOXaeLc +EPCjjvbdHELViaij +EOcLKvbdqcdhpNvB +EPCkKvbdiZuFkqOG +DoCkKvbdOSsufeVQ +DoDLKvbduoTzpjnt +EOcLKvbdTqRPUuHm +DoDLKvbdCDpAuilf +EOcKjvbdZMSDsnMN +DoDLKvbdYqNFJMeR +DnbkKvbdbAvFFpPw +EOcKjvbdVqmwaeMD +EPCkKvbdUyHsyjnn +EPCjjvbdKeehBaQu +DoCjjvbdZshiYdTO +EObkKvbdTvMQJsaR +EPCjjvbdjblKqHUg +DnbkKvbdYlSDtOMN +EObkKvbdrWpMCiZR +EOcKjvbdUGzmlWue +DncKjvbdFyUuAcwb +EPCkKvbdLZQjSztf +EPCjjvbdfjfzbfAE +DncKjvbdFWZQQMie +DoCjjvbdVgxVxHYz +EOcKjvbdWWhxWEFH +DoDLKvbdUWLoitAq +DoDLKvbdzaAOffbM +EOcLKvbdrXPkbiYq +DoCkKvbdYzberKVy +DncLKvbdIMBznWpk +EPCkKvbdEPCkKwDE +DnbkKvbdWWiYVcdg +DoCkKvbdCWzchdpW +EOcLKvbdjvXNcbYX +EPDLKvbdSxLMNzjx +DnbjjvbdhficYuiu +DncLKvbdvmWAMdEm +EObjjvbduaDyTOdh +DncKjvbdwWlAvBWV +DoDKjvbdVviYWDeH +EOcKjvbdNsUWGdtp +DoCjjvbdzjVPodTU +EPCkKvbdmIcsptqa +EPDLKvbdIHHZxxYH +EPDLKvbdUyIUZkPO +EObkKvbdCDpBWJlf +EPDKjvbdWSNwaeMD +DoCjjvbdACrXjZhp +EPDLKvbdwuMdqYlO +DnbjjvbdHlBznWpk +DnbjjvbduaDyTPEh +DnbjjvbdwuNFRZLn +EObjjvbdajkfOnDA +DnbkKvbdWWiYWEEg +EPDLKvbdffLymgHA +EOcLKvbdkDMKpfuH +EPDLKvbdMoxQvOHT +DnbkKvbdbKkenmcA +DoCjjvbdhytfMRNf +DoCjjvbdIsZAsNXl +DoDKjvbdLiBkqYAS +DncLKvbdyzdmrHiI +DnbjjvbdemFvfmJk +EOcLKvbdSCEEkiYk +DoDKjvbdbiNKKevx +DoDLKvbdaaVdeoow +DnbjjvbdNGcQNPuL +DncLKvbdQYmAGrrK +EPDKjvbdrbGMkfjy +EPCjjvbdZjShPfbG +DnbjjvbdJmADyfuB +DnbjjvbdhtzFWquC +DnbjjvbdQvmdDMID +DncLKvbdjvWnEBww +EPCjjvbdxZgfGXdr +EObkKvbdDihKWXjA +EPCkKvbdZMSETnLm +EPDKjvbdZLqcsnMN +EObkKvbdqwPlDJZR +DoDKjvbdZisIQGaf +EObjjvbdjlalZeGo +DncKjvbdxsOJMqag +DoDKjvbdOFEUIhkE +DoCkKvbdzitoodSt +DncLKvbdVrNwaeMD +DoCjjvbdezuyEiTw +EPDKjvbdiCOcEvpq +DoCjjvbdvvlAvAvV +DnbjjvbdJuuFceHJ +DoCjjvbdlYrrSyGt +EPCkKvbdfILVrNqH +DoDLKvbdxsOJNRbH +DncKjvbdIwtBgkpp +DnbkKvbdOTUWHEtp +EPDKjvbdFejRnIsq +DnbjjvbdVBCRTQrZ +EPCjjvbdiMEcnUcZ +EObkKvbdiZuGMRNf +EOcKjvbdatbHYLTh +DoCkKvbdmSZVZrdJ +DoDKjvbdqTsgRqjt +DoDLKvbdCEQBWKNG +DnbjjvbdZtJJZESn +DncLKvbdIHGzZXwg +EPDLKvbdwtmFRZMO +DoCjjvbdKDJbqJcY +EObkKvbdatbHXkUI +DnbkKvbdYqNEhleR +EObjjvbdNHColotk +EPDKjvbdegkWSNpg +DoDLKvbdRjyFtfjs +DoCjjvbddoEsKtUS +EOcLKvbdsQWOjCvG +DoCkKvbdvAcxsOeI +EObjjvbdbAueGQQX +EOcLKvbdxKwEHzzG +DoDKjvbdqTtHSRkU +EOcKjvbdOAIsUKSA +EPCjjvbdWSNxCElD +EPDLKvbdnCKWwoNu +DncLKvbdEARiMzXX +DoCkKvbdbAvEeoow +EOcKjvbdhgJcYvJu +DnbjjvbdTulPisaR +DnbjjvbdIidAKQGd +EPDKjvbdyOTIXrhc +EPCkKvbdrbFmLgLZ +EPCjjvbddeOqbXDK +DncKjvbdRacdlJZL +EOcLKvbdbsDKtDjB +EPCjjvbdUyHtZkOn +EObkKvbdyTOImSBg +DncKjvbdtbbtwWPP +EPDKjvbdKDKDRJcY +EObjjvbdhanbeXQq +EOcLKvbdvvlAuaWV +EPDLKvbdVYgsyjoO +EPDLKvbdKaKflawq +EOcLKvbdCIjajiFj +EObkKvbdUsmUGMWK +EPDLKvbdIjEAJofd +EOcLKvbdqBJFAWhE +EPCkKvbdEJgivXjA +DnbkKvbdYkqdTmkm +EPCkKvbdliDsqUrB +EObjjvbdKVtfEEfi +EObkKvbdmgFYMmgZ +EObjjvbdEARhlyvw +DncKjvbdaRecHtGL +DnbjjvbdNQYRVmfs +EOcLKvbdFfKRnJTq +DncLKvbdMgDQNQUk +EObkKvbdHgGyyXwg +EPCkKvbdCJKbKiFj +EPCkKvbdBraDUGXS +EPDLKvbdiMEcnVCy +DoDLKvbdkCkkQfuH +EOcLKvbdwtmFRZLn +EPDKjvbdKefHbApu +DnbkKvbdkxrqsZGt +EPCkKvbdfIKvRmqH +EOcKjvbdDnbkLWbd +EPDLKvbdaRebhTek +DoDLKvbdjuwODaxX +DnbjjvbdREDBPpdS +DncLKvbdjuwNcaww +EOcKjvbdbiMjKevx +EPDKjvbdqvpLcIyR +EPCjjvbdijGIKMxS +EPDLKvbdQmYCZNtz +EObjjvbdCDpAvKMf +EOcLKvbdJJdAKPgE +DoDKjvbdUxgszLOn +DnbjjvbdOEcshhjd +DoCjjvbdUaCRSprZ +EPCkKvbdxmrhYTJD +EPDKjvbdICLydzAD +EPCjjvbdKRZdoFme +EObkKvbdNdctJIjd +EPCjjvbdKVuFdEgJ +EObjjvbdrXPlDIyR +DoCkKvbdfMewGmKL +DnbkKvbdIwsahMQp +EOcLKvbdRaceMIxk +EPCkKvbdcyxoxZQb +EObjjvbdRkYeuGkT +DncLKvbdbVBfwkTh +EObjjvbdTppoVUhN +EPCjjvbdhytfMROG +EOcKjvbdUxgszKoO +DoCjjvbdGLEsDHlu +EObkKvbdegkVqmqH +DncKjvbdkMbLyeGo +DncKjvbdyzdmqghh +EPCkKvbdGFiqnIsq +EPDKjvbdpstGqqjt +EPDKjvbdYkrDsmkm +EPCkKvbdKaLGlbXq +DoCkKvbdxwiJbPyk +EPCkKvbdJcKDQibx +EPCkKvbduDCuXWPP +DnbjjvbdiGicZWKV +DoCkKvbdsPunicWG +DnbjjvbdKNAEZgVB +EPDLKvbdnPyxujyC +EObkKvbdJXsagkpp +EObkKvbdNddUIiKd +DnbjjvbdQwOEClID +DnbkKvbdFVxpQMie +EPCkKvbdVrNxBeLc +EPCjjvbdUsmUGLuj +EPDLKvbdGZVVBDwb +DoCjjvbdmRyUyrdJ +DncKjvbddZxoxZQb +DnbjjvbdGKdsDINV +EObjjvbdrafNLgKy +DoCjjvbdJbjCqJbx +DnbjjvbdlYsSTYgU +DoCkKvbdQvnDblID +DoDKjvbdssSTYzFD +DncKjvbdmozZVkZC +EPDKjvbdjbkkRGuH +DoDLKvbdxmrgwriD +DoDKjvbdfHkVrORH +EPCkKvbdJuuFceHJ +DoDKjvbdcbSlrATm +EPCkKvbdeATpmXif +DncLKvbdBiKajhej +EPCkKvbdrNZixlIJ +EPDLKvbdKVteceGi +EObkKvbdzjVPodTU +DoDLKvbdWSNxCEkc +EOcKjvbdZxcimcLr +EOcKjvbdZnnIeEyj +DnbkKvbdmbKWxPOV +EPCkKvbdZLrETmkm +EPDKjvbdnUtyjiqf +DoCkKvbdrWpLcJZR +DoCkKvbdaMkCStmH +DncLKvbdFVxpQMie +EPCjjvbdrpWOicWG +EOcKjvbdyOTIYShc +EObkKvbdqrVLNkBN +EOcLKvbdQvnDbkhD +EOcLKvbdDigiuxKA +DncLKvbddoErkTtS +DoDKjvbdRWmdDLgc +EPCjjvbdiHKDZVjV +DnbkKvbdADSYKZiQ +DnbkKvbdsPunibuf +DoCjjvbdSPsfiedX +EPDKjvbdJmAEZfta +EOcKjvbdZMRcsnLm +DoCkKvbdiLddOUcZ +EObkKvbdqqtkOLAm +DoDLKvbdYpmFImFR +EObjjvbdVhYWXfxz +DnbjjvbdMowqWNfs +EObkKvbdVgwuwgYz +DoDKjvbdDxYLsssl +DnbjjvbdZtIiYcsO +DnbkKvbdxwiKBpZk +DoDKjvbdEuxpPmKF +EOcKjvbdJcKDRKCx +EObkKvbdUtNUFlWK +EOcKjvbdjhHLfFnL +DoCkKvbdSQTgKGDw +DncLKvbdQccBQRDr +DncLKvbdILazmwRL +DoDKjvbdYTMBNUPY +DoDLKvbdKaKfmCXq +EPCjjvbdkIHMGGOL +DnbjjvbdCIjbKhfK +DnbkKvbdVgwuwfxz +EPCjjvbdwtmFQxkn +EPDLKvbdcyyQYZRC +DoDKjvbdPyNAGsRj +EObjjvbdSLYetgLT +DoDLKvbdMRwNZuQz +DncKjvbdFjdrcHlu +DoCjjvbdZyDimbkr +DnbkKvbdRXNdClID +EObjjvbdEYYLtUTl +EObkKvbdVqmxBdlD +DoDLKvbdptTgRqkU +EOcLKvbdBdPaWKMf +EPCjjvbdiBncEvpq +DoDLKvbdzQoNJKXA +DoDKjvbdUQpoUtgm +DnbkKvbdrzLpTBHn +DoCjjvbdunszpkPU +EPDLKvbdSZjHsCvA +DncKjvbdRotHJfDw +DnbkKvbdFejSOItR +EOcKjvbdeFOrBwCj +DoDLKvbdkVwNdCXw +EPCkKvbdeOdrjtTr +EPCjjvbdhuZdwRuC +DnbkKvbdfILVqmqH +DncKjvbdnPzYvLYb +DncKjvbdHgGzZYXg +DncKjvbdkVwNcaxX +DoDLKvbdOAJSsjSA +DncKjvbdOFDtJIjd +EOcLKvbdVgwvYGxz +EObkKvbdsQVnjDWG +DoCjjvbdZjShQHCG +DncKjvbdzoPpeCkx +DoDLKvbdSLZFtfjs +DnbkKvbdBsBCtFvr +EOcLKvbdFyUuAcwb +DnbjjvbdqUTfqrKt +DoCjjvbdZxdJmcLr +DncLKvbdmbJwYPOV +EObjjvbdEObjkXDE +EOcKjvbdaSFcIUGL +EPCkKvbdqYoIHQcx +EOcKjvbdfNGWgMjL +DoCjjvbdbrcKtEKB +EPCkKvbdvBDxsOdh +DnbjjvbdtcCuXVoP +DnbjjvbdrpWPKDVf +EOcKjvbdwyhFfYFS +EPCjjvbdnPyyWLZC +EPDLKvbduMYXBUAw +DoDKjvbduaDySoFI +DoCjjvbdyXiKCPzL +DncLKvbdGFjSOIsq +DoDLKvbdeEoRbXDK +DncLKvbdcTCjtDia +DnbjjvbdnUuZjiqf +DnbjjvbdjlakzFHP +EOcLKvbdwWlBWAvV +DnbkKvbdWWiXuceH +EObkKvbdemGWfmKL +EObkKvbdmuUykJrG +DoCkKvbdmozYvKxb +DncKjvbdQZNAGsSK +EObjjvbdjblKpgUg +DncKjvbdSZigsDWA +EOcLKvbdZyEJmblS +DoCjjvbdnCJwYOmu +EPDKjvbdtkxWaTaX +EPDKjvbdGZUuAcwb +DoCkKvbdyfxlANEw +EPCkKvbdTAFJIBnd +DncKjvbdZLqctOMN +DncKjvbdUMWPBWPJ +EPCkKvbdDwwksstM +EPDKjvbdEObjjvbd +EObjjvbdWXJYWEEg +DnbjjvbdpaIeAXIE +DoCjjvbdqYoIHREY +DnbjjvbdvmWAMceN +EObkKvbdLFfHaaQu +EOcLKvbdpaIeAWgd +EPDLKvbdkCkkQgUg +DnbjjvbdePErkTtS +DnbkKvbdNGbomQVL +DoDLKvbdEPCjkWcE +DoCkKvbdehLWRnRH +EOcKjvbdyXhibQZk +EOcLKvbdZyEKOCkr +DoCjjvbdkDLkRGtg +DoDLKvbdkaNPNALA +EObkKvbdrWpLbiYq +DoDLKvbdfHkVqmqH +DoDLKvbdEOcLKwCd +DoDKjvbdrykpTBHn +DncKjvbdxZgefYFS +DnbkKvbdJpzFPFnF +DoCkKvbdNGcPmPtk +EPCjjvbdhzUelRNf +EObkKvbdVTltFlWK +DoCkKvbduaDxrneI +EObkKvbdSQTgJfEX +EOcKjvbdVhYVxHYz +EOcKjvbdkCkkQgUg +EObkKvbdqUUHSSLU +EOcLKvbduLwwAtAw +EPDKjvbdZLrETnMN +EObkKvbdmttyjjRf +DoDKjvbdYqMdiMdq +DoCkKvbdkNBkzEfo +DncKjvbdiLeDnUcZ +DoDKjvbdZLrDsnLm +EPCkKvbduVnYKRTA +EPCjjvbdCIkCLJFj +EPDKjvbdssRrxyeD +DncKjvbdQwOEClHc +EPCkKvbdwXLaWAuu +EPCkKvbdUyHszKoO +EPCkKvbdJYTagkqQ +DoCkKvbdwuNFRYlO +EPCjjvbdfHkWRmqH +EOcKjvbddeOqbXCj +EObkKvbdhficYujV +EPCkKvbdmSYtzTEJ +EPCjjvbdtkxWaTaX +EPDLKvbdwygfGYEr +EPDKjvbdmpZxvKyC +DoCjjvbdpstGrSLU +EPDKjvbdUtMtGLuj +EOcKjvbdjlbLzFGo +EObkKvbdkyTSTZGt +EOcLKvbdLYpjSzuG +EPDLKvbdyXhibQZk +DncKjvbdptUHSRkU +DnbjjvbdFfKRmhtR +DoCjjvbdtbcUwVoP +EPDKjvbdhyuFkpnG +EPDLKvbdFpASwHFy +EPCjjvbdRbDeLiYk +DncLKvbdXmqAYUut +EObjjvbdqlyjZLgi +DoCjjvbdssSTYydc +DnbkKvbdTIzJqABM +EPCkKvbdxsOJNRag +EPCjjvbdlhcspuSB +EObkKvbdqUTgSRjt +EOcKjvbdOEcshhkE +EObjjvbdzjUpPdTU +DnbkKvbdvwLaVaWV +EPCjjvbdmoyyVkYb +DoCkKvbdOFETiJKd +EPCjjvbdeEnqawCj +EObjjvbdmuUzKjRf +EPDLKvbdVvhxVdFH +EPCkKvbdaSGDHsek +EPCjjvbdkySrTZHU +EObjjvbdtAGqIABS +EObkKvbdZyEJmblS +DncKjvbdyTOJMrCH +DncLKvbdFWYoolie +DoDLKvbdTvMPjUAq +EObjjvbdZLqctOLm +DnbkKvbdmIctQuSB +DoCkKvbdZGvdAPTJ +DoCjjvbdkDMLRGuH +DoDLKvbdnVUykKSG +DoDKjvbdLGFhBaRV +DncLKvbdxwiKBozL +DncLKvbdWIYWXgYz +DncLKvbdFkFSbglu +DoDKjvbdIGgZxxXg +DnbjjvbdEztRFMDJ +DoDLKvbdZQldiNEq +EOcLKvbdwWkaWAvV +DoDKjvbdLBLHMawq +DoDLKvbdkMbLzFGo +EPDKjvbdREDAopcr +DoCkKvbdZoNiEdyj +EPDLKvbddneSkUUS +DnbkKvbdSQUHJecw +DoCjjvbdZshhxcrn +DnbjjvbdRkZFuHLT +EPDKjvbdwuNEqYkn +DoDLKvbdemGXGmJk +EOcLKvbdKWVGDeGi +DoCkKvbdWSOXadkc +EObjjvbdVTmTelWK +DncKjvbdhkeDmuDZ +EPCkKvbdRWnEDMID +DnbjjvbdNQYRVnGs +DnbkKvbdTfzmlWvF +DoCkKvbdFpASvgGZ +DoCjjvbdqTsfqqkU +EObkKvbdUVkpKUAq +DoDLKvbdrRtkNjaN +EPCkKvbdrJAKEmOe +DncKjvbdIGfyyYXg +DnbjjvbdZLrDtNkm +EObjjvbdiMEcmuCy +DncKjvbdkyTSTZHU +DncLKvbdBsAbtFvr +DnbkKvbdrpWPKDWG +DncKjvbdbBWFFoow +DoDLKvbdxmsIXsJD +DnbkKvbdehLWRnRH +EObkKvbdiVZeXRuC +DnbkKvbdOTUVfduQ +DncLKvbdZjTIQHCG +DoDLKvbdOSsugFVQ +DoCjjvbdrafNLgKy +EPDLKvbdNPxRVmgT +EPDKjvbdHlBznXQk +EPCkKvbdCEQBWKMf +EObjjvbdtcDUwWOo +DoCjjvbdZMSDtNlN +DoDLKvbdvAcxrneI +EObjjvbdIxUCILpp +EOcKjvbdfSBWzkbo +EObkKvbdShzKRAAl +DnbjjvbdGZUuBDxC +EObkKvbdqlzKYkhJ +EPDKjvbdZyEKNbkr +DoDLKvbdsrrTYzFD +DoCkKvbdfSAvzkcP +DnbjjvbdqlzKYlHi +EPDKjvbdYTLaNToY +EPCjjvbdjEjgUoAO +EOcKjvbdTJZjRABM +EObkKvbdYORAXtvU +DoDLKvbdGKdrcHmV +DoDLKvbdbrcLUEJa +DncLKvbdqvpLcJZR +DnbkKvbdFeiqnIsq +EPDKjvbdZnnIeEzK +EPCjjvbdnUtzLKRf +DoDLKvbdDxXlUUTl +DoDKjvbdiMEcnUby +EObkKvbdYzbeqjWZ +DncKjvbdTvLojUAq +EOcLKvbdjuvmdBxX +DnbjjvbdzoPpdcMY +DoDKjvbdrovOibuf +DoDKjvbdFWZPomJe +DoDKjvbdqGDeUWBI +DoCkKvbdWWiYVdEg +EObkKvbdtvOXiqTA +DnbjjvbdqZPIGpdY +EObkKvbdLBKgNCYR +DoCjjvbdLBKgNCYR +EObjjvbdZsiJZESn +DoCkKvbdTqROtuIN +EPCjjvbdyfyMAMdw +EOcLKvbdptTgSSLU +DncLKvbdPxmAHTSK +DnbjjvbdRkZFtfkT +EPDLKvbdtlXvaUAw +EPCkKvbdqBJFAWhE +EPCkKvbdIidAJogE +EPDLKvbdKQydoGOF +EObkKvbdauCGwkTh +EPCjjvbdNddUIiKd +DoDLKvbdFfKRmhsq +EPCkKvbdeEnqbXCj +EObkKvbdJvVGDdfi +DoDKjvbdWRmwaeLc +EObkKvbdSCDeLiZL +EPDKjvbdDoDLLWcE +EPDLKvbdiMEcnUby +DnbjjvbdLBLGmBxR +EPCjjvbdZnmiEdyj +EObjjvbdVhXuwgYz +DncLKvbdUtNTfMVj +EPDLKvbdKaKgMaxR +DncKjvbdJcJbpicY +DnbkKvbdSKyGVHLT +DoDKjvbdzROlhjXA +DnbkKvbdlrZUysEJ +DoCkKvbdnQZyWLYb +DoCjjvbdeFOqbWbj +EOcLKvbdjgfkfGOL +EObkKvbdiHJbyWKV +DnbkKvbdGdLVibJj +DoDKjvbdGLErcINV +EPCjjvbdNGcPlpUk +EOcKjvbdjFLGtoAO +EOcKjvbdsBfMlGkZ +EObjjvbdhtydvquC +DoCjjvbdznpRFCkx +DncLKvbdYSkaNUOx +DoCjjvbdVvhxVdFH +EPDLKvbdNeETiJLE +DoDKjvbdcScLTdJa +EOcLKvbdQwNdDLgc +DoDLKvbdUMWPBWPJ +DncKjvbdqFdEtVaI +EObjjvbdhbPCeXRR +DoCjjvbdKeehCApu +DncKjvbdYNqAXuVt +DoDLKvbdjmCLzFGo +DoCkKvbdtlXwBUAw +EObkKvbdwtmEqYlO +EObjjvbdrovOjCvG +EObkKvbdqrVLOLBN +DoCjjvbdSBcdkhxk +DncLKvbdrEEhomua +EObkKvbdtbbtvuno +EPDLKvbdZjShQGaf +EPCjjvbdTAFJHbPE +DnbjjvbdcScLTcia +EObkKvbdbsDLUDia +DnbkKvbdkyTSTYgU +DncKjvbdySmhmSCH +DoCjjvbdnBivxPNu +DncKjvbdEXxLtTtM +EObjjvbdZshhyESn +DoDKjvbdkMbLzEfo +EObjjvbdssRrxyeD +DoDKjvbdcSbkTdKB +EPDLKvbdHDjvJbKK +DncLKvbdsQVnjCvG +DnbjjvbdJSyBTMwl +EOcLKvbddZxpYYqC +EPCjjvbdrXQLcJZR +DoCkKvbdnHEwlmfy +EOcKjvbdGZUuBDwb +EObjjvbdvOszqKnt +EOcLKvbdRosgKFdX +EPCjjvbdMpXqWNfs +EPCkKvbdJbibqJcY +DncKjvbdJvVFdEgJ +EObkKvbdqwPkcIyR +DnbkKvbdDwxMUTtM +DncKjvbdtcDVXVno +EPDLKvbdlZSrSxft +DoCkKvbdKeehCApu +EPDLKvbdQlxCYmtz +EOcLKvbdYqNFJNFR +DoCkKvbdnCKWwoOV +EObjjvbdwzIFfYEr +EOcKjvbdkDMLQfuH +EPCjjvbdrSUjnLBN +EPCkKvbdTfznMXVe +EPCkKvbdZxdKNcMS +DoCjjvbdJXsaglRQ +DoCjjvbdNPwqWNgT +DoCjjvbdLqwMzUpz +EOcKjvbdCDoaWJlf +DnbjjvbdlYsRsZGt +DncKjvbdeOdsLUUS +EOcKjvbdEvZQPmJe +DoCkKvbdqBJFAXHd +DnbjjvbdtkwwBUBX +EObjjvbdLFfHaaQu +DoDLKvbdbLMFoNcA +EPDLKvbdiLdcnUby +DnbkKvbdUQqPVUgm +EOcLKvbdEOcLLXDE +DoDKjvbdrEEhpOWB +DncKjvbdkCkkQftg +DncLKvbdMfbpNQUk +DnbjjvbdTulQKUAq +DoDLKvbdUtNUFkvK +DncKjvbddndsKtTr +EPDKjvbdliDsqVSB +EPCkKvbdhbOcEvqR +DoCkKvbdqceJQNua +DoCkKvbdrWpLcIyR +DncKjvbdrSVLNkAm +DoDLKvbdyOShYTJD +DncKjvbdyYJKBoyk +DnbjjvbdZQldiNFR +EPDLKvbdePEsKstS +EPCjjvbdcScKtDia +DncLKvbdxsOJNRbH +EObjjvbdEYXlUUTl +DoCkKvbdxUldqZMO +EOcKjvbdRjxeuGkT +EOcLKvbdqrVLNjaN +DoCkKvbdDwwktUUM +EOcLKvbdZQmEiNFR +EPCkKvbdMSXMytpz +DnbkKvbdnUtzKiqf +DoCjjvbdREDAoqDr +EPCjjvbdZyDinDMS +EPCjjvbdiCPDEwRR +EPCkKvbdmSZUzSci +DoDKjvbdkWWmdCXw +DnbkKvbdmJDsqVRa +EPDKjvbdhzVGLpnG +DoCkKvbdsPuoKDWG +DoDLKvbdrylPsAgn +EPCjjvbdsPuoJbuf +EOcKjvbdrEFJQOVa +EPCjjvbdEPDLLXCd +DncKjvbdkVwOEBxX +EPCkKvbdqGEFUWAh +DncLKvbdtbcUvuno +EOcKjvbdWIYWYGxz +EPDLKvbdZLqcsmkm +DoDKjvbdmaivwnnV +DoCkKvbdOYPVzcmt +DoCjjvbdVwIwvDeH +DoCjjvbdYkrETmkm +DoDKjvbdLFfHbAqV +EObjjvbdkIHLefOL +EPDKjvbdZjShPfaf +DoCjjvbdehLWSORH +DncLKvbdKfFgbBQu +EObkKvbdsPunjDVf +DncKjvbdiMEdNuCy +DncKjvbdFfKSNhtR +EOcKjvbdFVxpQNKF +DncLKvbdfHkVrORH +EObjjvbdKefIBaQu +EPDKjvbduCbtvuoP +EPCkKvbdGdLWKCKK +DncLKvbdLAkGmBwq +DncLKvbdZshiZESn +DnbjjvbdySmhmSCH +DoDKjvbdACqxJyiQ +DncLKvbdmajXYOmu +DnbjjvbdxVNFRZMO +DnbjjvbdVqmxBdlD +DnbkKvbdIGgZyYXg +DncKjvbdddnrBvcK +EPCjjvbdUGzmkwVe +DncLKvbdaNLCTVNH +DoCkKvbdWWhwucdg +DncKjvbdkWWmcaxX +DoDKjvbdaRfChUGL +EPDLKvbdOEcsiJKd +DoDLKvbdGLFTChMu +EObjjvbdjmBkzFHP +DncLKvbdrWokcJYq +EObjjvbdDHMGHAzc +EObkKvbdRyjITCvA +DnbjjvbdWRnXbElD +DoCjjvbdEARiNZvw +DnbkKvbdRjyFtfjs +DoCkKvbdMgDQNQVL +DoDKjvbdCEPaWJmG +DoCkKvbdUtNTfLuj +DoDKjvbdNGcQMpVL +DoDKjvbdZQmFImEq +EObjjvbdyYIibPyk +DoDLKvbdcSbjtDjB +EPCjjvbdPxmAGsSK +EPCjjvbdnUuZjirG +EPCkKvbddijSVtzn +EOcKjvbdxUmEqYlO +EOcKjvbdxrmiNRag +EPCkKvbdjmBlZeHP +EOcKjvbdvBDySndh +EObjjvbdliDsqVSB +EOcKjvbdTvMQKUBR +DncLKvbdRNXbYnUz +DnbjjvbdyYIiaozL +DoCkKvbdhbPDEwRR +EPDKjvbdptUGrSLU +DoDKjvbdFjeTChMu +DnbkKvbdFVxoomJe +EObkKvbdlYrrSyGt +EPDLKvbdVZHszKnn +DncLKvbdDwwktUUM +DncLKvbdDnbkKvcE +EPCkKvbdjJfHjMwr +EPDKjvbdUtNTfMWK +EObjjvbdbhlikGWx +DncLKvbdKfFhCBQu +DoDKjvbdVgwvXgYz +EPDLKvbdiBoCdwRR +EPDLKvbdzdzOzeZp +EObkKvbdMoxRWNgT +EPDKjvbdjvXNdBww +EObkKvbdUtMsfLuj +EOcLKvbdnUuZjjRf +DnbkKvbduCbtwVoP +EPDLKvbdGGKRmhsq +EObkKvbdePEsLTtS +DoCjjvbdSKyGUgLT +EOcLKvbdRbDdlIyL +DoDLKvbdNxPVzcnU +EObjjvbdkCkkRGtg +DncKjvbdVTmUFkvK +DncKjvbdUsltFkuj +EPDKjvbdSCEElJZL +EOcKjvbdZxcjNcMS +DoCjjvbdEJgjWYKA +DncLKvbdREDBQRDr +DncKjvbddoErjtUS +EPDLKvbdADSYJyiQ +EPDKjvbdatafxKsh +EPDLKvbdkIGkeemk +DoDLKvbdmRxtzSci +DnbkKvbdTlWPAvPJ +DncKjvbdjJegjMwr +DoCkKvbdqTtHSSKt +EOcKjvbdkMakzFHP +DncLKvbddZyPwxpb +DnbkKvbdTppnuUgm +EObkKvbdnPyxukZC +DoDKjvbdbiNJjewY +EPDKjvbdJSyArlwl +EPDLKvbdvvlBVaVu +EOcLKvbdjJfIKMxS +EPDLKvbdliETqVRa +DoCkKvbdWXJXvEFH +DncLKvbdiHKDZWKV +EObkKvbdEXwktUUM +EOcKjvbdRWnDcMID +EPDLKvbdbhljKfWx +DnbkKvbdVTlsfMVj +DnbjjvbdZoOIdeZj +DoDKjvbdDxYLtUTl +EObjjvbdmIdTqUqa +EPCjjvbdiZtekqNf +DoDLKvbdMfcPmPtk +EPDLKvbdKxpirztf +DnbkKvbdEARhlzWw +EOcKjvbdqiAJeMne +DnbjjvbdUsltGMWK +DnbkKvbdMoxRWNfs +EPCjjvbdTqQntuIN +EPDKjvbdLFfHbApu +EOcLKvbdANIZSwZx +DoCjjvbdSLZGUfjs +DoDLKvbdJSyArlxM +EOcLKvbddZxoxZRC +DoDLKvbdRpTfjFcw +EObjjvbdKefHbBRV +EPCkKvbdjlakyeGo +DoDLKvbdiBncFXRR +EObkKvbdkHfkefOL +DnbjjvbdfILVrORH +DnbjjvbdbsDKtDia +DoCjjvbdqiAKElne +EObkKvbdEXxMTtUM +DncKjvbdHfgZxxXg +EPDKjvbdQvnDcMID +DoDKjvbdCSaCsewS +DncLKvbdSZigsDWA +DnbkKvbdiUyeXSUb +DnbkKvbdZRNFJMeR +EPDKjvbdDxXlTstM +EPCjjvbdkNBlZdfo +DnbkKvbdhuZdvqtb +DncLKvbdHDkWJajK +EOcKjvbdhficZWKV +DoDLKvbdxwiKCPyk +EPDLKvbdZQleJMeR +DoDLKvbdLrXMytpz +DncKjvbdcTCjtEJa +DnbkKvbdUMVnaWPJ +DoCjjvbdnBjXYPOV +EObjjvbduWNwjQsA +DoCjjvbdRpUHJecw +DnbkKvbdJYUBglQp +EOcLKvbduoTzqKoU +EObjjvbdZMRctNlN +EObkKvbdziuPpESt +DoDLKvbduLxWaTaX +EOcLKvbdhgKDZWKV +DnbkKvbdZQldhmFR +EOcLKvbdcyyPxZQb +EOcKjvbdRWnDcLgc +DncLKvbdxZgfFweS +EPCkKvbdyqOliJwA +DnbjjvbdsPvPKCuf +DoCjjvbdMgCpNQVL +DncLKvbdOEdTiJKd +EPDKjvbdEARiMyvw +EOcLKvbdJbibqKDY +DoCkKvbdeEnrCWbj +DoCkKvbdGKdrcIMu +DnbkKvbdUMWOaVoJ +DoCkKvbdKaKgNCXq +DnbkKvbdoAKztHdO +EPDKjvbdDxXlUUTl +EOcLKvbdFVxoomJe +EOcKjvbdpyPHfpdY +EPCjjvbdxwiJaoyk +DoCkKvbdlqxtyrci +EOcKjvbdfHkWRmpg +DoCjjvbdkMalZdfo +EPCjjvbdJpyePGOF +DncLKvbdqUUHRqjt +DoDLKvbdziuQPdSt +DoDKjvbdBhjajiGK +EPDKjvbdjcLjpftg +EPDKjvbdVwJYWEFH +DnbjjvbdNdcsiJLE +DoCjjvbdQwODcLgc +EOcLKvbdtkxXAtAw +EPDKjvbdwMvANEEm +DoCjjvbdqFdEsuaI +EObjjvbdrSUjmjaN +DoDLKvbdnGeYMnGy +EOcLKvbdPyNAHTSK +DnbkKvbdMowpvNgT +DoCjjvbdGdLVibKK +DoDLKvbdtcDVXVno +EObkKvbdtlXwBUAw +DoCjjvbdSPsgKGEX +EPCjjvbdURQntuHm +DncLKvbdrMyjZLgi +EPDKjvbdwXMAvBVu +EOcLKvbdRjxfUfkT +DnbkKvbdGFjRnJTq +DoCkKvbdbUbHYLTh +EPDKjvbdoznEKxPA +EPCjjvbdLiBlQxAS +DncKjvbdfVzxPizs +DnbjjvbdSKyFtgLT +EPDKjvbdrXPlCiZR +DncLKvbdhzVGLpnG +EObjjvbdVwJYVdFH +EPDKjvbdwXLaWBVu +EPCjjvbdjhHMGFmk +EObkKvbdKyQjSzuG +DoCjjvbdmfeYNOHZ +DoDLKvbdZirgofaf +EOcLKvbdZoOIdeZj +EPCkKvbdLFfHbApu +EPCkKvbdjvWnEBww +DoDKjvbdcScLUEKB +DoCkKvbdkCkjqHUg +DoDKjvbdyTNhmSBg +DoCkKvbdkHgLfFnL +EPCjjvbdzoQQdcLx +DoCjjvbdOTTvHEtp +EPCkKvbdznopeDLx +EPCkKvbdGFjRmhtR +EPCkKvbdUaCQrpqy +EOcKjvbdnGeXmOHZ +DoDKjvbdiCPDEwRR +DoCjjvbdRbEFLiYk +DncKjvbdRXOECkgc +EPCjjvbdKWUedEgJ +DncKjvbdDjIJvYKA +DoDKjvbdyTOJNRbH +DoCjjvbdePFTKtTr +DoDKjvbdhtyeWrVC +EPCkKvbdqvolCiZR +DoDLKvbdapHHELzd +EObjjvbdlhdUQtrB +EOcKjvbdptUGrRkU +EPCjjvbdqUTfqrLU +EPCkKvbdcJMikGWx +DoDKjvbdlhctRVRa +EOcLKvbdANHyTXZx +EPDKjvbdpssfqrKt +EPCkKvbdFeiqnJTq +DoCkKvbdxZgfGXdr +EOcLKvbdRWmcblHc +DncLKvbdjggMFemk +DoDKjvbdKeegbBQu diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/runtime/7158988/TestFieldMonitor.sh --- a/test/runtime/7158988/TestFieldMonitor.sh Fri Jun 08 12:49:12 2012 -0400 +++ b/test/runtime/7158988/TestFieldMonitor.sh Thu Aug 02 14:29:12 2012 -0700 @@ -18,8 +18,6 @@ exit 1 fi -BIT_FLAG="" - # set platform-dependent variables OS=`uname -s` case "$OS" in @@ -27,12 +25,6 @@ NULL=/dev/null PS=":" FS="/" - ## for solaris, linux it's HOME - FILE_LOCATION=$HOME - if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" -a `uname -p`='sparc' ] - then - BIT_FLAG="-d64" - fi ;; Windows_95 | Windows_98 | Windows_ME ) NULL=NUL @@ -56,11 +48,11 @@ cp ${TESTSRC}${FS}*.java . -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -fullversion +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -fullversion ${TESTJAVA}${FS}bin${FS}javac -classpath .${PS}$TESTJAVA${FS}lib${FS}tools.jar *.java -${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -classpath .${PS}$TESTJAVA${FS}lib${FS}tools.jar FieldMonitor > test.out 2>&1 & +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath .${PS}$TESTJAVA${FS}lib${FS}tools.jar FieldMonitor > test.out 2>&1 & P_PID=$! diff -r fe4a4ea5bed9 -r 6b5a3d18fe0e test/serviceability/ParserTest.java --- a/test/serviceability/ParserTest.java Fri Jun 08 12:49:12 2012 -0400 +++ b/test/serviceability/ParserTest.java Thu Aug 02 14:29:12 2012 -0700 @@ -20,6 +20,7 @@ testNanoTime(); testJLong(); testBool(); + testQuotes(); testMemorySize(); } @@ -95,6 +96,33 @@ parse(name, "false", "", args); } + public void testQuotes() throws Exception { + String name = "name"; + DiagnosticCommand arg1 = new DiagnosticCommand(name, + "desc", DiagnosticArgumentType.STRING, + false, null); + DiagnosticCommand arg2 = new DiagnosticCommand("arg", + "desc", DiagnosticArgumentType.STRING, + false, null); + DiagnosticCommand[] args = {arg1, arg2}; + + // try with a quoted value + parse(name, "Recording 1", name + "=\"Recording 1\"", args); + // try with a quoted argument + parse(name, "myrec", "\"" + name + "\"" + "=myrec", args); + // try with both a quoted value and a quoted argument + parse(name, "Recording 1", "\"" + name + "\"" + "=\"Recording 1\"", args); + + // now the same thing but with other arguments after + + // try with a quoted value + parse(name, "Recording 1", name + "=\"Recording 1\",arg=value", args); + // try with a quoted argument + parse(name, "myrec", "\"" + name + "\"" + "=myrec,arg=value", args); + // try with both a quoted value and a quoted argument + parse(name, "Recording 1", "\"" + name + "\"" + "=\"Recording 1\",arg=value", args); + } + public void testMemorySize() throws Exception { String name = "name"; String defaultValue = "1024";