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: 94839a8d70f8124e207b1c57efcefd4b97bc0b981a38f9319fddce27510954c7
4
- data.tar.gz: 257358df8104b1e130361095b6d2c25f6fdac542918af69687313cc00a7bd4d2
3
+ metadata.gz: 0c7b411e21f2b93443cb22e7461437c8ab98df8acc4fd56538d64c8fc0d7c828
4
+ data.tar.gz: 05747db808c1d5accc8b42ee6681b2a617feb89437bf244e389420740a3d4da0
5
5
  SHA512:
6
- metadata.gz: 91804940ae6a1182841aa27d781c410ecae3644500c64907119409ae019e192c75d79bc3ef661ea8aac56b27113fce6ca2bb54c487cd0684f702a42913e445c7
7
- data.tar.gz: 6e05374e4e6b0f279aedc8e3087d21bc0bfbc919b431453fd7f1382a0fa39777a37f3e65cfd646576cb806fc0cc07f119649ae080ad6d3b495d372e60c93ca8c
6
+ metadata.gz: 0a302052eb6c01c1f6812e98b8492fc455077746effb6e6d6133a411eb179b157ecf3bc1a4bcd38e85e1a1dc2aea52dee4cfd7088b9212b73df6f0912ac9d1fc
7
+ data.tar.gz: af2d6fb1f53eae49d7121fc90048d1bc5766316bc302fd910bc1702cf4dab3f43fd09ee01433fbb11f8ec4419de7191a0cc02fd64bb43f8c998173c78acc0237
@@ -11,32 +11,44 @@ end
11
11
 
12
12
  @instructions = [
13
13
  { keyword: "mov",
14
- operands: [{type: "register", restrictions: {reg_size: 64}}, {type: "immediate", restrictions: {}}],
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, 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
- operands: [{type: "register", restrictions: {reg_size: 64}}, {type: "register", restrictions: {reg_size: 64}}],
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, 1]
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
- operands: [{type: "register", restrictions: {reg_size: 64}}, {type: "register", restrictions: {reg_size: 64}}],
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, 1]
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: {reg_size: 64}}, {type: "register", restrictions: {reg_size: 64}}, {type: "immediate", 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,1]
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: {reg_size: 64}}, {type: "register", restrictions: {reg_size: 64}}, {type: "register", restrictions: {reg_size: 64}}],
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, 1], # sf at the end
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
- operands: [{type: "register", restrictions: {reg_size: 64}}, {type: "label"}],
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
- operands: [{type: "register", restrictions: {reg_size: 64}}, {type: "label"}],
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
- ["if_eq_else", ["modulo", ["subtract", ["get_label_address", ["get_operand", 1]], ["get_current_address"]], 4], 0, [], ["raise_error", "Can't represent address for LDR - offset not divisible by 4 bytes."]], # Check if address is accessible
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", ["subtract", ["get_label_address", ["get_operand", 1]], ["get_current_address"]], 4], 0, 19],
295
-
296
- ["bits", 0,0,0,1,1,0,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", "stp Error: Register sizes are not the same"]],
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", "stp Error: The immediate offset is not properly aligned"]],
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", "stp Error: Register sizes are not the same"]],
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", "stp Error: The immediate offset is not properly aligned"]],
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", "stp Error: Register sizes are not the same"]],
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", "stp Error: The immediate offset is not properly aligned"]],
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"},
@@ -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.1
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-13 00:00:00.000000000 Z
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