From 301c07dda345f6c0c0bbed61eb61865333cbb425 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Fri, 26 Apr 2013 01:25:31 -0700 Subject: [PATCH] Implement ADC, SBC --- src/arm/arm.h | 14 +++++++------- src/arm/isa-thumb.c | 13 +++++++++++-- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/arm/arm.h b/src/arm/arm.h index 8ec290613..e4eeeddaf 100644 --- a/src/arm/arm.h +++ b/src/arm/arm.h @@ -54,13 +54,13 @@ union PSR { struct { enum PrivilegeMode priv : 5; enum ExecutionMode t : 1; - int f : 1; - int i : 1; - int : 20; - int v : 1; - int c : 1; - int z : 1; - int n : 1; + unsigned f : 1; + unsigned i : 1; + unsigned : 20; + unsigned v : 1; + unsigned c : 1; + unsigned z : 1; + unsigned n : 1; }; int32_t packed; diff --git a/src/arm/isa-thumb.c b/src/arm/isa-thumb.c index 0e980ce27..37372a13f 100644 --- a/src/arm/isa-thumb.c +++ b/src/arm/isa-thumb.c @@ -247,8 +247,17 @@ DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(ASR2, } THUMB_NEUTRAL_S( , , cpu->gprs[rd])) -DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(ADC, ARM_STUB) -DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(SBC, ARM_STUB) +DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(ADC, + int n = cpu->gprs[rn] + cpu->cpsr.c; + int d = cpu->gprs[rd]; + cpu->gprs[rd] = d + n; + THUMB_ADDITION_S(d, n, cpu->gprs[rd]);) + +DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(SBC, + int n = cpu->gprs[rn] + !cpu->cpsr.c; + int d = cpu->gprs[rd]; + cpu->gprs[rd] = d - n; + THUMB_SUBTRACTION_S(d, n, cpu->gprs[rd]);) DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(ROR, int rs = cpu->gprs[rn] & 0xFF; if (rs) {