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    $0xfeb1378,%eax		# value to store
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# test back-to-back rep/stosb's
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	$1024,%ecx
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	$buffer1, %edi		# 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    %ecx,%ecx
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov    $buffer1, %edi		# 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, %ebx
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownrep_loop:
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov    $1024,%ecx
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov    $buffer1, %edi		# set destination
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	rep    stosb
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov    $1024,%ecx
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov    $buffer1, %edi		# set destination
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	rep    stosb
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	dec    %ebx
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jnz    rep_loop
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Exit
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownexit:
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     	mov	$1,%eax
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef VGO_darwin
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	$0
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	xor     %ebx,%ebx		# we return 0
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	int	$0x80          		# and exit
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#.bss
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm	buffer1,	16384
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63