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 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 31 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 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 #============================= 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 #==================================== 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 246 print_error: 247 248 mov $4, %eax # Write syscall 249 #ifdef VGO_darwin 250 pushl $1 251 pushl $error_string 252 pushl $16 253 #else 254 mov $1, %ebx # print to stdout 255 mov $error_string, %ecx # string to print 256 mov $16, %edx # strlen 257 #endif 258 int $0x80 # call syscall 259 260 #================================ 261 # Exit 262 #================================ 263 exit: 264 #ifdef VGO_darwin 265 xor %ebx,%ebx # we return 0 266 #else 267 pushl $0 # we return 0 268 #endif 269 xor %eax,%eax 270 inc %eax # put exit syscall number (1) in eax 271 int $0x80 # and exit 272 273 274 .data 275 error_string: .asciz "Error detected!\n" 276 277 #.bss 278 279 .lcomm buffer1, 16384 280 .lcomm buffer2, 16384 281