repo2/unmerged/zpu_firmware/mcc216/mycrt0.s @ 321
| 1 | markw | /* Startup code for ZPU
 | |
|    Copyright (C) 2005 Free Software Foundation, Inc.
 | |||
| This file is free software; you can redistribute it and/or modify it
 | |||
| under the terms of the GNU General Public License as published by the
 | |||
| Free Software Foundation; either version 2, or (at your option) any
 | |||
| later version.
 | |||
| In addition to the permissions in the GNU General Public License, the
 | |||
| Free Software Foundation gives you unlimited permission to link the
 | |||
| compiled version of this file with other programs, and to distribute
 | |||
| those programs without any restriction coming from the use of this
 | |||
| file.  (The General Public License restrictions do apply in other
 | |||
| respects; for example, they cover modification of the file, and
 | |||
| distribution when not linked into another program.)
 | |||
| This file is distributed in the hope that it will be useful, but
 | |||
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |||
| General Public License for more details.
 | |||
| You should have received a copy of the GNU General Public License
 | |||
| along with this program; see the file COPYING.  If not, write to
 | |||
| the Free Software Foundation, 59 Temple Place - Suite 330,
 | |||
| Boston, MA 02111-1307, USA.  */
 | |||
| 	.file	"mincrt0.S"
 | |||
| /* Minimal startup code, usable where the core is complete enough not to require emulated instructions */
 | |||
| 	.section ".fixed_vectors","ax"
 | |||
| ; KLUDGE!!! we remove the executable bit to avoid relaxation
 | |||
| 	.section ".fixed_vectors","a"
 | |||
| 	.macro fixedim value
 | |||
| 			im \value
 | |||
| 	.endm
 | |||
| 	.macro  jmp address
 | |||
| 			fixedim \address
 | |||
| 			poppc
 | |||
| 	.endm
 | |||
| 	.macro fast_neg
 | |||
| 	not
 | |||
| 	im 1
 | |||
| 	add
 | |||
| 	.endm
 | |||
| 	.macro mult1bit
 | |||
| 	; create mask of lowest bit in A
 | |||
| 	loadsp 8 ; A
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	im -1
 | |||
| 	add
 | |||
| 	not
 | |||
| 	loadsp 8 ; B
 | |||
| 	and
 | |||
| 	add ; accumulate in C
 | |||
| 	; shift B left 1 bit
 | |||
| 	loadsp 4 ; B
 | |||
| 	addsp 0
 | |||
| 	storesp 8 ; B
 | |||
| 	; shift A right 1 bit
 | |||
| 	loadsp 8 ; A
 | |||
| 	flip
 | |||
| 	addsp 0
 | |||
| 	flip
 | |||
| 	storesp 12 ; A
 | |||
| 	.endm
 | |||
| 	.macro cimpl funcname
 | |||
| 	; save R0
 | |||
| 	im _memreg
 | |||
| 	load
 | |||
| 	; save R1
 | |||
| 	im _memreg+4
 | |||
| 	load
 | |||
| 	; save R2
 | |||
| 	im _memreg+8
 | |||
| 	load
 | |||
| 	loadsp 20
 | |||
| 	loadsp 20
 | |||
| 	fixedim \funcname
 | |||
| 	call
 | |||
| 	; destroy arguments on stack
 | |||
| 	storesp 0
 | |||
| 	storesp 0
 | |||
| 	im _memreg
 | |||
| 	load
 | |||
| 	; poke the result into the right slot
 | |||
| 	storesp 24
 | |||
| 	; restore R2
 | |||
| 	im _memreg+8
 | |||
| 	store
 | |||
| 	; restore R1
 | |||
| 	im _memreg+4
 | |||
| 	store
 | |||
| 	; restore r0
 | |||
| 	im _memreg
 | |||
| 	store
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| 	.endm
 | |||
| 		.globl _start
 | |||
| _start:
 | |||
| 		jmp _premain
 | |||
| /* vectors */
 | |||
| /* instruction emulation code */
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
| 	nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
| 	nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
| 	nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
| 	nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
| 	nop
 | |||
|         nop
 | |||
|         nop
 | |||
