diff options
Diffstat (limited to 'test/trans.d/case/stateact1_asm.rl')
-rw-r--r-- | test/trans.d/case/stateact1_asm.rl | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/test/trans.d/case/stateact1_asm.rl b/test/trans.d/case/stateact1_asm.rl new file mode 100644 index 00000000..1d2f9486 --- /dev/null +++ b/test/trans.d/case/stateact1_asm.rl @@ -0,0 +1,208 @@ +# +# @LANG: asm +# @GENERATED: true +# + + + + +%%{ + machine state_act; + + action a1 { + .section .rodata +1: + .string "a1\n" + .text + movq $1b, %rax + pushq %rax + movq $.L_fmt_str, %rdi + popq %rsi + movq $0, %rax + call printf + +} + action a2 { + .section .rodata +2: + .string "a2\n" + .text + movq $2b, %rax + pushq %rax + movq $.L_fmt_str, %rdi + popq %rsi + movq $0, %rax + call printf + +} + action b1 { + .section .rodata +3: + .string "b1\n" + .text + movq $3b, %rax + pushq %rax + movq $.L_fmt_str, %rdi + popq %rsi + movq $0, %rax + call printf + +} + action b2 { + .section .rodata +4: + .string "b2\n" + .text + movq $4b, %rax + pushq %rax + movq $.L_fmt_str, %rdi + popq %rsi + movq $0, %rax + call printf + +} + action c1 { + .section .rodata +5: + .string "c1\n" + .text + movq $5b, %rax + pushq %rax + movq $.L_fmt_str, %rdi + popq %rsi + movq $0, %rax + call printf + +} + action c2 { + .section .rodata +6: + .string "c2\n" + .text + movq $6b, %rax + pushq %rax + movq $.L_fmt_str, %rdi + popq %rsi + movq $0, %rax + call printf + +} + action next_again { + fnext again; + +} + + hi = 'hi'; + line = again: + hi + >to b1 + >from b2 + '\n' + >to c1 + >from c2 + @next_again; + + main := line* + >to a1 + >from a2; +}%% + + + + .text + .comm buf, 1024, 32 + .comm bpos, 8, 8 + .comm stack_data, 1024, 32 + .section .rodata + +.L_str_accept: + .string "ACCEPT" +.L_str_fail: + .string "FAIL" +.L_fmt_int: + .string "%ld" +.L_fmt_str: + .string "%s" + + %% write data; + + .text +exec: + pushq %rbp + movq %rsp, %rbp + subq $96, %rsp + + movq $stack_data, -56(%rbp) + + pushq %r12 + pushq %r13 + movq %rdi, %r12 + + # Get the length. + movq %r12, %rdi + call strlen + movq %r12, %r13 + movslq %eax, %rax + addq %rax, %r13 + + movq $0, bpos(%rip) + + %% write init; + %% write exec; + + # current state is in r11. + movq state_act_first_final(%rip), %rax + cmpq %rax, %r11 + jl .L_exec_fail + movq $.L_str_accept, %rdi + call puts + jmp .L_exec_done +.L_exec_fail: + movq $.L_str_fail, %rdi + call puts +.L_exec_done: + popq %r13 + popq %r12 + leave + ret + .section .rodata +.L_debug_msg: + .string "debug %d\n" +.L_inp_0: + .string "hi\nhi\n" + + .align 8 +inp: + .quad .L_inp_0 + + .align 8 +inplen: + .quad 1 + + .text + .globl main +main: + pushq %rbp + movq %rsp, %rbp + pushq %r12 + movq $0, %r12 +.L_again: + movq inplen(%rip), %rax + cmpq %r12, %rax + je .L_done + movq inp(,%r12,8), %rdi + call exec + incq %r12 + jmp .L_again +.L_done: + popq %r12 + mov $0, %rax + leave + ret +debug: + movl %edi, %esi + movq $0, %rax + movq $.L_debug_msg, %rdi + call printf + ret + |