| ... | @@ -12,10 +12,11 @@ pub fn addCases(ctx: *TestContext) void { | ... | @@ -12,10 +12,11 @@ pub fn addCases(ctx: *TestContext) void { |
| 12 | \\ | 12 | \\ |
| 13 | \\@entry = fn(@fnty, { | 13 | \\@entry = fn(@fnty, { |
| 14 | \\ %a = str("\x32\x08\x01\x0a") | 14 | \\ %a = str("\x32\x08\x01\x0a") |
| 15 | \\ %eptr0 = elemptr(%a, @0) | 15 | \\ %aref = ref(%a) |
| 16 | \\ %eptr1 = elemptr(%a, @1) | 16 | \\ %eptr0 = elemptr(%aref, @0) |
| 17 | \\ %eptr2 = elemptr(%a, @2) | 17 | \\ %eptr1 = elemptr(%aref, @1) |
| 18 | \\ %eptr3 = elemptr(%a, @3) | 18 | \\ %eptr2 = elemptr(%aref, @2) |
| | 19 | \\ %eptr3 = elemptr(%aref, @3) |
| 19 | \\ %v0 = deref(%eptr0) | 20 | \\ %v0 = deref(%eptr0) |
| 20 | \\ %v1 = deref(%eptr1) | 21 | \\ %v1 = deref(%eptr1) |
| 21 | \\ %v2 = deref(%eptr2) | 22 | \\ %v2 = deref(%eptr2) |
| ... | @@ -34,7 +35,8 @@ pub fn addCases(ctx: *TestContext) void { | ... | @@ -34,7 +35,8 @@ pub fn addCases(ctx: *TestContext) void { |
| 34 | \\}) | 35 | \\}) |
| 35 | \\ | 36 | \\ |
| 36 | \\@9 = str("entry") | 37 | \\@9 = str("entry") |
| 37 | \\@10 = export(@9, @entry) | 38 | \\@10 = ref(@9) |
| | 39 | \\@11 = export(@10, @entry) |
| 38 | , | 40 | , |
| 39 | \\@0 = primitive(void) | 41 | \\@0 = primitive(void) |
| 40 | \\@1 = fntype([], @0, cc=C) | 42 | \\@1 = fntype([], @0, cc=C) |
| ... | @@ -42,7 +44,8 @@ pub fn addCases(ctx: *TestContext) void { | ... | @@ -42,7 +44,8 @@ pub fn addCases(ctx: *TestContext) void { |
| 42 | \\ %0 = return() | 44 | \\ %0 = return() |
| 43 | \\}) | 45 | \\}) |
| 44 | \\@3 = str("entry") | 46 | \\@3 = str("entry") |
| 45 | \\@4 = export(@3, @2) | 47 | \\@4 = ref(@3) |
| | 48 | \\@5 = export(@4, @2) |
| 46 | \\ | 49 | \\ |
| 47 | ); | 50 | ); |
| 48 | | 51 | |
| ... | @@ -55,51 +58,71 @@ pub fn addCases(ctx: *TestContext) void { | ... | @@ -55,51 +58,71 @@ pub fn addCases(ctx: *TestContext) void { |
| 55 | } | 58 | } |
| 56 | | 59 | |
| 57 | ctx.addZIRCompareOutput("hello world ZIR", | 60 | ctx.addZIRCompareOutput("hello world ZIR", |
| 58 | \\@0 = str("Hello, world!\n") | 61 | \\@noreturn = primitive(noreturn) |
| 59 | \\@1 = primitive(noreturn) | 62 | \\@void = primitive(void) |
| 60 | \\@2 = primitive(usize) | 63 | \\@usize = primitive(usize) |
| 61 | \\@3 = fntype([], @1, cc=Naked) | 64 | \\@0 = int(0) |
| 62 | \\@4 = int(0) | 65 | \\@1 = int(1) |
| 63 | \\@5 = int(1) | 66 | \\@2 = int(2) |
| 64 | \\@6 = int(231) | 67 | \\@3 = int(3) |
| 65 | \\@7 = str("len") | 68 | \\ |
| | 69 | \\@syscall_array = str("syscall") |
| | 70 | \\@sysoutreg_array = str("={rax}") |
| | 71 | \\@rax_array = str("{rax}") |
| | 72 | \\@rdi_array = str("{rdi}") |
| | 73 | \\@rcx_array = str("rcx") |
| | 74 | \\@r11_array = str("r11") |
| | 75 | \\@rdx_array = str("{rdx}") |
| | 76 | \\@rsi_array = str("{rsi}") |
| | 77 | \\@memory_array = str("memory") |
| | 78 | \\@len_array = str("len") |
| 66 | \\ | 79 | \\ |
| 67 | \\@8 = fn(@3, { | 80 | \\@msg = str("Hello, world!\n") |
| 68 | \\ %0 = as(@2, @5) ; SYS_write | 81 | \\ |
| 69 | \\ %1 = as(@2, @5) ; STDOUT_FILENO | 82 | \\@start_fnty = fntype([], @noreturn, cc=Naked) |
| 70 | \\ %2 = ptrtoint(@0) ; msg ptr | 83 | \\@start = fn(@start_fnty, { |
| 71 | \\ %3 = fieldptr(@0, @7) ; msg len ptr | 84 | \\ %SYS_exit_group = int(231) |
| 72 | \\ %4 = deref(%3) ; msg len | 85 | \\ %exit_code = as(@usize, @0) |
| 73 | \\ %sysoutreg = str("={rax}") | 86 | \\ |
| 74 | \\ %rax = str("{rax}") | 87 | \\ %syscall = ref(@syscall_array) |
| 75 | \\ %rdi = str("{rdi}") | 88 | \\ %sysoutreg = ref(@sysoutreg_array) |
| 76 | \\ %rsi = str("{rsi}") | 89 | \\ %rax = ref(@rax_array) |
| 77 | \\ %rdx = str("{rdx}") | 90 | \\ %rdi = ref(@rdi_array) |
| 78 | \\ %rcx = str("rcx") | 91 | \\ %rcx = ref(@rcx_array) |
| 79 | \\ %r11 = str("r11") | 92 | \\ %rdx = ref(@rdx_array) |
| 80 | \\ %memory = str("memory") | 93 | \\ %rsi = ref(@rsi_array) |
| 81 | \\ %syscall = str("syscall") | 94 | \\ %r11 = ref(@r11_array) |
| 82 | \\ %5 = asm(%syscall, @2, | 95 | \\ %memory = ref(@memory_array) |
| | 96 | \\ |
| | 97 | \\ %SYS_write = as(@usize, @1) |
| | 98 | \\ %STDOUT_FILENO = as(@usize, @1) |
| | 99 | \\ |
| | 100 | \\ %msg_ptr = ref(@msg) |
| | 101 | \\ %msg_addr = ptrtoint(%msg_ptr) |
| | 102 | \\ |
| | 103 | \\ %len_name = ref(@len_array) |
| | 104 | \\ %msg_len_ptr = fieldptr(%msg_ptr, %len_name) |
| | 105 | \\ %msg_len = deref(%msg_len_ptr) |
| | 106 | \\ %rc_write = asm(%syscall, @usize, |
| 83 | \\ volatile=1, | 107 | \\ volatile=1, |
| 84 | \\ output=%sysoutreg, | 108 | \\ output=%sysoutreg, |
| 85 | \\ inputs=[%rax, %rdi, %rsi, %rdx], | 109 | \\ inputs=[%rax, %rdi, %rsi, %rdx], |
| 86 | \\ clobbers=[%rcx, %r11, %memory], | 110 | \\ clobbers=[%rcx, %r11, %memory], |
| 87 | \\ args=[%0, %1, %2, %4]) | 111 | \\ args=[%SYS_write, %STDOUT_FILENO, %msg_addr, %msg_len]) |
| 88 | \\ | 112 | \\ |
| 89 | \\ %6 = as(@2, @6) ;SYS_exit_group | 113 | \\ %rc_exit = asm(%syscall, @usize, |
| 90 | \\ %7 = as(@2, @4) ;exit code | | |
| 91 | \\ %8 = asm(%syscall, @2, | | |
| 92 | \\ volatile=1, | 114 | \\ volatile=1, |
| 93 | \\ output=%sysoutreg, | 115 | \\ output=%sysoutreg, |
| 94 | \\ inputs=[%rax, %rdi], | 116 | \\ inputs=[%rax, %rdi], |
| 95 | \\ clobbers=[%rcx, %r11, %memory], | 117 | \\ clobbers=[%rcx, %r11, %memory], |
| 96 | \\ args=[%6, %7]) | 118 | \\ args=[%SYS_exit_group, %exit_code]) |
| 97 | \\ | 119 | \\ |
| 98 | \\ %9 = unreachable() | 120 | \\ %99 = unreachable() |
| 99 | \\}) | 121 | \\}); |
| 100 | \\ | 122 | \\ |
| 101 | \\@9 = str("_start") | 123 | \\@9 = str("_start") |
| 102 | \\@10 = export(@9, @8) | 124 | \\@10 = ref(@9) |
| | 125 | \\@11 = export(@10, @start) |
| 103 | , | 126 | , |
| 104 | \\Hello, world! | 127 | \\Hello, world! |
| 105 | \\ | 128 | \\ |