-
Notifications
You must be signed in to change notification settings - Fork 69
/
CogRASSBytecodeFixup.class.st
98 lines (84 loc) · 2.57 KB
/
CogRASSBytecodeFixup.class.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
"
A CogRASSBytecodeFixup extends CogSSBytecodeFixup with state to merge the stack at control-flow joins, preserving register contents. By holding onto the entire stack state a CogRASSBytecodeFixup allows RegisterAllocatingCogit to merge individual stack entries, instead of merely spilling to the same height.
Instance Variables
cogit: <RegisterAllocatingCogit>
mergeSimStack: <Array of: CogRegisterAllocatingSimStackEntry>
cogit
- the JIT compiler
mergeSimStack
- the state of the stack at the jump to this fixup
"
Class {
#name : #CogRASSBytecodeFixup,
#superclass : #CogSSBytecodeFixup,
#instVars : [
'cogit',
'mergeSimStack'
],
#category : #'VMMaker-JIT'
}
{ #category : #translation }
CogRASSBytecodeFixup class >> filteredInstVarNames [
"Override to group char and short vars together for compactness.
self typedef"
| vars |
vars := super filteredInstVarNames asOrderedCollection.
vars
remove: 'mergeSimStack';
add: 'mergeSimStack' afterIndex: (vars indexOf: 'targetInstruction').
^vars
]
{ #category : #'instance creation' }
CogRASSBytecodeFixup class >> for: aCogit [
^self new cogit: aCogit
]
{ #category : #'initialize-release' }
CogRASSBytecodeFixup >> cogit: aCogit [
cogit := aCogit.
^self
]
{ #category : #'debug printing' }
CogRASSBytecodeFixup >> hasMergeSimStack [
^self needsFixup and: [mergeSimStack notNil]
]
{ #category : #accessing }
CogRASSBytecodeFixup >> mergeSimStack [
<returnTypeC: #'CogSimStackEntry *'>
^mergeSimStack
]
{ #category : #accessing }
CogRASSBytecodeFixup >> mergeSimStack: anObject [
^mergeSimStack := anObject
]
{ #category : #'debug printing' }
CogRASSBytecodeFixup >> printSimStack [
<doNotGenerate>
self notAFixup ifFalse:
[cogit printSimStack: mergeSimStack toDepth: simStackPtr spillBase: -1 on: cogit coInterpreter transcript]
]
{ #category : #'debug printing' }
CogRASSBytecodeFixup >> printStateOn: aStream [
<doNotGenerate>
(targetInstruction isNil and: [simStackPtr isNil]) ifTrue:
[^self].
super printStateOn: aStream.
mergeSimStack ifNotNil:
[aStream skip: -1; space; nextPut: $(.
cogit printSimStack: mergeSimStack toDepth: simStackPtr spillBase: -1 on: aStream.
aStream nextPut: $); nextPut: $)]
]
{ #category : #accessing }
CogRASSBytecodeFixup >> reinitialize [
<inline: true>
super reinitialize.
mergeSimStack := nil
]
{ #category : #'debug printing' }
CogRASSBytecodeFixup >> simStackPrintString [
<doNotGenerate>
^String streamContents:
[:s|
self notAFixup
ifTrue: [s nextPutAll: 'notAFixup']
ifFalse: [cogit printSimStack: mergeSimStack toDepth: simStackPtr spillBase: -1 on: s]]
]