/
doc.go
157 lines (123 loc) · 5.33 KB
/
doc.go
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package arm64
/*
Go Assembly for ARM64 Reference Manual
1. Alphabetical list of basic instructions
// TODO
2. Alphabetical list of float-point instructions
// TODO
3. Alphabetical list of SIMD instructions
VADD: Add (scalar)
VADD <Vm>, <Vn>, <Vd>
Add corresponding low 64-bit elements in <Vm> and <Vn>,
place the result into low 64-bit element of <Vd>.
VADD: Add (vector).
VADD <Vm>.T, <Vn>.<T>, <Vd>.<T>
<T> Is an arrangement specifier and can have the following values:
8B, 16B, H4, H8, S2, S4, D2
VADDP: Add Pairwise (vector)
VADDP <Vm>.<T>, <Vn>.<T>, <Vd>.<T>
<T> Is an arrangement specifier and can have the following values:
B8, B16, H4, H8, S2, S4, D2
VADDV: Add across Vector.
VADDV <Vn>.<T>, Vd
<T> Is an arrangement specifier and can have the following values:
8B, 16B, H4, H8, S4
VAND: Bitwise AND (vector)
VAND <Vm>.<T>, <Vn>.<T>, <Vd>.<T>
<T> Is an arrangement specifier and can have the following values:
B8, B16
VCMEQ: Compare bitwise Equal (vector)
VCMEQ <Vm>.<T>, <Vn>.<T>, <Vd>.<T>
<T> Is an arrangement specifier and can have the following values:
B8, B16, H4, H8, S2, S4, D2
VDUP: Duplicate vector element to vector or scalar.
VDUP <Vn>.<Ts>[index], <Vd>.<T>
<T> Is an arrangement specifier and can have the following values:
8B, 16B, H4, H8, S2, S4, D2
<Ts> Is an element size specifier and can have the following values:
B, H, S, D
VEOR: Bitwise exclusive OR (vector, register)
VEOR <Vm>.<T>, <Vn>.<T>, <Vd>.<T>
<T> Is an arrangement specifier and can have the following values:
B8, B16
VLD1: Load multiple single-element structures
VLD1 (Rn), [<Vt>.<T>, <Vt2>.<T> ...] // no offset
VLD1.P imm(Rn), [<Vt>.<T>, <Vt2>.<T> ...] // immediate offset variant
VLD1.P (Rn)(Rm), [<Vt>.<T>, <Vt2>.<T> ...] // register offset variant
<T> Is an arrangement specifier and can have the following values:
B8, B16, H4, H8, S2, S4, D1, D2
VMOV: move
VMOV <Vn>.<T>[index], Rd // Move vector element to general-purpose register.
<T> Is a source width specifier and can have the following values:
B, H, S (Wd)
D (Xd)
VMOV Rn, <Vd>.<T> // Duplicate general-purpose register to vector.
<T> Is an arrangement specifier and can have the following values:
B8, B16, H4, H8, S2, S4 (Wn)
D2 (Xn)
VMOV <Vn>.<T>, <Vd>.<T> // Move vector.
<T> Is an arrangement specifier and can have the following values:
B8, B16
VMOV Rn, <Vd>.<T>[index] // Move general-purpose register to a vector element.
<T> Is a source width specifier and can have the following values:
B, H, S (Wd)
D (Xd)
VMOV <Vn>.<T>[index], Vn // Move vector element to scalar.
<T> Is an element size specifier and can have the following values:
B, H, S, D
VMOVI: Move Immediate (vector).
VMOVI $imm8, <Vd>.<T>
<T> is an arrangement specifier and can have the following values:
8B, 16B
VMOVS: Load SIMD&FP Register (immediate offset). ARMv8: LDR (immediate, SIMD&FP)
Store SIMD&FP register (immediate offset). ARMv8: STR (immediate, SIMD&FP)
VMOVS (Rn), Vn
VMOVS.W imm(Rn), Vn
VMOVS.P imm(Rn), Vn
VMOVS Vn, (Rn)
VMOVS.W Vn, imm(Rn)
VMOVS.P Vn, imm(Rn)
VORR: Bitwise inclusive OR (vector, register)
VORR <Vm>.<T>, <Vn>.<T>, <Vd>.<T>
<T> Is an arrangement specifier and can have the following values:
B8, B16
VREV32: Reverse elements in 32-bit words (vector).
REV32 <Vn>.<T>, <Vd>.<T>
<T> Is an arrangement specifier and can have the following values:
B8, B16, H4, H8
VST1: Store multiple single-element structures
VST1 [<Vt>.<T>, <Vt2>.<T> ...], (Rn) // no offset
VST1.P [<Vt>.<T>, <Vt2>.<T> ...], imm(Rn) // immediate offset variant
VST1.P [<Vt>.<T>, <Vt2>.<T> ...], (Rn)(Rm) // register offset variant
<T> Is an arrangement specifier and can have the following values:
B8, B16, H4, H8, S2, S4, D1, D2
VSUB: Sub (scalar)
VSUB <Vm>, <Vn>, <Vd>
Subtract low 64-bit element in <Vm> from the correponding element in <Vn>,
place the result into low 64-bit element of <Vd>.
VUADDLV: Unsigned sum Long across Vector.
VUADDLV <Vn>.<T>, Vd
<T> Is an arrangement specifier and can have the following values:
8B, 16B, H4, H8, S4
4. Alphabetical list of cryptographic extension instructions
SHA1C, SHA1M, SHA1P: SHA1 hash update.
SHA1C <Vm>.S4, Vn, Vd
SHA1M <Vm>.S4, Vn, Vd
SHA1P <Vm>.S4, Vn, Vd
SHA1H: SHA1 fixed rotate.
SHA1H Vn, Vd
SHA1SU0: SHA1 schedule update 0.
SHA256SU1: SHA256 schedule update 1.
SHA1SU0 <Vm>.S4, <Vn>.S4, <Vd>.S4
SHA256SU1 <Vm>.S4, <Vn>.S4, <Vd>.S4
SHA1SU1: SHA1 schedule update 1.
SHA256SU0: SHA256 schedule update 0.
SHA1SU1 <Vn>.S4, <Vd>.S4
SHA256SU0 <Vn>.S4, <Vd>.S4
SHA256H, SHA256H2: SHA256 hash update.
SHA256H <Vm>.S4, Vn, Vd
SHA256H2 <Vm>.S4, Vn, Vd
*/