|         nop
 | |||
| # opcode 34
 | |||
| # offset 0x0000 0040
 | |||
| 	.balign 32,0
 | |||
| _loadh:
 | |||
| 	loadsp 4
 | |||
| 	; by not masking out bit 0, we cause a memory access error
 | |||
| 	; on unaligned access
 | |||
| 	im ~0x2
 | |||
| 	and
 | |||
| 	load
 | |||
| 	; mult 8
 | |||
| 	loadsp 8
 | |||
| 	im 3
 | |||
| 	and
 | |||
| 	fast_neg
 | |||
| 	im 2
 | |||
| 	add
 | |||
| 	im 3
 | |||
| 	ashiftleft
 | |||
| 	; shift right addr&3 * 8
 | |||
| 	lshiftright
 | |||
| 	im 0xffff
 | |||
| 	and
 | |||
| 	storesp 8
 | |||
| 	poppc
 | |||
| # opcode 35
 | |||
| # offset 0x0000 0060
 | |||
| 	.balign 32,0
 | |||
| _storeh:
 | |||
| 	loadsp 4
 | |||
| 	; by not masking out bit 0, we cause a memory access error
 | |||
| 	; on unaligned access
 | |||
| 	im ~0x2
 | |||
| 	and
 | |||
| 	load
 | |||
| 	; mask
 | |||
| 	im 0xffff
 | |||
| 	loadsp 12
 | |||
| 	im 3
 | |||
| 	and
 | |||
| 	fast_neg
 | |||
| 	im 2
 | |||
| 	add
 | |||
| 	im 3
 | |||
| 	ashiftleft
 | |||
| 	ashiftleft
 | |||
| 	not
 | |||
| 	and
 | |||
| 	loadsp 12
 | |||
| 	im 0xffff
 | |||
| 	nop
 | |||
| 	fixedim _storehtail
 | |||
| 	poppc
 | |||
| # opcode 36
 | |||
| # offset 0x0000 0080
 | |||
| 	.balign 32,0
 | |||
| _lessthan:
 | |||
| 	loadsp 8
 | |||
| 	fast_neg
 | |||
| 	loadsp 8
 | |||
| 	add
 | |||
| 	; DANGER!!!!
 | |||
| 	; 0x80000000 will overflow when negated, so we need to mask
 | |||
| 	; the result above with the compare positive to negative
 | |||
| 	; number case
 | |||
| 	loadsp 12
 | |||
| 	loadsp 12
 | |||
| 	not
 | |||
| 	and
 | |||
| 	not
 | |||
| 	and
 | |||
| 	; handle case where we are comparing a negative number
 | |||
| 	; and positve number. This can underflow. E.g. consider 0x8000000 < 0x1000
 | |||
| 	loadsp 12
 | |||
| 	not
 | |||
| 	loadsp 12
 | |||
| 	and
 | |||
| 	or
 | |||
| 	flip
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 37
 | |||
| # offset 0x0000 00a0
 | |||
| 	.balign 32,0
 | |||
| _lessthanorequal:
 | |||
| 	loadsp 8
 | |||
| 	loadsp 8
 | |||
| 	lessthan
 | |||
| 	loadsp 12
 | |||
| 	loadsp 12
 | |||
| 	eq
 | |||
| 	or
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 38
 | |||
| # offset 0x0000 00c0
 | |||
| 	.balign 32,0
 | |||
| _ulessthan:
 | |||
| 	; fish up arguments
 | |||
| 	loadsp 4
 | |||
| 	loadsp 12
 | |||
| 	/* low: -1 if low bit dif is negative 0 otherwise:  neg (not x&1 and (y&1))
 | |||
| 		x&1		y&1		neg (not x&1 and (y&1))
 | |||
| 		1		1		0
 | |||
| 		1		0 		0
 | |||
| 		0		1		-1
 | |||
| 		0		0		0
 | |||
| 	*/
 | |||
| 	loadsp 4
 | |||
| 	not
 | |||
| 	loadsp 4
 | |||
| 	and
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	neg
 | |||
