diff --git a/src/codegen/codegen_accumulate_x86-64.c b/src/codegen/codegen_accumulate_x86-64.c index 45ec96684..d81c7dd83 100644 --- a/src/codegen/codegen_accumulate_x86-64.c +++ b/src/codegen/codegen_accumulate_x86-64.c @@ -26,7 +26,7 @@ void codegen_accumulate(int acc_reg, int delta) addbyte(0x04); addbyte(0x25); addlong((uint32_t) (uintptr_t) &(acycs)); - addlong(delta); + addlong(-delta); } } diff --git a/src/codegen/codegen_accumulate_x86.c b/src/codegen/codegen_accumulate_x86.c index e577d913d..a897c942a 100644 --- a/src/codegen/codegen_accumulate_x86.c +++ b/src/codegen/codegen_accumulate_x86.c @@ -25,7 +25,7 @@ void codegen_accumulate(int acc_reg, int delta) addbyte(0x81); /*ADD $acc_regs[c].count,acc_regs[c].dest*/ addbyte(0x05); addlong((uint32_t) (uintptr_t) &(acycs)); - addlong((uintptr_t) delta); + addlong((uintptr_t) -delta); } } diff --git a/src/codegen_new/codegen_accumulate.c b/src/codegen_new/codegen_accumulate.c index 3b71d78d7..d307f3102 100644 --- a/src/codegen_new/codegen_accumulate.c +++ b/src/codegen_new/codegen_accumulate.c @@ -22,7 +22,7 @@ void codegen_accumulate(ir_data_t *ir, int acc_reg, int delta) acc_regs[acc_reg].count += delta; if (delta != 0) { - uop_ADD_IMM(ir, IREG_acycs, IREG_acycs, delta); + uop_ADD_IMM(ir, IREG_acycs, IREG_acycs, -delta); } } diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c index 37aa81f00..4d0b43402 100644 --- a/src/cpu/386_dynarec.c +++ b/src/cpu/386_dynarec.c @@ -296,7 +296,8 @@ void update_tsc(void) tsc += cycdiff; } else { /* TSC has not changed. */ - tsc += cycdiff; + if (cycdiff > 0) + tsc += cycdiff; } if (cycdiff > 0) {