From ddaf12ba14cf8f5a708fdd802da270a0f4000df9 Mon Sep 17 00:00:00 2001 From: Recolic Keghart <root@recolic.net> Date: Fri, 27 Dec 2019 14:11:20 +0800 Subject: [PATCH] > Manual commit: bug fix for test.add U201614531 recolic Linux RECOLICPC 5.4.2-arch1-1 #1 SMP PREEMPT Thu, 05 Dec 2019 12:29:40 +0000 x86_64 GNU/Linux 14:11:21 up 4 days, 19:19, 1 user, load average: 0.86, 1.43, 2.84 1b5a120de407e3cada65f71714e36e047bb0c4d --- nemu/include/cpu/rtl.h | 2 +- nemu/src/cpu/decode/decode.cc | 2 ++ nexus-am/Makefile.compile | 4 ++-- nexus-am/tests/cputest/tests/r.c | 24 ++++++++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 nexus-am/tests/cputest/tests/r.c diff --git a/nemu/include/cpu/rtl.h b/nemu/include/cpu/rtl.h index 1e029ed..4dd9aac 100644 --- a/nemu/include/cpu/rtl.h +++ b/nemu/include/cpu/rtl.h @@ -217,7 +217,7 @@ static inline void rtl_update_ZF(const rtlreg_t* result, int width) { // eflags.ZF <- is_zero(result[width * 8 - 1 .. 0]) RLIB_MACRO_DEBUG_ASSERT((unsigned)width < 5); static const uint32_t niddles [5] {0, 0x000000ff, 0x0000ffff, 0x00ffffff, 0xffffffff}; - cpu_eflags::get<cpu_eflags::ZF>() = (*result & niddles[width]); + cpu_eflags::get<cpu_eflags::ZF>() = !(*result & niddles[width]); } static inline void rtl_update_SF(const rtlreg_t* result, int width) { diff --git a/nemu/src/cpu/decode/decode.cc b/nemu/src/cpu/decode/decode.cc index ecd0665..73aab67 100644 --- a/nemu/src/cpu/decode/decode.cc +++ b/nemu/src/cpu/decode/decode.cc @@ -282,6 +282,8 @@ make_DHelper(a2O) { make_DHelper(J) { make_DopHelper_funcname(SI)(eip, id_dest, false); + rlib::println("debug: J decoder: id_dest=", *id_dest); + rtl_sext(&id_dest->imm, &id_dest->imm, id_dest->width); // the target address can be computed in the decode stage decoding.jmp_eip = id_dest->simm + *eip; } diff --git a/nexus-am/Makefile.compile b/nexus-am/Makefile.compile index ea0da9d..2b34099 100644 --- a/nexus-am/Makefile.compile +++ b/nexus-am/Makefile.compile @@ -19,8 +19,8 @@ ISA_DEF = __ISA_$(shell echo $(ISA) | tr a-z A-Z)__ INCLUDES = $(addprefix -I, $(INC_DIR)) -I$(AM_HOME)/am/ INCLUDES += -I$(AM_HOME)/am/arch/$(ARCH)/include -CFLAGS += -std=gnu11 -O2 -MMD -Wall -Werror -ggdb $(INCLUDES) -D$(ISA_DEF) -fno-builtin -CXXFLAGS += -std=c++11 -O2 -MMD -Wall -Werror -ggdb $(INCLUDES) -D$(ISA_DEF) -fno-builtin +CFLAGS += -std=gnu11 -O2 -MMD -Wall -ggdb $(INCLUDES) -D$(ISA_DEF) -fno-builtin +CXXFLAGS += -std=c++11 -O2 -MMD -Wall -ggdb $(INCLUDES) -D$(ISA_DEF) -fno-builtin ASFLAGS += -MMD $(INCLUDES) -D$(ISA_DEF) ifeq ($(ISA), native) diff --git a/nexus-am/tests/cputest/tests/r.c b/nexus-am/tests/cputest/tests/r.c new file mode 100644 index 0000000..ca75670 --- /dev/null +++ b/nexus-am/tests/cputest/tests/r.c @@ -0,0 +1,24 @@ +#include "trap.h" + +int add(int a, int b) { + int c = a + b; + return c; +} + +int test_data[] = {0, 1, 2}; +int ans[] = {0, 1, 2,1,2,3,2,3,4}; + +#define NR_DATA (sizeof(test_data) / sizeof(test_data[0])) + +int main() { + int i, j, ans_idx = 0; + for(i = 0; i < NR_DATA; i ++) { + for(j = 0; j < NR_DATA; j ++) { + nemu_assert(1); + } + nemu_assert(j == NR_DATA); + } + nemu_assert(i == NR_DATA); + + return 0; +} -- GitLab