1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# When trying (and failing) to instrument at the basic block level 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# I thought up a lot of corner-cases in the rep code. This tries 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# to catch some of them 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Performance counters give us 8207 insns 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 11 + 8*1024 + 3 = 8206 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown .globl _start 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown_start: 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cld # we want these to happen forward 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $0xfeb131978,%rax # value to store 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # test back-to-back rep/stosb's 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $1024,%rcx 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $buffer1, %rdi # set destination 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rep stosb # store 1024 times 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rep stosb # should store 0 times 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rep stosb # should store 0 times 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # test stosb where cx is 0 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown xor %rcx,%rcx 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $buffer1, %rdi # set destination 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rep stosb # should not load at all 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # test rep inside of a loop 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $1024, %rbx 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownrep_loop: 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $1024,%rcx 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $buffer1, %rdi # set destination 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rep stosb 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $1024,%rcx 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $buffer1, %rdi # set destination 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rep stosb 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown dec %rbx 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jnz rep_loop 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================ 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Exit 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================ 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownexit: 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $60,%rax 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown xor %rdi,%rdi # we return 0 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syscall # and exit 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.bss 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm buffer1, 16384 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 59