v2 / vlib / v / slow_tests / assembly / asm_test.i386.v
178 lines · 163 sloc · 2.45 KB · f47adaf4c98d7a885326fefe3bccad580dfb2da7
Raw
1// vtest build: !msvc
2
3fn test_inline_asm() {
4 a, mut b := 10, 0
5 asm i386 {
6 mov eax, a
7 mov b, eax
8 ; +r (b)
9 ; r (a)
10 ; eax
11 }
12 assert a == 10
13 assert b == 10
14
15 mut c := 0
16 asm i386 {
17 mov c, 5
18 ; +r (c)
19 }
20 assert c == 5
21
22 d, e, mut f := 10, 2, 0
23 asm i386 {
24 mov f, d
25 add f, e
26 add f, 5
27 ; +r (f) // output
28 ; r (d)
29 r (e) // input
30 }
31 assert d == 10
32 assert e == 2
33 assert f == 17
34
35 mut j := 0
36 // do 5*3
37 // adding three, five times
38 asm i386 {
39 mov ecx, 5 // loop 5 times
40 loop_start:
41 add j, 3
42 loop loop_start
43 ; +r (j)
44 ; ; ecx
45 }
46 assert j == 5 * 3
47
48 // k := 0 // Wait for tcc to implement goto, and gcc has odd errors
49 // mut loops := 0
50 // outside_label:
51 // if k != 5 {
52 // loops++
53 // asm goto amd64 {
54 // mov k, 1
55 // mov k, 5
56 // jmp outside_label
57 // ; =r (k) as k
58 // ; r (k)
59 // ;
60 // ; outside_label
61 // }
62 // }
63 // assert loops == 1
64 // assert k == 5
65
66 // not marked as mut because we dereference m to change l
67 l := 5
68 m := &l
69 asm i386 {
70 movb [m], 7
71 ; ; r (m)
72 }
73 assert l == 7
74
75 // same as above
76 n := [5, 9, 0, 4]
77 asm i386 {
78 loop_start2:
79 addw [in_data + ecx * 4 + 0], 2
80 loop loop_start2
81 addw [in_data + ecx * 4 + 0], 2
82 ; ; c (n.len - 1) // c is counter (loop) register
83 r (n.data) as in_data
84 }
85 assert n == [7, 11, 2, 6]
86
87 mut manu := Manu{}
88 asm i386 {
89 mov eax, 0
90 cpuid
91 ; =b (manu.ebx)
92 =d (manu.edx)
93 =c (manu.ecx)
94 ; ; eax
95 }
96 assert manu.str()[0].is_capital()
97}
98
99@[packed]
100struct Manu {
101mut:
102 ebx u32
103 edx u32
104 ecx u32
105 zero u8 // for string
106}
107
108fn (mut m Manu) str() string {
109 return unsafe {
110 string{
111 str: &u8(m)
112 len: 12
113 is_lit: 1
114 }
115 }
116}
117
118fn test_flag_output() {
119 a, b := 4, 9
120 mut out := false
121 asm i386 {
122 cmp a, b
123 ; =@ccl (out)
124 ; r (a)
125 r (b)
126 }
127 assert out
128 asm i386 {
129 cmp b, a
130 ; =@ccl (out)
131 ; r (a)
132 r (b)
133 }
134 assert !out
135
136 zero := 0
137 asm i386 {
138 cmp zero, zero
139 ; =@ccz (out)
140 ; r (zero)
141 }
142 assert out
143
144 mut maybe_four := 4
145 mut four := 4
146 asm i386 {
147 subl four, maybe_four
148 testl four, maybe_four
149 movl maybe_four, 9
150 ; +m (maybe_four)
151 +r (four)
152 =@ccz (out)
153 }
154 assert out
155 assert maybe_four == 9
156}
157
158fn test_asm_generic() {
159 u := u64(49)
160 b := unsafe { bool(0) }
161 assert generic_asm(u) == 14
162 assert u == 63
163 assert generic_asm(b) == true
164 assert b == true
165}
166
167fn generic_asm[T](var &T) T {
168 mut ret := unsafe { T(14) }
169 unsafe {
170 asm volatile i386 {
171 add var, ret
172 ; +m (var[0]) as var
173 +r (ret)
174 ; ; memory
175 }
176 }
177 return ret
178}
179