[Vm-dev] VM Maker: VMMaker.oscog-rsf.2083.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Jan 11 07:42:26 UTC 2017
Ronie Salgado Faila uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-rsf.2083.mcz
==================== Summary ====================
Name: VMMaker.oscog-rsf.2083
Author: rsf
Time: 11 January 2017, 4:42:00.330997 am
UUID: 2debebfc-5008-4ab3-b16d-37ab942d9bc0
Ancestors: VMMaker.oscog-eem.2082
Workaround a GCC crash in Windows when building a Lowcode VM. Too much register allocation pressure for calling a builtin memcpy.
=============== Diff against VMMaker.oscog-eem.2082 ===============
Item was changed:
----- Method: StackInterpreter>>internalPushShadowCallStackStructure:size: (in category 'internal interpreter access') -----
internalPushShadowCallStackStructure: structurePointer size: size
<option: #LowcodeVM>
shadowCallStackPointer := shadowCallStackPointer - size.
+ self lowcode_mem: shadowCallStackPointer cp: structurePointer y: size!
- self mem: shadowCallStackPointer cp: structurePointer y: size!
Item was changed:
----- Method: StackInterpreter>>lowcodePrimitiveInt32ToPointer (in category 'inline primitive generated code') -----
lowcodePrimitiveInt32ToPointer
<option: #LowcodeVM> "Lowcode instruction generator"
| value result |
<var: #value type: #'sqInt' >
<var: #result type: #'char*' >
value := self internalPopStackInt32.
+ result := self cCoerce: (self cCoerce: value to: 'uintptr_t') to: 'char*'.
- result := self cCoerce: value to: 'uintptr_t'.
self internalPushPointer: result.
!
Item was changed:
----- Method: StackInterpreter>>lowcodePrimitiveMemcpy32 (in category 'inline primitive generated code') -----
lowcodePrimitiveMemcpy32
<option: #LowcodeVM> "Lowcode instruction generator"
| source dest size |
<var: #source type: #'char*' >
<var: #dest type: #'char*' >
<var: #size type: #'sqInt' >
size := self internalPopStackInt32.
source := self internalPopStackPointer.
dest := self internalPopStackPointer.
+ self lowcode_mem: dest cp: source y: size.
- self mem: dest cp: source y: size.
!
Item was changed:
----- Method: StackInterpreter>>lowcodePrimitiveMemcpy64 (in category 'inline primitive generated code') -----
lowcodePrimitiveMemcpy64
<option: #LowcodeVM> "Lowcode instruction generator"
| source dest size |
<var: #source type: #'char*' >
<var: #dest type: #'char*' >
<var: #size type: #'sqLong' >
size := self internalPopStackInt64.
source := self internalPopStackPointer.
dest := self internalPopStackPointer.
+ self lowcode_mem: dest cp: source y: size.
- self mem: dest cp: source y: size.
!
Item was changed:
----- Method: StackInterpreter>>lowcodePrimitiveMemcpyFixed (in category 'inline primitive generated code') -----
lowcodePrimitiveMemcpyFixed
<option: #LowcodeVM> "Lowcode instruction generator"
| source size dest |
<var: #source type: #'char*' >
<var: #dest type: #'char*' >
size := extA.
source := self internalPopStackPointer.
dest := self internalPopStackPointer.
+ self lowcode_mem: dest cp: source y: size.
- self mem: dest cp: source y: size.
extA := 0.
!
Item was changed:
----- Method: StackInterpreter>>lowcodePrimitivePerformCallStructure (in category 'inline primitive generated code') -----
lowcodePrimitivePerformCallStructure
<option: #LowcodeVM> "Lowcode instruction generator"
| resultPointer result function structureSize |
<var: #resultPointer type: #'char*' >
<var: #result type: #'char*' >
function := extA.
structureSize := extB.
result := self internalPopStackPointer.
self internalPushShadowCallStackPointer: result.
resultPointer := self lowcodeCalloutPointerResult: (self cCoerce: function to: #'char*').
self internalPushPointer: resultPointer.
extA := 0.
extB := 0.
numExtB := 0.
+
!
Item was changed:
----- Method: StackInterpreter>>lowcodePrimitivePointerAddConstantOffset (in category 'inline primitive generated code') -----
lowcodePrimitivePointerAddConstantOffset
<option: #LowcodeVM> "Lowcode instruction generator"
| base offset result |
<var: #base type: #'char*' >
<var: #result type: #'char*' >
offset := extB.
base := self internalPopStackPointer.
result := base + offset.
self internalPushPointer: result.
extB := 0.
numExtB := 0.
!
Item was added:
+ ----- Method: StackInterpreter>>lowcode_mem:cp:y: (in category 'inline primitive support') -----
+ lowcode_mem: destAddress cp: sourceAddress y: bytes
+ "This method is a workaround a GCC bug.
+ In Windows memcpy is putting too much register pressure on GCC when used by Lowcode instructions"
+ <inline: #never>
+ <option: #LowcodeVM>
+ <var: #destAddress type: #'void*'>
+ <var: #sourceAddress type: #'void*'>
+ <var: #bytes type: #'sqInt'>
+
+ "Using memmove instead of memcpy to avoid crashing GCC in Windows."
+ self mem: destAddress mo: sourceAddress ve: bytes!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genLowcodePerformCallStructure (in category 'inline primitive generators generated code') -----
genLowcodePerformCallStructure
<option: #LowcodeVM> "Lowcode instruction generator"
"Push the result space"
self ssNativeTop nativeStackPopToReg: TempReg.
self ssNativePop: 1.
self PushR: TempReg.
"Call the function"
self callSwitchToCStack.
self MoveCw: extA R: TempReg.
self CallRT: ceFFICalloutTrampoline.
"Fetch the result"
self MoveR: backEnd cResultRegister R: ReceiverResultReg.
self ssPushNativeRegister: ReceiverResultReg.
extA := 0.
extB := 0.
numExtB := 0.
^ 0
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genLowcodePointerAddConstantOffset (in category 'inline primitive generators generated code') -----
genLowcodePointerAddConstantOffset
<option: #LowcodeVM> "Lowcode instruction generator"
| base offset |
offset := extB.
(base := backEnd availableRegisterOrNoneFor: self liveRegisters) = NoReg ifTrue:
[self ssAllocateRequiredReg:
(base := optStatus isReceiverResultRegLive
ifTrue: [Arg0Reg]
ifFalse: [ReceiverResultReg])].
base = ReceiverResultReg ifTrue:
[ optStatus isReceiverResultRegLive: false ].
self ssNativeTop nativePopToReg: base.
self ssNativePop: 1.
self AddCq: offset R: base.
self ssPushNativeRegister: base.
extB := 0.
numExtB := 0.
^ 0
!
More information about the Vm-dev
mailing list