author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Fri, 17 Jun 2016 17:25:15 +0100 | |
changeset 26 | 8eb6716029aa |
parent 23 | d2d9a2d4d6bf |
permissions | -rw-r--r-- |
3
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
1 |
"{ Encoding: utf8 }" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
2 |
|
23
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
3 |
" |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
4 |
Copyright (c) 2012-2016 Igor Stasenko |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
5 |
Martin McClure |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
6 |
Damien Pollet |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
7 |
Camillo Bruni |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
8 |
Guido Chari |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
9 |
2016-now Jan Vrany <jan.vrany [at] fit . cvut . cz> |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
10 |
|
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
11 |
Permission is hereby granted, free of charge, to any person obtaining a copy |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
12 |
of this software and associated documentation files (the 'Software'), to deal |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
13 |
in the Software without restriction, including without limitation the rights |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
14 |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
15 |
copies of the Software, and to permit persons to whom the Software is |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
16 |
furnished to do so, subject to the following conditions: |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
17 |
|
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
18 |
The above copyright notice and this permission notice shall be included in all |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
19 |
copies or substantial portions of the Software. |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
20 |
|
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
21 |
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
22 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
23 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
24 |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
25 |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
26 |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
27 |
SOFTWARE. |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
28 |
" |
3
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
29 |
"{ Package: 'jv:dragonfly/asm' }" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
30 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
31 |
"{ NameSpace: Smalltalk }" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
32 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
33 |
AJInstruction subclass:#AJx86Instruction |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
34 |
instanceVariableNames:'description' |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
35 |
classVariableNames:'' |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
36 |
poolDictionaries:'' |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
37 |
category:'AsmJit-x86-Instructions' |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
38 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
39 |
|
23
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
40 |
!AJx86Instruction class methodsFor:'documentation'! |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
41 |
|
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
42 |
copyright |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
43 |
" |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
44 |
Copyright (c) 2012-2016 Igor Stasenko |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
45 |
Martin McClure |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
46 |
Damien Pollet |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
47 |
Camillo Bruni |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
48 |
Guido Chari |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
49 |
2016-now Jan Vrany <jan.vrany [at] fit . cvut . cz> |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
50 |
|
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
51 |
Permission is hereby granted, free of charge, to any person obtaining a copy |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
52 |
of this software and associated documentation files (the 'Software'), to deal |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
53 |
in the Software without restriction, including without limitation the rights |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
54 |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
55 |
copies of the Software, and to permit persons to whom the Software is |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
56 |
furnished to do so, subject to the following conditions: |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
57 |
|
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
58 |
The above copyright notice and this permission notice shall be included in all |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
59 |
copies or substantial portions of the Software. |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
60 |
|
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
61 |
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
62 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
63 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
64 |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
65 |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
66 |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
67 |
SOFTWARE. |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
68 |
|
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
69 |
" |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
70 |
! ! |
d2d9a2d4d6bf
Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
17
diff
changeset
|
71 |
|
3
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
72 |
!AJx86Instruction methodsFor:'accessing'! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
73 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
74 |
description |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
75 |
^ description |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
76 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
77 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
78 |
description: anInstructionDescription |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
79 |
description := anInstructionDescription |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
80 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
81 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
82 |
instructionDesciptions |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
83 |
^ AJx86InstructionDescription instructions |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
84 |
! ! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
85 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
86 |
!AJx86Instruction methodsFor:'code generation'! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
87 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
88 |
emitByte: byte |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
89 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
90 |
self assert: byte isByte. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
91 |
machineCode nextPut: byte |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
92 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
93 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
94 |
emitCode: asm |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
95 |
"do not generate machine code if it is already there" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
96 |
machineCode ifNotNil: [ ^ self ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
97 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
98 |
"make sure all operands are converted" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
99 |
operands ifNotNil: [ operands := operands collect: #asAJOperand ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
100 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
101 |
machineCode := WriteStream on: (ByteArray new: 16). |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
102 |
description emitUsing: self operands: operands. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
103 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
104 |
machineCode := machineCode contents. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
105 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
106 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
107 |
emitDWord: dword |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
108 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
109 |
"Emit dword (4 bytes) in little-endian order (since our target it x86 anyways)" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
110 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
111 |
self |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
112 |
emitByte: (dword bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
113 |
emitByte: (dword>>8 bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
114 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
115 |
emitByte: (dword>>16 bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
116 |
emitByte: (dword>>24 bitAnd: 255) |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
117 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
118 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
119 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
120 |
emitImmediate: imm size: size |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
121 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
122 |
^ imm emitUsing: self size: size |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
123 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
124 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
125 |
emitMod: mod reg: reg rm: rm |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
126 |
"Emit MODR/M byte. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
127 |
mmrrrxxx |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
128 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
129 |
mm = mod |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
130 |
rrr = REG (r8/r16/r32/mm/xmm |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
131 |
xxx = r/m |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
132 |
" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
133 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
134 |
^ self emitByte: (mod & 3) << 3 + (reg & 7) << 3 + (rm & 7) |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
135 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
136 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
137 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
138 |
emitOpCode: opCode |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
139 |
| byte | |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
140 |
"instruction prefix" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
141 |
(byte := (opCode bitAnd: 16rFF000000)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
142 |
self emitByte: byte >> 24 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
143 |
(byte := (opCode bitAnd: 16r00FF0000)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
144 |
self emitByte: byte >> 16 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
145 |
(byte := (opCode bitAnd: 16r0000FF00)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
146 |
self emitByte: byte >> 8 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
147 |
self emitByte: (opCode bitAnd: 16rFF). |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
148 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
149 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
150 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
151 |
emitQWord: dword |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
152 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
153 |
"Emit a qword (8 bytes) in little-endian order (since our target it x86 anyways)" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
154 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
155 |
self |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
156 |
emitByte: (dword bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
157 |
emitByte: (dword>>8 bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
158 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
159 |
emitByte: (dword>>16 bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
160 |
emitByte: (dword>>24 bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
161 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
162 |
emitByte: (dword>>32 bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
163 |
emitByte: (dword>>40 bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
164 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
165 |
emitByte: (dword>>48 bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
166 |
emitByte: (dword>>56 bitAnd: 255) |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
167 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
168 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
169 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
170 |
emitRexForInteger: anInt op2: op2 |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
171 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
172 |
self emitRexPrefixW: op2 is64 R: false X: false B: op2 isUpperBank. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
173 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
174 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
175 |
emitRexForOp1: op1 op2: op2 |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
176 |
"op1 is the general-purpose register argument (or a register number). |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
177 |
op2 is the reg/mem argument. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
178 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
179 |
In 64-bit mode, the instruction's default operation size is 32 bits. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
180 |
Use of the REX.W prefix promotes operation to 64 bits. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
181 |
Use of the REX.R prefix permits access to additional registers (R8-R15) for the op1 (reg) register. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
182 |
Use of the REX.B prefix permits access to additional registers (R8-R15) for the op2 (r/m) register, or the base register of op2 if register indirect. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
183 |
Use of the REX.X prefix permits access to additional registers (R8-R15) for the index register of op2, if indexed. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
184 |
See the summary chart at the beginning of this section for encoding data and limits." |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
185 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
186 |
| requires64Bit | |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
187 |
"no-op in 32 bit mode" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
188 |
self is32BitMode |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
189 |
ifTrue: [ ^ self ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
190 |
op1 isInteger |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
191 |
ifTrue: [ ^ self emitRexForInteger: op1 op2: op2 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
192 |
requires64Bit := op1 is64 or: [ op2 isReg and: [ op2 is64 ] ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
193 |
self |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
194 |
emitRexPrefixW: requires64Bit |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
195 |
R: op1 isUpperBank |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
196 |
X: op2 hasUpperBankIndex |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
197 |
B: op2 isUpperBank |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
198 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
199 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
200 |
emitRexForSingleOperand: op |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
201 |
"In 64-bit mode, the instruction’s default operation size is 32 bits. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
202 |
Use of the REX.W prefix promotes operation to 64 bits. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
203 |
Use of the REX.B prefix permits access to additional registers (R8-R15). |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
204 |
See the summary chart at the beginning of this section for encoding data and limits." |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
205 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
206 |
self emitRexPrefixW: op is64 R: false X: false B: op isUpperBank . |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
207 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
208 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
209 |
emitRexPrefixW: w R: r X: x B: b |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
210 |
" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
211 |
field bit def |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
212 |
- 7-4 2r0100 REX prefix identifier |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
213 |
W 3 0 = Operand size determined by CS.D |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
214 |
1 = 64 Bit Operand Size |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
215 |
R 2 Extension of the ModR/M reg field |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
216 |
X 1 Extension of the SIB index field |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
217 |
B 0 Extension of the ModR/M r/m field. SIB base field, or Opcode reg field |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
218 |
" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
219 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
220 |
self requiresRex |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
221 |
ifTrue: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
222 |
self is32BitMode |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
223 |
ifTrue: [ self error: 'Attempt to use a 64-bit-specific instruction or operand in 32-bit mode' ] |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
224 |
ifFalse: [ self emitByte: 2r0100 << 4 | (w asBit << 3) | (r asBit << 2) | (x asBit << 1) | b asBit ] ] |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
225 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
226 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
227 |
emitRexR: w opReg: opReg regCode: regCode |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
228 |
"no-op in 32 bit mode" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
229 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
230 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
231 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
232 |
emitRexRM: opRequires64Bit regCode: regCode rm: rm |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
233 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
234 |
self emitRexPrefixW: opRequires64Bit R: (regCode > 7) X: false B: rm isUpperBank |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
235 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
236 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
237 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
238 |
emitScale: shift index: indexCode base: baseCode |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
239 |
self emitByte: ((shift << 3) + (indexCode bitAnd: 7) << 3) + (baseCode bitAnd: 7) |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
240 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
241 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
242 |
emitSegmentPrefix: aMem |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
243 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
244 |
(aMem isMem and: [ aMem hasSegmentPrefix ]) ifTrue: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
245 |
self emitByte: aMem segmentPrefixCode. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
246 |
] |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
247 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
248 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
249 |
emitX86Inl: opCode reg: reg |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
250 |
"Emit instruction where register is inlined to opcode." |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
251 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
252 |
^ self emitX86Inl: opCode reg: reg withRex: true |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
253 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
254 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
255 |
emitX86Inl: opCode reg: reg withRex: useREX |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
256 |
"Emit instruction where register is inlined to opcode." |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
257 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
258 |
| byte | |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
259 |
"16 bit prefix" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
260 |
reg size == 2 |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
261 |
ifTrue: [ self emitByte: 16r66 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
262 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
263 |
"instruction prefix" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
264 |
(byte := (opCode bitAnd: 16rFF000000)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
265 |
self emitByte: byte >> 24 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
266 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
267 |
useREX ifTrue: [ self emitRexForSingleOperand: reg ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
268 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
269 |
(byte := (opCode bitAnd: 16r00FF0000)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
270 |
self emitByte: byte >> 16 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
271 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
272 |
(byte := (opCode bitAnd: 16r0000FF00)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
273 |
self emitByte: byte >> 8 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
274 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
275 |
self emitByte: (opCode bitAnd: 16rFF) + (reg code bitAnd: 7). |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
276 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
277 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
278 |
emitX86RM: opCode size: aSize regOrCode: regOrCode rm: regOrMem |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
279 |
"Emit instruction with reg/memory operand." |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
280 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
281 |
^ self emitX86RM: opCode size: aSize regOrCode: regOrCode rm: regOrMem immSize: 0 |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
282 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
283 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
284 |
emitX86RM: opCode size: aSize regOrCode: regOrCode rm: regOrMem immSize: immSize |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
285 |
"Emit instruction with reg/memory operand." |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
286 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
287 |
| byte code | |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
288 |
code := regOrCode isInteger ifTrue: [ regOrCode ] ifFalse: [ regOrCode code ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
289 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
290 |
"16 bit prefix" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
291 |
aSize == 2 ifTrue: [ self emitByte: 16r66 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
292 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
293 |
"segment prefix" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
294 |
self emitSegmentPrefix: regOrMem. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
295 |
"instruction prefix" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
296 |
(byte := (opCode bitAnd: 16rFF000000)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
297 |
self emitByte: byte >> 24 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
298 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
299 |
self emitRexForOp1: regOrCode op2: regOrMem. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
300 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
301 |
(byte := (opCode bitAnd: 16r00FF0000)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
302 |
self emitByte: byte >> 16 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
303 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
304 |
(byte := (opCode bitAnd: 16r0000FF00)) = 0 ifFalse: [ |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
305 |
self emitByte: byte >> 8 ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
306 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
307 |
self emitByte: (opCode bitAnd: 16rFF). |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
308 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
309 |
"ModR/M" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
310 |
^ regOrMem emitModRM: self code: code immSize: immSize |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
311 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
312 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
313 |
setLabelPosition: label |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
314 |
"set label position for immediate operand(s), if any" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
315 |
label position: self position + machineCode size. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
316 |
! ! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
317 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
318 |
!AJx86Instruction methodsFor:'code generation - prefixes'! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
319 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
320 |
emitOperandSizeOverridePrefix: anOperand |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
321 |
"If creating 64bit code, this must be called last of the prefix-generators, as the 64-bit prefixes are required to precede the opcode" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
322 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
323 |
"Switch to 16-bit operand mode for the next opcode if necessary" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
324 |
anOperand is16 ifTrue: [ self emitByte: 16r66]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
325 |
self emitRexRM: anOperand is64 regCode: 0 rm: anOperand |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
326 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
327 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
328 |
! ! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
329 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
330 |
!AJx86Instruction methodsFor:'consistency'! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
331 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
332 |
checkOperandsForConflict |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
333 |
"Signal an error if the given operands cannot be used together. Must be sent after operands are set." |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
334 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
335 |
| prohibited required | |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
336 |
required := self requiresRex. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
337 |
prohibited := false. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
338 |
operands |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
339 |
do: [ :op | |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
340 |
(op isInteger not and: [ op prohibitsRex ]) |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
341 |
ifTrue: [ prohibited := true ] ]. |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
342 |
prohibited & required |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
343 |
ifTrue: [ self error: 'Mix of operands that require and prohibit a REX prefix' ] |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
344 |
! ! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
345 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
346 |
!AJx86Instruction methodsFor:'emitting code'! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
347 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
348 |
emitWord: aWord |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
349 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
350 |
"little-endian" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
351 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
352 |
self |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
353 |
emitByte: (aWord bitAnd: 255); |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
354 |
emitByte: ((aWord >> 8) bitAnd: 255) |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
355 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
356 |
! ! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
357 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
358 |
!AJx86Instruction methodsFor:'testing'! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
359 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
360 |
is32BitMode |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
361 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
362 |
^ true |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
363 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
364 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
365 |
is64BitMode |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
366 |
^ false |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
367 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
368 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
369 |
isGPNRegister: reg |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
370 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
371 |
"answer true if given register is native general purpose register, |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
372 |
matching the target native size i.e. 32 bits for x86 or 64 bits for x64" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
373 |
^ reg isGeneralPurpose and: [ reg size = 4 ] |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
374 |
! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
375 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
376 |
requiresRex |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
377 |
^false |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
378 |
! ! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
379 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
380 |
!AJx86Instruction methodsFor:'visitor'! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
381 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
382 |
accept: anObject |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
383 |
"generic instruction" |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
384 |
^ anObject visitInstruction: self |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
385 |
|
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
386 |
! ! |
483729eb4432
Initial port ot Igor Stasenko's AsmJit
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
387 |