arch/m68k/fpsp040/smovecr.S

Source file repositories/reference/linux-study-clean/arch/m68k/fpsp040/smovecr.S

File Facts

System
Linux kernel
Corpus path
arch/m68k/fpsp040/smovecr.S
Extension
.S
Size
4288 bytes
Lines
162
Domain
Architecture Layer
Bucket
arch/m68k
Inferred role
Architecture Layer: arch/m68k
Status
atlas-only

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

bfextu	CMDREG1B(%a6){#9:#7},%d0 |get offset
	bfextu	USER_FPCR(%a6){#26:#2},%d1 |get rmode
|
| check range of offset
|
	tstb	%d0		|if zero, offset is to pi
	beqs	PI_TBL		|it is pi
	cmpib	#0x0a,%d0		|check range $01 - $0a
	bles	Z_VAL		|if in this range, return zero
	cmpib	#0x0e,%d0		|check range $0b - $0e
	bles	SM_TBL		|valid constants in this range
	cmpib	#0x2f,%d0		|check range $10 - $2f
	bles	Z_VAL		|if in this range, return zero
	cmpib	#0x3f,%d0		|check range $30 - $3f
	ble	BG_TBL		|valid constants in this range
Z_VAL:
	fmoves	FZERO,%fp0
	rts
PI_TBL:
	tstb	%d1		|offset is zero, check for rmode
	beqs	PI_RN		|if zero, rn mode
	cmpib	#0x3,%d1		|check for rp
	beqs	PI_RP		|if 3, rp mode
PI_RZRM:
	leal	PIRZRM,%a0	|rmode is rz or rm, load PIRZRM in a0
	bra	set_finx
PI_RN:
	leal	PIRN,%a0		|rmode is rn, load PIRN in a0
	bra	set_finx
PI_RP:
	leal	PIRP,%a0		|rmode is rp, load PIRP in a0
	bra	set_finx
SM_TBL:
	subil	#0xb,%d0		|make offset in 0 - 4 range
	tstb	%d1		|check for rmode
	beqs	SM_RN		|if zero, rn mode
	cmpib	#0x3,%d1		|check for rp
	beqs	SM_RP		|if 3, rp mode
SM_RZRM:
	leal	SMALRZRM,%a0	|rmode is rz or rm, load SMRZRM in a0
	cmpib	#0x2,%d0		|check if result is inex
	ble	set_finx	|if 0 - 2, it is inexact
	bra	no_finx		|if 3, it is exact
SM_RN:
	leal	SMALRN,%a0	|rmode is rn, load SMRN in a0
	cmpib	#0x2,%d0		|check if result is inex
	ble	set_finx	|if 0 - 2, it is inexact
	bra	no_finx		|if 3, it is exact
SM_RP:
	leal	SMALRP,%a0	|rmode is rp, load SMRP in a0
	cmpib	#0x2,%d0		|check if result is inex
	ble	set_finx	|if 0 - 2, it is inexact
	bra	no_finx		|if 3, it is exact
BG_TBL:
	subil	#0x30,%d0		|make offset in 0 - f range
	tstb	%d1		|check for rmode
	beqs	BG_RN		|if zero, rn mode
	cmpib	#0x3,%d1		|check for rp
	beqs	BG_RP		|if 3, rp mode
BG_RZRM:
	leal	BIGRZRM,%a0	|rmode is rz or rm, load BGRZRM in a0
	cmpib	#0x1,%d0		|check if result is inex
	ble	set_finx	|if 0 - 1, it is inexact
	cmpib	#0x7,%d0		|second check
	ble	no_finx		|if 0 - 7, it is exact
	bra	set_finx	|if 8 - f, it is inexact
BG_RN:
	leal	BIGRN,%a0	|rmode is rn, load BGRN in a0
	cmpib	#0x1,%d0		|check if result is inex
	ble	set_finx	|if 0 - 1, it is inexact

Annotation

Implementation Notes