From 6b16bd1b8ef0031a79d39ebe6eb0483265c8dd2d Mon Sep 17 00:00:00 2001 From: Nunuhara Cabbage Date: Sat, 21 Dec 2019 07:19:38 -0800 Subject: [PATCH] Implement A_REVERSE instruction --- instructions.c | 4 ++-- page.c | 12 ++++++++++++ page.h | 1 + vm.c | 6 ++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/instructions.c b/instructions.c index 77026c5..aa69c37 100644 --- a/instructions.c +++ b/instructions.c @@ -221,8 +221,8 @@ const struct instruction instructions[NR_OPCODES] = { OP(LI_RSHIFTA, 0), OP(LI_INC, 0), OP(LI_DEC, 0), - OP(A_FIND, 0), // TODO - OP(A_REVERSE, 0), // TODO + OP(A_FIND, 0), + OP(A_REVERSE, 0), OP(SH_SR_ASSIGN, 0), // TODO OP(SH_MEM_ASSIGN_LOCAL, 0), // TODO OP(A_NUMOF_GLOB_1, 0), // TODO diff --git a/page.c b/page.c index 3917fe9..8863732 100644 --- a/page.c +++ b/page.c @@ -488,3 +488,15 @@ int array_find(struct page *page, int start, int end, union vm_value v, int comp } return -1; } + +void array_reverse(struct page *page) +{ + if (!page) + return; + + for (int start = 0, end = page->nr_vars-1; start < end; start++, end--) { + union vm_value tmp = page->values[start]; + page->values[start] = page->values[end]; + page->values[end] = tmp; + } +} diff --git a/page.h b/page.h index cc761f3..474c803 100644 --- a/page.h +++ b/page.h @@ -100,5 +100,6 @@ bool array_erase(struct page **page, int i); void array_insert(struct page **_page, int i, union vm_value v, int data_type, int struct_type); void array_sort(struct page *page, int compare_fno); int array_find(struct page *page, int start, int end, union vm_value v, int compare_fno); +void array_reverse(struct page *page); #endif /* SYSTEM4_PAGE_H */ diff --git a/vm.c b/vm.c index 36f2150..ad0fb0a 100644 --- a/vm.c +++ b/vm.c @@ -1556,6 +1556,12 @@ static void execute_instruction(enum opcode opcode) int start = stack_pop().i; int array = stack_pop_var()->i; stack_push(array_find(heap[array].page, start, end, v, fno)); + break; + } + case A_REVERSE: { + int array = stack_pop_var()->i; + array_reverse(heap[array].page); + break; } // -- NOOPs --- case FUNC: