kompiler 0.3.0.pre.1 → 0.3.0.pre.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c7b411e21f2b93443cb22e7461437c8ab98df8acc4fd56538d64c8fc0d7c828
|
4
|
+
data.tar.gz: 05747db808c1d5accc8b42ee6681b2a617feb89437bf244e389420740a3d4da0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a302052eb6c01c1f6812e98b8492fc455077746effb6e6d6133a411eb179b157ecf3bc1a4bcd38e85e1a1dc2aea52dee4cfd7088b9212b73df6f0912ac9d1fc
|
7
|
+
data.tar.gz: af2d6fb1f53eae49d7121fc90048d1bc5766316bc302fd910bc1702cf4dab3f43fd09ee01433fbb11f8ec4419de7191a0cc02fd64bb43f8c998173c78acc0237
|
@@ -11,32 +11,44 @@ end
|
|
11
11
|
|
12
12
|
@instructions = [
|
13
13
|
{ keyword: "mov",
|
14
|
-
|
14
|
+
name: "Move (immediate)",
|
15
|
+
description: "Moves an immediate value to the destination register",
|
16
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "immediate", restrictions: {}, name: "Immediate value"}],
|
15
17
|
mc_constructor: [
|
16
18
|
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
17
19
|
["get_bits", ["get_operand", 1], 0, 16],
|
18
|
-
["bits", 0,0, 1,0,1,0,0,1, 0,1,
|
20
|
+
["bits", 0,0, 1,0,1,0,0,1, 0,1],
|
21
|
+
["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], 0],
|
19
22
|
],
|
20
23
|
bitsize: 32
|
21
24
|
},
|
22
25
|
{ keyword: "mov",
|
23
|
-
|
26
|
+
name: "Move (register)",
|
27
|
+
description: "Copies the value in the source register to the destination register",
|
28
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_type: "gpr"}, name: "Source"}],
|
24
29
|
mc_constructor: [
|
30
|
+
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "mov Error: Register sizes are not the same"]],
|
25
31
|
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5], # Rd
|
26
32
|
["bits", 1,1,1,1,1], # rn
|
27
33
|
["bits", 0,0,0,0,0,0], # imm6
|
28
34
|
["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rm
|
29
|
-
["bits", 0, 0,0, 0,1,0,1,0,1,0,
|
35
|
+
["bits", 0, 0,0, 0,1,0,1,0,1,0],
|
36
|
+
["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], 0],
|
30
37
|
],
|
31
38
|
bitsize: 32
|
32
39
|
},
|
33
40
|
{ keyword: "mov_sp",
|
34
|
-
|
41
|
+
name: "Move (to/from SP)",
|
42
|
+
description: "Move between a general-purpose register and the stack pointer.",
|
43
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}}, {type: "register", restrictions: {reg_type: "gpr"}}],
|
35
44
|
mc_constructor: [
|
45
|
+
# Get the non-SP register
|
46
|
+
["if_eq_else", ["downcase_str", ["get_key", ["get_operand", 0], :reg_name]], "sp", ["set_var", "non_sp_reg", ["get_operand", 1]], ["set_var", "non_sp_reg", ["get_operand", 0]]],
|
36
47
|
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5], # Rd
|
37
48
|
["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rn
|
38
49
|
["get_bits", 0, 0, 12], # imm12 as ones
|
39
|
-
["bits", 0, 0,1,0,0,0,1, 0, 0,
|
50
|
+
["bits", 0, 0,1,0,0,0,1, 0, 0],
|
51
|
+
["case", ["get_key", ["get_var", "non_sp_reg"], :reg_size], 64, ["bits", 1], 32, ["bits", 0], 0],
|
40
52
|
],
|
41
53
|
bitsize: 32
|
42
54
|
},
|
@@ -64,23 +76,17 @@ end
|
|
64
76
|
],
|
65
77
|
bitsize: 32
|
66
78
|
},
|
67
|
-
{ keyword: "mov",
|
68
|
-
operands: [{type: "register", restrictions: {reg_size: 32}}, {type: "immediate", restrictions: {}}],
|
69
|
-
mc_constructor: [
|
70
|
-
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
71
|
-
["get_bits", ["get_operand", 1], 0, 16],
|
72
|
-
["bits", 0,0, 1,0,1,0,0,1, 0,1, 0]
|
73
|
-
],
|
74
|
-
bitsize: 32
|
75
|
-
},
|
76
79
|
{
|
77
80
|
keyword: "add",
|
78
|
-
operands: [{type: "register", restrictions: {
|
81
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}}, {type: "register", restrictions: {reg_type: "gpr"}}, {type: "immediate"}],
|
79
82
|
mc_constructor: [
|
83
|
+
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "add Error: Register sizes are not the same"]],
|
84
|
+
|
80
85
|
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
81
86
|
["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
|
82
87
|
["get_bits", ["get_operand", 2], 0, 12],
|
83
|
-
["bits", 0, 0,1,0,0,0,1,0,0,
|
88
|
+
["bits", 0, 0,1,0,0,0,1,0,0],
|
89
|
+
["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []], # sf
|
84
90
|
],
|
85
91
|
bitsize: 32
|
86
92
|
},
|
@@ -89,15 +95,20 @@ end
|
|
89
95
|
keyword: "add",
|
90
96
|
name: "ADD (registers)",
|
91
97
|
description: "Adds two source registers and writes the result to the destination register",
|
92
|
-
operands: [{type: "register", restrictions: {
|
98
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}}, {type: "register", restrictions: {reg_type: "gpr"}}, {type: "register", restrictions: {reg_type: "gpr"}}],
|
93
99
|
mc_constructor: [
|
100
|
+
# Make sure register sizes are the same
|
101
|
+
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "add Error: Register sizes are not the same"]],
|
102
|
+
["if_eq_else", ["get_key", ["get_operand", 1], :reg_size], ["get_key", ["get_operand", 2], :reg_size], [], ["raise_error", "add Error: Register sizes are not the same"]],
|
103
|
+
|
94
104
|
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5], # Rd
|
95
105
|
["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rn
|
96
106
|
["get_bits", 0, 0, 6], # imm6
|
97
107
|
["get_bits", ["encode_gp_register", ["get_operand", 2]], 0, 5], # Rm
|
98
108
|
["bits", 0],
|
99
109
|
["bits", 0,0], # shift
|
100
|
-
["bits", 1,1,0,1,0, 0, 0
|
110
|
+
["bits", 1,1,0,1,0, 0, 0],
|
111
|
+
["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []], # sf
|
101
112
|
],
|
102
113
|
bitsize: 32
|
103
114
|
},
|
@@ -141,7 +152,9 @@ end
|
|
141
152
|
|
142
153
|
{
|
143
154
|
keyword: "adr",
|
144
|
-
|
155
|
+
name: "Address (label)",
|
156
|
+
description: "Writes the address of the specified label to the destination register through PC-relative computations.",
|
157
|
+
operands: [{type: "register", restrictions: {reg_size: 64}, name: "Destination"}, {type: "label", name: "Label"}],
|
145
158
|
mc_constructor: [
|
146
159
|
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
147
160
|
["get_bits", ["subtract", ["get_label_address", ["get_operand", 1]], ["get_current_address"]], 2, 19],
|
@@ -151,6 +164,20 @@ end
|
|
151
164
|
],
|
152
165
|
bitsize: 32
|
153
166
|
},
|
167
|
+
{
|
168
|
+
keyword: "adr",
|
169
|
+
name: "Address (immediate)",
|
170
|
+
description: "Adds an immediate value to the PC Value, and writes the result to the destination register.",
|
171
|
+
operands: [{type: "register", restrictions: {reg_size: 64}, name: "Destination"}, {type: "immediate", name: "Immediate Offset"}],
|
172
|
+
mc_constructor: [
|
173
|
+
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
174
|
+
["get_bits", ["get_operand", 1], 2, 19],
|
175
|
+
["bits", 0,0,0,0,1],
|
176
|
+
["get_bits", ["get_operand", 1], 0, 2],
|
177
|
+
["bits", 0],
|
178
|
+
],
|
179
|
+
bitsize: 32
|
180
|
+
},
|
154
181
|
{
|
155
182
|
keyword: "b",
|
156
183
|
operands: [{type: "immediate"}],
|
@@ -281,19 +308,38 @@ end
|
|
281
308
|
bitsize: 32
|
282
309
|
},
|
283
310
|
|
284
|
-
|
285
|
-
|
286
311
|
{
|
287
|
-
# LDR immediate
|
288
312
|
keyword: "ldr",
|
289
|
-
|
313
|
+
name: "Load Register (literal, immediate)",
|
314
|
+
description: "Calculates an adress from the PC value and an immediate offset, loads a word from memory, and writes it to a register.",
|
315
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}}, {type: "immediate"}],
|
316
|
+
mc_constructor: [
|
317
|
+
["if_eq_else", ["modulo", ["get_operand", 1], 4], 0, [], ["raise_error", "ldr (immediate) Error: Immediate offset is not divisible by four."]], # Check if the immediate offset is right
|
318
|
+
|
319
|
+
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
320
|
+
["get_bits", ["divide", ["get_operand", 1], 4], 0, 19],
|
321
|
+
["bits", 0,0,0,1,1,0],
|
322
|
+
["case", ["get_key", ["get_operand", 0], :reg_size], 32, ["bits", 0], 64, ["bits", 1], 0], # opc size bit
|
323
|
+
["bits", 0], # opc second bit
|
324
|
+
],
|
325
|
+
bitsize: 32
|
326
|
+
},
|
327
|
+
{
|
328
|
+
keyword: "ldr",
|
329
|
+
name: "Load Register (literal, label)",
|
330
|
+
description: "Loads a word from memory at the address specified by the label, and writes it to a register.",
|
331
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}}, {type: "label"}],
|
290
332
|
mc_constructor: [
|
291
|
-
["
|
333
|
+
["set_var", "immediate_offset", ["subtract", ["get_label_address", ["get_operand", 1]], ["get_current_address"]]],
|
334
|
+
|
335
|
+
["if_eq_else", ["modulo", ["get_var", "immediate_offset"], 4], 0, [], ["raise_error", "ldr (label) Error: Label not accessible (not divisible by four)."]], # Check if address is accessible
|
292
336
|
|
293
337
|
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
294
|
-
["get_bits", ["divide", ["
|
295
|
-
|
296
|
-
["bits", 0,0,0,1,1,0
|
338
|
+
["get_bits", ["divide", ["get_var", "immediate_offset"], 4], 0, 19],
|
339
|
+
|
340
|
+
["bits", 0,0,0,1,1,0],
|
341
|
+
["case", ["get_key", ["get_operand", 0], :reg_size], 32, ["bits", 0], 64, ["bits", 1], 0], # opc size bit
|
342
|
+
["bits", 0], # opc second bit
|
297
343
|
],
|
298
344
|
bitsize: 32
|
299
345
|
},
|
@@ -317,7 +363,7 @@ end
|
|
317
363
|
{
|
318
364
|
keyword: "ldr_unsigned",
|
319
365
|
name: "Load Register (immediate), unsigned offset",
|
320
|
-
description: "Loads 4 or 8 bytes from memory at the address in the second register with an unsigned immediate offset, and writes it to the destination register",
|
366
|
+
description: "Loads 4 or 8 bytes from memory at the address in the second register, with an unsigned immediate offset added, and writes it to the destination register.",
|
321
367
|
operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_type: "gpr", reg_size: 64}, name: "Source address"}, {type: "immediate", name: "Offset"}],
|
322
368
|
mc_constructor: [
|
323
369
|
["case", ["get_key", ["get_operand", 0], :reg_size],
|
@@ -340,6 +386,38 @@ end
|
|
340
386
|
],
|
341
387
|
bitsize: 32
|
342
388
|
},
|
389
|
+
{
|
390
|
+
keyword: "ldr_post_index",
|
391
|
+
name: "Load Register (immediate), post-index",
|
392
|
+
description: "Loads 4 or 8 bytes from memory at the address in the second register, with an immediate value added permanently after reading, and writes it to the destination register.",
|
393
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_type: "gpr", reg_size: 64}, name: "Source address"}, {type: "immediate", name: "Address Offset"}],
|
394
|
+
mc_constructor: [
|
395
|
+
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
396
|
+
["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
|
397
|
+
["bits", 1,0],
|
398
|
+
["get_bits", ["get_operand", 2], 0, 9],
|
399
|
+
["bits", 0, 1,0, 0,0, 0, 1,1,1],
|
400
|
+
["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []],
|
401
|
+
["bits", 1],
|
402
|
+
],
|
403
|
+
bitsize: 32
|
404
|
+
},
|
405
|
+
{
|
406
|
+
keyword: "ldr_pre_index",
|
407
|
+
name: "Load Register (immediate), pre-index",
|
408
|
+
description: "Loads 4 or 8 bytes from memory at the address in the second register, with an immediate value added permanently before reading, and writes it to the destination register.",
|
409
|
+
operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_type: "gpr", reg_size: 64}, name: "Source address"}, {type: "immediate", name: "Address Offset"}],
|
410
|
+
mc_constructor: [
|
411
|
+
["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
|
412
|
+
["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
|
413
|
+
["bits", 1,1],
|
414
|
+
["get_bits", ["get_operand", 2], 0, 9],
|
415
|
+
["bits", 0, 1,0, 0,0, 0, 1,1,1],
|
416
|
+
["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []],
|
417
|
+
["bits", 1],
|
418
|
+
],
|
419
|
+
bitsize: 32
|
420
|
+
},
|
343
421
|
|
344
422
|
{
|
345
423
|
keyword: "ldrb",
|
@@ -613,11 +691,11 @@ end
|
|
613
691
|
bitsize: 32,
|
614
692
|
mc_constructor: [
|
615
693
|
# Check for register sizes
|
616
|
-
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "
|
694
|
+
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "stp_signed Error: Register sizes are not the same"]],
|
617
695
|
# Establish the immediate offset alignment using the register size
|
618
696
|
["set_var", "imm_alignment", ["case", ["get_key", ["get_operand", 0], :reg_size], 32, 4, 64, 8, 0]],
|
619
697
|
# Check if the immediate offset is properly aligned
|
620
|
-
["if_eq_else", ["modulo", ["get_operand", 3], ["get_var", "imm_alignment"]], 0, [], ["raise_error", "
|
698
|
+
["if_eq_else", ["modulo", ["get_operand", 3], ["get_var", "imm_alignment"]], 0, [], ["raise_error", "stp_signed Error: The immediate offset is not properly aligned"]],
|
621
699
|
|
622
700
|
["get_bits", ["get_key", ["get_operand", 0], :reg_value], 0, 5],
|
623
701
|
["get_bits", ["get_key", ["get_operand", 2], :reg_value], 0, 5],
|
@@ -635,11 +713,11 @@ end
|
|
635
713
|
bitsize: 32,
|
636
714
|
mc_constructor: [
|
637
715
|
# Check for register sizes
|
638
|
-
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "
|
716
|
+
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "stp_pre_index Error: Register sizes are not the same"]],
|
639
717
|
# Establish the immediate offset alignment using the register size
|
640
718
|
["set_var", "imm_alignment", ["case", ["get_key", ["get_operand", 0], :reg_size], 32, 4, 64, 8, 0]],
|
641
719
|
# Check if the immediate offset is properly aligned
|
642
|
-
["if_eq_else", ["modulo", ["get_operand", 3], ["get_var", "imm_alignment"]], 0, [], ["raise_error", "
|
720
|
+
["if_eq_else", ["modulo", ["get_operand", 3], ["get_var", "imm_alignment"]], 0, [], ["raise_error", "stp_pre_index Error: The immediate offset is not properly aligned"]],
|
643
721
|
|
644
722
|
["get_bits", ["get_key", ["get_operand", 0], :reg_value], 0, 5],
|
645
723
|
["get_bits", ["get_key", ["get_operand", 2], :reg_value], 0, 5],
|
@@ -657,11 +735,11 @@ end
|
|
657
735
|
bitsize: 32,
|
658
736
|
mc_constructor: [
|
659
737
|
# Check for register sizes
|
660
|
-
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "
|
738
|
+
["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "stp_post_index Error: Register sizes are not the same"]],
|
661
739
|
# Establish the immediate offset alignment using the register size
|
662
740
|
["set_var", "imm_alignment", ["case", ["get_key", ["get_operand", 0], :reg_size], 32, 4, 64, 8, 0]],
|
663
741
|
# Check if the immediate offset is properly aligned
|
664
|
-
["if_eq_else", ["modulo", ["get_operand", 3], ["get_var", "imm_alignment"]], 0, [], ["raise_error", "
|
742
|
+
["if_eq_else", ["modulo", ["get_operand", 3], ["get_var", "imm_alignment"]], 0, [], ["raise_error", "stp_post_index Error: The immediate offset is not properly aligned"]],
|
665
743
|
|
666
744
|
["get_bits", ["get_key", ["get_operand", 0], :reg_value], 0, 5],
|
667
745
|
["get_bits", ["get_key", ["get_operand", 2], :reg_value], 0, 5],
|
@@ -846,6 +924,37 @@ end
|
|
846
924
|
bitsize: 32
|
847
925
|
},
|
848
926
|
|
927
|
+
{
|
928
|
+
keyword: "sev",
|
929
|
+
name: "Send Event",
|
930
|
+
description: "A hint instruction that causes an event to be signalled to all cores in a multiprocessor system.",
|
931
|
+
operands: [],
|
932
|
+
mc_constructor: [
|
933
|
+
["bits", 1,1,1,1,1, 0,0,1, 0,0,0,0, 0,1,0,0, 1,1,0, 0,0, 0, 0,0,1,0,1,0,1,0,1,1]
|
934
|
+
],
|
935
|
+
bitsize: 32
|
936
|
+
},
|
937
|
+
{
|
938
|
+
keyword: "wfe",
|
939
|
+
name: "Wait For Event",
|
940
|
+
description: "A hint instruction that indicates that the PE can enter a low-power state and remain there until a wakeup event occurs. Wakeup events include the event signaled using SEV.",
|
941
|
+
operands: [],
|
942
|
+
mc_constructor: [
|
943
|
+
["bits", 1,1,1,1,1, 0,1,0, 0,0,0,0, 0,1,0,0, 1,1,0, 0,0, 0, 0,0,1,0,1,0,1,0,1,1]
|
944
|
+
],
|
945
|
+
bitsize: 32
|
946
|
+
},
|
947
|
+
{
|
948
|
+
keyword: "wfi",
|
949
|
+
name: "Wait For Interrupt",
|
950
|
+
description: "A hint instruction that indicates that the PE can enter a low-power state and remain there until a wakeup event occurs.",
|
951
|
+
operands: [],
|
952
|
+
mc_constructor: [
|
953
|
+
["bits", 1,1,1,1,1, 1,1,0, 0,0,0,0, 0,1,0,0, 1,1,0, 0,0, 0, 0,0,1,0,1,0,1,0,1,1]
|
954
|
+
],
|
955
|
+
bitsize: 32
|
956
|
+
},
|
957
|
+
|
849
958
|
|
850
959
|
#
|
851
960
|
# B.cond instructions
|
@@ -17,6 +17,42 @@ end
|
|
17
17
|
{reg_name: "vbar_el2", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b100, "CRn"=>0b1100, "CRm"=>0, "op2"=>0}, rw_type: "rw"},
|
18
18
|
{reg_name: "vbar_el3", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b110, "CRn"=>0b1100, "CRm"=>0, "op2"=>0}, rw_type: "rw"},
|
19
19
|
|
20
|
+
{reg_name: "currentEL", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b0100, "CRm"=>0b0010, "op2"=>0b010}},
|
21
|
+
|
22
|
+
{reg_name: "SPSR_EL1", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b0100, "CRm"=>0b0000, "op2"=>0b000}},
|
23
|
+
{reg_name: "SPSR_EL12", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b101, "CRn"=>0b0100, "CRm"=>0b0000, "op2"=>0b000}},
|
24
|
+
{reg_name: "SPSR_EL2", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b100, "CRn"=>0b0100, "CRm"=>0b0000, "op2"=>0b000}},
|
25
|
+
{reg_name: "SPSR_EL3", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b110, "CRn"=>0b0100, "CRm"=>0b0000, "op2"=>0b000}},
|
26
|
+
|
27
|
+
{reg_name: "ELR_EL1", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b0100, "CRm"=>0b0000, "op2"=>0b001}},
|
28
|
+
{reg_name: "ELR_EL12", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b101, "CRn"=>0b0100, "CRm"=>0b0000, "op2"=>0b001}},
|
29
|
+
{reg_name: "ELR_EL2", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b100, "CRn"=>0b0100, "CRm"=>0b0000, "op2"=>0b001}},
|
30
|
+
{reg_name: "ELR_EL3", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b110, "CRn"=>0b0100, "CRm"=>0b0000, "op2"=>0b001}},
|
31
|
+
|
32
|
+
{reg_name: "SCTLR_EL1", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b0001, "CRm"=>0b0000, "op2"=>0b000}},
|
33
|
+
{reg_name: "SCTLR_EL12", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b101, "CRn"=>0b0001, "CRm"=>0b0000, "op2"=>0b000}},
|
34
|
+
{reg_name: "SCTLR_EL2", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b100, "CRn"=>0b0001, "CRm"=>0b0000, "op2"=>0b000}},
|
35
|
+
{reg_name: "SCTLR_EL3", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b110, "CRn"=>0b0001, "CRm"=>0b0000, "op2"=>0b000}},
|
36
|
+
|
37
|
+
{reg_name: "SCTLR2_EL1", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b0001, "CRm"=>0b0000, "op2"=>0b011}},
|
38
|
+
{reg_name: "SCTLR2_EL12", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b101, "CRn"=>0b0001, "CRm"=>0b0000, "op2"=>0b011}},
|
39
|
+
{reg_name: "SCTLR2_EL2", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b100, "CRn"=>0b0001, "CRm"=>0b0000, "op2"=>0b011}},
|
40
|
+
{reg_name: "SCTLR2_EL3", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b110, "CRn"=>0b0001, "CRm"=>0b0000, "op2"=>0b011}},
|
41
|
+
|
42
|
+
{reg_name: "HCR_EL2", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b100, "CRn"=>0b0001, "CRm"=>0b0001, "op2"=>0b000}},
|
43
|
+
|
44
|
+
{reg_name: "ESR_EL1", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b0101, "CRm"=>0b0010, "op2"=>0b000}},
|
45
|
+
{reg_name: "ESR_EL2", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b100, "CRn"=>0b0101, "CRm"=>0b0010, "op2"=>0b000}},
|
46
|
+
{reg_name: "ESR_EL3", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b110, "CRn"=>0b0101, "CRm"=>0b0010, "op2"=>0b000}},
|
47
|
+
|
48
|
+
{reg_name: "SPSel", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b0100, "CRm"=>0b0010, "op2"=>0b000}},
|
49
|
+
|
50
|
+
|
51
|
+
{reg_name: "SP_EL0", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b0100, "CRm"=>0b0001, "op2"=>0b000}},
|
52
|
+
{reg_name: "SP_EL1", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b100, "CRn"=>0b0100, "CRm"=>0b0001, "op2"=>0b000}},
|
53
|
+
{reg_name: "SP_EL2", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b110, "CRn"=>0b0100, "CRm"=>0b0001, "op2"=>0b000}},
|
54
|
+
|
55
|
+
{reg_name: "ISR_EL1", reg_size: 64, reg_type: "sr", reg_encoding: {"op0"=>0b11, "op1"=>0b000, "CRn"=>0b1100, "CRm"=>0b0001, "op2"=>0b000}},
|
20
56
|
|
21
57
|
# Special registers for the MSR (immediate) instruction (some of them were previously defined already)
|
22
58
|
{reg_name: "SPSel", reg_type: "pstate_reg"},
|
data/lib/kompiler/parsers.rb
CHANGED
@@ -303,8 +303,8 @@ def self.parse_instruction_line(line)
|
|
303
303
|
i += 1
|
304
304
|
end
|
305
305
|
|
306
|
-
# After operand content was collected, add it to the list of operands
|
307
|
-
operand_strings << operand_content
|
306
|
+
# After operand content was collected, add it to the list of operands if the content isn't empty
|
307
|
+
operand_strings << operand_content if operand_content.size != 0
|
308
308
|
end
|
309
309
|
|
310
310
|
# Parse operand strings into operand types and values
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kompiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.0.pre.
|
4
|
+
version: 0.3.0.pre.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyryl Shyshko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-12-
|
11
|
+
date: 2024-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'Kompiler is a low-level, modular and extendable compiler for any architecture.
|
14
14
|
By default Kompiler supports ARMv8-a, but other architecture extensions can be downloaded
|