Commit Graph

487 Commits

Author SHA1 Message Date
Kartik Agaram 5462619d96 6742 - support for formatting in fake screens
We still need a few primitives, but we can implement these as needed. I'm
ready to call the fake screen done.
2020-09-07 14:18:48 -07:00
Kartik Agaram 15b9880136 6727 - bugfix in a multiply instruction
Also more error-detection for this case all across the toolchain.
2020-08-22 14:35:44 -07:00
Kartik Agaram db894e7968 6726 2020-08-22 14:25:29 -07:00
Kartik Agaram ef8e98dd06 6725 - support negative literals 2020-08-22 13:59:57 -07:00
Kartik Agaram 38128ae167 6722 2020-08-22 12:35:39 -07:00
Kartik Agaram e8ffaf29ce 6719 - error-checking for 'index' instructions
1000+ LoC spent; just 300+ excluding tests.

Still one known gap; we don't check the entirety of an array's element
type if it's a compound. So far we just check if say both sides start with
'addr'. Obviously that's not good enough.
2020-08-21 21:32:48 -07:00
Kartik Agaram 208b28303c 6715
There's a question of how we should match array types with a capacity on
ones without. For now we're going to do the simplest possible thing and
just make type-match? more robust. It'll always return false if the types
don't match exactly. For ignoring capacity we'll rely on the checks of
the `address` operation (which don't exist yet). This means we should do
this to pass an address to an array to a function f with signature `f (addr
array int)`:

  var a: (array int 3)
  var b/eax: (addr array int) <- address a
  f b

rather than this:

  var a: (array int 3)
  var b/eax: (addr array int 3) <- address a
  f b

Similar reasoning applies to stream types. Arrays and streams are currently
the only types that can have an optional capacity.
2020-08-03 21:45:41 -07:00
Kartik Agaram 89c9ed80f9 6706 - support utf-8
For example:

  fn main -> r/ebx: int {
    var x/eax: grapheme <- copy 0x9286e2  # code point 0x2192 in utf-8
    print-grapheme-to-real-screen x
    print-string-to-real-screen "\n"
  }

Graphemes must fit in 4 bytes (21 bits for code points). Unclear what we
should do for longer clusters since graphemes are a fixed-size type at
the moment.
2020-08-02 15:50:19 -07:00
Kartik Agaram 0452b05f5a 6703 - new types: code-point and grapheme
Both have the same size: 4 bytes.

So far I've just renamed print-byte to print-grapheme, but it still behaves
the same.

I'm going to support printing code-points next, but grapheme 'clusters'
spanning multiple code-points won't be supported for some time.
2020-08-02 15:11:52 -07:00
Kartik Agaram 1b79f705b9 6702 2020-08-02 11:51:29 -07:00
Kartik Agaram 7d33cce069 6701 2020-08-02 11:42:59 -07:00
Kartik Agaram a0da3604a2 6691 - start building a fake screen
There was a bug in defining types containing other user-defined types.
2020-07-31 08:40:56 -07:00
Kartik Agaram 3001235028 6687 - stream-empty? and stream-full? 2020-07-30 19:34:29 -07:00
Kartik Agaram bae22d720f 6684 - experimental primitives for streams
This is a hacky special case. The alternative would be more general support
for generics.

One observation: we might be able to type-check some primitives using `sig`s.
Only if they don't return anything, since primitives usually need to support
arbitrary registers. I'm not doing that yet, though. It eliminates the
possibility of writing tests for them in mu.subx, which can't see 400.mu.
But it's an alternative:

  sig allocate out: (addr handle _)
  sig populate out: (addr handle array _), n: int
  sig populate-stream out: (addr handle stream _), n: int
  sig read-from-stream s: (addr stream _T), out: (addr _T)
  sig write-to-stream s: (addr stream _T), in: (addr _T)

We could write the tests in Mu. But then we're testing behavior rather
than the code generated. There are trade-offs. By performing type-checking
in mu.subx I retain the option to write both kinds of tests.
2020-07-29 21:41:29 -07:00
Kartik Agaram 129bb8117b 6683 2020-07-28 21:41:00 -07:00
Kartik Agaram b8df5340fa 6682 - experimental support for streams and slices
Slices contain `addr`s so the same rules apply to them. They can't be stored
in structs and so on. But they may be an efficient temporary while parsing.

Streams are currently a second generic type after arrays, and gradually
strengthening the case to just bite the bullet and support first-class
generics in Mu.
2020-07-28 21:37:32 -07:00
Kartik Agaram e2c22ad4d9 6681 2020-07-26 22:51:21 -07:00
Kartik Agaram 2b1737363f 6676 - type checks for 'lookup' 2020-07-25 19:11:51 -07:00
Kartik Agaram 4dc20af1bf 6672 - error on addr or array inside type 2020-07-25 15:08:52 -07:00
Kartik Agaram bf0a6b69dc 6671 - bugfix in generic functions
We need to remember to clear local variables. And there's a good question
here of how Mu supports variables of type stream or table. Or other user-defined
types that inline arrays.
2020-07-25 11:04:34 -07:00
Kartik Agaram 32055c369b 6670 - generic functions
Function signatures can now take type parameters starting with '_'.

Type parameters in a signature match any concrete type in the call. But
they have to be consistent within a single call.

Things I considered but punted on for now:
- having '_' match anything without needing to be consistent. Wildcards
  actually seem harder to understand.
- disallowing top-level '_' types. I'll wait until a concrete use case
  for disallowing.

We still don't support *defining* types with type parameters, so for now
this is only useful for calling functions on arrays or streams or handles.
2020-07-25 10:21:22 -07:00
Kartik Agaram ba4e33f711 tmp - snapshot of type-parameter support
I think I've got all the stack management down. Time now for the business
logic. There's one failing test.
2020-07-25 09:36:43 -07:00
Kartik Agaram 2a1b9d32d7 6668
type-match? is no longer symmetric; we have to be careful about arg ordering.
2020-07-24 22:10:09 -07:00
Kartik Agaram 750f490b4d 6667 2020-07-24 21:40:18 -07:00
Kartik Agaram 39a4cbdf61 6666 - types starting with '_' now match anything
We still need to perform pattern matching.
2020-07-24 21:34:36 -07:00
Kartik Agaram a4c31549f9 6665 2020-07-24 21:29:20 -07:00
Kartik Agaram 511844ffb9 6664 2020-07-24 21:25:46 -07:00
Kartik Agaram c9ea1bd55a 6663 2020-07-24 21:25:46 -07:00
Kartik Agaram ac6af96c5a 6662 - start support for generics
Mu will be a language with generics -- but no static dispatch.
2020-07-20 22:30:02 -07:00
Kartik Agaram 3a5512389e 6661 2020-07-20 22:17:57 -07:00
Kartik Agaram 97dbe33fd4 6660 2020-07-20 21:03:55 -07:00
Kartik Agaram 8cc1ed72c3 6650 - bit-shift operations really working
test input:

  fn foo {
    var y/edx: int <- copy 0
    y <- shift-left 2
    y <- shift-right 2
    y <- shift-right-signed 2
    var x: int
    shift-left x, 2
    shift-right x, 2
    shift-right-signed x, 2
  }

output:

  foo:
    # . prologue
    55/push-ebp
    89/<- %ebp 4/r32/esp
    {
  $foo:0x00000001:loop:
      ff 6/subop/push %edx
      ba/copy-to-edx 0/imm32
      c1/shift 4/subop/left %edx 2/imm8
      c1/shift 5/subop/right-padding-zeroes %edx 2/imm8
      c1/shift 7/subop/right-preserving-sign %edx 2/imm8
      68/push 0/imm32
      c1/shift 4/subop/left *(ebp+0xfffffff8) 2/imm8
      c1/shift 5/subop/right-padding-zeroes *(ebp+0xfffffff8) 2/imm8
      c1/shift 7/subop/right-preserving-sign *(ebp+0xfffffff8) 2/imm8
      81 0/subop/add %esp 0x00000004/imm32
      8f 0/subop/pop %edx
    }
  $foo:0x00000001:break:
    # . epilogue
    89/<- %esp 5/r32/ebp
    5d/pop-to-ebp
    c3/return

test input 2:

  $ cat x.mu
  fn main -> o/ebx: int {
    o <- copy 3
    o <- shift-left 2
  }

output 2:

  $ ./translate_mu x.mu
  $ ./a.elf
  $ echo $?
  12
2020-07-14 22:53:56 -07:00
Kartik Agaram fd100782cb 6649
Bit-shifts aren't quite right yet. We need to emit /imm8 rather than /imm32.

This commit introduces the field, though we don't use it yet.
2020-07-14 22:33:00 -07:00
Kartik Agaram ab26c894c8 6648 - bit-shift instructions in Mu
I'm not happy with the names.
2020-07-14 21:42:20 -07:00
Kartik Agaram 42b0c1139c 6647 2020-07-14 21:24:31 -07:00
Kartik Agaram 5e0ae917d0 6645 - heap allocations in Mu
- allocate var
- populate var, n

Both rely on the type of `var` to compute the size of the allocation. No
need to repeat the name of the type like in C, C++ or Java.
2020-07-13 22:21:26 -07:00
Kartik Agaram 4cb4d4d2d8 6644 2020-07-13 22:08:55 -07:00
Kartik Agaram 725a9579e9 6638 - require '0x' prefix on multi-digit literals
Mu exclusively uses hex everywhere for a consistent programming experience
from machine code up. But we all still tend to say '10' when we mean 'ten'.
Catch that early.
2020-07-11 22:07:48 -07:00
Kartik Agaram 8bf95d294a 6637
Be more consistent about what we interpret as integer literals.
2020-07-11 22:02:31 -07:00
Kartik Agaram 5c86f9be66 6636 2020-07-11 21:33:51 -07:00
Kartik Agaram 355073129b 6635 - bugfix 2020-07-11 21:30:45 -07:00
Kartik Agaram c5a3f65502 6630 - define type signatures for SubX functions
This was easier than I'd feared.
2020-07-10 23:41:34 -07:00
Kartik Agaram 229d63aad2 6629 2020-07-10 22:06:23 -07:00
Kartik Agaram c1b6ecc874 6628 2020-07-10 21:23:32 -07:00
Kartik Agaram c532373e29 6626 2020-07-09 12:32:07 -07:00
Kartik Agaram cb0a41f588 6625 2020-07-09 11:42:28 -07:00
Kartik Agaram a3bfbb99f8 6624 2020-07-09 07:57:03 -07:00
Kartik Agaram 996402e8fd 6604 - new app
https://archive.org/details/akkartik-2min-2020-07-01

In the process I found a bug, added a new syscall, and 'emulated' it.
2020-07-01 16:47:20 -07:00
Kartik Agaram 59cf3ae983 6597 2020-06-29 18:33:52 -07:00
Kartik Agaram 690fa191f1 6595 2020-06-29 18:01:44 -07:00