kompiler 0.2.0.pre.1 → 0.2.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36f0387094d41fc93e8f85e56446392a1941cbcd115bf94c3ffd799c3d85cc78
4
- data.tar.gz: 63a7973c95797b77119b47f24b8aa5bda591d7d2a4e5cbd5e34485fb11aea9b7
3
+ metadata.gz: 69b1e8272e45a6c9ce0b8bb60dbfb89b0d65d0f8f615cbd744726857ecf1d94f
4
+ data.tar.gz: eba0c518a787b345d191a2cf41e76ecb52ca25dac10f14f17b72d5cbbcb2f201
5
5
  SHA512:
6
- metadata.gz: 761aed3357cef9084d7dc0e7d8f9a73bb6dc883c7b1fc2cb5b0ee8b6499aa3f1f972bcc48d8d8adb2a3bd7f793738b28c1a37a21c17152d958cb79e39c7f8dab
7
- data.tar.gz: dae7000f44475fdcb2c6c8e78c82f638ca09790c4442706ddeb57b5f76a41f30786bec6fd6e1620c5eba95999c283c5ed8083161d258562ba4672651a2caab54
6
+ metadata.gz: a325a47eff59b3766cead44c9e81063773af594e224d96aa667b7015a7a469d10be65e0ecdb68b36db88645472ae320309e92872ba568c3ed32f8da4525b113e
7
+ data.tar.gz: 31881ac3bba3ac3e3afa0a1c87366ea1680c32189d07cbdcd62e7eee33b19712fb85c0198b91b2315377e1f16ad0a973c95083810ef0a125c4a385ea84774101
@@ -398,69 +398,64 @@ end
398
398
 
399
399
  {
400
400
  keyword: "cmp",
401
- operands: [{type: "register", restrictions: {reg_size: 64}}, {type: "immediate"}],
401
+ name: "Compare (immediate)",
402
+ description: "Subtracts an immediate value from a register value, and updates the condition flags based on the result.",
403
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}}, {type: "immediate"}],
402
404
  mc_constructor: [
403
405
  ["bits", 1,1,1,1,1],
404
406
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
405
- ["get_bits", ["get_operand", 1], 0, 12], # Immediate offset zero
406
- ["bits", 0, 0,1,0,0,0,1, 1, 1, 1],
407
+ ["get_bits", ["get_operand", 1], 0, 12], # Immediate value
408
+ ["bits", 0, 0,1,0,0,0,1, 1, 1],
409
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []], # sf
407
410
  ],
408
411
  bitsize: 32
409
412
  },
410
413
 
411
414
  {
412
415
  keyword: "cmp",
413
- name: "CMP (two registers)",
414
- description: "Compares two 64-bit registers and updates condition flags based on the result.",
415
- operands: [{type: "register", restrictions: {reg_size: 64}, name: "Register 1"}, {type: "register", restrictions: {reg_size: 64}, name: "Register 2"}],
416
+ name: "Compare (registers)",
417
+ description: "Subtracts the second register value from the first register value, and updates the condition flags based on the result.",
418
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Register 1"}, {type: "register", restrictions: {reg_type: "gpr"}, name: "Register 2"}],
416
419
  mc_constructor: [
420
+ ["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "cmp Error: Register sizes are not the same"]],
417
421
  ["bits", 1,1,1,1,1], # Rd
418
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
422
+ ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5], # Rn
419
423
  ["get_bits", 0, 0, 6], # Immediate offset zero (shift amount)
420
424
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rm
421
425
  ["bits", 0],
422
426
  ["bits", 0, 0], # Shift type
423
- ["bits", 1,1,0,1,0,1,1,1],
424
- ],
425
- bitsize: 32
426
- },
427
-
428
- {
429
- keyword: "cmp",
430
- name: "CMP (two registers)",
431
- description: "Compares two 32-bit registers and updates condition flags based on the result.",
432
- operands: [{type: "register", restrictions: {reg_size: 32}, name: "Register 1"}, {type: "register", restrictions: {reg_size: 32}, name: "Register 2"}],
433
- mc_constructor: [
434
- ["bits", 1,1,1,1,1], # Rd
435
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
436
- ["get_bits", 0, 0, 6], # Immediate offset zero (shift amount)
437
- ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rm
438
- ["bits", 0],
439
- ["bits", 0, 0], # Shift type
440
- ["bits", 1,1,0,1,0,1,1,0],
427
+ ["bits", 1,1,0,1,0,1,1],
428
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []], # sf
441
429
  ],
442
430
  bitsize: 32
443
431
  },
432
+
444
433
 
445
434
  {
446
435
  keyword: "sub",
447
- operands: [{type: "register", restrictions: {reg_size: 64}}, {type: "register", restrictions: {reg_size: 64}}, {type: "immediate"}],
436
+ name: "Subtract (immediate)",
437
+ description: "Subtract an immediate value from a register value, and store the result in the destination register",
438
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_type: "gpr"}, name: "Source"}, {type: "immediate", name: "Immediate"}],
448
439
  mc_constructor: [
440
+ ["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "sub Error: Register sizes are not the same"]],
449
441
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
450
442
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
451
443
  ["get_bits", ["get_operand", 2], 0, 12], # Immediate offset zero
452
444
  ["bits", 0], # Shift
453
- ["bits", 0,1,0,0,0,1,0,1,1],
445
+ ["bits", 0,1,0,0,0,1,0,1],
446
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []], # sf
454
447
  ],
