| 8217 | |
| 8218 | char tmpCondition[256]; |
| 8219 | const char* getCondition(struct GenData* data, int condition) { |
| 8220 | if (data->inlinedLazyFlagOp) { |
| 8221 | if (data->lazyFlags == sFLAGS_TEST8 || data->lazyFlags == sFLAGS_TEST16 || data->lazyFlags == sFLAGS_TEST32) { |
| 8222 | char left[256]; |
| 8223 | char right[256]; |
| 8224 | U32 same = 0; |
| 8225 | const char* signMask; |
| 8226 | const char* signCast; |
| 8227 | const char* src; |
| 8228 | const char* dst; |
| 8229 | |
| 8230 | if (data->lazyFlags == sFLAGS_TEST8) { |
| 8231 | signMask = "0x80"; |
| 8232 | signCast = "(S8)"; |
| 8233 | src = "cpu->src.u8"; |
| 8234 | dst = "cpu->dst.u8"; |
| 8235 | } else if (data->lazyFlags == sFLAGS_TEST16) { |
| 8236 | signMask = "0x8000"; |
| 8237 | signCast = "(S16)"; |
| 8238 | src = "cpu->src.u16"; |
| 8239 | dst = "cpu->dst.u16"; |
| 8240 | } else if (data->lazyFlags == sFLAGS_TEST32) { |
| 8241 | signMask = "0x80000000"; |
| 8242 | signCast = "(S32)"; |
| 8243 | src = "cpu->src.u32"; |
| 8244 | dst = "cpu->dst.u32"; |
| 8245 | } else { |
| 8246 | kpanic("getCondition: oops"); |
| 8247 | } |
| 8248 | |
| 8249 | same = getTestLeftRight(data->inlinedLazyFlagOp, left, right); |
| 8250 | |
| 8251 | if (data->inlinedLazyFlagOpAssignedToCPU) { |
| 8252 | strcpy(left, dst); |
| 8253 | strcpy(right, src); |
| 8254 | } |
| 8255 | data->inlinedLazyFlagOp = 0; |
| 8256 | |
| 8257 | switch (condition) { |
| 8258 | case 0: // OF |
| 8259 | return "0"; |
| 8260 | case 1: // !OF |
| 8261 | return "1"; |
| 8262 | case 2: // CF |
| 8263 | return "0"; |
| 8264 | case 3: // !CF |
| 8265 | return "1"; |
| 8266 | case 4: // ZF |
| 8267 | case 6: // ZF or CF |
| 8268 | if (same) { |
| 8269 | strcpy(tmpCondition, "!"); strcat(tmpCondition, left); return tmpCondition; |
| 8270 | } |
| 8271 | strcpy(tmpCondition, "!("); strcat(tmpCondition, left); strcat(tmpCondition, " & "); strcat(tmpCondition, right); strcat(tmpCondition, ")"); return tmpCondition; |
| 8272 | case 5: // !ZF |
| 8273 | case 7: // !ZF and !CF |
| 8274 | if (same) { |
| 8275 | strcpy(tmpCondition, left); return tmpCondition; |
| 8276 | } |