kompiler 0.1.1 → 0.2.0.pre.1

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: d412abafd669fc13a7c7f04607dc0024cb63054f2a12f442ea8da3beea17119e
4
- data.tar.gz: 43120f2bd913622cdd7037efa9ae2f520fb5fbf5cbe0799dd511fa48845523cc
3
+ metadata.gz: 36f0387094d41fc93e8f85e56446392a1941cbcd115bf94c3ffd799c3d85cc78
4
+ data.tar.gz: 63a7973c95797b77119b47f24b8aa5bda591d7d2a4e5cbd5e34485fb11aea9b7
5
5
  SHA512:
6
- metadata.gz: 8275ceed8672bcf4935bc43b53a3a96c12b287070760a9ab098a57aa711c2f3072384287615523f2461dd81fc451f1c6c6931f655a65066504c2645de3adc85b
7
- data.tar.gz: 9f8723794b94852affd38e541a4b9c2ff2b85a3f3d83ab66c3abfd74a11dfa45bf32b4cee564eddc37105e5ec13436af939cc26da7e774f5d9fe4611af3a0ded
6
+ metadata.gz: 761aed3357cef9084d7dc0e7d8f9a73bb6dc883c7b1fc2cb5b0ee8b6499aa3f1f972bcc48d8d8adb2a3bd7f793738b28c1a37a21c17152d958cb79e39c7f8dab
7
+ data.tar.gz: dae7000f44475fdcb2c6c8e78c82f638ca09790c4442706ddeb57b5f76a41f30786bec6fd6e1620c5eba95999c283c5ed8083161d258562ba4672651a2caab54
@@ -275,25 +275,33 @@ 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
+ 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"}],
281
284
  mc_constructor: [
282
285
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
283
286
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
284
287
  ["get_bits", 0, 0, 12], # Immediate offset zero
285
- ["bits", 1,0, 1,0, 0, 1,1,1, 1,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],
286
291
  ],
287
292
  bitsize: 32
288
293
  },
294
+
289
295
  {
290
- keyword: "ldr",
291
- operands: [{type: "register", restrictions: {reg_size: 32}}, {type: "register", restrictions: {reg_size: 64}}],
296
+ keyword: "ldrb",
297
+ name: "Load Register Byte",
298
+ description: "Loads a byte from memory and writes the result to the destination register.",
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"}],
292
300
  mc_constructor: [
293
301
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
294
302
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
295
303
  ["get_bits", 0, 0, 12], # Immediate offset zero
296
- ["bits", 1,0, 1,0, 0, 1,1,1, 0,1],
304
+ ["bits", 1,0, 1,0, 0, 1,1,1, 0,0],
297
305
  ],
298
306
  bitsize: 32
299
307
  },
@@ -308,41 +316,19 @@ end
308
316
  ],
309
317
  bitsize: 32
310
318
  },
311
- {
312
- keyword: "str",
313
- description: "Stores the contents of a 32 bit register at the address specified by the second register",
314
- operands: [{type: "register", restrictions: {reg_size: 32}, name: "Content"}, {type: "register", restrictions: {reg_size: 64}, name: "Address"}],
315
- mc_constructor: [
316
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
317
- ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
318
- ["get_bits", 0, 0, 12], # Immediate offset zero
319
- ["bits", 0,0, 1,0, 0, 1,1,1, 0,1],
320
- ],
321
- bitsize: 32
322
- },
323
- {
324
- keyword: "str",
325
- description: "Stores the contents of a 64 bit register at the address specified by the second register",
326
- operands: [{type: "register", restrictions: {reg_size: 64}, name: "Content"}, {type: "register", restrictions: {reg_size: 64}, name: "Address"}],
327
- mc_constructor: [
328
- ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
329
- ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
330
- ["get_bits", 0, 0, 12], # Immediate offset zero
331
- ["bits", 0,0, 1,0, 0, 1,1,1, 1,1],
332
- ],
333
- bitsize: 32
334
- },
335
319
 
336
320
  {
337
- keyword: "str_unsigned",
338
- name: "STR (immediate), unsigned offset",
339
- description: "Stores the contents of a 32 bit register at the address specified by the second register with an unsigned immediate offset.",
340
- 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"}],
341
325
  mc_constructor: [
342
326
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
343
327
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
344
- ["get_bits", ["get_operand", 2], 0, 12], # Immediate offset zero
345
- ["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
346
332
  ],
347
333
  bitsize: 32
348
334
  },
@@ -351,42 +337,60 @@ end
351
337
  keyword: "str_unsigned",
352
338
  name: "STR (immediate), unsigned offset",
353
339
  description: "Stores the contents of a 64 bit register at the address specified by the second register with an unsigned immediate offset.",
354
- 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"}],
355
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
+ ],
356
347
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
357
348
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
358
- ["get_bits", ["get_operand", 2], 0, 12], # Immediate offset zero
359
- ["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
360
359
  ],
361
360
  bitsize: 32
362
361
  },
363
362
 
363
+
364
364
  {
365
365
  keyword: "str_pre_index",
366
366
  name: "STR (immediate), signed offset, pre-index",
367
- 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.",
368
- 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"}],
369
369
  mc_constructor: [
370
370
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
371
371
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
372
372
  ["bits", 1, 1],
373
373
  ["get_bits", ["get_operand", 2], 0, 9],
374
- ["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
375
377
  ],
376
378
  bitsize: 32
377
379
  },
378
380
 
379
381
  {
380
- keyword: "str_pre_index",
381
- name: "STR (immediate), signed offset, pre-index",
382
- 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.",
383
- 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"}],
384
386
  mc_constructor: [
385
387
  ["get_bits", ["encode_gp_register", ["get_operand", 0]], 0, 5],
386
388
  ["get_bits", ["encode_gp_register", ["get_operand", 1]], 0, 5],
387
- ["bits", 1, 1],
389
+ ["bits", 1, 0],
388
390
  ["get_bits", ["get_operand", 2], 0, 9],
389
- ["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
390
394
  ],
391
395
  bitsize: 32
392
396
  },
@@ -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
  ]
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.1
4
+ version: 0.2.0.pre.1
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