xref: /csrg-svn/lib/libm/national/national.s (revision 24964)
1*24964Szliu; @(#)national.s	1.1 (ucb.elefunt) 09/19/85
2*24964Szliu;
3*24964Szliu; subroutines
4*24964Szliu;	add_ulp(x)	... return x+ulp
5*24964Szliu;	sub_ulp(x)	... return x-ulp
6*24964Szliu;	swapENI(i)	... swap inexact enable bit with i
7*24964Szliu;	swapINX(i)	... swap inexact flag bit with i
8*24964Szliu;	swapRM(i)	... swap rounding mode with i
9*24964Szliu;
10*24964Szliu
11*24964Szliu; add_ulp(x):
12*24964Szliu; add one ulp to a floating point number
13*24964Szliu	.align	2
14*24964Szliu	.globl	_add_ulp
15*24964Szliu_add_ulp:
16*24964Szliu	movd	4(sp),r0
17*24964Szliu	movd	8(sp),r1
18*24964Szliu	addd	1,r0
19*24964Szliu	addcd	0,r1
20*24964Szliu	movd	r0,4(sp)
21*24964Szliu	movd	r1,8(sp)
22*24964Szliu	movl	4(sp),f0
23*24964Szliu	ret	0
24*24964Szliu
25*24964Szliu; sub_ulp(x)
26*24964Szliu; subtract one ulp from a floating point number
27*24964Szliu	.align	2
28*24964Szliu	.globl	_sub_ulp
29*24964Szliu_sub_ulp:
30*24964Szliu	movd	4(sp),r0
31*24964Szliu	movd	8(sp),r1
32*24964Szliu	subd	1,r0
33*24964Szliu	subcd	0,r1
34*24964Szliu	movd	r0,4(sp)
35*24964Szliu	movd	r1,8(sp)
36*24964Szliu	movl	4(sp),f0
37*24964Szliu	ret	0
38*24964Szliu
39*24964Szliu; swapENI(i)
40*24964Szliu; swap the inexact enable bit
41*24964Szliu	.text
42*24964Szliu	.align	2
43*24964Szliu	.globl	_swapENI
44*24964Szliu_swapENI:
45*24964Szliu	movd	4(sp),r1
46*24964Szliu	sfsr	r0
47*24964Szliu	movd	r0,r2
48*24964Szliu	bicd 	[5],r2
49*24964Szliu	andd	[0],r1
50*24964Szliu	ashd	5,r1
51*24964Szliu	ord	r1,r2
52*24964Szliu	lfsr	r2
53*24964Szliu	ashd	-5,r0
54*24964Szliu	andd	[0],r0
55*24964Szliu	ret	0
56*24964Szliu
57*24964Szliu; swapINX(i)
58*24964Szliu; swap the inexact flag
59*24964Szliu	.align	2
60*24964Szliu	.globl	_swapINX
61*24964Szliu_swapINX:
62*24964Szliu	movd	4(sp),r1
63*24964Szliu	sfsr	r0
64*24964Szliu	movd	r0,r2
65*24964Szliu	bicd 	[6],r2
66*24964Szliu	andd	[0],r1
67*24964Szliu	ashd	6,r1
68*24964Szliu	ord	r1,r2
69*24964Szliu	lfsr	r2
70*24964Szliu	ashd	-6,r0
71*24964Szliu	andd	[0],r0
72*24964Szliu	ret	0
73*24964Szliu
74*24964Szliu; swapRM(i)
75*24964Szliu; swap the rounding mode
76*24964Szliu	.align	2
77*24964Szliu	.globl	_swapRM
78*24964Szliu_swapRM:
79*24964Szliu	movd	4(sp),r1
80*24964Szliu	sfsr	r0
81*24964Szliu	movd	r0,r2
82*24964Szliu	bicd 	[7,8],r2
83*24964Szliu	andd	[0,1],r1
84*24964Szliu	ashd	7,r1
85*24964Szliu	ord	r1,r2
86*24964Szliu	lfsr	r2
87*24964Szliu	ashd	-7,r0
88*24964Szliu	andd	[0,1],r0
89*24964Szliu	ret	0
90