blob: 9562e1d21063c4626e0652ba7ab4700cbd6d9867 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
(in-package #:rva-tests)
(def-suite parse-tests
:description "Test functions exported from the parser."
:in all-tests)
;;; these tests are not exhaustive, and are meant to test basic functionality
;;; under correct circumstances.
(in-suite parse-tests)
(test esrap-register-bases
(is (equal '(parse::p
(parse::x
(parse::r "ADD" (parse::rr 10) (parse::rr 10) (parse::rr 10))))
(esrap:parse 'parse::str->ast (format nil ".TEXT~%~tADD $0O012 $0B1010 $0XA~%")))))
(test esrap-instr-all-type-r
(is (equal
'(parse::p
(parse::x
(parse::r "ADDV" (parse::rr 1) (parse::rr 2) (parse::rr 3))
(parse::r "NOT" (parse::rr 4) (parse::rr 0) (parse::rr 5))
(parse::r "CMP" (parse::rr 6) (parse::rr 7) (parse::rr 0))))
(esrap:parse 'parse::str->ast (format nil ".TEXT~%~tADDV $3 $1 $2
~tNOT $5 $4~%~tCMP $6 $7~%")))))
(test esrap-instr-all-type-i
(is (equal
'(parse::p
(parse::x
(parse::i "LOADV" (parse::rr 8) (parse::rr 9) (parse::imm 1))
(parse::i "STORE" (parse::rr 3) (parse::rr 5) (parse::imm 3))
(parse::i "ADDI" (parse::rr 5) (parse::rr 4) (parse::imm 2))))
(esrap:parse 'parse::str->ast (format nil ".TEXT~%~tLOADV $8 1($9)
~tSTORE $5 3($3)~%~tADDI $5 $4 2~%")))))
(test esrap-instr-type-all-type-j
(is (equal
'(parse::p
(parse::x
(parse::j "JMP" (parse::rr 3) (parse::imm 3))
(parse::j "JRL" (parse::rr 0) (parse::l "FOO"))
(parse::j "PUSH" (parse::rr 5) (parse::imm 0))))
(esrap:parse 'parse::str->ast (format nil ".TEXT~%~tJMP 3($3)
~tJRL FOO~%~tPUSH $5~%")))))
(test esrap-instr-type-i-vars
(is (equal
'(parse::p
(parse::x
(parse::i "LOADV" (parse::rr 8) (parse::rr 0) (parse::var "vector"))
(parse::i "STORE" (parse::rr 0) (parse::rr 5) (parse::var "int"))))
(esrap:parse 'parse::str->ast (format nil ".TEXT~%~tLOADV $8 vector
~tSTORE $5 int~%")))))
(test esrap-instr-type-all-lazy-spaces
(is (equal
'(parse::p
(parse::x
(parse::j "JMP" (parse::rr 3) (parse::imm 3))
(parse::j "JRL" (parse::rr 0) (parse::l "FOO"))
(parse::j "PUSH" (parse::rr 5) (parse::imm 0))))
(esrap:parse 'parse::str->ast (format nil "~t~%.TEXT~t~%JMP 3($3)~t
JRL FOO~t~%PUSH $5~%")))))
(test esrap-data-singleton
(is (equal
'(parse::p
(parse::d
1))
(esrap:parse 'parse:str->ast (format nil ".DATA~%~tA 1~%")))))
(test esrap-data-loaded
(is (equal
'(parse::p
(parse::d
1 2 3 4 5 6 7 8))
(esrap:parse 'parse:str->ast (format nil ".DATA~%~tB 1 2 3 4 5 6 7 8~%")))))
(test esrap-data-triple
(is (equal
'(parse::p
(parse::d
5 6 7 8 4 3 5))
(esrap:parse 'parse:str->ast (format nil ".DATA~%~tC 5 6 7 8~%~tD 4
~tE 3 5~%")))))
(test esrap-data-lazy-spaces
(is (equal
'(parse::p
(parse::d
5 6 7 8 4 3 5))
(esrap:parse 'parse:str->ast (format nil "~%~t.DATA~t~%F 5 6 7 8~t~%G 4
H 3 5~%")))))
(test esrap-data-full
(is (equal
'(parse::p
(parse::d
1 2 3 4 3 0)
(parse::x
(parse::i "LOAD" (parse::rr 5) (parse::rr 0) (parse::var "S"))
(parse::i "LOAD" (parse::rr 10) (parse::rr 0) (parse::var "ARR"))
(parse::i "LOAD" (parse::rr 6) (parse::rr 0) (parse::var "I"))
(parse::j "JRL" (parse::rr 0) (parse::l "CMP"))
(parse::r "ADD" (parse::rr 10) (parse::rr 6) (parse::rr 9))
(parse::i "ADDI" (parse::rr 6) (parse::rr 6) (parse::imm 1))
(parse::r "CMP" (parse::rr 6) (parse::rr 5) (parse::rr 0))
(parse::j "BGT" (parse::rr 0) (parse::l "L"))))
(esrap:parse 'parse:str->ast (format nil "
.DATA
ARR 1 2 3 4
S 3
I 0
.TEXT
LOAD $5 S
LOAD $10 ARR
LOAD $6 I
JRL CMP
L:
ADD $9 $10 $6
ADDI $6 $6 0X1
CMP:
CMP $6 $5
BGT L~%")))))
|