summaryrefslogtreecommitdiff
path: root/test/trans.d/case/patact_asm.rl
diff options
context:
space:
mode:
Diffstat (limited to 'test/trans.d/case/patact_asm.rl')
-rw-r--r--test/trans.d/case/patact_asm.rl426
1 files changed, 426 insertions, 0 deletions
diff --git a/test/trans.d/case/patact_asm.rl b/test/trans.d/case/patact_asm.rl
new file mode 100644
index 00000000..246cca71
--- /dev/null
+++ b/test/trans.d/case/patact_asm.rl
@@ -0,0 +1,426 @@
+#
+# @LANG: asm
+# @GENERATED: true
+#
+
+ .section .data
+ .comm comm,8,8
+ .text
+ .section .data
+ .comm top,8,8
+ .text
+ .section .data
+ .comm stack,8,8
+ .text
+ .section .data
+ .comm ts,8,8
+ .text
+ .section .data
+ .comm te,8,8
+ .text
+ .section .data
+ .comm act,8,8
+ .text
+ .section .data
+ .comm value,8,8
+ .text
+
+%%{
+ machine patact;
+
+ other := |*
+ [a-z]+ => {
+ .section .rodata
+1:
+ .string "word\n"
+ .text
+ movq $1b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ [0-9]+ => {
+ .section .rodata
+2:
+ .string "num\n"
+ .text
+ movq $2b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ [\n ] => {
+ .section .rodata
+3:
+ .string "space\n"
+ .text
+ movq $3b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ *|;
+
+ exec_test := |*
+ [a-z]+ => {
+ .section .rodata
+4:
+ .string "word (w/lbh)\n"
+ .text
+ movq $4b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+ movq -24(%rbp), %rax
+ pushq %rax
+ movq $1, %rax
+ pushq %rax
+ popq %rcx
+ popq %rax
+ subq %rcx, %rax
+ pushq %rax
+ popq %rax
+ fexec %rax;
+fgoto other;
+
+};
+ [a-z]+ ' foil' => {
+ .section .rodata
+5:
+ .string "word (c/lbh)\n"
+ .text
+ movq $5b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ [\n ] => {
+ .section .rodata
+6:
+ .string "space\n"
+ .text
+ movq $6b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ '22' => {
+ .section .rodata
+7:
+ .string "num (w/switch)\n"
+ .text
+ movq $7b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ [0-9]+ => {
+ .section .rodata
+8:
+ .string "num (w/switch)\n"
+ .text
+ movq $8b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+ movq -24(%rbp), %rax
+ pushq %rax
+ movq $1, %rax
+ pushq %rax
+ popq %rcx
+ popq %rax
+ subq %rcx, %rax
+ pushq %rax
+ popq %rax
+ fexec %rax;
+fgoto other;
+
+};
+ [0-9]+ ' foil' => {
+ .section .rodata
+9:
+ .string "num (c/switch)\n"
+ .text
+ movq $9b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ '!';# => { print_str "immdiate\n"; fgoto exec_test; };
+ *|;
+
+ semi := |*
+ ';' => {
+ .section .rodata
+10:
+ .string "in semi\n"
+ .text
+ movq $10b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+fgoto main;
+
+};
+ *|;
+
+ main := |*
+ [a-z]+ => {
+ .section .rodata
+11:
+ .string "word (w/lbh)\n"
+ .text
+ movq $11b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+fhold;
+fgoto other;
+
+};
+ [a-z]+ ' foil' => {
+ .section .rodata
+12:
+ .string "word (c/lbh)\n"
+ .text
+ movq $12b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ [\n ] => {
+ .section .rodata
+13:
+ .string "space\n"
+ .text
+ movq $13b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ '22' => {
+ .section .rodata
+14:
+ .string "num (w/switch)\n"
+ .text
+ movq $14b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ [0-9]+ => {
+ .section .rodata
+15:
+ .string "num (w/switch)\n"
+ .text
+ movq $15b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+fhold;
+fgoto other;
+
+};
+ [0-9]+ ' foil' => {
+ .section .rodata
+16:
+ .string "num (c/switch)\n"
+ .text
+ movq $16b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+
+};
+ ';' => {
+ .section .rodata
+17:
+ .string "going to semi\n"
+ .text
+ movq $17b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+fhold;
+fgoto semi;
+
+};
+ '!' => {
+ .section .rodata
+18:
+ .string "immdiate\n"
+ .text
+ movq $18b, %rax
+ pushq %rax
+ movq $.L_fmt_str, %rdi
+ popq %rsi
+ movq $0, %rax
+ call printf
+fgoto exec_test;
+
+};
+ *|;
+}%%
+
+
+
+ .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)
+ movq %r13, -8(%rbp)
+
+ %% write init;
+ %% write exec;
+
+ # current state is in r11.
+ movq patact_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 "abcd foix\n"
+.L_inp_1:
+ .string "abcd\nanother\n"
+.L_inp_2:
+ .string "123 foix\n"
+.L_inp_3:
+ .string "!abcd foix\n"
+.L_inp_4:
+ .string "!abcd\nanother\n"
+.L_inp_5:
+ .string "!123 foix\n"
+.L_inp_6:
+ .string ";"
+
+ .align 8
+inp:
+ .quad .L_inp_0
+ .quad .L_inp_1
+ .quad .L_inp_2
+ .quad .L_inp_3
+ .quad .L_inp_4
+ .quad .L_inp_5
+ .quad .L_inp_6
+
+ .align 8
+inplen:
+ .quad 7
+
+ .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
+