kompiler 0.1.2 → 0.2.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: 358077245911280980e98b213394c395224c5ee04f4b81b449a073582567eb46
4
- data.tar.gz: bdaae177e9ef79b9628eaae6e9e506c69d9951f89ff387c28532940fd67d2f90
3
+ metadata.gz: 69b1e8272e45a6c9ce0b8bb60dbfb89b0d65d0f8f615cbd744726857ecf1d94f
4
+ data.tar.gz: eba0c518a787b345d191a2cf41e76ecb52ca25dac10f14f17b72d5cbbcb2f201
5
5
  SHA512:
6
- metadata.gz: c238947087f8d2032816abbe9882df8906b53de123e382ebc662aa3461e560ff69d5001e5ecdc8d28793bdd495a669ec36873d5d6792bfc0cc7396f423d96edd
7
- data.tar.gz: 747cacbc92d042db6bf1ed5569bb7727ce29694c9c8f4cc6e24c625f26aee73532eb5ea6b93763f47c8e0f3819a43012919dd922b9155c035c43247e4fd0c9ec
6
+ metadata.gz: a325a47eff59b3766cead44c9e81063773af594e224d96aa667b7015a7a469d10be65e0ecdb68b36db88645472ae320309e92872ba568c3ed32f8da4525b113e
7
+ data.tar.gz: 31881ac3bba3ac3e3afa0a1c87366ea1680c32189d07cbdcd62e7eee33b19712fb85c0198b91b2315377e1f16ad0a973c95083810ef0a125c4a385ea84774101
@@ -275,33 +275,28 @@ end
275
275
  ],
276
276
  bitsize: 32
277
277
  },
278
+
278
279
  {
279
280
  keyword: "ldr",
280
- operands: [{type: "register", restrictions: {reg_size: 64}}, {type: "register", restrictions: {reg_size: 64}}],
281
- mc_constructor: [
282
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
283
- ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
284
- ["get_bits", 0, 0, 12], # Immediate offset zero
285
- ["bits", 1,0, 1,0, 0, 1,1,1, 1,1],
286
- ],
287
- bitsize: 32
288
- },
289
- {
290
- keyword: "ldr",
291
- operands: [{type: "register", restrictions: {reg_size: 32}}, {type: "register", restrictions: {reg_size: 64}}],
281
+ name: "Load Register",
282
+ description: "Loads 4 or 8 bytes from memory at the address in the second register, and writes it to the destination register",
283
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_type: "gpr", reg_size: 64}, name: "Source address"}],
292
284
  mc_constructor: [
293
285
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
294
286
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
295
287
  ["get_bits", 0, 0, 12], # Immediate offset zero
296
- ["bits", 1,0, 1,0, 0, 1,1,1, 0,1],
288
+ ["bits", 1,0, 1,0, 0, 1,1,1],
289
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []],
290
+ ["bits", 1],
297
291
  ],
298
292
  bitsize: 32
299
293
  },
294
+
300
295
  {
301
296
  keyword: "ldrb",
302
297
  name: "Load Register Byte",
303
298
  description: "Loads a byte from memory and writes the result to the destination register.",
304
- operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Destination"}, {type: "register", restrictions: {reg_size: 64, reg_type: "gpr"}, name: "Source address"}],
299
+ operands: [{type: "register", restrictions: {reg_type: "gpr", reg_size: 32}, name: "Destination"}, {type: "register", restrictions: {reg_size: 64, reg_type: "gpr"}, name: "Source address"}],
305
300
  mc_constructor: [
306
301
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
307
302
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
@@ -321,41 +316,19 @@ end
321
316
  ],
322
317
  bitsize: 32
323
318
  },
324
- {
325
- keyword: "str",
326
- description: "Stores the contents of a 32 bit register at the address specified by the second register",
327
- operands: [{type: "register", restrictions: {reg_size: 32}, name: "Content"}, {type: "register", restrictions: {reg_size: 64}, name: "Address"}],
328
- mc_constructor: [
329
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
330
- ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
331
- ["get_bits", 0, 0, 12], # Immediate offset zero
332
- ["bits", 0,0, 1,0, 0, 1,1,1, 0,1],
333
- ],
334
- bitsize: 32
335
- },
336
- {
337
- keyword: "str",
338
- description: "Stores the contents of a 64 bit register at the address specified by the second register",
339
- operands: [{type: "register", restrictions: {reg_size: 64}, name: "Content"}, {type: "register", restrictions: {reg_size: 64}, name: "Address"}],
340
- mc_constructor: [
341
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
342
- ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
343
- ["get_bits", 0, 0, 12], # Immediate offset zero
344
- ["bits", 0,0, 1,0, 0, 1,1,1, 1,1],
345
- ],
346
- bitsize: 32
347
- },
348
319
 
