<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>Hi Nicolas,</div><div><br>On Mar 20, 2015, at 1:32 PM, Nicolas Cellier &lt;<a href="mailto:nicolas.cellier.aka.nice@gmail.com">nicolas.cellier.aka.nice@gmail.com</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><span></span></div></blockquote><blockquote type="cite"><div><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2015-03-20 0:21 GMT+01:00  <span dir="ltr">&lt;<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1103.mcz" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1103.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: VMMaker.oscog-eem.1103<br>
Author: eem<br>
Time: 19 March 2015, 4:20:02.926 pm<br>
UUID: 64ddd2e1-e5f5-4ad0-b512-b1d0e32e99f7<br>
Ancestors: VMMaker.oscog-eem.1102<br>
<br>
Fix some Slang issues with ARM methods (clashing<br>
arg names).<br>
<br>
Provide an abstraction for saving &amp; restoring link reg<br>
around calls.<br>
<br>
=============== Diff against VMMaker.oscog-eem.1102 ===============<br>
<br>
Item was changed:<br>
&nbsp; ----- Method: CoInterpreter&gt;&gt;ceTraceLinkedSend: (in category 'debug support') -----<br>
&nbsp; ceTraceLinkedSend: theReceiver<br>
&nbsp; &nbsp; &nbsp; &nbsp; | cogMethod |<br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;api&gt;<br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;var: #cogMethod type: #'CogMethod *'&gt;<br>
&nbsp; &nbsp; &nbsp; &nbsp; cogMethod := self cCoerceSimple: (self stackTop - cogit traceLinkedSendOffset)<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; to: #'CogMethod *'.<br>
&nbsp; &nbsp; &nbsp; &nbsp; self cCode: [] inSmalltalk:<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [cogit checkStackDepthOnSend ifTrue:<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self maybeCheckStackDepth: (cogMethod cmNumArgs &gt; cogit numRegArgs<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifTrue: [cogMethod cmNumArgs + 1]<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifFalse: [0])<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sp: stackPointer + objectMemory wordSize<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pc: (self stackValue: 1)]].<br>
&nbsp; &nbsp; &nbsp; &nbsp; "cogit recordSendTrace ifTrue: is implicit; wouldn't compile the call otherwise."<br>
&nbsp; &nbsp; &nbsp; &nbsp; self recordTrace: (objectMemory fetchClassOf: theReceiver)<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thing: cogMethod selector<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; source: TraceIsFromMachineCode.<br>
&nbsp; &nbsp; &nbsp; &nbsp; cogit printOnTrace ifTrue:<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self printActivationNameFor: cogMethod methodObject<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; receiver: theReceiver<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isBlock: false<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;firstTemporary: (self cCode: [nil] inSmalltalk: [0]);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;firstTemporary: nil;<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cr].<br>
&nbsp; &nbsp; &nbsp; &nbsp; self sendBreakpoint: cogMethod selector receiver: theReceiver!<br>
<br>
Item was changed:<br>
&nbsp; ----- Method: CogARMCompiler&gt;&gt;concretizeDataOperationCqR: (in category 'generate machine code - concretize') -----<br>
+ concretizeDataOperationCqR: armOpcode<br>
- concretizeDataOperationCqR: opcode<br>
&nbsp; &nbsp; &nbsp; &nbsp; "Will get inlined into concretizeAt: switch."<br>
&nbsp; &nbsp; &nbsp; &nbsp; "4 == Add, 2 == Sub, Xor == 1, And == 0, Or == 12, Bic == 14"<br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;inline: true&gt;<br>
&nbsp; &nbsp; &nbsp; &nbsp; self<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rotateable8bitImmediate: (operands at: 0)<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifTrue: [:rot :immediate | | rd rn |<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rn := self concreteRegister: (operands at: 1).<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rd := opcode = CmpOpcode ifTrue: [0] ifFalse:[rn].<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self machineCodeAt: 0 put: (self type: 1 op: armOpcode set: 1 rn: rn rd: rd shifterOperand: ((rot&gt;&gt;1)"in this usage we have to halve the rot value" &lt;&lt; 8 bitOr: immediate)).<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self machineCodeAt: 0 put: (self type: 1 op: opcode set: 1 rn: rn rd: rd shifterOperand: ((rot&gt;&gt;1)"in this usage we have to halve the rot value" &lt;&lt; 8 bitOr: immediate)).<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^machineCodeSize := 4]<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ifFalse: [^self concretizeDataOperationCwR: armOpcode].<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ifFalse: [^self concretizeDataOperationCwR: opcode].<br>
&nbsp; &nbsp; &nbsp; &nbsp; !<br>
<br>
Item was changed:<br>
&nbsp; ----- Method: CogARMCompiler&gt;&gt;concretizeDataOperationCwR: (in category 'generate machine code - concretize') -----<br>
+ concretizeDataOperationCwR: armOpcode<br>
- concretizeDataOperationCwR: opcode<br>
&nbsp; &nbsp; &nbsp; &nbsp; "Will get inlined into concretizeAt: switch."<br>
&nbsp; &nbsp; &nbsp; &nbsp; "Load the word into the RISCTempReg, then cmp R, RISCTempReg"<br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;inline: true&gt;<br>
&nbsp; &nbsp; &nbsp; &nbsp; | constant rn rd instrOffset|<br>
&nbsp; &nbsp; &nbsp; &nbsp; constant := operands at: 0.<br>
&nbsp; &nbsp; &nbsp; &nbsp; rn := (self concreteRegister: (operands at: 1)).<br>
+&nbsp; &nbsp; &nbsp; &nbsp;rd := armOpcode = CmpOpcode ifTrue: [0] ifFalse:[rn].<br>
-&nbsp; &nbsp; &nbsp; &nbsp;rd := opcode = CmpOpcode ifTrue: [0] ifFalse:[rn].<br>
&nbsp; &nbsp; &nbsp; &nbsp; instrOffset := self at: 0 moveCw: constant intoR: RISCTempReg.<br>
&nbsp; &nbsp; &nbsp; &nbsp; self machineCodeAt: instrOffset<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;put: (self type: 0 op: armOpcode set: 1 rn: rn rd: rd shifterOperand: RISCTempReg).<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;put: (self type: 0 op: opcode set: 1 rn: rn rd: rd shifterOperand: RISCTempReg).<br>
&nbsp; &nbsp; &nbsp; &nbsp; ^machineCodeSize := instrOffset + 4!<br>
<br>
Item was changed:<br>
&nbsp; ----- Method: CogARMCompiler&gt;&gt;concretizeDataOperationRR: (in category 'generate machine code - concretize') -----<br>
+ concretizeDataOperationRR: armOpcode<br>
- concretizeDataOperationRR: opcode<br>
&nbsp; &nbsp; &nbsp; &nbsp; "Will get inlined into concretizeAt: switch."<br>
&nbsp; &nbsp; &nbsp; &nbsp; "Load the word into the RISCTempReg, then op R, RISCTempReg"<br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;inline: true&gt;<br>
&nbsp; &nbsp; &nbsp; &nbsp; | rn rd srcReg |<br>
&nbsp; &nbsp; &nbsp; &nbsp; srcReg := self concreteRegister: (operands at: 0).<br>
&nbsp; &nbsp; &nbsp; &nbsp; rn := (self concreteRegister: (operands at: 1)).<br>
+&nbsp; &nbsp; &nbsp; &nbsp;rd := armOpcode = CmpOpcode ifTrue: [0] ifFalse: [rn].<br>
-&nbsp; &nbsp; &nbsp; &nbsp;rd := opcode = CmpOpcode ifTrue: [0] ifFalse: [rn].<br>
&nbsp; &nbsp; &nbsp; &nbsp; self machineCodeAt: 0<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;put: (self type: 0 op: armOpcode set: 1 rn: rn rd: rd shifterOperand: srcReg).<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;put: (self type: 0 op: opcode set: 1 rn: rn rd: rd shifterOperand: srcReg).<br>
&nbsp; &nbsp; &nbsp; &nbsp; ^machineCodeSize := 4.!<br>
<br>
Item was changed:<br>
&nbsp; ----- Method: CogARMCompiler&gt;&gt;extractOffsetFromBXAt: (in category 'testing') -----<br>
+ extractOffsetFromBXAt: addr<br>
- extractOffsetFromBXAt: address<br>
&nbsp; "this should return the long call/jump target"<br>
+&nbsp; &nbsp; &nbsp; &nbsp;^(objectMemory byteAt: addr -4)<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ ((objectMemory byteAt: addr - 8) &lt;&lt; 8)<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ ((objectMemory byteAt: addr - 12) &lt;&lt; 16)<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ ((objectMemory byteAt: addr - 16) &lt;&lt; 24)!<br>
-&nbsp; &nbsp; &nbsp; &nbsp;^(objectMemory byteAt: address -4)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ ((objectMemory byteAt: address - 8) &lt;&lt; 8)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ ((objectMemory byteAt: address - 12) &lt;&lt; 16)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ ((objectMemory byteAt: address - 16) &lt;&lt; 24)!<br>
<br>
Item was added:<br>
+ ----- Method: CogARMCompiler&gt;&gt;saveAndRestoreLinkRegAround: (in category 'abi') -----<br>
+ saveAndRestoreLinkRegAround: aBlock<br>
+&nbsp; &nbsp; &nbsp; &nbsp;"If the processor's ABI includes a link register, generate instructions<br>
+&nbsp; &nbsp; &nbsp; &nbsp; to save and restore it around aBlock, which is assumed to generate code."<br>
+&nbsp; &nbsp; &nbsp; &nbsp;&lt;inline: true&gt;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;| inst |<br>
+&nbsp; &nbsp; &nbsp; &nbsp;inst := cogit PushR: LinkReg.<br>
+&nbsp; &nbsp; &nbsp; &nbsp;aBlock value.<br>
+&nbsp; &nbsp; &nbsp; &nbsp;cogit PopR: LinkReg.<br>
+&nbsp; &nbsp; &nbsp; &nbsp;^inst!<br>
<br>
Item was added:<br>
+ ----- Method: CogAbstractInstruction&gt;&gt;saveAndRestoreLinkRegAround: (in category 'abi') -----<br>
+ saveAndRestoreLinkRegAround: aBlock<br>
+&nbsp; &nbsp; &nbsp; &nbsp;"If the processor's ABI includes a link register, generate instructions<br>
+&nbsp; &nbsp; &nbsp; &nbsp; to save and restore it around aBlock, which is assumed to generate code."<br>
+&nbsp; &nbsp; &nbsp; &nbsp;&lt;inline: true&gt;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;self subclassResponsibility!<br>
<br>
Item was added:<br>
+ ----- Method: CogIA32Compiler&gt;&gt;saveAndRestoreLinkRegAround: (in category 'abi') -----<br>
+ saveAndRestoreLinkRegAround: aBlock<br>
+&nbsp; &nbsp; &nbsp; &nbsp;"If the processor's ABI includes a link register, generate instructions<br>
+&nbsp; &nbsp; &nbsp; &nbsp; to save and restore it around aBlock, which is assumed to generate code."<br>
+&nbsp; &nbsp; &nbsp; &nbsp;&lt;inline: true&gt;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;^aBlock value!<br>
<br></blockquote><div><br></div><div>Hmm, the generater doesn't know how to deal with this one...<br></div><div>It tries to inline the formal parameter (block) rather than the actual block passed by the sender.<br></div></div></div></div></div></blockquote><div><br></div>Hmm... R u sure? &nbsp;I tried this in a workspace I use for slang testing and saw no problem.<div><br><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Nicolas<br></div><div>&nbsp;<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Item was changed:<br>
&nbsp; ----- Method: Cogit&gt;&gt;compileEntry (in category 'compile abstract instructions') -----<br>
&nbsp; compileEntry<br>
&nbsp; &nbsp; &nbsp; &nbsp; "The entry code to a method checks that the class of the current receiver matches<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;that in the inline cache.&nbsp; Other non-obvious elements are that its alignment must be<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;different from the alignment of the noCheckEntry so that the method map machinery<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;can distinguish normal and super sends (super sends bind to the noCheckEntry).<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;In Newspeak we also need to distinguish dynSuperSends from normal and super<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;and so on Nespeak, bind the dynSuperEntry to the preceeding nop (on x86 there<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;happens to be one anyway)."<br>
<br>
&nbsp; &nbsp; &nbsp; &nbsp; self cppIf: NewspeakVM ifTrue:<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self Nop. "1st nop differentiates dynSuperEntry from no-check entry if using nextMethod"<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dynSuperEntry := self Nop].<br>
&nbsp; &nbsp; &nbsp; &nbsp; entry := objectRepresentation genGetInlineCacheClassTagFrom: ReceiverResultReg into: TempReg forEntry: true.<br>
&nbsp; &nbsp; &nbsp; &nbsp; self CmpR: ClassReg R: TempReg.<br>
&nbsp; &nbsp; &nbsp; &nbsp; self JumpNonZero: sendMiss.<br>
&nbsp; &nbsp; &nbsp; &nbsp; noCheckEntry := self Label.<br>
&nbsp; &nbsp; &nbsp; &nbsp; self compileSendTrace ifTrue:<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[backEnd saveAndRestoreLinkRegAround:<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[self CallRT: ceTraceLinkedSendTrampoline]]!<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[backEnd hasLinkRegister ifTrue:<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[self PushR: LinkReg].<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self CallRT: ceTraceLinkedSendTrampoline.<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; backEnd hasLinkRegister ifTrue:<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[self PopR: LinkReg]]!<br>
<br>
Item was changed:<br>
&nbsp; ----- Method: StackToRegisterMappingCogit&gt;&gt;genFramelessStorePop:ReceiverVariable: (in category 'bytecode generators') -----<br>
&nbsp; genFramelessStorePop: popBoolean ReceiverVariable: slotIndex<br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;inline: false&gt;<br>
&nbsp; &nbsp; &nbsp; &nbsp; | topReg valueReg constVal |<br>
&nbsp; &nbsp; &nbsp; &nbsp; self assert: needsFrame not.<br>
&nbsp; &nbsp; &nbsp; &nbsp; self ssFlushUpThroughReceiverVariable: slotIndex.<br>
&nbsp; &nbsp; &nbsp; &nbsp; "Avoid store check for immediate values"<br>
&nbsp; &nbsp; &nbsp; &nbsp; constVal := self ssTop maybeConstant.<br>
&nbsp; &nbsp; &nbsp; &nbsp; (self ssTop type = SSConstant<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;and: [(objectRepresentation shouldAnnotateObjectReference: constVal) not]) ifTrue:<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self ensureReceiverResultRegContainsSelf.<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self ssStorePop: popBoolean toPreferredReg: TempReg.<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;traceStores &gt; 0 ifTrue:<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[backEnd saveAndRestoreLinkRegAround:<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[self CallRT: ceTraceStoreTrampoline]].<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[self CallRT: ceTraceStoreTrampoline].<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^objectRepresentation<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; genStoreImmediateInSourceReg: TempReg<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; slotIndex: slotIndex<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; destReg: ReceiverResultReg].<br>
&nbsp; &nbsp; &nbsp; &nbsp; (topReg := self ssTop registerOrNil) isNil ifTrue:<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [topReg := ClassReg].<br>
&nbsp; &nbsp; &nbsp; &nbsp; valueReg := self ssStorePop: popBoolean toPreferredReg: topReg.<br>
&nbsp; &nbsp; &nbsp; &nbsp; "Note that ReceiverResultReg remains live after ceStoreCheckTrampoline."<br>
&nbsp; &nbsp; &nbsp; &nbsp; self ensureReceiverResultRegContainsSelf.<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;traceStores &gt; 0 ifTrue:<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self MoveR: valueReg R: TempReg.<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; backEnd saveAndRestoreLinkRegAround:<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[self CallRT: ceTraceStoreTrampoline]].<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self CallRT: ceTraceStoreTrampoline].<br>
&nbsp; &nbsp; &nbsp; &nbsp; ^objectRepresentation<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; genStoreSourceReg: valueReg<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; slotIndex: slotIndex<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; destReg: ReceiverResultReg<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scratchReg: TempReg!<br>
<br>
</blockquote></div><br></div></div>
</div></blockquote></div></body></html>