| 	/* high: upper 31-bit diff is only wrong when diff is 0 and low=-1
 | |||
| 		high=x>>1 - y>>1 + low
 | |||
| 		extremes
 | |||
| 		0000 - 1111:
 | |||
| 		low= neg(not 0 and 1) = 1111 (-1)
 | |||
| 		high=000+ neg(111) +low = 000 + 1001 + low = 1000
 | |||
| 		OK
 | |||
| 		1111 - 0000
 | |||
| 		low=neg(not 1 and 0) = 0
 | |||
| 		high=111+neg(000) + low = 0111
 | |||
| 		OK
 | |||
| 	 */
 | |||
| 	loadsp 8
 | |||
| 	flip
 | |||
| 	addsp 0
 | |||
| 	flip
 | |||
| 	loadsp 8
 | |||
| 	flip
 | |||
| 	addsp 0
 | |||
| 	flip
 | |||
| 	sub
 | |||
| 	; if they are equal, then the last bit decides...
 | |||
| 	add
 | |||
| 	/* test if negative: result = flip(diff) & 1 */
 | |||
| 	flip
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	; destroy a&b which are on stack
 | |||
| 	storesp 4
 | |||
| 	storesp 4
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 39
 | |||
| # offset 0x0000 00e0
 | |||
| 	.balign 32,0
 | |||
| _ulessthanorequal:
 | |||
| 	loadsp 8
 | |||
| 	loadsp 8
 | |||
| 	ulessthan
 | |||
| 	loadsp 12
 | |||
| 	loadsp 12
 | |||
| 	eq
 | |||
| 	or
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 40
 | |||
| # offset 0x0000 0100
 | |||
| 	.balign 32,0
 | |||
| 	.globl _swap
 | |||
| _swap:
 | |||
| 	breakpoint ; tbd
 | |||
| # opcode 41
 | |||
| # offset 0x0000 0120
 | |||
| 	.balign 32,0
 | |||
| _slowmult:
 | |||
| 	im _slowmultImpl
 | |||
| 	poppc
 | |||
| # opcode 42
 | |||
| # offset 0x0000 0140
 | |||
| 	.balign 32,0
 | |||
| _lshiftright:
 | |||
| 	loadsp 8
 | |||
| 	flip
 | |||
| 	loadsp 8
 | |||
| 	ashiftleft
 | |||
| 	flip
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 43
 | |||
| # offset 0x0000 0160
 | |||
| 	.balign 32,0
 | |||
| _ashiftleft:
 | |||
| 	loadsp 8
 | |||
| 	loadsp 8
 | |||
| 	im 0x1f
 | |||
| 	and
 | |||
| 	fast_neg
 | |||
| 	im _ashiftleftEnd
 | |||
| 	add
 | |||
| 	poppc
 | |||
| # opcode 44
 | |||
| # offset 0x0000 0180
 | |||
| 	.balign 32,0
 | |||
| _ashiftright:
 | |||
| 	loadsp 8
 | |||
| 	loadsp 8
 | |||
| 	lshiftright
 | |||
| 	; handle signed value
 | |||
| 	im -1
 | |||
| 	loadsp 12
 | |||
| 	im 0x1f
 | |||
| 	and
 | |||
| 	lshiftright
 | |||
| 	not	; now we have an integer on the stack with the signed
 | |||
| 		; bits in the right position
 | |||
| 	; mask these bits with the signed bit.
 | |||
| 	loadsp 16
 | |||
| 	not
 | |||
| 	flip
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	im -1
 | |||
| 	add
 | |||
| 	and
 | |||
| 	; stuff in the signed bits...
 | |||
| 	or
 | |||
| 	; store result into correct stack slot
 | |||
| 	storesp 12
 | |||
| 	; move up return value
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 45
 | |||
| # offset 0x0000 01a0
 | |||
| 	.balign 32,0
 | |||
| _call:
 | |||
| 	; fn
 | |||
| 	loadsp 4
 | |||
| 	; return address
 | |||
| 	loadsp 4
 | |||
| 	; store return address
 | |||
| 	storesp 12
 | |||
| 	; fn to call
 | |||
| 	storesp 4
 | |||
| 	pushsp	; flush internal stack
 | |||