349
320
  {
350
- keyword: "str_unsigned",
351
- name: "STR (immediate), unsigned offset",
352
- description: "Stores the contents of a 32 bit register at the address specified by the second register with an unsigned immediate offset.",
353
- operands: [{type: "register", restrictions: {reg_size: 32}, name: "Content"}, {type: "register", restrictions: {reg_size: 64}, name: "Address"}, {type: "immediate", name: "Address Offset"}],
321
+ keyword: "str",
322
+ name: "Store",
323
+ description: "Stores the contents of a 64 bit register at the address specified by the second register.",
324
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Content"}, {type: "register", restrictions: {reg_type: "gpr", reg_size: 64}, name: "Address"}],
354
325
  mc_constructor: [
355
326
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
356
327
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
357
- ["get_bits", ["get_operand", 2], 0, 12], # Immediate offset zero
358
- ["bits", 0,0, 1,0, 0, 1,1,1, 0,1],
328
+ ["get_bits", 0, 0, 12],
329
+ ["bits", 0,0, 1,0, 0, 1,1,1],
330
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []],
331
+ ["bits", 1] # size second bit always 1
359
332
  ],
360
333
  bitsize: 32
361
334
  },
@@ -364,42 +337,60 @@ end
364
337
  keyword: "str_unsigned",
365
338
  name: "STR (immediate), unsigned offset",
366
339
  description: "Stores the contents of a 64 bit register at the address specified by the second register with an unsigned immediate offset.",
367
- operands: [{type: "register", restrictions: {reg_size: 64}, name: "Content"}, {type: "register", restrictions: {reg_size: 64}, name: "Address"}, {type: "immediate", name: "Address Offset"}],
340
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Content"}, {type: "register", restrictions: {reg_type: "gpr", reg_size: 64}, name: "Address"}, {type: "immediate", name: "Address Offset"}],
368
341
  mc_constructor: [
342
+ ["case", ["get_key", ["get_operand", 0], :reg_size],
343
+ 64, ["if_eq_else", ["modulo", ["get_operand", 2], 8], 0, [], ["raise_error", "str_unsigned Error: Unsigned offset must be divisible by 8 for 64-bit registers."]],
344
+ 32, ["if_eq_else", ["modulo", ["get_operand", 2], 4], 0, [], ["raise_error", "str_unsigned Error: Unsigned offset must be divisible by 4 for 32-bit registers."]],
345
+ []
346
+ ],
369
347
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
370
348
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
371
- ["get_bits", ["get_operand", 2], 0, 12], # Immediate offset zero
372
- ["bits", 0,0, 1,0, 0, 1,1,1, 1,1],
349
+ ["get_bits",
350
+ ["case", ["get_key", ["get_operand", 0], :reg_size],
351
+ 64, ["divide", ["get_operand", 2], 8],
352
+ 32, ["divide", ["get_operand", 2], 4],
353
+ ["get_operand", 2]
354
+ ],
355
+ 0, 12],
356
+ ["bits", 0,0, 1,0, 0, 1,1,1],
357
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []],
358
+ ["bits", 1] # size second bit always 1
373
359
  ],
374
360
  bitsize: 32
375
361
  },
376
362
 
363
+
377
364
  {
378
365
  keyword: "str_pre_index",
379
366
  name: "STR (immediate), signed offset, pre-index",
380
- description: "Stores the contents of a 64-bit register at the address specified by the second register with a signed immediate offset that is added before storing.",
381
- operands: [{type: "register", restrictions: {reg_size: 64}, name: "Content"}, {type: "register", restrictions: {reg_size: 64}, name: "Address"}, {type: "immediate", name: "Address Offset"}],
367
+ description: "Stores the contents of a general purpose register at the address specified by the second register with an immediate offset added before writing.",
368
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Content"}, {type: "register", restrictions: {reg_type: "gpr", reg_size: 64}, name: "Address"}, {type: "immediate", name: "Address Offset"}],
382
369
  mc_constructor: [
383
370
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
384
371
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
385
372
  ["bits", 1, 1],
386
373
  ["get_bits", ["get_operand", 2], 0, 9],
387
- ["bits", 0, 0,0, 0,0, 0, 1,1,1, 1,1],
374
+ ["bits", 0, 0,0, 0,0, 0, 1,1,1],
375
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []],
376
+ ["bits", 1] # size second bit always 1
388
377
  ],
389
378
  bitsize: 32
390
379
  },
391
380
 
392
381
  {
393
- keyword: "str_pre_index",
394
- name: "STR (immediate), signed offset, pre-index",
395
- description: "Stores the contents of a 32-bit register at the address specified by the second register with a signed immediate offset that is added before storing.",
396
- operands: [{type: "register", restrictions: {reg_size: 32}, name: "Content"}, {type: "register", restrictions: {reg_size: 64}, name: "Address"}, {type: "immediate", name: "Address Offset"}],
382
+ keyword: "str_post_index",
383
+ name: "STR (immediate), signed offset, post-index",
384
+ description: "Stores the contents of a general purpose register at the address specified by the second register, with an immediate offset added after writing.",
385
+ operands: [{type: "register", restrictions: {reg_type: "gpr"}, name: "Content"}, {type: "register", restrictions: {reg_type: "gpr", reg_size: 64}, name: "Address"}, {type: "immediate", name: "Address Offset"}],
397
386
  mc_constructor: [
398
387
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
399
388
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
400
- ["bits", 1, 1],
389
+ ["bits", 1, 0],
401
390
  ["get_bits", ["get_operand", 2], 0, 9],
402
- ["bits", 0, 0,0, 0,0, 0, 1,1,1, 0,1],
391
+ ["bits", 0, 0,0, 0,0, 0, 1,1,1],
392
+ ["case", ["get_key", ["get_operand", 0], :reg_size], 64, ["bits", 1], 32, ["bits", 0], []],
393
+ ["bits", 1] # size second bit always 1
403
394
  ],
404
395
  bitsize: 32
405
396
  },
