comprintf("\tlive_flags();\n");
comprintf("\tend_needflags();\n");
if (curi->smode != immi)
- comprintf("\tsetcc_for_cntzero(tmpcnt, data, %d);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
+ comprintf("\tsetcc_for_cntzero(tmpcnt, data, %d, 0);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
else
comprintf("\tduplicate_carry();\n");
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
comprintf("\tlive_flags();\n");
comprintf("\tend_needflags();\n");
if (curi->smode != immi)
- comprintf("\tsetcc_for_cntzero(tmpcnt, data, %d);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
+ comprintf("\tsetcc_for_cntzero(tmpcnt, data, %d, 0);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
else
comprintf("\tduplicate_carry();\n");
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
if (curi->smode != immi) {
uses_cmov;
start_brace();
+ comprintf("\tint cdata2 = scratchie++;\n");
comprintf("\tint cdata = scratchie++;\n");
comprintf("\tint tmpcnt=scratchie++;\n");
comprintf("\tmov_l_rr(tmpcnt,cnt);\n");
comprintf("\tand_l_ri(tmpcnt,63);\n");
comprintf("\tmov_l_ri(cdata, 0);\n");
+
+ comprintf("\tmov_l_ri(cdata2, 32);\n");
+ comprintf("\tcmp_l(tmpcnt, cdata2);\n");
+ comprintf("\tcmov_l_rr(tmpcnt, cdata, NATIVE_CC_EQ);\n");
+
switch (curi->size) {
case sz_byte:
comprintf("\ttest_l_ri(tmpcnt, 0x38);\n");
if (!noflags) {
comprintf("\tlive_flags();\n");
comprintf("\tend_needflags();\n");
- if (curi->smode != immi)
- comprintf("\tsetcc_for_cntzero(tmpcnt, data, %d);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
- else
+ if (curi->smode != immi) {
+ comprintf("\tsetcc_for_cntzero(tmpcnt, data, %d, 0);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
+ } else {
comprintf("\tduplicate_carry();\n");
+ }
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
}
genastore("data", curi->dmode, "dstreg", curi->size, "data");
if (curi->smode != immi) {
uses_cmov;
start_brace();
+ comprintf("\tint cdata2 = scratchie++;\n");
comprintf("\tint cdata = scratchie++;\n");
comprintf("\tint tmpcnt = scratchie++;\n");
comprintf("\tmov_l_rr(tmpcnt,cnt);\n");
comprintf("\tand_l_ri(tmpcnt,63);\n");
comprintf("\tmov_l_ri(cdata, 0);\n");
+
+ comprintf("\tmov_l_ri(cdata2, 32);\n");
+ comprintf("\tcmp_l(tmpcnt, cdata2);\n");
+ comprintf("\tcmov_l_rr(tmpcnt, cdata, NATIVE_CC_EQ);\n");
+
switch (curi->size) {
case sz_byte:
comprintf("\ttest_l_ri(tmpcnt, 0x38);\n");
if (!noflags) {
comprintf("\tlive_flags();\n");
comprintf("\tend_needflags();\n");
- if (curi->smode != immi)
- comprintf("\tsetcc_for_cntzero(tmpcnt, data, %d);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
- else
+ if (curi->smode != immi) {
+ comprintf("\tsetcc_for_cntzero(tmpcnt, data, %d, 1);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
+ } else {
+ comprintf("\tclear_overflow();\n");
comprintf("\tduplicate_carry();\n");
+ }
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
}
genastore("data", curi->dmode, "dstreg", curi->size, "data");