![Page 1: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/1.jpg)
1
Doug Simon, Ben L. TitzerMaxine Project, Sun Microsystems Laboratories
Virtual Machines and Intermediate Languages WorkshopOrlando, Florida, USA October 25, 2009
Splicing Moduleswith a
Metacircular Saw:“Snippets” in the Maxine VM
1
![Page 2: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/2.jpg)
2
JVM Modules• Modern, high performance JVMs are composed of
complex modules• Read/write barriers, profile-driven optimizing compilers,
fast synchronization, compressed oops, etc.
• Object based bytecode instruction• Abstract semantics in JVM Specification• Concrete implementation in terms of modules
• Binding to modules made by compiler• “Lowering phase”
![Page 3: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/3.jpg)
3
bytecode HIR HIR’ LIR LIR’ machine code
parser
moduleaware
lowering
optimizer �registerallocator
code gen
Standard Compiler Anatomy
![Page 4: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/4.jpg)
4
void LIRGenerator::do_StoreField(StoreField* x) {
LIRItem object(x->obj(), this);
LIRItem value(x->value(), this);
object.load_item();
value.load_for_store(field_type);
set_no_result(x);
LIR_Address* address = generate_address(object.result(),
x->offset(),
field_type);
pre_barrier(LIR_OprFact::address(address));
__ store(value.result(), address, info, patch_code);
post_barrier(object.result(), value.result());
}
direct pointer/handle/compressed oop?
displacement over header?
GC uses write barrier?
putfield in C1 (1 of 2)
![Page 5: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/5.jpg)
5
void LIRGenerator::post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val){ __ move(addr, xor_res); __ logical_xor(xor_res, new_val, xor_res); __ move(xor_res, xor_shift_res); __ unsigned_shift_right(xor_shift_res, ...); __ cmp(lir_cond_notEqual, xor_shift_res, ...); CodeStub* slow = new G1PostBarrierStub(addr, new_val); __ branch(lir_cond_notEqual, T_INT, slow); __ branch_destination(slow->continuation());
}
fine grain control over code placement
putfield in C1 (1 of 2)
![Page 6: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/6.jpg)
6
Isn’t there a better way?• Assume intrinsic compiler support for:
• Integer, float, long, double arithmetic• Control flow• Calls to machine addresses with signature• Pointer operations
• Exposed via Java API (e.g. org.vmmagic.*)
• Express object bytecode lowering in domain specificlanguage (DSL)• Can access and manipulate VM data types and values• Reduced to compiler’s LIR
• Used to lower object bytecode HIR (for which no intrinsic LIR exists)
• VM written in Java ⇒ DSL is Java!
![Page 7: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/7.jpg)
7
bytecode HIR HIR’ LIR LIR’ machine code
parser lowering
optimizer �registerallocation
code gen
snippetLIR
Snippet-based Compiler Anatomy(normal)
![Page 8: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/8.jpg)
8
snippetbytecode HIR HIR’ snippet
LIR
parser lowering
optimizer
Snippet-based Compiler Anatomy(snippet bootstrapping)
![Page 9: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/9.jpg)
9
@INLINEstatic void writeReference(Object tuple, int fieldOffset, // resolved Object value){ TupleAccess.writeObject(tuple, fieldOffset, value);}
… into LIR?
How do we turn this…
putfield with Snippets
![Page 10: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/10.jpg)
10
Bootstrapping a Snippet (1 of 5)
TupleAccess.writeObject(tuple, fieldOffset, value);
Reference tupleRef = Reference.fromJava(tuple);Reference valueRef = Reference.fromJava(value)tupleRef.writeReference(fieldOffset, valueRef);
@INLINEstatic void writeObject(Object tuple, int offset, Object value) { Reference tupleRef = Reference.fromJava(tuple); Reference valueRef = Reference.fromJava(value) tupleRef.writeReference(offset, valueRef);}
TupleAccess.java
![Page 11: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/11.jpg)
11
Bootstrapping a Snippet (2 of 5)Reference tupleRef = Reference.fromJava(tuple);Reference valueRef = Reference.fromJava(value)tupleRef.writeReference(fieldOffset, valueRef);
@INLINEstatic Reference fromJava(Object object) { return referenceScheme().fromJava(object);}
@FOLDstatic ReferenceScheme referenceScheme() { return VMConfiguration.referenceScheme();}
Reference.java
HeapReferenceScheme(reference module)
Reference tupleRef = heapReferenceScheme.fromJava(tuple);Reference valueRef = heapReferenceScheme.fromJava(value)tupleRef.writeReference(fieldOffset, valueRef);
![Page 12: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/12.jpg)
12
Bootstrapping a Snippet (3 of 5)
@INLINEstatic Reference fromJava(Object object) { return toReference(object);}
@UNSAFE_CASTstatic native Reference toReference(Object object);
HeapReferenceScheme.java
Reference tupleRef = heapReferenceScheme.fromJava(tuple);Reference valueRef = heapReferenceScheme.fromJava(value)tupleRef.writeReference(fieldOffset, valueRef);
Reference tupleRef = tuple;Reference valueRef = value;tupleRef.writeReference(fieldOffset, valueRef);
![Page 13: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/13.jpg)
13
Bootstrapping a Snippet (4 of 5)Reference tupleRef = tuple;Reference valueRef = value;tupleRef.writeReference(fieldOffset, valueRef);
@INLINEvoid writeReference(Reference reference, int offset, Reference value) { heapScheme().writeBarrier(reference, value); gripScheme().fromReference(reference).writeGrip(offset, value.toGrip());}
HeapReferenceScheme.java
@INLINEvoid writeReference(int offset, Reference value) { referenceScheme().writeReference(offset, value);}
Reference.java
HeapScheme(GC module)
GripScheme(object pointer module)
![Page 14: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/14.jpg)
14
Bootstrapping a Snippet (5 of 5)
Pointer tuplePtr = tuple;Reference valueRef = value;tuplePtr.writeReferenceAtIntOffset(fieldOffset, valueRef);
@BUILTINnative void writeReferenceAtIntOffset(int offset, Reference value);
Pointer.java
LIR operation
moremore inlining, folding steps…
![Page 15: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/15.jpg)
15
What did we just see?• Not one line of compiler code• Compilation pragmas (annotations)
– @FOLD, @INLINE, @UNSAFE_CAST,@CONSTANT, @BUILTIN ,
• Missing/undecided:– Fine grained code layout control
• Refine @INLINE with a parameter?
enum {FAST_PATH, SLOW_PATH, STUB}
– Performance, performance, performance!• Solution: C1X…
![Page 16: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/16.jpg)
16
C1X Motivation
• Need better compiler– Design from scratch?– Adapt existing compiler?
• Preserve Maxine Design Focus– Compiler / runtime separation– Flexibility– Reduce runtime implementer burden
![Page 17: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/17.jpg)
17
C1: HotSpotTM Client Compiler• As opposed to “-server”
– Faster compilation times, better startup– Default on smaller machines, Java 5– Simpler IR, architecture
• Supports– Inlining, speculative optimization, deoptimization– Precise GC, including all HotSpot collectors– Compressed Oops
• Proven research vehicle– Object co-location and inlining, bounds check
elimination, hot swapping, multi-tasking
![Page 18: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/18.jpg)
18
C1X
• Rewrote C1 in Java (for Maxine)– Improved compiler / runtime separation
• “Less wrinkly” front end– Major benefits from Java language– Better documentation
• Redesigned backend around XIR– Reduced backend complexity– VM-independent, programmable lowering
![Page 19: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/19.jpg)
19
parser HIR LIR LIR’HIR’
optimizationsettings
allocatableregisters
Method
Machine code
parsing
optimization
lowering
registerallocation emission
targetarchitecture
Internal data structures
Standard Compiler Anatomy
![Page 20: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/20.jpg)
20
parser HIR LIR LIR’HIR’
Compiler interface
VM intrinsics optimizationsettings
allocatableregisters
CiKlassCiMethodCiField
offsetsentrypointssettings
CiMethod
Nmethod
HotSpot
parsing
optimization
lowering
registerallocation emission
C1 Anatomy
![Page 21: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/21.jpg)
21
parser HIR LIR LIR’HIR’
Runtime interface
XIR generator
VM intrinsics optimizationsettings
targetarchitecture
allocatableregisters
RiTypeRiMethodRiFieldRiConstantPool
XirSnippetRiMethod
CiTargetMethod
Runtime
parsing
optimization
lowering
registerallocation emission
C1X Anatomy
![Page 22: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/22.jpg)
22
parser HIR LIR LIR’HIR’
Runtime interface
XIR generator
VM intrinsics optimizationsettings
targetarchitecture
allocatableregisters
RiMethod
CiTargetMethod
Runtime
parsing
optimization
lowering
registerallocation emission
XirSnippetRiTypeRiMethodRiFieldRiConstantPool
Compiler Runtime Interaction
![Page 23: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/23.jpg)
23
Front end• Parses bytecodes to create SSA-form HIR
– Abstract interpreter models Java frame state• Produces embedded value dependence graph
– Eager local optimizations• Devirtualization, inlining, constant folding, strength reduction, local value
numbering, load elimination
• HIR operations are close to Java– Invokevirtual, getfield, monitorenter– Java type information preserved
• RiField, RiMethod, RiType
![Page 24: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/24.jpg)
24
Global Optimization
• Null check elimination– Iterative, flow-sensitive
• Block merging– Straighten control flow
• Global value numbering– Lift common subexpressions
• Dead code elimination
![Page 25: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/25.jpg)
25
Backend
• Compute good block order• Convert out of SSA form• Lower object operations
– VM-configurable with XIR
• Linear Scan Register Allocation– Architectural constraints (e.g. x86)– Calling convention
![Page 26: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/26.jpg)
26
Code Generation
• Additional optimizations, then emit code• Ultimate result: CiTargetMethod
– machine code as byte array– Locations of:
• calls, safepoints, implicit exception points, scalar and referenceconstants
– Debug (deoptimization) information– Reference maps– Compilation statistics
![Page 27: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/27.jpg)
27
Feature Dependencys i
g
g
c
c o g
o
o g
c o
o
c o g s
c o
o x
s
s
s
i
i
i
i
i
i
i
i
i
i
i
EntrypointSafepointReturnResolveClassGetField, PutFieldArrayLengthArrayLoad, ArrayStoreInvokeIntrinsicNewInstance, NewArrayCheckCast, InstanceOfMonitorEnter / ExitExceptionObject
i
s
Stack Model
Class Layout
Object Layout
Garbage Collection
VM / Compilerinteractions aren’t easyto factor into interfaces
due to featureinterdependence
Synchronization
Instrumentation
c
o
g
s
i
x
![Page 28: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/28.jpg)
28
C1X Solution - XIR• During lowering, C1X requests code from VM
– VM returns XIR code “snippet”– Primitive operations left to compiler
• Two-step process– Before compilation: VM creates XIR template– During compilation: VM instantiates XIR template as XIR snippet
![Page 29: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/29.jpg)
29
XIR Language
• Low-level, machine-independent• RISC-like operations
– Three-address add, sub, mul, div, shift, etc– Pointer load, store, compare-and-swap
– CallJava, CallStub, CallRuntime
• Virtual and physical registers– Allows access to VM-specific thread locals
• Distinguishes primitives from objects– Allows for precise GC maps– Unsafe values cannot be live across safepoints
![Page 30: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/30.jpg)
30
XIR Assembler Interfacepublic interface CiXirAssembler {
XirVariable createInputParameter(CiKind kind);XirVariable createConstantInputParameter(CiKind kind);XirVariable createTemporary(CiKind kind);XirVariable createConstant(CiConstant constant);XirLabel createInlineLabel();XirLabel createOutOfLineLabel();void add(XirVariable result, XirVariable a, XirVariable b);void sub(XirVariable result, XirVariable a, XirVariable b);void mul(XirVariable result, XirVariable a, XirVariable b);. . .void move(XirVariable dest, XirVariable a);void pload(CiKind kind, XirVariable dest, XirVariable ptr);void pstore(CiKind kind, XirVariable ptr, XirVariable a);void bind(XirLabel label);void jump(XirLabel label);void jeq(XirLabel label);. . .void callJava(XirVariable addr);void callStub(XirTemplate template, XirVariable result, . . .);void callRuntime(XirTemplate template, XirVariable result, . . .);XirTemplate finishStub(String name);XirTemplate finishTemplate(String name);
}
![Page 31: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/31.jpg)
31
XIR Template Examplepublic XirTemplate buildResolvedGetField(XirAssembler asm, CiKind kind) { // resolved case asm.start(kind); XirParameter object = asm.createInputParameter("object", CiKind.Object); XirParameter fieldOffset = asm.createConstantInputParameter("fieldOffset", CiKind.Int); XirVariable resultOperand = asm.getResultOperand(); asm.pload(kind, resultOperand, object, fieldOffset, true); return asm.finishTemplate("getfield<" + kind + ">");}
![Page 32: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/32.jpg)
32
XIR Generator Interface (1 of 2)public interface RiXirGenerator {
XirSnippet genEntrypoint(. . .);XirSnippet genSafepoint(. . .);XirSnippet genReturn(. . .);XirSnippet genResolveClassObject(. . .);XirSnippet genIntrinsic(. . .);XirSnippet genGetField(. . .);XirSnippet genPutField(. . .);XirSnippet genGetStatic(. . .);XirSnippet genPutStatic(. . .);XirSnippet genMonitorEnter(. . .);XirSnippet genMonitorExit(. . .);XirSnippet genNewInstance(. . .);XirSnippet genNewArray(. . .);XirSnippet genNewMultiArray(. . .);XirSnippet genCheckCast(. . .);XirSnippet genInstanceOf(. . .);XirSnippet genInvokeInterface(. . .);XirSnippet genInvokeVirtual(. . .);XirSnippet genInvokeSpecial(. . .);XirSnippet genInvokeStatic(. . .);XirSnippet genArrayLoad(. . .);XirSnippet genArrayStore(. . .);XirSnippet genArrayLength(. . .);
}
![Page 33: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/33.jpg)
33
XIR Generator Interface (1 of 2)
public interface RiXirGenerator {. . .XirSnippet genGetField(XirArgument object,
RiField field);XirSnippet genPutField(XirArgument object,
XirArgument value, RiField value);
XirSnippet genNewInstance(RiType type);XirSnippet genNewArray(XirArgument length,
RiType arrayType);XirSnippet genInvokeVirtual(XirArgument receiver,
RiMethod method);XirSnippet genInvokeSpecial(XirArgument receiver,
RiMethod method);. . .
}
![Page 34: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/34.jpg)
34
XIR Snippet Example
public MaxXirGenerator implements RiXirGenerator {
@Overridepublic XirSnippet genGetField(XirArgument object, RiField field) { XirPair pair = getFieldTemplates[field.kind().ordinal()]; if (field.isLoaded()) { XirArgument offset = XirArgument.forInt(field.offset()); return new XirSnippet(pair.resolved, receiver, offset); } XirArgument guard = XirArgument.forObject(guardFor(field)); return new XirSnippet(pair.unresolved, receiver, guard);}
}
![Page 35: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/35.jpg)
35
Complications
• Fast / slow paths– Inline, out-of-line, fast-path global stub, slow-path global
stub, runtime call
• XIR preprocessing– Gather architectural register constraints– Recognize addressing modes
• Attaching debug information
• Code patching, guards
![Page 36: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/36.jpg)
36
C1X Status
• Runtime interface for Maxine– 13 classes, 5300 lines of Java code
• 1400 lines in MaxXirGenerator
• C1X passes all our regression suite– Some debugging needed with inlining
• XIR fully implemented– More tuning needed– Measuring compile time / quality now
• More in VEE 2010 submission
![Page 37: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/37.jpg)
37
C1X Story Continues…
• Separated C1X from VM details– More firm runtime interface– XIR achieves VM-configurable lowering– Still heavily tied to Java language
• Planning back-port to HotSpot– Runtime interface + XIR
• Snippets!
![Page 38: Splicing Modules with a Metacircular Sawdesign/vmil/2009/slides/Simon-Titzer.pdf•Exposed via Java API (e.g. org.vmmagic.*) •Express object bytecode lowering in domain specific](https://reader034.vdocuments.us/reader034/viewer/2022050522/5fa60d64b31e482fe635f901/html5/thumbnails/38.jpg)
38
AcknowledgementsMario Wolczko – managerTeam:
Paul CaprioliLaurent DaynèsMichael Van De Vanter
Former:Bernd MathiskeGreg Wright
Others:
Interns:Athul AcharyaAritraBandyopadhyayMichael BebenitaMarcelo CintraAbdulaziz GhuloumYi GuoChristos Kotselidis
David LiuKarhik ManivannanSumeet PanchalHannes PayerSunil SomanSimon WilkinsonThomas WürthingerHiroshi Yamauchi
David UngarTom RodriguezChristian Wimmer
Robert GriesemerSrdjan MitrovicKen Russell