455
448
  bitsize: 32
456
449
  },
457
450
 
458
451
  {
459
452
  keyword: "mul",
460
- name: "MUL",
461
- description: "Multiply the contents of two registers and store the output in the destination register.",
462
- operands: [{type: "register", restrictions: {reg_type: "gpr"}}, {type: "register", restrictions: {reg_type: "gpr"}}, {type: "register", restrictions: {reg_type: "gpr"}}],
453
+ name: "Multiply",
454
+ description: "Multiply the contents of two registers, and store the output in the destination register.",
455
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_type: "gpr"}, name: "Register 1"}, {type: "register", restrictions: {reg_type: "gpr"}, name: "Register 2"}],
463
456
  mc_constructor: [
457
+ ["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "mul Error: Register sizes are not the same"]],
458
+ ["if_eq_else", ["get_key", ["get_operand", 1], :reg_size], ["get_key", ["get_operand", 2], :reg_size], [], ["raise_error", "mul Error: Register sizes are not the same"]],
464
459
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5], # Rd
465
460
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rn
466
461
  ["bits", 1,1,1,1,1, 0], # Ra o0
@@ -473,6 +468,29 @@ end
473
468
  },
474
469
 
475
470
 
471
+ {
472
+ keyword: "madd",
473
+ name: "Multiply-Add",
474
+ description: "Multiplies two register values, adds a third register value, and writes the result to the destination register.",
475
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_type: "gpr"}, name: "Register 1 (to multiply)"}, {type: "register", restrictions: {reg_type: "gpr"}, name: "Register 2 (to multiply)"}, {type: "register", restrictions: {reg_type: "gpr"}, name: "Register 3 (to add)"}],
476
+ mc_constructor: [
477
+ # Checks for register sizes being the same
478
+ ["if_eq_else", ["get_key", ["get_operand", 0], :reg_size], ["get_key", ["get_operand", 1], :reg_size], [], ["raise_error", "madd Error: Register sizes are not the same"]],
479
+ ["if_eq_else", ["get_key", ["get_operand", 1], :reg_size], ["get_key", ["get_operand", 2], :reg_size], [], ["raise_error", "madd Error: Register sizes are not the same"]],
480
+ ["if_eq_else", ["get_key", ["get_operand", 2], :reg_size], ["get_key", ["get_operand", 3], :reg_size], [], ["raise_error", "madd Error: Register sizes are not the same"]],
481
+
482
+ ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5], # Rd
483
+ ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rn
484
+ ["get_bits", ["encode_gp_register", ["get_operand", 3]], 0, 5], #Ra
485
+ ["bits", 0], # o0
486
+ ["get_bits", ["encode_gp_register", ["get_operand", 2]], 0, 5], # Rm
487
+ ["bits", 0,0,0, 1,1,0,1,1, 0,0],
488
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []], # sf
489
+ ],
490
+ bitsize: 32,
491
+ },
492
+
493
+
476
494
  #
477
495
  # B.cond instructions
478
496
  #
@@ -22,6 +22,8 @@ def self.parse_str(code)
22
22
  str_content << "\r"
23
23
  elsif code[i] == "\\"
24
24
  str_content << "\\"
25
+ elsif code[i] == "0"
26
+ str_content << "\0"
25
27
  else
26
28
  str_content << "\\"
27
29
  str_content << code[i]
@@ -145,6 +147,29 @@ def self.check_decimal_operand(str)
145
147
  end
146
148
 
147
149
 
150
+ def self.check_char_operand(str)
151
+
152
+ # If doesn't start with ' or doesn't end with ', return false
153
+ if (str[0] != "'") || (str[-1] != "'")
154
+ return [false, nil]
155
+ end
156
+
157
+ # Use existing logic to parse the contents
158
+ to_parse = str.dup
159
+ to_parse[0] = '"'
160
+ to_parse[-1] = '"'
161
+ content, parse_i = parse_str(to_parse)
162
+
163
+ # If more than one character, return false
164
+ if content.size != 1
165
+ return [false, nil]
166
+ end
167
+
168
+ return [true, content.encode("ascii").bytes[0]]
169
+ end
170
+
171
+
172
+
148
173
  def self.check_immediate_operand(operand_str)
149
174
 
150
175
  is_bin, bin_value = check_binary_operand(operand_str)
@@ -156,6 +181,9 @@ def self.check_immediate_operand(operand_str)
156
181
  is_hex, hex_value = check_hex_operand(operand_str)
157
182
  return [true, {type: "immediate", value: hex_value, def_type: "hex"}] if is_hex
158
183
 
184
+ is_char, char_value = check_char_operand(operand_str)
185
+ return [true, {type: "immediate", value: char_value, def_type: "char"}] if is_char
186
+
159
187
  return [false, nil]
160
188
  end
161
189
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kompiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.pre.1
4
+ version: 0.2.0.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyryl Shyshko