| # When trying (and failing) to instrument at the basic block level |
| # I thought up a lot of corner-cases in the rep code. This tries |
| # to catch some of them |
| |
| # Performance counters give us 8207 insns |
| # 11 + 8*1024 + 3 = 8206 |
| |
| .globl _start |
| _start: |
| cld # we want these to happen forward |
| |
| mov $0xfeb1378,%eax # value to store |
| |
| # test back-to-back rep/stosb's |
| |
| mov $1024,%ecx |
| mov $buffer1, %edi # set destination |
| rep stosb # store 1024 times |
| rep stosb # should store 0 times |
| rep stosb # should store 0 times |
| |
| |
| # test stosb where cx is 0 |
| |
| xor %ecx,%ecx |
| mov $buffer1, %edi # set destination |
| rep stosb # should not load at all |
| |
| # test rep inside of a loop |
| |
| mov $1024, %ebx |
| rep_loop: |
| |
| mov $1024,%ecx |
| mov $buffer1, %edi # set destination |
| rep stosb |
| |
| mov $1024,%ecx |
| mov $buffer1, %edi # set destination |
| rep stosb |
| |
| dec %ebx |
| jnz rep_loop |
| |
| |
| #================================ |
| # Exit |
| #================================ |
| exit: |
| mov $1,%eax |
| #ifdef VGO_darwin |
| pushl $0 |
| #else |
| xor %ebx,%ebx # we return 0 |
| #endif |
| int $0x80 # and exit |
| |
| |
| #.bss |
| |
| .lcomm buffer1, 16384 |
| |