1# 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. 6# 7 8 .globl _start 9_start: 10 cld # we want these to happen forward 11 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 18size_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 31 32 #=================================== 33 # Load and Store Instructions 34 #=================================== 35loadstore: 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 50 51 cmp $0xd,%al # if we loaded wrong value 52 jne print_error # print an error 53 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 67 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 84 85 cmp $0x0feb1378,%eax # if we loaded wrong value 86 jne print_error # print an error 87 88 #============================= 89 # Move instructions 90 #============================= 91moves: 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 #================================== 116compare_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 #================================== 156compare_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 #==================================== 191 192 # test 8-bit 193 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 215 216 #==================================== 217 # Check scan not-equal instruction 218 #==================================== 219 220 # test 8-bit 221 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 243 244 jmp exit # no error, skip to exit 245 246print_error: 247 248 mov $4, %eax # Write syscall 249#if defined(VGO_darwin) 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 267 268 #================================ 269 # Exit 270 #================================ 271exit: 272 xor %eax,%eax 273 inc %eax # put exit syscall number (1) in eax 274#if defined(VGO_darwin) 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 286 287 288.data 289error_string: .ascii "Error detected!\n\0" 290 291#.bss 292 293.lcomm buffer1, 16384 294.lcomm buffer2, 16384 295