| 	popsp
 | |||
| 	poppc
 | |||
| _storehtail:
 | |||
| 	and
 | |||
| 	loadsp 12
 | |||
| 	im 3
 | |||
| 	and
 | |||
| 	fast_neg
 | |||
| 	im 2
 | |||
| 	add
 | |||
| 	im 3
 | |||
| 	ashiftleft
 | |||
| 	nop
 | |||
| 	ashiftleft
 | |||
| 	or
 | |||
| 	loadsp 8
 | |||
| 	im  ~0x3
 | |||
| 	and
 | |||
| 	store
 | |||
| 	storesp 4
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 46
 | |||
| # offset 0x0000 01c0
 | |||
| 	.balign 32,0
 | |||
| _eq:
 | |||
| 	loadsp 8
 | |||
| 	fast_neg
 | |||
| 	loadsp 8
 | |||
| 	add
 | |||
| 	not
 | |||
| 	loadsp 0
 | |||
| 	im 1
 | |||
| 	add
 | |||
| 	not
 | |||
| 	and
 | |||
| 	flip
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 47
 | |||
| # offset 0x0000 01e0
 | |||
| 	.balign 32,0
 | |||
| _neq:
 | |||
| 	loadsp 8
 | |||
| 	fast_neg
 | |||
| 	loadsp 8
 | |||
| 	add
 | |||
| 	not
 | |||
| 	loadsp 0
 | |||
| 	im 1
 | |||
| 	add
 | |||
| 	not
 | |||
| 	and
 | |||
| 	flip
 | |||
| 	not
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 48
 | |||
| # offset 0x0000 0200
 | |||
| 	.balign 32,0
 | |||
| _neg:
 | |||
| 	loadsp 4
 | |||
| 	not
 | |||
| 	im 1
 | |||
| 	add
 | |||
| 	storesp 8
 | |||
| 	poppc
 | |||
| # opcode 49
 | |||
| # offset 0x0000 0220
 | |||
| 	.balign 32,0
 | |||
| _sub:
 | |||
| 	loadsp 8
 | |||
| 	loadsp 8
 | |||
| 	fast_neg
 | |||
| 	add
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 50
 | |||
| # offset 0x0000 0240
 | |||
| 	.balign 32,0
 | |||
| _xor:
 | |||
| 	loadsp 8
 | |||
| 	not
 | |||
| 	loadsp 8
 | |||
| 	and
 | |||
| 	loadsp 12
 | |||
| 	loadsp 12
 | |||
| 	not
 | |||
| 	and
 | |||
| 	or
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 51
 | |||
| # offset 0x0000 0260
 | |||
| 	.balign 32,0
 | |||
| _loadb:
 | |||
| 	loadsp 4
 | |||
| 	im ~0x3
 | |||
| 	and
 | |||
| 	load
 | |||
| 	loadsp 8
 | |||
| 	im 3
 | |||
| 	and
 | |||
| 	fast_neg
 | |||
| 	im 3
 | |||
| 	add
 | |||
| 	; x8
 | |||
| 	addsp 0
 | |||
| 	addsp 0
 | |||
| 	addsp 0
 | |||
| 	lshiftright
 | |||
| 	im 0xff
 | |||
| 	and
 | |||
| 	storesp 8
 | |||
| 	poppc
 | |||
| # opcode 52
 | |||
| # offset 0x0000 0280
 | |||
| 	.balign 32,0
 | |||
| _storeb:
 | |||
| 	loadsp 4
 | |||
| 	im ~0x3
 | |||
| 	and
 | |||
| 	load
 | |||
| 	; mask away destination
 | |||
| 	im _mask
 | |||
| 	loadsp 12
 | |||
| 	im 3
 | |||
| 	and
 | |||
| 	addsp 0
 | |||
| 	addsp 0
 | |||
| 	add
 | |||
| 	load
 | |||
| 	and
 | |||
| 	im _storebtail
 | |||
| 	poppc
 | |||
| # opcode 53
 | |||
| # offset 0x0000 02a0
 | |||
| 	.balign 32,0
 | |||
| _div:
 | |||
| 	jmp ___div
 | |||
