← Back to context

Comment by WalterBright

3 days ago

Here's how D does it for the x86_64:

https://github.com/dlang/dmd/blob/master/druntime/src/core/i...

It's the statement form, uses Intel syntax, and the compiler keeps track of which registers are modified.

D's approach is great, but it has a few limitations for my use case in Odin. It only supports x86_64/amd64 and uses Intel-style syntax, whereas I needed a solution that universalizes its syntax across multiple ISAs.

D's inline asm is also statement-based rather than a callable template. Though the mixin trick fixes this, it does mean it still uses %0-style parameters making it hard to read and write, something I want to remove completely.

It is great to see that we arrived at similar design compromises, especially regarding `lock` being treated as a separate instruction and thus separated with a `;` (which is automatically inserted by the Odin compiler).

  • > only supports x86_64/amd64

    It supports x86, too, and we're working on Arm64.

    > uses Intel-style syntax

    Yes, because the instruction set references are in Intel syntax. The backwards gcc asm causes me seizures, like trying to write cursive with my left hand. The asm for Arm64 will also follow Arm's instruction specification.

    > D's inline asm is also statement-based

    That's so the source code can be tokenized and parsed without needing special behavior inside the asm { ... }.

    > it still uses %0-style parameters

    Not sure what you mean. RAX means register RAX. %RAX is not accepted.

    > especially regarding `lock` being treated as a separate instruction

    That just makes it easier to parse!

    Anyhow, thank you for the kind words! I am proud of it, the only troubles I have is when Intel adds wacky new instructions that just don't fit in the instruction encoding tables.

    • > It supports x86, too

      Well I assumed so because amd64 is a superset of x86. But nice to know you're working on arm64 too.

      Regarding Intel-syntax, I think there is a little miscommunication here since I try to explain what I mean in the article. Intel-ordering is a good idea, but using nothing but the Intel-syntax wholesale is not universal enough, and needs modifying, especially for AMD64 and other ISAs. Odin's is Intel-like too, but fully Intel by design.

      > That's so the source code can be tokenized and parsed without needing special behavior inside the asm { ... }.

      This is why Odin's asm templates have their own universalized syntax. Thus the entire article.

      > Not sure what you mean. RAX means register RAX. %RAX is not accepted.

      This: https://github.com/dlang/dmd/blob/master/druntime/src/core/i...

      It's why I referred to your "trick", which is something I wanted to need in the first place.

      > That just makes it easier to parse!

      For Odin's asm template syntax, it's not about being easier to parser, it's about having a context free grammar that is the same across ISAs. If I was to allow for prefixes directly in the grammar, either prefixes would have to have their special syntax or you'd need to have a context-sensitive grammar.

      2 replies →

is your fulltime job posting hn comments like "in D...", "this is how D ...", "for D..."?

  • Why is a bad thing that another language design and compiler writer compares his language as a point of comparison?

    I really like it when he does because it allows me to see what he has done for D, and learn from it.

    • > Why is a bad thing that another language design and compiler writer compares his language as a point of comparison?

      "why is it a bad thing if you do X thing incessantly". in this specific case it's called shilling. if you've been on hn for longer than a week you'll notice he advertises D as if it's his fulltime job (which it probably is).

      2 replies →

  • Why not? Whenever there is an article about D on HN, there are plenty of comments comparing it to other languages, sometimes over half.