2008-04-28 00:47:20 -07:00
/* This is trivial with the new code... */
.globl do_fpdis
.type do_ f p d i s ,#f u n c t i o n
do_fpdis :
sethi % h i ( T S T A T E _ P E F ) , % g 4
rdpr % t s t a t e , % g 5
andcc % g 5 , % g 4 , % g 0
be,p t % x c c , 1 f
nop
rd % f p r s , % g 5
andcc % g 5 , F P R S _ F E F , % g 0
be,p t % x c c , 1 f
nop
/* Legal state when DCR_IFPOE is set in Cheetah %dcr. */
sethi % h i ( 1 0 9 f ) , % g 7
ba,p t % x c c , e t r a p
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
add % g 0 , % g 0 , % g 0
ba,a ,p t % x c c , r t r a p
1 : TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
ldub [ % g 6 + T I _ F P S A V E D ] , % g 5
wr % g 0 , F P R S _ F E F , % f p r s
andcc % g 5 , F P R S _ F E F , % g 0
be,a ,p t % i c c , 1 f
clr % g 7
ldx [ % g 6 + T I _ G S R ] , % g 7
1 : andcc % g 5 , F P R S _ D L , % g 0
bne,p n % i c c , 2 f
fzero % f0
andcc % g 5 , F P R S _ D U , % g 0
bne,p n % i c c , 1 f
fzero % f2
faddd % f0 , % f2 , % f4
fmuld % f0 , % f2 , % f6
faddd % f0 , % f2 , % f8
fmuld % f0 , % f2 , % f10
faddd % f0 , % f2 , % f12
fmuld % f0 , % f2 , % f14
faddd % f0 , % f2 , % f16
fmuld % f0 , % f2 , % f18
faddd % f0 , % f2 , % f20
fmuld % f0 , % f2 , % f22
faddd % f0 , % f2 , % f24
fmuld % f0 , % f2 , % f26
faddd % f0 , % f2 , % f28
fmuld % f0 , % f2 , % f30
faddd % f0 , % f2 , % f32
fmuld % f0 , % f2 , % f34
faddd % f0 , % f2 , % f36
fmuld % f0 , % f2 , % f38
faddd % f0 , % f2 , % f40
fmuld % f0 , % f2 , % f42
faddd % f0 , % f2 , % f44
fmuld % f0 , % f2 , % f46
faddd % f0 , % f2 , % f48
fmuld % f0 , % f2 , % f50
faddd % f0 , % f2 , % f52
fmuld % f0 , % f2 , % f54
faddd % f0 , % f2 , % f56
fmuld % f0 , % f2 , % f58
b,p t % x c c , f p d i s _ e x i t 2
faddd % f0 , % f2 , % f60
1 : mov S E C O N D A R Y _ C O N T E X T , % g 3
add % g 6 , T I _ F P R E G S + 0 x80 , % g 1
faddd % f0 , % f2 , % f4
fmuld % f0 , % f2 , % f6
661 : ldxa [ % g 3 ] A S I _ D M M U , % g 5
.section .sun4v_1insn_patch , " ax"
.word 661b
ldxa [ % g 3 ] A S I _ M M U , % g 5
.previous
sethi % h i ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) , % g 2
ldx [ % g 2 + % l o ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) ] , % g 2
661 : stxa % g 2 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 2 , [ % g 3 ] A S I _ M M U
.previous
membar #S y n c
add % g 6 , T I _ F P R E G S + 0 x c0 , % g 2
faddd % f0 , % f2 , % f8
fmuld % f0 , % f2 , % f10
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f32
ldda [ % g 2 ] A S I _ B L K _ S , % f48
membar #S y n c
faddd % f0 , % f2 , % f12
fmuld % f0 , % f2 , % f14
faddd % f0 , % f2 , % f16
fmuld % f0 , % f2 , % f18
faddd % f0 , % f2 , % f20
fmuld % f0 , % f2 , % f22
faddd % f0 , % f2 , % f24
fmuld % f0 , % f2 , % f26
faddd % f0 , % f2 , % f28
fmuld % f0 , % f2 , % f30
2016-04-27 17:27:37 -04:00
ba,a ,p t % x c c , f p d i s _ e x i t
2008-04-28 00:47:20 -07:00
2 : andcc % g 5 , F P R S _ D U , % g 0
bne,p t % i c c , 3 f
fzero % f32
mov S E C O N D A R Y _ C O N T E X T , % g 3
fzero % f34
661 : ldxa [ % g 3 ] A S I _ D M M U , % g 5
.section .sun4v_1insn_patch , " ax"
.word 661b
ldxa [ % g 3 ] A S I _ M M U , % g 5
.previous
add % g 6 , T I _ F P R E G S , % g 1
sethi % h i ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) , % g 2
ldx [ % g 2 + % l o ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) ] , % g 2
661 : stxa % g 2 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 2 , [ % g 3 ] A S I _ M M U
.previous
membar #S y n c
add % g 6 , T I _ F P R E G S + 0 x40 , % g 2
faddd % f32 , % f34 , % f36
fmuld % f32 , % f34 , % f38
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f0
ldda [ % g 2 ] A S I _ B L K _ S , % f16
membar #S y n c
faddd % f32 , % f34 , % f40
fmuld % f32 , % f34 , % f42
faddd % f32 , % f34 , % f44
fmuld % f32 , % f34 , % f46
faddd % f32 , % f34 , % f48
fmuld % f32 , % f34 , % f50
faddd % f32 , % f34 , % f52
fmuld % f32 , % f34 , % f54
faddd % f32 , % f34 , % f56
fmuld % f32 , % f34 , % f58
faddd % f32 , % f34 , % f60
fmuld % f32 , % f34 , % f62
2016-04-27 17:27:37 -04:00
ba,a ,p t % x c c , f p d i s _ e x i t
2008-04-28 00:47:20 -07:00
3 : mov S E C O N D A R Y _ C O N T E X T , % g 3
add % g 6 , T I _ F P R E G S , % g 1
661 : ldxa [ % g 3 ] A S I _ D M M U , % g 5
.section .sun4v_1insn_patch , " ax"
.word 661b
ldxa [ % g 3 ] A S I _ M M U , % g 5
.previous
sethi % h i ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) , % g 2
ldx [ % g 2 + % l o ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) ] , % g 2
661 : stxa % g 2 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 2 , [ % g 3 ] A S I _ M M U
.previous
membar #S y n c
mov 0 x40 , % g 2
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f0
ldda [ % g 1 + % g 2 ] A S I _ B L K _ S , % f16
add % g 1 , 0 x80 , % g 1
ldda [ % g 1 ] A S I _ B L K _ S , % f32
ldda [ % g 1 + % g 2 ] A S I _ B L K _ S , % f48
membar #S y n c
fpdis_exit :
661 : stxa % g 5 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 5 , [ % g 3 ] A S I _ M M U
.previous
membar #S y n c
fpdis_exit2 :
wr % g 7 , 0 , % g s r
ldx [ % g 6 + T I _ X F S R ] , % f s r
rdpr % t s t a t e , % g 3
or % g 3 , % g 4 , % g 3 ! a n a l . . .
wrpr % g 3 , % t s t a t e
wr % g 0 , F P R S _ F E F , % f p r s ! c l e a n D U / D L b i t s
retry
.size do_ f p d i s ,. - d o _ f p d i s
.align 32
.type fp_ o t h e r _ b o u n c e ,#f u n c t i o n
fp_other_bounce :
call d o _ f p o t h e r
add % s p , P T R E G S _ O F F , % o 0
2016-04-27 17:27:37 -04:00
ba,a ,p t % x c c , r t r a p
2008-04-28 00:47:20 -07:00
.size fp_ o t h e r _ b o u n c e ,. - f p _ o t h e r _ b o u n c e
.align 32
.globl do_fpother_check_fitos
.type do_ f p o t h e r _ c h e c k _ f i t o s ,#f u n c t i o n
do_fpother_check_fitos :
TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
sethi % h i ( f p _ o t h e r _ b o u n c e - 4 ) , % g 7
or % g 7 , % l o ( f p _ o t h e r _ b o u n c e - 4 ) , % g 7
/ * NOTE : Need t o p r e s e r v e % g 7 u n t i l w e f u l l y c o m m i t
* to t h e f i t o s f i x u p .
* /
stx % f s r , [ % g 6 + T I _ X F S R ]
rdpr % t s t a t e , % g 3
andcc % g 3 , T S T A T E _ P R I V , % g 0
bne,p n % x c c , d o _ f p t r a p _ a f t e r _ f s r
nop
ldx [ % g 6 + T I _ X F S R ] , % g 3
srlx % g 3 , 1 4 , % g 1
and % g 1 , 7 , % g 1
cmp % g 1 , 2 ! U n f i n i s h e d F P - O P
bne,p n % x c c , d o _ f p t r a p _ a f t e r _ f s r
sethi % h i ( 1 < < 2 3 ) , % g 1 ! I n e x a c t
andcc % g 3 , % g 1 , % g 0
bne,p n % x c c , d o _ f p t r a p _ a f t e r _ f s r
rdpr % t p c , % g 1
lduwa [ % g 1 ] A S I _ A I U P , % g 3 ! T h i s c a n n o t e v e r f a i l
# define F I T O S _ M A S K 0 x c1 f83 f e 0
# define F I T O S _ C O M P A R E 0 x81 a01 8 8 0
sethi % h i ( F I T O S _ M A S K ) , % g 1
or % g 1 , % l o ( F I T O S _ M A S K ) , % g 1
and % g 3 , % g 1 , % g 1
sethi % h i ( F I T O S _ C O M P A R E ) , % g 2
or % g 2 , % l o ( F I T O S _ C O M P A R E ) , % g 2
cmp % g 1 , % g 2
bne,p n % x c c , d o _ f p t r a p _ a f t e r _ f s r
nop
std % f62 , [ % g 6 + T I _ F P R E G S + ( 6 2 * 4 ) ]
sethi % h i ( f i t o s _ t a b l e _ 1 ) , % g 1
and % g 3 , 0 x1 f , % g 2
or % g 1 , % l o ( f i t o s _ t a b l e _ 1 ) , % g 1
sllx % g 2 , 2 , % g 2
jmpl % g 1 + % g 2 , % g 0
ba,p t % x c c , f i t o s _ e m u l _ c o n t i n u e
fitos_table_1 :
fitod % f0 , % f62
fitod % f1 , % f62
fitod % f2 , % f62
fitod % f3 , % f62
fitod % f4 , % f62
fitod % f5 , % f62
fitod % f6 , % f62
fitod % f7 , % f62
fitod % f8 , % f62
fitod % f9 , % f62
fitod % f10 , % f62
fitod % f11 , % f62
fitod % f12 , % f62
fitod % f13 , % f62
fitod % f14 , % f62
fitod % f15 , % f62
fitod % f16 , % f62
fitod % f17 , % f62
fitod % f18 , % f62
fitod % f19 , % f62
fitod % f20 , % f62
fitod % f21 , % f62
fitod % f22 , % f62
fitod % f23 , % f62
fitod % f24 , % f62
fitod % f25 , % f62
fitod % f26 , % f62
fitod % f27 , % f62
fitod % f28 , % f62
fitod % f29 , % f62
fitod % f30 , % f62
fitod % f31 , % f62
fitos_emul_continue :
sethi % h i ( f i t o s _ t a b l e _ 2 ) , % g 1
srl % g 3 , 2 5 , % g 2
or % g 1 , % l o ( f i t o s _ t a b l e _ 2 ) , % g 1
and % g 2 , 0 x1 f , % g 2
sllx % g 2 , 2 , % g 2
jmpl % g 1 + % g 2 , % g 0
ba,p t % x c c , f i t o s _ e m u l _ f i n i
fitos_table_2 :
fdtos % f62 , % f0
fdtos % f62 , % f1
fdtos % f62 , % f2
fdtos % f62 , % f3
fdtos % f62 , % f4
fdtos % f62 , % f5
fdtos % f62 , % f6
fdtos % f62 , % f7
fdtos % f62 , % f8
fdtos % f62 , % f9
fdtos % f62 , % f10
fdtos % f62 , % f11
fdtos % f62 , % f12
fdtos % f62 , % f13
fdtos % f62 , % f14
fdtos % f62 , % f15
fdtos % f62 , % f16
fdtos % f62 , % f17
fdtos % f62 , % f18
fdtos % f62 , % f19
fdtos % f62 , % f20
fdtos % f62 , % f21
fdtos % f62 , % f22
fdtos % f62 , % f23
fdtos % f62 , % f24
fdtos % f62 , % f25
fdtos % f62 , % f26
fdtos % f62 , % f27
fdtos % f62 , % f28
fdtos % f62 , % f29
fdtos % f62 , % f30
fdtos % f62 , % f31
fitos_emul_fini :
ldd [ % g 6 + T I _ F P R E G S + ( 6 2 * 4 ) ] , % f62
done
.size do_ f p o t h e r _ c h e c k _ f i t o s ,. - d o _ f p o t h e r _ c h e c k _ f i t o s
.align 32
.globl do_fptrap
.type do_ f p t r a p ,#f u n c t i o n
do_fptrap :
TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
stx % f s r , [ % g 6 + T I _ X F S R ]
do_fptrap_after_fsr :
ldub [ % g 6 + T I _ F P S A V E D ] , % g 3
rd % f p r s , % g 1
or % g 3 , % g 1 , % g 3
stb % g 3 , [ % g 6 + T I _ F P S A V E D ]
rd % g s r , % g 3
stx % g 3 , [ % g 6 + T I _ G S R ]
mov S E C O N D A R Y _ C O N T E X T , % g 3
661 : ldxa [ % g 3 ] A S I _ D M M U , % g 5
.section .sun4v_1insn_patch , " ax"
.word 661b
ldxa [ % g 3 ] A S I _ M M U , % g 5
.previous
sethi % h i ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) , % g 2
ldx [ % g 2 + % l o ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) ] , % g 2
661 : stxa % g 2 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 2 , [ % g 3 ] A S I _ M M U
.previous
membar #S y n c
add % g 6 , T I _ F P R E G S , % g 2
andcc % g 1 , F P R S _ D L , % g 0
be,p n % i c c , 4 f
mov 0 x40 , % g 3
stda % f0 , [ % g 2 ] A S I _ B L K _ S
stda % f16 , [ % g 2 + % g 3 ] A S I _ B L K _ S
andcc % g 1 , F P R S _ D U , % g 0
be,p n % i c c , 5 f
4 : add % g 2 , 1 2 8 , % g 2
stda % f32 , [ % g 2 ] A S I _ B L K _ S
stda % f48 , [ % g 2 + % g 3 ] A S I _ B L K _ S
5 : mov S E C O N D A R Y _ C O N T E X T , % g 1
membar #S y n c
661 : stxa % g 5 , [ % g 1 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 5 , [ % g 1 ] A S I _ M M U
.previous
membar #S y n c
ba,p t % x c c , e t r a p
wr % g 0 , 0 , % f p r s
.size do_ f p t r a p ,. - d o _ f p t r a p