| /* This is trivial with the new code... */ | |
| .globl do_fpdis | |
| .type do_fpdis,#function | |
| do_fpdis: | |
| sethi %hi(TSTATE_PEF), %g4 | |
| rdpr %tstate, %g5 | |
| andcc %g5, %g4, %g0 | |
| be,pt %xcc, 1f | |
| nop | |
| rd %fprs, %g5 | |
| andcc %g5, FPRS_FEF, %g0 | |
| be,pt %xcc, 1f | |
| nop | |
| /* Legal state when DCR_IFPOE is set in Cheetah %dcr. */ | |
| sethi %hi(109f), %g7 | |
| ba,pt %xcc, etrap | |
| 109: or %g7, %lo(109b), %g7 | |
| add %g0, %g0, %g0 | |
| ba,a,pt %xcc, rtrap | |
| 1: TRAP_LOAD_THREAD_REG(%g6, %g1) | |
| ldub [%g6 + TI_FPSAVED], %g5 | |
| wr %g0, FPRS_FEF, %fprs | |
| andcc %g5, FPRS_FEF, %g0 | |
| be,a,pt %icc, 1f | |
| clr %g7 | |
| ldx [%g6 + TI_GSR], %g7 | |
| 1: andcc %g5, FPRS_DL, %g0 | |
| bne,pn %icc, 2f | |
| fzero %f0 | |
| andcc %g5, FPRS_DU, %g0 | |
| bne,pn %icc, 1f | |
| 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,pt %xcc, fpdis_exit2 | |
| faddd %f0, %f2, %f60 | |
| 1: mov SECONDARY_CONTEXT, %g3 | |
| add %g6, TI_FPREGS + 0x80, %g1 | |
| faddd %f0, %f2, %f4 | |
| fmuld %f0, %f2, %f6 | |
| 661: ldxa [%g3] ASI_DMMU, %g5 | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| ldxa [%g3] ASI_MMU, %g5 | |
| .previous | |
| sethi %hi(sparc64_kern_sec_context), %g2 | |
| ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2 | |
| 661: stxa %g2, [%g3] ASI_DMMU | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| stxa %g2, [%g3] ASI_MMU | |
| .previous | |
| membar #Sync | |
| add %g6, TI_FPREGS + 0xc0, %g2 | |
| faddd %f0, %f2, %f8 | |
| fmuld %f0, %f2, %f10 | |
| membar #Sync | |
| ldda [%g1] ASI_BLK_S, %f32 | |
| ldda [%g2] ASI_BLK_S, %f48 | |
| membar #Sync | |
| 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 | |
| b,pt %xcc, fpdis_exit | |
| nop | |
| 2: andcc %g5, FPRS_DU, %g0 | |
| bne,pt %icc, 3f | |
| fzero %f32 | |
| mov SECONDARY_CONTEXT, %g3 | |
| fzero %f34 | |
| 661: ldxa [%g3] ASI_DMMU, %g5 | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| ldxa [%g3] ASI_MMU, %g5 | |
| .previous | |
| add %g6, TI_FPREGS, %g1 | |
| sethi %hi(sparc64_kern_sec_context), %g2 | |
| ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2 | |
| 661: stxa %g2, [%g3] ASI_DMMU | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| stxa %g2, [%g3] ASI_MMU | |
| .previous | |
| membar #Sync | |
| add %g6, TI_FPREGS + 0x40, %g2 | |
| faddd %f32, %f34, %f36 | |
| fmuld %f32, %f34, %f38 | |
| membar #Sync | |
| ldda [%g1] ASI_BLK_S, %f0 | |
| ldda [%g2] ASI_BLK_S, %f16 | |
| membar #Sync | |
| 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 | |
| ba,pt %xcc, fpdis_exit | |
| nop | |
| 3: mov SECONDARY_CONTEXT, %g3 | |
| add %g6, TI_FPREGS, %g1 | |
| 661: ldxa [%g3] ASI_DMMU, %g5 | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| ldxa [%g3] ASI_MMU, %g5 | |
| .previous | |
| sethi %hi(sparc64_kern_sec_context), %g2 | |
| ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2 | |
| 661: stxa %g2, [%g3] ASI_DMMU | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| stxa %g2, [%g3] ASI_MMU | |
| .previous | |
| membar #Sync | |
| mov 0x40, %g2 | |
| membar #Sync | |
| ldda [%g1] ASI_BLK_S, %f0 | |
| ldda [%g1 + %g2] ASI_BLK_S, %f16 | |
| add %g1, 0x80, %g1 | |
| ldda [%g1] ASI_BLK_S, %f32 | |
| ldda [%g1 + %g2] ASI_BLK_S, %f48 | |
| membar #Sync | |
| fpdis_exit: | |
| 661: stxa %g5, [%g3] ASI_DMMU | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| stxa %g5, [%g3] ASI_MMU | |
| .previous | |
| membar #Sync | |
| fpdis_exit2: | |
| wr %g7, 0, %gsr | |
| ldx [%g6 + TI_XFSR], %fsr | |
| rdpr %tstate, %g3 | |
| or %g3, %g4, %g3 ! anal... | |
| wrpr %g3, %tstate | |
| wr %g0, FPRS_FEF, %fprs ! clean DU/DL bits | |
| retry | |
| .size do_fpdis,.-do_fpdis | |
| .align 32 | |
| .type fp_other_bounce,#function | |
| fp_other_bounce: | |
| call do_fpother | |
| add %sp, PTREGS_OFF, %o0 | |
| ba,pt %xcc, rtrap | |
| nop | |
| .size fp_other_bounce,.-fp_other_bounce | |
| .align 32 | |
| .globl do_fpother_check_fitos | |
| .type do_fpother_check_fitos,#function | |
| do_fpother_check_fitos: | |
| TRAP_LOAD_THREAD_REG(%g6, %g1) | |
| sethi %hi(fp_other_bounce - 4), %g7 | |
| or %g7, %lo(fp_other_bounce - 4), %g7 | |
| /* NOTE: Need to preserve %g7 until we fully commit | |
| * to the fitos fixup. | |
| */ | |
| stx %fsr, [%g6 + TI_XFSR] | |
| rdpr %tstate, %g3 | |
| andcc %g3, TSTATE_PRIV, %g0 | |
| bne,pn %xcc, do_fptrap_after_fsr | |
| nop | |
| ldx [%g6 + TI_XFSR], %g3 | |
| srlx %g3, 14, %g1 | |
| and %g1, 7, %g1 | |
| cmp %g1, 2 ! Unfinished FP-OP | |
| bne,pn %xcc, do_fptrap_after_fsr | |
| sethi %hi(1 << 23), %g1 ! Inexact | |
| andcc %g3, %g1, %g0 | |
| bne,pn %xcc, do_fptrap_after_fsr | |
| rdpr %tpc, %g1 | |
| lduwa [%g1] ASI_AIUP, %g3 ! This cannot ever fail | |
| #define FITOS_MASK 0xc1f83fe0 | |
| #define FITOS_COMPARE 0x81a01880 | |
| sethi %hi(FITOS_MASK), %g1 | |
| or %g1, %lo(FITOS_MASK), %g1 | |
| and %g3, %g1, %g1 | |
| sethi %hi(FITOS_COMPARE), %g2 | |
| or %g2, %lo(FITOS_COMPARE), %g2 | |
| cmp %g1, %g2 | |
| bne,pn %xcc, do_fptrap_after_fsr | |
| nop | |
| std %f62, [%g6 + TI_FPREGS + (62 * 4)] | |
| sethi %hi(fitos_table_1), %g1 | |
| and %g3, 0x1f, %g2 | |
| or %g1, %lo(fitos_table_1), %g1 | |
| sllx %g2, 2, %g2 | |
| jmpl %g1 + %g2, %g0 | |
| ba,pt %xcc, fitos_emul_continue | |
| 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 %hi(fitos_table_2), %g1 | |
| srl %g3, 25, %g2 | |
| or %g1, %lo(fitos_table_2), %g1 | |
| and %g2, 0x1f, %g2 | |
| sllx %g2, 2, %g2 | |
| jmpl %g1 + %g2, %g0 | |
| ba,pt %xcc, fitos_emul_fini | |
| 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 [%g6 + TI_FPREGS + (62 * 4)], %f62 | |
| done | |
| .size do_fpother_check_fitos,.-do_fpother_check_fitos | |
| .align 32 | |
| .globl do_fptrap | |
| .type do_fptrap,#function | |
| do_fptrap: | |
| TRAP_LOAD_THREAD_REG(%g6, %g1) | |
| stx %fsr, [%g6 + TI_XFSR] | |
| do_fptrap_after_fsr: | |
| ldub [%g6 + TI_FPSAVED], %g3 | |
| rd %fprs, %g1 | |
| or %g3, %g1, %g3 | |
| stb %g3, [%g6 + TI_FPSAVED] | |
| rd %gsr, %g3 | |
| stx %g3, [%g6 + TI_GSR] | |
| mov SECONDARY_CONTEXT, %g3 | |
| 661: ldxa [%g3] ASI_DMMU, %g5 | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| ldxa [%g3] ASI_MMU, %g5 | |
| .previous | |
| sethi %hi(sparc64_kern_sec_context), %g2 | |
| ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2 | |
| 661: stxa %g2, [%g3] ASI_DMMU | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| stxa %g2, [%g3] ASI_MMU | |
| .previous | |
| membar #Sync | |
| add %g6, TI_FPREGS, %g2 | |
| andcc %g1, FPRS_DL, %g0 | |
| be,pn %icc, 4f | |
| mov 0x40, %g3 | |
| stda %f0, [%g2] ASI_BLK_S | |
| stda %f16, [%g2 + %g3] ASI_BLK_S | |
| andcc %g1, FPRS_DU, %g0 | |
| be,pn %icc, 5f | |
| 4: add %g2, 128, %g2 | |
| stda %f32, [%g2] ASI_BLK_S | |
| stda %f48, [%g2 + %g3] ASI_BLK_S | |
| 5: mov SECONDARY_CONTEXT, %g1 | |
| membar #Sync | |
| 661: stxa %g5, [%g1] ASI_DMMU | |
| .section .sun4v_1insn_patch, "ax" | |
| .word 661b | |
| stxa %g5, [%g1] ASI_MMU | |
| .previous | |
| membar #Sync | |
| ba,pt %xcc, etrap | |
| wr %g0, 0, %fprs | |
| .size do_fptrap,.-do_fptrap |