v2 / vlib / v / slow_tests / assembly / asm_test.arm64.v
87 lines · 82 sloc · 1.09 KB · 3d60410b605d001e54f280070d5f952da9de1112
Raw
1fn test_inline_asm() {
2 a, mut b := 10, 0
3 asm arm64 {
4 mov x0, a
5 mov b, x0
6 ; +r (b)
7 ; r (a)
8 ; x0
9 }
10 assert a == 10
11 assert b == 10
12
13 mut c := 0
14 asm arm64 {
15 mov c, 5
16 ; +r (c)
17 }
18 assert c == 5
19 d, e, mut f := 10, 2, 0
20 asm arm64 {
21 mov x0, d
22 mov x1, e
23 add x0, x0, x1
24 add x0, x0, 5
25 mov f, x0
26 ; +r (f) // output
27 ; r (d)
28 r (e) // input
29 ; x0
30 x1
31 }
32 assert d == 10
33 assert e == 2
34 assert f == 17
35
36 mut j := 0
37 asm arm64 {
38 mov x0, 5 // loop 5 times
39 mov x1, 0
40 loop_start:
41 add x1, x1, 3
42 sub x0, x0, 1
43 cmp x0, 0
44 b.gt loop_start
45 mov j, x1
46 ; +r (j)
47 ; ; x0
48 x1
49 }
50 assert j == 5 * 3
51
52 l := 5
53 m := &l
54 asm arm64 {
55 mov w0, 7
56 str w0, [m]
57 ; ; r (m)
58 ; w0
59 memory
60 }
61 assert l == 7
62}
63
64fn test_asm_generic() {
65 u := u64(49)
66 b := unsafe { bool(0) }
67 assert generic_asm(u) == 14
68 assert u == 63
69 assert generic_asm(b) == true
70 assert b == true
71}
72
73fn generic_asm[T](var &T) T {
74 mut ret := unsafe { T(14) }
75 unsafe {
76 asm volatile arm64 {
77 ldr x0, [var]
78 add x0, x0, ret
79 str x0, [var]
80 ; ; r (var)
81 r (ret)
82 ; x0
83 memory
84 }
85 }
86 return ret
87}
88