trunk/src/emu/cpu/mips/mips3drc.c
| r245144 | r245145 | |
| 2054 | 2054 | return TRUE; |
| 2055 | 2055 | |
| 2056 | 2056 | case 0x1a: /* DIV - MIPS I */ |
| 2057 | | UML_DIVS(block, I0, I1, R32(RSREG), R32(RTREG)); // divs i0,i1,<rsreg>,<rtreg> |
| 2058 | | UML_DSEXT(block, LO64, I0, SIZE_DWORD); // dsext lo,i0,dword |
| 2059 | | UML_DSEXT(block, HI64, I1, SIZE_DWORD); // dsext hi,i1,dword |
| 2057 | { |
| 2058 | if (m_drcoptions & MIPS3DRC_ACCURATE_DIVZERO) |
| 2059 | { |
| 2060 | code_label divzero, done; |
| 2061 | |
| 2062 | UML_CMP(block, R32(RTREG), 0); // cmp <rtreg>, 0 |
| 2063 | UML_JMPc(block, COND_E, divzero = compiler->labelnum++); // jmp divzero,E |
| 2064 | |
| 2065 | UML_DIVS(block, I0, I1, R32(RSREG), R32(RTREG)); // divs i0,i1,<rsreg>,<rtreg> |
| 2066 | UML_DSEXT(block, LO64, I0, SIZE_DWORD); // dsext lo,i0,dword |
| 2067 | UML_DSEXT(block, HI64, I1, SIZE_DWORD); // dsext hi,i1,dword |
| 2068 | UML_JMP(block, done = compiler->labelnum++); // jmp done |
| 2069 | |
| 2070 | UML_LABEL(block, divzero); // divzero: |
| 2071 | if (m_flavor != MIPS3_TYPE_VR4300) |
| 2072 | { |
| 2073 | UML_MOVc(block, COND_L, I0, 0x00000001); // mov i0,0x00000001,L |
| 2074 | UML_MOVc(block, COND_GE, I0, 0xffffffff); // mov i0,0xffffffff,GE |
| 2075 | } |
| 2076 | else |
| 2077 | { |
| 2078 | UML_MOVc(block, COND_L, I0, 0x80000001); // mov i0,0x80000001,L |
| 2079 | UML_MOVc(block, COND_GE, I0, 0x7fffffff); // mov i0,0x7fffffff,GE |
| 2080 | } |
| 2081 | UML_DSEXT(block, HI64, R32(RSREG), SIZE_DWORD); // dsext hi,<rsreg>,dword |
| 2082 | UML_DSEXT(block, LO64, I0, SIZE_DWORD); // dsext lo,i0,dword |
| 2083 | |
| 2084 | UML_LABEL(block, done); // done: |
| 2085 | } |
| 2086 | else |
| 2087 | { |
| 2088 | UML_DIVS(block, I0, I1, R32(RSREG), R32(RTREG)); // divs i0,i1,<rsreg>,<rtreg> |
| 2089 | UML_DSEXT(block, LO64, I0, SIZE_DWORD); // dsext lo,i0,dword |
| 2090 | UML_DSEXT(block, HI64, I1, SIZE_DWORD); // dsext hi,i1,dword |
| 2091 | } |
| 2060 | 2092 | return TRUE; |
| 2093 | } |
| 2061 | 2094 | |
| 2062 | 2095 | case 0x1b: /* DIVU - MIPS I */ |
| 2063 | | UML_DIVU(block, I0, I1, R32(RSREG), R32(RTREG)); // divu i0,i1,<rsreg>,<rtreg> |
| 2064 | | UML_DSEXT(block, LO64, I0, SIZE_DWORD); // dsext lo,i0,dword |
| 2065 | | UML_DSEXT(block, HI64, I1, SIZE_DWORD); // dsext hi,i1,dword |
| 2096 | if (m_drcoptions & MIPS3DRC_ACCURATE_DIVZERO) |
| 2097 | { |
| 2098 | code_label divzero, done; |
| 2099 | |
| 2100 | UML_CMP(block, R32(RTREG), 0); // cmp <rtreg>, 0 |
| 2101 | UML_JMPc(block, COND_E, divzero = compiler->labelnum++); // jmp divzero,E |
| 2102 | |
| 2103 | UML_DIVU(block, I0, I1, R32(RSREG), R32(RTREG)); // divu i0,i1,<rsreg>,<rtreg> |
| 2104 | UML_DSEXT(block, LO64, I0, SIZE_DWORD); // dsext lo,i0,dword |
| 2105 | UML_DSEXT(block, HI64, I1, SIZE_DWORD); // dsext hi,i1,dword |
| 2106 | UML_JMP(block, done = compiler->labelnum++); // jmp done |
| 2107 | |
| 2108 | UML_LABEL(block, divzero); // divzero: |
| 2109 | if (m_flavor != MIPS3_TYPE_VR4300) |
| 2110 | { |
| 2111 | UML_MOVc(block, COND_L, I0, 0x00000001); // mov i0,0x00000001,L |
| 2112 | UML_MOVc(block, COND_GE, I0, 0xffffffff); // mov i0,0xffffffff,GE |
| 2113 | } |
| 2114 | else |
| 2115 | { |
| 2116 | UML_MOVc(block, COND_L, I0, 0x80000001); // mov i0,0x80000001,L |
| 2117 | UML_MOVc(block, COND_GE, I0, 0x7fffffff); // mov i0,0x7fffffff,GE |
| 2118 | } |
| 2119 | UML_DSEXT(block, HI64, R32(RSREG), SIZE_DWORD); // dsext hi,<rsreg>,dword |
| 2120 | UML_DSEXT(block, LO64, I0, SIZE_DWORD); // dsext lo,i0,dword |
| 2121 | |
| 2122 | UML_LABEL(block, done); // done: |
| 2123 | } |
| 2124 | else |
| 2125 | { |
| 2126 | UML_DIVU(block, I0, I1, R32(RSREG), R32(RTREG)); // divu i0,i1,<rsreg>,<rtreg> |
| 2127 | UML_DSEXT(block, LO64, I0, SIZE_DWORD); // dsext lo,i0,dword |
| 2128 | UML_DSEXT(block, HI64, I1, SIZE_DWORD); // dsext hi,i1,dword |
| 2129 | } |
| 2066 | 2130 | return TRUE; |
| 2067 | 2131 | |
| 2068 | 2132 | case 0x1e: /* DDIV - MIPS III */ |