Add missing zstd.h to coregrind Makefile.am noinst_HEADERS
[valgrind.git] / exp-bbv / tests / x86 / rep_prefix.S
blob81cf93c43815a99eaab12424406df3ef933d205c
2 # rep, repe (repz) and repne (repnz) prefixed string instructions
3 #   only count as one instruction, even though they repeat many times
4 # This test makes sure the bbv plugin counts these instructions properly
5 # The answer is validated to hw perf counters.
8         .globl _start   
9 _start: 
10         cld                             # we want these to happen forward
12         #===================================
13         # Check varied order of the size prefix
14         #   with the rep prefix.  Older binutils
15         #   did this one way, newer binutils the other
16         #===================================
17         
18 size_prefix:
19         # test 16-bit load
20         
21         mov     $8192, %ecx
22         mov     $buffer1, %esi          # set source
23         .byte 0x66, 0xf3, 0xad          # lodsw
24         
25         mov     $8192, %ecx
26         mov     $buffer1, %esi          # set source
27         .byte 0xf3, 0x66, 0xad          # lodsw 
28         
29         
30         
32         #===================================
33         # Load and Store Instructions
34         #===================================
35 loadstore:
36         xor     %eax, %eax
37         mov     $0xd, %al               # set eax to d
38         
39         # test 8-bit store
40         
41         mov     $16384, %ecx
42         mov     $buffer1, %edi          # set destination
43         rep     stosb                   # store d 16384 times, auto-increment
44         
45         # test 8-bit load
46         
47         mov     $16384, %ecx
48         mov     $buffer1, %esi          # set source
49         rep     lodsb                   # load byte 16384 times, auto-increment
51         cmp     $0xd,%al                # if we loaded wrong value
52         jne     print_error             # print an error
54         # test 16-bit store
55         
56         mov     $0x020d,%ax             # store 0x020d
57         
58         mov     $8192, %ecx
59         mov     $buffer1, %edi          # set destination
60         rep     stosw                   # store 8192 times, auto-increment
61         
62         # test 16-bit load
63         
64         mov     $8192, %ecx
65         mov     $buffer1, %esi          # set source
66         rep     lodsw                   # load 8192 times, auto-increment
68         cmp     $0x020d,%ax             # if we loaded wrong value
69         jne     print_error             # print an error
70         
71         # test 32-bit store
72         
73         mov     $0x0feb1378,%eax        # store 0x0feb1378
74         
75         mov     $4096, %ecx
76         mov     $buffer1, %edi          # set destination
77         rep     stosl                   # store 4096 times, auto-increment
78         
79         # test 32-bit load
80         
81         mov     $4096, %ecx
82         mov     $buffer1, %esi          # set source
83         rep     lodsl                   # load 4096 times, auto-increment
85         cmp     $0x0feb1378,%eax        # if we loaded wrong value
86         jne     print_error             # print an error
88         #=============================
89         # Move instructions
90         #=============================
91 moves:
92         # test 8-bit move
93         
94         mov    $16384, %ecx
95         mov    $buffer1, %esi
96         mov    $buffer2, %edi
97         rep    movsb
98         
99         # test 16-bit move
100         
101         mov    $8192, %ecx
102         mov    $buffer2, %esi
103         mov    $buffer1, %edi
104         rep    movsw
105         
106         # test 32-bit move
107         
108         mov    $4096, %ecx
109         mov    $buffer1, %esi
110         mov    $buffer2, %edi
111         rep    movsl    
112         
113         #==================================
114         # Compare equal instructions
115         #==================================
116 compare_equal:  
117         # first set up the areas to compare
118         
119         mov     $0xa5a5a5a5,%eax
120         mov     $buffer1, %edi
121         mov     $4096, %ecx
122         rep     stosl
123         
124         mov     $0xa5a5a5a5,%eax
125         mov     $buffer2, %edi
126         mov     $4096, %ecx
127         rep     stosl
128         
129         # test 8-bit
130         
131         mov     $buffer1,%esi
132         mov     $buffer2,%edi
133         mov     $16384, %ecx
134         repe    cmpsb
135         jnz     print_error
136         
137         # test 16-bit
138         
139         mov     $buffer1,%esi
140         mov     $buffer2,%edi
141         mov     $8192, %ecx
142         repe    cmpsw
143         jnz     print_error     
144         
145         # test 32-bit
146         
147         mov     $buffer1,%esi
148         mov     $buffer2,%edi
149         mov     $4096, %ecx
150         repe    cmpsl
151         jnz     print_error             
152         
153         #==================================
154         # Compare not equal instructions
155         #==================================
156 compare_noteq:  
157         # change second buffer
158         
159         mov     $0x5a5a5a5a,%eax
160         mov     $buffer2, %edi
161         mov     $4096, %ecx
162         rep     stosl
163         
164         # test 8-bit
165         
166         mov     $buffer1,%esi
167         mov     $buffer2,%edi
168         mov     $16384, %ecx
169         repne   cmpsb
170         je      print_error
171         
172         # test 16-bit
173         
174         mov     $buffer1,%esi
175         mov     $buffer2,%edi
176         mov     $8192, %ecx
177         repne   cmpsw
178         je      print_error     
179         
180         # test 32-bit
181         
182         mov     $buffer1,%esi
183         mov     $buffer2,%edi
184         mov     $4096, %ecx
185         repne   cmpsl
186         je      print_error                     
187         
188         #====================================
189         # Check scan equal instruction
190         #====================================
192         # test 8-bit
194         mov     $0xa5,%al
195         mov     $buffer1,%edi
196         mov     $16384, %ecx
197         repe    scasb
198         jnz     print_error
199         
200         # test 16-bit
201         
202         mov     $0xa5a5,%ax
203         mov     $buffer1,%edi
204         mov     $8192, %ecx
205         repe    scasw
206         jnz     print_error     
207         
208         # test 32-bit
209         
210         mov     $0xa5a5a5a5,%eax
211         mov     $buffer1,%edi
212         mov     $4096, %ecx
213         repe    scasl
214         jnz     print_error             
216         #====================================
217         # Check scan not-equal instruction
218         #====================================
220         # test 8-bit
222         mov     $0xa5,%al
223         mov     $buffer2,%edi
224         mov     $16384, %ecx
225         repne   scasb
226         jz      print_error
227         
228         # test 16-bit
229         
230         mov     $0xa5a5,%ax
231         mov     $buffer2,%edi
232         mov     $8192, %ecx
233         repne   scasw
234         jz      print_error     
235         
236         # test 32-bit
237         
238         mov     $0xa5a5a5a5,%eax
239         mov     $buffer2,%edi
240         mov     $4096, %ecx
241         repne   scasl
242         jz      print_error             
244         jmp     exit                    # no error, skip to exit
245         
246 print_error:
247             
248         mov     $4, %eax                # Write syscall
249 #if defined(VGO_darwin) || defined(VGO_freebsd)
250         pushl   $16
251         pushl   $error_string
252         pushl   $1
253         int     $0x80
254 #elif defined(VGO_linux)
255         mov     $1, %ebx                # print to stdout
256         mov     $error_string, %ecx     # string to print
257         mov     $16, %edx               # strlen
258         int     $0x80
259 #elif defined(VGO_solaris)
260         pushl   $16
261         pushl   $error_string
262         pushl   $1
263         int     $0x91
264 #else
265 #  error "Unknown OS"
266 #endif
268         #================================
269         # Exit
270         #================================
271 exit:
272         xor     %eax,%eax
273         inc     %eax                    # put exit syscall number (1) in eax
274 #if defined(VGO_darwin) || defined(VGO_freebsd)
275         pushl   $0                      # we return 0
276         int     $0x80                   # and exit
277 #elif defined(VGO_linux)
278         xor     %ebx,%ebx               # we return 0
279         int     $0x80                   # and exit
280 #elif defined(VGO_solaris)
281         pushl   $0                      # we return 0
282         int     $0x91                   # and exit
283 #else
284 #  error "Unknown OS"
285 #endif
288 .data
289 error_string:   .ascii "Error detected!\n\0"
291 #.bss
293 .lcomm  buffer1,        16384
294 .lcomm  buffer2,        16384