metasm 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/BUGS +11 -0
- data/CREDITS +17 -0
- data/README +270 -0
- data/TODO +114 -0
- data/doc/code_organisation.txt +146 -0
- data/doc/const_missing.txt +16 -0
- data/doc/core_classes.txt +75 -0
- data/doc/feature_list.txt +53 -0
- data/doc/index.txt +59 -0
- data/doc/install_notes.txt +170 -0
- data/doc/style.css +3 -0
- data/doc/use_cases.txt +18 -0
- data/lib/metasm.rb +80 -0
- data/lib/metasm/arm.rb +12 -0
- data/lib/metasm/arm/debug.rb +39 -0
- data/lib/metasm/arm/decode.rb +167 -0
- data/lib/metasm/arm/encode.rb +77 -0
- data/lib/metasm/arm/main.rb +75 -0
- data/lib/metasm/arm/opcodes.rb +177 -0
- data/lib/metasm/arm/parse.rb +130 -0
- data/lib/metasm/arm/render.rb +55 -0
- data/lib/metasm/compile_c.rb +1457 -0
- data/lib/metasm/dalvik.rb +8 -0
- data/lib/metasm/dalvik/decode.rb +196 -0
- data/lib/metasm/dalvik/main.rb +60 -0
- data/lib/metasm/dalvik/opcodes.rb +366 -0
- data/lib/metasm/decode.rb +213 -0
- data/lib/metasm/decompile.rb +2659 -0
- data/lib/metasm/disassemble.rb +2068 -0
- data/lib/metasm/disassemble_api.rb +1280 -0
- data/lib/metasm/dynldr.rb +1329 -0
- data/lib/metasm/encode.rb +333 -0
- data/lib/metasm/exe_format/a_out.rb +194 -0
- data/lib/metasm/exe_format/autoexe.rb +82 -0
- data/lib/metasm/exe_format/bflt.rb +189 -0
- data/lib/metasm/exe_format/coff.rb +455 -0
- data/lib/metasm/exe_format/coff_decode.rb +901 -0
- data/lib/metasm/exe_format/coff_encode.rb +1078 -0
- data/lib/metasm/exe_format/dex.rb +457 -0
- data/lib/metasm/exe_format/dol.rb +145 -0
- data/lib/metasm/exe_format/elf.rb +923 -0
- data/lib/metasm/exe_format/elf_decode.rb +979 -0
- data/lib/metasm/exe_format/elf_encode.rb +1375 -0
- data/lib/metasm/exe_format/macho.rb +827 -0
- data/lib/metasm/exe_format/main.rb +228 -0
- data/lib/metasm/exe_format/mz.rb +164 -0
- data/lib/metasm/exe_format/nds.rb +172 -0
- data/lib/metasm/exe_format/pe.rb +437 -0
- data/lib/metasm/exe_format/serialstruct.rb +246 -0
- data/lib/metasm/exe_format/shellcode.rb +114 -0
- data/lib/metasm/exe_format/xcoff.rb +167 -0
- data/lib/metasm/gui.rb +23 -0
- data/lib/metasm/gui/cstruct.rb +373 -0
- data/lib/metasm/gui/dasm_coverage.rb +199 -0
- data/lib/metasm/gui/dasm_decomp.rb +369 -0
- data/lib/metasm/gui/dasm_funcgraph.rb +103 -0
- data/lib/metasm/gui/dasm_graph.rb +1354 -0
- data/lib/metasm/gui/dasm_hex.rb +543 -0
- data/lib/metasm/gui/dasm_listing.rb +599 -0
- data/lib/metasm/gui/dasm_main.rb +906 -0
- data/lib/metasm/gui/dasm_opcodes.rb +291 -0
- data/lib/metasm/gui/debug.rb +1228 -0
- data/lib/metasm/gui/gtk.rb +884 -0
- data/lib/metasm/gui/qt.rb +495 -0
- data/lib/metasm/gui/win32.rb +3004 -0
- data/lib/metasm/gui/x11.rb +621 -0
- data/lib/metasm/ia32.rb +14 -0
- data/lib/metasm/ia32/compile_c.rb +1523 -0
- data/lib/metasm/ia32/debug.rb +193 -0
- data/lib/metasm/ia32/decode.rb +1167 -0
- data/lib/metasm/ia32/decompile.rb +564 -0
- data/lib/metasm/ia32/encode.rb +314 -0
- data/lib/metasm/ia32/main.rb +233 -0
- data/lib/metasm/ia32/opcodes.rb +872 -0
- data/lib/metasm/ia32/parse.rb +327 -0
- data/lib/metasm/ia32/render.rb +91 -0
- data/lib/metasm/main.rb +1193 -0
- data/lib/metasm/mips.rb +11 -0
- data/lib/metasm/mips/compile_c.rb +7 -0
- data/lib/metasm/mips/decode.rb +253 -0
- data/lib/metasm/mips/encode.rb +51 -0
- data/lib/metasm/mips/main.rb +72 -0
- data/lib/metasm/mips/opcodes.rb +443 -0
- data/lib/metasm/mips/parse.rb +51 -0
- data/lib/metasm/mips/render.rb +43 -0
- data/lib/metasm/os/gnu_exports.rb +270 -0
- data/lib/metasm/os/linux.rb +1112 -0
- data/lib/metasm/os/main.rb +1686 -0
- data/lib/metasm/os/remote.rb +527 -0
- data/lib/metasm/os/windows.rb +2027 -0
- data/lib/metasm/os/windows_exports.rb +745 -0
- data/lib/metasm/parse.rb +876 -0
- data/lib/metasm/parse_c.rb +3938 -0
- data/lib/metasm/pic16c/decode.rb +42 -0
- data/lib/metasm/pic16c/main.rb +17 -0
- data/lib/metasm/pic16c/opcodes.rb +68 -0
- data/lib/metasm/ppc.rb +11 -0
- data/lib/metasm/ppc/decode.rb +264 -0
- data/lib/metasm/ppc/decompile.rb +251 -0
- data/lib/metasm/ppc/encode.rb +51 -0
- data/lib/metasm/ppc/main.rb +129 -0
- data/lib/metasm/ppc/opcodes.rb +410 -0
- data/lib/metasm/ppc/parse.rb +52 -0
- data/lib/metasm/preprocessor.rb +1277 -0
- data/lib/metasm/render.rb +130 -0
- data/lib/metasm/sh4.rb +8 -0
- data/lib/metasm/sh4/decode.rb +336 -0
- data/lib/metasm/sh4/main.rb +292 -0
- data/lib/metasm/sh4/opcodes.rb +381 -0
- data/lib/metasm/x86_64.rb +12 -0
- data/lib/metasm/x86_64/compile_c.rb +1025 -0
- data/lib/metasm/x86_64/debug.rb +59 -0
- data/lib/metasm/x86_64/decode.rb +268 -0
- data/lib/metasm/x86_64/encode.rb +264 -0
- data/lib/metasm/x86_64/main.rb +135 -0
- data/lib/metasm/x86_64/opcodes.rb +118 -0
- data/lib/metasm/x86_64/parse.rb +68 -0
- data/misc/bottleneck.rb +61 -0
- data/misc/cheader-findpppath.rb +58 -0
- data/misc/hexdiff.rb +74 -0
- data/misc/hexdump.rb +55 -0
- data/misc/metasm-all.rb +13 -0
- data/misc/objdiff.rb +47 -0
- data/misc/objscan.rb +40 -0
- data/misc/pdfparse.rb +661 -0
- data/misc/ppc_pdf2oplist.rb +192 -0
- data/misc/tcp_proxy_hex.rb +84 -0
- data/misc/txt2html.rb +440 -0
- data/samples/a.out.rb +31 -0
- data/samples/asmsyntax.rb +77 -0
- data/samples/bindiff.rb +555 -0
- data/samples/compilation-steps.rb +49 -0
- data/samples/cparser_makestackoffset.rb +55 -0
- data/samples/dasm-backtrack.rb +38 -0
- data/samples/dasmnavig.rb +318 -0
- data/samples/dbg-apihook.rb +228 -0
- data/samples/dbghelp.rb +143 -0
- data/samples/disassemble-gui.rb +102 -0
- data/samples/disassemble.rb +133 -0
- data/samples/dump_upx.rb +95 -0
- data/samples/dynamic_ruby.rb +1929 -0
- data/samples/elf_list_needed.rb +46 -0
- data/samples/elf_listexports.rb +33 -0
- data/samples/elfencode.rb +25 -0
- data/samples/exeencode.rb +128 -0
- data/samples/factorize-headers-elfimports.rb +77 -0
- data/samples/factorize-headers-peimports.rb +109 -0
- data/samples/factorize-headers.rb +43 -0
- data/samples/gdbclient.rb +583 -0
- data/samples/generate_libsigs.rb +102 -0
- data/samples/hotfix_gtk_dbg.rb +59 -0
- data/samples/install_win_env.rb +78 -0
- data/samples/lindebug.rb +924 -0
- data/samples/linux_injectsyscall.rb +95 -0
- data/samples/machoencode.rb +31 -0
- data/samples/metasm-shell.rb +91 -0
- data/samples/pe-hook.rb +69 -0
- data/samples/pe-ia32-cpuid.rb +203 -0
- data/samples/pe-mips.rb +35 -0
- data/samples/pe-shutdown.rb +78 -0
- data/samples/pe-testrelocs.rb +51 -0
- data/samples/pe-testrsrc.rb +24 -0
- data/samples/pe_listexports.rb +31 -0
- data/samples/peencode.rb +19 -0
- data/samples/peldr.rb +494 -0
- data/samples/preprocess-flatten.rb +19 -0
- data/samples/r0trace.rb +308 -0
- data/samples/rubstop.rb +399 -0
- data/samples/scan_pt_gnu_stack.rb +54 -0
- data/samples/scanpeexports.rb +62 -0
- data/samples/shellcode-c.rb +40 -0
- data/samples/shellcode-dynlink.rb +146 -0
- data/samples/source.asm +34 -0
- data/samples/struct_offset.rb +47 -0
- data/samples/testpe.rb +32 -0
- data/samples/testraw.rb +45 -0
- data/samples/win32genloader.rb +132 -0
- data/samples/win32hooker-advanced.rb +169 -0
- data/samples/win32hooker.rb +96 -0
- data/samples/win32livedasm.rb +33 -0
- data/samples/win32remotescan.rb +133 -0
- data/samples/wintrace.rb +92 -0
- data/tests/all.rb +8 -0
- data/tests/dasm.rb +39 -0
- data/tests/dynldr.rb +35 -0
- data/tests/encodeddata.rb +132 -0
- data/tests/ia32.rb +82 -0
- data/tests/mips.rb +116 -0
- data/tests/parse_c.rb +239 -0
- data/tests/preprocessor.rb +269 -0
- data/tests/x86_64.rb +62 -0
- metadata +255 -0
@@ -0,0 +1,292 @@
|
|
1
|
+
# This file is part of Metasm, the Ruby assembly manipulation suite
|
2
|
+
# Copyright (C) 2006-2010 Yoann GUILLOT
|
3
|
+
#
|
4
|
+
# Licence is LGPL, see LICENCE in the top-level directory
|
5
|
+
|
6
|
+
require 'metasm/main'
|
7
|
+
|
8
|
+
module Metasm
|
9
|
+
|
10
|
+
class Sh4 < CPU
|
11
|
+
def initialize(e = :little, transfersz = 0, fpprecision = 0)
|
12
|
+
super()
|
13
|
+
@endianness = e
|
14
|
+
|
15
|
+
# transfer size mode
|
16
|
+
# When SZ = 1 and big endian mode is selected, FMOV can
|
17
|
+
# be used for double-precision floating-point data load or
|
18
|
+
# store operations. In little endian mode, two 32-bit data size
|
19
|
+
# moves must be executed, with SZ = 0, to load or store a
|
20
|
+
# double-precision floating-point number.
|
21
|
+
transfersz = 0 if @endianness == :little
|
22
|
+
@transfersz = transfersz
|
23
|
+
|
24
|
+
# PR = 0 : Floating point instructions are executed as single
|
25
|
+
# precision operations.
|
26
|
+
# PR = 1 : Floating point instructions are executed as double-
|
27
|
+
# precision operations (the result of instructions for
|
28
|
+
# which double-precision is not supported is undefined).
|
29
|
+
# Setting [transfersz = fpprecision = 1] is reserved.
|
30
|
+
# FPU operations are undefined in this mode.
|
31
|
+
@fpprecision = fpprecision
|
32
|
+
|
33
|
+
@size = 32
|
34
|
+
end
|
35
|
+
|
36
|
+
class Reg
|
37
|
+
include Renderable
|
38
|
+
|
39
|
+
def ==(o)
|
40
|
+
o.class == self.class and (not respond_to?(:i) or o.i == i)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# general purpose reg
|
45
|
+
class GPR < Reg
|
46
|
+
attr_accessor :i
|
47
|
+
|
48
|
+
def initialize(i); @i = i end
|
49
|
+
Sym = (0..15).map { |i| "r#{i}".to_sym }
|
50
|
+
|
51
|
+
def symbolic ; Sym[@i] end
|
52
|
+
|
53
|
+
def render ; ["r#@i"] end
|
54
|
+
end
|
55
|
+
|
56
|
+
class RBANK < Reg
|
57
|
+
attr_accessor :i
|
58
|
+
|
59
|
+
def initialize(i); @i = i end
|
60
|
+
Sym = (0..7).map { |i| "r#{i}_bank".to_sym }
|
61
|
+
|
62
|
+
def symbolic ; Sym[@i] end
|
63
|
+
|
64
|
+
def render ; ["r#{@i}_bank"] end
|
65
|
+
end
|
66
|
+
|
67
|
+
# floatting-point registers
|
68
|
+
class FR < Reg
|
69
|
+
attr_accessor :i
|
70
|
+
|
71
|
+
def initialize(i); @i = i end
|
72
|
+
Sym = (0..15).map { |i| "fr#{i}".to_sym }
|
73
|
+
|
74
|
+
def symbolic ; Sym[@i] end
|
75
|
+
|
76
|
+
def render ; ["fr#@i"] end
|
77
|
+
end
|
78
|
+
|
79
|
+
# DR registers: double-precision floating-point registers
|
80
|
+
# DR0 = {FR0, FR1}
|
81
|
+
# DR2 = {FR2, FR3}
|
82
|
+
# DR4 = {FR4, FR5}
|
83
|
+
# DR6 = {FR6, FR7}
|
84
|
+
# DR8 = {FR8, FR9}
|
85
|
+
# DR10 = {FR10, FR11}
|
86
|
+
# DR12 = {FR12, FR13}
|
87
|
+
# DR14 = {FR14, FR15}
|
88
|
+
class DR < Reg
|
89
|
+
attr_accessor :i
|
90
|
+
|
91
|
+
def initialize(i); @i = i end
|
92
|
+
Sym = (0..7).map { |i| "dr#{i*2}".to_sym }
|
93
|
+
|
94
|
+
def symbolic ; Sym[@i/2] end
|
95
|
+
|
96
|
+
def render ; ["dr#@i"] end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Single-precision floating-point vector registers
|
100
|
+
# FV0 = {FR0, FR1, FR2, FR3}
|
101
|
+
# FV4 = {FR4, FR5, FR6, FR7},
|
102
|
+
# FV8 = {FR8, FR9, FR10, FR11}
|
103
|
+
# FV12 = {FR12, FR13, FR14, FR15}
|
104
|
+
class FVR < Reg
|
105
|
+
attr_accessor :i
|
106
|
+
|
107
|
+
def initialize(i); @i = i end
|
108
|
+
Sym = (0..3).map { |i| "fv#{i*4}".to_sym }
|
109
|
+
|
110
|
+
def symbolic ; Sym[@i/4] end
|
111
|
+
|
112
|
+
def render ; ["fv#@i"] end
|
113
|
+
end
|
114
|
+
|
115
|
+
# Single-precision floating-point extended registers
|
116
|
+
class XFR < Reg
|
117
|
+
attr_accessor :i
|
118
|
+
|
119
|
+
def initialize(i); @i = i end
|
120
|
+
Sym = (0..15).map { |i| "xf#{i}".to_sym }
|
121
|
+
|
122
|
+
def symbolic ; Sym[@i] end
|
123
|
+
|
124
|
+
def render ; ["xf#@i"] end
|
125
|
+
end
|
126
|
+
|
127
|
+
# XD registers: single-precision floating-point vector registers
|
128
|
+
# XD0 = {XF0, XF1}
|
129
|
+
# XD2 = {XF2, XF3}
|
130
|
+
# XD4 = {XF4, XF5}
|
131
|
+
# XD6 = {XF6, XF7}
|
132
|
+
# XD8 = {XF8, XF9}
|
133
|
+
# XD10 = {XF10, XF11}
|
134
|
+
# XD12 = {XF12, XF13}
|
135
|
+
# XD14 = {XF14, XF15}
|
136
|
+
class XDR < Reg
|
137
|
+
attr_accessor :i
|
138
|
+
|
139
|
+
def initialize(i); @i = i end
|
140
|
+
Sym = (0..7).map { |i| "xd#{i*2}".to_sym }
|
141
|
+
|
142
|
+
def symbolic ; Sym[@i/2] end
|
143
|
+
|
144
|
+
def render ; ["xd#@i"] end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Single-precision floating-point extended register matrix
|
148
|
+
class XMTRX < Reg
|
149
|
+
def symbolic ; :xmtrx ; end
|
150
|
+
def render ; ['xmtrx'] ; end
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
# Multiply-and-accumulate register high
|
155
|
+
class MACH < Reg
|
156
|
+
|
157
|
+
def symbolic ; :mach end
|
158
|
+
def render ; ['mach'] end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Multiply-and-accumulate register low
|
162
|
+
class MACL < Reg
|
163
|
+
|
164
|
+
def symbolic ; :macl end
|
165
|
+
def render ; ['macl'] end
|
166
|
+
end
|
167
|
+
|
168
|
+
# Procedure register
|
169
|
+
class PR < Reg
|
170
|
+
|
171
|
+
def symbolic ; :pr end
|
172
|
+
def render ; ['pr'] end
|
173
|
+
end
|
174
|
+
|
175
|
+
# Floating-point communication register
|
176
|
+
class FPUL < Reg
|
177
|
+
|
178
|
+
def symbolic ; :fpul end
|
179
|
+
def render ; ['fpul'] end
|
180
|
+
end
|
181
|
+
|
182
|
+
# Program counter
|
183
|
+
class PC < Reg
|
184
|
+
|
185
|
+
def symbolic ; :pc end
|
186
|
+
def render ; ['pc'] end
|
187
|
+
end
|
188
|
+
|
189
|
+
# Floating-point status/control register
|
190
|
+
class FPSCR < Reg
|
191
|
+
|
192
|
+
def symbolic ; :fpscr end
|
193
|
+
def render ; ['fpscr'] end
|
194
|
+
end
|
195
|
+
|
196
|
+
#----------------------- Control registers -----------------------------
|
197
|
+
|
198
|
+
# Status register
|
199
|
+
class SR < Reg
|
200
|
+
|
201
|
+
def symbolic ; :sr end
|
202
|
+
def render ; ['sr'] end
|
203
|
+
end
|
204
|
+
|
205
|
+
# Saved status register
|
206
|
+
class SSR < Reg
|
207
|
+
|
208
|
+
def symbolic ; :ssr end
|
209
|
+
def render ; ['ssr'] end
|
210
|
+
end
|
211
|
+
|
212
|
+
# Saved program counter
|
213
|
+
class SPC < Reg
|
214
|
+
|
215
|
+
def symbolic ; :spc end
|
216
|
+
def render ; ['spc'] end
|
217
|
+
end
|
218
|
+
|
219
|
+
# Global base register
|
220
|
+
class GBR < Reg
|
221
|
+
|
222
|
+
def symbolic ; :spc end
|
223
|
+
def render ; ['gbr'] end
|
224
|
+
end
|
225
|
+
|
226
|
+
# Vector base register
|
227
|
+
class VBR < Reg
|
228
|
+
|
229
|
+
def symbolic ; :spc end
|
230
|
+
def render ; ['vbr'] end
|
231
|
+
end
|
232
|
+
|
233
|
+
# Saved general register
|
234
|
+
class SGR < Reg
|
235
|
+
|
236
|
+
def symbolic ; :sgr end
|
237
|
+
def render ; ['sgr'] end
|
238
|
+
end
|
239
|
+
|
240
|
+
# Debug base register
|
241
|
+
class DBR < Reg
|
242
|
+
|
243
|
+
def symbolic ; :dbr end
|
244
|
+
def render ; ['dbr'] end
|
245
|
+
end
|
246
|
+
|
247
|
+
class Memref
|
248
|
+
# action: pre/post (inc/dec)rement
|
249
|
+
attr_accessor :base, :disp, :action
|
250
|
+
|
251
|
+
def initialize(base, offset, action = nil)
|
252
|
+
base = Expression[base] if base.kind_of? Integer
|
253
|
+
@base, @disp, @action = base, offset, action
|
254
|
+
end
|
255
|
+
|
256
|
+
def symbolic(orig=nil, sz=32)
|
257
|
+
b = @base
|
258
|
+
b = b.symbolic if b.kind_of? Reg
|
259
|
+
|
260
|
+
if disp
|
261
|
+
o = @disp
|
262
|
+
o = o.symbolic if o.kind_of? Reg
|
263
|
+
e = Expression[b, :+, o].reduce
|
264
|
+
else
|
265
|
+
e = Expression[b].reduce
|
266
|
+
end
|
267
|
+
|
268
|
+
Indirection[e, sz, orig]
|
269
|
+
end
|
270
|
+
|
271
|
+
include Renderable
|
272
|
+
|
273
|
+
def render
|
274
|
+
if @disp
|
275
|
+
['@(', @base, ',', @disp, ')']
|
276
|
+
else
|
277
|
+
case @action
|
278
|
+
when :pre then ['@-', @base]
|
279
|
+
when :post then ['@', @base, '+']
|
280
|
+
else ['@', @base]
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
end
|
286
|
+
|
287
|
+
def init_opcode_list
|
288
|
+
init
|
289
|
+
end
|
290
|
+
|
291
|
+
end
|
292
|
+
end
|
@@ -0,0 +1,381 @@
|
|
1
|
+
# This file is part of Metasm, the Ruby assembly manipulation suite
|
2
|
+
# Copyright (C) 2006-2010 Yoann GUILLOT
|
3
|
+
#
|
4
|
+
# Licence is LGPL, see LICENCE in the top-level directory
|
5
|
+
|
6
|
+
require 'metasm/sh4/main'
|
7
|
+
|
8
|
+
module Metasm
|
9
|
+
class Sh4
|
10
|
+
def addop(name, bin, *args)
|
11
|
+
o = Opcode.new name, bin
|
12
|
+
|
13
|
+
o.args.concat(args & @fields_mask.keys)
|
14
|
+
(args & @valid_props).each { |p| o.props[p] = true }
|
15
|
+
|
16
|
+
(args & @fields_mask.keys).each { |f|
|
17
|
+
o.fields[f] = [@fields_mask[f], @fields_shift[f]]
|
18
|
+
}
|
19
|
+
|
20
|
+
@opcode_list << o
|
21
|
+
end
|
22
|
+
|
23
|
+
def init
|
24
|
+
@opcode_list = []
|
25
|
+
|
26
|
+
# :@rm_ is used for @Rm+
|
27
|
+
# :@_rn is used for @-Rn
|
28
|
+
# :@r0rm is used for @(R0, Rm) (same for r0rn)
|
29
|
+
# :@r0gbr is used for @(R0, GBR)
|
30
|
+
@fields_mask = {
|
31
|
+
:rm => 0xf, :rn => 0xf,
|
32
|
+
:@rm => 0xf, :@rn => 0xf,
|
33
|
+
:@rm_ => 0xf, :@rn_ => 0xf,
|
34
|
+
:@_rn => 0xf,
|
35
|
+
|
36
|
+
:frm => 0xf, :frn => 0xf,
|
37
|
+
:xdm => 0x7, :xdn => 0x7,
|
38
|
+
:drm => 0x7, :drn => 0x7,
|
39
|
+
:fvm => 0x3, :fvn => 0x3,
|
40
|
+
|
41
|
+
:@r0rm => 0xf, :@r0rn => 0xf,
|
42
|
+
:rm_bank => 0x7, :rn_bank => 0x7,
|
43
|
+
|
44
|
+
:@disprm => 0xff, :@dispr0rn => 0xff, :@disprmrn => 0xf0f,
|
45
|
+
:@dispgbr => 0xff, :@disppc => 0xff,
|
46
|
+
:disp8 => 0xff, :disp12 => 0xfff, :disppc => 0xff,
|
47
|
+
|
48
|
+
:i8 => 0xff, # zero-extendded 8-bit immediate
|
49
|
+
:s8 => 0xff, # 8-bit displacement s is sign-extended, doubled and added to PC+4
|
50
|
+
}
|
51
|
+
|
52
|
+
@fields_shift = {
|
53
|
+
:rm => 4, :rn => 8,
|
54
|
+
:@rm => 4, :@rn => 8,
|
55
|
+
:@rm_ => 4, :@rn_ => 8,
|
56
|
+
:@_rn => 8,
|
57
|
+
|
58
|
+
:frm => 4, :frn => 8,
|
59
|
+
:xdm => 5, :xdn => 9,
|
60
|
+
:drm => 5, :drn => 9,
|
61
|
+
:fvm => 8, :fvn => 10,
|
62
|
+
|
63
|
+
:@r0rm => 4, :@r0rn => 8,
|
64
|
+
:rm_bank => 7, :rn_bank => 4,
|
65
|
+
|
66
|
+
:@disprm => 0, :@dispr0rn => 0, :@disprmrn => 0,
|
67
|
+
:@dispgbr => 0, :@disppc => 0,
|
68
|
+
:disp8 => 0, :disp12 => 0, :disppc => 0,
|
69
|
+
|
70
|
+
:i8 => 0,
|
71
|
+
:s8 => 0,
|
72
|
+
}
|
73
|
+
|
74
|
+
# implicit operands
|
75
|
+
[:vbr, :gbr, :sr, :ssr, :spc, :sgr, :dbr, :mach, :macl, :pr, :fpul, :fpscr, :dbr, :pc, :r0].each { |a| @fields_mask[a] = @fields_shift[a] = 0 }
|
76
|
+
|
77
|
+
@valid_props = [:setip, :saveip, :stopexec , :delay_slot]
|
78
|
+
|
79
|
+
addop 'add', 0b0011 << 12 | 0b1100, :rm, :rn
|
80
|
+
addop 'add', 0b0111 << 12, :s8, :rn
|
81
|
+
addop 'addc', 0b0011 << 12 | 0b1110, :rm, :rn
|
82
|
+
addop 'addv', 0b0011 << 12 | 0b1111, :rm, :rn
|
83
|
+
|
84
|
+
addop 'and', 0b0010 << 12 | 0b1001, :rm, :rn
|
85
|
+
addop 'and', 0b11001001 << 8, :i8, :r0
|
86
|
+
addop 'and.b', 0b11001101 << 8, :i8, :@r0gbr
|
87
|
+
|
88
|
+
addop 'bf', 0b10001011 << 8, :disp8, :setip
|
89
|
+
addop 'bf/s', 0b10001111 << 8, :disp8, :setip, :delay_slot
|
90
|
+
addop 'bra', 0b1010 << 12, :disp12, :setip, :stopexec, :delay_slot
|
91
|
+
addop 'braf', 0b0000 << 12 | 0b00100011, :rn, :setip, :stopexec, :delay_slot
|
92
|
+
addop 'brk', 0b0000000000111011, :stopexec # causes a pre-execution BREAK exception
|
93
|
+
addop 'bsr', 0b1011 << 12, :disp12, :setip, :saveip, :stopexec, :delay_slot
|
94
|
+
addop 'bsrf', 0b0000 << 12 | 0b00000011, :rn, :setip, :saveip, :stopexec, :delay_slot
|
95
|
+
addop 'bt', 0b10001001 << 8, :disp8, :setip
|
96
|
+
addop 'bt/s', 0b10001101 << 8, :disp8, :setip, :delay_slot
|
97
|
+
|
98
|
+
addop 'clrmac', 0b0000000000101000
|
99
|
+
addop 'clrs', 0b0000000001001000
|
100
|
+
addop 'clrt', 0b0000000000001000
|
101
|
+
|
102
|
+
addop 'cmp/eq', 0b0011 << 12 | 0b0000, :rm, :rn
|
103
|
+
addop 'cmp/eq', 0b10001000 << 8, :s8, :r0
|
104
|
+
addop 'cmp/ge', 0b0011 << 12 | 0b0011, :rm, :rn
|
105
|
+
addop 'cmp/gt', 0b0011 << 12 | 0b0111, :rm, :rn
|
106
|
+
addop 'cmp/hi', 0b0011 << 12 | 0b0110, :rm, :rn
|
107
|
+
addop 'cmp/hs', 0b0011 << 12 | 0b0010, :rm, :rn
|
108
|
+
addop 'cmp/pl', 0b0100 << 12 | 0b00010101, :rn
|
109
|
+
addop 'cmp/pz', 0b0100 << 12 | 0b00010001, :rn
|
110
|
+
addop 'cmp/str', 0b0010 << 12 | 0b1100, :rm, :rn
|
111
|
+
|
112
|
+
addop 'div0s', 0b0010 << 12 | 0b0111, :rm, :rn
|
113
|
+
addop 'div0u', 0b0000000000011001
|
114
|
+
addop 'div1', 0b0011 << 12 | 0b0100, :rm, :rn
|
115
|
+
|
116
|
+
addop 'dmuls.l', 0b0011 << 12 | 0b1101, :rm, :rn
|
117
|
+
addop 'dmulu.l', 0b0011 << 12 | 0b0101, :rm, :rn
|
118
|
+
|
119
|
+
addop 'dt', 0b0100 << 12 | 0b00010000, :rn
|
120
|
+
|
121
|
+
addop 'exts.b', 0b0110 << 12 | 0b1110, :rm, :rn
|
122
|
+
addop 'exts.w', 0b0110 << 12 | 0b1111, :rm, :rn
|
123
|
+
addop 'extu.b', 0b0110 << 12 | 0b1100, :rm, :rn
|
124
|
+
addop 'extu.w', 0b0110 << 12 | 0b1101, :rm, :rn
|
125
|
+
|
126
|
+
# fpu instructions
|
127
|
+
addop 'fabs', 0b1111 << 12 | 0b001011101, :drn
|
128
|
+
addop 'fabs', 0b1111 << 12 | 0b01011101, :frn
|
129
|
+
|
130
|
+
addop 'fadd', 0b1111 << 12 | 0b0 << 8 | 0b00000, :drm, :drn
|
131
|
+
addop 'fadd', 0b1111 << 12 | 0b0000, :frm, :frn
|
132
|
+
|
133
|
+
addop 'fcmp/eq', 0b1111 << 12 | 0b0 << 8 | 0b00100, :drm, :drn
|
134
|
+
addop 'fcmp/eq', 0b1111 << 12 | 0b0100, :frm, :frn
|
135
|
+
|
136
|
+
addop 'fcmp/gt', 0b1111 << 12 | 0b0 << 8 | 0b00101, :drm, :drn
|
137
|
+
addop 'fcmp/gt', 0b1111 << 12 | 0b0101, :frm, :frn
|
138
|
+
|
139
|
+
addop 'fcnvds', 0b1111 << 12 | 0b010111101, :drn, :fpul
|
140
|
+
addop 'fcnvsd', 0b1111 << 12 | 0b010101101, :fpul, :drn
|
141
|
+
|
142
|
+
addop 'fdiv', 0b1111 << 12 | 0b0 << 8 | 0b00011, :drm, :drn
|
143
|
+
addop 'fdiv', 0b1111 << 12 | 0b0011, :frm, :frn
|
144
|
+
addop 'fipr', 0b1111 << 12 | 0b11101101, :fvm, :fvn
|
145
|
+
|
146
|
+
addop 'flds', 0b1111 << 12 | 0b00011101, :frn, :fpul
|
147
|
+
addop 'fldi0', 0b1111 << 12 | 0b10001101, :frn
|
148
|
+
addop 'fldi1', 0b1111 << 12 | 0b10011101, :frn
|
149
|
+
|
150
|
+
addop 'float', 0b1111 << 12 | 0b000101101, :fpul, :drn
|
151
|
+
addop 'float', 0b1111 << 12 | 0b00101101, :fpul, :frn
|
152
|
+
|
153
|
+
addop 'fmac', 0b1111 << 12 | 0b1110, :fr0, :frm, :frn
|
154
|
+
|
155
|
+
addop 'fmov', 0b1111 << 12 | 0b0 << 8 | 0b01100, :drm, :drn
|
156
|
+
addop 'fmov', 0b1111 << 12 | 0b1 << 8 | 0b01100, :drm, :xdn
|
157
|
+
addop 'fmov', 0b1111 << 12 | 0b01010, :drm, :@rn
|
158
|
+
addop 'fmov', 0b1111 << 12 | 0b01011, :drm, :@_rn
|
159
|
+
addop 'fmov', 0b1111 << 12 | 0b00111, :drm, :@r0rn
|
160
|
+
|
161
|
+
addop 'fmov.s', 0b1111 << 12 | 0b1100, :frm, :frn
|
162
|
+
addop 'fmov.s', 0b1111 << 12 | 0b1010, :frm, :@rn
|
163
|
+
addop 'fmov.s', 0b1111 << 12 | 0b1011, :frm, :@_rn
|
164
|
+
addop 'fmov.s', 0b1111 << 12 | 0b0111, :frm, :@r0rn
|
165
|
+
|
166
|
+
addop 'fmov', 0b1111 << 12 | 0b0 << 8 | 0b11100, :xdm, :drn
|
167
|
+
addop 'fmov', 0b1111 << 12 | 0b1 << 8 | 0b11100, :xdm, :xdn
|
168
|
+
addop 'fmov', 0b1111 << 12 | 0b11010, :xdm, :@rn
|
169
|
+
addop 'fmov', 0b1111 << 12 | 0b11011, :xdm, :@_rn
|
170
|
+
addop 'fmov', 0b1111 << 12 | 0b10111, :xdm, :@r0rn
|
171
|
+
|
172
|
+
addop 'fmov', 0b1111 << 12 | 0b0 << 8 | 0b1000, :@rm, :drn
|
173
|
+
addop 'fmov', 0b1111 << 12 | 0b0 << 8 | 0b1001, :@rm_, :drn
|
174
|
+
addop 'fmov', 0b1111 << 12 | 0b0 << 8 | 0b0110, :@r0rm, :drn
|
175
|
+
|
176
|
+
addop 'fmov.s', 0b1111 << 12 | 0b1000, :@rm, :frn
|
177
|
+
addop 'fmov.s', 0b1111 << 12 | 0b1001, :@rm_, :frn
|
178
|
+
addop 'fmov.s', 0b1111 << 12 | 0b0110, :@r0rm, :frn
|
179
|
+
|
180
|
+
addop 'fmov', 0b1111 << 12 | 0b1 << 8 | 0b1000, :@rm, :xdn
|
181
|
+
addop 'fmov', 0b1111 << 12 | 0b1 << 8 | 0b1001, :@rm_, :xdn
|
182
|
+
addop 'fmov', 0b1111 << 12 | 0b1 << 8 | 0b0110, :@r0rm, :xdn
|
183
|
+
|
184
|
+
addop 'fmul', 0b1111 << 12 | 0b0 << 8 | 0b00010, :drm, :drn
|
185
|
+
addop 'fmul', 0b1111 << 12 | 0b0010, :frm, :frn
|
186
|
+
|
187
|
+
addop 'fneg', 0b1111 << 12 | 0b001001101, :drn
|
188
|
+
addop 'fneg', 0b1111 << 12 | 0b01001101, :frn
|
189
|
+
|
190
|
+
addop 'frchg', 0b1111101111111101
|
191
|
+
addop 'fschg', 0b1111001111111101
|
192
|
+
|
193
|
+
addop 'fsqrt', 0b1111 << 12 | 0b001101101, :drn
|
194
|
+
addop 'fsqrt', 0b1111 << 12 | 0b01101101, :frn
|
195
|
+
addop 'fsts', 0b1111 << 12 | 0b00001101, :fpul, :frn
|
196
|
+
|
197
|
+
addop 'fsub', 0b1111 << 12 | 0b0 << 8 | 0b00001, :@drm, :drn
|
198
|
+
addop 'fsub', 0b1111 << 12 | 0b0001, :frm, :frn
|
199
|
+
|
200
|
+
addop 'ftrc', 0b1111 << 12 | 0b000111101, :drn, :fpul
|
201
|
+
addop 'ftrc', 0b1111 << 12 | 0b00111101, :frn, :fpul
|
202
|
+
addop 'ftrv', 0b1111 << 12 | 0b0111111101, :xmtrx, :fvn
|
203
|
+
|
204
|
+
addop 'jmp', 0b0100 << 12 | 0b00101011, :rn, :setip, :stopexec, :delay_slot
|
205
|
+
addop 'jsr', 0b0100 << 12 | 0b00001011, :rn, :setip, :saveip, :stopexec, :delay_slot
|
206
|
+
|
207
|
+
addop 'ldc', 0b0100 << 12 | 0b00011110, :rn, :gbr
|
208
|
+
addop 'ldc', 0b0100 << 12 | 0b00001110, :rn, :sr # privileged instruction
|
209
|
+
addop 'ldc', 0b0100 << 12 | 0b00101110, :rn, :vbr # privileged instruction
|
210
|
+
addop 'ldc', 0b0100 << 12 | 0b00111110, :rn, :ssr # privileged instruction
|
211
|
+
addop 'ldc', 0b0100 << 12 | 0b01001110, :rn, :spc # privileged instruction
|
212
|
+
addop 'ldc', 0b0100 << 12 | 0b11111010, :rn, :dbr # privileged instruction
|
213
|
+
addop 'ldc', 0b0100 << 12 | 0b1 << 7 | 0b1110, :rn, :rn_bank # privileged instruction
|
214
|
+
|
215
|
+
addop 'ldc.l', 0b0100 << 12 | 0b00010111, :@rn_, :gbr
|
216
|
+
addop 'ldc.l', 0b0100 << 12 | 0b00000111, :@rn_, :sr # privileged instruction
|
217
|
+
addop 'ldc.l', 0b0100 << 12 | 0b00100111, :@rn_, :vbr # privileged instruction
|
218
|
+
addop 'ldc.l', 0b0100 << 12 | 0b00110111, :@rn_, :ssr # privileged instruction
|
219
|
+
addop 'ldc.l', 0b0100 << 12 | 0b01000111, :@rn_, :spc # privileged instruction
|
220
|
+
addop 'ldc.l', 0b0100 << 12 | 0b11110110, :@rn_, :dbr # privileged instruction
|
221
|
+
addop 'ldc.l', 0b0100 << 12 | 0b1 << 7 | 0b0111, :@rn_, :rn_bank # privileged instruction
|
222
|
+
|
223
|
+
addop 'lds', 0b0100 << 12 | 0b01101010, :rn, :fpscr
|
224
|
+
addop 'lds.l', 0b0100 << 12 | 0b01100110, :@rn_, :fpscr
|
225
|
+
addop 'lds', 0b0100 << 12 | 0b01011010, :rn, :fpul
|
226
|
+
addop 'lds.l', 0b0100 << 12 | 0b01010110, :@rn_, :fpul
|
227
|
+
addop 'lds', 0b0100 << 12 | 0b00001010, :rn, :mach
|
228
|
+
addop 'lds.l', 0b0100 << 12 | 0b00000110, :@rn_, :mach
|
229
|
+
addop 'lds', 0b0100 << 12 | 0b00011010, :rn, :macl
|
230
|
+
addop 'lds.l', 0b0100 << 12 | 0b00010110, :@rn_, :macl
|
231
|
+
addop 'lds', 0b0100 << 12 | 0b00101010, :rn, :pr
|
232
|
+
addop 'lds.l', 0b0100 << 12 | 0b00100110, :@rn_, :pr
|
233
|
+
|
234
|
+
addop 'ldtlb', 0b0000000000111000
|
235
|
+
|
236
|
+
addop 'mac.l', 0b0000 << 12 | 0b1111, :@rm_, :@rn_
|
237
|
+
addop 'mac.w', 0b0100 << 12 | 0b1111, :@rm_, :@rn_
|
238
|
+
|
239
|
+
addop 'mov', 0b0110 << 12 | 0b0011, :rm, :rn
|
240
|
+
addop 'mov', 0b1110 << 12, :s8, :rn
|
241
|
+
|
242
|
+
addop 'mov.b', 0b0010 << 12 | 0b0000, :rm, :@rn
|
243
|
+
addop 'mov.b', 0b0010 << 12 | 0b0100, :rm, :@_rn
|
244
|
+
addop 'mov.b', 0b0000 << 12 | 0b0100, :rm, :@r0rn
|
245
|
+
addop 'mov.b', 0b11000000 << 8, :r0, :@dispgbr
|
246
|
+
addop 'mov.b', 0b10000000 << 8, :r0, :@dispr0rn
|
247
|
+
addop 'mov.b', 0b0110 << 12 | 0b0000, :@rm, :rn
|
248
|
+
addop 'mov.b', 0b0110 << 12 | 0b0100, :@rm_, :rn
|
249
|
+
addop 'mov.b', 0b0000 << 12 | 0b1100, :@r0rm, :rn
|
250
|
+
addop 'mov.b', 0b11000100 << 8, :@dispgbr, :r0
|
251
|
+
addop 'mov.b', 0b10000100 << 8, :@dispr0rn, :r0
|
252
|
+
|
253
|
+
addop 'mov.l', 0b0010 << 12 | 0b0010, :rm, :@rn
|
254
|
+
addop 'mov.l', 0b0010 << 12 | 0b0110, :rm, :@_rn
|
255
|
+
addop 'mov.l', 0b0000 << 12 | 0b0110, :rm, :@r0rn
|
256
|
+
addop 'mov.l', 0b11000010 << 8, :r0, :@dispgbr
|
257
|
+
addop 'mov.l', 0b0001 << 12, :rm, :@disprmrn
|
258
|
+
addop 'mov.l', 0b0110 << 12 | 0b0010, :@rm, :rn
|
259
|
+
addop 'mov.l', 0b0110 << 12 | 0b0110, :@rm_, :rn
|
260
|
+
addop 'mov.l', 0b0000 << 12 | 0b1110, :@r0rm, :rn
|
261
|
+
addop 'mov.l', 0b11000110 << 8, :@dispgbr, :r0
|
262
|
+
addop 'mov.l', 0b1101 << 12, :@disppc, :rn
|
263
|
+
addop 'mov.l', 0b0101 << 12, :@disprm, :rn
|
264
|
+
|
265
|
+
addop 'mov.w', 0b0010 << 12 | 0b0001, :rm, :@rn
|
266
|
+
addop 'mov.w', 0b0010 << 12 | 0b0101, :rm, :@_rn
|
267
|
+
addop 'mov.w', 0b0000 << 12 | 0b0101, :rm, :@r0rn
|
268
|
+
addop 'mov.w', 0b11000001 << 8, :r0, :@dispgbr
|
269
|
+
addop 'mov.w', 0b10000001 << 8, :r0, :@dispr0rn
|
270
|
+
addop 'mov.w', 0b0110 << 12 | 0b0001, :@rm, :rn
|
271
|
+
addop 'mov.w', 0b0110 << 12 | 0b0101, :@rm_, :rn
|
272
|
+
addop 'mov.w', 0b0000 << 12 | 0b1101, :@r0rm, :rn
|
273
|
+
addop 'mov.w', 0b11000101 << 8, :@dispgbr, :r0
|
274
|
+
addop 'mov.w', 0b1001 << 12, :@disppc, :rn
|
275
|
+
addop 'mov.w', 0b10000101 << 8, :@disprm, :r0
|
276
|
+
|
277
|
+
addop 'mova', 0b11000111 << 8, :disppc, :r0 # calculates an effective address using PC-relative with displacement addressing
|
278
|
+
addop 'movca.l', 0b0000 << 12 | 11000011, :r0, :@rn # stores the long-word in R0 to memory at the effective address specified in Rn.
|
279
|
+
|
280
|
+
addop 'movt', 0b0000 << 12 | 0b00101001, :rn # copies the T-bit to Rn
|
281
|
+
|
282
|
+
addop 'mul.l', 0b0000 << 12 | 0b0111, :rm, :rn
|
283
|
+
addop 'muls.w', 0b0010 << 12 | 0b1111, :rm, :rn
|
284
|
+
addop 'mulu.w', 0b0010 << 12 | 0b1110, :rm, :rn
|
285
|
+
|
286
|
+
addop 'neg', 0b0110 << 12 | 0b1011, :rm, :rn
|
287
|
+
addop 'negc', 0b0110 << 12 | 0b1010, :rm, :rn
|
288
|
+
|
289
|
+
addop 'nop', 0b0000000000001001
|
290
|
+
|
291
|
+
addop 'not', 0b0110 << 12 | 0b0111, :rm, :rn
|
292
|
+
|
293
|
+
addop 'ocbi', 0b0000 << 12 | 0b10010011, :@rn # invalidates an operand cache block
|
294
|
+
addop 'ocbp', 0b0000 << 12 | 0b10100011, :@rn # purges an operand cache block
|
295
|
+
addop 'ocbwb', 0b0000 << 12 | 0b10110011, :@rn # write-backs an operand cache block
|
296
|
+
|
297
|
+
addop 'or', 0b0010 << 12 | 0b1011, :rm, :rn
|
298
|
+
addop 'or', 0b11001011 << 8, :i8, :r0
|
299
|
+
addop 'or.b', 0b11001111 << 8, :i8, :@r0gbr
|
300
|
+
|
301
|
+
addop 'pref', 0b0000 | 0b10000011, :@rn # indicates a software-directed data prefetch
|
302
|
+
|
303
|
+
addop 'rotcl', 0b0100 | 0b00100100, :rn
|
304
|
+
addop 'rotcr', 0b0100 | 0b00100101, :rn
|
305
|
+
addop 'rotl', 0b0100 | 0b00000100, :rn
|
306
|
+
addop 'rotr', 0b0100 | 0b00000101, :rn
|
307
|
+
|
308
|
+
addop 'rte', 0b0000000000101011, :setip, :stopexec, :delay_slot # returns from an exception or interrupt handling routine, privileged instruction
|
309
|
+
addop 'rts', 0b0000000000001011, :setip, :stopexec, :delay_slot # returns from a subroutine
|
310
|
+
|
311
|
+
addop 'sets', 0b0000000001011000
|
312
|
+
addop 'sett', 0b0000000000011000
|
313
|
+
|
314
|
+
addop 'shad', 0b0100 << 12 | 0b1100, :rm, :rn
|
315
|
+
addop 'shal', 0b0100 << 12 | 0b00100000, :rn
|
316
|
+
addop 'shar', 0b0100 << 12 | 0b00100001, :rn
|
317
|
+
addop 'shld', 0b0100 << 12 | 0b1101, :rm, :rn
|
318
|
+
addop 'shll', 0b0100 << 12 | 0b00000000, :rn
|
319
|
+
addop 'shll2', 0b0100 << 12 | 0b00001000, :rn
|
320
|
+
addop 'shll8', 0b0100 << 12 | 0b00011000, :rn
|
321
|
+
addop 'shll16', 0b0100 << 12 | 0b00101000, :rn
|
322
|
+
addop 'shlr', 0b0100 << 12 | 0b00000001, :rn
|
323
|
+
addop 'shlr2', 0b0100 << 12 | 0b00001001, :rn
|
324
|
+
addop 'shlr8', 0b0100 << 12 | 0b00011001, :rn
|
325
|
+
addop 'shlr16', 0b0100 << 12 | 0b00101001, :rn
|
326
|
+
|
327
|
+
addop 'sleep', 0b0000000000011011 # privileged instruction
|
328
|
+
|
329
|
+
addop 'stc', 0b0000 << 12 | 0b00000010, :sr, :rn
|
330
|
+
addop 'stc', 0b0000 << 12 | 0b00100010, :vbr, :rn
|
331
|
+
addop 'stc', 0b0000 << 12 | 0b00110010, :ssr, :rn
|
332
|
+
addop 'stc', 0b0000 << 12 | 0b01000010, :spc, :rn
|
333
|
+
addop 'stc', 0b0000 << 12 | 0b00111010, :sgr, :rn
|
334
|
+
addop 'stc', 0b0000 << 12 | 0b11111010, :dbr, :rn
|
335
|
+
addop 'stc', 0b0000 << 12 | 0b1 << 7 | 0b0010, :rm_bank, :@_rn
|
336
|
+
addop 'stc', 0b0000 << 12 | 0b00010010, :gbr, :rn
|
337
|
+
|
338
|
+
addop 'stc.l', 0b0100 << 12 | 0b00000011, :sr, :@_rn
|
339
|
+
addop 'stc.l', 0b0100 << 12 | 0b00100011, :vbr, :@_rn
|
340
|
+
addop 'stc.l', 0b0100 << 12 | 0b00110011, :ssr, :@_rn
|
341
|
+
addop 'stc.l', 0b0100 << 12 | 0b01000011, :spc, :@_rn
|
342
|
+
addop 'stc.l', 0b0100 << 12 | 0b00110010, :sgr, :@_rn
|
343
|
+
addop 'stc.l', 0b0100 << 12 | 0b11110010, :dbr, :@_rn
|
344
|
+
addop 'stc.l', 0b0100 << 12 | 0b1 << 7 | 0b0011, :rm_bank, :@_rn
|
345
|
+
addop 'stc.l', 0b0100 << 12 | 0b00010011, :gbr, :@_rn
|
346
|
+
|
347
|
+
addop 'sts', 0b0000 << 12 | 0b01101010, :fpscr, :rn
|
348
|
+
addop 'sts.l', 0b0100 << 12 | 0b01100010, :fpscr, :@_rn
|
349
|
+
addop 'sts', 0b0000 << 12 | 0b01011010, :fpul, :rn
|
350
|
+
addop 'sts.l', 0b0100 << 12 | 0b01010010, :fpul, :@_rn
|
351
|
+
addop 'sts', 0b0000 << 12 | 0b00001010, :mach, :rn
|
352
|
+
addop 'sts.l', 0b0100 << 12 | 0b00000010, :mach, :@_rn
|
353
|
+
addop 'sts', 0b0000 << 12 | 0b00011010, :macl, :rn
|
354
|
+
addop 'sts.l', 0b0100 << 12 | 0b00010010, :macl, :@_rn
|
355
|
+
addop 'sts', 0b0000 << 12 | 0b00101010, :pr, :rn
|
356
|
+
addop 'sts.l', 0b0100 << 12 | 0b00100010, :pr, :@_rn
|
357
|
+
|
358
|
+
addop 'sub', 0b0011 << 12 | 0b1000, :rm, :rn
|
359
|
+
addop 'subc', 0b0011 << 12 | 0b1010, :rm, :rn
|
360
|
+
addop 'subv', 0b0011 << 12 | 0b1011, :rm, :rn
|
361
|
+
|
362
|
+
addop 'swap.b', 0b0110 << 12 | 0b1000, :rm, :rn
|
363
|
+
addop 'swap.w', 0b0110 << 12 | 0b1001, :rm, :rn
|
364
|
+
|
365
|
+
addop 'tas.b', 0b0100 << 12 | 0b00011011, :@rn
|
366
|
+
addop 'trapa', 0b11000011 << 8, :i8, :setip, :stopexec # This instruction causes a pre-execution trap.
|
367
|
+
|
368
|
+
addop 'tst', 0b0010 << 12 | 0b1000, :rm, :rn
|
369
|
+
addop 'tst', 0b11001000 << 8, :i8, :r0
|
370
|
+
addop 'tst.b', 0b11001100 << 8, :i8, :@r0gbr
|
371
|
+
|
372
|
+
addop 'xor', 0b0010 << 12 | 0b1010, :rm, :rn
|
373
|
+
addop 'xor', 0b11001010 << 8, :i8, :r0
|
374
|
+
addop 'xob.b', 0b11001110 << 8, :i8, :@r0gbr
|
375
|
+
|
376
|
+
addop 'xtrct', 0b0010 << 12 | 0b1101, :rm, :rn
|
377
|
+
end
|
378
|
+
|
379
|
+
end
|
380
|
+
|
381
|
+
end
|