kompiler 0.1.2 → 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: 358077245911280980e98b213394c395224c5ee04f4b81b449a073582567eb46
4
- data.tar.gz: bdaae177e9ef79b9628eaae6e9e506c69d9951f89ff387c28532940fd67d2f90
3
+ metadata.gz: 36f0387094d41fc93e8f85e56446392a1941cbcd115bf94c3ffd799c3d85cc78
4
+ data.tar.gz: 63a7973c95797b77119b47f24b8aa5bda591d7d2a4e5cbd5e34485fb11aea9b7
5
5
  SHA512:
6
- metadata.gz: c238947087f8d2032816abbe9882df8906b53de123e382ebc662aa3461e560ff69d5001e5ecdc8d28793bdd495a669ec36873d5d6792bfc0cc7396f423d96edd
7
- data.tar.gz: 747cacbc92d042db6bf1ed5569bb7727ce29694c9c8f4cc6e24c625f26aee73532eb5ea6b93763f47c8e0f3819a43012919dd922b9155c035c43247e4fd0c9ec
6
+ metadata.gz: 761aed3357cef9084d7dc0e7d8f9a73bb6dc883c7b1fc2cb5b0ee8b6499aa3f1f972bcc48d8d8adb2a3bd7f793738b28c1a37a21c17152d958cb79e39c7f8dab
7
+ data.tar.gz: dae7000f44475fdcb2c6c8e78c82f638ca09790c4442706ddeb57b5f76a41f30786bec6fd6e1620c5eba95999c283c5ed8083161d258562ba4672651a2caab54
@@ -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
  },
@@ -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.2
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