Module Name: src Committed By: matt Date: Wed Dec 29 00:49:40 UTC 2010
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: fp.S Log Message: Move away from StudlyCaps and switch to the new names. Remove branch delay slot emulation to a different file. To generate a diff of this commit: cvs rdiff -u -r1.33.38.11 -r1.33.38.12 src/sys/arch/mips/mips/fp.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/mips/fp.S diff -u src/sys/arch/mips/mips/fp.S:1.33.38.11 src/sys/arch/mips/mips/fp.S:1.33.38.12 --- src/sys/arch/mips/mips/fp.S:1.33.38.11 Tue May 11 20:54:27 2010 +++ src/sys/arch/mips/mips/fp.S Wed Dec 29 00:49:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: fp.S,v 1.33.38.11 2010/05/11 20:54:27 matt Exp $ */ +/* $NetBSD: fp.S,v 1.33.38.12 2010/12/29 00:49:39 matt Exp $ */ /* * Copyright (c) 1992, 1993 @@ -100,12 +100,12 @@ /*---------------------------------------------------------------------------- * - * MachEmulateFP -- + * mips_emul_fp -- * * Emulate unimplemented floating point operations. - * This routine should only be called by MachFPInterrupt(). + * This routine should only be called by mips_fpu_intr(). * - * MachEmulateFP(uint32_t instr, struct frame *frame, uint32_t cause) + * mips_emul_fp(uint32_t instr, struct trapframe *tf, uint32_t cause) * * Results: * None. @@ -126,7 +126,7 @@ #error N32/N64 ABI callframe error #endif #endif -NESTED(MachEmulateFP, CALLFRAME_SIZ, ra) +NESTED(mips_emul_fp, CALLFRAME_SIZ, ra) PTR_SUBU sp, CALLFRAME_SIZ REG_S ra, CALLFRAME_RA(sp) REG_S a1, CALLFRAME_FRAME(sp) @@ -844,7 +844,7 @@ REG_L a0, TF_REG_EPC(a1) REG_EPILOGUE PTR_ADDU a0, 4 - jal _C_LABEL(fuiword) + jal _C_LABEL(ufetch_uint32) move a0, v0 REG_L a1, CALLFRAME_FRAME(sp) @@ -854,11 +854,11 @@ li t0, MIPS_CR_BR_DELAY or a2, a2, t0 - /* Free MachEmulateFP call frame */ + /* Free mips_emul_fp call frame */ REG_L ra, CALLFRAME_RA(sp) PTR_ADDU sp, CALLFRAME_SIZ - j _C_LABEL(bcemul_delay_slot) + j _C_LABEL(mips_emul_branchdelayslot) #endif /* @@ -2900,7 +2900,7 @@ move a1, v0 # 2nd arg is instruction PC # 3rd arg is FP CSR move a3, zero # 4th arg is FALSE - jal _C_LABEL(MachEmulateBranch) # compute PC after branch + jal _C_LABEL(mips_emul_branch) # compute PC after branch REG_L a1, CALLFRAME_FRAME(sp) b 2f @@ -2918,13 +2918,13 @@ REG_L ra, CALLFRAME_RA(sp) PTR_ADDU sp, CALLFRAME_SIZ j ra -END(MachEmulateFP) +END(mips_emul_fp) /*---------------------------------------------------------------------------- * get_fs_int -- * * Read (integer) the FS register (bits 15-11). - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Results: * t0 contains the sign @@ -3033,7 +3033,7 @@ * * Read (single precision) the FT register (bits 20-16) and * the FS register (bits 15-11) and break up into fields. - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Results: * t0 contains the FS sign @@ -3153,7 +3153,7 @@ * * Read (single precision) the FS register (bits 15-11) and * break up into fields. - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Results: * t0 contains the sign @@ -3271,7 +3271,7 @@ * * Read (double precision) the FT register (bits 20-16) and * the FS register (bits 15-11) and break up into fields. - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Results: * t0 contains the FS sign @@ -3416,7 +3416,7 @@ * * Read (double precision) the FS register (bits 15-11) and * break up into fields. - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Results: * t0 contains the sign @@ -3558,7 +3558,7 @@ * * Read (single precision) the FS register (bits 15-11) and * the FT register (bits 20-16) and break up into fields. - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Results: * t0 contains the sign @@ -3760,7 +3760,7 @@ * * Read (double precision) the FS register (bits 15-11) and * the FT register (bits 20-16) and break up into fields. - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Results: * t0 contains the sign @@ -4009,7 +4009,7 @@ * set_fd_s -- * * Write (single precision) the FD register (bits 10-6). - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Arguments: * a0 contains the FP instruction @@ -4020,7 +4020,7 @@ * set_fd_word -- * * Write (integer) the FD register (bits 10-6). - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Arguments: * a0 contains the FP instruction @@ -4123,7 +4123,7 @@ * set_fd_d -- * * Write (double precision) the FT register (bits 10-6). - * This is an internal routine used by MachEmulateFP only. + * This is an internal routine used by mips_emul_fp only. * * Arguments: * a0 contains the FP instruction @@ -4552,782 +4552,11 @@ #endif /* __mips_o32 */ END(renorm_ft_d) -#ifdef FPEMUL -/* - * Emulate branch delay slot CPU instruction. - * Enter from BC1x emulation. - * These instructions are not implemented and causes SIGILL. - * jump/branch - * COP0 - * 64bit operation - * trap/syscall/break - * - * Args are same as MachEmulateFP. - * It should be used to emulate instruction in branch delay slot. - */ -STATIC_LEAF(bcemul_delay_slot) - REG_PROLOGUE - REG_S zero, TF_REG_ZERO(a1) # ensure zero has value 0 - REG_EPILOGUE - - srl t0, a0, 26-PTR_SCALESHIFT - andi t0, t0, 0x3F << PTR_SCALESHIFT - PTR_L t0, bcemul_optbl(t0) - j t0 - -bcemul_special: - sll t0, a0, PTR_SCALESHIFT - andi t0, t0, 0x3F << PTR_SCALESHIFT - PTR_L t0, bcemul_specialtbl(t0) - j t0 - - .rdata -bcemul_optbl: - PTR_WORD bcemul_special # 0 - PTR_WORD _C_LABEL(bcemul_sigill) # 1 - PTR_WORD _C_LABEL(bcemul_sigill) # 2 - PTR_WORD _C_LABEL(bcemul_sigill) # 3 - PTR_WORD _C_LABEL(bcemul_sigill) # 4 - PTR_WORD _C_LABEL(bcemul_sigill) # 5 - PTR_WORD _C_LABEL(bcemul_sigill) # 6 - PTR_WORD _C_LABEL(bcemul_sigill) # 7 - PTR_WORD bcemul_addi # 8 - PTR_WORD bcemul_addiu # 9 - PTR_WORD bcemul_slti # 10 - PTR_WORD bcemul_sltiu # 11 - PTR_WORD bcemul_andi # 12 - PTR_WORD bcemul_ori # 13 - PTR_WORD bcemul_xori # 14 - PTR_WORD bcemul_lui # 15 - PTR_WORD _C_LABEL(bcemul_sigill) # 16 - PTR_WORD _C_LABEL(MachEmulateFP) # 17 - PTR_WORD _C_LABEL(bcemul_sigill) # 18 - PTR_WORD _C_LABEL(bcemul_sigill) # 19 /* COP1X */ - PTR_WORD _C_LABEL(bcemul_sigill) # 20 - PTR_WORD _C_LABEL(bcemul_sigill) # 21 - PTR_WORD _C_LABEL(bcemul_sigill) # 22 - PTR_WORD _C_LABEL(bcemul_sigill) # 23 - PTR_WORD _C_LABEL(bcemul_sigill) # 24 DADDI - PTR_WORD _C_LABEL(bcemul_sigill) # 25 DADDIU - PTR_WORD _C_LABEL(bcemul_sigill) # 26 - PTR_WORD _C_LABEL(bcemul_sigill) # 27 - PTR_WORD _C_LABEL(bcemul_sigill) # 28 - PTR_WORD _C_LABEL(bcemul_sigill) # 29 - PTR_WORD _C_LABEL(bcemul_sigill) # 30 - PTR_WORD _C_LABEL(bcemul_sigill) # 31 - PTR_WORD _C_LABEL(bcemul_lb) # 32 - PTR_WORD _C_LABEL(bcemul_lh) # 33 - PTR_WORD _C_LABEL(bcemul_lwl) # 34 - PTR_WORD _C_LABEL(bcemul_lw) # 35 - PTR_WORD _C_LABEL(bcemul_lbu) # 36 - PTR_WORD _C_LABEL(bcemul_lhu) # 37 - PTR_WORD _C_LABEL(bcemul_lwr) # 38 - PTR_WORD _C_LABEL(bcemul_sigill) # 39 - PTR_WORD _C_LABEL(bcemul_sb) # 40 - PTR_WORD _C_LABEL(bcemul_sh) # 41 - PTR_WORD _C_LABEL(bcemul_swl) # 42 - PTR_WORD _C_LABEL(bcemul_sw) # 43 - PTR_WORD _C_LABEL(bcemul_sigill) # 44 - PTR_WORD _C_LABEL(bcemul_sigill) # 45 - PTR_WORD _C_LABEL(bcemul_swr) # 46 SWR - PTR_WORD _C_LABEL(bcemul_sigill) # 47 - PTR_WORD _C_LABEL(bcemul_sigill) # 48 - PTR_WORD _C_LABEL(MachEmulateLWC1) # 49 - PTR_WORD _C_LABEL(bcemul_sigill) # 50 - PTR_WORD _C_LABEL(bcemul_sigill) # 51 - PTR_WORD _C_LABEL(bcemul_sigill) # 52 - PTR_WORD _C_LABEL(MachEmulateLDC1) # 53 - PTR_WORD _C_LABEL(bcemul_sigill) # 54 - PTR_WORD _C_LABEL(bcemul_sigill) # 55 LD - PTR_WORD _C_LABEL(bcemul_sigill) # 56 - PTR_WORD _C_LABEL(MachEmulateSWC1) # 57 - PTR_WORD _C_LABEL(bcemul_sigill) # 58 - PTR_WORD _C_LABEL(bcemul_sigill) # 59 - PTR_WORD _C_LABEL(bcemul_sigill) # 60 - PTR_WORD _C_LABEL(MachEmulateSDC1) # 61 - PTR_WORD _C_LABEL(bcemul_sigill) # 62 - PTR_WORD _C_LABEL(bcemul_sigill) # 63 SD - -bcemul_specialtbl: - PTR_WORD bcemul_sll # 0 - PTR_WORD _C_LABEL(bcemul_sigill) # 1 - PTR_WORD bcemul_srl # 2 - PTR_WORD bcemul_sra # 3 - PTR_WORD bcemul_sllv # 4 - PTR_WORD _C_LABEL(bcemul_sigill) # 5 - PTR_WORD bcemul_srlv # 6 - PTR_WORD bcemul_srav # 7 - PTR_WORD _C_LABEL(bcemul_sigill) # 8 - PTR_WORD _C_LABEL(bcemul_sigill) # 9 - PTR_WORD _C_LABEL(bcemul_sigill) # 10 - PTR_WORD _C_LABEL(bcemul_sigill) # 11 - PTR_WORD _C_LABEL(bcemul_sigill) # 12 - PTR_WORD _C_LABEL(bcemul_sigill) # 13 - PTR_WORD _C_LABEL(bcemul_sigill) # 14 - PTR_WORD bcemul_sync # 15 - PTR_WORD bcemul_mfhi # 16 - PTR_WORD bcemul_mthi # 17 - PTR_WORD bcemul_mflo # 18 - PTR_WORD bcemul_mtlo # 19 - PTR_WORD _C_LABEL(bcemul_sigill) # 20 - PTR_WORD _C_LABEL(bcemul_sigill) # 21 - PTR_WORD _C_LABEL(bcemul_sigill) # 22 - PTR_WORD _C_LABEL(bcemul_sigill) # 23 - PTR_WORD bcemul_mult # 24 - PTR_WORD bcemul_multu # 25 - PTR_WORD bcemul_div # 26 - PTR_WORD bcemul_divu # 27 - PTR_WORD _C_LABEL(bcemul_sigill) # 28 - PTR_WORD _C_LABEL(bcemul_sigill) # 29 - PTR_WORD _C_LABEL(bcemul_sigill) # 30 - PTR_WORD _C_LABEL(bcemul_sigill) # 31 - PTR_WORD bcemul_add # 32 - PTR_WORD bcemul_addu # 33 - PTR_WORD bcemul_sub # 34 - PTR_WORD bcemul_subu # 35 - PTR_WORD bcemul_and # 36 - PTR_WORD bcemul_or # 37 - PTR_WORD bcemul_xor # 38 - PTR_WORD bcemul_nor # 39 - PTR_WORD _C_LABEL(bcemul_sigill) # 40 - PTR_WORD _C_LABEL(bcemul_sigill) # 41 - PTR_WORD bcemul_slt # 42 - PTR_WORD bcemul_sltu # 43 - PTR_WORD _C_LABEL(bcemul_sigill) # 44 - PTR_WORD _C_LABEL(bcemul_sigill) # 45 - PTR_WORD _C_LABEL(bcemul_sigill) # 46 - PTR_WORD _C_LABEL(bcemul_sigill) # 47 - PTR_WORD _C_LABEL(bcemul_sigill) # 48 - PTR_WORD _C_LABEL(bcemul_sigill) # 49 - PTR_WORD _C_LABEL(bcemul_sigill) # 50 - PTR_WORD _C_LABEL(bcemul_sigill) # 51 - PTR_WORD _C_LABEL(bcemul_sigill) # 52 - PTR_WORD _C_LABEL(bcemul_sigill) # 53 - PTR_WORD _C_LABEL(bcemul_sigill) # 54 - PTR_WORD _C_LABEL(bcemul_sigill) # 55 - PTR_WORD _C_LABEL(bcemul_sigill) # 56 - PTR_WORD _C_LABEL(bcemul_sigill) # 57 - PTR_WORD _C_LABEL(bcemul_sigill) # 58 - PTR_WORD _C_LABEL(bcemul_sigill) # 59 - PTR_WORD _C_LABEL(bcemul_sigill) # 60 - PTR_WORD _C_LABEL(bcemul_sigill) # 61 - PTR_WORD _C_LABEL(bcemul_sigill) # 62 - PTR_WORD _C_LABEL(bcemul_sigill) # 63 - - .text - -bcemul_addi: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - sll t2, a0, 16 - sra t2, t2, 16 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_EPILOGUE - addu t0, v0, t2 - - /* Overflow check */ - xor t2, v0, t2 - srl t2, t2, 31 - bne t2, zero, addiok - - xor v0, v0, t0 - srl v0, v0, 31 - beq v0, zero, addiok - - j _C_LABEL(bcemul_sigfpe) - -addiok: - REG_PROLOGUE - REG_S t0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_addiu: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - sll t2, a0, 16 - sra t2, t2, 16 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - addu v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_slti: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - sll t2, a0, 16 - sra t2, t2, 16 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - slt v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_sltiu: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - sll t2, a0, 16 - sra t2, t2, 16 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - sltu v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_andi: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - andi t2, a0, 0xFFFF - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - and v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_ori: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - andi t2, a0, 0xFFFF - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - or v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_xori: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - andi t2, a0, 0xFFFF - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - xor v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_lui: - srl t0, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - PTR_ADDU t0, a1, t0 - sll v0, a0, 16 - REG_PROLOGUE - REG_S v0, TF_REG_ZERO(t0) - REG_EPILOGUE - b bcemul_done - -bcemul_sll: - srl t0, a0, 16-REG_SCALESHIFT # rt - srl t1, a0, 11-REG_SCALESHIFT # rd - srl t2, a0, 6 # sa - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, 0x001F - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - sllv v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_srl: - srl t0, a0, 16-REG_SCALESHIFT # rt - srl t1, a0, 11-REG_SCALESHIFT # rd - srl t2, a0, 6 # sa - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, 0x001F - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - srlv v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_sra: - srl t0, a0, 16-REG_SCALESHIFT # rt - srl t1, a0, 11-REG_SCALESHIFT # rd - srl t2, a0, 6 # sa - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, 0x001F - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - srav v0, v0, t2 - REG_S v0, TF_REG_ZERO(t1) - REG_EPILOGUE - b bcemul_done - -bcemul_sllv: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - sllv v0, v1, v0 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_srlv: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - srlv v0, v1, v0 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_srav: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - srav v0, v1, v0 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_sync: - b bcemul_done - -bcemul_mfhi: - srl t0, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - PTR_ADDU t0, a1, t0 - REG_PROLOGUE - REG_L v0, TF_REG_MULHI(a1) - REG_S v0, TF_REG_ZERO(t0) - REG_EPILOGUE - b bcemul_done - -bcemul_mthi: - srl t0, a0, 21-REG_SCALESHIFT # rs - andi t0, t0, REG_REGMASK - PTR_ADDU t0, a1, t0 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_S v0, TF_REG_MULHI(a1) - REG_EPILOGUE - b bcemul_done - -bcemul_mflo: - srl t0, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - PTR_ADDU t0, a1, t0 - REG_PROLOGUE - REG_L v0, TF_REG_MULLO(a1) - REG_S v0, TF_REG_ZERO(t0) - REG_EPILOGUE - b bcemul_done - -bcemul_mtlo: - srl t0, a0, 21-REG_SCALESHIFT # rs - andi t0, t0, REG_REGMASK - PTR_ADDU t0, a1, t0 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_S v0, TF_REG_MULLO(a1) - REG_EPILOGUE - b bcemul_done - -bcemul_mult: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - REG_EPILOGUE - mult v0, v1 - mflo v0 - mfhi v1 - REG_PROLOGUE - REG_S v0, TF_REG_MULLO(a1) - REG_S v1, TF_REG_MULHI(a1) - REG_EPILOGUE - b bcemul_done - -bcemul_multu: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - REG_EPILOGUE - multu v0, v1 - mflo v0 - mfhi v1 - REG_PROLOGUE - REG_S v0, TF_REG_MULLO(a1) - REG_S v1, TF_REG_MULHI(a1) - REG_EPILOGUE - b bcemul_done - -bcemul_div: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - REG_EPILOGUE - div v0, v1 - mflo v0 - mfhi v1 - REG_PROLOGUE - REG_S v0, TF_REG_MULLO(a1) - REG_S v1, TF_REG_MULHI(a1) - REG_EPILOGUE - b bcemul_done - -bcemul_divu: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - REG_EPILOGUE - divu v0, v1 - mflo v0 - mfhi v1 - REG_PROLOGUE - REG_S v0, TF_REG_MULLO(a1) - REG_S v1, TF_REG_MULHI(a1) - REG_EPILOGUE - b bcemul_done - -bcemul_add: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - REG_EPILOGUE - addu t0, v0, v1 - - /* Overflow check */ - xor v1, v0, v1 - srl v1, v1, 31 - bne v1, zero, addok - - xor v0, v0, t0 - srl v0, v0, 31 - beq v0, zero, addok - - j _C_LABEL(bcemul_sigfpe) - -addok: - REG_PROLOGUE - REG_S t0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_addu: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - addu v0, v0, v1 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_sub: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - REG_EPILOGUE - subu t0, v0, v1 - - /* Overflow check */ - xor v1, v0, v1 - srl v1, v1, 31 - beq v1, zero, subok - - xor v0, v0, t0 - srl v0, v0, 31 - beq v0, zero, subok - - j _C_LABEL(bcemul_sigfpe) - -subok: - REG_PROLOGUE - REG_S t0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_subu: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - subu v0, v0, v1 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_and: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - and v0, v0, v1 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_or: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - or v0, v0, v1 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_xor: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - xor v0, v0, v1 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_nor: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - nor v0, v0, v1 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_slt: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - slt v0, v0, v1 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE - b bcemul_done - -bcemul_sltu: - srl t0, a0, 21-REG_SCALESHIFT # rs - srl t1, a0, 16-REG_SCALESHIFT # rt - srl t2, a0, 11-REG_SCALESHIFT # rd - andi t0, t0, REG_REGMASK - andi t1, t1, REG_REGMASK - andi t2, t2, REG_REGMASK - PTR_ADDU t0, a1, t0 - PTR_ADDU t1, a1, t1 - PTR_ADDU t2, a1, t2 - REG_PROLOGUE - REG_L v0, TF_REG_ZERO(t0) - REG_L v1, TF_REG_ZERO(t1) - sltu v0, v0, v1 - REG_S v0, TF_REG_ZERO(t2) - REG_EPILOGUE -# b bcemul_done # fall through to bcemul_done - -bcemul_done: -/* - * Succeeded to emulate instruction with no error - * so compute the next PC. - */ - PTR_SUBU sp, CALLFRAME_SIZ - REG_S ra, CALLFRAME_RA(sp) - REG_S a1, CALLFRAME_FRAME(sp) - - /* Fetch previous branch instruction */ - REG_PROLOGUE - REG_L a0, TF_REG_EPC(a1) - REG_EPILOGUE - jal _C_LABEL(fuiword) - - REG_L a1, CALLFRAME_FRAME(sp) - - /* Calculate branch destination */ - sll t0, v0, 16 - sra t0, t0, 16-2 - REG_PROLOGUE - REG_L t1, TF_REG_EPC(a1) - PTR_ADDU t0, t0, 4 - PTR_ADDU t1, t0 - REG_S t1, TF_REG_EPC(a1) - REG_EPILOGUE - - REG_L ra, CALLFRAME_RA(sp) - PTR_ADDU sp, CALLFRAME_SIZ - j ra - -END(bcemul_delay_slot) - -#endif - /* * Send SIGILL, SIGFPE. - * Args are same as MachEmulateFP. + * Args are same as mips_emul_fp. */ STATIC_LEAF(fpemul_sigill) -#ifdef FPEMUL -STATIC_XLEAF(bcemul_sigill) -#endif li t0, 0xFFFFFF00 and a2, a2, t0 ori a2, a2, T_RES_INST << MIPS_CR_EXC_CODE_SHIFT @@ -5356,7 +4585,7 @@ END(fpemul_sigfpe) #ifdef FPEMUL -STATIC_LEAF(bcemul_sigfpe) +STATIC_LEAF(mips_emul_sigfpe) li t0, 0xFFFFFF00 and a2, a2, t0 ori a2, a2, T_OVFLOW << MIPS_CR_EXC_CODE_SHIFT @@ -5368,5 +4597,5 @@ move a0, MIPS_CURLWP # get current process li a1, SIGFPE j _C_LABEL(fpemul_trapsignal) -END(bcemul_sigfpe) +END(mips_emul_sigfpe) #endif