[Vm-dev] VM Maker: VMMaker.oscog-rsf.2185.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Mar 26 18:50:18 UTC 2017
Ronie Salgado Faila uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-rsf.2185.mcz
==================== Summary ====================
Name: VMMaker.oscog-rsf.2185
Author: rsf
Time: 26 March 2017, 3:49:52.367206 pm
UUID: 3c227ed5-3dbc-4b48-9de0-38a0978593f8
Ancestors: VMMaker.oscog-eem.2184
Fixing the Lowcode compilation bug. I still have to fix another bug with the new register allocation used with Lowcode.
=============== Diff against VMMaker.oscog-eem.2184 ===============
Item was changed:
----- Method: CogBytecodeFixup class>>instVarNamesAndTypesForTranslationDo: (in category 'translation') -----
instVarNamesAndTypesForTranslationDo: aBinaryBlock
"Enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a BytecodeFixup struct."
"self withAllSubclasses collect: [:ea| ea typedef]"
self filteredInstVarNames do:
[:ivn|
aBinaryBlock
value: ivn
value: (ivn first ~= $# ifTrue:
[ivn caseOf: {
['targetInstruction'] -> [#'AbstractInstruction *'].
['mergeSimStack'] -> [#'SimStackEntry *'].
['instructionIndex'] -> [#'unsigned short'].
['simStackPtr'] -> [#char].
+ ['simNativeStackPtr'] -> [#'short'].
- ['simNativeStackPtr'] -> [#'unsigned short'].
['simNativeStackSize'] -> [#'unsigned short'].
['isReceiverResultRegSelf'] -> [#char] }])]!
Item was changed:
----- Method: CogSimStackNativeEntry>>nativeRegisterOrNone (in category 'accessing') -----
nativeRegisterOrNone
+ ^(type = SSNativeRegister or: [type = SSRegisterPair])
- ^(type = SSRegister or: [type = SSRegisterPair])
ifTrue: [register]
ifFalse: [NoReg]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeFloat2ResultInteger: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeFloat2ResultInteger: aBlock
<option: #LowcodeVM>
<inline: true>
| frNext frTop topRegistersMask rResult |
topRegistersMask := 0.
frTop := frNext := NoReg.
rResult := NoReg.
self ssNativeTop nativeFloatRegisterOrNone ~= NoReg ifTrue:
[ frTop := self ssNativeTop nativeFloatRegisterOrNone].
(self ssNativeValue: 1) nativeFloatRegisterOrNone ~= NoReg ifTrue:
[ topRegistersMask := self registerMaskFor: (frNext := (self ssNativeValue: 1) nativeFloatRegisterOrNone)].
frTop = NoReg ifTrue:
[ frTop := self allocateFloatRegNotConflictingWith: topRegistersMask ].
frNext = NoReg ifTrue:
[ frNext := self allocateFloatRegNotConflictingWith: (self registerMaskFor: frTop) ].
"Result"
rResult := self allocateRegNotConflictingWith: 0.
+ self deny: (frTop = NoReg or: [frNext = NoReg or: [rResult = NoReg]]).
- self deny: (frTop = NoReg or: [frNext = NoReg or: [rResult]]).
^ aBlock value: frTop value: frNext value: rResult
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger2ResultFloat: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger2ResultFloat: aBlock
<option: #LowcodeVM>
<inline: true>
| rNext rTop topRegistersMask frResult |
topRegistersMask := 0.
rTop := rNext := NoReg.
+ frResult := NoReg.
- frResult := NoReg
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: 1) nativeRegisterOrNone ~= NoReg ifTrue:
[ topRegistersMask := self registerMaskFor: (rNext := (self ssNativeValue: 1) nativeRegisterOrNone)].
].
rTop = NoReg ifTrue:
[ rTop := self allocateRegNotConflictingWith: topRegistersMask ].
rNext = NoReg ifTrue:
[ rNext := self allocateRegNotConflictingWith: (self registerMaskFor: rTop) ].
"Results"
frResult := self allocateFloatRegNotConflictingWith: self emptyRegisterMask.
self deny: (rTop = NoReg or: [rNext = NoReg or: [frResult = NoReg]]).
^ aBlock value: rTop value: rNext value: frResult!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger2ResultInteger2: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger2ResultInteger2: aBlock
<option: #LowcodeVM>
<inline: true>
| rNext rTop topRegistersMask rResult rResult2 |
topRegistersMask := 0.
rTop := rNext := NoReg.
+ rResult := rResult2 := NoReg.
- rResult := rResult2 := NoReg
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: 1) nativeRegisterOrNone ~= NoReg ifTrue:
[ topRegistersMask := self registerMaskFor: (rNext := (self ssNativeValue: 1) nativeRegisterOrNone)].
].
rTop = NoReg ifTrue:
[ rTop := self allocateRegNotConflictingWith: topRegistersMask ].
rNext = NoReg ifTrue:
[ rNext := self allocateRegNotConflictingWith: (self registerMaskFor: rTop) ].
self deny: (rTop = NoReg or: [rNext = NoReg]).
"Results"
rResult := self allocateFloatRegNotConflictingWith: (self registerMaskFor: rTop and: rNext).
rResult2 := self allocateFloatRegNotConflictingWith: (self registerMaskFor: rTop and: rNext and: rResult).
self deny: (rResult = NoReg or: [rResult2 = NoReg]).
^ aBlock value: rTop value: rNext value: rResult value: rResult2!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger2ResultInteger: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger2ResultInteger: aBlock
<option: #LowcodeVM>
<inline: true>
| rNext rTop topRegistersMask rResult |
topRegistersMask := 0.
rTop := rNext := NoReg.
+ rResult := NoReg.
- rResult := NoReg
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: 1) nativeRegisterOrNone ~= NoReg ifTrue:
[ topRegistersMask := self registerMaskFor: (rNext := (self ssNativeValue: 1) nativeRegisterOrNone)].
].
rTop = NoReg ifTrue:
[ rTop := self allocateRegNotConflictingWith: topRegistersMask ].
rNext = NoReg ifTrue:
[ rNext := self allocateRegNotConflictingWith: (self registerMaskFor: rTop) ].
self deny: (rTop = NoReg or: [rNext = NoReg]).
"Results"
rResult := self allocateFloatRegNotConflictingWith: (self registerMaskFor: rTop and: rNext).
self deny: (rResult = NoReg).
^ aBlock value: rTop value: rNext value: rResult!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger2ResultOop: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger2ResultOop: aBlock
<option: #LowcodeVM>
<inline: true>
| rNext rTop topRegistersMask rResult |
topRegistersMask := 0.
rTop := rNext := NoReg.
+ rResult := NoReg.
- rResult := NoReg
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: 1) nativeRegisterOrNone ~= NoReg ifTrue:
[ topRegistersMask := self registerMaskFor: (rNext := (self ssNativeValue: 1) nativeRegisterOrNone)].
].
rTop = NoReg ifTrue:
[ rTop := self allocateRegNotConflictingWith: topRegistersMask ].
rNext = NoReg ifTrue:
[ rNext := self allocateRegNotConflictingWith: (self registerMaskFor: rTop) ].
self deny: (rTop = NoReg or: [rNext = NoReg]).
"Results"
rResult := self allocateFloatRegNotConflictingWith: (self registerMaskFor: rTop and: rNext).
self deny: (rResult = NoReg).
^ aBlock value: rTop value: rNext value: rResult!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger3: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger3: aBlock
<option: #LowcodeVM>
<inline: true>
+ | rNext rNextNext nativeValueIndex rTop nextRegisterMask |
- | rNext rNextNext nativeValueIndex rTop registerMask |
rTop := rNext := rNextNext := NoReg.
nativeValueIndex := 1.
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
(self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone.
].
nativeValueIndex := nativeValueIndex + 1
].
].
rNextNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
].
].
rTop = NoReg ifTrue: [
+ nextRegisterMask := 0.
+ rNext ~= NoReg ifTrue: [ nextRegisterMask := self registerMaskFor: rNext].
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rTop := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := 0.
- rNext ~= NoReg ifTrue: [ registerMask := self registerMaskFor: rNext].
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rTop := self allocateRegNotConflictingWith: registerMask
].
rNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop.
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop.
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rNext := self allocateRegNotConflictingWith: registerMask
].
rNextNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop and: rNext.
+ rNextNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop and: rNext.
- rNextNext := self allocateRegNotConflictingWith: registerMask
].
self deny: (rTop = NoReg or: [rNext = NoReg or: [rNextNext = NoReg]]).
^ aBlock value: rTop value: rNext value: rNextNext
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger3ResultInteger: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger3ResultInteger: aBlock
<option: #LowcodeVM>
<inline: true>
+ | rNext rNextNext rResult nativeValueIndex rTop nextRegisterMask |
- | rNext rNextNext rResult nativeValueIndex rTop registerMask |
rTop := rNext := rNextNext := NoReg.
nativeValueIndex := 1.
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
(self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone.
].
nativeValueIndex := nativeValueIndex + 1
].
].
rNextNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
].
].
rTop = NoReg ifTrue: [
+ nextRegisterMask := 0.
+ rNext ~= NoReg ifTrue: [ nextRegisterMask := self registerMaskFor: rNext].
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rTop := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := 0.
- rNext ~= NoReg ifTrue: [ registerMask := self registerMaskFor: rNext].
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rTop := self allocateRegNotConflictingWith: registerMask
].
rNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop.
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop.
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rNext := self allocateRegNotConflictingWith: registerMask
].
rNextNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop and: rNext.
+ rNextNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop and: rNext.
- rNextNext := self allocateRegNotConflictingWith: registerMask
].
self deny: (rTop = NoReg or: [rNext = NoReg or: [rNextNext = NoReg]]).
"Allocate the result"
rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rTop and: rNext and: rNextNext).
self deny: (rResult = NoReg).
^ aBlock value: rTop value: rNext value: rNextNext value: rResult
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger4: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger4: aBlock
<option: #LowcodeVM>
<inline: true>
+ | rNext rNextNext rNextNextNext nativeValueIndex rTop nextRegisterMask |
- | rNext rNextNext rNextNextNext nativeValueIndex rTop registerMask |
rTop := rNext := rNextNext := rNextNextNext := NoReg.
nativeValueIndex := 1.
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
(self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
].
nativeValueIndex := nativeValueIndex + 1
].
].
rNextNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
(self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone ~= NoReg ifTrue: [
rNextNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone.
].
nativeValueIndex := nativeValueIndex + 1
].
].
rNextNextNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNextNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
nativeValueIndex := nativeValueIndex + 1
].
].
rTop = NoReg ifTrue: [
+ nextRegisterMask := 0.
+ rNext ~= NoReg ifTrue: [ nextRegisterMask := self registerMaskFor: rNext].
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rTop := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := 0.
- rNext ~= NoReg ifTrue: [ registerMask := self registerMaskFor: rNext].
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rTop := self allocateRegNotConflictingWith: registerMask
].
rNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop.
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop.
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rNext := self allocateRegNotConflictingWith: registerMask
].
rNextNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop and: rNext.
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rNextNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop and: rNext.
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rNextNext := self allocateRegNotConflictingWith: registerMask
].
rNextNextNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop and: rNext and: rNextNext.
+ rNextNextNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop and: rNext and: rNextNext.
- rNextNextNext := self allocateRegNotConflictingWith: registerMask
].
self deny: (rTop = NoReg or: [rNext = NoReg or: [rNextNext = NoReg or: [rNextNextNext = NoReg]]]).
^ aBlock value: rTop value: rNext value: rNextNext value: rNextNextNext
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger4ResultInteger2: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger4ResultInteger2: aBlock
<option: #LowcodeVM>
<inline: true>
+ | rNext rNextNext rNextNextNext nativeValueIndex rTop nextRegisterMask rResult rResult2 |
- | rNext rNextNext rNextNextNext nativeValueIndex rTop registerMask rResult rResult2 |
rTop := rNext := rNextNext := rNextNextNext := NoReg.
rResult := rResult2 := NoReg.
nativeValueIndex := 1.
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
(self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
].
nativeValueIndex := nativeValueIndex + 1
].
].
rNextNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
(self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone ~= NoReg ifTrue: [
rNextNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone.
].
nativeValueIndex := nativeValueIndex + 1
].
].
rNextNextNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNextNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
nativeValueIndex := nativeValueIndex + 1
].
].
rTop = NoReg ifTrue: [
+ nextRegisterMask := 0.
+ rNext ~= NoReg ifTrue: [ nextRegisterMask := self registerMaskFor: rNext].
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rTop := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := 0.
- rNext ~= NoReg ifTrue: [ registerMask := self registerMaskFor: rNext].
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rTop := self allocateRegNotConflictingWith: registerMask
].
rNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop.
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop.
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rNext := self allocateRegNotConflictingWith: registerMask
].
rNextNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop and: rNext.
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rNextNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop and: rNext.
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rNextNext := self allocateRegNotConflictingWith: registerMask
].
rNextNextNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop and: rNext and: rNextNext.
+ rNextNextNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop and: rNext and: rNextNext.
- rNextNextNext := self allocateRegNotConflictingWith: registerMask
].
self deny: (rTop = NoReg or: [rNext = NoReg or: [rNextNext = NoReg or: [rNextNextNext = NoReg]]]).
"Result registers"
rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rTop and: rNext and: rNextNext and: rNextNextNext).
rResult2 := self allocateRegNotConflictingWith: (self registerMaskFor: rTop and: rNext and: rNextNext and: rNextNextNext and: rResult).
^ aBlock value: rTop value: rNext value: rNextNext value: rNextNextNext value: rResult value: rResult2
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeInteger4ResultInteger: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeInteger4ResultInteger: aBlock
<option: #LowcodeVM>
<inline: true>
+ | rNext rNextNext rNextNextNext nativeValueIndex rTop nextRegisterMask rResult |
- | rNext rNextNext rNextNextNext nativeValueIndex rTop registerMask rResult |
rTop := rNext := rNextNext := rNextNextNext := NoReg.
rResult := NoReg.
nativeValueIndex := 1.
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
self ssNativeTop nativeRegisterSecondOrNone ~= NoReg ifTrue:
[ rNext := self ssNativeTop nativeRegisterSecondOrNone]
].
rNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
(self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
].
nativeValueIndex := nativeValueIndex + 1
].
].
rNextNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
(self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone ~= NoReg ifTrue: [
rNextNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterSecondOrNone.
].
nativeValueIndex := nativeValueIndex + 1
].
].
rNextNextNext = NoReg ifTrue: [
(self ssNativeValue: nativeValueIndex) nativeRegisterOrNone ~= NoReg ifTrue: [
rNextNextNext := (self ssNativeValue: nativeValueIndex) nativeRegisterOrNone.
nativeValueIndex := nativeValueIndex + 1
].
].
rTop = NoReg ifTrue: [
+ nextRegisterMask := 0.
+ rNext ~= NoReg ifTrue: [ nextRegisterMask := self registerMaskFor: rNext].
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rTop := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := 0.
- rNext ~= NoReg ifTrue: [ registerMask := self registerMaskFor: rNext].
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rTop := self allocateRegNotConflictingWith: registerMask
].
rNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop.
+ rNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNext)].
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop.
- rNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNext)].
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rNext := self allocateRegNotConflictingWith: registerMask
].
rNextNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop and: rNext.
+ rNextNextNext ~= NoReg ifTrue: [ nextRegisterMask := nextRegisterMask bitOr: (self registerMaskFor: rNextNextNext)].
+ rNextNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop and: rNext.
- rNextNextNext ~= NoReg ifTrue: [ registerMask := registerMask bitOr: (self registerMaskFor: rNextNextNext)].
- rNextNext := self allocateRegNotConflictingWith: registerMask
].
rNextNextNext = NoReg ifTrue: [
+ nextRegisterMask := self registerMaskFor: rTop and: rNext and: rNextNext.
+ rNextNextNext := self allocateRegNotConflictingWith: nextRegisterMask
- registerMask := self registerMaskFor: rTop and: rNext and: rNextNext.
- rNextNextNext := self allocateRegNotConflictingWith: registerMask
].
self deny: (rTop = NoReg or: [rNext = NoReg or: [rNextNext = NoReg or: [rNextNextNext = NoReg]]]).
"Result registers"
rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rTop and: rNext and: rNextNext and: rNextNextNext).
^ aBlock value: rTop value: rNext value: rNextNext value: rNextNextNext value: rResult
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeIntegerResultFloat: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeIntegerResultFloat: aBlock
<option: #LowcodeVM>
<inline: true>
| rTop frResult|
rTop := NoReg.
+ frResult := NoReg.
- frResult := NoReg
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
].
rTop = NoReg ifTrue:
[ rTop := self allocateRegNotConflictingWith: self emptyRegisterMask].
frResult := self allocateFloatRegNotConflictingWith: self emptyRegisterMask.
self deny: (rTop = NoReg or: [frResult = NoReg]).
^ aBlock value: rTop value: frResult
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeIntegerResultInteger2: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeIntegerResultInteger2: aBlock
<option: #LowcodeVM>
<inline: true>
| rTop rResult rResult2 |
rTop := NoReg.
+ rResult := rResult := NoReg.
- rResult := rResult := NoReg
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
].
rTop = NoReg ifTrue:
[ rTop := self allocateRegNotConflictingWith: self emptyRegisterMask].
rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rTop).
rResult2 := self allocateRegNotConflictingWith: (self registerMaskFor: rTop and: rResult).
self deny: (rTop = NoReg or: [rResult = NoReg or: [rResult2 = NoReg]]).
^ aBlock value: rTop value: rResult value: rResult2
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeIntegerResultInteger: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeIntegerResultInteger: aBlock
<option: #LowcodeVM>
<inline: true>
| rTop rResult|
rTop := NoReg.
+ rResult := NoReg.
- rResult := NoReg
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
].
rTop = NoReg ifTrue:
[ rTop := self allocateRegNotConflictingWith: self emptyRegisterMask].
rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rTop).
self deny: (rTop = NoReg or: [rResult = NoReg]).
^ aBlock value: rTop value: rResult
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeIntegerResultOop: (in category 'inline primitive register allocation') -----
allocateRegistersForLowcodeIntegerResultOop: aBlock
<option: #LowcodeVM>
<inline: true>
| rTop rResult|
rTop := NoReg.
+ rResult := NoReg.
- rResult := NoReg
self ssNativeTop nativeRegisterOrNone ~= NoReg ifTrue: [
rTop := self ssNativeTop nativeRegisterOrNone.
].
rTop = NoReg ifTrue:
[ rTop := self allocateRegNotConflictingWith: self emptyRegisterMask].
rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rTop).
self deny: (rTop = NoReg or: [rResult = NoReg]).
^ aBlock value: rTop value: rResult
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>ssNativeTop (in category 'simulation stack') -----
ssNativeTop
<option: #LowcodeVM>
+ <inline: true>
<returnTypeC: #'CogSimStackNativeEntry *'>
self assert: simNativeStackPtr >= 0.
^self simNativeStackAt: simNativeStackPtr!
Item was changed:
----- Method: StackToRegisterMappingCogit>>ssNativeValue: (in category 'simulation stack') -----
ssNativeValue: n
<returnTypeC: #'CogSimStackNativeEntry *'>
<option: #LowcodeVM>
+ ^self simNativeStackAt: simNativeStackPtr - n!
- ^self simNativeStackAt: simStackPtr - n!
More information about the Vm-dev
mailing list