| author | |
| committer | |
| log | 673d638070452d86543c6bb47879e83adcfa73a1 |
| tree | 5a58cef1f45c198d93266ebbb072a102fbdfa5b2 |
| parent | a292eb8d64da4383f2d4637f231d338ed9c680e0 |
2 files changed, 13 insertions(+), 25 deletions(-)
src/codegen.cpp+5-7| ... | ... | @@ -805,14 +805,12 @@ static LLVMValueRef gen_asm_expr(CodeGen *g, AstNode *node) { |
| 805 | 805 | LLVMValueRef *param_values = allocate<LLVMValueRef>(input_and_output_count); |
| 806 | 806 | for (int i = 0; i < asm_expr->output_list.length; i += 1, total_index += 1) { |
| 807 | 807 | AsmOutput *asm_output = asm_expr->output_list.at(i); |
| 808 | bool is_return = false; | |
| 809 | if (buf_eql_str(&asm_output->constraint, "=m")) { | |
| 810 | buf_append_str(&constraint_buf, "=*m"); | |
| 811 | } else if (buf_eql_str(&asm_output->constraint, "=r")) { | |
| 812 | buf_append_str(&constraint_buf, "=r"); | |
| 813 | is_return = true; | |
| 808 | bool is_return = (asm_output->return_type != nullptr); | |
| 809 | assert(*buf_ptr(&asm_output->constraint) == '='); | |
| 810 | if (is_return) { | |
| 811 | buf_appendf(&constraint_buf, "=%s", buf_ptr(&asm_output->constraint) + 1); | |
| 814 | 812 | } else { |
| 815 | zig_panic("TODO unable to handle anything other than '=m' and '=r' for outputs"); | |
| 813 | buf_appendf(&constraint_buf, "=*%s", buf_ptr(&asm_output->constraint) + 1); | |
| 816 | 814 | } |
| 817 | 815 | if (total_index + 1 < total_constraint_count) { |
| 818 | 816 | buf_append_char(&constraint_buf, ','); |
std/std.zig+8-18| ... | ... | @@ -3,27 +3,17 @@ const SYS_exit : isize = 60; |
| 3 | 3 | const stdout_fileno : isize = 1; |
| 4 | 4 | |
| 5 | 5 | fn syscall1(number: isize, arg1: isize) -> isize { |
| 6 | asm volatile (" | |
| 7 | mov %[number], %%rax | |
| 8 | mov %[arg1], %%rdi | |
| 9 | syscall | |
| 10 | mov %%rax, %[ret]" | |
| 11 | : [ret] "=r" (return isize) | |
| 12 | : [number] "r" (number), [arg1] "r" (arg1) | |
| 13 | : "rcx", "r11", "rax", "rdi") | |
| 6 | asm volatile ("syscall" | |
| 7 | : [ret] "={rax}" (return isize) | |
| 8 | : [number] "{rax}" (number), [arg1] "{rdi}" (arg1) | |
| 9 | : "rcx", "r11") | |
| 14 | 10 | } |
| 15 | 11 | |
| 16 | 12 | fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { |
| 17 | asm volatile (" | |
| 18 | mov %[number], %%rax | |
| 19 | mov %[arg1], %%rdi | |
| 20 | mov %[arg2], %%rsi | |
| 21 | mov %[arg3], %%rdx | |
| 22 | syscall | |
| 23 | mov %%rax, %[ret]" | |
| 24 | : [ret] "=r" (return isize) | |
| 25 | : [number] "r" (number), [arg1] "r" (arg1), [arg2] "r" (arg2), [arg3] "r" (arg3) | |
| 26 | : "rcx", "r11", "rax", "rdi", "rsi", "rdx") | |
| 13 | asm volatile ("syscall" | |
| 14 | : [ret] "={rax}" (return isize) | |
| 15 | : [number] "{rax}" (number), [arg1] "{rdi}" (arg1), [arg2] "{rsi}" (arg2), [arg3] "{rdx}" (arg3) | |
| 16 | : "rcx", "r11") | |
| 27 | 17 | } |
| 28 | 18 | |
| 29 | 19 | pub fn write(fd: isize, buf: &const u8, count: usize) -> isize { |