{"id":19686267,"url":"https://github.com/calint/compiler-2","last_synced_at":"2025-10-09T02:15:42.458Z","repository":{"id":93319696,"uuid":"61461260","full_name":"calint/compiler-2","owner":"calint","description":"experimental compiler of minimalistic language to nasm x86_64 for linux","archived":false,"fork":false,"pushed_at":"2025-10-03T10:32:19.000Z","size":2098,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-03T12:07:38.724Z","etag":null,"topics":["assembly-x86","compiler","cpp","x86-64"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/calint.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-06-19T02:30:56.000Z","updated_at":"2025-10-03T10:32:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"8779af97-a6b8-441c-86d9-bf876a622123","html_url":"https://github.com/calint/compiler-2","commit_stats":null,"previous_names":[],"tags_count":155,"template":false,"template_full_name":null,"purl":"pkg:github/calint/compiler-2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calint%2Fcompiler-2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calint%2Fcompiler-2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calint%2Fcompiler-2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calint%2Fcompiler-2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/calint","download_url":"https://codeload.github.com/calint/compiler-2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calint%2Fcompiler-2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000783,"owners_count":26082906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assembly-x86","compiler","cpp","x86-64"],"created_at":"2024-11-11T18:27:03.223Z","updated_at":"2025-10-09T02:15:42.448Z","avatar_url":"https://github.com/calint.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# compiler-2: baz\n\nExperimental compiler for a minimalistic, specialized language that targets NASM\nx86_64 assembly on Linux.\n\n## Intention\n\n* minimalistic language\n* gain experience writing compilers\n* generate handwritten-like assembler compiled by NASM for x86_64\n* super loop program with non-reentrant inlined functions\n\n## Supports\n\n* built-in integer types (64, 32, 16, 8 bit)\n* built-in boolean type\n* user defined types\n* inlined functions\n* keywords: `func`, `type`, `field`, `var`, `loop`, `if`, `else`, `continue`,\n`break`, `return`\n\n## Howto\n\n* to compile the compiler that compiles `prog.baz` and assembles the generated\ncode run `./make.sh`\n* after that use `./run-baz.sh myprogram.baz` or `./run-baz.sh` to compile and\nrun `prog.baz`\n* to run the tests `qa/coverage/run-tests.sh` and see coverage report in `qa/coverage/report/`\n\n## Source\n\n```text\nLanguage                     files          blank        comment           code\n-------------------------------------------------------------------------------\nC/C++ Header                    36            943            626           4752\nC++                              1             65             76            419\n-------------------------------------------------------------------------------\nSUM:                            37           1008            702           5171\n-------------------------------------------------------------------------------\n```\n\n## Sample\n\n```text\nfield   hello = \"hello world from baz\\n\"\nfield   input = \"............................................................\"\nfield prompt1 = \"enter name:\\n\"\nfield prompt2 = \"that is not a name.\\n\"\nfield prompt3 = \"hello \"\nfield     dot = \".\"\nfield      nl = \"\\n\"\n\n# all functions are inlined\n\n# arguments can be placed in specified register using `reg_...` syntax\nfunc exit(v : reg_rdi) {\n    mov(rax, 60)  # exit system call\n    mov(rdi, v)   # return code\n    syscall()\n}\n\nfunc print(len : reg_rdx, ptr : reg_rsi) {\n    mov(rax, 1)   # write system call\n    mov(rdi, 1)   # file descriptor for standard out\n    mov(rsi, ptr) # buffer address \n    mov(rdx, len) # buffer size\n    syscall()\n}\n\nfunc read(len : reg_rdx, ptr : reg_rsi) : i64 nbytes {\n    mov(rax, 0)   # read system call\n    mov(rdi, 0)   # file descriptor for standard input\n    mov(rsi, ptr) # buffer address\n    mov(rdx, len) # buffer size\n    syscall()\n    mov(nbytes, rax) # return value\n}\n\nfunc assert(expr : bool) {\n    if not expr exit(1)\n}\n\n# user types are defined using keyword `type`\n\n# default type is `i64` and does not need to be specified\ntype point {x, y}\n\ntype object {pos : point, color : i32}\n\n# function arguments are equivalent to mutable references\nfunc foo(pt : point) {\n    pt.x = 0b10    # binary value 2\n    pt.y = 0xb     # hex value 11\n}\n\n# default argument type is `i64`\nfunc bar(arg) {\n    if arg == 0 return\n    arg = 0xff\n}\n\nfunc inv(i : i32) : i32 res {\n    res = ~i\n}\n\n# return target is specified as a variable, in this case `res`\nfunc baz(arg) : i64 res {\n    res = arg * 2\n}\n\nfunc main() {\n    var arr : i32[4]\n    # arrays are initialized to 0\n\n    var ix = 1\n\n    arr[ix] = 2\n    arr[ix + 1] = arr[ix]\n    \n    assert(arr[1] == 2)\n    assert(arr[2] == 2)\n\n    ix = 3\n    arr[ix] = ~inv(arr[ix - 1])\n    assert(arr[ix] == 2)\n\n    var p : point = {0, 0}\n    foo(p)\n    assert(p.x == 2)\n    assert(p.y == 0xb)\n\n    var i = 0\n    bar(i)\n    assert(i == 0)\n\n    i = 1\n    bar(i)\n    assert(i == 0xff)\n\n    var j = 1\n    var k = baz(j)\n    assert(k == 2)\n\n    k = baz(1)\n    assert(k == 2)\n\n    var p0 : point = {baz(2), 0}\n    assert(p0.x == 4)\n\n    var x = 1\n    var y = 2\n\n    var o1 : object = {{x * 10, y}, 0xff0000}\n    assert(o1.pos.x == 10)\n    assert(o1.pos.y == 2)\n    assert(o1.color == 0xff0000)\n    \n    var p1 : point = {-x, -y}\n    o1.pos = p1\n    assert(o1.pos.x == -1)\n    assert(o1.pos.y == -2)\n\n    var o2 : object = o1\n    assert(o2.pos.x == -1)\n    assert(o2.pos.y == -2)\n    assert(o2.color == 0xff0000)\n\n    var o3 : object[1]\n    # index 0 in an array can be accessed without array index\n    o3.pos.y = 73\n    assert(o3[0].pos.y == 73)\n\n    print(hello.len, hello)\n    loop {\n        print(prompt1.len, prompt1)\n        var len = read(input.len, input) - 1    # -1 don't include the '\\n'\n        if len == 0 {\n            break\n        } else if len \u003c= 4 {\n            print(prompt2.len, prompt2)\n            continue\n        } else {\n            print(prompt3.len, prompt3)\n            print(len, input)\n            print(dot.len, dot)\n            print(nl.len, nl)\n        }\n    }\n}\n```\n\n## Generates\n\n```nasm\nsection .bss\nstk resd 0x10000\nstk.end:\ntrue equ 1\nfalse equ 0\nsection .data\nhello: db 'hello world from baz',10,''\nhello.len equ $-hello\ninput: db '............................................................'\ninput.len equ $-input\nprompt1: db 'enter name:',10,''\nprompt1.len equ $-prompt1\nprompt2: db 'that is not a name.',10,''\nprompt2.len equ $-prompt2\nprompt3: db 'hello '\nprompt3.len equ $-prompt3\ndot: db '.'\ndot.len equ $-dot\nnl: db '',10,''\nnl.len equ $-nl\nsection .text\nbits 64\nglobal _start\n_start:\nmov rsp,stk.end\nmain:\n    lea rdi, [rsp - 16]\n    mov rcx, 16\n    xor rax, rax\n    rep stosb\n    mov qword [rsp - 24], 1\n    mov r15, qword [rsp - 24]\n    mov dword [rsp + r15 * 4 - 16], 2\n    mov r15, qword [rsp - 24]\n    add r15, 1\n    mov r14, qword [rsp - 24]\n    mov r13d, dword [rsp + r14 * 4 - 16]\n    mov dword [rsp + r15 * 4 - 16], r13d\n    cmp_76_12:\n        mov r13, 1\n        movsx r14, dword [rsp + r13 * 4 - 16]\n    cmp r14, 2\n    jne bool_false_76_12\n    jmp bool_true_76_12\n    bool_true_76_12:\n    mov r15, true\n    jmp bool_end_76_12\n    bool_false_76_12:\n    mov r15, false\n    bool_end_76_12:\n    assert_76_5:\n        if_36_8_76_5:\n        cmp_36_8_76_5:\n        cmp r15, false\n        jne if_36_5_76_5_end\n        jmp if_36_8_76_5_code\n        if_36_8_76_5_code:\n            mov rdi, 1\n            exit_36_17_76_5:\n                mov rax, 60\n                syscall\n            exit_36_17_76_5_end:\n        if_36_5_76_5_end:\n    assert_76_5_end:\n    cmp_77_12:\n        mov r13, 2\n        movsx r14, dword [rsp + r13 * 4 - 16]\n    cmp r14, 2\n    jne bool_false_77_12\n    jmp bool_true_77_12\n    bool_true_77_12:\n    mov r15, true\n    jmp bool_end_77_12\n    bool_false_77_12:\n    mov r15, false\n    bool_end_77_12:\n    assert_77_5:\n        if_36_8_77_5:\n        cmp_36_8_77_5:\n        cmp r15, false\n        jne if_36_5_77_5_end\n        jmp if_36_8_77_5_code\n        if_36_8_77_5_code:\n            mov rdi, 1\n            exit_36_17_77_5:\n                mov rax, 60\n                syscall\n            exit_36_17_77_5_end:\n        if_36_5_77_5_end:\n    assert_77_5_end:\n    mov qword [rsp - 24], 3\n    mov r15, qword [rsp - 24]\n    mov r13, qword [rsp - 24]\n    sub r13, 1\n    movsx r14, dword [rsp + r13 * 4 - 16]\n    inv_80_16:\n        mov dword [rsp + r15 * 4 - 16], r14d\n        not dword [rsp + r15 * 4 - 16]\n    inv_80_16_end:\n    not dword [rsp + r15 * 4 - 16]\n    cmp_81_12:\n        mov r13, qword [rsp - 24]\n        movsx r14, dword [rsp + r13 * 4 - 16]\n    cmp r14, 2\n    jne bool_false_81_12\n    jmp bool_true_81_12\n    bool_true_81_12:\n    mov r15, true\n    jmp bool_end_81_12\n    bool_false_81_12:\n    mov r15, false\n    bool_end_81_12:\n    assert_81_5:\n        if_36_8_81_5:\n        cmp_36_8_81_5:\n        cmp r15, false\n        jne if_36_5_81_5_end\n        jmp if_36_8_81_5_code\n        if_36_8_81_5_code:\n            mov rdi, 1\n            exit_36_17_81_5:\n                mov rax, 60\n                syscall\n            exit_36_17_81_5_end:\n        if_36_5_81_5_end:\n    assert_81_5_end:\n    mov qword [rsp - 40], 0\n    mov qword [rsp - 32], 0\n    foo_84_5:\n        mov qword [rsp - 40], 0b10\n        mov qword [rsp - 32], 0xb\n    foo_84_5_end:\n    cmp_85_12:\n    cmp qword [rsp - 40], 2\n    jne bool_false_85_12\n    jmp bool_true_85_12\n    bool_true_85_12:\n    mov r15, true\n    jmp bool_end_85_12\n    bool_false_85_12:\n    mov r15, false\n    bool_end_85_12:\n    assert_85_5:\n        if_36_8_85_5:\n        cmp_36_8_85_5:\n        cmp r15, false\n        jne if_36_5_85_5_end\n        jmp if_36_8_85_5_code\n        if_36_8_85_5_code:\n            mov rdi, 1\n            exit_36_17_85_5:\n                mov rax, 60\n                syscall\n            exit_36_17_85_5_end:\n        if_36_5_85_5_end:\n    assert_85_5_end:\n    cmp_86_12:\n    cmp qword [rsp - 32], 0xb\n    jne bool_false_86_12\n    jmp bool_true_86_12\n    bool_true_86_12:\n    mov r15, true\n    jmp bool_end_86_12\n    bool_false_86_12:\n    mov r15, false\n    bool_end_86_12:\n    assert_86_5:\n        if_36_8_86_5:\n        cmp_36_8_86_5:\n        cmp r15, false\n        jne if_36_5_86_5_end\n        jmp if_36_8_86_5_code\n        if_36_8_86_5_code:\n            mov rdi, 1\n            exit_36_17_86_5:\n                mov rax, 60\n                syscall\n            exit_36_17_86_5_end:\n        if_36_5_86_5_end:\n    assert_86_5_end:\n    mov qword [rsp - 48], 0\n    bar_89_5:\n        if_54_8_89_5:\n        cmp_54_8_89_5:\n        cmp qword [rsp - 48], 0\n        jne if_54_5_89_5_end\n        jmp if_54_8_89_5_code\n        if_54_8_89_5_code:\n            jmp bar_89_5_end\n        if_54_5_89_5_end:\n        mov qword [rsp - 48], 0xff\n    bar_89_5_end:\n    cmp_90_12:\n    cmp qword [rsp - 48], 0\n    jne bool_false_90_12\n    jmp bool_true_90_12\n    bool_true_90_12:\n    mov r15, true\n    jmp bool_end_90_12\n    bool_false_90_12:\n    mov r15, false\n    bool_end_90_12:\n    assert_90_5:\n        if_36_8_90_5:\n        cmp_36_8_90_5:\n        cmp r15, false\n        jne if_36_5_90_5_end\n        jmp if_36_8_90_5_code\n        if_36_8_90_5_code:\n            mov rdi, 1\n            exit_36_17_90_5:\n                mov rax, 60\n                syscall\n            exit_36_17_90_5_end:\n        if_36_5_90_5_end:\n    assert_90_5_end:\n    mov qword [rsp - 48], 1\n    bar_93_5:\n        if_54_8_93_5:\n        cmp_54_8_93_5:\n        cmp qword [rsp - 48], 0\n        jne if_54_5_93_5_end\n        jmp if_54_8_93_5_code\n        if_54_8_93_5_code:\n            jmp bar_93_5_end\n        if_54_5_93_5_end:\n        mov qword [rsp - 48], 0xff\n    bar_93_5_end:\n    cmp_94_12:\n    cmp qword [rsp - 48], 0xff\n    jne bool_false_94_12\n    jmp bool_true_94_12\n    bool_true_94_12:\n    mov r15, true\n    jmp bool_end_94_12\n    bool_false_94_12:\n    mov r15, false\n    bool_end_94_12:\n    assert_94_5:\n        if_36_8_94_5:\n        cmp_36_8_94_5:\n        cmp r15, false\n        jne if_36_5_94_5_end\n        jmp if_36_8_94_5_code\n        if_36_8_94_5_code:\n            mov rdi, 1\n            exit_36_17_94_5:\n                mov rax, 60\n                syscall\n            exit_36_17_94_5_end:\n        if_36_5_94_5_end:\n    assert_94_5_end:\n    mov qword [rsp - 56], 1\n    baz_97_13:\n        mov r15, qword [rsp - 56]\n        mov qword [rsp - 64], r15\n        mov r15, qword [rsp - 64]\n        imul r15, 2\n        mov qword [rsp - 64], r15\n    baz_97_13_end:\n    cmp_98_12:\n    cmp qword [rsp - 64], 2\n    jne bool_false_98_12\n    jmp bool_true_98_12\n    bool_true_98_12:\n    mov r15, true\n    jmp bool_end_98_12\n    bool_false_98_12:\n    mov r15, false\n    bool_end_98_12:\n    assert_98_5:\n        if_36_8_98_5:\n        cmp_36_8_98_5:\n        cmp r15, false\n        jne if_36_5_98_5_end\n        jmp if_36_8_98_5_code\n        if_36_8_98_5_code:\n            mov rdi, 1\n            exit_36_17_98_5:\n                mov rax, 60\n                syscall\n            exit_36_17_98_5_end:\n        if_36_5_98_5_end:\n    assert_98_5_end:\n    baz_100_9:\n        mov qword [rsp - 64], 1\n        mov r15, qword [rsp - 64]\n        imul r15, 2\n        mov qword [rsp - 64], r15\n    baz_100_9_end:\n    cmp_101_12:\n    cmp qword [rsp - 64], 2\n    jne bool_false_101_12\n    jmp bool_true_101_12\n    bool_true_101_12:\n    mov r15, true\n    jmp bool_end_101_12\n    bool_false_101_12:\n    mov r15, false\n    bool_end_101_12:\n    assert_101_5:\n        if_36_8_101_5:\n        cmp_36_8_101_5:\n        cmp r15, false\n        jne if_36_5_101_5_end\n        jmp if_36_8_101_5_code\n        if_36_8_101_5_code:\n            mov rdi, 1\n            exit_36_17_101_5:\n                mov rax, 60\n                syscall\n            exit_36_17_101_5_end:\n        if_36_5_101_5_end:\n    assert_101_5_end:\n    baz_103_23:\n        mov qword [rsp - 80], 2\n        mov r15, qword [rsp - 80]\n        imul r15, 2\n        mov qword [rsp - 80], r15\n    baz_103_23_end:\n    mov qword [rsp - 72], 0\n    cmp_104_12:\n    cmp qword [rsp - 80], 4\n    jne bool_false_104_12\n    jmp bool_true_104_12\n    bool_true_104_12:\n    mov r15, true\n    jmp bool_end_104_12\n    bool_false_104_12:\n    mov r15, false\n    bool_end_104_12:\n    assert_104_5:\n        if_36_8_104_5:\n        cmp_36_8_104_5:\n        cmp r15, false\n        jne if_36_5_104_5_end\n        jmp if_36_8_104_5_code\n        if_36_8_104_5_code:\n            mov rdi, 1\n            exit_36_17_104_5:\n                mov rax, 60\n                syscall\n            exit_36_17_104_5_end:\n        if_36_5_104_5_end:\n    assert_104_5_end:\n    mov qword [rsp - 88], 1\n    mov qword [rsp - 96], 2\n        mov r15, qword [rsp - 88]\n        mov qword [rsp - 116], r15\n        mov r15, qword [rsp - 116]\n        imul r15, 10\n        mov qword [rsp - 116], r15\n        mov r15, qword [rsp - 96]\n        mov qword [rsp - 108], r15\n    mov dword [rsp - 100], 0xff0000\n    cmp_110_12:\n    cmp qword [rsp - 116], 10\n    jne bool_false_110_12\n    jmp bool_true_110_12\n    bool_true_110_12:\n    mov r15, true\n    jmp bool_end_110_12\n    bool_false_110_12:\n    mov r15, false\n    bool_end_110_12:\n    assert_110_5:\n        if_36_8_110_5:\n        cmp_36_8_110_5:\n        cmp r15, false\n        jne if_36_5_110_5_end\n        jmp if_36_8_110_5_code\n        if_36_8_110_5_code:\n            mov rdi, 1\n            exit_36_17_110_5:\n                mov rax, 60\n                syscall\n            exit_36_17_110_5_end:\n        if_36_5_110_5_end:\n    assert_110_5_end:\n    cmp_111_12:\n    cmp qword [rsp - 108], 2\n    jne bool_false_111_12\n    jmp bool_true_111_12\n    bool_true_111_12:\n    mov r15, true\n    jmp bool_end_111_12\n    bool_false_111_12:\n    mov r15, false\n    bool_end_111_12:\n    assert_111_5:\n        if_36_8_111_5:\n        cmp_36_8_111_5:\n        cmp r15, false\n        jne if_36_5_111_5_end\n        jmp if_36_8_111_5_code\n        if_36_8_111_5_code:\n            mov rdi, 1\n            exit_36_17_111_5:\n                mov rax, 60\n                syscall\n            exit_36_17_111_5_end:\n        if_36_5_111_5_end:\n    assert_111_5_end:\n    cmp_112_12:\n    cmp dword [rsp - 100], 0xff0000\n    jne bool_false_112_12\n    jmp bool_true_112_12\n    bool_true_112_12:\n    mov r15, true\n    jmp bool_end_112_12\n    bool_false_112_12:\n    mov r15, false\n    bool_end_112_12:\n    assert_112_5:\n        if_36_8_112_5:\n        cmp_36_8_112_5:\n        cmp r15, false\n        jne if_36_5_112_5_end\n        jmp if_36_8_112_5_code\n        if_36_8_112_5_code:\n            mov rdi, 1\n            exit_36_17_112_5:\n                mov rax, 60\n                syscall\n            exit_36_17_112_5_end:\n        if_36_5_112_5_end:\n    assert_112_5_end:\n    mov r15, qword [rsp - 88]\n    mov qword [rsp - 132], r15\n    neg qword [rsp - 132]\n    mov r15, qword [rsp - 96]\n    mov qword [rsp - 124], r15\n    neg qword [rsp - 124]\n    lea rdi, [rsp - 116]\n    lea rsi, [rsp - 132]\n    mov rcx, 16\n    rep movsb\n    cmp_116_12:\n    cmp qword [rsp - 116], -1\n    jne bool_false_116_12\n    jmp bool_true_116_12\n    bool_true_116_12:\n    mov r15, true\n    jmp bool_end_116_12\n    bool_false_116_12:\n    mov r15, false\n    bool_end_116_12:\n    assert_116_5:\n        if_36_8_116_5:\n        cmp_36_8_116_5:\n        cmp r15, false\n        jne if_36_5_116_5_end\n        jmp if_36_8_116_5_code\n        if_36_8_116_5_code:\n            mov rdi, 1\n            exit_36_17_116_5:\n                mov rax, 60\n                syscall\n            exit_36_17_116_5_end:\n        if_36_5_116_5_end:\n    assert_116_5_end:\n    cmp_117_12:\n    cmp qword [rsp - 108], -2\n    jne bool_false_117_12\n    jmp bool_true_117_12\n    bool_true_117_12:\n    mov r15, true\n    jmp bool_end_117_12\n    bool_false_117_12:\n    mov r15, false\n    bool_end_117_12:\n    assert_117_5:\n        if_36_8_117_5:\n        cmp_36_8_117_5:\n        cmp r15, false\n        jne if_36_5_117_5_end\n        jmp if_36_8_117_5_code\n        if_36_8_117_5_code:\n            mov rdi, 1\n            exit_36_17_117_5:\n                mov rax, 60\n                syscall\n            exit_36_17_117_5_end:\n        if_36_5_117_5_end:\n    assert_117_5_end:\n    lea rdi, [rsp - 152]\n    lea rsi, [rsp - 116]\n    mov rcx, 20\n    rep movsb\n    cmp_120_12:\n    cmp qword [rsp - 152], -1\n    jne bool_false_120_12\n    jmp bool_true_120_12\n    bool_true_120_12:\n    mov r15, true\n    jmp bool_end_120_12\n    bool_false_120_12:\n    mov r15, false\n    bool_end_120_12:\n    assert_120_5:\n        if_36_8_120_5:\n        cmp_36_8_120_5:\n        cmp r15, false\n        jne if_36_5_120_5_end\n        jmp if_36_8_120_5_code\n        if_36_8_120_5_code:\n            mov rdi, 1\n            exit_36_17_120_5:\n                mov rax, 60\n                syscall\n            exit_36_17_120_5_end:\n        if_36_5_120_5_end:\n    assert_120_5_end:\n    cmp_121_12:\n    cmp qword [rsp - 144], -2\n    jne bool_false_121_12\n    jmp bool_true_121_12\n    bool_true_121_12:\n    mov r15, true\n    jmp bool_end_121_12\n    bool_false_121_12:\n    mov r15, false\n    bool_end_121_12:\n    assert_121_5:\n        if_36_8_121_5:\n        cmp_36_8_121_5:\n        cmp r15, false\n        jne if_36_5_121_5_end\n        jmp if_36_8_121_5_code\n        if_36_8_121_5_code:\n            mov rdi, 1\n            exit_36_17_121_5:\n                mov rax, 60\n                syscall\n            exit_36_17_121_5_end:\n        if_36_5_121_5_end:\n    assert_121_5_end:\n    cmp_122_12:\n    cmp dword [rsp - 136], 0xff0000\n    jne bool_false_122_12\n    jmp bool_true_122_12\n    bool_true_122_12:\n    mov r15, true\n    jmp bool_end_122_12\n    bool_false_122_12:\n    mov r15, false\n    bool_end_122_12:\n    assert_122_5:\n        if_36_8_122_5:\n        cmp_36_8_122_5:\n        cmp r15, false\n        jne if_36_5_122_5_end\n        jmp if_36_8_122_5_code\n        if_36_8_122_5_code:\n            mov rdi, 1\n            exit_36_17_122_5:\n                mov rax, 60\n                syscall\n            exit_36_17_122_5_end:\n        if_36_5_122_5_end:\n    assert_122_5_end:\n    lea rdi, [rsp - 172]\n    mov rcx, 20\n    xor rax, rax\n    rep stosb\n    mov qword [rsp - 164], 73\n    cmp_127_12:\n        lea r13, [rsp - 172]\n        mov r12, 0\n        imul r12, 20\n        add r13, r12\n        add r13, 8\n        mov r14, qword [r13]\n    cmp r14, 73\n    jne bool_false_127_12\n    jmp bool_true_127_12\n    bool_true_127_12:\n    mov r15, true\n    jmp bool_end_127_12\n    bool_false_127_12:\n    mov r15, false\n    bool_end_127_12:\n    assert_127_5:\n        if_36_8_127_5:\n        cmp_36_8_127_5:\n        cmp r15, false\n        jne if_36_5_127_5_end\n        jmp if_36_8_127_5_code\n        if_36_8_127_5_code:\n            mov rdi, 1\n            exit_36_17_127_5:\n                mov rax, 60\n                syscall\n            exit_36_17_127_5_end:\n        if_36_5_127_5_end:\n    assert_127_5_end:\n    mov rdx, hello.len\n    mov rsi, hello\n    print_129_5:\n        mov rax, 1\n        mov rdi, 1\n        syscall\n    print_129_5_end:\n    loop_130_5:\n        mov rdx, prompt1.len\n        mov rsi, prompt1\n        print_131_9:\n            mov rax, 1\n            mov rdi, 1\n            syscall\n        print_131_9_end:\n        mov rdx, input.len\n        mov rsi, input\n        read_132_19:\n            mov rax, 0\n            mov rdi, 0\n            syscall\n            mov qword [rsp - 180], rax\n        read_132_19_end:\n        sub qword [rsp - 180], 1\n        if_133_12:\n        cmp_133_12:\n        cmp qword [rsp - 180], 0\n        jne if_135_19\n        jmp if_133_12_code\n        if_133_12_code:\n            jmp loop_130_5_end\n        jmp if_133_9_end\n        if_135_19:\n        cmp_135_19:\n        cmp qword [rsp - 180], 4\n        jg if_else_133_9\n        jmp if_135_19_code\n        if_135_19_code:\n            mov rdx, prompt2.len\n            mov rsi, prompt2\n            print_136_13:\n                mov rax, 1\n                mov rdi, 1\n                syscall\n            print_136_13_end:\n            jmp loop_130_5\n        jmp if_133_9_end\n        if_else_133_9:\n            mov rdx, prompt3.len\n            mov rsi, prompt3\n            print_139_13:\n                mov rax, 1\n                mov rdi, 1\n                syscall\n            print_139_13_end:\n            mov rdx, qword [rsp - 180]\n            mov rsi, input\n            print_140_13:\n                mov rax, 1\n                mov rdi, 1\n                syscall\n            print_140_13_end:\n            mov rdx, dot.len\n            mov rsi, dot\n            print_141_13:\n                mov rax, 1\n                mov rdi, 1\n                syscall\n            print_141_13_end:\n            mov rdx, nl.len\n            mov rsi, nl\n            print_142_13:\n                mov rax, 1\n                mov rdi, 1\n                syscall\n            print_142_13_end:\n        if_133_9_end:\n    jmp loop_130_5\n    loop_130_5_end:\n    mov rax, 60\n    mov rdi, 0\n    syscall\n```\n\n## With comments\n\n```nasm\n\n; generated by baz\n\nsection .bss\nstk resd 0x10000\nstk.end:\n\ntrue equ 1\nfalse equ 0\n\nsection .data\n;[1:1] field hello = \"hello world from baz\\n\"\nhello: db 'hello world from baz',10,''\nhello.len equ $-hello\n;[2:1] field input = \"............................................................\"\ninput: db '............................................................'\ninput.len equ $-input\n;[3:1] field prompt1 = \"enter name:\\n\"\nprompt1: db 'enter name:',10,''\nprompt1.len equ $-prompt1\n;[4:1] field prompt2 = \"that is not a name.\\n\"\nprompt2: db 'that is not a name.',10,''\nprompt2.len equ $-prompt2\n;[5:1] field prompt3 = \"hello \"\nprompt3: db 'hello '\nprompt3.len equ $-prompt3\n;[6:1] field dot = \".\"\ndot: db '.'\ndot.len equ $-dot\n;[7:1] field nl = \"\\n\"\nnl: db '',10,''\nnl.len equ $-nl\n\nsection .text\nbits 64\nglobal _start\n_start:\nmov rsp,stk.end\n; program\n;[9:1] # all functions are inlined\n;[11:1] # arguments can be placed in specified register using `reg_...` syntax\n;[39:1] # user types are defined using keyword `type`\n;[41:1] # default type is `i64` and does not need to be specified\n;[46:1]  # function arguments are equivalent to mutable references\n;[52:1] # default argument type is `i64`\n;[62:1] # return target is specified as a variable, in this case `res`\nmain:\n;    var arr: i32[4] @ dword [rsp - 16]\n;    [68:5]  var arr : i32[4]\n;    clear array 4 * 4 B = 16 B\n;    allocate named register 'rdi'\n;    allocate named register 'rcx'\n;    allocate named register 'rax'\n    lea rdi, [rsp - 16]\n    mov rcx, 16\n    xor rax, rax\n    rep stosb\n;    free named register 'rax'\n;    free named register 'rcx'\n;    free named register 'rdi'\n;    [69:5] # arrays are initialized to 0\n;    var ix: i64 @ qword [rsp - 24]\n;    [71:5] var ix = 1\n;    [71:14] ix =1\n;    [71:14] 1\n;    [71:14] 1\n;    [73:5] ix = 1\n    mov qword [rsp - 24], 1\n;    [73:8] arr[ix] = 2\n;    allocate scratch register -\u003e r15\n;    [73:9] ix\n;    [73:9] ix\n;    [73:11] r15 = ix\n    mov r15, qword [rsp - 24]\n;    [73:15]  2\n;    [73:15] 2\n;    [74:5] dword [rsp + r15 * 4 - 16] = 2\n    mov dword [rsp + r15 * 4 - 16], 2\n;    free scratch register 'r15'\n;    [74:8] arr[ix + 1] = arr[ix]\n;    allocate scratch register -\u003e r15\n;    [74:9] ix + 1\n;    [74:9] ix + 1\n;    [74:12] r15 = ix\n    mov r15, qword [rsp - 24]\n;    [74:15] r15 + 1\n    add r15, 1\n;    [74:19]  arr[ix]\n;    [74:19] arr[ix]\n;    [74:22] dword [rsp + r15 * 4 - 16] = arr[ix]\n;    [74:22] arr[ix]\n;    allocate scratch register -\u003e r14\n;    [74:23] ix\n;    [74:23] ix\n;    [74:25] r14 = ix\n    mov r14, qword [rsp - 24]\n;    allocate scratch register -\u003e r13\n    mov r13d, dword [rsp + r14 * 4 - 16]\n    mov dword [rsp + r15 * 4 - 16], r13d\n;    free scratch register 'r13'\n;    free scratch register 'r14'\n;    free scratch register 'r15'\n;    [76:5] assert(arr[1] == 2)\n;    allocate scratch register -\u003e r15\n;    [76:12] arr[1] == 2\n;    [76:12] ? arr[1] == 2\n;    [76:12] ? arr[1] == 2\n    cmp_76_12:\n;    allocate scratch register -\u003e r14\n;        [76:12] arr[1]\n;        [76:15] r14 = arr[1]\n;        [76:15] arr[1]\n;        allocate scratch register -\u003e r13\n;        [76:16] 1\n;        [76:16] 1\n;        [76:17] r13 = 1\n        mov r13, 1\n        movsx r14, dword [rsp + r13 * 4 - 16]\n;        free scratch register 'r13'\n    cmp r14, 2\n;    free scratch register 'r14'\n    jne bool_false_76_12\n    jmp bool_true_76_12\n    bool_true_76_12:\n    mov r15, true\n    jmp bool_end_76_12\n    bool_false_76_12:\n    mov r15, false\n    bool_end_76_12:\n;    assert(expr : bool) \n    assert_76_5:\n;        alias expr -\u003e r15\n        if_36_8_76_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_76_5:\n        cmp r15, false\n        jne if_36_5_76_5_end\n        jmp if_36_8_76_5_code\n        if_36_8_76_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_76_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_76_5_end:\n;                free named register 'rdi'\n        if_36_5_76_5_end:\n    assert_76_5_end:\n;        free scratch register 'r15'\n;    [77:5] assert(arr[2] == 2)\n;    allocate scratch register -\u003e r15\n;    [77:12] arr[2] == 2\n;    [77:12] ? arr[2] == 2\n;    [77:12] ? arr[2] == 2\n    cmp_77_12:\n;    allocate scratch register -\u003e r14\n;        [77:12] arr[2]\n;        [77:15] r14 = arr[2]\n;        [77:15] arr[2]\n;        allocate scratch register -\u003e r13\n;        [77:16] 2\n;        [77:16] 2\n;        [77:17] r13 = 2\n        mov r13, 2\n        movsx r14, dword [rsp + r13 * 4 - 16]\n;        free scratch register 'r13'\n    cmp r14, 2\n;    free scratch register 'r14'\n    jne bool_false_77_12\n    jmp bool_true_77_12\n    bool_true_77_12:\n    mov r15, true\n    jmp bool_end_77_12\n    bool_false_77_12:\n    mov r15, false\n    bool_end_77_12:\n;    assert(expr : bool) \n    assert_77_5:\n;        alias expr -\u003e r15\n        if_36_8_77_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_77_5:\n        cmp r15, false\n        jne if_36_5_77_5_end\n        jmp if_36_8_77_5_code\n        if_36_8_77_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_77_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_77_5_end:\n;                free named register 'rdi'\n        if_36_5_77_5_end:\n    assert_77_5_end:\n;        free scratch register 'r15'\n;    [79:8] ix = 3\n;    [79:10]  3\n;    [79:10] 3\n;    [80:5] ix = 3\n    mov qword [rsp - 24], 3\n;    [80:8] arr[ix] = ~inv(arr[ix - 1])\n;    allocate scratch register -\u003e r15\n;    [80:9] ix\n;    [80:9] ix\n;    [80:11] r15 = ix\n    mov r15, qword [rsp - 24]\n;    [80:15]  ~inv(arr[ix - 1])\n;    [80:15] ~inv(arr[ix - 1])\n;    [80:16] dword [rsp + r15 * 4 - 16] = ~inv(arr[ix - 1])\n;    [80:16] ~inv(arr[ix - 1])\n;    allocate scratch register -\u003e r14\n;    [80:20] arr[ix - 1]\n;    [80:20] arr[ix - 1]\n;    [80:23] r14 = arr[ix - 1]\n;    [80:23] arr[ix - 1]\n;    allocate scratch register -\u003e r13\n;    [80:24] ix - 1\n;    [80:24] ix - 1\n;    [80:27] r13 = ix\n    mov r13, qword [rsp - 24]\n;    [80:30] r13 - 1\n    sub r13, 1\n    movsx r14, dword [rsp + r13 * 4 - 16]\n;    free scratch register 'r13'\n;    inv(i : i32) : i32 res \n    inv_80_16:\n;        alias res -\u003e dword [rsp + r15 * 4 - 16]\n;        alias i -\u003e r14\n;        [59:9]  res = ~i\n;        [59:11]  ~i\n;        [59:11] ~i\n;        [60:1] res = ~i\n        mov dword [rsp + r15 * 4 - 16], r14d\n        not dword [rsp + r15 * 4 - 16]\n    inv_80_16_end:\n;        free scratch register 'r14'\n    not dword [rsp + r15 * 4 - 16]\n;    free scratch register 'r15'\n;    [81:5] assert(arr[ix] == 2)\n;    allocate scratch register -\u003e r15\n;    [81:12] arr[ix] == 2\n;    [81:12] ? arr[ix] == 2\n;    [81:12] ? arr[ix] == 2\n    cmp_81_12:\n;    allocate scratch register -\u003e r14\n;        [81:12] arr[ix]\n;        [81:15] r14 = arr[ix]\n;        [81:15] arr[ix]\n;        allocate scratch register -\u003e r13\n;        [81:16] ix\n;        [81:16] ix\n;        [81:18] r13 = ix\n        mov r13, qword [rsp - 24]\n        movsx r14, dword [rsp + r13 * 4 - 16]\n;        free scratch register 'r13'\n    cmp r14, 2\n;    free scratch register 'r14'\n    jne bool_false_81_12\n    jmp bool_true_81_12\n    bool_true_81_12:\n    mov r15, true\n    jmp bool_end_81_12\n    bool_false_81_12:\n    mov r15, false\n    bool_end_81_12:\n;    assert(expr : bool) \n    assert_81_5:\n;        alias expr -\u003e r15\n        if_36_8_81_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_81_5:\n        cmp r15, false\n        jne if_36_5_81_5_end\n        jmp if_36_8_81_5_code\n        if_36_8_81_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_81_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_81_5_end:\n;                free named register 'rdi'\n        if_36_5_81_5_end:\n    assert_81_5_end:\n;        free scratch register 'r15'\n;    var p: point @ qword [rsp - 40]\n;    [83:5] var p : point = {0, 0}\n;    [83:21] p ={0, 0}\n;    [83:21] {0, 0}\n;    [83:21] {0, 0}\n;    [83:22] 0\n;    [83:22] 0\n;    [83:23] p.x = 0\n    mov qword [rsp - 40], 0\n;    [83:25]  0\n;    [83:25] 0\n;    [83:26] p.y = 0\n    mov qword [rsp - 32], 0\n;    [84:5]  foo(p)\n;    foo(pt : point) \n    foo_84_5:\n;        alias pt -\u003e p\n;        [48:7]  pt.x = 0b10\n;        [48:12]  0b10\n;        [48:12] 0b10\n;        [48:20] pt.x = 0b10\n        mov qword [rsp - 40], 0b10\n;        [48:20] # binary value 2\n;        [49:7] pt.y = 0xb\n;        [49:12]  0xb\n;        [49:12] 0xb\n;        [49:20] pt.y = 0xb\n        mov qword [rsp - 32], 0xb\n;        [49:20] # hex value 11\n    foo_84_5_end:\n;    [85:5] assert(p.x == 2)\n;    allocate scratch register -\u003e r15\n;    [85:12] p.x == 2\n;    [85:12] ? p.x == 2\n;    [85:12] ? p.x == 2\n    cmp_85_12:\n    cmp qword [rsp - 40], 2\n    jne bool_false_85_12\n    jmp bool_true_85_12\n    bool_true_85_12:\n    mov r15, true\n    jmp bool_end_85_12\n    bool_false_85_12:\n    mov r15, false\n    bool_end_85_12:\n;    assert(expr : bool) \n    assert_85_5:\n;        alias expr -\u003e r15\n        if_36_8_85_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_85_5:\n        cmp r15, false\n        jne if_36_5_85_5_end\n        jmp if_36_8_85_5_code\n        if_36_8_85_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_85_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_85_5_end:\n;                free named register 'rdi'\n        if_36_5_85_5_end:\n    assert_85_5_end:\n;        free scratch register 'r15'\n;    [86:5] assert(p.y == 0xb)\n;    allocate scratch register -\u003e r15\n;    [86:12] p.y == 0xb\n;    [86:12] ? p.y == 0xb\n;    [86:12] ? p.y == 0xb\n    cmp_86_12:\n    cmp qword [rsp - 32], 0xb\n    jne bool_false_86_12\n    jmp bool_true_86_12\n    bool_true_86_12:\n    mov r15, true\n    jmp bool_end_86_12\n    bool_false_86_12:\n    mov r15, false\n    bool_end_86_12:\n;    assert(expr : bool) \n    assert_86_5:\n;        alias expr -\u003e r15\n        if_36_8_86_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_86_5:\n        cmp r15, false\n        jne if_36_5_86_5_end\n        jmp if_36_8_86_5_code\n        if_36_8_86_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_86_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_86_5_end:\n;                free named register 'rdi'\n        if_36_5_86_5_end:\n    assert_86_5_end:\n;        free scratch register 'r15'\n;    var i: i64 @ qword [rsp - 48]\n;    [88:5] var i = 0\n;    [88:13] i =0\n;    [88:13] 0\n;    [88:13] 0\n;    [89:5] i = 0\n    mov qword [rsp - 48], 0\n;    [89:5] bar(i)\n;    bar(arg) \n    bar_89_5:\n;        alias arg -\u003e i\n        if_54_8_89_5:\n;        [54:8] ? arg == 0\n;        [54:8] ? arg == 0\n        cmp_54_8_89_5:\n        cmp qword [rsp - 48], 0\n        jne if_54_5_89_5_end\n        jmp if_54_8_89_5_code\n        if_54_8_89_5_code:\n;            [54:17] return\n            jmp bar_89_5_end\n        if_54_5_89_5_end:\n;        [55:9] arg = 0xff\n;        [55:11]  0xff\n;        [55:11] 0xff\n;        [56:1] arg = 0xff\n        mov qword [rsp - 48], 0xff\n    bar_89_5_end:\n;    [90:5] assert(i == 0)\n;    allocate scratch register -\u003e r15\n;    [90:12] i == 0\n;    [90:12] ? i == 0\n;    [90:12] ? i == 0\n    cmp_90_12:\n    cmp qword [rsp - 48], 0\n    jne bool_false_90_12\n    jmp bool_true_90_12\n    bool_true_90_12:\n    mov r15, true\n    jmp bool_end_90_12\n    bool_false_90_12:\n    mov r15, false\n    bool_end_90_12:\n;    assert(expr : bool) \n    assert_90_5:\n;        alias expr -\u003e r15\n        if_36_8_90_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_90_5:\n        cmp r15, false\n        jne if_36_5_90_5_end\n        jmp if_36_8_90_5_code\n        if_36_8_90_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_90_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_90_5_end:\n;                free named register 'rdi'\n        if_36_5_90_5_end:\n    assert_90_5_end:\n;        free scratch register 'r15'\n;    [92:7] i = 1\n;    [92:9]  1\n;    [92:9] 1\n;    [93:5] i = 1\n    mov qword [rsp - 48], 1\n;    [93:5] bar(i)\n;    bar(arg) \n    bar_93_5:\n;        alias arg -\u003e i\n        if_54_8_93_5:\n;        [54:8] ? arg == 0\n;        [54:8] ? arg == 0\n        cmp_54_8_93_5:\n        cmp qword [rsp - 48], 0\n        jne if_54_5_93_5_end\n        jmp if_54_8_93_5_code\n        if_54_8_93_5_code:\n;            [54:17] return\n            jmp bar_93_5_end\n        if_54_5_93_5_end:\n;        [55:9] arg = 0xff\n;        [55:11]  0xff\n;        [55:11] 0xff\n;        [56:1] arg = 0xff\n        mov qword [rsp - 48], 0xff\n    bar_93_5_end:\n;    [94:5] assert(i == 0xff)\n;    allocate scratch register -\u003e r15\n;    [94:12] i == 0xff\n;    [94:12] ? i == 0xff\n;    [94:12] ? i == 0xff\n    cmp_94_12:\n    cmp qword [rsp - 48], 0xff\n    jne bool_false_94_12\n    jmp bool_true_94_12\n    bool_true_94_12:\n    mov r15, true\n    jmp bool_end_94_12\n    bool_false_94_12:\n    mov r15, false\n    bool_end_94_12:\n;    assert(expr : bool) \n    assert_94_5:\n;        alias expr -\u003e r15\n        if_36_8_94_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_94_5:\n        cmp r15, false\n        jne if_36_5_94_5_end\n        jmp if_36_8_94_5_code\n        if_36_8_94_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_94_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_94_5_end:\n;                free named register 'rdi'\n        if_36_5_94_5_end:\n    assert_94_5_end:\n;        free scratch register 'r15'\n;    var j: i64 @ qword [rsp - 56]\n;    [96:5] var j = 1\n;    [96:13] j =1\n;    [96:13] 1\n;    [96:13] 1\n;    [97:5] j = 1\n    mov qword [rsp - 56], 1\n;    var k: i64 @ qword [rsp - 64]\n;    [97:5] var k = baz(j)\n;    [97:13] k =baz(j)\n;    [97:13] baz(j)\n;    [97:13] baz(j)\n;    [97:13] k = baz(j)\n;    [97:13] baz(j)\n;    baz(arg) : i64 res \n    baz_97_13:\n;        alias res -\u003e k\n;        alias arg -\u003e j\n;        [64:9]  res = arg * 2\n;        [64:11]  arg * 2\n;        [64:11] arg * 2\n;        [64:15] res = arg\n;        allocate scratch register -\u003e r15\n        mov r15, qword [rsp - 56]\n        mov qword [rsp - 64], r15\n;        free scratch register 'r15'\n;        [65:1] res * 2\n;        allocate scratch register -\u003e r15\n        mov r15, qword [rsp - 64]\n        imul r15, 2\n        mov qword [rsp - 64], r15\n;        free scratch register 'r15'\n    baz_97_13_end:\n;    [98:5] assert(k == 2)\n;    allocate scratch register -\u003e r15\n;    [98:12] k == 2\n;    [98:12] ? k == 2\n;    [98:12] ? k == 2\n    cmp_98_12:\n    cmp qword [rsp - 64], 2\n    jne bool_false_98_12\n    jmp bool_true_98_12\n    bool_true_98_12:\n    mov r15, true\n    jmp bool_end_98_12\n    bool_false_98_12:\n    mov r15, false\n    bool_end_98_12:\n;    assert(expr : bool) \n    assert_98_5:\n;        alias expr -\u003e r15\n        if_36_8_98_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_98_5:\n        cmp r15, false\n        jne if_36_5_98_5_end\n        jmp if_36_8_98_5_code\n        if_36_8_98_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_98_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_98_5_end:\n;                free named register 'rdi'\n        if_36_5_98_5_end:\n    assert_98_5_end:\n;        free scratch register 'r15'\n;    [100:7] k = baz(1)\n;    [100:9]  baz(1)\n;    [100:9] baz(1)\n;    [100:9] k = baz(1)\n;    [100:9] baz(1)\n;    baz(arg) : i64 res \n    baz_100_9:\n;        alias res -\u003e k\n;        alias arg -\u003e 1\n;        [64:9]  res = arg * 2\n;        [64:11]  arg * 2\n;        [64:11] arg * 2\n;        [64:15] res = arg\n        mov qword [rsp - 64], 1\n;        [65:1] res * 2\n;        allocate scratch register -\u003e r15\n        mov r15, qword [rsp - 64]\n        imul r15, 2\n        mov qword [rsp - 64], r15\n;        free scratch register 'r15'\n    baz_100_9_end:\n;    [101:5] assert(k == 2)\n;    allocate scratch register -\u003e r15\n;    [101:12] k == 2\n;    [101:12] ? k == 2\n;    [101:12] ? k == 2\n    cmp_101_12:\n    cmp qword [rsp - 64], 2\n    jne bool_false_101_12\n    jmp bool_true_101_12\n    bool_true_101_12:\n    mov r15, true\n    jmp bool_end_101_12\n    bool_false_101_12:\n    mov r15, false\n    bool_end_101_12:\n;    assert(expr : bool) \n    assert_101_5:\n;        alias expr -\u003e r15\n        if_36_8_101_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_101_5:\n        cmp r15, false\n        jne if_36_5_101_5_end\n        jmp if_36_8_101_5_code\n        if_36_8_101_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_101_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_101_5_end:\n;                free named register 'rdi'\n        if_36_5_101_5_end:\n    assert_101_5_end:\n;        free scratch register 'r15'\n;    var p0: point @ qword [rsp - 80]\n;    [103:5] var p0 : point = {baz(2), 0}\n;    [103:22] p0 ={baz(2), 0}\n;    [103:22] {baz(2), 0}\n;    [103:22] {baz(2), 0}\n;    [103:23] baz(2)\n;    [103:23] baz(2)\n;    [103:23] p0.x = baz(2)\n;    [103:23] baz(2)\n;    baz(arg) : i64 res \n    baz_103_23:\n;        alias res -\u003e p0.x\n;        alias arg -\u003e 2\n;        [64:9]  res = arg * 2\n;        [64:11]  arg * 2\n;        [64:11] arg * 2\n;        [64:15] res = arg\n        mov qword [rsp - 80], 2\n;        [65:1] res * 2\n;        allocate scratch register -\u003e r15\n        mov r15, qword [rsp - 80]\n        imul r15, 2\n        mov qword [rsp - 80], r15\n;        free scratch register 'r15'\n    baz_103_23_end:\n;    [103:31]  0\n;    [103:31] 0\n;    [103:32] p0.y = 0\n    mov qword [rsp - 72], 0\n;    [104:5]  assert(p0.x == 4)\n;    allocate scratch register -\u003e r15\n;    [104:12] p0.x == 4\n;    [104:12] ? p0.x == 4\n;    [104:12] ? p0.x == 4\n    cmp_104_12:\n    cmp qword [rsp - 80], 4\n    jne bool_false_104_12\n    jmp bool_true_104_12\n    bool_true_104_12:\n    mov r15, true\n    jmp bool_end_104_12\n    bool_false_104_12:\n    mov r15, false\n    bool_end_104_12:\n;    assert(expr : bool) \n    assert_104_5:\n;        alias expr -\u003e r15\n        if_36_8_104_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_104_5:\n        cmp r15, false\n        jne if_36_5_104_5_end\n        jmp if_36_8_104_5_code\n        if_36_8_104_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_104_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_104_5_end:\n;                free named register 'rdi'\n        if_36_5_104_5_end:\n    assert_104_5_end:\n;        free scratch register 'r15'\n;    var x: i64 @ qword [rsp - 88]\n;    [106:5] var x = 1\n;    [106:13] x =1\n;    [106:13] 1\n;    [106:13] 1\n;    [107:5] x = 1\n    mov qword [rsp - 88], 1\n;    var y: i64 @ qword [rsp - 96]\n;    [107:5] var y = 2\n;    [107:13] y =2\n;    [107:13] 2\n;    [107:13] 2\n;    [109:5] y = 2\n    mov qword [rsp - 96], 2\n;    var o1: object @ qword [rsp - 116]\n;    [109:5] var o1 : object = {{x * 10, y}, 0xff0000}\n;    [109:23] o1 ={{x * 10, y}, 0xff0000}\n;    [109:23] {{x * 10, y}, 0xff0000}\n;    [109:23] {{x * 10, y}, 0xff0000}\n;        [109:24] {x * 10, y}\n;        [109:25] x * 10\n;        [109:25] x * 10\n;        [109:27] o1.pos.x = x\n;        allocate scratch register -\u003e r15\n        mov r15, qword [rsp - 88]\n        mov qword [rsp - 116], r15\n;        free scratch register 'r15'\n;        [109:31] o1.pos.x * 10\n;        allocate scratch register -\u003e r15\n        mov r15, qword [rsp - 116]\n        imul r15, 10\n        mov qword [rsp - 116], r15\n;        free scratch register 'r15'\n;        [109:33]  y\n;        [109:33] y\n;        [109:34] o1.pos.y = y\n;        allocate scratch register -\u003e r15\n        mov r15, qword [rsp - 96]\n        mov qword [rsp - 108], r15\n;        free scratch register 'r15'\n;    [109:37]  0xff0000\n;    [109:37] 0xff0000\n;    [109:45] o1.color = 0xff0000\n    mov dword [rsp - 100], 0xff0000\n;    [110:5]  assert(o1.pos.x == 10)\n;    allocate scratch register -\u003e r15\n;    [110:12] o1.pos.x == 10\n;    [110:12] ? o1.pos.x == 10\n;    [110:12] ? o1.pos.x == 10\n    cmp_110_12:\n    cmp qword [rsp - 116], 10\n    jne bool_false_110_12\n    jmp bool_true_110_12\n    bool_true_110_12:\n    mov r15, true\n    jmp bool_end_110_12\n    bool_false_110_12:\n    mov r15, false\n    bool_end_110_12:\n;    assert(expr : bool) \n    assert_110_5:\n;        alias expr -\u003e r15\n        if_36_8_110_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_110_5:\n        cmp r15, false\n        jne if_36_5_110_5_end\n        jmp if_36_8_110_5_code\n        if_36_8_110_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_110_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_110_5_end:\n;                free named register 'rdi'\n        if_36_5_110_5_end:\n    assert_110_5_end:\n;        free scratch register 'r15'\n;    [111:5] assert(o1.pos.y == 2)\n;    allocate scratch register -\u003e r15\n;    [111:12] o1.pos.y == 2\n;    [111:12] ? o1.pos.y == 2\n;    [111:12] ? o1.pos.y == 2\n    cmp_111_12:\n    cmp qword [rsp - 108], 2\n    jne bool_false_111_12\n    jmp bool_true_111_12\n    bool_true_111_12:\n    mov r15, true\n    jmp bool_end_111_12\n    bool_false_111_12:\n    mov r15, false\n    bool_end_111_12:\n;    assert(expr : bool) \n    assert_111_5:\n;        alias expr -\u003e r15\n        if_36_8_111_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_111_5:\n        cmp r15, false\n        jne if_36_5_111_5_end\n        jmp if_36_8_111_5_code\n        if_36_8_111_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_111_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_111_5_end:\n;                free named register 'rdi'\n        if_36_5_111_5_end:\n    assert_111_5_end:\n;        free scratch register 'r15'\n;    [112:5] assert(o1.color == 0xff0000)\n;    allocate scratch register -\u003e r15\n;    [112:12] o1.color == 0xff0000\n;    [112:12] ? o1.color == 0xff0000\n;    [112:12] ? o1.color == 0xff0000\n    cmp_112_12:\n    cmp dword [rsp - 100], 0xff0000\n    jne bool_false_112_12\n    jmp bool_true_112_12\n    bool_true_112_12:\n    mov r15, true\n    jmp bool_end_112_12\n    bool_false_112_12:\n    mov r15, false\n    bool_end_112_12:\n;    assert(expr : bool) \n    assert_112_5:\n;        alias expr -\u003e r15\n        if_36_8_112_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_112_5:\n        cmp r15, false\n        jne if_36_5_112_5_end\n        jmp if_36_8_112_5_code\n        if_36_8_112_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_112_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_112_5_end:\n;                free named register 'rdi'\n        if_36_5_112_5_end:\n    assert_112_5_end:\n;        free scratch register 'r15'\n;    var p1: point @ qword [rsp - 132]\n;    [114:5] var p1 : point = {-x, -y}\n;    [114:22] p1 ={-x, -y}\n;    [114:22] {-x, -y}\n;    [114:22] {-x, -y}\n;    [114:23] -x\n;    [114:23] -x\n;    [114:25] p1.x = -x\n;    allocate scratch register -\u003e r15\n    mov r15, qword [rsp - 88]\n    mov qword [rsp - 132], r15\n;    free scratch register 'r15'\n    neg qword [rsp - 132]\n;    [114:27]  -y\n;    [114:27] -y\n;    [114:29] p1.y = -y\n;    allocate scratch register -\u003e r15\n    mov r15, qword [rsp - 96]\n    mov qword [rsp - 124], r15\n;    free scratch register 'r15'\n    neg qword [rsp - 124]\n;    [115:7]  o1.pos = p1\n;    allocate named register 'rsi'\n;    allocate named register 'rdi'\n;    allocate named register 'rcx'\n    lea rdi, [rsp - 116]\n;    [115:14]  p1\n    lea rsi, [rsp - 132]\n    mov rcx, 16\n    rep movsb\n;    free named register 'rcx'\n;    free named register 'rdi'\n;    free named register 'rsi'\n;    [116:5] assert(o1.pos.x == -1)\n;    allocate scratch register -\u003e r15\n;    [116:12] o1.pos.x == -1\n;    [116:12] ? o1.pos.x == -1\n;    [116:12] ? o1.pos.x == -1\n    cmp_116_12:\n    cmp qword [rsp - 116], -1\n    jne bool_false_116_12\n    jmp bool_true_116_12\n    bool_true_116_12:\n    mov r15, true\n    jmp bool_end_116_12\n    bool_false_116_12:\n    mov r15, false\n    bool_end_116_12:\n;    assert(expr : bool) \n    assert_116_5:\n;        alias expr -\u003e r15\n        if_36_8_116_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_116_5:\n        cmp r15, false\n        jne if_36_5_116_5_end\n        jmp if_36_8_116_5_code\n        if_36_8_116_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_116_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_116_5_end:\n;                free named register 'rdi'\n        if_36_5_116_5_end:\n    assert_116_5_end:\n;        free scratch register 'r15'\n;    [117:5] assert(o1.pos.y == -2)\n;    allocate scratch register -\u003e r15\n;    [117:12] o1.pos.y == -2\n;    [117:12] ? o1.pos.y == -2\n;    [117:12] ? o1.pos.y == -2\n    cmp_117_12:\n    cmp qword [rsp - 108], -2\n    jne bool_false_117_12\n    jmp bool_true_117_12\n    bool_true_117_12:\n    mov r15, true\n    jmp bool_end_117_12\n    bool_false_117_12:\n    mov r15, false\n    bool_end_117_12:\n;    assert(expr : bool) \n    assert_117_5:\n;        alias expr -\u003e r15\n        if_36_8_117_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_117_5:\n        cmp r15, false\n        jne if_36_5_117_5_end\n        jmp if_36_8_117_5_code\n        if_36_8_117_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_117_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_117_5_end:\n;                free named register 'rdi'\n        if_36_5_117_5_end:\n    assert_117_5_end:\n;        free scratch register 'r15'\n;    var o2: object @ qword [rsp - 152]\n;    [119:5] var o2 : object = o1\n;    [119:23] o2 =o1\n;    allocate named register 'rsi'\n;    allocate named register 'rdi'\n;    allocate named register 'rcx'\n    lea rdi, [rsp - 152]\n;    [119:23] o1\n    lea rsi, [rsp - 116]\n    mov rcx, 20\n    rep movsb\n;    free named register 'rcx'\n;    free named register 'rdi'\n;    free named register 'rsi'\n;    [120:5] assert(o2.pos.x == -1)\n;    allocate scratch register -\u003e r15\n;    [120:12] o2.pos.x == -1\n;    [120:12] ? o2.pos.x == -1\n;    [120:12] ? o2.pos.x == -1\n    cmp_120_12:\n    cmp qword [rsp - 152], -1\n    jne bool_false_120_12\n    jmp bool_true_120_12\n    bool_true_120_12:\n    mov r15, true\n    jmp bool_end_120_12\n    bool_false_120_12:\n    mov r15, false\n    bool_end_120_12:\n;    assert(expr : bool) \n    assert_120_5:\n;        alias expr -\u003e r15\n        if_36_8_120_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_120_5:\n        cmp r15, false\n        jne if_36_5_120_5_end\n        jmp if_36_8_120_5_code\n        if_36_8_120_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_120_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_120_5_end:\n;                free named register 'rdi'\n        if_36_5_120_5_end:\n    assert_120_5_end:\n;        free scratch register 'r15'\n;    [121:5] assert(o2.pos.y == -2)\n;    allocate scratch register -\u003e r15\n;    [121:12] o2.pos.y == -2\n;    [121:12] ? o2.pos.y == -2\n;    [121:12] ? o2.pos.y == -2\n    cmp_121_12:\n    cmp qword [rsp - 144], -2\n    jne bool_false_121_12\n    jmp bool_true_121_12\n    bool_true_121_12:\n    mov r15, true\n    jmp bool_end_121_12\n    bool_false_121_12:\n    mov r15, false\n    bool_end_121_12:\n;    assert(expr : bool) \n    assert_121_5:\n;        alias expr -\u003e r15\n        if_36_8_121_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_121_5:\n        cmp r15, false\n        jne if_36_5_121_5_end\n        jmp if_36_8_121_5_code\n        if_36_8_121_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_121_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_121_5_end:\n;                free named register 'rdi'\n        if_36_5_121_5_end:\n    assert_121_5_end:\n;        free scratch register 'r15'\n;    [122:5] assert(o2.color == 0xff0000)\n;    allocate scratch register -\u003e r15\n;    [122:12] o2.color == 0xff0000\n;    [122:12] ? o2.color == 0xff0000\n;    [122:12] ? o2.color == 0xff0000\n    cmp_122_12:\n    cmp dword [rsp - 136], 0xff0000\n    jne bool_false_122_12\n    jmp bool_true_122_12\n    bool_true_122_12:\n    mov r15, true\n    jmp bool_end_122_12\n    bool_false_122_12:\n    mov r15, false\n    bool_end_122_12:\n;    assert(expr : bool) \n    assert_122_5:\n;        alias expr -\u003e r15\n        if_36_8_122_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_122_5:\n        cmp r15, false\n        jne if_36_5_122_5_end\n        jmp if_36_8_122_5_code\n        if_36_8_122_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_122_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_122_5_end:\n;                free named register 'rdi'\n        if_36_5_122_5_end:\n    assert_122_5_end:\n;        free scratch register 'r15'\n;    var o3: object[1] @ qword [rsp - 172]\n;    [124:5] var o3 : object[1]\n;    clear array 1 * 20 B = 20 B\n;    allocate named register 'rdi'\n;    allocate named register 'rcx'\n;    allocate named register 'rax'\n    lea rdi, [rsp - 172]\n    mov rcx, 20\n    xor rax, rax\n    rep stosb\n;    free named register 'rax'\n;    free named register 'rcx'\n;    free named register 'rdi'\n;    [125:5] # index 0 in an array can be accessed without array index\n;    [126:7] o3.pos.y = 73\n;    [126:16]  73\n;    [126:16] 73\n;    [127:5] o3.pos.y = 73\n    mov qword [rsp - 164], 73\n;    [127:5] assert(o3[0].pos.y == 73)\n;    allocate scratch register -\u003e r15\n;    [127:12] o3[0].pos.y == 73\n;    [127:12] ? o3[0].pos.y == 73\n;    [127:12] ? o3[0].pos.y == 73\n    cmp_127_12:\n;    allocate scratch register -\u003e r14\n;        [127:12] o3[0].pos.y\n;        [127:14] r14 = o3[0].pos.y\n;        [127:14] o3[0].pos.y\n;        allocate scratch register -\u003e r13\n        lea r13, [rsp - 172]\n;        allocate scratch register -\u003e r12\n;        [127:15] 0\n;        [127:15] 0\n;        [127:16] r12 = 0\n        mov r12, 0\n        imul r12, 20\n        add r13, r12\n;        free scratch register 'r12'\n        add r13, 8\n        mov r14, qword [r13]\n;        free scratch register 'r13'\n    cmp r14, 73\n;    free scratch register 'r14'\n    jne bool_false_127_12\n    jmp bool_true_127_12\n    bool_true_127_12:\n    mov r15, true\n    jmp bool_end_127_12\n    bool_false_127_12:\n    mov r15, false\n    bool_end_127_12:\n;    assert(expr : bool) \n    assert_127_5:\n;        alias expr -\u003e r15\n        if_36_8_127_5:\n;        [36:8] ? not expr\n;        [36:8] ? not expr\n        cmp_36_8_127_5:\n        cmp r15, false\n        jne if_36_5_127_5_end\n        jmp if_36_8_127_5_code\n        if_36_8_127_5_code:\n;            [36:17] exit(1)\n;            allocate named register 'rdi'\n            mov rdi, 1\n;            exit(v : reg_rdi) \n            exit_36_17_127_5:\n;                alias v -\u003e rdi\n;                [13:5]  mov(rax, 60)\n                mov rax, 60\n;                [13:19] # exit system call\n;                [14:5] mov(rdi, v)\n;                [14:19] # return code\n;                [15:5] syscall()\n                syscall\n            exit_36_17_127_5_end:\n;                free named register 'rdi'\n        if_36_5_127_5_end:\n    assert_127_5_end:\n;        free scratch register 'r15'\n;    [129:5] print(hello.len, hello)\n;    allocate named register 'rdx'\n    mov rdx, hello.len\n;    allocate named register 'rsi'\n    mov rsi, hello\n;    print(len : reg_rdx, ptr : reg_rsi) \n    print_129_5:\n;        alias len -\u003e rdx\n;        alias ptr -\u003e rsi\n;        [19:5]  mov(rax, 1)\n        mov rax, 1\n;        [19:19] # write system call\n;        [20:5] mov(rdi, 1)\n        mov rdi, 1\n;        [20:19] # file descriptor for standard out\n;        [21:5] mov(rsi, ptr)\n;        [21:19] # buffer address\n;        [22:5] mov(rdx, len)\n;        [22:19] # buffer size\n;        [23:5] syscall()\n        syscall\n    print_129_5_end:\n;        free named register 'rsi'\n;        free named register 'rdx'\n;    [130:5] loop\n    loop_130_5:\n;        [131:9]  print(prompt1.len, prompt1)\n;        allocate named register 'rdx'\n        mov rdx, prompt1.len\n;        allocate named register 'rsi'\n        mov rsi, prompt1\n;        print(len : reg_rdx, ptr : reg_rsi) \n        print_131_9:\n;            alias len -\u003e rdx\n;            alias ptr -\u003e rsi\n;            [19:5]  mov(rax, 1)\n            mov rax, 1\n;            [19:19] # write system call\n;            [20:5] mov(rdi, 1)\n            mov rdi, 1\n;            [20:19] # file descriptor for standard out\n;            [21:5] mov(rsi, ptr)\n;            [21:19] # buffer address\n;            [22:5] mov(rdx, len)\n;            [22:19] # buffer size\n;            [23:5] syscall()\n            syscall\n        print_131_9_end:\n;            free named register 'rsi'\n;            free named register 'rdx'\n;        var len: i64 @ qword [rsp - 180]\n;        [132:9] var len = read(input.len, input) - 1\n;        [132:19] len =read(input.len, input) - 1\n;        [132:19] read(input.len, input) - 1\n;        [132:19] read(input.len, input) - 1\n;        [132:19] len = read(input.len, input)\n;        [132:19] read(input.len, input)\n;        allocate named register 'rdx'\n        mov rdx, input.len\n;        allocate named register 'rsi'\n        mov rsi, input\n;        read(len : reg_rdx, ptr : reg_rsi) : i64 nbytes \n        read_132_19:\n;            alias nbytes -\u003e len\n;            alias len -\u003e rdx\n;            alias ptr -\u003e rsi\n;            [27:5]  mov(rax, 0)\n            mov rax, 0\n;            [27:19] # read system call\n;            [28:5] mov(rdi, 0)\n            mov rdi, 0\n;            [28:19] # file descriptor for standard input\n;            [29:5] mov(rsi, ptr)\n;            [29:19] # buffer address\n;            [30:5] mov(rdx, len)\n;            [30:19] # buffer size\n;            [31:5] syscall()\n            syscall\n;            [32:5] mov(nbytes, rax)\n            mov qword [rsp - 180], rax\n;            [32:22] # return value\n        read_132_19_end:\n;            free named register 'rsi'\n;            free named register 'rdx'\n;        [132:49] len - 1\n        sub qword [rsp - 180], 1\n;        [132:49] # -1 don't include the '\\n'\n        if_133_12:\n;        [133:12] ? len == 0\n;        [133:12] ? len == 0\n        cmp_133_12:\n        cmp qword [rsp - 180], 0\n        jne if_135_19\n        jmp if_133_12_code\n        if_133_12_code:\n;            [134:13]  break\n            jmp loop_130_5_end\n        jmp if_133_9_end\n        if_135_19:\n;        [135:19] ? len \u003c= 4\n;        [135:19] ? len \u003c= 4\n        cmp_135_19:\n        cmp qword [rsp - 180], 4\n        jg if_else_133_9\n        jmp if_135_19_code\n        if_135_19_code:\n;            [136:13]  print(prompt2.len, prompt2)\n;            allocate named register 'rdx'\n            mov rdx, prompt2.len\n;            allocate named register 'rsi'\n            mov rsi, prompt2\n;            print(len : reg_rdx, ptr : reg_rsi) \n            print_136_13:\n;                alias len -\u003e rdx\n;                alias ptr -\u003e rsi\n;                [19:5]  mov(rax, 1)\n                mov rax, 1\n;                [19:19] # write system call\n;                [20:5] mov(rdi, 1)\n                mov rdi, 1\n;                [20:19] # file descriptor for standard out\n;                [21:5] mov(rsi, ptr)\n;                [21:19] # buffer address\n;                [22:5] mov(rdx, len)\n;                [22:19] # buffer size\n;                [23:5] syscall()\n                syscall\n            print_136_13_end:\n;                free named register 'rsi'\n;                free named register 'rdx'\n;            [137:13] continue\n            jmp loop_130_5\n        jmp if_133_9_end\n        if_else_133_9:\n;            [139:13]  print(prompt3.len, prompt3)\n;            allocate named register 'rdx'\n            mov rdx, prompt3.len\n;            allocate named register 'rsi'\n            mov rsi, prompt3\n;            print(len : reg_rdx, ptr : reg_rsi) \n            print_139_13:\n;                alias len -\u003e rdx\n;                alias ptr -\u003e rsi\n;                [19:5]  mov(rax, 1)\n                mov rax, 1\n;                [19:19] # write system call\n;                [20:5] mov(rdi, 1)\n                mov rdi, 1\n;                [20:19] # file descriptor for standard out\n;                [21:5] mov(rsi, ptr)\n;                [21:19] # buffer address\n;                [22:5] mov(rdx, len)\n;                [22:19] # buffer size\n;                [23:5] syscall()\n                syscall\n            print_139_13_end:\n;                free named register 'rsi'\n;                free named register 'rdx'\n;            [140:13] print(len, input)\n;            allocate named register 'rdx'\n            mov rdx, qword [rsp - 180]\n;            allocate named register 'rsi'\n            mov rsi, input\n;            print(len : reg_rdx, ptr : reg_rsi) \n            print_140_13:\n;                alias len -\u003e rdx\n;                alias ptr -\u003e rsi\n;                [19:5]  mov(rax, 1)\n                mov rax, 1\n;                [19:19] # write system call\n;                [20:5] mov(rdi, 1)\n                mov rdi, 1\n;                [20:19] # file descriptor for standard out\n;                [21:5] mov(rsi, ptr)\n;                [21:19] # buffer address\n;                [22:5] mov(rdx, len)\n;                [22:19] # buffer size\n;                [23:5] syscall()\n                syscall\n            print_140_13_end:\n;                free named register 'rsi'\n;                free named register 'rdx'\n;            [141:13] print(dot.len, dot)\n;            allocate named register 'rdx'\n            mov rdx, dot.len\n;            allocate named register 'rsi'\n            mov rsi, dot\n;            print(len : reg_rdx, ptr : reg_rsi) \n            print_141_13:\n;                alias len -\u003e rdx\n;                alias ptr -\u003e rsi\n;                [19:5]  mov(rax, 1)\n                mov rax, 1\n;                [19:19] # write system call\n;                [20:5] mov(rdi, 1)\n                mov rdi, 1\n;                [20:19] # file descriptor for standard out\n;                [21:5] mov(rsi, ptr)\n;                [21:19] # buffer address\n;                [22:5] mov(rdx, len)\n;                [22:19] # buffer size\n;                [23:5] syscall()\n                syscall\n            print_141_13_end:\n;                free named register 'rsi'\n;                free named register 'rdx'\n;            [142:13] print(nl.len, nl)\n;            allocate named register 'rdx'\n            mov rdx, nl.len\n;            allocate named register 'rsi'\n            mov rsi, nl\n;            print(len : reg_rdx, ptr : reg_rsi) \n            print_142_13:\n;                alias len -\u003e rdx\n;                alias ptr -\u003e rsi\n;                [19:5]  mov(rax, 1)\n                mov rax, 1\n;                [19:19] # write system call\n;                [20:5] mov(rdi, 1)\n                mov rdi, 1\n;                [20:19] # file descriptor for standard out\n;                [21:5] mov(rsi, ptr)\n;                [21:19] # buffer address\n;                [22:5] mov(rdx, len)\n;                [22:19] # buffer size\n;                [23:5] syscall()\n                syscall\n            print_142_13_end:\n;                free named register 'rsi'\n;                free named register 'rdx'\n        if_133_9_end:\n    jmp loop_130_5\n    loop_130_5_end:\n    ; system call: exit 0\n    mov rax, 60\n    mov rdi, 0\n    syscall\n\n; max scratch registers in use: 4\n;            max frames in use: 7\n;               max stack size: 180 B\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalint%2Fcompiler-2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcalint%2Fcompiler-2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalint%2Fcompiler-2/lists"}