| # opcode 54
 | |||
| # offset 0x0000 02c0
 | |||
| 	.balign 32,0
 | |||
| _mod:
 | |||
| 	jmp ___mod
 | |||
| # opcode 55
 | |||
| # offset 0x0000 02e0
 | |||
| 	.balign 32,0
 | |||
| 	.globl _eqbranch
 | |||
| _eqbranch:
 | |||
| 	loadsp 8
 | |||
| 	; eq
 | |||
| 	not
 | |||
| 	loadsp 0
 | |||
| 	im 1
 | |||
| 	add
 | |||
| 	not
 | |||
| 	and
 | |||
| 	flip
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	; mask
 | |||
| 	im -1
 | |||
| 	add
 | |||
| 	loadsp 0
 | |||
| 	storesp 16
 | |||
| 	; no branch address
 | |||
| 	loadsp 4
 | |||
| 	and
 | |||
| 	; fetch boolean & neg mask
 | |||
| 	loadsp 12
 | |||
| 	not
 | |||
| 	; calc address & mask for branch
 | |||
| 	loadsp 8
 | |||
| 	loadsp 16
 | |||
| 	add
 | |||
| 	; subtract 1 to find PC of branch instruction
 | |||
| 	im -1
 | |||
| 	add
 | |||
| 	and
 | |||
| 	or
 | |||
| 	storesp 4
 | |||
| 	storesp 4
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 56
 | |||
| # offset 0x0000 0300
 | |||
| 	.balign 32,0
 | |||
| 	.globl _neqbranch
 | |||
| _neqbranch:
 | |||
| 	loadsp 8
 | |||
| 	; neq
 | |||
| 	not
 | |||
| 	loadsp 0
 | |||
| 	im 1
 | |||
| 	add
 | |||
| 	not
 | |||
| 	and
 | |||
| 	flip
 | |||
| 	not
 | |||
| 	im 1
 | |||
| 	and
 | |||
| 	; mask
 | |||
| 	im -1
 | |||
| 	add
 | |||
| 	loadsp 0
 | |||
| 	storesp 16
 | |||
| 	; no branch address
 | |||
| 	loadsp 4
 | |||
| 	and
 | |||
| 	; fetch boolean & neg mask
 | |||
| 	loadsp 12
 | |||
| 	not
 | |||
| 	; calc address & mask for branch
 | |||
| 	loadsp 8
 | |||
| 	loadsp 16
 | |||
| 	add
 | |||
| 	; find address of branch instruction
 | |||
| 	im -1
 | |||
| 	add
 | |||
| 	and
 | |||
| 	or
 | |||
| 	storesp 4
 | |||
| 	storesp 4
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 57
 | |||
| # offset 0x0000 0320
 | |||
| 	.balign 32,0
 | |||
| 	.globl _poppcrel
 | |||
| _poppcrel:
 | |||
| 	add
 | |||
| 	; address of poppcrel
 | |||
| 	im -1
 | |||
| 	add
 | |||
| 	poppc
 | |||
| # opcode 58
 | |||
| # offset 0x0000 0340
 | |||
| 	.balign 32,0
 | |||
| 	.globl _config
 | |||
| _config:
 | |||
| 	im 1
 | |||
| 	nop
 | |||
| 	im _hardware
 | |||
| 	store
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| # opcode 59
 | |||
| # offset 0x0000 0360
 | |||
| 	.balign 32,0
 | |||
| _pushpc:
 | |||
| 	loadsp 4
 | |||
| 	im 1
 | |||
| 	add
 | |||
| 	storesp 8
 | |||
| 	poppc
 | |||
| # opcode 60
 | |||
| # offset 0x0000 0380
 | |||
| 	.balign 32,0
 | |||
| _syscall_emulate:
 | |||
| 	.byte 0
 | |||
| # opcode 61
 | |||
| # offset 0x0000 03a0
 | |||
| 	.balign 32,0
 | |||
| _pushspadd:
 | |||
| 	pushsp
 | |||
| 	im 4
 | |||
| 	add
 | |||
| 	loadsp 8
 | |||
| 	addsp 0
 | |||
