MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / genJump

Function genJump

source/emulation/cpu/srcgen.cpp:951–1043  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

949}
950
951void genJump(struct GenData* data, struct Op* op, int condition) {
952 char tmp[16];
953 itoa(op->data1+op->eipCount, tmp, 10);
954
955 if ((S32)op->data1>0 && data->block->block2 && data->block->block1 && getBlockEipCount(data->block->block1) > op->data1) {
956 struct Block* block = data->block;
957 U32 eip = data->eip;
958 struct Op* first;
959
960 if (block->block1->ops->func == restoreOps) {
961 decodeBlockWithBlock(data->cpu, data->eip+getBlockEipCount(data->block), block->block1);
962 }
963 first = block->block1->ops;
964 if (first->func == firstOp)
965 first = first->next;
966 if ((S32)op->data1 < first->eipCount) {
967 // this if statement is for a prefix, like lock
968 if (op->data1==1) {
969 U8 inst = readb(data->cpu->thread, data->eip+getBlockEipCount(data->block));
970 if (inst != 0xF0)
971 kpanic("genJump wasn't prepared for non lock prefix");
972 // we can ignore a lock prefix thuse we can ignore this entire conditional jump
973 out(data, "// removed conditional jump / lock instruction\n");
974 out(data, " cpu->eip.u32+=");
975 itoa(op->eipCount+op->data1, tmp, 10);
976 out(data, tmp);
977 out(data, ";\n");
978 } else {
979 kpanic("genJump wasn't prepared for more than a 1 byte prefix");
980 }
981 } else {
982 out(data, "if (");
983 out(data, getCondition(data, condition));
984 out(data, ") {\n cpu->eip.u32+=");
985 out(data, tmp);
986 out(data, ";CYCLES(1);\n } else {\n cpu->eip.u32+=");
987 itoa(op->eipCount, tmp, 10);
988 out(data, tmp);
989 out(data, ";CYCLES(1);\n");
990 data->block = data->block->block1;
991 data->eip += getBlockEipCount(block);
992 data->inlinedBlock = 1;
993 data->indent++;
994 writeBlockWithEipCount(data, block->block1, op->data1);
995 addBlockToData(data, block->block1);
996 data->indent--;
997 data->inlinedBlock = 0;
998 data->block = block;
999 data->eip = eip;
1000 out (data, " }\n");
1001 }
1002 data->eip += getBlockEipCount(block)+op->data1;
1003 data->block = block->block2;
1004 writeBlock(data, block->block2);
1005 addBlockToData(data, block->block2);
1006 } else if ((S32)op->data1>0 && data->block->block2 && data->block->block1 && data->block->block1 == data->block->block2->block1 && getLastOp(data->block->block2)->func==jump) {
1007 struct Block* block = data->block;
1008 U32 eip = data->eip;

Callers 15

gen070Function · 0.85
gen071Function · 0.85
gen072Function · 0.85
gen073Function · 0.85
gen074Function · 0.85
gen075Function · 0.85
gen076Function · 0.85
gen077Function · 0.85
gen078Function · 0.85
gen079Function · 0.85
gen07aFunction · 0.85
gen07bFunction · 0.85

Calls 7

kpanicFunction · 0.85
getConditionFunction · 0.85
writeBlockWithEipCountFunction · 0.85
addBlockToDataFunction · 0.85
writeBlockFunction · 0.85
getLastOpFunction · 0.85
outFunction · 0.70

Tested by

no test coverage detected