@@ -407,69 +398,64 @@ end
407
398
 
408
399
  {
409
400
  keyword: "cmp",
410
- 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"}],
411
404
  mc_constructor: [
412
405
  ["bits", 1,1,1,1,1],
413
406
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
414
- ["get_bits", ["get_operand", 1], 0, 12], # Immediate offset zero
415
- ["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
416
410
  ],
417
411
  bitsize: 32
418
412
  },
419
413
 
420
414
  {
421
415
  keyword: "cmp",
422
- name: "CMP (two registers)",
423
- description: "Compares two 64-bit registers and updates condition flags based on the result.",
424
- 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"}],
425
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"]],
426
421
  ["bits", 1,1,1,1,1], # Rd
427
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
422
+ ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5], # Rn
428
423
  ["get_bits", 0, 0, 6], # Immediate offset zero (shift amount)
429
424
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rm
430
425
  ["bits", 0],
431
426
  ["bits", 0, 0], # Shift type
432
- ["bits", 1,1,0,1,0,1,1,1],
433
- ],
434
- bitsize: 32
435
- },
436
-
437
- {
438
- keyword: "cmp",
439
- name: "CMP (two registers)",
440
- description: "Compares two 32-bit registers and updates condition flags based on the result.",
441
- operands: [{type: "register", restrictions: {reg_size: 32}, name: "Register 1"}, {type: "register", restrictions: {reg_size: 32}, name: "Register 2"}],
442
- mc_constructor: [
443
- ["bits", 1,1,1,1,1], # Rd
444
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
445
- ["get_bits", 0, 0, 6], # Immediate offset zero (shift amount)
446
- ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rm
447
- ["bits", 0],
448
- ["bits", 0, 0], # Shift type
449
- ["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
450
429
  ],
451
430
  bitsize: 32
452
431
  },
432
+
453
433
 
454
434
  {
455
435
  keyword: "sub",
456
- 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"}],
457
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"]],
458
441
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
459
442
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
460
443
  ["get_bits", ["get_operand", 2], 0, 12], # Immediate offset zero
461
444
  ["bits", 0], # Shift
462
- ["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
463
447
  ],
464
448
  bitsize: 32
465
449
  },
466
450
 
467
451
  {
468
452
  keyword: "mul",
469
- name: "MUL",
470
- description: "Multiply the contents of two registers and store the output in the destination register.",
471
- 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"}],
472
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"]],
473
459
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5], # Rd
474
460
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5], # Rn
475
461
  ["bits", 1,1,1,1,1, 0], # Ra o0
@@ -482,6 +468,29 @@ end
482
468
  },
483
469
 
484
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
+
485
494
  #
486
495
  # B.cond instructions
487
496
  #
@@ -28,6 +28,16 @@ MC_AST_NODES = [
28
28
  {name: "get_label_address", n_args: 1, func: lambda {|args, state| state[:labels].include?(args[0]) ? state[:labels][args[0]] : raise("Label \"#{args[0]}\" not found: Program build not possible") } },
29
29
  {name: "bits", n_args: "any", func: lambda {|args, state| args } },
30
30
  {name: "if_eq_else", n_args: 4, eval_args: false, func: lambda {|args, state| (eval_mc_node_arg(args[0], state) == eval_mc_node_arg(args[1], state)) ? eval_mc_node_arg(args[2], state) : eval_mc_node_arg(args[3], state) }},
31
+ {name: "case", n_args: "any", eval_args: false, func: lambda do |args, state|
32
+ value = eval_mc_node_arg(args[0], state)
33
+ raise "Incorrect use of the \"case\" MC Constructor: incorrect number of arguments. This is likely a problem with the architecture, not the program being compiled." if (args.size - 2) % 2 != 0
34
+ args[1...-1].each_slice(2) do |check_value, block|
35
+ if value == check_value
36
+ return eval_mc_node_arg(block, state)
37
+ end
38
+ end
39
+ eval_mc_node_arg(args.last, state)
40
+ end},
31
41
  {name: "raise_error", n_args: 1, func: lambda {|args, state| raise args[0] } },
32
42
  {name: "get_key", n_args: 2, func: lambda {|args, state| args[0][args[1]] }},
33
43
  ]
@@ -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,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kompiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.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-11-27 00:00:00.000000000 Z
11
+ date: 2024-11-28 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