| 	addsp 0
 | |||
| 	add
 | |||
| 	storesp 8
 | |||
| 	poppc
 | |||
| # opcode 62
 | |||
| # offset 0x0000 03c0
 | |||
| 	.balign 32,0
 | |||
| _halfmult:
 | |||
| 	breakpoint
 | |||
| # opcode 63
 | |||
| # offset 0x0000 03e0
 | |||
| 	.balign 32,0
 | |||
| _callpcrel:
 | |||
| 	loadsp 4
 | |||
| 	loadsp 4
 | |||
| 	add
 | |||
| 	im -1
 | |||
| 	add
 | |||
| 	loadsp 4
 | |||
| 	storesp 12	; return address
 | |||
| 	storesp 4
 | |||
| 	pushsp		; this will flush the internal stack.
 | |||
| 	popsp
 | |||
| 	poppc
 | |||
| 	.text
 | |||
| _ashiftleftBegin:
 | |||
| 	.rept 0x1f
 | |||
| 	addsp 0
 | |||
| 	.endr
 | |||
| _ashiftleftEnd:
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| _storebtail:
 | |||
| 	loadsp 12
 | |||
| 	im 0xff
 | |||
| 	and
 | |||
| 	loadsp 12
 | |||
| 	im 3
 | |||
| 	and
 | |||
| 	fast_neg
 | |||
| 	im 3
 | |||
| 	add
 | |||
| 	; x8
 | |||
| 	addsp 0
 | |||
| 	addsp 0
 | |||
| 	addsp 0
 | |||
| 	ashiftleft
 | |||
| 	or
 | |||
| 	loadsp 8
 | |||
| 	im  ~0x3
 | |||
| 	and
 | |||
| 	store
 | |||
| 	storesp 4
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| ; NB! this is not an EMULATE instruction. It is a varargs fn.
 | |||
| 	.globl _syscall
 | |||
| _syscall:
 | |||
| 	syscall
 | |||
| 	poppc
 | |||
| _slowmultImpl:
 | |||
| 	loadsp 8 ; A
 | |||
| 	loadsp 8 ; B
 | |||
| 	im 0 ; C
 | |||
| .LmoreMult:
 | |||
| 	mult1bit
 | |||
| 	; cutoff
 | |||
| 	loadsp 8
 | |||
| 	.byte (.LmoreMult-.Lbranch)&0x7f+0x80
 | |||
| .Lbranch:
 | |||
| 	neqbranch
 | |||
| 	storesp 4
 | |||
| 	storesp 4
 | |||
| 	storesp 12
 | |||
| 	storesp 4
 | |||
| 	poppc
 | |||
| ___mod:
 | |||
| 	cimpl __modsi3
 | |||
| ___div:
 | |||
| 	cimpl __divsi3
 | |||
| 	.section ".rodata"
 | |||
| 	.balign 4,0
 | |||
| _mask:
 | |||
| 	.long 0x00ffffff
 | |||
| 	.long 0xff00ffff
 | |||
| 	.long 0xffff00ff
 | |||
| 	.long 0xffffff00
 | |||
| 	.section ".text","ax"
 | |||
| 	.global _boot
 | |||
| 	.balign 4,0
 | |||
| _boot:
 | |||
| 	im 0
 | |||
| 	poppc
 | |||
| 	.global _break;
 | |||
| _break:
 | |||
| 	im	_break
 | |||
| 	poppc ; infinite loop
 | |||
| _premain:
 | |||
| 	im _break
 | |||
| 	nop
 | |||
| 	fixedim main
 | |||
| 	poppc
 | |||
| 	.data
 | |||
| 	.balign 4,0
 | |||
| 	.globl _hardware
 | |||
| _hardware:
 | |||
| 	.long 0
 | |||
| 	.globl _cpu_config
 | |||
| _cpu_config:
 | |||
| 	.long 0
 | |||
| 	.section ".bss"
 | |||
|     .balign 4,0
 | |||
| 	.globl _memreg
 | |||
| _memreg:
 | |||
| 		.long 0
 | |||
| 		.long 0
 | |||
| 		.long 0
 | |||
| 		.long 0
 |