aboutsummaryrefslogtreecommitdiff
path: root/unix/as.macosx/README
blob: d19b2a3edd59ba1a47520863e4be4df60a33f0d3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# LinuxPPC Assembler - LinuxPPC 2000, Aug 2000

	.file	"zz.c"
# zsvjmp_(buf,status)
# int *buf;
# int *status;
# {
#	 *status = 0;
#	 buf[0] = *status;
#	 setjmp (&buf[1]);
# }

gcc2_compiled.:
	.section	".text"
	.align 2
	.globl zsvjmp_
	.type	 zsvjmp_,@function

	# Addressing: 12(31) means effective address (EA) is r31+12
	# lwz 9,12(31) means move value at EA to r9

	# REGISTERS: r1 = stack pointer, r31 = frame pointer, r3+ = args
	# Function always saves r1, r31 on stack.  Sets up frame with
	# required auto storage.  Saves LR as well if any functions will
	# be called.

zsvjmp_:
	# -- Push old r1 on stack; start new stack frame at r1
	stwu 1,-32(1)		# Store word with update (push on stack)
				# EA = r1-32;  (r1) -> (EA), EA -> r1

	# -- Save LR, r31 in stack frame
	mflr 0			# Move from Link Register:  LR -> r0
	stw 31,28(1)		# Store word:              r31 -> r1+28
	stw 0,36(1)		# Store word:               r0 -> r1+36

	# -- Save r3 (arg1), r4 (arg2) on stack
	mr  31,1		# Move register:            r1 -> r31
	stw 3,8(31)		#                           r3 -> r31+8
	stw 4,12(31)		#		            r4 -> r31+12

	# -- *status = 0;
	lwz 9,12(31)		# Load word and zero: (r31+12) -> r9
	li 0,0			# Load zero:		     0 -> r0
	stw 0,0(9)		# Store:		    r0 -> r9+0

	# -- buf[0] = *status;
	lwz 9,8(31)		# buf -> r9
	lwz 11,12(31)		# status -> r11
	lwz 0,0(11)		# *status -> r0
	stw 0,0(9)		# r0 -> buf[0]

	# -- setjmp (&buf[1]);
	lwz 9,8(31)		# buf -> r9
	addi 0,9,4		# Add immediate;	  r9+4 -> r0
	mr 3,0			# R3 is first arg
	crxor 6,6,6		# Condition reg XOR: xor(b6,b6) -> b6
	bl setjmp		# Branch to setjmp; addr(.L2) -> LR
.L2:
	lwz 11,0(1)		# load old r1 into r11
	lwz 0,4(11)		# load old LR into r0
	mtlr 0			# restore return addr to LR
	lwz 31,-4(11)		# restore old r31
	mr 1,11			# restore old r1
	blr			# Branch unconditionally (to LR addr)
.Lfe1:
	.size	 zsvjmp_,.Lfe1-zsvjmp_
	.ident	"GCC: (GNU) 2.95.2 19991024 (release/franzo)"