src/emu/cpu/powerpc/ppcdrc.c
| r14750 | r14751 | |
| 2237 | 2237 | { |
| 2238 | 2238 | UML_GETFLGS(block, I0, FLAG_S | FLAG_Z); // getflgs i0,sz |
| 2239 | 2239 | UML_LOAD(block, I0, ppc->impstate->sz_cr_table, I0, SIZE_BYTE, SCALE_x1); // load i0,sz_cr_table,i0,byte |
| 2240 | | UML_OR(block, CR32(0), I0, XERSO32); // or [cr0],i0,[xerso] |
| 2240 | UML_OR(block, CR32(0), I0, XERSO32); // or [cr0],i0,[xerso] |
| 2241 | 2241 | return; |
| 2242 | 2242 | } |
| 2243 | 2243 | |
| r14750 | r14751 | |
| 3066 | 3066 | return TRUE; |
| 3067 | 3067 | |
| 3068 | 3068 | case 0x1cb: /* DIVWUx */ |
| 3069 | | case 0x3cb: /* DIVWUOx */ |
| 3069 | case 0x3cb: /* DIVWUOx */ |
| 3070 | UML_CMP(block, R32(G_RB(op)), 0x0); // cmp rb, #0 |
| 3071 | UML_JMPc(block, COND_NZ, compiler->labelnum); // bne 0: |
| 3072 | |
| 3073 | UML_MOV(block, R32(G_RD(op)), 0x0); // mov rd, #0 |
| 3074 | if (op & M_OE) |
| 3075 | { |
| 3076 | UML_OR(block, XERSO32, XERSO32, 0x1); // SO |= 1 |
| 3077 | UML_OR(block, SPR32(SPR_XER), SPR32(SPR_XER), XER_OV); // OV |= 1 |
| 3078 | } |
| 3079 | if (op & M_RC) |
| 3080 | { |
| 3081 | UML_MOV(block, CR32(0), 0x2); // CR = EQ |
| 3082 | UML_AND(block, CR32(0), CR32(0), ~0x1); |
| 3083 | UML_OR(block, CR32(0), CR32(0), XERSO32); |
| 3084 | } |
| 3085 | |
| 3086 | UML_JMP(block, compiler->labelnum+1); // jmp 1: |
| 3087 | |
| 3088 | UML_LABEL(block, compiler->labelnum++); // 0: |
| 3070 | 3089 | UML_DIVU(block, R32(G_RD(op)), R32(G_RD(op)), R32(G_RA(op)), R32(G_RB(op))); // divu rd,rd,ra,rb |
| 3071 | 3090 | generate_compute_flags(ppc, block, desc, op & M_RC, ((op & M_OE) ? XER_OV : 0), FALSE);// <update flags> |
| 3091 | |
| 3092 | UML_LABEL(block, compiler->labelnum++); // 1: |
| 3072 | 3093 | return TRUE; |
| 3073 | 3094 | |
| 3074 | 3095 | case 0x1eb: /* DIVWx */ |
| 3075 | 3096 | case 0x3eb: /* DIVWOx */ |
| 3076 | 3097 | UML_CMP(block, R32(G_RB(op)), 0x0); // cmp rb, #0 |
| 3077 | | UML_JMPc(block, COND_NE, compiler->labelnum); // bne 0: |
| 3098 | UML_JMPc(block, COND_NZ, compiler->labelnum); // bne 0: |
| 3078 | 3099 | UML_CMP(block, R32(G_RA(op)), 0x80000000); // cmp rb, #80000000 |
| 3079 | 3100 | UML_JMPc(block, COND_AE, compiler->labelnum); // bae 0: |
| 3080 | 3101 | |
| 3081 | 3102 | UML_MOV(block, R32(G_RD(op)), 0x0); // move rd, #0 |
| 3082 | 3103 | if (op & M_OE) |
| 3083 | 3104 | { |
| 3084 | | UML_OR(block, XERSO32, XERSO32, 0x1); // SO = 1 |
| 3105 | UML_OR(block, XERSO32, XERSO32, 0x1); // SO |= 1 |
| 3106 | UML_OR(block, SPR32(SPR_XER), SPR32(SPR_XER), XER_OV); // OV |= 1 |
| 3085 | 3107 | } |
| 3108 | if (op & M_RC) |
| 3109 | { |
| 3110 | UML_MOV(block, CR32(0), 0x2); // CR = EQ |
| 3111 | UML_AND(block, CR32(0), CR32(0), ~0x1); |
| 3112 | UML_OR(block, CR32(0), CR32(0), XERSO32); |
| 3113 | } |
| 3114 | |
| 3086 | 3115 | UML_JMP(block, compiler->labelnum+3); // jmp 3: |
| 3087 | 3116 | |
| 3088 | 3117 | UML_LABEL(block, compiler->labelnum++); // 0: |
| 3089 | | |
| 3090 | 3118 | UML_CMP(block, R32(G_RB(op)), 0x0); // cmp rb, #0 |
| 3091 | 3119 | UML_JMPc(block, COND_Z, compiler->labelnum); // beq 1: |
| 3092 | 3120 | |
| 3093 | 3121 | UML_CMP(block, R32(G_RB(op)), 0xffffffff); // cmp rb, #ffffffff |
| 3094 | | UML_JMPc(block, COND_NE, compiler->labelnum+1); // bne 2: |
| 3122 | UML_JMPc(block, COND_NZ, compiler->labelnum+1); // bne 2: |
| 3095 | 3123 | UML_CMP(block, R32(G_RA(op)), 0x80000000); // cmp ra, #80000000 |
| 3096 | | UML_JMPc(block, COND_NE, compiler->labelnum+1); // bne 2: |
| 3124 | UML_JMPc(block, COND_NZ, compiler->labelnum+1); // bne 2: |
| 3097 | 3125 | |
| 3098 | 3126 | UML_LABEL(block, compiler->labelnum++); // 1: |
| 3099 | | // do second branch |
| 3100 | 3127 | UML_MOV(block, R32(G_RD(op)), 0xffffffff); // move rd, #ffffffff |
| 3101 | 3128 | if (op & M_OE) |
| 3102 | 3129 | { |
| 3103 | | UML_OR(block, XERSO32, XERSO32, 0x1); // SO = 1 |
| 3130 | UML_OR(block, XERSO32, XERSO32, 0x1); // SO |= 1 |
| 3131 | UML_OR(block, SPR32(SPR_XER), SPR32(SPR_XER), XER_OV); // OV |= 1 |
| 3104 | 3132 | } |
| 3133 | if (op & M_RC) |
| 3134 | { |
| 3135 | UML_MOV(block, CR32(0), 0x8); // CR = LT |
| 3136 | UML_AND(block, CR32(0), CR32(0), ~0x1); |
| 3137 | UML_OR(block, CR32(0), CR32(0), XERSO32); |
| 3138 | } |
| 3105 | 3139 | UML_JMP(block, compiler->labelnum+1); // jmp 3: |
| 3106 | 3140 | |
| 3107 | 3141 | UML_LABEL(block, compiler->labelnum++); // 2: |
| 3108 | 3142 | UML_DIVS(block, R32(G_RD(op)), R32(G_RD(op)), R32(G_RA(op)), R32(G_RB(op))); // divs rd,rd,ra,rb |
| 3109 | | generate_compute_flags(ppc, block, desc, op & M_RC, ((op & M_OE) ? XER_OV : 0), FALSE);// <update flags> |
| 3143 | generate_compute_flags(ppc, block, desc, op & M_RC, ((op & M_OE) ? XER_OV : 0), FALSE);// <update flags> |
| 3110 | 3144 | |
| 3111 | 3145 | UML_LABEL(block, compiler->labelnum++); // 3: |
| 3112 | 3146 | return TRUE; |
| r14750 | r14751 | |
| 3156 | 3190 | generate_compute_flags(ppc, block, desc, op & M_RC, 0, FALSE); // <update flags> |
| 3157 | 3191 | return TRUE; |
| 3158 | 3192 | |
| 3159 | | case 0x018: /* SLWx */ |
| 3193 | case 0x018: /* SLWx */ |
| 3194 | UML_AND(block, I0, R32(G_RB(op)), 0x3f); // and i0, rb, 0x3f |
| 3195 | UML_CMP(block, I0, 31); // cmp i0, #31 |
| 3196 | UML_JMPc(block, COND_BE, compiler->labelnum); // be 0: |
| 3197 | |
| 3198 | UML_MOV(block, R32(G_RA(op)), 0x0); // mov ra, #0 |
| 3199 | if (op & M_RC) |
| 3200 | { |
| 3201 | UML_MOV(block, CR32(0), 0x2); // CR = EQ |
| 3202 | UML_AND(block, CR32(0), CR32(0), ~0x1); |
| 3203 | UML_OR(block, CR32(0), CR32(0), XERSO32); |
| 3204 | } |
| 3205 | UML_JMP(block, compiler->labelnum+1); // jmp 1: |
| 3206 | |
| 3207 | UML_LABEL(block, compiler->labelnum++); // 0: |
| 3160 | 3208 | UML_SHL(block, R32(G_RA(op)), R32(G_RS(op)), R32(G_RB(op))); // shl ra,rs,rb |
| 3161 | 3209 | generate_compute_flags(ppc, block, desc, op & M_RC, 0, FALSE); // <update flags> |
| 3162 | | return TRUE; |
| 3163 | 3210 | |
| 3211 | UML_LABEL(block, compiler->labelnum++); // 1: |
| 3212 | return TRUE; |
| 3213 | |
| 3164 | 3214 | case 0x218: /* SRWx */ |
| 3165 | | UML_MOV(block, I0, R32(G_RS(op))); // mov i0,rs |
| 3166 | | UML_TEST(block, R32(G_RB(op)), 0x20); // test rb,0x20 |
| 3167 | | UML_MOVc(block, COND_NZ, I0, 0); // mov i0,0,nz |
| 3168 | | UML_SHR(block, R32(G_RA(op)), I0, R32(G_RB(op))); // shr ra,i0,rb |
| 3215 | UML_AND(block, I0, R32(G_RB(op)), 0x3f); // and i0, rb, 0x3f |
| 3216 | UML_CMP(block, I0, 31); // cmp i0, #31 |
| 3217 | UML_JMPc(block, COND_BE, compiler->labelnum); // be 0: |
| 3218 | |
| 3219 | UML_MOV(block, R32(G_RA(op)), 0x0); // mov ra, #0 |
| 3220 | if (op & M_RC) |
| 3221 | { |
| 3222 | UML_MOV(block, CR32(0), 0x2); // CR = EQ |
| 3223 | UML_AND(block, CR32(0), CR32(0), ~0x1); |
| 3224 | UML_OR(block, CR32(0), CR32(0), XERSO32); |
| 3225 | } |
| 3226 | UML_JMP(block, compiler->labelnum+1); // jmp 1: |
| 3227 | |
| 3228 | UML_LABEL(block, compiler->labelnum++); // 0: |
| 3229 | UML_SHR(block, R32(G_RA(op)), R32(G_RS(op)), R32(G_RB(op))); // shr ra,i0,rb |
| 3169 | 3230 | generate_compute_flags(ppc, block, desc, op & M_RC, 0, FALSE); // <update flags> |
| 3231 | |
| 3232 | UML_LABEL(block, compiler->labelnum++); // 1: |
| 3170 | 3233 | return TRUE; |
| 3171 | 3234 | |
| 3172 | 3235 | case 0x318: /* SRAWx */ |